diff --git a/.env b/.env index f7a4942c..9682682d 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 VERSION=1.4.0 -VERSION_FULL=1.4.0 (132) -BUILD=132 +VERSION_FULL=1.4.0 (133) +BUILD=133 diff --git a/README.md b/README.md index bcf4d296..c16eea79 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Run `npm run build` to build the minimized production version of the app. Copy ` ### Dependencies -* [leemon](https://github.com/zerobias/leemon) ([MIT License](https://github.com/zerobias/leemon/blob/master/LICENSE)) +* [BigInteger.js](https://github.com/peterolson/BigInteger.js) ([Unlicense](https://github.com/peterolson/BigInteger.js/blob/master/LICENSE)) * [pako](https://github.com/nodeca/pako) ([MIT License](https://github.com/nodeca/pako/blob/master/LICENSE)) * [cryptography](https://github.com/spalt08/cryptography) ([Apache License 2.0](https://github.com/spalt08/cryptography/blob/master/LICENSE)) * [emoji-data](https://github.com/iamcal/emoji-data) ([MIT License](https://github.com/iamcal/emoji-data/blob/master/LICENSE)) diff --git a/keepAsset.js b/keepAsset.js new file mode 100644 index 00000000..708004f1 --- /dev/null +++ b/keepAsset.js @@ -0,0 +1,13 @@ +module.exports = function(asset) { + if(asset.includes('.xml') + || asset.includes('version') + || asset.includes('assets/') + || asset.includes('changelogs/') + || asset.includes('.webmanifest') + || asset.includes('.wasm') + || asset.includes('rlottie-wasm') + || asset.includes('Worker.min.js') + || asset.includes('recorder.min.js') + || asset.includes('.hbs')) return true; + return false; +} diff --git a/package-lock.json b/package-lock.json index 9bad85a2..76071c98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,84 +9,71 @@ "version": "1.0.0", "license": "GPL-3.0-only", "dependencies": { - "webpack-dev-server": "^4.7.4" + "webpack-dev-server": "^3.11.2" }, "devDependencies": { - "@babel/cli": "^7.17.6", - "@babel/core": "^7.17.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.8", + "@babel/cli": "^7.13.16", + "@babel/core": "^7.14.2", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-transform-typescript": "^7.13.0", "@babel/polyfill": "^7.12.1", - "@babel/preset-env": "^7.16.11", + "@babel/preset-env": "^7.14.2", "@babel/preset-es2015": "^7.0.0-beta.53", - "@babel/preset-typescript": "^7.16.7", + "@babel/preset-typescript": "^7.13.0", "@cryptography/aes": "^0.1.1", "@cryptography/sha1": "^0.2.0", "@cryptography/sha256": "^0.2.0", - "@peculiar/webcrypto": "^1.3.2", + "@peculiar/webcrypto": "^1.1.7", "@types/big-integer": "^0.0.31", - "@types/chrome": "0.0.180", - "@types/jest": "^27.4.1", - "@types/serviceworker-webpack-plugin": "^1.0.3", - "autoprefixer": "^10.4.4", - "babel-jest": "^27.5.1", - "babel-loader": "^8.2.4", + "@types/chrome": "0.0.139", + "@types/jest": "^26.0.23", + "@types/serviceworker-webpack-plugin": "^1.0.2", + "babel-jest": "^26.6.3", + "babel-loader": "^8.2.2", "babel-preset-es2015": "^6.24.1", "big-integer": "^1.6.51", "compression": "^1.7.4", - "css-loader": "^6.7.1", - "cssnano": "^5.1.5", - "dotenv-webpack": "^7.1.0", - "express": "^4.17.3", - "fast-png": "^6.1.0", + "css-loader": "^3.6.0", + "dotenv-webpack": "^7.0.3", + "express": "^4.17.1", + "fast-png": "^5.0.4", "handlebars": "^4.7.7", "handlebars-loader": "^1.7.1", - "html-webpack-plugin": "^5.5.0", - "ifdef-loader": "^2.3.2", - "jest": "^27.5.1", - "media-query-plugin": "^1.5.0", - "mini-css-extract-plugin": "^2.6.0", - "npm": "^8.5.5", - "optimize-css-assets-webpack-plugin": "^6.0.1", - "pako": "^2.0.4", - "postcss-import": "^14.1.0", - "postcss-loader": "^6.2.1", - "postcss-preset-env": "^7.4.3", - "qr-code-styling": "^1.5.0", - "sass": "^1.49.9", - "sass-loader": "^12.6.0", - "style-loader": "^3.3.1", + "html-webpack-plugin": "^4.5.2", + "ifdef-loader": "^2.3.0", + "jest": "^26.6.3", + "media-query-plugin": "^1.4.0", + "mini-css-extract-plugin": "^0.9.0", + "npm": "^7.12.1", + "on-build-webpack": "^0.1.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pako": "^2.0.3", + "postcss": "^8.2.10", + "postcss-loader": "^3.0.0", + "postcss-preset-env": "^6.7.0", + "qr-code-styling": "^1.3.4", + "sass": "^1.32.13", + "sass-loader": "^8.0.2", + "serviceworker-webpack-plugin": "^1.0.1", + "style-loader": "^1.3.0", "text-encoding": "^0.7.0", - "ts-jest": "^27.1.4", - "ts-loader": "^9.2.8", - "typescript": "^4.6.3", - "webpack": "^5.70.0", + "ts-jest": "^26.5.6", + "ts-loader": "^8.2.0", + "typescript": "^4.4.3", + "webpack": "^4.46.0", "webpack-bundle-analyzer": "^4.5.0", - "webpack-cli": "^4.9.2", - "webpack-merge": "^5.8.0", - "webpack-retry-chunk-load-plugin": "^3.0.0", + "webpack-cli": "^3.3.12", + "webpack-merge": "^4.2.2", + "webpack-retry-chunk-load-plugin": "^1.5.0", "worker-loader": "^3.0.8" } }, - "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/cli": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.17.6.tgz", - "integrity": "sha512-l4w608nsDNlxZhiJ5tE3DbNmr61fIKMZ6fTBo171VEFuFMIYuJ3mHRhTLEkKKyvx2Mizkkv/0a8OJOnZqkKYNA==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.16.tgz", + "integrity": "sha512-cL9tllhqvsQ6r1+d9Invf7nNXg/3BlfL1vvvL/AdH9fZ2l5j0CeBcoq6UjsqHpvyN1v5nXSZgqJZoGeK+ZOAbw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.4", "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", @@ -99,11 +86,8 @@ "babel": "bin/babel.js", "babel-external-helpers": "bin/babel-external-helpers.js" }, - "engines": { - "node": ">=6.9.0" - }, "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", "chokidar": "^3.4.0" }, "peerDependencies": { @@ -111,47 +95,41 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/highlight": "^7.12.13" } }, "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", + "dev": true }, "node_modules/@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.2.tgz", + "integrity": "sha512-OgC1mON+l4U4B4wiohJlQNUU3H73mpTyYY3j/c8U9dr9UagGGSm+WFpzjy/YLdoyjiG++c1kIDgxCo/mLwQJeQ==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.2", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0" + "semver": "^6.3.0", + "source-map": "^0.5.0" }, "engines": { "node": ">=6.9.0" @@ -161,43 +139,220 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0", + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", "jsesc": "^2.5.1", "source-map": "^0.5.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" } }, "node_modules/@babel/helper-call-delegate": { @@ -336,9 +491,10 @@ } }, "node_modules/@babel/helper-call-delegate/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, "dependencies": { "ms": "^2.1.1" @@ -350,116 +506,157 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "node_modules/@babel/helper-call-delegate/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", "semver": "^6.3.0" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/@babel/helper-compilation-targets/node_modules/electron-to-chromium": { + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", + "dev": true + }, + "node_modules/@babel/helper-compilation-targets/node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.2.tgz", + "integrity": "sha512-6YctwVsmlkchxfGUogvVrrhzyD3grFJyluj5JgDlQrwfMLJSt5tdAzFZfPf4H2Xoi5YLcQ6BxfJlaOBHuctyIw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/highlight": "^7.12.13" } }, - "node_modules/@babel/helper-define-map": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.53.tgz", - "integrity": "sha1-SOniJlRTeHl1BD76qx7a0jnqlpU=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "7.0.0-beta.53", - "@babel/types": "7.0.0-beta.53", - "lodash": "^4.17.5" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" } }, - "node_modules/@babel/helper-define-map/node_modules/@babel/code-frame": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.53.tgz", - "integrity": "sha1-mA0VYLhjV1v1o3eSUDfgEy71kh4=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, "dependencies": { - "@babel/highlight": "7.0.0-beta.53" + "@babel/types": "^7.12.13" } }, - "node_modules/@babel/helper-define-map/node_modules/@babel/helper-function-name": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.53.tgz", - "integrity": "sha1-USgEro6cvOVDHr6hnkdijC7WU/I=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "7.0.0-beta.53", - "@babel/template": "7.0.0-beta.53", - "@babel/types": "7.0.0-beta.53" + "@babel/types": "^7.12.13" } }, - "node_modules/@babel/helper-define-map/node_modules/@babel/helper-get-function-arity": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.53.tgz", - "integrity": "sha1-3tiKsp+bHbYch9G7jTijXdp3neY=", - "dev": true, - "dependencies": { - "@babel/types": "7.0.0-beta.53" - } - }, - "node_modules/@babel/helper-define-map/node_modules/@babel/highlight": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.53.tgz", - "integrity": "sha1-9OlS2tF4fSBeGI0+OEzc5JyjaPs=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "dev": true, "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "js-tokens": "^4.0.0" } }, - "node_modules/@babel/helper-define-map/node_modules/@babel/parser": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.53.tgz", - "integrity": "sha1-H0XrYXv5Rj1IKywE00nZ5O2/SJI=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -468,39 +665,61 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/helper-define-map/node_modules/@babel/template": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.53.tgz", - "integrity": "sha1-MyIpCQDQsYewpxdDgeHzu3EFDS4=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "dependencies": { - "@babel/code-frame": "7.0.0-beta.53", - "@babel/parser": "7.0.0-beta.53", - "@babel/types": "7.0.0-beta.53", - "lodash": "^4.17.5" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "node_modules/@babel/helper-define-map/node_modules/@babel/types": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.53.tgz", - "integrity": "sha1-GaRhwNpRVZXftnQLS0Xce7Dms3U=", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", "dev": true, "dependencies": { - "esutils": "^2.0.2", - "lodash": "^4.17.5", + "@babel/helper-validator-identifier": "^7.14.0", "to-fast-properties": "^2.0.0" } }, - "node_modules/@babel/helper-define-map/node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", @@ -516,272 +735,76 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/highlight": "^7.12.13" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/types": "^7.12.13" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/types": "^7.12.13" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-regex": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.53.tgz", - "integrity": "sha1-bp0hl7Vid54iVWWUaumoXCFbIl4=", - "dev": true, - "dependencies": { - "lodash": "^4.17.5" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.14.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -790,278 +813,1345 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", + "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.16" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helpers/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helpers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", + "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", "@babel/plugin-syntax-async-generators": "^7.8.4" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz", + "integrity": "sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-class-static-block": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, + "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", + "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-dynamic-import/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", + "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-export-namespace-from/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", + "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-json-strings/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", + "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", + "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", + "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-numeric-separator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz", + "integrity": "sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/plugin-transform-parameters": "^7.14.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-object-rest-spread/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", + "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", + "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-create-class-features-plugin": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" }, "engines": { "node": ">=4" @@ -1070,6 +2160,12 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1106,21 +2202,30 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", + "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-static-block/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1157,6 +2262,12 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-meta/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1181,6 +2292,12 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", @@ -1205,6 +2322,12 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-numeric-separator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", @@ -1242,573 +2365,840 @@ } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-private-property-in-object/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-top-level-await/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-arrow-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-block-scoped-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz", + "integrity": "sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-block-scoping/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz", + "integrity": "sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-dotall-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-keys/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-exponentiation-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/plugin-transform-instanceof": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0-beta.53.tgz", + "integrity": "sha1-WC2CtyUYggGtDiIx8fzpTHRaLAY=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "7.0.0-beta.53" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.50 <7.0.0-rc.0" + } + }, + "node_modules/@babel/plugin-transform-instanceof/node_modules/@babel/helper-plugin-utils": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.53.tgz", + "integrity": "sha1-1kRYY2/8JYtCcUqd2Trrb4uM8+0=", + "dev": true + }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-member-expression-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", + "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", - "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", "babel-plugin-dynamic-import-node": "^2.3.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", + "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-new-target/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", + "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-property-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", "dev": true, "dependencies": { "regenerator-transform": "^0.14.2" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-reserved-words/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-shorthand-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-sticky-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-template-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typeof-symbol/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", + "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-typescript": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-escapes/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/polyfill": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.12.1.tgz", @@ -1820,36 +3210,43 @@ "regenerator-runtime": "^0.13.4" } }, + "node_modules/@babel/polyfill/node_modules/core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, "node_modules/@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", + "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.14.2", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-class-static-block": "^7.13.11", + "@babel/plugin-proposal-dynamic-import": "^7.14.2", + "@babel/plugin-proposal-export-namespace-from": "^7.14.2", + "@babel/plugin-proposal-json-strings": "^7.14.2", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", + "@babel/plugin-proposal-numeric-separator": "^7.14.2", + "@babel/plugin-proposal-object-rest-spread": "^7.14.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", + "@babel/plugin-proposal-optional-chaining": "^7.14.2", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-private-property-in-object": "^7.14.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.12.13", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -1859,55 +3256,77 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.14.2", + "@babel/plugin-transform-classes": "^7.14.2", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.17", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.14.2", + "@babel/plugin-transform-modules-commonjs": "^7.14.0", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.14.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.14.2", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.2", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", "semver": "^6.3.0" }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/preset-env/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/preset-es2015": { "version": "7.0.0-beta.53", "resolved": "https://registry.npmjs.org/@babel/preset-es2015/-/preset-es2015-7.0.0-beta.53.tgz", @@ -1976,6 +3395,17 @@ "@babel/types": "7.0.0-beta.53" } }, + "node_modules/@babel/preset-es2015/node_modules/@babel/helper-define-map": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.53.tgz", + "integrity": "sha1-SOniJlRTeHl1BD76qx7a0jnqlpU=", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "7.0.0-beta.53", + "@babel/types": "7.0.0-beta.53", + "lodash": "^4.17.5" + } + }, "node_modules/@babel/preset-es2015/node_modules/@babel/helper-function-name": { "version": "7.0.0-beta.53", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.53.tgz", @@ -2053,6 +3483,15 @@ "integrity": "sha1-1kRYY2/8JYtCcUqd2Trrb4uM8+0=", "dev": true }, + "node_modules/@babel/preset-es2015/node_modules/@babel/helper-regex": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.53.tgz", + "integrity": "sha1-bp0hl7Vid54iVWWUaumoXCFbIl4=", + "dev": true, + "dependencies": { + "lodash": "^4.17.5" + } + }, "node_modules/@babel/preset-es2015/node_modules/@babel/helper-replace-supers": { "version": "7.0.0-beta.53", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.53.tgz", @@ -2225,18 +3664,6 @@ "@babel/core": ">=7.0.0-beta.50 <7.0.0-rc.0" } }, - "node_modules/@babel/preset-es2015/node_modules/@babel/plugin-transform-instanceof": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0-beta.53.tgz", - "integrity": "sha1-WC2CtyUYggGtDiIx8fzpTHRaLAY=", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "7.0.0-beta.53" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.50 <7.0.0-rc.0" - } - }, "node_modules/@babel/preset-es2015/node_modules/@babel/plugin-transform-literals": { "version": "7.0.0-beta.53", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.53.tgz", @@ -2459,9 +3886,10 @@ } }, "node_modules/@babel/preset-es2015/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, "dependencies": { "ms": "^2.1.1" @@ -2473,17 +3901,11 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "node_modules/@babel/preset-es2015/node_modules/regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } + "node_modules/@babel/preset-es2015/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/@babel/preset-es2015/node_modules/regenerator-transform": { "version": "0.13.4", @@ -2494,54 +3916,10 @@ "private": "^0.1.6" } }, - "node_modules/@babel/preset-es2015/node_modules/regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/preset-es2015/node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "node_modules/@babel/preset-es2015/node_modules/regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/@babel/preset-es2015/node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -2555,80 +3933,113 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz", + "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-typescript": "^7.13.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, "node_modules/@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" } }, "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", "debug": "^4.1.0", "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.14.0", "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, "node_modules/@bcoe/v8-coverage": { @@ -2637,6 +4048,22 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, "node_modules/@cryptography/aes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@cryptography/aes/-/aes-0.1.1.tgz", @@ -2655,136 +4082,13 @@ "integrity": "sha512-BptcDkQWplfUjMJAxewmMN/O8JD19cwJM6XUFQrqaCDMYt5e40Czm4S7BEFc+PN7dElNH79ik687/5aMk4uDSQ==", "dev": true }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz", - "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", - "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", - "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz", - "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", - "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz", - "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=4.0.0" } }, "node_modules/@istanbuljs/load-nyc-config": { @@ -2803,6 +4107,61 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2813,20 +4172,20 @@ } }, "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/@jest/console/node_modules/ansi-styles": { @@ -2845,9 +4204,9 @@ } }, "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -2909,50 +4268,51 @@ } }, "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.8.1", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/@jest/core/node_modules/ansi-styles": { @@ -2970,10 +4330,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@jest/core/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -3004,6 +4376,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@jest/core/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3013,6 +4403,55 @@ "node": ">=8" } }, + "node_modules/@jest/core/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/core/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@jest/core/node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/core/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@jest/core/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3022,6 +4461,18 @@ "node": ">=8" } }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3034,94 +4485,100 @@ "node": ">=8" } }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "node_modules/@jest/core/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "is-number": "^7.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8.0" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^4.0.3", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "v8-to-istanbul": "^7.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "optionalDependencies": { + "node-notifier": "^8.0.0" } }, "node_modules/@jest/reporters/node_modules/ansi-styles": { @@ -3140,9 +4597,9 @@ } }, "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -3173,6 +4630,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@jest/reporters/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3213,19 +4676,25 @@ } }, "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "dependencies": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, + "node_modules/@jest/source-map/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/@jest/source-map/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3236,59 +4705,66 @@ } }, "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, + "node_modules/@jest/test-sequencer/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/@jest/transform/node_modules/ansi-styles": { @@ -3306,10 +4782,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@jest/transform/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -3340,6 +4828,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@jest/transform/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3349,6 +4855,40 @@ "node": ">=8" } }, + "node_modules/@jest/transform/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/transform/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@jest/transform/node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@jest/transform/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3379,20 +4919,32 @@ "node": ">=8" } }, + "node_modules/@jest/transform/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^16.0.0", + "@types/yargs": "^15.0.0", "chalk": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/@jest/types/node_modules/ansi-styles": { @@ -3411,9 +4963,9 @@ } }, "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -3465,80 +5017,36 @@ "node": ">=8" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "version": "2.1.8-no-fsevents", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", + "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", "dev": true, - "optional": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "optional": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "node_modules/@peculiar/asn1-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.1.0.tgz", - "integrity": "sha512-D6g4C5YRKC/iPujMAOXuZ7YGdaoMx8GsvWzfVSyx2LYeL38ECOKNywlYAuwbqQvON64lgsYdAujWQPX8hhoBLw==", + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.32.tgz", + "integrity": "sha512-JzGUVxOFN+RKslJrGAxcq4l6tEmmLY1XuALHINVxc8BJsB4bXOdZzTvxbN9dCPk65Vbulno0B6DmImZ7I6SO8w==", "dev": true, "dependencies": { - "@types/asn1js": "^2.0.2", - "asn1js": "^2.3.1", - "pvtsutils": "^1.2.1", - "tslib": "^2.3.1" + "@types/asn1js": "^2.0.0", + "asn1js": "^2.1.1", + "pvtsutils": "^1.1.2", + "tslib": "^2.2.0" } }, "node_modules/@peculiar/json-schema": { @@ -3554,16 +5062,16 @@ } }, "node_modules/@peculiar/webcrypto": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.3.2.tgz", - "integrity": "sha512-oUgNj+8oT7uROEMEpZZ3U+kZjyxj1KXuvA8P5kiMUveTya9eyS8KTqu/dzdEtYC3u7dvjknVz+0sUfkWOBHfQg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.1.7.tgz", + "integrity": "sha512-aCNLYdHZkvGH+T8/YBOY33jrVGVuLIa3bpizeHXqwN+P4ZtixhA+kxEEWM1amZwUY2nY/iuj+5jdZn/zB7EPPQ==", "dev": true, "dependencies": { - "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.32", "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.2.2", - "tslib": "^2.3.1", - "webcrypto-core": "^1.7.1" + "pvtsutils": "^1.1.6", + "tslib": "^2.2.0", + "webcrypto-core": "^1.2.0" }, "engines": { "node": ">=10.12.0" @@ -3585,42 +5093,30 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } + "node_modules/@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true }, "node_modules/@types/asn1js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.2.tgz", - "integrity": "sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.0.tgz", + "integrity": "sha512-Jjzp5EqU0hNpADctc/UqhiFbY1y2MqIxBVa2S4dBlbnZHTLPMuggoL5q43X63LpsOIINRDirBjP56DUUKIUWIA==", "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -3631,18 +5127,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -3650,9 +5146,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", "dev": true, "dependencies": { "@babel/types": "^7.3.0" @@ -3668,98 +5164,20 @@ "big-integer": "*" } }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/chrome": { - "version": "0.0.180", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.180.tgz", - "integrity": "sha512-A/CuuKAaHq2CHEpYBAtl0lp2ib7TTXK7VjJI4q+c+1U/HDvZLJ8IlsdEDzzHdvkNdh36bGONxrMnO9YZrKqbAw==", + "version": "0.0.139", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.139.tgz", + "integrity": "sha512-YZDKFlSVGFp4zldJlO+PUpxMH8N9vLke0fD6K9PA+TzXxPXu8LBLo5X2dzlOs2N/n+uMdI1lw7OPT1Emop10lQ==", "dev": true, "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" } }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, "node_modules/@types/filesystem": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", - "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.30.tgz", + "integrity": "sha512-NCoRgmGmLpTT9VFL6Bb6z0jQuqI3d0E5FGl7M0JOv/J5RQYo9s5aOItPYnpckx9MbYQk1APLXcF8f20Vqnf2yA==", "dev": true, "dependencies": { "@types/filewriter": "*" @@ -3771,6 +5189,15 @@ "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", "dev": true }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -3781,29 +5208,21 @@ } }, "node_modules/@types/har-format": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.8.tgz", - "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.5.tgz", + "integrity": "sha512-IG8AE1m2pWtPqQ7wXhFhy6Q59bwwnLwO36v5Rit2FrbXCIp8Sk8E2PfUCreyrdo17STwFSKDAkitVuVYbpEHvQ==", "dev": true }, "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", "dev": true }, - "node_modules/@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, "node_modules/@types/istanbul-lib-report": { @@ -3816,106 +5235,73 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", "dev": true, "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" } }, "node_modules/@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" - }, - "node_modules/@types/pako": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.3.tgz", - "integrity": "sha512-EDxOsHAD5dqjbjEUM1xwa7rpKPFb8ECBE5irONTQU7/OsO3thI5YrNEWSPNMvYmvFM0l/OLQJ6Mgw7PEdXSjhg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "node_modules/@types/node": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.4.tgz", + "integrity": "sha512-k3NqigXWRzQZVBDS5D1U70A5E8Qk4Kh+Ha/x4M8Bt9pF0X05eggfnC9+63Usc9Q928hRUIpIhTQaXsZwZBl4Ew==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/pako": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.1.tgz", + "integrity": "sha512-GdZbRSJ3Cv5fiwT6I0SQ3ckeN2PWNqxd26W9Z2fCK1tGrrasGy4puvNFtnddqH9UJFMQYXxEuuB7B8UK+LLwSg==", "dev": true }, "node_modules/@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", "dev": true }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true }, "node_modules/@types/serviceworker-webpack-plugin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/serviceworker-webpack-plugin/-/serviceworker-webpack-plugin-1.0.3.tgz", - "integrity": "sha512-pTmJp4jcwKhMcouxIn5BMww259kO3wfaW1kfg0PzgMFC9R3//TNYK4zlSkyyrkryWXlMvTKl4crj8oBeHhM7nw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/serviceworker-webpack-plugin/-/serviceworker-webpack-plugin-1.0.2.tgz", + "integrity": "sha512-dTKr3HkGWkpFflnaq8dLvQ3F6C/g8ub1H7RFXk4Cfylln8YxuKYMbeGlCmnhrWhOP9WFA0wsu6ez2cE5i9pFmA==", "dev": true, "dependencies": { "@types/webpack": "^4" } }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -3923,21 +5309,21 @@ "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, "node_modules/@types/tapable": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", - "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==", "dev": true }, "node_modules/@types/uglify-js": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", - "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", "dev": true, "dependencies": { "source-map": "^0.6.1" @@ -3952,30 +5338,24 @@ "node": ">=0.10.0" } }, - "node_modules/@types/web": { - "version": "0.0.55", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.55.tgz", - "integrity": "sha512-YMH9aZrSJIMRMioCUwrgauI3iS/w2wRFN45Xxm0FE9Tt3hqaqkvOzjDFGsNjyKZzz7GJC0ilb+0tv59ytSUbrQ==", - "dev": true - }, "node_modules/@types/webpack": { - "version": "4.41.32", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", - "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "version": "4.41.28", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.28.tgz", + "integrity": "sha512-Nn84RAiJjKRfPFFCVR8LC4ueTtTdfWAMZ03THIzZWRJB+rX24BD3LqPSFnbMscWauEsT4segAsylPDIaZyZyLQ==", "dev": true, "dependencies": { + "@types/anymatch": "*", "@types/node": "*", "@types/tapable": "^1", "@types/uglify-js": "*", "@types/webpack-sources": "*", - "anymatch": "^3.0.0", "source-map": "^0.6.0" } }, "node_modules/@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", "dev": true, "dependencies": { "@types/node": "*", @@ -4001,194 +5381,176 @@ "node": ">=0.10.0" } }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, - "node_modules/@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", - "dev": true, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { @@ -4208,21 +5570,21 @@ "dev": true }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" }, "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "bin": { "acorn": "bin/acorn" }, @@ -4252,14 +5614,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -4269,89 +5623,47 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "ajv": ">=5.0.0" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "peerDependencies": { "ajv": "^6.9.1" } }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4367,10 +5679,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", "engines": [ "node >= 0.8.0" ], @@ -4379,19 +5703,17 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -4400,17 +5722,30 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" }, "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4420,23 +5755,91 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/asn1js": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.3.2.tgz", - "integrity": "sha512-IYzujqcOk7fHaePpTyvD3KPAA0AjT3qZlaQAw76zmPPAV/XTjhO+tbHjbFbIQZIhw+fk9wCSfb0Z6K+JHe8Q2g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.1.1.tgz", + "integrity": "sha512-t9u0dU0rJN4ML+uxgN6VM2Z4H5jWIYm0w8LsZLzMJaQsgL3IJNbxHgmbWDvJAwspyHpDFuzUaUFh4c05UB4+6g==", "dev": true, "dependencies": { "pvutils": "latest" @@ -4445,11 +5848,62 @@ "node": ">=6.0.0" } }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -4457,43 +5911,30 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "node_modules/autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "bin": { - "autoprefixer": "bin/autoprefixer" + "atob": "bin/atob.js" }, "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 4.5.0" } }, - "node_modules/autoprefixer/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "node_modules/babel-code-frame": { @@ -4661,25 +6102,25 @@ } }, "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" }, "peerDependencies": { - "@babel/core": "^7.8.0" + "@babel/core": "^7.0.0" } }, "node_modules/babel-jest/node_modules/ansi-styles": { @@ -4698,9 +6139,9 @@ } }, "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -4731,6 +6172,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/babel-jest/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4762,13 +6209,13 @@ } }, "node_modules/babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", + "loader-utils": "^1.4.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -4780,6 +6227,29 @@ "webpack": ">=2" } }, + "node_modules/babel-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/babel-loader/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -4795,6 +6265,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/babel-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", @@ -4823,15 +6302,15 @@ } }, "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", + "istanbul-lib-instrument": "^4.0.0", "test-exclude": "^6.0.0" }, "engines": { @@ -4839,9 +6318,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -4850,43 +6329,52 @@ "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/helper-define-polyfill-provider": "^0.2.0", "semver": "^6.1.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.2.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5251,16 +6739,16 @@ } }, "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", + "babel-plugin-jest-hoist": "^26.6.2", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -5276,6 +6764,14 @@ "regenerator-runtime": "^0.11.0" } }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, "node_modules/babel-runtime/node_modules/regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5312,15 +6808,6 @@ "lodash": "^4.17.4" } }, - "node_modules/babel-traverse/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/babel-traverse/node_modules/globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -5330,12 +6817,6 @@ "node": ">=0.10.0" } }, - "node_modules/babel-traverse/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", @@ -5367,15 +6848,106 @@ } }, "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -5389,60 +6961,65 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, "engines": { "node": "*" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, "dependencies": { - "bytes": "3.1.2", + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.8.1", + "http-errors": "1.7.2", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "engines": { "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -5456,11 +7033,6 @@ "multicast-dns-service-types": "^1.1.0" } }, - "node_modules/bonjour/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -5477,55 +7049,170 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "fill-range": "^7.0.1" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - ], + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "pako": "~1.0.5" + } + }, + "node_modules/browserify-zlib/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/browserslist": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" }, "bin": { "browserslist": "cli.js" }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" } }, - "node_modules/browserslist/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, "node_modules/bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", @@ -5547,16 +7234,36 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "node_modules/buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -5565,6 +7272,60 @@ "node": ">= 0.8" } }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5577,6 +7338,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -5600,7 +7394,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "engines": { "node": ">=6" } @@ -5618,19 +7411,28 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001320", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz", - "integrity": "sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] + "version": "1.0.30001040", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001040.tgz", + "integrity": "sha512-Ep0tEPeI5wCvmJNrXjE3etgfI+lkl1fTDU6Y3ZH1mhrjkPlVI9W4pcKbMo+BQLpEWKVYYp2EmYaRsqpPC3k7lQ==", + "dev": true + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "node_modules/chalk": { "version": "2.4.2", @@ -5646,6 +7448,18 @@ "node": ">=4" } }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -5656,61 +7470,219 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "devOptional": true, "dependencies": { - "anymatch": "~3.1.2", + "anymatch": "~3.1.1", "braces": "~3.0.2", - "glob-parent": "~5.1.2", + "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "~3.5.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.1" } }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "devOptional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/chokidar/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dependencies": { + "tslib": "^1.9.0" + }, "engines": { "node": ">=6.0" } }, + "node_modules/chrome-trace-event/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "dependencies": { "source-map": "~0.6.0" }, "engines": { - "node": ">= 10.0" + "node": ">= 4.0" } }, "node_modules/clean-css/node_modules/source-map": { @@ -5722,23 +7694,14 @@ "node": ">=0.10.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "node_modules/clone-deep": { @@ -5765,17 +7728,52 @@ "node": ">= 0.12.0" } }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -5783,19 +7781,23 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", - "dev": true + "node_modules/color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -5821,8 +7823,12 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "node_modules/compressible": { "version": "2.0.18", @@ -5835,6 +7841,14 @@ "node": ">= 0.6" } }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", @@ -5852,24 +7866,25 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -5878,36 +7893,27 @@ "node": ">=0.8" } }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dependencies": { - "safe-buffer": "5.2.1" + "safe-buffer": "5.1.2" }, "engines": { "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -5917,18 +7923,18 @@ } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "engines": { "node": ">= 0.6" } @@ -5938,21 +7944,34 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.12.1.tgz", + "integrity": "sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", + "browserslist": "^4.16.6", "semver": "7.0.0" }, "funding": { @@ -5960,6 +7979,57 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-compat/node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/core-js-compat/node_modules/caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/core-js-compat/node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/core-js-compat/node_modules/electron-to-chromium": { + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", + "dev": true + }, + "node_modules/core-js-compat/node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, "node_modules/core-js-compat/node_modules/semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -5970,169 +8040,456 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">= 8" + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" } }, "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.5" }, "bin": { - "css-blank-pseudo": "dist/cli.cjs" + "css-blank-pseudo": "cli.js" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-blank-pseudo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" } }, "node_modules/css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "dependencies": { + "postcss": "^7.0.1", "timsort": "^0.3.0" }, "engines": { - "node": ">= 10" + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.0.9" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-declaration-sorter/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" }, "bin": { - "css-has-pseudo": "dist/cli.cjs" + "css-has-pseudo": "cli.js" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" }, - "peerDependencies": { - "postcss": "^8.4" + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", "dev": true, "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/css-loader/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" - }, + } + }, + "node_modules/css-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" + "css-prefers-color-scheme": "cli.js" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + } + }, + "node_modules/css-prefers-color-scheme/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-prefers-color-scheme/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "dependencies": { - "mdn-data": "2.0.14", + "mdn-data": "2.0.4", "source-map": "^0.6.1" }, "engines": { @@ -6149,9 +8506,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true, "engines": { "node": ">= 6" @@ -6161,9 +8518,9 @@ } }, "node_modules/cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", "dev": true }, "node_modules/cssesc": { @@ -6179,79 +8536,179 @@ } }, "node_modules/cssnano": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", - "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.5", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, "node_modules/cssnano-preset-default": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", - "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "dependencies": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.3", - "postcss-merge-rules": "^5.1.1", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-default/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/csso": { @@ -6266,6 +8723,34 @@ "node": ">=8.0.0" } }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -6290,6 +8775,23 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -6305,32 +8807,34 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "ms": "2.1.2" - }, + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=0.10.0" } }, "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } }, "node_modules/deep-equal": { "version": "1.1.1", @@ -6349,9 +8853,9 @@ } }, "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "node_modules/deepmerge": { @@ -6364,22 +8868,15 @@ } }, "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dependencies": { - "execa": "^5.0.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/define-properties": { @@ -6393,33 +8890,76 @@ "node": ">= 0.4" } }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/del/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" } }, "node_modules/delayed-stream": { @@ -6439,11 +8979,29 @@ "node": ">= 0.6" } }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -6454,39 +9012,43 @@ } }, "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dependencies": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -6510,30 +9072,35 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "dependencies": { "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" } }, "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true }, "node_modules/domexception": { "version": "2.0.1", @@ -6557,32 +9124,22 @@ } }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "domelementtype": "1" } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "dom-serializer": "0", + "domelementtype": "1" } }, "node_modules/dot-case": { @@ -6595,6 +9152,18 @@ "tslib": "^2.0.3" } }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", @@ -6614,9 +9183,9 @@ } }, "node_modules/dotenv-webpack": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.1.0.tgz", - "integrity": "sha512-+aUOe+nqgLerA/n611oyC15fY79BIkGm2fOxJAcHDonMZ7AtDpnzv/Oe591eHAenIE0t6w03UyxDnLs/YUxx5Q==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.0.3.tgz", + "integrity": "sha512-O0O9pOEwrk+n1zzR3T2uuXRlw64QxHSPeNN1GaiNBloQFNaCUL9V8jxSVz4jlXXFP/CIqK8YecWf8BAvsSgMjw==", "dev": true, "dependencies": { "dotenv-defaults": "^2.0.2" @@ -6634,20 +9203,61 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.4.92", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.92.tgz", - "integrity": "sha512-YAVbvQIcDE/IJ/vzDMjD484/hsRbFPW2qXJPaYTfOhtligmfYEYOep+5QojpaEU9kq6bMvNeC2aG7arYvTHYsA==" + "version": "1.3.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.401.tgz", + "integrity": "sha512-9tvSOS1++0EQP0tkgyD8KJergVZsld1/UqOusZVTbx9MWZHw5NCezkOjIQ5YWeB45jKdQerDfRrt28HwidI9Ow==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true, "engines": { "node": ">=10" @@ -6657,18 +9267,16 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "engines": { - "node": ">= 4" + "node": ">= 0.10" } }, "node_modules/encodeurl": { @@ -6679,37 +9287,43 @@ "node": ">= 0.8" } }, - "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=6.9.0" } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" + "node_modules/errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dependencies": { + "prr": "~1.0.1" }, - "engines": { - "node": ">=4" + "bin": { + "errno": "cli.js" } }, "node_modules/error-ex": { @@ -6721,15 +9335,68 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "node_modules/es-abstract": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.2.tgz", + "integrity": "sha512-YoKuru3Lyoy7yVTBSH2j7UxTqe/je3dWAruC0sHvZX1GNd5zX8SSLvQqEgO9b3Ex8IW+goFI9arEEsFIbulhOw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, "engines": { "node": ">=6" } @@ -6770,6 +9437,15 @@ "source-map": "~0.6.1" } }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6781,23 +9457,15 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dependencies": { - "esrecurse": "^4.3.0", + "esrecurse": "^4.1.0", "estraverse": "^4.1.1" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" + "node": ">=4.0.0" } }, "node_modules/esprima": { @@ -6824,10 +9492,18 @@ "node": ">=4.0" } }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { "node": ">=4.0" } @@ -6855,33 +9531,54 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "engines": { "node": ">=0.8.x" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "original": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "engines": { + "node": ">=6" } }, "node_modules/exit": { @@ -6893,32 +9590,118 @@ "node": ">= 0.8.0" } }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dev": true, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=0.10.0" } }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dependencies": { - "accepts": "~1.3.8", + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expect/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -6932,13 +9715,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -6948,62 +9731,133 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dependencies": { - "ms": "2.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" ] }, "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -7012,20 +9866,20 @@ "dev": true }, "node_modules/fast-png": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.1.0.tgz", - "integrity": "sha512-v8e/40RKZbE1mALigoqBOkYnemCVSMmVlGSz8fawZAZg5UQ9OZeR00L++CPvrhIGm2F6TxV5u9lbWD0oOJHcCw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-5.0.4.tgz", + "integrity": "sha512-vTNj6yixRnclW6sTlCeH6sNRLBOhM5ITmlo1LSU5ojKEc2e9kZkqXPo2xzBxKb61MBCXRXBcr8qJztOHr2O6WQ==", "dev": true, "dependencies": { - "@types/pako": "^1.0.2", - "iobuffer": "^5.0.4", - "pako": "^2.0.4" + "@types/pako": "^1.0.1", + "iobuffer": "^5.0.2", + "pako": "^2.0.2" } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "node_modules/fast-png/node_modules/pako": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==", "dev": true }, "node_modules/fastparse": { @@ -7034,18 +9888,10 @@ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -7062,15 +9908,40 @@ "bser": "2.1.1" } }, + "node_modules/figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dependencies": { - "to-regex-range": "^5.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/finalhandler": { @@ -7090,23 +9961,10 @@ "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "dependencies": { "commondir": "^1.0.1", @@ -7120,6 +9978,31 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-cache-dir/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -7135,23 +10018,94 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up": { + "node_modules/find-cache-dir/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", "funding": [ { "type": "individual", @@ -7167,39 +10121,54 @@ } } }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 6" + "node": ">= 0.12" } }, "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "engines": { "node": ">= 0.6" } }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "engines": { + "node": ">=0.10.0" } }, "node_modules/fresh": { @@ -7210,10 +10179,14 @@ "node": ">= 0.6" } }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", @@ -7221,24 +10194,600 @@ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 4.0" } }, + "node_modules/fsevents/node_modules/abbrev": { + "version": "1.1.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/are-we-there-yet": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fsevents/node_modules/chownr": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/code-point-at": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/core-util-is": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/debug": { + "version": "3.2.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.6.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fsevents/node_modules/delegates": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "inBundle": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/fsevents/node_modules/glob": { + "version": "7.1.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/iconv-lite": { + "version": "0.4.24", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fsevents/node_modules/inflight": { + "version": "1.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/ini": { + "version": "1.3.5", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/minimist": { + "version": "1.2.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/minipass": { + "version": "2.9.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.3.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.3", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fsevents/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/needle": { + "version": "2.3.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.14.0", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.4.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npmlog": { + "version": "4.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/fsevents/node_modules/number-is-nan": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/object-assign": { + "version": "4.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/os-homedir": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/os-tmpdir": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/fsevents/node_modules/path-is-absolute": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/process-nextick-args": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.8", + "inBundle": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fsevents/node_modules/rimraf": { + "version": "2.7.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fsevents/node_modules/safe-buffer": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/semver": { + "version": "5.7.1", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fsevents/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/string_decoder": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-ansi": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.13", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/wide-align": { + "version": "1.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC" + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -7257,7 +10806,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -7285,20 +10833,37 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7309,26 +10874,69 @@ }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-modules/node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/globals": { "version": "11.12.0", @@ -7340,36 +10948,39 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true }, "node_modules/gzip-size": { "version": "6.0.0", @@ -7427,6 +11038,12 @@ "handlebars": ">= 1.3.0 < 5" } }, + "node_modules/handlebars-loader/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, "node_modules/handlebars-loader/node_modules/big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -7436,15 +11053,6 @@ "node": "*" } }, - "node_modules/handlebars-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/handlebars-loader/node_modules/json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -7477,6 +11085,51 @@ "node": ">=0.10.0" } }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -7513,15 +11166,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, "engines": { "node": ">=4" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "engines": { "node": ">= 0.4" }, @@ -7529,18 +11181,94 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { + "node_modules/has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dependencies": { - "has-symbols": "^1.0.2" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "node_modules/he": { @@ -7552,6 +11280,40 @@ "he": "bin/he" } }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -7563,6 +11325,24 @@ "wbuf": "^1.1.0" } }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -7576,9 +11356,9 @@ } }, "node_modules/html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -7587,75 +11367,91 @@ "dev": true }, "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "dev": true, "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", "he": "^1.2.0", - "param-case": "^3.0.4", + "param-case": "^3.0.3", "relateurl": "^0.2.7", - "terser": "^5.10.0" + "terser": "^4.6.3" }, "bin": { "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" + "node": ">=6" } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", "dev": true, "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" + "node": ">=6.9" }, "peerDependencies": { - "webpack": "^5.20.0" + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/http-deceiver": { @@ -7664,24 +11460,29 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "toidentifier": "1.0.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" }, "node_modules/http-proxy": { "version": "1.18.1", @@ -7696,62 +11497,47 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": ">=4.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">= 6" + "node": ">=0.8", + "npm": ">=1.3.7" } }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=8.12.0" } }, "node_modules/iconv-lite": { @@ -7766,126 +11552,147 @@ } }, "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" + "dependencies": { + "postcss": "^7.0.14" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">= 6" } }, + "node_modules/icss-utils/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/icss-utils/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ifdef-loader": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/ifdef-loader/-/ifdef-loader-2.3.2.tgz", - "integrity": "sha512-kH9bHPrfIFxLpq3XEruJqSlHXch2nOljKIDRS/6MU5LDZTyHeaSWVf04wNYX+8RT+NDmeS8Vm5HwZ7akkXo8ig==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ifdef-loader/-/ifdef-loader-2.3.0.tgz", + "integrity": "sha512-JY3rPC1QNMzQ/h8pJlxyP6DsujlGnCYDmEYROQpMe90m1aRFVLtpTuqmN15aaq2/9vOmzByWMxWdvR1O+xNHGw==", "dev": true, "dependencies": { "loader-utils": "^1.1.0" } }, - "node_modules/ifdef-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dev": true, "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/ifdef-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "import-from": "^2.1.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", - "dev": true - }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, "engines": { "node": ">=4" } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, "engines": { "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflight": { "version": "1.0.6", @@ -7901,10 +11708,28 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "engines": { "node": ">= 0.10" @@ -7920,9 +11745,9 @@ } }, "node_modules/iobuffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.1.0.tgz", - "integrity": "sha512-2BYQoYadP3FkVPfqGxs4WO6z3HWGZokJfIkgOARn4P4ipVQCHJnPyva7rJLVmnRA7XTk8ZoLwutuutGeMpu3PA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.0.3.tgz", + "integrity": "sha512-0SNk4hbHVXx9oE27vTJY+oiI0txkhBdQV12RvILd/7XuIhBZ0TkImq5EnhFYCcRcDff8jpFhZ9C2Sg+NIo3ZMQ==", "dev": true }, "node_modules/ip": { @@ -7930,6 +11755,14 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -7938,13 +11771,43 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dependencies": { + "call-bind": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7960,20 +11823,63 @@ "dev": true }, "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dependencies": { - "binary-extensions": "^2.0.0" + "binary-extensions": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -7982,24 +11888,72 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dependencies": { - "has-tostringtag": "^1.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "optional": true, "bin": { "is-docker": "cli.js" }, @@ -8010,6 +11964,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -8019,12 +11981,11 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/is-generator-fn": { @@ -8037,9 +11998,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8047,12 +12008,47 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/is-path-cwd": { @@ -8063,30 +12059,41 @@ "node": ">=6" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dependencies": { + "is-path-inside": "^2.1.0" + }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" } }, "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -8101,12 +12108,12 @@ "dev": true }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "dependencies": { "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "has-symbols": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8115,15 +12122,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "dependencies": { + "html-comment-regex": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typedarray": { @@ -8132,15 +12169,20 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" } }, "node_modules/isarray": { @@ -8157,36 +12199,49 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", + "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -8225,6 +12280,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8238,9 +12302,9 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -8248,9 +12312,32 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8261,9 +12348,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -8274,290 +12361,181 @@ } }, "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "dependencies": { - "@jest/core": "^27.5.1", + "@jest/core": "^26.6.3", "import-local": "^3.0.2", - "jest-cli": "^27.5.1" + "jest-cli": "^26.6.3" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">= 10.14.2" } }, "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-changed-files/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "pump": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/jest-circus/node_modules/slash": { + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-changed-files/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" + "isexe": "^2.0.0" }, "bin": { - "jest": "bin/jest.js" + "node-which": "bin/node-which" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">= 8" } }, "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", "chalk": "^4.0.0", - "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" }, "peerDependencies": { "ts-node": ">=9.0.0" @@ -8583,10 +12561,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-config/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -8617,6 +12607,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-config/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8626,13 +12634,38 @@ "node": ">=8" } }, - "node_modules/jest-config/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/jest-config/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.12.0" + } + }, + "node_modules/jest-config/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-config/node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/jest-config/node_modules/supports-color": { @@ -8647,19 +12680,31 @@ "node": ">=8" } }, + "node_modules/jest-config/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-diff/node_modules/ansi-styles": { @@ -8678,9 +12723,9 @@ } }, "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -8733,31 +12778,31 @@ } }, "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-each/node_modules/ansi-styles": { @@ -8776,9 +12821,9 @@ } }, "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -8831,101 +12876,206 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", "walker": "^1.0.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" }, "optionalDependencies": { - "fsevents": "^2.3.2" + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-haste-map/node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-haste-map/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/jest-haste-map/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch/node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-haste-map/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.5.1", + "expect": "^26.6.2", "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-jasmine2/node_modules/ansi-styles": { @@ -8944,9 +13094,9 @@ } }, "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -8999,31 +13149,31 @@ } }, "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { @@ -9042,9 +13192,9 @@ } }, "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9097,23 +13247,23 @@ } }, "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-message-util/node_modules/ansi-styles": { @@ -9131,10 +13281,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-message-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9165,6 +13327,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-message-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9174,6 +13354,40 @@ "node": ">=8" } }, + "node_modules/jest-message-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-message-util/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-message-util/node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-message-util/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -9195,17 +13409,29 @@ "node": ">=8" } }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "node_modules/jest-message-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", "@types/node": "*" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-pnp-resolver": { @@ -9226,47 +13452,45 @@ } }, "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", + "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-resolve/node_modules/ansi-styles": { @@ -9285,9 +13509,9 @@ } }, "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9318,6 +13542,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-resolve/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9349,35 +13579,34 @@ } }, "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", - "throat": "^6.0.1" + "throat": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-runner/node_modules/ansi-styles": { @@ -9396,9 +13625,9 @@ } }, "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9429,6 +13658,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-runner/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9451,36 +13686,53 @@ } }, "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", + "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", + "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/jest-runtime/node_modules/ansi-styles": { @@ -9499,9 +13751,9 @@ } }, "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9514,6 +13766,17 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9532,6 +13795,31 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-runtime/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9541,6 +13829,48 @@ "node": ">=8" } }, + "node_modules/jest-runtime/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -9550,6 +13880,32 @@ "node": ">=8" } }, + "node_modules/jest-runtime/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9562,50 +13918,99 @@ "node": ">=8" } }, + "node_modules/jest-runtime/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "dependencies": { "@types/node": "*", - "graceful-fs": "^4.2.9" + "graceful-fs": "^4.2.4" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, + "node_modules/jest-serializer/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", + "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", + "pretty-format": "^26.6.2", "semver": "^7.3.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-snapshot/node_modules/ansi-styles": { @@ -9624,9 +14029,9 @@ } }, "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9657,6 +14062,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-snapshot/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9694,20 +14105,20 @@ } }, "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-util/node_modules/ansi-styles": { @@ -9725,10 +14136,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9759,6 +14182,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9768,6 +14209,40 @@ "node": ">=8" } }, + "node_modules/jest-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-util/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9780,21 +14255,33 @@ "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "node_modules/jest-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "is-number": "^7.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8.0" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, "node_modules/jest-validate/node_modules/ansi-styles": { @@ -9813,9 +14300,9 @@ } }, "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true, "engines": { "node": ">=10" @@ -9825,9 +14312,9 @@ } }, "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9880,21 +14367,21 @@ } }, "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.5.1", + "jest-util": "^26.6.2", "string-length": "^4.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10.14.2" } }, "node_modules/jest-watcher/node_modules/ansi-styles": { @@ -9913,9 +14400,9 @@ } }, "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9968,13 +14455,14 @@ } }, "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^7.0.0" }, "engines": { "node": ">= 10.13.0" @@ -9984,22 +14472,329 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/jest/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/js-tokens": { @@ -10009,9 +14804,9 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -10021,14 +14816,33 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", + "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", "dev": true, "dependencies": { "abab": "^2.0.5", - "acorn": "^8.2.4", + "acorn": "^8.1.0", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", @@ -10036,13 +14850,12 @@ "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", - "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", + "is-potential-custom-element-name": "^1.0.0", "nwsapi": "^2.2.0", "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", @@ -10052,7 +14865,7 @@ "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", - "ws": "^7.4.6", + "ws": "^7.4.4", "xml-name-validator": "^3.0.0" }, "engines": { @@ -10067,6 +14880,39 @@ } } }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz", + "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10090,28 +14936,63 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10125,15 +15006,6 @@ "node": ">=6" } }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -10144,25 +15016,6 @@ "webpack-sources": "^1.1.0" } }, - "node_modules/last-call-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/last-call-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -10185,59 +15038,55 @@ "node": ">= 0.8.0" } }, - "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "engines": { - "node": ">=6.11.5" + "node": ">=4.3.0 <5.0.0 || >=5.10" } }, "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dependencies": { "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "emojis-list": "^2.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">=8.9.0" + "node": ">=4.0.0" } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -10251,12 +15100,43 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -10294,7 +15174,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -10303,15 +15182,6 @@ "node": ">=6" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -10319,40 +15189,108 @@ "dev": true }, "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "dependencies": { - "tmpl": "1.0.5" + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, "node_modules/media-query-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/media-query-plugin/-/media-query-plugin-1.5.0.tgz", - "integrity": "sha512-uGA5WgjUeXmBsF6YqTkBXa6TMtMWoqn1bB/tWlowglSajUjxcY8VnhDPPu7HDcTZvq9XSMC/IfCrzwayXkkM/w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/media-query-plugin/-/media-query-plugin-1.4.0.tgz", + "integrity": "sha512-Cht8LWE9C7UJ8tGw9c14vkaS2S8mKsHMdkJhAIZuC4x/3Dcyu35ZGQoOkwUwrPb/Uw2kcy4cL0OLa/m5wll43A==", "dev": true, "dependencies": { "loader-utils": "^2.0.0", "postcss": "^7.0.32", - "webpack": "^5.21.2", - "webpack-sources": "^2.2.0" + "webpack": "^4.44.1", + "webpack-sources": "^1.4.3" + } + }, + "node_modules/media-query-plugin/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/media-query-plugin/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/media-query-plugin/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, "node_modules/media-query-plugin/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "engines": { "node": ">=6.0.0" @@ -10379,15 +15317,17 @@ "node": ">= 0.6" } }, - "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, "dependencies": { - "fs-monkey": "1.0.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" }, "engines": { - "node": ">= 4.0.0" + "node": ">=4.3.0 <5.0.0 || >=5.10" } }, "node_modules/merge-descriptors": { @@ -10398,15 +15338,8 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/methods": { "version": "1.1.2", @@ -10417,42 +15350,70 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "engines": { - "node": ">=8.6" + "node": ">=0.10.0" } }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "1.40.0" }, "engines": { "node": ">= 0.6" @@ -10462,80 +15423,41 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "dev": true, "dependencies": { - "schema-utils": "^4.0.0" + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 6.9.0" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^4.4.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 4" } }, "node_modules/minimalistic-assert": { @@ -10543,10 +15465,15 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10555,21 +15482,77 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dependencies": { - "minimist": "^1.2.6" + "minimist": "^1.2.5" }, "bin": { "mkdirp": "bin/cmd.js" } }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, "node_modules/mrmime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", @@ -10580,9 +15563,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -10601,10 +15584,16 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, + "node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -10613,6 +15602,27 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -10620,17 +15630,22 @@ "dev": true }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node_modules/no-case": { "version": "3.0.4", @@ -10643,11 +15658,11 @@ } }, "node_modules/node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "engines": { - "node": ">= 6.13.0" + "node": ">= 6.0.0" } }, "node_modules/node-int64": { @@ -10656,10 +15671,137 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node_modules/node-releases": { + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-notifier/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, "node_modules/normalize-path": { "version": "3.0.0", @@ -10679,40 +15821,40 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, "node_modules/npm": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.5.5.tgz", - "integrity": "sha512-a1vl26nokCNlD+my/iNYmOUPx/hpYR4ZyZk8gb7/A2XXtrPZf2gTSJOnVjS77jQS+BSfIVQpipZwXWCL0+5wzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-7.12.1.tgz", + "integrity": "sha512-vjIniB3kqujcDTgH+k90J2i5PPqYZyf1gi5Ni5fARK4WQr5FuVnTQlTXloyk15+qWUxwWHcy6U8YCWwh/TLzmA==", "bundleDependencies": [ - "@isaacs/string-locale-compare", "@npmcli/arborist", "@npmcli/ci-detect", "@npmcli/config", - "@npmcli/map-workspaces", - "@npmcli/package-json", "@npmcli/run-script", "abbrev", "ansicolors", "ansistyles", "archy", + "byte-size", "cacache", "chalk", "chownr", "cli-columns", "cli-table3", "columnify", - "fastest-levenshtein", "glob", "graceful-fs", "hosted-git-info", @@ -10720,6 +15862,7 @@ "init-package-json", "is-cidr", "json-parse-even-better-errors", + "leven", "libnpmaccess", "libnpmdiff", "libnpmexec", @@ -10740,7 +15883,6 @@ "node-gyp", "nopt", "npm-audit-report", - "npm-install-checks", "npm-package-arg", "npm-pick-manifest", "npm-profile", @@ -10750,7 +15892,6 @@ "opener", "pacote", "parse-conflict-json", - "proc-log", "qrcode-terminal", "read", "read-package-json", @@ -10769,183 +15910,151 @@ ], "dev": true, "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.0.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.0.1", - "@npmcli/map-workspaces": "^2.0.2", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^3.0.1", + "@npmcli/arborist": "^2.4.4", + "@npmcli/ci-detect": "^1.2.0", + "@npmcli/config": "^2.2.0", + "@npmcli/run-script": "^1.8.5", "abbrev": "~1.1.1", "ansicolors": "~0.3.2", "ansistyles": "~0.1.3", "archy": "~1.0.0", - "cacache": "^16.0.2", - "chalk": "^4.1.2", + "byte-size": "^7.0.1", + "cacache": "^15.0.6", + "chalk": "^4.1.0", "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.1", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "glob": "^7.2.0", - "graceful-fs": "^4.2.9", - "hosted-git-info": "^5.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.6.0", + "columnify": "~1.5.4", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "hosted-git-info": "^4.0.2", "ini": "^2.0.0", - "init-package-json": "^3.0.1", + "init-package-json": "^2.0.3", "is-cidr": "^4.0.2", "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.2", - "libnpmdiff": "^4.0.2", - "libnpmexec": "^4.0.2", - "libnpmfund": "^3.0.1", - "libnpmhook": "^8.0.2", - "libnpmorg": "^4.0.2", - "libnpmpack": "^4.0.2", - "libnpmpublish": "^6.0.2", - "libnpmsearch": "^5.0.2", - "libnpmteam": "^4.0.2", - "libnpmversion": "^3.0.1", - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", + "leven": "^3.1.0", + "libnpmaccess": "^4.0.2", + "libnpmdiff": "^2.0.4", + "libnpmexec": "^1.1.1", + "libnpmfund": "^1.0.2", + "libnpmhook": "^6.0.2", + "libnpmorg": "^2.0.2", + "libnpmpack": "^2.0.1", + "libnpmpublish": "^4.0.1", + "libnpmsearch": "^3.1.1", + "libnpmteam": "^2.0.3", + "libnpmversion": "^1.2.0", + "make-fetch-happen": "^8.0.14", + "minipass": "^3.1.3", "minipass-pipeline": "^1.2.4", "mkdirp": "^1.0.4", "mkdirp-infer-owner": "^2.0.0", "ms": "^2.1.2", - "node-gyp": "^9.0.0", + "node-gyp": "^7.1.2", "nopt": "^5.0.0", - "npm-audit-report": "^2.1.5", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-pick-manifest": "^7.0.0", - "npm-profile": "^6.0.2", - "npm-registry-fetch": "^13.0.1", + "npm-audit-report": "^2.1.4", + "npm-package-arg": "^8.1.2", + "npm-pick-manifest": "^6.1.1", + "npm-profile": "^5.0.3", + "npm-registry-fetch": "^10.1.1", "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.1", + "npmlog": "~4.1.2", "opener": "^1.5.2", - "pacote": "^13.0.5", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", + "pacote": "^11.3.3", + "parse-conflict-json": "^1.1.1", "qrcode-terminal": "^0.12.0", "read": "~1.0.7", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", + "read-package-json": "^3.0.1", + "read-package-json-fast": "^2.0.2", "readdir-scoped-modules": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "ssri": "^8.0.1", - "tar": "^6.1.11", + "tar": "^6.1.0", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^1.0.4", "validate-npm-package-name": "~3.0.0", "which": "^2.0.2", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^3.0.3" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dependencies": { - "path-key": "^3.0.0" + "path-key": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.0.3", + "version": "2.4.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.0", - "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^1.1.0", "@npmcli/move-file": "^1.1.0", "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.3", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^3.0.0", - "bin-links": "^3.0.0", - "cacache": "^16.0.0", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/run-script": "^1.8.2", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", "common-ancestor-path": "^1.0.1", "json-parse-even-better-errors": "^2.3.1", "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", "npm-install-checks": "^4.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.1", - "pacote": "^13.0.5", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^10.0.0", + "pacote": "^11.2.6", + "parse-conflict-json": "^1.1.1", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^2.0.2", "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", "semver": "^7.3.5", - "ssri": "^8.0.1", + "tar": "^6.1.0", "treeverse": "^1.0.4", "walk-up-path": "^1.0.0" }, "bin": { "arborist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", + "version": "1.3.0", "dev": true, "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } + "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.0.1", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^2.0.1", "ini": "^2.0.0", "mkdirp-infer-owner": "^2.0.0", "nopt": "^5.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", + "semver": "^7.3.4", "walk-up-path": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/@npmcli/disparity-colors": { @@ -10960,37 +16069,20 @@ "node": ">=10" } }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.0", + "version": "2.0.9", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^7.3.1", + "lru-cache": "^6.0.0", "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "npm-pick-manifest": "^6.1.1", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { @@ -11010,54 +16102,29 @@ } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.2", + "version": "1.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.2.0", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" }, "engines": { "node": ">=10" } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.0.1", + "version": "1.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" } }, "node_modules/npm/node_modules/@npmcli/move-file": { @@ -11080,20 +16147,11 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "1.0.3", + "version": "1.0.2", "dev": true, "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - } - }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { "version": "1.3.2", "dev": true, @@ -11104,27 +16162,25 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "3.0.1", + "version": "1.8.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^1.0.3", + "@npmcli/node-gyp": "^1.0.2", "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" } }, "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", + "version": "1.1.2", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 6" } }, "node_modules/npm/node_modules/abbrev": { @@ -11146,7 +16202,7 @@ } }, "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", + "version": "4.1.4", "dev": true, "inBundle": true, "license": "MIT", @@ -11172,13 +16228,29 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", + "version": "2.1.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/npm/node_modules/ansi-styles": { @@ -11221,16 +16293,13 @@ "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.0", + "version": "1.1.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "readable-stream": "^2.0.6" } }, "node_modules/npm/node_modules/asap": { @@ -11239,27 +16308,75 @@ "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/asn1": { + "version": "0.2.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/npm/node_modules/assert-plus": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/aws-sign2": { + "version": "0.7.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/aws4": { + "version": "1.11.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/npm/node_modules/bin-links": { - "version": "3.0.0", + "version": "2.2.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "cmd-shim": "^4.0.1", - "mkdirp-infer-owner": "^2.0.0", + "mkdirp": "^1.0.3", "npm-normalize-package-bin": "^1.0.0", "read-cmd-shim": "^2.0.0", "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "write-file-atomic": "^3.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/binary-extensions": { @@ -11287,37 +16404,51 @@ "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/byte-size": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/npm/node_modules/cacache": { - "version": "16.0.2", + "version": "15.0.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.1.2", + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^7.2.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.1.11", + "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">= 10" } }, + "node_modules/npm/node_modules/caseless": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", + "version": "4.1.1", "dev": true, "inBundle": true, "license": "MIT", @@ -11363,31 +16494,76 @@ } }, "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", + "version": "3.1.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" }, "engines": { - "node": ">= 10" + "node": ">= 4" } }, "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.1", + "version": "0.6.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { + "object-assign": "^4.1.0", "string-width": "^4.2.0" }, "engines": { "node": "10.* || >= 12.*" }, "optionalDependencies": { - "colors": "1.4.0" + "colors": "^1.1.2" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/npm/node_modules/clone": { @@ -11411,6 +16587,15 @@ "node": ">=10" } }, + "node_modules/npm/node_modules/code-point-at": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm/node_modules/color-convert": { "version": "2.0.1", "dev": true, @@ -11429,15 +16614,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/npm/node_modules/colors": { "version": "1.4.0", "dev": true, @@ -11449,16 +16625,25 @@ } }, "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", + "version": "1.5.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "strip-ansi": "^6.0.1", + "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" + } + }, + "node_modules/npm/node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.8" } }, "node_modules/npm/node_modules/common-ancestor-path": { @@ -11479,8 +16664,26 @@ "inBundle": true, "license": "ISC" }, + "node_modules/npm/node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/dashdash": { + "version": "1.14.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/npm/node_modules/debug": { - "version": "4.3.3", + "version": "4.3.1", "dev": true, "inBundle": true, "license": "MIT", @@ -11520,6 +16723,15 @@ "clone": "^1.0.2" } }, + "node_modules/npm/node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/npm/node_modules/delegates": { "version": "1.0.0", "dev": true, @@ -11554,6 +16766,16 @@ "node": ">=0.3.1" } }, + "node_modules/npm/node_modules/ecc-jsbn": { + "version": "0.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", "dev": true, @@ -11585,12 +16807,56 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", + "node_modules/npm/node_modules/extend": { + "version": "3.0.2", "dev": true, "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/extsprintf": { + "version": "1.3.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/forever-agent": { + "version": "0.6.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/form-data": { + "version": "2.3.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/npm/node_modules/fs-minipass": { "version": "2.1.0", "dev": true, @@ -11616,26 +16882,64 @@ "license": "MIT" }, "node_modules/npm/node_modules/gauge": { - "version": "4.0.3", + "version": "2.7.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/npm/node_modules/gauge/node_modules/aproba": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/getpass": { + "version": "0.1.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" } }, "node_modules/npm/node_modules/glob": { - "version": "7.2.0", + "version": "7.1.7", "dev": true, "inBundle": true, "license": "ISC", @@ -11655,11 +16959,33 @@ } }, "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.9", + "version": "4.2.6", "dev": true, "inBundle": true, "license": "ISC" }, + "node_modules/npm/node_modules/har-schema": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/har-validator": { + "version": "5.1.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/npm/node_modules/has": { "version": "1.0.3", "dev": true, @@ -11688,15 +17014,15 @@ "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.0.0", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^7.5.1" + "lru-cache": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/http-cache-semantics": { @@ -11706,12 +17032,12 @@ "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", + "version": "4.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, @@ -11719,6 +17045,21 @@ "node": ">= 6" } }, + "node_modules/npm/node_modules/http-signature": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/npm/node_modules/https-proxy-agent": { "version": "5.0.0", "dev": true, @@ -11742,7 +17083,7 @@ } }, "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", + "version": "0.6.2", "dev": true, "inBundle": true, "license": "MIT", @@ -11755,15 +17096,12 @@ } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "4.0.1", + "version": "3.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10" } }, "node_modules/npm/node_modules/imurmurhash": { @@ -11816,21 +17154,22 @@ } }, "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.1", + "version": "2.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^9.0.0", + "glob": "^7.1.1", + "npm-package-arg": "^8.1.2", "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", + "read": "~1.0.1", + "read-package-json": "^3.0.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/ip": { @@ -11861,7 +17200,7 @@ } }, "node_modules/npm/node_modules/is-core-module": { - "version": "2.8.1", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "MIT", @@ -11873,12 +17212,12 @@ } }, "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/npm/node_modules/is-lambda": { @@ -11887,18 +17226,53 @@ "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC" }, + "node_modules/npm/node_modules/isstream": { + "version": "0.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/jsbn": { + "version": "0.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/json-schema": { + "version": "0.2.3", + "dev": true, + "inBundle": true + }, + "node_modules/npm/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", "dev": true, @@ -11908,6 +17282,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm/node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", "dev": true, @@ -11917,35 +17297,59 @@ "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/jsprim": { + "version": "1.4.1", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "node_modules/npm/node_modules/just-diff": { - "version": "5.0.1", + "version": "3.1.1", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { - "version": "4.0.1", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/leven": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.2", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.2", + "version": "2.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -11955,185 +17359,200 @@ "binary-extensions": "^2.2.0", "diff": "^5.0.0", "minimatch": "^3.0.4", - "npm-package-arg": "^9.0.1", - "pacote": "^13.0.5", + "npm-package-arg": "^8.1.1", + "pacote": "^11.3.0", "tar": "^6.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.2", + "version": "1.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^5.0.0", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/run-script": "^3.0.0", + "@npmcli/arborist": "^2.3.0", + "@npmcli/ci-detect": "^1.3.0", + "@npmcli/run-script": "^1.8.4", "chalk": "^4.1.0", "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.1", - "pacote": "^13.0.5", - "proc-log": "^2.0.0", + "npm-package-arg": "^8.1.2", + "pacote": "^11.3.1", + "proc-log": "^1.0.0", "read": "^1.0.7", "read-package-json-fast": "^2.0.2", "walk-up-path": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.1", + "version": "1.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "@npmcli/arborist": "^2.0.0" } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^3.0.0", - "npm-package-arg": "^9.0.1", - "pacote": "^13.0.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" + "aproba": "^2.0.0", + "npm-registry-fetch": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.2", + "node_modules/npm/node_modules/libnpmorg": { + "version": "2.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "npm-registry-fetch": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.1", + "node_modules/npm/node_modules/libnpmpack": { + "version": "2.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^3.0.0", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.5", - "stringify-package": "^1.0.1" + "@npmcli/run-script": "^1.8.3", + "npm-package-arg": "^8.1.0", + "pacote": "^11.2.6" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.5.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.0.6", + "node_modules/npm/node_modules/libnpmpublish": { + "version": "4.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.0.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.1.1", + "normalize-package-data": "^3.0.2", + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^10.0.0", + "semver": "^7.1.3", "ssri": "^8.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^10.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^10.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^2.0.7", + "@npmcli/run-script": "^1.8.4", + "json-parse-even-better-errors": "^2.3.1", + "semver": "^7.3.5", + "stringify-package": "^1.0.1" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "8.0.14", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/mime-db": { + "version": "1.47.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/mime-types": { + "version": "2.1.30", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.47.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/npm/node_modules/minimatch": { - "version": "3.1.2", + "version": "3.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -12145,7 +17564,7 @@ } }, "node_modules/npm/node_modules/minipass": { - "version": "3.1.6", + "version": "3.1.3", "dev": true, "inBundle": true, "license": "ISC", @@ -12169,20 +17588,20 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.0.3", + "version": "1.3.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^3.1.6", + "minipass": "^3.1.0", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=8" }, "optionalDependencies": { - "encoding": "^0.1.13" + "encoding": "^0.1.12" } }, "node_modules/npm/node_modules/minipass-flush": { @@ -12282,37 +17701,28 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/npm/node_modules/node-gyp": { - "version": "9.0.0", + "version": "7.1.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "graceful-fs": "^4.2.3", "nopt": "^5.0.0", - "npmlog": "^6.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", + "semver": "^7.3.2", + "tar": "^6.0.2", "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": ">= 10.12.0" } }, "node_modules/npm/node_modules/nopt": { @@ -12331,22 +17741,22 @@ } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.0", + "version": "3.0.2", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/npm-audit-report": { - "version": "2.1.5", + "version": "2.1.4", "dev": true, "inBundle": true, "license": "ISC", @@ -12385,81 +17795,77 @@ "license": "ISC" }, "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.0.1", + "version": "8.1.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^5.0.0", - "semver": "^7.3.5", + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "4.0.0", + "version": "2.2.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "glob": "^7.2.0", - "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.2", + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "npm-packlist": "bin/index.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.0", + "version": "6.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" } }, "node_modules/npm/node_modules/npm-profile": { - "version": "6.0.2", + "version": "5.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^13.0.0", - "proc-log": "^2.0.0" + "npm-registry-fetch": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.0.1", + "version": "10.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "make-fetch-happen": "^10.0.3", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.1", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.0", - "proc-log": "^2.0.0" + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/npm-user-validate": { @@ -12469,18 +17875,42 @@ "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/npmlog": { - "version": "6.0.1", + "version": "4.1.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - }, + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/npm/node_modules/number-is-nan": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/oauth-sign": { + "version": "0.9.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, "node_modules/npm/node_modules/once": { @@ -12517,52 +17947,47 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "13.0.5", + "version": "11.3.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.6", "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^3.0.1", - "cacache": "^16.0.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^4.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^10.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", + "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.1.11" + "tar": "^6.1.0" }, "bin": { "pacote": "lib/bin.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.1", + "version": "1.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" } }, "node_modules/npm/node_modules/path-is-absolute": { @@ -12574,14 +17999,29 @@ "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.0", + "node_modules/npm/node_modules/path-parse": { + "version": "1.0.6", "dev": true, "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } + "license": "MIT" + }, + "node_modules/npm/node_modules/performance-now": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/proc-log": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", @@ -12629,6 +18069,21 @@ "read": "1" } }, + "node_modules/npm/node_modules/psl": { + "version": "1.8.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/punycode": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", "dev": true, @@ -12637,6 +18092,15 @@ "qrcode-terminal": "bin/qrcode-terminal.js" } }, + "node_modules/npm/node_modules/qs": { + "version": "6.5.2", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, "node_modules/npm/node_modules/read": { "version": "1.0.7", "dev": true, @@ -12656,22 +18120,22 @@ "license": "ISC" }, "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "glob": "^7.2.0", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1" + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=10" } }, "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", + "version": "2.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -12684,17 +18148,18 @@ } }, "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", + "version": "2.3.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "node_modules/npm/node_modules/readdir-scoped-modules": { @@ -12709,6 +18174,63 @@ "once": "^1.3.0" } }, + "node_modules/npm/node_modules/request": { + "version": "2.88.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/resolve": { + "version": "1.20.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", "dev": true, @@ -12734,22 +18256,8 @@ } }, "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", + "version": "5.1.2", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "inBundle": true, "license": "MIT" }, @@ -12757,8 +18265,7 @@ "version": "2.1.2", "dev": true, "inBundle": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/npm/node_modules/semver": { "version": "7.3.5", @@ -12775,18 +18282,6 @@ "node": ">=10" } }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm/node_modules/set-blocking": { "version": "2.0.0", "dev": true, @@ -12794,13 +18289,13 @@ "license": "ISC" }, "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", + "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", + "version": "4.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -12810,13 +18305,13 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.6.2", + "version": "2.6.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ip": "^1.1.5", - "smart-buffer": "^4.2.0" + "smart-buffer": "^4.1.0" }, "engines": { "node": ">= 10.13.0", @@ -12824,17 +18319,17 @@ } }, "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "6.1.1", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" }, "engines": { - "node": ">= 10" + "node": ">= 6" } }, "node_modules/npm/node_modules/spdx-correct": { @@ -12864,11 +18359,36 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", + "version": "3.0.7", "dev": true, "inBundle": true, "license": "CC0-1.0" }, + "node_modules/npm/node_modules/sshpk": { + "version": "1.16.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm/node_modules/ssri": { "version": "8.0.1", "dev": true, @@ -12882,26 +18402,46 @@ } }, "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", + "version": "1.1.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", + "version": "2.1.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/npm/node_modules/stringify-package": { @@ -12911,15 +18451,15 @@ "license": "ISC" }, "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/npm/node_modules/supports-color": { @@ -12935,7 +18475,7 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "6.1.11", + "version": "6.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12969,6 +18509,33 @@ "inBundle": true, "license": "ISC" }, + "node_modules/npm/node_modules/tunnel-agent": { + "version": "0.6.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "inBundle": true, + "license": "Unlicense" + }, + "node_modules/npm/node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/npm/node_modules/unique-filename": { "version": "1.1.1", "dev": true, @@ -12987,12 +18554,30 @@ "imurmurhash": "^0.1.4" } }, + "node_modules/npm/node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT" }, + "node_modules/npm/node_modules/uuid": { + "version": "3.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, @@ -13012,6 +18597,20 @@ "builtins": "^1.0.3" } }, + "node_modules/npm/node_modules/verror": { + "version": "1.10.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/npm/node_modules/walk-up-path": { "version": "1.0.0", "dev": true, @@ -13043,12 +18642,12 @@ } }, "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", + "version": "1.1.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "string-width": "^1.0.2 || 2" } }, "node_modules/npm/node_modules/wrappy": { @@ -13058,16 +18657,15 @@ "license": "ISC" }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.1", + "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "node_modules/npm/node_modules/yallist": { @@ -13077,38 +18675,93 @@ "license": "ISC" }, "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "boolbase": "~1.0.0" } }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dependencies": { - "call-bind": "^1.0.2", + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dependencies": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3" }, "engines": { @@ -13126,7 +18779,127 @@ "node": ">= 0.4" } }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values/node_modules/es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values/node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values/node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values/node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", @@ -13149,6 +18922,12 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, + "node_modules/on-build-webpack": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/on-build-webpack/-/on-build-webpack-0.1.0.tgz", + "integrity": "sha1-oofA4Xdm5hQZJuXyy7DYu1O3aBQ=", + "dev": true + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -13180,6 +18959,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -13190,22 +18970,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -13215,15 +18979,25 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/optimize-css-assets-webpack-plugin": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.1.tgz", - "integrity": "sha512-BshV2UZPfggZLdUfN3zFBbG4sl/DynUI+YCB6fRRDWaqO2OiWN8GPcp4Y0/fEV6B3k9Hzyk3czve3V/8B/SzKQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "dev": true, "dependencies": { - "cssnano": "^5.0.2", - "last-call-webpack-plugin": "^3.0.0", - "postcss": "^8.2.1" + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0" @@ -13246,74 +19020,96 @@ "node": ">= 0.8.0" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" + "retry": "^0.12.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } }, "node_modules/pako": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", - "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==", "dev": true }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -13324,16 +19120,16 @@ "tslib": "^2.0.3" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "node_modules/parse-json": { @@ -13354,6 +19150,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -13378,13 +19183,30 @@ "tslib": "^2.0.3" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" } }, "node_modules/path-is-absolute": { @@ -13395,18 +19217,23 @@ "node": ">=0.10.0" } }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "node_modules/path-to-regexp": { @@ -13414,24 +19241,32 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, "engines": { - "node": ">=8" + "node": ">=0.12" } }, - "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "devOptional": true, "engines": { "node": ">=8.6" }, @@ -13443,30 +19278,120 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dependencies": { - "find-up": "^4.0.0" + "find-up": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/portfinder": { @@ -13482,14 +19407,6 @@ "node": ">= 0.12.0" } }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dependencies": { - "lodash": "^4.17.14" - } - }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -13498,1009 +19415,2908 @@ "ms": "^2.1.1" } }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.10.tgz", + "integrity": "sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], "dependencies": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" }, "engines": { "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", - "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.2" - }, - "peerDependencies": { - "postcss": "^8.0.2" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", - "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", - "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", - "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", - "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.2" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", - "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", - "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", - "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz", - "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "url": "https://opencollective.com/postcss/" } }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "engines": { - "node": ">=10" + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-gray/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-gray/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-hex-alpha/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-hex-alpha/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-mod-function/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-mod-function/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-rebeccapurple/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-rebeccapurple/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-colormin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-convert-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-media/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-media/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-properties/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-properties/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-comments/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-empty/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-double-position-gradients/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-double-position-gradients/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-env-function/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-env-function/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-focus-visible/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-focus-within/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-font-variant/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-font-variant/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-gap-properties/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-gap-properties/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-image-set-function/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-image-set-function/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "dev": true, + "dependencies": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-initial/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-initial/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-lab-function/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-lab-function/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-logical/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-logical/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=0.10.0" } }, "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-media-minmax/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-media-minmax/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=0.10.0" } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", - "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-merge-longhand/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-merge-rules/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-font-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-gradients/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-params/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.5" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-selectors/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=0.10.0" } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0", + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-scope/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0" + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-modules-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=6.0.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-nesting": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz", - "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.2" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-nesting/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-charset/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-display-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-positions/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-repeat-style/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-string/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-timing-functions/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-unicode/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-url/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6.9.0" } }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-whitespace/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-ordered-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-overflow-shorthand": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-overflow-shorthand/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-overflow-shorthand/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=0.10.0" } }, "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", "dev": true, - "peerDependencies": { - "postcss": "^8" + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-page-break/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-page-break/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-place": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", - "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + } + }, + "node_modules/postcss-place/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-place/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "dev": true, "dependencies": { - "@csstools/postcss-color-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", - "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.2", - "postcss-color-hex-alpha": "^8.0.3", - "postcss-color-rebeccapurple": "^7.0.2", - "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", - "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0", - "postcss-value-parser": "^4.2.0" + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + } + }, + "node_modules/postcss-preset-env/node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/postcss-preset-env/node_modules/autoprefixer/node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/postcss-preset-env/node_modules/autoprefixer/node_modules/caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/postcss-preset-env/node_modules/electron-to-chromium": { + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", + "dev": true + }, + "node_modules/postcss-preset-env/node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/postcss-preset-env/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-preset-env/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", - "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" }, - "peerDependencies": { - "postcss": "^8.4" + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-initial/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-reduce-transforms/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", "dev": true, - "peerDependencies": { - "postcss": "^8.0.3" + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-replace-overflow-wrap/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-replace-overflow-wrap/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-matches/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-matches/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-selector-not": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", - "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-not/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" }, "engines": { "node": ">=4" } }, "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.5" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-unique-selectors/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "node_modules/postcss/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/prelude-ls": { "version": "1.1.2", @@ -14511,57 +22327,94 @@ "node": ">= 0.8.0" } }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=4" } }, "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dev": true, "dependencies": { "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "renderkid": "^2.0.4" } }, "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", "react-is": "^17.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -14571,15 +22424,28 @@ "node": ">= 0.6" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", "dev": true, "dependencies": { "kleur": "^3.0.3", @@ -14590,23 +22456,74 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "dependencies": { - "forwarded": "0.2.0", + "forwarded": "~0.1.2", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" } }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -14616,27 +22533,37 @@ } }, "node_modules/pvtsutils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.2.2.tgz", - "integrity": "sha512-OALo5ZEdqiI127i64+CXwkCOyFHUA+tCQgaUO/MvRDFXWPr53f2sx28ECNztUEzuyu5xvuuD1EB/szg9mwJoGA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.1.6.tgz", + "integrity": "sha512-Tm/74+LIqWtItcZHBJztPEPqLzNKbtPAA3LoFt763PFCHxmCfrF4YXhdFEiPAxMTakR0shbVymKKyMxg1Zqt4A==", "dev": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.2.0" } }, "node_modules/pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==", "dev": true, "engines": { "node": ">=6.0.0" } }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, "node_modules/qr-code-styling": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.5.0.tgz", - "integrity": "sha512-7C+1cZGsZWH0BIRtv24faKZJwkxdYlynXktP9dDxKNSik2bqaUZck3B3MpQod/wqm9i3l4q7QsPGkRGKvcuqZw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.3.4.tgz", + "integrity": "sha512-ZYPlJMN2axrYLhMzWPjWN0/8gP6qg8uykC0sPIJVUG3coPxlImhdDUBp8UFagRRsTnJYmfy5BLD3RTjekVG7Rw==", "dev": true, "dependencies": { "qrcode-generator": "^1.4.3" @@ -14649,34 +22576,47 @@ "dev": true }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "engines": { "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "node_modules/randombytes": { "version": "2.1.0", @@ -14686,6 +22626,15 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -14695,12 +22644,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", + "bytes": "3.1.0", + "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -14709,9 +22658,9 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "engines": { "node": ">= 0.8" } @@ -14722,28 +22671,97 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "dependencies": { - "pify": "^2.3.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14755,50 +22773,40 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dependencies": { - "picomatch": "^2.2.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" + "node": ">=0.10" } }, "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "dependencies": { - "regenerate": "^1.4.2" + "regenerate": "^1.4.0" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "node_modules/regenerator-transform": { @@ -14810,10 +22818,22 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -14826,32 +22846,32 @@ } }, "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" }, "engines": { "node": ">=4" } }, "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -14878,35 +22898,173 @@ "node": ">= 0.10" } }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", "dev": true, "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "node_modules/requires-port": { "version": "1.0.0", @@ -14914,103 +23072,133 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dependencies": { - "resolve-from": "^5.0.0" + "resolve-from": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "engines": { - "node": ">=10" + "node": ">=0.12" } }, "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "engines": { "node": ">= 4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dependencies": { - "queue-microtask": "^1.2.2" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" } }, "node_modules/safe-buffer": { @@ -15018,39 +23206,72 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/sass": { - "version": "1.49.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", - "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sass": { + "version": "1.32.13", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.13.tgz", + "integrity": "sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=8.9.0" } }, "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "dev": true, "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", @@ -15058,10 +23279,9 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "node-sass": "^4.0.0", "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" + "webpack": "^4.36.0 || ^5.0.0" }, "peerDependenciesMeta": { "fibers": { @@ -15072,12 +23292,24 @@ }, "sass": { "optional": true - }, - "sass-embedded": { - "optional": true } } }, + "node_modules/sass-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -15091,14 +23323,13 @@ } }, "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" }, "engines": { "node": ">= 8.9.0" @@ -15108,35 +23339,49 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/schema-utils/node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "node_modules/selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "dependencies": { - "node-forge": "^1.2.0" - }, - "engines": { - "node": ">=10" + "node-forge": "^0.10.0" } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { - "semver": "bin/semver.js" + "semver": "bin/semver" } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", @@ -15145,9 +23390,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "~1.7.2", "mime": "1.6.0", - "ms": "2.1.3", + "ms": "2.1.1", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -15156,31 +23401,21 @@ "node": ">= 0.8.0" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dependencies": { - "randombytes": "^2.1.0" - } + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "node_modules/serve-index": { "version": "1.9.1", @@ -15199,14 +23434,6 @@ "node": ">= 0.8.0" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -15226,34 +23453,88 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.17.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serviceworker-webpack-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/serviceworker-webpack-plugin/-/serviceworker-webpack-plugin-1.0.1.tgz", + "integrity": "sha512-VgDEkZ3pA0HajsRaWtl5w6bLxAXx0Y+4dm7YeTcIxVmvC9YXvstex38HOBDuYETeDS5fUlBy/47gC0QYBrG0nw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "peerDependencies": { + "webpack": "^4" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -15268,28 +23549,50 @@ } }, "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dependencies": { - "shebang-regex": "^3.0.0" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true }, "node_modules/sirv": { "version": "1.0.19", @@ -15320,44 +23623,213 @@ "node": ">=6" } }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", + "uuid": "^3.4.0", "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dependencies": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15371,6 +23843,43 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -15399,6 +23908,27 @@ "wbuf": "^1.7.3" } }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/spdy-transport/node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -15412,12 +23942,77 @@ "node": ">= 6" } }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -15425,9 +24020,9 @@ "dev": true }, "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" @@ -15445,6 +24040,29 @@ "node": ">=8" } }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -15453,6 +24071,59 @@ "node": ">= 0.6" } }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15474,30 +24145,107 @@ "node": ">=10" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dependencies": { - "ansi-regex": "^5.0.1" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/strip-bom": { @@ -15509,68 +24257,194 @@ "node": ">=8" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, "engines": { - "node": ">= 12.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/style-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/style-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/style-loader/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/style-loader/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylehacks/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dependencies": { "has-flag": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/supports-hyperlinks": { @@ -15607,53 +24481,67 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dev": true, "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=10.13.0" + "node": ">=4.0.0" } }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true, "engines": { - "node": ">= 10" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/svgo/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } }, "node_modules/symbol-tree": { "version": "3.2.4", @@ -15662,9 +24550,9 @@ "dev": true }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "engines": { "node": ">=6" } @@ -15686,78 +24574,19 @@ } }, "node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dependencies": { - "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dependencies": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/terser/node_modules/commander": { @@ -15766,11 +24595,11 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/test-exclude": { @@ -15795,16 +24624,36 @@ "dev": true }, "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", @@ -15812,11 +24661,16 @@ "dev": true }, "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -15826,21 +24680,58 @@ "node": ">=4" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dependencies": { - "is-number": "^7.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">=8.0" + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "engines": { "node": ">=0.6" } @@ -15869,9 +24760,9 @@ } }, "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "dependencies": { "punycode": "^2.1.1" @@ -15890,17 +24781,19 @@ } }, "node_modules/ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", + "version": "26.5.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", + "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", "dev": true, "dependencies": { "bs-logger": "0.x", + "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", + "jest-util": "^26.1.0", "json5": "2.x", - "lodash.memoize": "4.x", + "lodash": "4.x", "make-error": "1.x", + "mkdirp": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, @@ -15908,28 +24801,38 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 10" }, "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@types/jest": "^27.0.0", - "babel-jest": ">=27.0.0 <28", - "jest": "^27.0.0", + "jest": ">=26 <27", "typescript": ">=3.8 <5.0" + } + }, + "node_modules/ts-jest/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-jest/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/ts-jest/node_modules/semver": { @@ -15947,23 +24850,33 @@ "node": ">=10" } }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ts-loader": { - "version": "9.2.8", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", - "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.2.0.tgz", + "integrity": "sha512-ebXBFrNyMSmbWgjnb3WBloUBK+VSx1xckaXsMXxlZRDqce/OPdYBVN5efB0W3V0defq0Gcy4YuzvPGqRgjj85A==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" }, "engines": { - "node": ">=12.0.0" + "node": ">=10.0.0" }, "peerDependencies": { "typescript": "*", - "webpack": "^5.0.0" + "webpack": "*" } }, "node_modules/ts-loader/node_modules/ansi-styles": { @@ -15981,10 +24894,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ts-loader/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -16015,6 +24940,27 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/ts-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ts-loader/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ts-loader/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -16024,6 +24970,69 @@ "node": ">=8" } }, + "node_modules/ts-loader/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/ts-loader/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/ts-loader/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ts-loader/node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/ts-loader/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -16051,10 +25060,45 @@ "node": ">=8" } }, + "node_modules/ts-loader/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "node_modules/type-check": { @@ -16079,15 +25123,12 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/type-is": { @@ -16102,6 +25143,11 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -16112,9 +25158,9 @@ } }, "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -16125,11 +25171,15 @@ } }, "node_modules/uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "optional": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -16137,46 +25187,105 @@ "node": ">=0.8.0" } }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "optional": true + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true, "engines": { "node": ">=4" } }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -16194,19 +25303,143 @@ "node": ">= 0.8" } }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -16222,17 +25455,24 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "bin/uuid" } }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -16240,7 +25480,7 @@ "source-map": "^0.7.3" }, "engines": { - "node": ">=10.12.0" + "node": ">=10.10.0" } }, "node_modules/v8-to-istanbul/node_modules/source-map": { @@ -16252,6 +25492,16 @@ "node": ">= 8" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -16260,6 +25510,35 @@ "node": ">= 0.8" } }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -16282,24 +25561,57 @@ } }, "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "dependencies": { - "makeerror": "1.0.12" + "makeerror": "1.0.x" } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" }, - "engines": { - "node": ">=10.13.0" + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" } }, "node_modules/wbuf": { @@ -16311,17 +25623,16 @@ } }, "node_modules/webcrypto-core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.1.tgz", - "integrity": "sha512-Gw2zLzYSJ7Imp5lLDu3CcWB5oTTACMDEE2PjoLfttGgIhd7BfackBdVgEzd9ZM/i65gpNq0+IelL0JZ48QwzNg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.2.0.tgz", + "integrity": "sha512-p76Z/YLuE4CHCRdc49FB/ETaM4bzM3roqWNJeGs+QNY1fOTzKTOVnhmudW1fuO+5EZg6/4LG9NJ6gaAyxTk9XQ==", "dev": true, "dependencies": { - "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.27", "@peculiar/json-schema": "^1.1.12", - "@types/web": "^0.0.55", - "asn1js": "^2.2.0", - "pvtsutils": "^1.2.2", - "tslib": "^2.3.1" + "asn1js": "^2.0.26", + "pvtsutils": "^1.1.2", + "tslib": "^2.1.0" } }, "node_modules/webidl-conversions": { @@ -16334,40 +25645,39 @@ } }, "node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=6.11.5" }, "funding": { "type": "opencollective", @@ -16376,6 +25686,9 @@ "peerDependenciesMeta": { "webpack-cli": { "optional": true + }, + "webpack-command": { + "optional": true } } }, @@ -16402,6 +25715,18 @@ "node": ">= 10.13.0" } }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -16490,268 +25815,13 @@ "node": ">=8" } }, - "node_modules/webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true, "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", - "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "engines": { - "node": ">=10.0.0" + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -16766,76 +25836,375 @@ } } }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "node_modules/webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "4.x.x" + } + }, + "node_modules/webpack-cli/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-cli/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" } }, "node_modules/webpack-retry-chunk-load-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-retry-chunk-load-plugin/-/webpack-retry-chunk-load-plugin-3.0.0.tgz", - "integrity": "sha512-MnnBu55A/kPXb+n8QG+7aN0wHOy7n1LOtRn6laynWFtci4X2FqAMzF4G5awKFwu5lOGXWq8ADLHSPA2z3pmUQg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/webpack-retry-chunk-load-plugin/-/webpack-retry-chunk-load-plugin-1.5.0.tgz", + "integrity": "sha512-mE3YBQX0Ho09uQpnrCVOuwtnMbu8Ydzx6rF0lETxQnZpAf9fz/KL1HxOFDsyhPG9dH0nmCsCEj0reWhY65NJUQ==", "dev": true, "dependencies": { - "prettier": "^2.2.1" + "prettier": "^1.19.1" }, "peerDependencies": { - "webpack": ">=5.0.0" + "webpack": ">=4.0.0" } }, "node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dev": true, + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, "node_modules/webpack-sources/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=6.9.0" } }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "node_modules/webpack/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, "engines": { - "node": ">=10.13.0" + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/webpack/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" } }, "node_modules/websocket-driver": { @@ -16875,13 +26244,13 @@ "dev": true }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", + "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", "dev": true, "dependencies": { "lodash": "^4.7.0", - "tr46": "^2.1.0", + "tr46": "^2.0.2", "webidl-conversions": "^6.1.0" }, "engines": { @@ -16889,24 +26258,20 @@ } }, "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "which": "bin/which" } }, - "node_modules/wildcard": { + "node_modules/which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "node_modules/word-wrap": { "version": "1.2.3", @@ -16923,6 +26288,14 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, "node_modules/worker-loader": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", @@ -16943,13 +26316,82 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/worker-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/worker-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/worker-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/worker-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/worker-loader/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/worker-loader/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/worker-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/worker-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -16962,55 +26404,18 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=6" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -17029,24 +26434,11 @@ } }, "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dependencies": { + "async-limiter": "~1.0.0" } }, "node_modules/xml-name-validator": { @@ -17061,76 +26453,60 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { - "node": ">=10" + "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } }, "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, "@babel/cli": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.17.6.tgz", - "integrity": "sha512-l4w608nsDNlxZhiJ5tE3DbNmr61fIKMZ6fTBo171VEFuFMIYuJ3mHRhTLEkKKyvx2Mizkkv/0a8OJOnZqkKYNA==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.16.tgz", + "integrity": "sha512-cL9tllhqvsQ6r1+d9Invf7nNXg/3BlfL1vvvL/AdH9fZ2l5j0CeBcoq6UjsqHpvyN1v5nXSZgqJZoGeK+ZOAbw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.4", - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", "chokidar": "^3.4.0", "commander": "^4.0.1", "convert-source-map": "^1.1.0", @@ -17142,71 +26518,242 @@ } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.12.13" } }, "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", "dev": true }, "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.2.tgz", + "integrity": "sha512-OgC1mON+l4U4B4wiohJlQNUU3H73mpTyYY3j/c8U9dr9UagGGSm+WFpzjy/YLdoyjiG++c1kIDgxCo/mLwQJeQ==", "dev": true, "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.2", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0" + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", "dev": true, "requires": { - "@babel/types": "^7.17.0", + "@babel/types": "^7.14.2", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-call-delegate": { @@ -17339,9 +26886,9 @@ } }, "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -17352,138 +26899,194 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" - } - }, - "@babel/helper-define-map": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.53.tgz", - "integrity": "sha1-SOniJlRTeHl1BD76qx7a0jnqlpU=", - "dev": true, - "requires": { - "@babel/helper-function-name": "7.0.0-beta.53", - "@babel/types": "7.0.0-beta.53", - "lodash": "^4.17.5" }, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.53.tgz", - "integrity": "sha1-mA0VYLhjV1v1o3eSUDfgEy71kh4=", + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.53" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" } }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.53.tgz", - "integrity": "sha1-USgEro6cvOVDHr6hnkdijC7WU/I=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.53", - "@babel/template": "7.0.0-beta.53", - "@babel/types": "7.0.0-beta.53" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.53.tgz", - "integrity": "sha1-3tiKsp+bHbYch9G7jTijXdp3neY=", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.53" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.53.tgz", - "integrity": "sha1-9OlS2tF4fSBeGI0+OEzc5JyjaPs=", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - } - }, - "@babel/parser": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.53.tgz", - "integrity": "sha1-H0XrYXv5Rj1IKywE00nZ5O2/SJI=", + "caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", "dev": true }, - "@babel/template": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.53.tgz", - "integrity": "sha1-MyIpCQDQsYewpxdDgeHzu3EFDS4=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.53", - "@babel/parser": "7.0.0-beta.53", - "@babel/types": "7.0.0-beta.53", - "lodash": "^4.17.5" - } + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true }, - "@babel/types": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.53.tgz", - "integrity": "sha1-GaRhwNpRVZXftnQLS0Xce7Dms3U=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.5", - "to-fast-properties": "^2.0.0" - } + "electron-to-chromium": { + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", + "dev": true }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.2.tgz", + "integrity": "sha512-6YctwVsmlkchxfGUogvVrrhzyD3grFJyluj5JgDlQrwfMLJSt5tdAzFZfPf4H2Xoi5YLcQ6BxfJlaOBHuctyIw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + }, + "dependencies": { + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + } + } + }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -17494,392 +27097,1354 @@ "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", + "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.16" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "dev": true, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, - "@babel/helper-regex": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.53.tgz", - "integrity": "sha1-bp0hl7Vid54iVWWUaumoXCFbIl4=", - "dev": true, - "requires": { - "lodash": "^4.17.5" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "dev": true, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", + "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.14.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", "dev": true }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", + "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz", + "integrity": "sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-class-static-block": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", + "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", + "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", + "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", + "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", + "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", + "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz", + "integrity": "sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.14.2" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", + "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", + "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-create-class-features-plugin": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-async-generators": { @@ -17907,15 +28472,31 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", + "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-dynamic-import": { @@ -17943,6 +28524,14 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-json-strings": { @@ -17961,6 +28550,14 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -17979,6 +28576,14 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-object-rest-spread": { @@ -18009,355 +28614,785 @@ } }, "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz", + "integrity": "sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz", + "integrity": "sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", + "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-instanceof": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0-beta.53.tgz", + "integrity": "sha1-WC2CtyUYggGtDiIx8fzpTHRaLAY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.53" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.53.tgz", + "integrity": "sha1-1kRYY2/8JYtCcUqd2Trrb4uM8+0=", + "dev": true + } } }, "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", + "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", - "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", + "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", + "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", + "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-typescript": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/polyfill": { @@ -18368,38 +29403,45 @@ "requires": { "core-js": "^2.6.5", "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + } } }, "@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", + "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.14.2", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-class-static-block": "^7.13.11", + "@babel/plugin-proposal-dynamic-import": "^7.14.2", + "@babel/plugin-proposal-export-namespace-from": "^7.14.2", + "@babel/plugin-proposal-json-strings": "^7.14.2", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", + "@babel/plugin-proposal-numeric-separator": "^7.14.2", + "@babel/plugin-proposal-object-rest-spread": "^7.14.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", + "@babel/plugin-proposal-optional-chaining": "^7.14.2", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-private-property-in-object": "^7.14.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.12.13", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -18409,47 +29451,71 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.14.2", + "@babel/plugin-transform-classes": "^7.14.2", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.17", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.14.2", + "@babel/plugin-transform-modules-commonjs": "^7.14.0", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.14.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.14.2", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.2", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", "semver": "^6.3.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/preset-es2015": { @@ -18516,6 +29582,17 @@ "@babel/types": "7.0.0-beta.53" } }, + "@babel/helper-define-map": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.53.tgz", + "integrity": "sha1-SOniJlRTeHl1BD76qx7a0jnqlpU=", + "dev": true, + "requires": { + "@babel/helper-function-name": "7.0.0-beta.53", + "@babel/types": "7.0.0-beta.53", + "lodash": "^4.17.5" + } + }, "@babel/helper-function-name": { "version": "7.0.0-beta.53", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.53.tgz", @@ -18593,6 +29670,15 @@ "integrity": "sha1-1kRYY2/8JYtCcUqd2Trrb4uM8+0=", "dev": true }, + "@babel/helper-regex": { + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.53.tgz", + "integrity": "sha1-bp0hl7Vid54iVWWUaumoXCFbIl4=", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, "@babel/helper-replace-supers": { "version": "7.0.0-beta.53", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.53.tgz", @@ -18732,15 +29818,6 @@ "@babel/helper-plugin-utils": "7.0.0-beta.53" } }, - "@babel/plugin-transform-instanceof": { - "version": "7.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0-beta.53.tgz", - "integrity": "sha1-WC2CtyUYggGtDiIx8fzpTHRaLAY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0-beta.53" - } - }, "@babel/plugin-transform-literals": { "version": "7.0.0-beta.53", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.53.tgz", @@ -18921,9 +29998,9 @@ } }, "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -18935,14 +30012,11 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "regenerator-transform": { "version": "0.13.4", @@ -18952,50 +30026,13 @@ "requires": { "private": "^0.1.6" } - }, - "regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } } } }, "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -19006,61 +30043,107 @@ } }, "@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz", + "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-typescript": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + } } }, "@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "esutils": "^2.0.2", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -19070,6 +30153,16 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, "@cryptography/aes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@cryptography/aes/-/aes-0.1.1.tgz", @@ -19088,85 +30181,10 @@ "integrity": "sha512-BptcDkQWplfUjMJAxewmMN/O8JD19cwJM6XUFQrqaCDMYt5e40Czm4S7BEFc+PN7dElNH79ik687/5aMk4uDSQ==", "dev": true }, - "@csstools/postcss-color-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz", - "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", - "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", - "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz", - "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", - "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz", - "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -19180,6 +30198,48 @@ "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@istanbuljs/schema": { @@ -19189,16 +30249,16 @@ "dev": true }, "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" }, "dependencies": { @@ -19212,9 +30272,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -19260,41 +30320,47 @@ } }, "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.8.1", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -19304,10 +30370,19 @@ "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -19329,18 +30404,73 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19349,77 +30479,86 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^27.5.1" + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" } }, "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^4.0.3", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "v8-to-istanbul": "^7.0.0" }, "dependencies": { "ansi-styles": { @@ -19432,9 +30571,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -19456,6 +30595,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -19486,16 +30631,22 @@ } }, "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -19505,47 +30656,56 @@ } }, "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + } } }, "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" @@ -19560,10 +30720,19 @@ "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -19585,12 +30754,49 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -19611,19 +30817,28 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^16.0.0", + "@types/yargs": "^15.0.0", "chalk": "^4.0.0" }, "dependencies": { @@ -19637,9 +30852,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -19678,68 +30893,36 @@ } } }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "version": "2.1.8-no-fsevents", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", + "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", "dev": true, - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "optional": true, "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "@peculiar/asn1-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.1.0.tgz", - "integrity": "sha512-D6g4C5YRKC/iPujMAOXuZ7YGdaoMx8GsvWzfVSyx2LYeL38ECOKNywlYAuwbqQvON64lgsYdAujWQPX8hhoBLw==", + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.32.tgz", + "integrity": "sha512-JzGUVxOFN+RKslJrGAxcq4l6tEmmLY1XuALHINVxc8BJsB4bXOdZzTvxbN9dCPk65Vbulno0B6DmImZ7I6SO8w==", "dev": true, "requires": { - "@types/asn1js": "^2.0.2", - "asn1js": "^2.3.1", - "pvtsutils": "^1.2.1", - "tslib": "^2.3.1" + "@types/asn1js": "^2.0.0", + "asn1js": "^2.1.1", + "pvtsutils": "^1.1.2", + "tslib": "^2.2.0" } }, "@peculiar/json-schema": { @@ -19752,16 +30935,16 @@ } }, "@peculiar/webcrypto": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.3.2.tgz", - "integrity": "sha512-oUgNj+8oT7uROEMEpZZ3U+kZjyxj1KXuvA8P5kiMUveTya9eyS8KTqu/dzdEtYC3u7dvjknVz+0sUfkWOBHfQg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.1.7.tgz", + "integrity": "sha512-aCNLYdHZkvGH+T8/YBOY33jrVGVuLIa3bpizeHXqwN+P4ZtixhA+kxEEWM1amZwUY2nY/iuj+5jdZn/zB7EPPQ==", "dev": true, "requires": { - "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.32", "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.2.2", - "tslib": "^2.3.1", - "webcrypto-core": "^1.7.1" + "pvtsutils": "^1.1.6", + "tslib": "^2.2.0", + "webcrypto-core": "^1.2.0" } }, "@polka/url": { @@ -19780,36 +30963,30 @@ } }, "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, "@types/asn1js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.2.tgz", - "integrity": "sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.0.tgz", + "integrity": "sha512-Jjzp5EqU0hNpADctc/UqhiFbY1y2MqIxBVa2S4dBlbnZHTLPMuggoL5q43X63LpsOIINRDirBjP56DUUKIUWIA==", "dev": true }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -19820,18 +30997,18 @@ } }, "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -19839,9 +31016,9 @@ } }, "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -19856,98 +31033,20 @@ "big-integer": "*" } }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "requires": { - "@types/node": "*" - } - }, "@types/chrome": { - "version": "0.0.180", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.180.tgz", - "integrity": "sha512-A/CuuKAaHq2CHEpYBAtl0lp2ib7TTXK7VjJI4q+c+1U/HDvZLJ8IlsdEDzzHdvkNdh36bGONxrMnO9YZrKqbAw==", + "version": "0.0.139", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.139.tgz", + "integrity": "sha512-YZDKFlSVGFp4zldJlO+PUpxMH8N9vLke0fD6K9PA+TzXxPXu8LBLo5X2dzlOs2N/n+uMdI1lw7OPT1Emop10lQ==", "dev": true, "requires": { "@types/filesystem": "*", "@types/har-format": "*" } }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, "@types/filesystem": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", - "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.30.tgz", + "integrity": "sha512-NCoRgmGmLpTT9VFL6Bb6z0jQuqI3d0E5FGl7M0JOv/J5RQYo9s5aOItPYnpckx9MbYQk1APLXcF8f20Vqnf2yA==", "dev": true, "requires": { "@types/filewriter": "*" @@ -19959,6 +31058,15 @@ "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", "dev": true }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -19969,29 +31077,21 @@ } }, "@types/har-format": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.8.tgz", - "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.5.tgz", + "integrity": "sha512-IG8AE1m2pWtPqQ7wXhFhy6Q59bwwnLwO36v5Rit2FrbXCIp8Sk8E2PfUCreyrdo17STwFSKDAkitVuVYbpEHvQ==", "dev": true }, "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", "dev": true }, - "@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "requires": { - "@types/node": "*" - } - }, "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, "@types/istanbul-lib-report": { @@ -20004,106 +31104,73 @@ } }, "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", "dev": true, "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" } }, "@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" - }, - "@types/pako": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.3.tgz", - "integrity": "sha512-EDxOsHAD5dqjbjEUM1xwa7rpKPFb8ECBE5irONTQU7/OsO3thI5YrNEWSPNMvYmvFM0l/OLQJ6Mgw7PEdXSjhg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.4.tgz", + "integrity": "sha512-k3NqigXWRzQZVBDS5D1U70A5E8Qk4Kh+Ha/x4M8Bt9pF0X05eggfnC9+63Usc9Q928hRUIpIhTQaXsZwZBl4Ew==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/pako": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.1.tgz", + "integrity": "sha512-GdZbRSJ3Cv5fiwT6I0SQ3ckeN2PWNqxd26W9Z2fCK1tGrrasGy4puvNFtnddqH9UJFMQYXxEuuB7B8UK+LLwSg==", "dev": true }, "@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", "dev": true }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true }, "@types/serviceworker-webpack-plugin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/serviceworker-webpack-plugin/-/serviceworker-webpack-plugin-1.0.3.tgz", - "integrity": "sha512-pTmJp4jcwKhMcouxIn5BMww259kO3wfaW1kfg0PzgMFC9R3//TNYK4zlSkyyrkryWXlMvTKl4crj8oBeHhM7nw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/serviceworker-webpack-plugin/-/serviceworker-webpack-plugin-1.0.2.tgz", + "integrity": "sha512-dTKr3HkGWkpFflnaq8dLvQ3F6C/g8ub1H7RFXk4Cfylln8YxuKYMbeGlCmnhrWhOP9WFA0wsu6ez2cE5i9pFmA==", "dev": true, "requires": { "@types/webpack": "^4" } }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "requires": { - "@types/node": "*" - } - }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -20111,21 +31178,21 @@ "dev": true }, "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, "@types/tapable": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", - "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==", "dev": true }, "@types/uglify-js": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", - "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -20139,23 +31206,17 @@ } } }, - "@types/web": { - "version": "0.0.55", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.55.tgz", - "integrity": "sha512-YMH9aZrSJIMRMioCUwrgauI3iS/w2wRFN45Xxm0FE9Tt3hqaqkvOzjDFGsNjyKZzz7GJC0ilb+0tv59ytSUbrQ==", - "dev": true - }, "@types/webpack": { - "version": "4.41.32", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", - "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "version": "4.41.28", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.28.tgz", + "integrity": "sha512-Nn84RAiJjKRfPFFCVR8LC4ueTtTdfWAMZ03THIzZWRJB+rX24BD3LqPSFnbMscWauEsT4segAsylPDIaZyZyLQ==", "dev": true, "requires": { + "@types/anymatch": "*", "@types/node": "*", "@types/tapable": "^1", "@types/uglify-js": "*", "@types/webpack-sources": "*", - "anymatch": "^3.0.0", "source-map": "^0.6.0" }, "dependencies": { @@ -20168,9 +31229,9 @@ } }, "@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", "dev": true, "requires": { "@types/node": "*", @@ -20186,183 +31247,178 @@ } } }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "requires": { - "@types/node": "*" - } - }, "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, - "@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", - "dev": true, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "requires": { - "envinfo": "^7.7.3" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, - "requires": {} - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -20380,18 +31436,18 @@ "dev": true }, "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "acorn-globals": { "version": "6.0.0", @@ -20411,79 +31467,46 @@ } } }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} - }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} }, "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "requires": {} }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -20491,37 +31514,58 @@ "dev": true, "requires": { "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } } }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -20531,58 +31575,155 @@ "sprintf-js": "~1.0.2" } }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } }, "asn1js": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.3.2.tgz", - "integrity": "sha512-IYzujqcOk7fHaePpTyvD3KPAA0AjT3qZlaQAw76zmPPAV/XTjhO+tbHjbFbIQZIhw+fk9wCSfb0Z6K+JHe8Q2g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.1.1.tgz", + "integrity": "sha512-t9u0dU0rJN4ML+uxgN6VM2Z4H5jWIYm0w8LsZLzMJaQsgL3IJNbxHgmbWDvJAwspyHpDFuzUaUFh4c05UB4+6g==", "dev": true, "requires": { "pvutils": "latest" } }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", - "dev": true, - "requires": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - } - } + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true }, "babel-code-frame": { "version": "6.26.0", @@ -20736,18 +31877,18 @@ } }, "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "dependencies": { @@ -20761,9 +31902,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -20785,6 +31926,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -20809,17 +31956,34 @@ } }, "babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", + "loader-utils": "^1.4.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -20828,6 +31992,12 @@ "requires": { "semver": "^6.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -20859,22 +32029,22 @@ } }, "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", + "istanbul-lib-instrument": "^4.0.0", "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -20884,33 +32054,41 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/helper-define-polyfill-provider": "^0.2.0", "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.2.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -21266,12 +32444,12 @@ } }, "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^27.5.1", + "babel-plugin-jest-hoist": "^26.6.2", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -21285,6 +32463,12 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -21323,26 +32507,11 @@ "lodash": "^4.17.4" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -21373,15 +32542,79 @@ "dev": true }, "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -21391,48 +32624,53 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.1.2", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.8.1", + "http-errors": "1.7.2", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" } } }, @@ -21447,13 +32685,6 @@ "dns-txt": "^2.0.2", "multicast-dns": "^6.0.1", "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - } } }, "boolbase": { @@ -21472,38 +32703,146 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "fill-range": "^7.0.1" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } } }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + }, + "dependencies": { + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + } + } + }, + "browserslist": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, "bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", @@ -21522,21 +32861,94 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -21546,6 +32958,32 @@ "get-intrinsic": "^1.0.2" } }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -21565,8 +33003,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-api": { "version": "3.0.0", @@ -21581,9 +33018,25 @@ } }, "caniuse-lite": { - "version": "1.0.30001320", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz", - "integrity": "sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA==" + "version": "1.0.30001040", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001040.tgz", + "integrity": "sha512-Ep0tEPeI5wCvmJNrXjE3etgfI+lkl1fTDU6Y3ZH1mhrjkPlVI9W4pcKbMo+BQLpEWKVYYp2EmYaRsqpPC3k7lQ==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { "version": "2.4.2", @@ -21594,6 +33047,17 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "char-regex": { @@ -21603,41 +33067,171 @@ "dev": true }, "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "devOptional": true, "requires": { - "anymatch": "~3.1.2", + "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "~3.5.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "devOptional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "devOptional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "devOptional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -21651,20 +33245,14 @@ } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "clone-deep": { @@ -21684,17 +33272,46 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -21702,19 +33319,23 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", - "dev": true + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true }, "combined-stream": { "version": "1.0.8", @@ -21734,8 +33355,12 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "compressible": { "version": "2.0.18", @@ -21743,6 +33368,13 @@ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + } } }, "compression": { @@ -21757,21 +33389,6 @@ "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "concat-map": { @@ -21779,24 +33396,38 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } + "safe-buffer": "5.1.2" } }, "content-type": { @@ -21805,40 +33436,89 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.12.1.tgz", + "integrity": "sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ==", "dev": true, "requires": { - "browserslist": "^4.19.1", + "browserslist": "^4.16.6", "semver": "7.0.0" }, "dependencies": { + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", + "dev": true + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -21848,114 +33528,349 @@ } }, "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", - "dev": true, - "requires": { - "timsort": "^0.3.0" - } - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } } } }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "dev": true, - "requires": {} + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { - "mdn-data": "2.0.14", + "mdn-data": "2.0.4", "source-map": "^0.6.1" }, "dependencies": { @@ -21968,15 +33883,15 @@ } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, "cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", "dev": true }, "cssesc": { @@ -21986,59 +33901,138 @@ "dev": true }, "cssnano": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", - "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.5", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "cssnano-preset-default": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", - "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "requires": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.3", - "postcss-merge-rules": "^5.1.1", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, - "requires": {} + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true }, "csso": { "version": "4.2.0", @@ -22047,6 +34041,30 @@ "dev": true, "requires": { "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "cssom": { @@ -22072,6 +34090,20 @@ } } }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -22084,24 +34116,28 @@ } }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "2.1.2" + "ms": "2.0.0" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "deep-equal": { "version": "1.1.1", @@ -22117,9 +34153,9 @@ } }, "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "deepmerge": { @@ -22129,18 +34165,14 @@ "dev": true }, "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "requires": { - "execa": "^5.0.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" } }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -22149,25 +34181,61 @@ "object-keys": "^1.0.12" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" } } }, @@ -22182,11 +34250,26 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -22194,22 +34277,31 @@ "dev": true }, "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "path-type": "^4.0.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } } }, "dns-equal": { @@ -22218,9 +34310,9 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -22244,20 +34336,32 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } } }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domexception": { @@ -22278,23 +34382,22 @@ } }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "1" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-case": { @@ -22307,6 +34410,15 @@ "tslib": "^2.0.3" } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, "dotenv": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", @@ -22323,9 +34435,9 @@ } }, "dotenv-webpack": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.1.0.tgz", - "integrity": "sha512-+aUOe+nqgLerA/n611oyC15fY79BIkGm2fOxJAcHDonMZ7AtDpnzv/Oe591eHAenIE0t6w03UyxDnLs/YUxx5Q==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.0.3.tgz", + "integrity": "sha512-O0O9pOEwrk+n1zzR3T2uuXRlw64QxHSPeNN1GaiNBloQFNaCUL9V8jxSVz4jlXXFP/CIqK8YecWf8BAvsSgMjw==", "dev": true, "requires": { "dotenv-defaults": "^2.0.2" @@ -22337,59 +34449,112 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.4.92", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.92.tgz", - "integrity": "sha512-YAVbvQIcDE/IJ/vzDMjD484/hsRbFPW2qXJPaYTfOhtligmfYEYOep+5QojpaEU9kq6bMvNeC2aG7arYvTHYsA==" + "version": "1.3.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.401.tgz", + "integrity": "sha512-9tvSOS1++0EQP0tkgyD8KJergVZsld1/UqOusZVTbx9MWZHw5NCezkOjIQ5YWeB45jKdQerDfRrt28HwidI9Ow==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } }, "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } }, "error-ex": { "version": "1.3.2", @@ -22400,15 +34565,52 @@ "is-arrayish": "^0.2.1" } }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "es-abstract": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.2.tgz", + "integrity": "sha512-YoKuru3Lyoy7yVTBSH2j7UxTqe/je3dWAruC0sHvZX1GNd5zX8SSLvQqEgO9b3Ex8IW+goFI9arEEsFIbulhOw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true }, "escape-html": { "version": "1.0.3", @@ -22434,6 +34636,12 @@ "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -22444,19 +34652,12 @@ } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { - "esrecurse": "^4.3.0", + "esrecurse": "^4.1.0", "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } } }, "esprima": { @@ -22471,12 +34672,19 @@ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", @@ -22495,24 +34703,45 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true }, "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit": { @@ -22521,29 +34750,98 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } } }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.8", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -22557,60 +34855,125 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" } } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -22619,40 +34982,34 @@ "dev": true }, "fast-png": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.1.0.tgz", - "integrity": "sha512-v8e/40RKZbE1mALigoqBOkYnemCVSMmVlGSz8fawZAZg5UQ9OZeR00L++CPvrhIGm2F6TxV5u9lbWD0oOJHcCw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-5.0.4.tgz", + "integrity": "sha512-vTNj6yixRnclW6sTlCeH6sNRLBOhM5ITmlo1LSU5ojKEc2e9kZkqXPo2xzBxKb61MBCXRXBcr8qJztOHr2O6WQ==", "dev": true, "requires": { - "@types/pako": "^1.0.2", - "iobuffer": "^5.0.4", - "pako": "^2.0.4" + "@types/pako": "^1.0.1", + "iobuffer": "^5.0.2", + "pako": "^2.0.2" + }, + "dependencies": { + "pako": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==", + "dev": true + } } }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "requires": { "websocket-driver": ">=0.5.1" } @@ -22666,12 +35023,36 @@ "bser": "2.1.1" } }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "to-regex-range": "^5.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "finalhandler": { @@ -22686,27 +35067,12 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -22714,6 +35080,25 @@ "pkg-dir": "^4.1.0" }, "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -22722,55 +35107,127 @@ "requires": { "semver": "^6.0.0" } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } }, "fs-readdir-recursive": { "version": "1.1.0", @@ -22778,16 +35235,439 @@ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "sax": { + "version": "1.2.4", + "bundled": true + }, + "semver": { + "version": "5.7.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true + } + } }, "function-bind": { "version": "1.1.1", @@ -22803,8 +35683,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.1", @@ -22823,14 +35702,31 @@ "dev": true }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -22841,17 +35737,58 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "is-glob": "^4.0.1" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } } }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } }, "globals": { "version": "11.12.0", @@ -22860,29 +35797,35 @@ "dev": true }, "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true }, "gzip-size": { "version": "6.0.0", @@ -22931,18 +35874,18 @@ "object-assign": "^4.1.0" }, "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -22962,6 +35905,42 @@ } } }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -22990,20 +35969,76 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, - "has-tostringtag": { + "has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "has-symbols": "^1.0.2" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "he": { @@ -23012,6 +36047,37 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -23023,6 +36089,24 @@ "wbuf": "^1.1.0" } }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -23033,9 +36117,9 @@ } }, "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" }, "html-escaper": { "version": "2.0.2", @@ -23044,51 +36128,80 @@ "dev": true }, "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "dev": true, "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", "he": "^1.2.0", - "param-case": "^3.0.4", + "param-case": "^3.0.3", "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - } + "terser": "^4.6.3" } }, "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", "dev": true, "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } } }, "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "http-deceiver": { @@ -23097,21 +36210,28 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" }, "http-proxy": { "version": "1.18.1", @@ -23123,43 +36243,38 @@ "requires-port": "^1.0.0" } }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, "http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "agent-base": "6", - "debug": "4" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -23170,92 +36285,104 @@ } }, "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ifdef-loader": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/ifdef-loader/-/ifdef-loader-2.3.2.tgz", - "integrity": "sha512-kH9bHPrfIFxLpq3XEruJqSlHXch2nOljKIDRS/6MU5LDZTyHeaSWVf04wNYX+8RT+NDmeS8Vm5HwZ7akkXo8ig==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, "requires": { - "loader-utils": "^1.1.0" + "postcss": "^7.0.14" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "minimist": "^1.2.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - }, - "immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ifdef-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ifdef-loader/-/ifdef-loader-2.3.0.tgz", + "integrity": "sha512-JY3rPC1QNMzQ/h8pJlxyP6DsujlGnCYDmEYROQpMe90m1aRFVLtpTuqmN15aaq2/9vOmzByWMxWdvR1O+xNHGw==", "dev": true, "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "loader-utils": "^1.1.0" + } + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", @@ -23271,10 +36398,25 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "invariant": { @@ -23287,9 +36429,9 @@ } }, "iobuffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.1.0.tgz", - "integrity": "sha512-2BYQoYadP3FkVPfqGxs4WO6z3HWGZokJfIkgOARn4P4ipVQCHJnPyva7rJLVmnRA7XTk8ZoLwutuutGeMpu3PA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.0.3.tgz", + "integrity": "sha512-0SNk4hbHVXx9oE27vTJY+oiI0txkhBdQV12RvILd/7XuIhBZ0TkImq5EnhFYCcRcDff8jpFhZ9C2Sg+NIo3ZMQ==", "dev": true }, "ip": { @@ -23297,18 +36439,46 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" } }, "is-arrayish": { @@ -23318,34 +36488,113 @@ "dev": true }, "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "binary-extensions": "^2.0.0" + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "dev": true, "requires": { "has": "^1.0.3" } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "has-tostringtag": "^1.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "optional": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", @@ -23353,10 +36602,9 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-generator-fn": { "version": "2.1.0", @@ -23365,38 +36613,74 @@ "dev": true }, "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + } + }, "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } }, "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -23408,18 +36692,42 @@ "dev": true }, "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "requires": { "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "has-symbols": "^1.0.1" } }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } }, "is-typedarray": { "version": "1.0.0", @@ -23427,13 +36735,15 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", @@ -23448,26 +36758,38 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", + "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-report": { @@ -23496,6 +36818,12 @@ "semver": "^6.0.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23508,9 +36836,9 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -23518,6 +36846,21 @@ "source-map": "^0.6.1" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -23527,9 +36870,9 @@ } }, "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -23537,54 +36880,22 @@ } }, "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "requires": { - "@jest/core": "^27.5.1", + "@jest/core": "^26.6.3", "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - } - }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "jest-cli": "^26.6.3" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -23595,15 +36906,26 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -23619,18 +36941,139 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "slash": { + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23639,110 +37082,168 @@ "requires": { "has-flag": "^4.0.0" } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { - "color-name": "~1.1.4" + "pump": "^3.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" } } } }, "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", "chalk": "^4.0.0", - "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { @@ -23754,10 +37255,19 @@ "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -23779,16 +37289,47 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true }, "supports-color": { @@ -23799,19 +37340,28 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { @@ -23824,9 +37374,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -23866,25 +37416,25 @@ } }, "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { @@ -23897,9 +37447,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -23939,84 +37489,162 @@ } }, "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" } }, "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", "walker": "^1.0.7" + }, + "dependencies": { + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "dependencies": { + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.5.1", + "expect": "^26.6.2", "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" }, "dependencies": { "ansi-styles": { @@ -24029,9 +37657,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24071,25 +37699,25 @@ } }, "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { @@ -24102,9 +37730,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24144,20 +37772,20 @@ } }, "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.2" }, "dependencies": { "ansi-styles": { @@ -24169,10 +37797,19 @@ "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24194,12 +37831,49 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -24214,16 +37888,25 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/node": "*" } }, @@ -24235,26 +37918,24 @@ "requires": {} }, "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", + "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", "slash": "^3.0.0" }, "dependencies": { @@ -24268,9 +37949,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24292,6 +37973,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -24316,43 +38003,42 @@ } }, "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" } }, "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", - "throat": "^6.0.1" + "throat": "^5.0.0" }, "dependencies": { "ansi-styles": { @@ -24365,9 +38051,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24389,6 +38075,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -24407,35 +38099,46 @@ } }, "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", + "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", + "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -24446,15 +38149,26 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -24470,18 +38184,90 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -24490,46 +38276,88 @@ "requires": { "has-flag": "^4.0.0" } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", - "graceful-fs": "^4.2.9" + "graceful-fs": "^4.2.4" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + } } }, "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", + "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", + "pretty-format": "^26.6.2", "semver": "^7.3.2" }, "dependencies": { @@ -24543,9 +38371,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24567,6 +38395,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -24594,17 +38428,17 @@ } }, "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" }, "dependencies": { "ansi-styles": { @@ -24616,10 +38450,19 @@ "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24641,12 +38484,49 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -24655,21 +38535,30 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", + "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { @@ -24682,15 +38571,15 @@ } }, "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24730,17 +38619,17 @@ } }, "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.5.1", + "jest-util": "^26.6.2", "string-length": "^4.0.1" }, "dependencies": { @@ -24754,9 +38643,9 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24796,24 +38685,27 @@ } }, "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^7.0.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -24827,23 +38719,37 @@ "dev": true }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", + "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", "dev": true, "requires": { "abab": "^2.0.5", - "acorn": "^8.2.4", + "acorn": "^8.1.0", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", @@ -24851,13 +38757,12 @@ "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", - "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", + "is-potential-custom-element-name": "^1.0.0", "nwsapi": "^2.2.0", "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", @@ -24867,8 +38772,23 @@ "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", - "ws": "^7.4.6", + "ws": "^7.4.4", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz", + "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==", + "dev": true + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true, + "requires": {} + } } }, "jsesc": { @@ -24888,22 +38808,57 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "kleur": { "version": "3.0.3", @@ -24911,12 +38866,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, "last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -24925,24 +38874,6 @@ "requires": { "lodash": "^4.17.5", "webpack-sources": "^1.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } } }, "leven": { @@ -24961,47 +38892,46 @@ "type-check": "~0.3.2" } }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true - }, "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "requires": { "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "emojis-list": "^2.0.0", + "json5": "^1.0.1" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true }, "lodash.debounce": { "version": "4.0.8", @@ -25015,12 +38945,36 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -25052,18 +39006,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "make-error": { @@ -25073,40 +39018,90 @@ "dev": true }, "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "tmpl": "1.0.5" + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, "media-query-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/media-query-plugin/-/media-query-plugin-1.5.0.tgz", - "integrity": "sha512-uGA5WgjUeXmBsF6YqTkBXa6TMtMWoqn1bB/tWlowglSajUjxcY8VnhDPPu7HDcTZvq9XSMC/IfCrzwayXkkM/w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/media-query-plugin/-/media-query-plugin-1.4.0.tgz", + "integrity": "sha512-Cht8LWE9C7UJ8tGw9c14vkaS2S8mKsHMdkJhAIZuC4x/3Dcyu35ZGQoOkwUwrPb/Uw2kcy4cL0OLa/m5wll43A==", "dev": true, "requires": { "loader-utils": "^2.0.0", "postcss": "^7.0.32", - "webpack": "^5.21.2", - "webpack-sources": "^2.2.0" + "webpack": "^4.44.1", + "webpack-sources": "^1.4.3" }, "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -25122,12 +39117,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, "requires": { - "fs-monkey": "1.0.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "merge-descriptors": { @@ -25138,12 +39135,8 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "methods": { "version": "1.1.2", @@ -25151,83 +39144,86 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } } }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "requires": { - "mime-db": "1.52.0" + "mime-db": "1.40.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true }, "mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "dev": true, "requires": { - "schema-utils": "^4.0.0" + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } @@ -25237,25 +39233,79 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } }, "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "^1.2.6" + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "mrmime": { @@ -25265,9 +39315,9 @@ "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -25283,12 +39333,36 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", "dev": true }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -25296,14 +39370,19 @@ "dev": true }, "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { "version": "3.0.4", @@ -25316,9 +39395,9 @@ } }, "node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-int64": { "version": "0.4.0", @@ -25326,10 +39405,120 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, "normalize-path": { "version": "3.0.0", @@ -25343,158 +39532,140 @@ "dev": true }, "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.5.5.tgz", - "integrity": "sha512-a1vl26nokCNlD+my/iNYmOUPx/hpYR4ZyZk8gb7/A2XXtrPZf2gTSJOnVjS77jQS+BSfIVQpipZwXWCL0+5wzg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.0.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.0.1", - "@npmcli/map-workspaces": "^2.0.2", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^3.0.1", + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-7.12.1.tgz", + "integrity": "sha512-vjIniB3kqujcDTgH+k90J2i5PPqYZyf1gi5Ni5fARK4WQr5FuVnTQlTXloyk15+qWUxwWHcy6U8YCWwh/TLzmA==", + "dev": true, + "requires": { + "@npmcli/arborist": "^2.4.4", + "@npmcli/ci-detect": "^1.2.0", + "@npmcli/config": "^2.2.0", + "@npmcli/run-script": "^1.8.5", "abbrev": "~1.1.1", "ansicolors": "~0.3.2", "ansistyles": "~0.1.3", "archy": "~1.0.0", - "cacache": "^16.0.2", - "chalk": "^4.1.2", + "byte-size": "^7.0.1", + "cacache": "^15.0.6", + "chalk": "^4.1.0", "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.1", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "glob": "^7.2.0", - "graceful-fs": "^4.2.9", - "hosted-git-info": "^5.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.6.0", + "columnify": "~1.5.4", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "hosted-git-info": "^4.0.2", "ini": "^2.0.0", - "init-package-json": "^3.0.1", + "init-package-json": "^2.0.3", "is-cidr": "^4.0.2", "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.2", - "libnpmdiff": "^4.0.2", - "libnpmexec": "^4.0.2", - "libnpmfund": "^3.0.1", - "libnpmhook": "^8.0.2", - "libnpmorg": "^4.0.2", - "libnpmpack": "^4.0.2", - "libnpmpublish": "^6.0.2", - "libnpmsearch": "^5.0.2", - "libnpmteam": "^4.0.2", - "libnpmversion": "^3.0.1", - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", + "leven": "^3.1.0", + "libnpmaccess": "^4.0.2", + "libnpmdiff": "^2.0.4", + "libnpmexec": "^1.1.1", + "libnpmfund": "^1.0.2", + "libnpmhook": "^6.0.2", + "libnpmorg": "^2.0.2", + "libnpmpack": "^2.0.1", + "libnpmpublish": "^4.0.1", + "libnpmsearch": "^3.1.1", + "libnpmteam": "^2.0.3", + "libnpmversion": "^1.2.0", + "make-fetch-happen": "^8.0.14", + "minipass": "^3.1.3", "minipass-pipeline": "^1.2.4", "mkdirp": "^1.0.4", "mkdirp-infer-owner": "^2.0.0", "ms": "^2.1.2", - "node-gyp": "^9.0.0", + "node-gyp": "^7.1.2", "nopt": "^5.0.0", - "npm-audit-report": "^2.1.5", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-pick-manifest": "^7.0.0", - "npm-profile": "^6.0.2", - "npm-registry-fetch": "^13.0.1", + "npm-audit-report": "^2.1.4", + "npm-package-arg": "^8.1.2", + "npm-pick-manifest": "^6.1.1", + "npm-profile": "^5.0.3", + "npm-registry-fetch": "^10.1.1", "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.1", + "npmlog": "~4.1.2", "opener": "^1.5.2", - "pacote": "^13.0.5", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", + "pacote": "^11.3.3", + "parse-conflict-json": "^1.1.1", "qrcode-terminal": "^0.12.0", "read": "~1.0.7", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", + "read-package-json": "^3.0.1", + "read-package-json-fast": "^2.0.2", "readdir-scoped-modules": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "ssri": "^8.0.1", - "tar": "^6.1.11", + "tar": "^6.1.0", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^1.0.4", "validate-npm-package-name": "~3.0.0", "which": "^2.0.2", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^3.0.3" }, "dependencies": { - "@gar/promisify": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, "@npmcli/arborist": { - "version": "5.0.3", + "version": "2.4.4", "bundled": true, "dev": true, "requires": { - "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.0", - "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^1.1.0", "@npmcli/move-file": "^1.1.0", "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.3", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^3.0.0", - "bin-links": "^3.0.0", - "cacache": "^16.0.0", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/run-script": "^1.8.2", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", "common-ancestor-path": "^1.0.1", "json-parse-even-better-errors": "^2.3.1", "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", "npm-install-checks": "^4.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.1", - "pacote": "^13.0.5", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^10.0.0", + "pacote": "^11.2.6", + "parse-conflict-json": "^1.1.1", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^2.0.2", "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", "semver": "^7.3.5", - "ssri": "^8.0.1", + "tar": "^6.1.0", "treeverse": "^1.0.4", "walk-up-path": "^1.0.0" } }, "@npmcli/ci-detect": { - "version": "2.0.0", + "version": "1.3.0", "bundled": true, "dev": true }, "@npmcli/config": { - "version": "4.0.1", + "version": "2.2.0", "bundled": true, "dev": true, "requires": { - "@npmcli/map-workspaces": "^2.0.1", "ini": "^2.0.0", "mkdirp-infer-owner": "^2.0.0", "nopt": "^5.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", + "semver": "^7.3.4", "walk-up-path": "^1.0.0" } }, @@ -25506,25 +39677,15 @@ "ansi-styles": "^4.3.0" } }, - "@npmcli/fs": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, "@npmcli/git": { - "version": "3.0.0", + "version": "2.0.9", "bundled": true, "dev": true, "requires": { "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^7.3.1", + "lru-cache": "^6.0.0", "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "npm-pick-manifest": "^6.1.1", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", @@ -25541,43 +39702,24 @@ } }, "@npmcli/map-workspaces": { - "version": "2.0.2", + "version": "1.0.3", "bundled": true, "dev": true, "requires": { "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.2.0", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" } }, "@npmcli/metavuln-calculator": { - "version": "3.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" } }, "@npmcli/move-file": { @@ -25595,18 +39737,10 @@ "dev": true }, "@npmcli/node-gyp": { - "version": "1.0.3", + "version": "1.0.2", "bundled": true, "dev": true }, - "@npmcli/package-json": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, "@npmcli/promise-spawn": { "version": "1.3.2", "bundled": true, @@ -25616,18 +39750,19 @@ } }, "@npmcli/run-script": { - "version": "3.0.1", + "version": "1.8.5", "bundled": true, "dev": true, "requires": { - "@npmcli/node-gyp": "^1.0.3", + "@npmcli/node-gyp": "^1.0.2", "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3" + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" } }, "@tootallnate/once": { - "version": "2.0.0", + "version": "1.1.2", "bundled": true, "dev": true }, @@ -25645,7 +39780,7 @@ } }, "agentkeepalive": { - "version": "4.2.1", + "version": "4.1.4", "bundled": true, "dev": true, "requires": { @@ -25663,8 +39798,19 @@ "indent-string": "^4.0.0" } }, + "ajv": { + "version": "6.12.6", + "bundled": true, + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { - "version": "5.0.1", + "version": "2.1.1", "bundled": true, "dev": true }, @@ -25697,12 +39843,12 @@ "dev": true }, "are-we-there-yet": { - "version": "3.0.0", + "version": "1.1.5", "bundled": true, "dev": true, "requires": { "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "readable-stream": "^2.0.6" } }, "asap": { @@ -25710,22 +39856,58 @@ "bundled": true, "dev": true }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.11.0", + "bundled": true, + "dev": true + }, "balanced-match": { "version": "1.0.2", "bundled": true, "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "bin-links": { - "version": "3.0.0", + "version": "2.2.1", "bundled": true, "dev": true, "requires": { "cmd-shim": "^4.0.1", - "mkdirp-infer-owner": "^2.0.0", + "mkdirp": "^1.0.3", "npm-normalize-package-bin": "^1.0.0", "read-cmd-shim": "^2.0.0", "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "write-file-atomic": "^3.0.3" } }, "binary-extensions": { @@ -25747,33 +39929,42 @@ "bundled": true, "dev": true }, + "byte-size": { + "version": "7.0.1", + "bundled": true, + "dev": true + }, "cacache": { - "version": "16.0.2", + "version": "15.0.6", "bundled": true, "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.1.2", + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^7.2.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.1.11", + "tar": "^6.0.2", "unique-filename": "^1.1.1" } }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, "chalk": { - "version": "4.1.2", + "version": "4.1.1", "bundled": true, "dev": true, "requires": { @@ -25800,21 +39991,52 @@ "dev": true }, "cli-columns": { - "version": "4.0.0", + "version": "3.1.2", "bundled": true, "dev": true, "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" } }, "cli-table3": { - "version": "0.6.1", + "version": "0.6.0", "bundled": true, "dev": true, "requires": { - "colors": "1.4.0", + "colors": "^1.1.2", + "object-assign": "^4.1.0", "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "4.2.2", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "clone": { @@ -25830,6 +40052,11 @@ "mkdirp-infer-owner": "^2.0.0" } }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, "color-convert": { "version": "2.0.1", "bundled": true, @@ -25843,11 +40070,6 @@ "bundled": true, "dev": true }, - "color-support": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, "colors": { "version": "1.4.0", "bundled": true, @@ -25855,14 +40077,22 @@ "optional": true }, "columnify": { - "version": "1.6.0", + "version": "1.5.4", "bundled": true, "dev": true, "requires": { - "strip-ansi": "^6.0.1", + "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" } }, + "combined-stream": { + "version": "1.0.8", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "common-ancestor-path": { "version": "1.0.1", "bundled": true, @@ -25878,8 +40108,21 @@ "bundled": true, "dev": true }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { - "version": "4.3.3", + "version": "4.3.1", "bundled": true, "dev": true, "requires": { @@ -25906,6 +40149,11 @@ "clone": "^1.0.2" } }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "delegates": { "version": "1.0.0", "bundled": true, @@ -25930,6 +40178,15 @@ "bundled": true, "dev": true }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "emoji-regex": { "version": "8.0.0", "bundled": true, @@ -25954,11 +40211,41 @@ "bundled": true, "dev": true }, - "fastest-levenshtein": { - "version": "1.0.12", + "extend": { + "version": "3.0.2", "bundled": true, "dev": true }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true, + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "fs-minipass": { "version": "2.1.0", "bundled": true, @@ -25978,22 +40265,55 @@ "dev": true }, "gauge": { - "version": "4.0.3", + "version": "2.7.4", "bundled": true, "dev": true, "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.2.0", + "version": "7.1.7", "bundled": true, "dev": true, "requires": { @@ -26006,10 +40326,24 @@ } }, "graceful-fs": { - "version": "4.2.9", + "version": "4.2.6", "bundled": true, "dev": true }, + "har-schema": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "bundled": true, + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "bundled": true, @@ -26029,11 +40363,11 @@ "dev": true }, "hosted-git-info": { - "version": "5.0.0", + "version": "4.0.2", "bundled": true, "dev": true, "requires": { - "lru-cache": "^7.5.1" + "lru-cache": "^6.0.0" } }, "http-cache-semantics": { @@ -26042,15 +40376,25 @@ "dev": true }, "http-proxy-agent": { - "version": "5.0.0", + "version": "4.0.1", "bundled": true, "dev": true, "requires": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-proxy-agent": { "version": "5.0.0", "bundled": true, @@ -26069,7 +40413,7 @@ } }, "iconv-lite": { - "version": "0.6.3", + "version": "0.6.2", "bundled": true, "dev": true, "optional": true, @@ -26078,7 +40422,7 @@ } }, "ignore-walk": { - "version": "4.0.1", + "version": "3.0.4", "bundled": true, "dev": true, "requires": { @@ -26120,14 +40464,15 @@ "dev": true }, "init-package-json": { - "version": "3.0.1", + "version": "2.0.3", "bundled": true, "dev": true, "requires": { - "npm-package-arg": "^9.0.0", + "glob": "^7.1.1", + "npm-package-arg": "^8.1.2", "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", + "read": "~1.0.1", + "read-package-json": "^3.0.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" @@ -26152,7 +40497,7 @@ } }, "is-core-module": { - "version": "2.8.1", + "version": "2.2.0", "bundled": true, "dev": true, "requires": { @@ -26160,7 +40505,7 @@ } }, "is-fullwidth-code-point": { - "version": "3.0.0", + "version": "2.0.0", "bundled": true, "dev": true }, @@ -26169,49 +40514,100 @@ "bundled": true, "dev": true }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "isexe": { "version": "2.0.0", "bundled": true, "dev": true }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, "json-parse-even-better-errors": { "version": "2.3.1", "bundled": true, "dev": true }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "bundled": true, + "dev": true + }, "json-stringify-nice": { "version": "1.1.4", "bundled": true, "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, "jsonparse": { "version": "1.3.1", "bundled": true, "dev": true }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "just-diff": { - "version": "5.0.1", + "version": "3.1.1", "bundled": true, "dev": true }, "just-diff-apply": { - "version": "4.0.1", + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "leven": { + "version": "3.1.0", "bundled": true, "dev": true }, "libnpmaccess": { - "version": "6.0.2", + "version": "4.0.2", "bundled": true, "dev": true, "requires": { "aproba": "^2.0.0", "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^10.0.0" } }, "libnpmdiff": { - "version": "4.0.2", + "version": "2.0.4", "bundled": true, "dev": true, "requires": { @@ -26220,138 +40616,151 @@ "binary-extensions": "^2.2.0", "diff": "^5.0.0", "minimatch": "^3.0.4", - "npm-package-arg": "^9.0.1", - "pacote": "^13.0.5", + "npm-package-arg": "^8.1.1", + "pacote": "^11.3.0", "tar": "^6.1.0" } }, "libnpmexec": { - "version": "4.0.2", + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "@npmcli/arborist": "^5.0.0", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/run-script": "^3.0.0", + "@npmcli/arborist": "^2.3.0", + "@npmcli/ci-detect": "^1.3.0", + "@npmcli/run-script": "^1.8.4", "chalk": "^4.1.0", "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.1", - "pacote": "^13.0.5", - "proc-log": "^2.0.0", + "npm-package-arg": "^8.1.2", + "pacote": "^11.3.1", + "proc-log": "^1.0.0", "read": "^1.0.7", "read-package-json-fast": "^2.0.2", "walk-up-path": "^1.0.0" } }, "libnpmfund": { - "version": "3.0.1", + "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "@npmcli/arborist": "^5.0.0" + "@npmcli/arborist": "^2.0.0" } }, "libnpmhook": { - "version": "8.0.2", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmorg": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmpack": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/run-script": "^3.0.0", - "npm-package-arg": "^9.0.1", - "pacote": "^13.0.5" - } - }, - "libnpmpublish": { "version": "6.0.2", "bundled": true, "dev": true, "requires": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", + "aproba": "^2.0.0", + "npm-registry-fetch": "^10.0.0" + } + }, + "libnpmorg": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^10.0.0" + } + }, + "libnpmpack": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/run-script": "^1.8.3", + "npm-package-arg": "^8.1.0", + "pacote": "^11.2.6" + } + }, + "libnpmpublish": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "normalize-package-data": "^3.0.2", + "npm-package-arg": "^8.1.2", + "npm-registry-fetch": "^10.0.0", "semver": "^7.1.3", "ssri": "^8.0.1" } }, "libnpmsearch": { - "version": "5.0.2", + "version": "3.1.1", "bundled": true, "dev": true, "requires": { - "npm-registry-fetch": "^13.0.0" + "npm-registry-fetch": "^10.0.0" } }, "libnpmteam": { - "version": "4.0.2", + "version": "2.0.3", "bundled": true, "dev": true, "requires": { "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "npm-registry-fetch": "^10.0.0" } }, "libnpmversion": { - "version": "3.0.1", + "version": "1.2.0", "bundled": true, "dev": true, "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^3.0.0", + "@npmcli/git": "^2.0.7", + "@npmcli/run-script": "^1.8.4", "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", "semver": "^7.3.5", "stringify-package": "^1.0.1" } }, "lru-cache": { - "version": "7.5.1", - "bundled": true, - "dev": true - }, - "make-fetch-happen": { - "version": "10.0.6", + "version": "6.0.0", "bundled": true, "dev": true, "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.0.0", + "yallist": "^4.0.0" + } + }, + "make-fetch-happen": { + "version": "8.0.14", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", + "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.1.1", - "ssri": "^8.0.1" + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "mime-db": { + "version": "1.47.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.47.0" } }, "minimatch": { - "version": "3.1.2", + "version": "3.0.4", "bundled": true, "dev": true, "requires": { @@ -26359,7 +40768,7 @@ } }, "minipass": { - "version": "3.1.6", + "version": "3.1.3", "bundled": true, "dev": true, "requires": { @@ -26375,14 +40784,14 @@ } }, "minipass-fetch": { - "version": "2.0.3", + "version": "1.3.3", "bundled": true, "dev": true, "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", + "encoding": "^0.1.12", + "minipass": "^3.1.0", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^2.0.0" } }, "minipass-flush": { @@ -26452,25 +40861,20 @@ "bundled": true, "dev": true }, - "negotiator": { - "version": "0.6.3", - "bundled": true, - "dev": true - }, "node-gyp": { - "version": "9.0.0", + "version": "7.1.2", "bundled": true, "dev": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "graceful-fs": "^4.2.3", "nopt": "^5.0.0", - "npmlog": "^6.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", + "semver": "^7.3.2", + "tar": "^6.0.2", "which": "^2.0.2" } }, @@ -26483,18 +40887,18 @@ } }, "normalize-package-data": { - "version": "4.0.0", + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" } }, "npm-audit-report": { - "version": "2.1.5", + "version": "2.1.4", "bundled": true, "dev": true, "requires": { @@ -26523,58 +40927,57 @@ "dev": true }, "npm-package-arg": { - "version": "9.0.1", + "version": "8.1.2", "bundled": true, "dev": true, "requires": { - "hosted-git-info": "^5.0.0", - "semver": "^7.3.5", + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "npm-packlist": { - "version": "4.0.0", + "version": "2.2.2", "bundled": true, "dev": true, "requires": { - "glob": "^7.2.0", - "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.2", + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" } }, "npm-pick-manifest": { - "version": "7.0.0", + "version": "6.1.1", "bundled": true, "dev": true, "requires": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" } }, "npm-profile": { - "version": "6.0.2", + "version": "5.0.3", "bundled": true, "dev": true, "requires": { - "npm-registry-fetch": "^13.0.0", - "proc-log": "^2.0.0" + "npm-registry-fetch": "^10.0.0" } }, "npm-registry-fetch": { - "version": "13.0.1", + "version": "10.1.1", "bundled": true, "dev": true, "requires": { - "make-fetch-happen": "^10.0.3", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.1", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.0", - "proc-log": "^2.0.0" + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" } }, "npm-user-validate": { @@ -26583,16 +40986,31 @@ "dev": true }, "npmlog": { - "version": "6.0.1", + "version": "4.1.2", "bundled": true, "dev": true, "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, "once": { "version": "1.4.0", "bundled": true, @@ -26615,41 +41033,39 @@ } }, "pacote": { - "version": "13.0.5", + "version": "11.3.3", "bundled": true, "dev": true, "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.6", "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^3.0.1", - "cacache": "^16.0.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^4.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^10.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", + "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.1.11" + "tar": "^6.1.0" } }, "parse-conflict-json": { - "version": "2.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^4.0.1" + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" } }, "path-is-absolute": { @@ -26657,8 +41073,23 @@ "bundled": true, "dev": true }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, "proc-log": { - "version": "2.0.0", + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", "bundled": true, "dev": true }, @@ -26694,11 +41125,26 @@ "read": "1" } }, + "psl": { + "version": "1.8.0", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, "qrcode-terminal": { "version": "0.12.0", "bundled": true, "dev": true }, + "qs": { + "version": "6.5.2", + "bundled": true, + "dev": true + }, "read": { "version": "1.0.7", "bundled": true, @@ -26713,18 +41159,18 @@ "dev": true }, "read-package-json": { - "version": "5.0.0", + "version": "3.0.1", "bundled": true, "dev": true, "requires": { - "glob": "^7.2.0", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1" + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" } }, "read-package-json-fast": { - "version": "2.0.3", + "version": "2.0.2", "bundled": true, "dev": true, "requires": { @@ -26733,13 +41179,17 @@ } }, "readable-stream": { - "version": "3.6.0", + "version": "2.3.7", "bundled": true, "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdir-scoped-modules": { @@ -26753,6 +41203,53 @@ "once": "^1.3.0" } }, + "request": { + "version": "2.88.2", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "resolve": { + "version": "1.20.0", + "bundled": true, + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, "retry": { "version": "0.12.0", "bundled": true, @@ -26767,15 +41264,14 @@ } }, "safe-buffer": { - "version": "5.2.1", + "version": "5.1.2", "bundled": true, "dev": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "semver": { "version": "7.3.5", @@ -26783,16 +41279,6 @@ "dev": true, "requires": { "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } } }, "set-blocking": { @@ -26801,32 +41287,32 @@ "dev": true }, "signal-exit": { - "version": "3.0.7", + "version": "3.0.3", "bundled": true, "dev": true }, "smart-buffer": { - "version": "4.2.0", + "version": "4.1.0", "bundled": true, "dev": true }, "socks": { - "version": "2.6.2", + "version": "2.6.1", "bundled": true, "dev": true, "requires": { "ip": "^1.1.5", - "smart-buffer": "^4.2.0" + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { - "version": "6.1.1", + "version": "5.0.0", "bundled": true, "dev": true, "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" } }, "spdx-correct": { @@ -26853,10 +41339,26 @@ } }, "spdx-license-ids": { - "version": "3.0.11", + "version": "3.0.7", "bundled": true, "dev": true }, + "sshpk": { + "version": "1.16.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "ssri": { "version": "8.0.1", "bundled": true, @@ -26866,21 +41368,35 @@ } }, "string_decoder": { - "version": "1.3.0", + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "string-width": { - "version": "4.2.3", + "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "stringify-package": { @@ -26889,11 +41405,11 @@ "dev": true }, "strip-ansi": { - "version": "6.0.1", + "version": "3.0.1", "bundled": true, "dev": true, "requires": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -26905,7 +41421,7 @@ } }, "tar": { - "version": "6.1.11", + "version": "6.1.0", "bundled": true, "dev": true, "requires": { @@ -26932,6 +41448,27 @@ "bundled": true, "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "unique-filename": { "version": "1.1.1", "bundled": true, @@ -26948,11 +41485,24 @@ "imurmurhash": "^0.1.4" } }, + "uri-js": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "bundled": true, "dev": true }, + "uuid": { + "version": "3.4.0", + "bundled": true, + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "bundled": true, @@ -26970,6 +41520,16 @@ "builtins": "^1.0.3" } }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "walk-up-path": { "version": "1.0.0", "bundled": true, @@ -26992,11 +41552,11 @@ } }, "wide-align": { - "version": "1.1.5", + "version": "1.1.3", "bundled": true, "dev": true, "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -27005,12 +41565,14 @@ "dev": true }, "write-file-atomic": { - "version": "4.0.1", + "version": "3.0.3", "bundled": true, "dev": true, "requires": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "yallist": { @@ -27021,40 +41583,85 @@ } }, "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "^3.0.0" + "path-key": "^2.0.0" } }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "boolbase": "^1.0.0" + "boolbase": "~1.0.0" } }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, @@ -27063,16 +41670,102 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "obuf": { @@ -27080,6 +41773,12 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, + "on-build-webpack": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/on-build-webpack/-/on-build-webpack-0.1.0.tgz", + "integrity": "sha1-oofA4Xdm5hQZJuXyy7DYu1O3aBQ=", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -27105,35 +41804,33 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + } + }, "optimize-css-assets-webpack-plugin": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.1.tgz", - "integrity": "sha512-BshV2UZPfggZLdUfN3zFBbG4sl/DynUI+YCB6fRRDWaqO2OiWN8GPcp4Y0/fEV6B3k9Hzyk3czve3V/8B/SzKQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "dev": true, "requires": { - "cssnano": "^5.0.2", - "last-call-webpack-plugin": "^3.0.0", - "postcss": "^8.2.1" + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" } }, "optionator": { @@ -27150,53 +41847,75 @@ "word-wrap": "~1.2.3" } }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" + "p-limit": "^2.0.0" } }, "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "requires": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" + "retry": "^0.12.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", - "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==", "dev": true }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -27207,13 +41926,16 @@ "tslib": "^2.0.3" } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { - "callsites": "^3.0.0" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-json": { @@ -27228,6 +41950,12 @@ "lines-and-columns": "^1.1.6" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -27249,26 +41977,45 @@ "tslib": "^2.0.3" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-to-regexp": { @@ -27276,41 +42023,117 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "devOptional": true }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } }, "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "portfinder": { @@ -27323,14 +42146,6 @@ "mkdirp": "^0.5.5" }, "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -27338,684 +42153,2243 @@ "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.10.tgz", + "integrity": "sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw==", "dev": true, "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" }, "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "postcss-attribute-case-insensitive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", - "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", "dev": true, "requires": { + "postcss": "^7.0.2", "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-color-hex-alpha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", - "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-color-rebeccapurple": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", - "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-custom-media": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "dev": true, - "requires": {} - }, - "postcss-custom-properties": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", - "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-custom-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", - "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.4" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-dir-pseudo-class": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", - "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} - }, - "postcss-double-position-gradients": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", - "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", - "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", "dev": true, "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-lab-function": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz", - "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", "dev": true, "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" } }, "postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "dev": true, "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" }, "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, - "postcss-merge-longhand": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", - "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.5" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "dev": true, "requires": { - "icss-utils": "^5.0.0", + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.4" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, "requires": { - "icss-utils": "^5.0.0" + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-nesting": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz", - "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true - }, "postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-overflow-shorthand": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "dev": true, - "requires": {} - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} - }, - "postcss-place": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", - "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "dev": true, "requires": { - "@csstools/postcss-color-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", - "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.2", - "postcss-color-hex-alpha": "^8.0.3", - "postcss-color-rebeccapurple": "^7.0.2", - "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", - "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0", - "postcss-value-parser": "^4.2.0" + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", + "dev": true + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-pseudo-class-any-link": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", - "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} - }, - "postcss-selector-not": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", - "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.5" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dev": true, "requires": { "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "renderkid": "^2.0.4" } }, "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", "react-is": "^17.0.1" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } } @@ -28026,15 +44400,25 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -28042,44 +44426,105 @@ } }, "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { - "forwarded": "0.2.0", + "forwarded": "~0.1.2", "ipaddr.js": "1.9.1" } }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pvtsutils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.2.2.tgz", - "integrity": "sha512-OALo5ZEdqiI127i64+CXwkCOyFHUA+tCQgaUO/MvRDFXWPr53f2sx28ECNztUEzuyu5xvuuD1EB/szg9mwJoGA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.1.6.tgz", + "integrity": "sha512-Tm/74+LIqWtItcZHBJztPEPqLzNKbtPAA3LoFt763PFCHxmCfrF4YXhdFEiPAxMTakR0shbVymKKyMxg1Zqt4A==", "dev": true, "requires": { - "tslib": "^2.3.1" + "tslib": "^2.2.0" } }, "pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "qr-code-styling": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.5.0.tgz", - "integrity": "sha512-7C+1cZGsZWH0BIRtv24faKZJwkxdYlynXktP9dDxKNSik2bqaUZck3B3MpQod/wqm9i3l4q7QsPGkRGKvcuqZw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.3.4.tgz", + "integrity": "sha512-ZYPlJMN2axrYLhMzWPjWN0/8gP6qg8uykC0sPIJVUG3coPxlImhdDUBp8UFagRRsTnJYmfy5BLD3RTjekVG7Rw==", "dev": true, "requires": { "qrcode-generator": "^1.4.3" @@ -28092,14 +44537,34 @@ "dev": true }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "randombytes": { "version": "2.1.0", @@ -28109,26 +44574,35 @@ "safe-buffer": "^5.1.0" } }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.1.2", - "http-errors": "1.8.1", + "bytes": "3.1.0", + "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" } } }, @@ -28138,27 +44612,77 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "pify": "^2.3.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true } } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -28170,41 +44694,34 @@ } }, "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { - "regenerate": "^1.4.2" + "regenerate": "^1.4.0" } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "regenerator-transform": { @@ -28216,39 +44733,48 @@ "@babel/runtime": "^7.8.4" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -28268,29 +44794,138 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", "dev": true, "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "requires-port": { "version": "1.0.0", @@ -28298,61 +44933,107 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" } }, "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "resolve-from": "^5.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } } }, "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { "glob": "^7.1.3" } }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "queue-microtask": "^1.2.2" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" } }, "safe-buffer": { @@ -28360,32 +45041,72 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sass": { - "version": "1.49.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", - "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "sass": { + "version": "1.32.13", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.13.tgz", + "integrity": "sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0" } }, "sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "dev": true, "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -28396,14 +45117,33 @@ } }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + } } }, "select-hose": { @@ -28412,23 +45152,22 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "^1.2.0" + "node-forge": "^0.10.0" } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -28437,44 +45176,26 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "~1.7.2", "mime": "1.6.0", - "ms": "2.1.3", + "ms": "2.1.1", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" - } - }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -28489,14 +45210,6 @@ "parseurl": "~1.3.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -28513,11 +45226,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -28526,20 +45234,69 @@ } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.17.1" } }, + "serviceworker-webpack-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/serviceworker-webpack-plugin/-/serviceworker-webpack-plugin-1.0.1.tgz", + "integrity": "sha512-VgDEkZ3pA0HajsRaWtl5w6bLxAXx0Y+4dm7YeTcIxVmvC9YXvstex38HOBDuYETeDS5fUlBy/47gC0QYBrG0nw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, "shallow-clone": { "version": "3.0.1", @@ -28551,22 +45308,46 @@ } }, "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "^3.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true }, "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } }, "sirv": { "version": "1.0.19", @@ -28591,38 +45372,183 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "requires": { "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", + "uuid": "^3.4.0", "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" } }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } }, "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -28635,6 +45561,43 @@ } } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -28645,6 +45608,21 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "spdy-transport": { @@ -28660,6 +45638,19 @@ "wbuf": "^1.7.3" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -28672,12 +45663,45 @@ } } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -28685,9 +45709,9 @@ "dev": true }, "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -28701,11 +45725,77 @@ } } }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -28722,26 +45812,81 @@ "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^4.1.0" } }, "strip-bom": { @@ -28750,39 +45895,136 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "requires": {} - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "dev": true, "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } @@ -28814,38 +46056,54 @@ } } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" }, "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } } } }, @@ -28856,9 +46114,9 @@ "dev": true }, "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "terminal-link": { "version": "2.1.1", @@ -28871,14 +46129,13 @@ } }, "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "requires": { - "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, "dependencies": { "commander": { @@ -28886,35 +46143,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "requires": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -28940,16 +46168,33 @@ "dev": true }, "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, "timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", @@ -28957,29 +46202,64 @@ "dev": true }, "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "is-number": "^7.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "totalist": { "version": "1.1.0", @@ -28999,9 +46279,9 @@ } }, "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "requires": { "punycode": "^2.1.1" @@ -29014,21 +46294,38 @@ "dev": true }, "ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", + "version": "26.5.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", + "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", "dev": true, "requires": { "bs-logger": "0.x", + "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", + "jest-util": "^26.1.0", "json5": "2.x", - "lodash.memoize": "4.x", + "lodash": "4.x", "make-error": "1.x", + "mkdirp": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -29037,17 +46334,24 @@ "requires": { "lru-cache": "^6.0.0" } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true } } }, "ts-loader": { - "version": "9.2.8", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", - "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.2.0.tgz", + "integrity": "sha512-ebXBFrNyMSmbWgjnb3WBloUBK+VSx1xckaXsMXxlZRDqce/OPdYBVN5efB0W3V0defq0Gcy4YuzvPGqRgjj85A==", "dev": true, "requires": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" }, @@ -29061,10 +46365,19 @@ "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -29086,12 +46399,69 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -29109,13 +46479,42 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "type-check": { @@ -29134,9 +46533,9 @@ "dev": true }, "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "type-is": { @@ -29148,6 +46547,11 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -29158,46 +46562,105 @@ } }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true }, "uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -29209,19 +46672,128 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -29234,14 +46806,20 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -29257,11 +46835,43 @@ } } }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -29281,21 +46891,54 @@ } }, "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { - "makeerror": "1.0.12" + "makeerror": "1.0.x" } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + } } }, "wbuf": { @@ -29307,17 +46950,16 @@ } }, "webcrypto-core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.1.tgz", - "integrity": "sha512-Gw2zLzYSJ7Imp5lLDu3CcWB5oTTACMDEE2PjoLfttGgIhd7BfackBdVgEzd9ZM/i65gpNq0+IelL0JZ48QwzNg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.2.0.tgz", + "integrity": "sha512-p76Z/YLuE4CHCRdc49FB/ETaM4bzM3roqWNJeGs+QNY1fOTzKTOVnhmudW1fuO+5EZg6/4LG9NJ6gaAyxTk9XQ==", "dev": true, "requires": { - "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.27", "@peculiar/json-schema": "^1.1.12", - "@types/web": "^0.0.55", - "asn1js": "^2.2.0", - "pvtsutils": "^1.2.2", - "tslib": "^2.3.1" + "asn1js": "^2.0.26", + "pvtsutils": "^1.1.2", + "tslib": "^2.1.0" } }, "webidl-conversions": { @@ -29327,50 +46969,113 @@ "dev": true }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" }, "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } } }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } } } }, @@ -29391,6 +47096,12 @@ "ws": "^7.3.1" }, "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -29451,218 +47162,224 @@ "requires": { "has-flag": "^4.0.0" } + }, + "ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "dev": true, + "requires": {} } } }, "webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } } } }, "webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "webpack-log": "^2.0.0" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } } } }, "webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", - "ansi-html-community": "^0.0.8", + "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", + "chokidar": "^2.1.8", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "del": "^6.0.0", + "debug": "^4.1.1", + "del": "^4.1.1", "express": "^4.17.1", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", "serve-index": "^1.9.1", "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^2.0.0" } - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "requires": {} } } }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "lodash": "^4.17.15" } }, "webpack-retry-chunk-load-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-retry-chunk-load-plugin/-/webpack-retry-chunk-load-plugin-3.0.0.tgz", - "integrity": "sha512-MnnBu55A/kPXb+n8QG+7aN0wHOy7n1LOtRn6laynWFtci4X2FqAMzF4G5awKFwu5lOGXWq8ADLHSPA2z3pmUQg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/webpack-retry-chunk-load-plugin/-/webpack-retry-chunk-load-plugin-1.5.0.tgz", + "integrity": "sha512-mE3YBQX0Ho09uQpnrCVOuwtnMbu8Ydzx6rF0lETxQnZpAf9fz/KL1HxOFDsyhPG9dH0nmCsCEj0reWhY65NJUQ==", "dev": true, "requires": { - "prettier": "^2.2.1" + "prettier": "^1.19.1" } }, "webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dev": true, + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -29697,29 +47414,28 @@ "dev": true }, "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", + "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", "dev": true, "requires": { "lodash": "^4.7.0", - "tr46": "^2.1.0", + "tr46": "^2.0.2", "webidl-conversions": "^6.1.0" } }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } }, - "wildcard": { + "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "word-wrap": { "version": "1.2.3", @@ -29733,6 +47449,14 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, "worker-loader": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", @@ -29743,13 +47467,64 @@ "schema-utils": "^3.0.0" }, "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -29757,40 +47532,13 @@ } }, "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { @@ -29811,11 +47559,12 @@ } }, "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } }, "xml-name-validator": { "version": "3.0.0", @@ -29829,11 +47578,15 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { "version": "4.0.0", @@ -29841,32 +47594,31 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } } diff --git a/package.json b/package.json index 5fe99b58..3e206eab 100644 --- a/package.json +++ b/package.json @@ -20,62 +20,62 @@ "author": "", "license": "GPL-3.0-only", "dependencies": { - "webpack-dev-server": "^4.7.4" + "webpack-dev-server": "^3.11.2" }, "devDependencies": { - "@babel/cli": "^7.17.6", - "@babel/core": "^7.17.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.8", + "@babel/cli": "^7.13.16", + "@babel/core": "^7.14.2", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-transform-typescript": "^7.13.0", "@babel/polyfill": "^7.12.1", - "@babel/preset-env": "^7.16.11", + "@babel/preset-env": "^7.14.2", "@babel/preset-es2015": "^7.0.0-beta.53", - "@babel/preset-typescript": "^7.16.7", + "@babel/preset-typescript": "^7.13.0", "@cryptography/aes": "^0.1.1", "@cryptography/sha1": "^0.2.0", "@cryptography/sha256": "^0.2.0", - "@peculiar/webcrypto": "^1.3.2", + "@peculiar/webcrypto": "^1.1.7", "@types/big-integer": "^0.0.31", - "@types/chrome": "0.0.180", - "@types/jest": "^27.4.1", - "@types/serviceworker-webpack-plugin": "^1.0.3", - "autoprefixer": "^10.4.4", - "babel-jest": "^27.5.1", - "babel-loader": "^8.2.4", + "@types/chrome": "0.0.139", + "@types/jest": "^26.0.23", + "@types/serviceworker-webpack-plugin": "^1.0.2", + "babel-jest": "^26.6.3", + "babel-loader": "^8.2.2", "babel-preset-es2015": "^6.24.1", "big-integer": "^1.6.51", "compression": "^1.7.4", - "css-loader": "^6.7.1", - "cssnano": "^5.1.5", - "dotenv-webpack": "^7.1.0", - "express": "^4.17.3", - "fast-png": "^6.1.0", + "css-loader": "^3.6.0", + "dotenv-webpack": "^7.0.3", + "express": "^4.17.1", + "fast-png": "^5.0.4", "handlebars": "^4.7.7", "handlebars-loader": "^1.7.1", - "html-webpack-plugin": "^5.5.0", - "ifdef-loader": "^2.3.2", - "jest": "^27.5.1", - "media-query-plugin": "^1.5.0", - "mini-css-extract-plugin": "^2.6.0", - "npm": "^8.5.5", - "optimize-css-assets-webpack-plugin": "^6.0.1", - "pako": "^2.0.4", - "postcss-import": "^14.1.0", - "postcss-loader": "^6.2.1", - "postcss-preset-env": "^7.4.3", - "qr-code-styling": "^1.5.0", - "sass": "^1.49.9", - "sass-loader": "^12.6.0", - "style-loader": "^3.3.1", + "html-webpack-plugin": "^4.5.2", + "ifdef-loader": "^2.3.0", + "jest": "^26.6.3", + "media-query-plugin": "^1.4.0", + "mini-css-extract-plugin": "^0.9.0", + "npm": "^7.12.1", + "on-build-webpack": "^0.1.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pako": "^2.0.3", + "postcss": "^8.2.10", + "postcss-loader": "^3.0.0", + "postcss-preset-env": "^6.7.0", + "qr-code-styling": "^1.3.4", + "sass": "^1.32.13", + "sass-loader": "^8.0.2", + "serviceworker-webpack-plugin": "^1.0.1", + "style-loader": "^1.3.0", "text-encoding": "^0.7.0", - "ts-jest": "^27.1.4", - "ts-loader": "^9.2.8", - "typescript": "^4.6.3", - "webpack": "^5.70.0", + "ts-jest": "^26.5.6", + "ts-loader": "^8.2.0", + "typescript": "^4.4.3", + "webpack": "^4.46.0", "webpack-bundle-analyzer": "^4.5.0", - "webpack-cli": "^4.9.2", - "webpack-merge": "^5.8.0", - "webpack-retry-chunk-load-plugin": "^3.0.0", + "webpack-cli": "^3.3.12", + "webpack-merge": "^4.2.2", + "webpack-retry-chunk-load-plugin": "^1.5.0", "worker-loader": "^3.0.8" } } diff --git a/postcss.config.js b/postcss.config.js index ced2cb1c..43172276 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,5 +1,5 @@ module.exports = { - // parser: 'sugarss', + parser: 'sugarss', plugins: { 'postcss-import': {}, 'postcss-preset-env': {}, diff --git a/public/0.2da18beaed4bd7796d8f.chunk.js b/public/0.2da18beaed4bd7796d8f.chunk.js new file mode 100644 index 00000000..f30c3a5d --- /dev/null +++ b/public/0.2da18beaed4bd7796d8f.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[0,21],{103:function(e,t,s){"use strict";s.d(t,"a",(function(){return d}));var r=s(52),i=s(94),n=s(75),o=s(93),a=s(42),c=s(41);class l{constructor(e,t){this.storageIsAvailable=!0,Object(a.a)(this,e),n.a.test&&(this.name+="_test"),this.storeName=t,this.log=Object(c.b)("IDB-"+this.storeName),this.openDatabase(!0),l.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const s=t.db;s&&(s.onclose=()=>{},s.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout(()=>{s||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,r)=>{t.onsuccess=i=>{s=!0;const n=t.result;let o=!1;this.log("Opened"),n.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},n.onclose=e=>{this.log.error("closed:",e),!o&&this.openDatabase()},n.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(o=!0),t.onerror&&t.onerror(e),n.close()},n.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=n)},t.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},t.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var s;const r=e.createObjectStore(t.name);if(null===(s=t.indexes)||void 0===s?void 0:s.length)for(const e of t.indexes)r.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",s=>e.map((e,r)=>s.put(t[r],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Object(o.a)([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,s,r=this.storeName){let i;return s&&(i=performance.now(),this.log(s+": start")),this.openDatabase().then(n=>new Promise((o,a)=>{const c=n.transaction([r],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),s&&this.log(s+": end",performance.now()-i);const t=d.map(e=>e.result);o(u?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",c)},1e4),h=t(c.objectStore(r)),u=Array.isArray(h),d=u?h:[].concat(h)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}l.STORAGES=[];var h=function(e,t,s,r){return new(s||(s=Promise))((function(i,n){function o(e){try{c(r.next(e))}catch(e){n(e)}}function a(e){try{c(r.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,a)}c((r=r.apply(e,t||[])).next())}))};function u(){}class d{constructor(e,t){this.db=e,this.storeName=t,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=Object(r.a)(),this.keysToDelete=new Set,this.deleteDeferred=Object(r.a)(),this.storage=new l(e,t),d.STORAGES.length?this.useStorage=d.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,d.STORAGES.push(this),this.saveThrottled=Object(i.a)(()=>h(this,void 0,void 0,(function*(){const e=this.saveDeferred;this.saveDeferred=Object(r.a)();const t=this.keysToSet;if(t.size){const e=Array.from(t.values());t.clear();try{const t=e.map(e=>this.cache[e]);yield this.storage.save(e,t)}catch(t){console.error("[AS]: set error:",t,e)}}e.resolve(),t.size&&this.saveThrottled()})),16,!1),this.deleteThrottled=Object(i.a)(()=>h(this,void 0,void 0,(function*(){const e=this.deleteDeferred;this.deleteDeferred=Object(r.a)();const t=this.keysToDelete;if(t.size){const e=Array.from(t.values());t.clear();try{yield this.storage.delete(e)}catch(t){console.error("[AS]: delete error:",t,e)}}e.resolve(),t.size&&this.deleteThrottled()})),16,!1),this.getThrottled=Object(i.a)(()=>h(this,void 0,void 0,(function*(){const e=Array.from(this.getPromises.keys());this.storage.get(e).then(t=>{for(let s=0,r=e.length;s{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(s)||(this.useStorage=!1,console.error("[AS]: get error:",s,e,t));for(let t=0,s=e.length;t{this.getPromises.size&&this.getThrottled()})})),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(e){return this.cache[e]}setToCache(e,t){return this.cache[e]=t}get(e,t=!0){return h(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(e)&&t)return this.getFromCache(e);if(this.useStorage){const t=this.getPromises.get(e);if(t)return t;const s=Object(r.a)();return this.getPromises.set(e,s),this.getThrottled(),s}}))}getAll(){return this.storage.getAll().catch(()=>[])}set(e,t=!1){const s=this.useStorage&&!t&&!this.savingFreezed;for(const t in e)if(e.hasOwnProperty(t)){const r=e[t];this.setToCache(t,r),s&&(this.keysToSet.add(t),this.keysToDelete.delete(t),this.saveThrottled())}return s?this.saveDeferred:Promise.resolve()}delete(e,t=!1){return e=""+e,t||delete this.cache[e],this.useStorage&&(this.keysToSet.delete(e),this.keysToDelete.add(e),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(e=!1){if(!e)for(const e in this.cache)delete this.cache[e];return this.storage.clear().catch(u)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>(t.useStorage=e,e?t.set(t.cache):(t.keysToSet.clear(),t.keysToDelete.clear(),t.getPromises.forEach(e=>e.resolve(void 0)),t.getPromises.clear(),t.clear(!0))))).catch(u)}static freezeSaving(e,t){this.STORAGES.forEach(e=>e.savingFreezed=!0);try{e()}catch(e){}this.STORAGES.forEach(e=>e.savingFreezed=!1)}}d.STORAGES=[]},138:function(e,t,s){"use strict";t.a={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return o}));var r=s(43),i=s(50),n=s(30);class o extends i.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof r.c?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const a=new o;n.a.rootScope=a,t.default=a},168:function(e,t,s){"use strict";s.d(t,"a",(function(){return r})),s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return l}));const r="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,i="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!r,n=i||r,o=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(s=>{s.length&&s.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},a=(...e)=>{self.postMessage(...e)},c=()=>{},l=r?o.bind(null,!1):i?a:c;r&&o.bind(null,!0)},30:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const r=s(75).a.debug,i="undefined"!=typeof window?window:self;t.b=r},41:function(e,t,s){"use strict";s.d(t,"a",(function(){return r})),s.d(t,"b",(function(){return v}));var r,i=s(30),n=s(0),o=s(168);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(r||(r={}));const a=[r.None,r.Error,r.Warn,r.Log,r.Debug],c=Date.now();function l(){return"["+((Date.now()-c)/1e3).toFixed(3)+"]"}let h;const u=n.IS_SAFARI||n.IS_FIREFOX;h=u?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const d=!u,f=u?2:3;function g(){const e=(new Error).stack.split("\n"),t=e[f]||e[e.length-1];return"["+(h(t)||"")+"]"}const m={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},p=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log]];function v(e,t=r.Log|r.Warn|r.Error,s=!1,n=""){let c;i.b||s||(t=r.Error),d?n||(o.a?n=m.yellow:o.b&&(n=m.cyan)):n="";let h=n;n=n?`%s ${n}%s`:"%s";const u=function(...s){return t&r.Log&&console.log(n,l(),e,g(),...s)};return p.forEach(([s,r])=>{u[s]=function(...i){return t&r&&console[s](n,l(),e,g(),...i)}}),u.setPrefix=function(t){c=t,e="["+t+"]"},u.setPrefix(e),u.setLevel=function(e){t=a.slice(0,e+1).reduce((e,t)=>e|t,0)},u.bindPrefix=function(e){return v(`${c}] [${e}`,t,s,h)},u}},42:function(e,t,s){"use strict";function r(e,t){if(t)for(let s in t)void 0!==t[s]&&(e[s]=t[s]);return e}s.d(t,"a",(function(){return r}))},43:function(e,t,s){"use strict";s.d(t,"c",(function(){return r})),s.d(t,"d",(function(){return i})),s.d(t,"e",(function(){return n})),s.d(t,"b",(function(){return o})),s.d(t,"a",(function(){return a}));const r=0,i=1271266957,n=777e3,o=2147483647,a=""},50:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));class r{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var r,i;(null!==(r=this.listeners[e])&&void 0!==r?r:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(i=s)||void 0===i?void 0:i.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const r=t&&[],i=this.listeners[e];if(i){i.slice().forEach(t=>{var n;if(-1===i.findIndex(e=>e.callback===t.callback))return;let o;try{o=t.callback(...s)}catch(e){console.error(e)}r&&r.push(o),(null===(n=t.options)||void 0===n?void 0:n.once)&&this.removeEventListener(e,t.callback)})}return r}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},52:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));var r=s(76);function i(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((s,r)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,r(...e))}});return t.catch(r.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},53:function(e,t,s){"use strict";function r(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){return e.map(e=>r(e))}let t=new e.constructor;for(var s in e)e.hasOwnProperty(s)&&(t[s]=r(e[s]));return t}s.d(t,"a",(function(){return r}))},66:function(e,t,s){"use strict";s.d(t,"a",(function(){return i})),s.d(t,"b",(function(){return n}));const r={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function i(e){const t=r[e];return crypto.getRandomValues(t),t[0]}function n(){return""+i(32)+i(32)%16777215}},74:function(e,t,s){"use strict";var r=s(30),i=s(75),n=s(168);class o{constructor(){this.prefix="",this.cache={},this.useStorage=!0,i.a.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const s in e)if(e.hasOwnProperty(s)){const r=e[s];if(this.cache[s]=r,this.useStorage&&!t)try{const e=JSON.stringify(r);localStorage.setItem(this.prefix+s,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class a{constructor(){this.taskId=0,this.tasks={},a.STORAGES.push(this),n.c||(this.storage=new o)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((s,r)=>{if(n.c){const r=this.taskId++;this.tasks[r]=s;const i={type:"localStorageProxy",id:r,payload:{type:e,args:t}};Object(n.d)(i)}else{t=Array.prototype.slice.call(t);s(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}a.STORAGES=[];const c=new a;r.a.appStorage=c;t.a=c},75:function(e,t,s){"use strict";const r={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};r.http=location.search.indexOf("http=1")>0,r.http&&(r.transport="https"),t.a=r},76:function(e,t,s){"use strict";function r(){}s.d(t,"a",(function(){return r}))},84:function(e,t,s){"use strict";function r(e){return"object"==typeof e&&null!==e}s.d(t,"a",(function(){return r}))},89:function(e,t,s){"use strict";var r=s(30),i=s(103),n=s(138);const o=new i.a(n.a,"session");r.a.stateStorage=o,t.a=o},93:function(e,t,s){"use strict";function r(e,t=""){let s;const r=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{s=new Blob(e,{type:r})}catch(t){let i=new BlobBuilder;e.forEach(e=>{i.append(e)}),s=i.getBlob(r)}return s}s.d(t,"a",(function(){return r}))},94:function(e,t,s){"use strict";function r(e,t,s=!0){let r,i,n=null;return(...o)=>{r=!0,i=o,n||(s&&(r=!1,e(...i)),n=setInterval(()=>{if(!r)return clearInterval(n),void(n=null);r=!1,e(...i)},t))}}s.d(t,"a",(function(){return r}))}}]); +//# sourceMappingURL=0.2da18beaed4bd7796d8f.chunk.js.map \ No newline at end of file diff --git a/public/0.2da18beaed4bd7796d8f.chunk.js.map b/public/0.2da18beaed4bd7796d8f.chunk.js.map new file mode 100644 index 00000000..ff63cede --- /dev/null +++ b/public/0.2da18beaed4bd7796d8f.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lib/idb.ts","webpack:///./src/lib/storage.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/lib/rootScope.ts","webpack:///./src/helpers/context.ts","webpack:///./src/config/debug.ts","webpack:///./src/lib/logger.ts","webpack:///./src/helpers/object/safeAssign.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/object/copy.ts","webpack:///./src/helpers/random.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/object/isObject.ts","webpack:///./src/lib/stateStorage.ts","webpack:///./src/helpers/blob/blobConstruct.ts","webpack:///./src/helpers/blob/blobSafeMimeType.ts","webpack:///./src/helpers/schedulers/throttle.ts"],"names":["db","storeName","storageIsAvailable","safeAssign","this","test","name","log","logger","openDatabase","STORAGES","push","preserve","forEach","storage","onclose","close","createNew","openDbPromise","request","indexedDB","open","version","Promise","reject","error","message","finished","setTimeout","onerror","type","resolve","onsuccess","event","result","calledNew","e","onabort","transaction","target","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","store","objectStoreNames","contains","os","createObjectStore","indexes","length","index","createIndex","indexName","keyPath","objectParameters","entryName","Array","isArray","concat","getObjectStore","objectStore","map","delete","clear","value","idx","put","fileName","blob","Blob","blobConstruct","save","get","mode","perf","performance","now","then","clearTimeout","timeout","oncomplete","results","r","requests","getAll","noop","cache","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","useStorage","savingFreezed","saveThrottled","throttle","deferred","set","size","keys","from","values","key","console","deleteThrottled","getThrottled","i","includes","undefined","finally","useCache","hasOwnProperty","getFromCache","p","catch","obj","onlyLocal","canUseStorage","setToCache","add","saveLocal","enabled","all","callback","names","err","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","addEventListener","peerId","document","body","classList","toggle","id","myId","status","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","colorScheme","documentElement","setThemeColor","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","args","clients","matchAll","includeUncontrolled","listeners","slice","listener","postMessage","notifyWorker","notifySomeone","bind","DEBUG","debug","MOUNT_CLASS_TO","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","Date","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","object","fromObject","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","EventListenerBase","reuseResults","_constructor","listenerResults","options","once","pop","findAndSplice","l","collectResults","arr","findIndex","removeEventListener","_dispatchEvent","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","cancel","Object","assign","copy","getTime","el","clonedObj","constructor","prop","arrays","8","Uint8Array","16","Uint16Array","32","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","localStorage","getItem","JSON","parse","stringified","stringify","setItem","removeItem","taskId","tasks","task","payload","prototype","call","apply","proxy","sessionStorage","appStorage","Modes","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","transport","isObject","stateStorage","blobParts","mimeType","safeMimeType","blobSafeMimeType","bb","BlobBuilder","blobPart","append","getBlob","fn","ms","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval"],"mappings":"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","file":"0.2da18beaed4bd7796d8f.chunk.js","sourcesContent":["/*\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 blobConstruct from '../helpers/blob/blobConstruct';\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 default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.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\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 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 createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\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({type: '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 // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\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 }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): 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(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\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[]) {\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(', ') : '');\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]) as 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[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): 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 return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\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.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 transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\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 requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\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 * 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\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nexport default class AppStorage, T extends Database/* Storage extends {[name: string]: any} *//* Storage extends Record */> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then(values => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach(storage => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {}\r\n this.STORAGES.forEach(storage => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\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 { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\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 { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_reactions': {message: Message.message, changedResults: ReactionCount[]},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\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\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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 DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\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\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\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\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 noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","export default function copy(obj: T): T {\n //in case of premitives\n if(obj === null || typeof(obj) !== \"object\") {\n return obj;\n }\n \n //date objects should be \n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n \n //handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\n return clonedArr;\n }\n \n //lastly, handle objects\n // @ts-ignore\n let clonedObj = new obj.constructor();\n for(var prop in obj){\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\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\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\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 * 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 Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\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 for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\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 { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\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 { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","export default function noop() {}\r\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\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 { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/1.bf7f14176d3c12040199.chunk.js b/public/1.bf7f14176d3c12040199.chunk.js new file mode 100644 index 00000000..d6ace9a9 --- /dev/null +++ b/public/1.bf7f14176d3c12040199.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{127:function(f,e,d){"use strict";function t(f){const e=Date.now();return f?e/1e3|0:e}d.d(e,"a",(function(){return t}))},128:function(f,e,d){"use strict";d.d(e,"a",(function(){return s})),d.d(e,"c",(function(){return c})),d.d(e,"b",(function(){return n}));const t=new Set(["all","web","webk"]),a=new Set;function s(f){return f.find(f=>t.has(f.platform)&&!a.has(f.reason))}function c(f){return!!s(f)}function n(f){a.clear(),f.forEach(f=>{a.add(f)})}},140:function(f,e,d){"use strict";const t=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp");e.a=t},141:function(f,e,d){"use strict";d.d(e,"a",(function(){return a}));var t=d(38);function a(f,e,d,a,s=!0){if(fd/a?n=e*d/f|0:(c=f*a/e|0,c>d&&(n=n*d/c|0,c=d)),s&&c>=f&&n>=e&&(c=f,n=e),Object(t.c)(c,n)}d(30).a.calcImageInBox=a},157:function(f,e,d){"use strict";const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}};e.a=t},158:function(f,e,d){"use strict";var t=d(30);const a={Emoji:{2049:62748,2122:62776,2139:62801,2194:62678,2195:62677,2196:62676,2197:62670,2198:62672,2199:62674,2328:61155,2600:4954,2601:4962,2602:4977,2603:4982,2604:4984,2611:62764,2614:4978,2615:3750,2618:2639,2620:196,2622:62667,2623:62668,2626:62697,2638:62694,2639:168,2648:62702,2649:62703,2650:62710,2651:62711,2652:62712,2653:62713,2660:51057,2663:51060,2665:51058,2666:51059,2668:4832,2692:61258,2693:4887,2694:61261,2696:61272,2697:61280,2699:61270,2702:61245,2705:62763,2708:4895,2709:61206,2712:61220,2714:62765,2716:62742,2721:62693,2728:5993,2733:62771,2734:62772,2744:4981,2747:62773,2753:62749,2754:62750,2755:62751,2757:62752,2763:1127,2764:1129,2795:62743,2796:62744,2797:62745,2934:62681,2935:62682,3030:62753,3297:62825,3299:62826,"0023-20e3":62777,"002a-20e3":62778,"0030-20e3":62779,"0031-20e3":62780,"0032-20e3":62781,"0033-20e3":62782,"0034-20e3":62783,"0035-20e3":62784,"0036-20e3":62785,"0037-20e3":62786,"0038-20e3":62787,"0039-20e3":62788,"00a9":62774,"00ae":62775,"1f004":51063,"1f0cf":51062,"1f170":62795,"1f171":62797,"1f17e":62806,"1f17f":62808,"1f18e":62796,"1f191":62798,"1f192":62799,"1f193":62800,"1f194":62802,"1f195":62804,"1f196":62805,"1f197":62807,"1f198":62809,"1f199":62810,"1f19a":62811,"1f1e6-1f1e8":71550,"1f1e6-1f1e9":71551,"1f1e6-1f1ea":71552,"1f1e6-1f1eb":71553,"1f1e6-1f1ec":71554,"1f1e6-1f1ee":71555,"1f1e6-1f1f1":71556,"1f1e6-1f1f2":71557,"1f1e6-1f1f4":71558,"1f1e6-1f1f6":71559,"1f1e6-1f1f7":71560,"1f1e6-1f1f8":71561,"1f1e6-1f1f9":71562,"1f1e6-1f1fa":71563,"1f1e6-1f1fc":71564,"1f1e6-1f1fd":71565,"1f1e6-1f1ff":71566,"1f1e7-1f1e6":71567,"1f1e7-1f1e7":71568,"1f1e7-1f1e9":71569,"1f1e7-1f1ea":71570,"1f1e7-1f1eb":71571,"1f1e7-1f1ec":71572,"1f1e7-1f1ed":71573,"1f1e7-1f1ee":71574,"1f1e7-1f1ef":71575,"1f1e7-1f1f1":71576,"1f1e7-1f1f2":71577,"1f1e7-1f1f3":71578,"1f1e7-1f1f4":71579,"1f1e7-1f1f6":71580,"1f1e7-1f1f7":71581,"1f1e7-1f1f8":71582,"1f1e7-1f1f9":71583,"1f1e7-1f1fb":71584,"1f1e7-1f1fc":71585,"1f1e7-1f1fe":71586,"1f1e7-1f1ff":71587,"1f1e8-1f1e6":71588,"1f1e8-1f1e8":71589,"1f1e8-1f1e9":71590,"1f1e8-1f1eb":71591,"1f1e8-1f1ec":71592,"1f1e8-1f1ed":71593,"1f1e8-1f1ee":71594,"1f1e8-1f1f0":71595,"1f1e8-1f1f1":71596,"1f1e8-1f1f2":71597,"1f1e8-1f1f3":71598,"1f1e8-1f1f4":71599,"1f1e8-1f1f5":71600,"1f1e8-1f1f7":71601,"1f1e8-1f1fa":71602,"1f1e8-1f1fb":71603,"1f1e8-1f1fc":71604,"1f1e8-1f1fd":71605,"1f1e8-1f1fe":71606,"1f1e8-1f1ff":71607,"1f1e9-1f1ea":71608,"1f1e9-1f1ec":71609,"1f1e9-1f1ef":71610,"1f1e9-1f1f0":71611,"1f1e9-1f1f2":71612,"1f1e9-1f1f4":71613,"1f1e9-1f1ff":71614,"1f1ea-1f1e6":71615,"1f1ea-1f1e8":71616,"1f1ea-1f1ea":71617,"1f1ea-1f1ec":71618,"1f1ea-1f1ed":71619,"1f1ea-1f1f7":71620,"1f1ea-1f1f8":71621,"1f1ea-1f1f9":71622,"1f1ea-1f1fa":71623,"1f1eb-1f1ee":71624,"1f1eb-1f1ef":71625,"1f1eb-1f1f0":71626,"1f1eb-1f1f2":71627,"1f1eb-1f1f4":71628,"1f1eb-1f1f7":71629,"1f1ec-1f1e6":71630,"1f1ec-1f1e7":71631,"1f1ec-1f1e9":71632,"1f1ec-1f1ea":71633,"1f1ec-1f1eb":71634,"1f1ec-1f1ec":71635,"1f1ec-1f1ed":71636,"1f1ec-1f1ee":71637,"1f1ec-1f1f1":71638,"1f1ec-1f1f2":71639,"1f1ec-1f1f3":71640,"1f1ec-1f1f5":71641,"1f1ec-1f1f6":71642,"1f1ec-1f1f7":71643,"1f1ec-1f1f8":71644,"1f1ec-1f1f9":71645,"1f1ec-1f1fa":71646,"1f1ec-1f1fc":71647,"1f1ec-1f1fe":71648,"1f1ed-1f1f0":71649,"1f1ed-1f1f2":71650,"1f1ed-1f1f3":71651,"1f1ed-1f1f7":71652,"1f1ed-1f1f9":71653,"1f1ed-1f1fa":71654,"1f1ee-1f1e8":71655,"1f1ee-1f1e9":71656,"1f1ee-1f1ea":71657,"1f1ee-1f1f1":71658,"1f1ee-1f1f2":71659,"1f1ee-1f1f3":71660,"1f1ee-1f1f4":71661,"1f1ee-1f1f6":71662,"1f1ee-1f1f7":71663,"1f1ee-1f1f8":71664,"1f1ee-1f1f9":71665,"1f1ef-1f1ea":71666,"1f1ef-1f1f2":71667,"1f1ef-1f1f4":71668,"1f1ef-1f1f5":71669,"1f1f0-1f1ea":71670,"1f1f0-1f1ec":71671,"1f1f0-1f1ed":71672,"1f1f0-1f1ee":71673,"1f1f0-1f1f2":71674,"1f1f0-1f1f3":71675,"1f1f0-1f1f5":71676,"1f1f0-1f1f7":71677,"1f1f0-1f1fc":71678,"1f1f0-1f1fe":71679,"1f1f0-1f1ff":71680,"1f1f1-1f1e6":71681,"1f1f1-1f1e7":71682,"1f1f1-1f1e8":71683,"1f1f1-1f1ee":71684,"1f1f1-1f1f0":71685,"1f1f1-1f1f7":71686,"1f1f1-1f1f8":71687,"1f1f1-1f1f9":71688,"1f1f1-1f1fa":71689,"1f1f1-1f1fb":71690,"1f1f1-1f1fe":71691,"1f1f2-1f1e6":71692,"1f1f2-1f1e8":71693,"1f1f2-1f1e9":71694,"1f1f2-1f1ea":71695,"1f1f2-1f1eb":71696,"1f1f2-1f1ec":71697,"1f1f2-1f1ed":71698,"1f1f2-1f1f0":71699,"1f1f2-1f1f1":71700,"1f1f2-1f1f2":71701,"1f1f2-1f1f3":71702,"1f1f2-1f1f4":71703,"1f1f2-1f1f5":71704,"1f1f2-1f1f6":71705,"1f1f2-1f1f7":71706,"1f1f2-1f1f8":71707,"1f1f2-1f1f9":71708,"1f1f2-1f1fa":71709,"1f1f2-1f1fb":71710,"1f1f2-1f1fc":71711,"1f1f2-1f1fd":71712,"1f1f2-1f1fe":71713,"1f1f2-1f1ff":71714,"1f1f3-1f1e6":71715,"1f1f3-1f1e8":71716,"1f1f3-1f1ea":71717,"1f1f3-1f1eb":71718,"1f1f3-1f1ec":71719,"1f1f3-1f1ee":71720,"1f1f3-1f1f1":71721,"1f1f3-1f1f4":71722,"1f1f3-1f1f5":71723,"1f1f3-1f1f7":71724,"1f1f3-1f1fa":71725,"1f1f3-1f1ff":71726,"1f1f4-1f1f2":71727,"1f1f5-1f1e6":71728,"1f1f5-1f1ea":71729,"1f1f5-1f1eb":71730,"1f1f5-1f1ec":71731,"1f1f5-1f1ed":71732,"1f1f5-1f1f0":71733,"1f1f5-1f1f1":71734,"1f1f5-1f1f2":71735,"1f1f5-1f1f3":71736,"1f1f5-1f1f7":71737,"1f1f5-1f1f8":71738,"1f1f5-1f1f9":71739,"1f1f5-1f1fc":71740,"1f1f5-1f1fe":71741,"1f1f6-1f1e6":71742,"1f1f7-1f1ea":71743,"1f1f7-1f1f4":71744,"1f1f7-1f1f8":71745,"1f1f7-1f1fa":71746,"1f1f7-1f1fc":71747,"1f1f8-1f1e6":71748,"1f1f8-1f1e7":71749,"1f1f8-1f1e8":71750,"1f1f8-1f1e9":71751,"1f1f8-1f1ea":71752,"1f1f8-1f1ec":71753,"1f1f8-1f1ed":71754,"1f1f8-1f1ee":71755,"1f1f8-1f1ef":71756,"1f1f8-1f1f0":71757,"1f1f8-1f1f1":71758,"1f1f8-1f1f2":71759,"1f1f8-1f1f3":71760,"1f1f8-1f1f4":71761,"1f1f8-1f1f7":71762,"1f1f8-1f1f8":71763,"1f1f8-1f1f9":71764,"1f1f8-1f1fb":71765,"1f1f8-1f1fd":71766,"1f1f8-1f1fe":71767,"1f1f8-1f1ff":71768,"1f1f9-1f1e6":71769,"1f1f9-1f1e8":71770,"1f1f9-1f1e9":71771,"1f1f9-1f1eb":71772,"1f1f9-1f1ec":71773,"1f1f9-1f1ed":71774,"1f1f9-1f1ef":71775,"1f1f9-1f1f0":71776,"1f1f9-1f1f1":71777,"1f1f9-1f1f2":71778,"1f1f9-1f1f3":71779,"1f1f9-1f1f4":71780,"1f1f9-1f1f7":71781,"1f1f9-1f1f9":71782,"1f1f9-1f1fb":71783,"1f1f9-1f1fc":71784,"1f1f9-1f1ff":71785,"1f1fa-1f1e6":71786,"1f1fa-1f1ec":71787,"1f1fa-1f1f2":71788,"1f1fa-1f1f3":71789,"1f1fa-1f1f8":71790,"1f1fa-1f1fe":71791,"1f1fa-1f1ff":71792,"1f1fb-1f1e6":71793,"1f1fb-1f1e8":71794,"1f1fb-1f1ea":71795,"1f1fb-1f1ec":71796,"1f1fb-1f1ee":71797,"1f1fb-1f1f3":71798,"1f1fb-1f1fa":71799,"1f1fc-1f1eb":71800,"1f1fc-1f1f8":71801,"1f1fd-1f1f0":71802,"1f1fe-1f1ea":71803,"1f1fe-1f1f9":71804,"1f1ff-1f1e6":71805,"1f1ff-1f1f2":71806,"1f1ff-1f1fc":71807,"1f201":62812,"1f202":62813,"1f21a":62819,"1f22f":62816,"1f232":62820,"1f233":62824,"1f234":62823,"1f235":62828,"1f236":62815,"1f237":62814,"1f238":62822,"1f239":62818,"1f23a":62827,"1f250":62817,"1f251":62821,"1f300":4974,"1f301":4824,"1f302":4976,"1f303":4825,"1f304":4827,"1f305":4828,"1f306":4829,"1f307":4830,"1f308":4975,"1f309":4831,"1f30a":4987,"1f30b":4782,"1f30c":4961,"1f30d":4773,"1f30e":4774,"1f30f":4775,"1f310":4776,"1f311":4941,"1f312":4942,"1f313":4943,"1f314":4944,"1f315":4945,"1f316":4946,"1f317":4947,"1f318":4948,"1f319":4949,"1f31a":4950,"1f31b":4951,"1f31c":4952,"1f31d":4955,"1f31e":4956,"1f31f":4959,"1f320":4960,"1f321":4953,"1f324":4965,"1f325":4966,"1f326":4967,"1f327":4968,"1f328":4969,"1f329":4970,"1f32a":4971,"1f32b":4972,"1f32c":4973,"1f32d":3694,"1f32e":3696,"1f32f":3697,"1f330":3677,"1f331":2631,"1f332":2633,"1f333":2634,"1f334":2635,"1f335":2636,"1f336":3668,"1f337":2630,"1f338":2622,"1f339":2625,"1f33a":2627,"1f33b":2628,"1f33c":2629,"1f33d":3667,"1f33e":2637,"1f33f":2638,"1f340":2640,"1f341":2641,"1f342":2642,"1f343":2643,"1f344":3675,"1f345":3660,"1f346":3664,"1f347":3644,"1f348":3645,"1f349":3646,"1f34a":3647,"1f34b":3648,"1f34c":3649,"1f34d":3650,"1f34e":3652,"1f34f":3653,"1f350":3654,"1f351":3655,"1f352":3656,"1f353":3657,"1f354":3691,"1f355":3693,"1f356":3687,"1f357":3688,"1f358":3713,"1f359":3714,"1f35a":3715,"1f35b":3716,"1f35c":3717,"1f35d":3718,"1f35e":3678,"1f35f":3692,"1f360":3719,"1f361":3725,"1f362":3720,"1f363":3721,"1f364":3722,"1f365":3723,"1f366":3734,"1f367":3735,"1f368":3736,"1f369":3737,"1f36a":3738,"1f36b":3743,"1f36c":3744,"1f36d":3745,"1f36e":3746,"1f36f":3747,"1f370":3740,"1f371":3712,"1f372":3704,"1f373":3702,"1f374":3769,"1f375":3752,"1f376":3753,"1f377":3755,"1f378":3756,"1f379":3757,"1f37a":3758,"1f37b":3759,"1f37c":3748,"1f37d":3768,"1f37e":3754,"1f37f":3708,"1f380":51004,"1f381":51005,"1f382":3739,"1f383":5988,"1f384":5989,"1f385":1490,"1f386":5990,"1f387":5991,"1f388":5994,"1f389":5995,"1f38a":5996,"1f38b":5997,"1f38c":71544,"1f38d":5998,"1f38e":5999,"1f38f":51e3,"1f390":51001,"1f391":51002,"1f392":61096,"1f393":61109,"1f396":51009,"1f397":51006,"1f399":61129,"1f39a":61130,"1f39b":61131,"1f39e":61164,"1f39f":51007,"1f3a0":4833,"1f3a1":4834,"1f3a2":4835,"1f3a3":51036,"1f3a4":61132,"1f3a5":61163,"1f3a6":62733,"1f3a7":61133,"1f3a8":51067,"1f3a9":61108,"1f3aa":4837,"1f3ab":51008,"1f3ac":61166,"1f3ad":51065,"1f3ae":51049,"1f3af":51042,"1f3b0":51051,"1f3b1":51045,"1f3b2":51052,"1f3b3":51024,"1f3b4":51064,"1f3b5":61127,"1f3b6":61128,"1f3b7":61135,"1f3b8":61137,"1f3b9":61138,"1f3ba":61139,"1f3bb":61140,"1f3bc":61126,"1f3bd":51038,"1f3be":51022,"1f3bf":51039,"1f3c0":51018,"1f3c1":71542,"1f3c2":1562,"1f3c3-200d-2640":1546,"1f3c3-200d-2642":1545,"1f3c3":1544,"1f3c4-200d-2640":1568,"1f3c4-200d-2642":1567,"1f3c4":1566,"1f3c5":51011,"1f3c6":51010,"1f3c7":1560,"1f3c8":51020,"1f3c9":51021,"1f3ca-200d-2640":1574,"1f3ca-200d-2642":1573,"1f3ca":1572,"1f3cb-200d-2640":1580,"1f3cb-200d-2642":1579,"1f3cb":1578,"1f3cc-200d-2640":1565,"1f3cc-200d-2642":1564,"1f3cc":1563,"1f3cd":4868,"1f3ce":4867,"1f3cf":51025,"1f3d0":51019,"1f3d1":51026,"1f3d2":51027,"1f3d3":51029,"1f3d4":4780,"1f3d5":4784,"1f3d6":4785,"1f3d7":4791,"1f3d8":4796,"1f3d9":4826,"1f3da":4797,"1f3db":4790,"1f3dc":4786,"1f3dd":4787,"1f3de":4788,"1f3df":4789,"1f3e0":4798,"1f3e1":4799,"1f3e2":4800,"1f3e3":4801,"1f3e4":4802,"1f3e5":4803,"1f3e6":4804,"1f3e7":62643,"1f3e8":4805,"1f3e9":4806,"1f3ea":4807,"1f3eb":4808,"1f3ec":4809,"1f3ed":4810,"1f3ee":61177,"1f3ef":4811,"1f3f0":4812,"1f3f3-200d-1f308":71547,"1f3f3-200d-26a7":71548,"1f3f3":71546,"1f3f4-200d-2620":71549,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71808,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71809,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71810,"1f3f4":71545,"1f3f5":2624,"1f3f7":61195,"1f3f8":51030,"1f3f9":61264,"1f3fa":3772,"1f3fb":9499,"1f3fc":9500,"1f3fd":9501,"1f3fe":9502,"1f3ff":9503,"1f400":2550,"1f401":2549,"1f402":2530,"1f403":2531,"1f404":2532,"1f405":2521,"1f406":2522,"1f407":2553,"1f408-200d-2b1b":2518,"1f408":2517,"1f409":2592,"1f40a":2587,"1f40b":2596,"1f40c":2605,"1f40d":2590,"1f40e":2524,"1f40f":2537,"1f410":2539,"1f411":2538,"1f412":2505,"1f413":2570,"1f414":2569,"1f415-200d-1f9ba":2511,"1f415":2509,"1f416":2534,"1f417":2535,"1f418":2544,"1f419":2603,"1f41a":2604,"1f41b":2607,"1f41c":2608,"1f41d":2609,"1f41e":2611,"1f41f":2599,"1f420":2600,"1f421":2601,"1f422":2588,"1f423":2571,"1f424":2572,"1f425":2573,"1f426":2574,"1f427":2575,"1f428":2560,"1f429":2512,"1f42a":2540,"1f42b":2541,"1f42c":2597,"1f42d":2548,"1f42e":2529,"1f42f":2520,"1f430":2552,"1f431":2516,"1f432":2591,"1f433":2595,"1f434":2523,"1f435":2504,"1f436":2508,"1f437":2533,"1f438":2586,"1f439":2551,"1f43a":2513,"1f43b-200d-2744":2559,"1f43b":2558,"1f43c":2561,"1f43d":2536,"1f43e":2567,"1f43f":2554,"1f440":1350,"1f441-200d-1f5e8":1147,"1f441":1351,"1f442":1342,"1f443":1344,"1f444":1353,"1f445":1352,"1f446":1318,"1f447":1320,"1f448":1316,"1f449":1317,"1f44a":1325,"1f44b":1303,"1f44c":1308,"1f44d":1322,"1f44e":1323,"1f44f":1328,"1f450":1330,"1f451":61106,"1f452":61107,"1f453":61072,"1f454":61077,"1f455":61078,"1f456":61079,"1f457":61084,"1f458":61085,"1f459":61090,"1f45a":61091,"1f45b":61092,"1f45c":61093,"1f45d":61094,"1f45e":61098,"1f45f":61099,"1f460":61102,"1f461":61103,"1f462":61105,"1f463":1649,"1f464":1646,"1f465":1647,"1f466":1356,"1f467":1357,"1f468-200d-1f33e":1423,"1f468-200d-1f373":1426,"1f468-200d-1f37c":1487,"1f468-200d-1f393":1414,"1f468-200d-1f3a4":1444,"1f468-200d-1f3a8":1447,"1f468-200d-1f3eb":1417,"1f468-200d-1f3ed":1432,"1f468-200d-1f466-200d-1f466":1636,"1f468-200d-1f466":1635,"1f468-200d-1f467-200d-1f466":1638,"1f468-200d-1f467-200d-1f467":1639,"1f468-200d-1f467":1637,"1f468-200d-1f468-200d-1f466":1625,"1f468-200d-1f468-200d-1f466-200d-1f466":1628,"1f468-200d-1f468-200d-1f467":1626,"1f468-200d-1f468-200d-1f467-200d-1f466":1627,"1f468-200d-1f468-200d-1f467-200d-1f467":1629,"1f468-200d-1f469-200d-1f466":1620,"1f468-200d-1f469-200d-1f466-200d-1f466":1623,"1f468-200d-1f469-200d-1f467":1621,"1f468-200d-1f469-200d-1f467-200d-1f466":1622,"1f468-200d-1f469-200d-1f467-200d-1f467":1624,"1f468-200d-1f4bb":1441,"1f468-200d-1f4bc":1435,"1f468-200d-1f527":1429,"1f468-200d-1f52c":1438,"1f468-200d-1f680":1453,"1f468-200d-1f692":1456,"1f468-200d-1f9af":1536,"1f468-200d-1f9b0":1362,"1f468-200d-1f9b1":1363,"1f468-200d-1f9b2":1365,"1f468-200d-1f9b3":1364,"1f468-200d-1f9bc":1539,"1f468-200d-1f9bd":1542,"1f468-200d-2695":1411,"1f468-200d-2696":1420,"1f468-200d-2708":1450,"1f468-200d-2764-200d-1f468":1617,"1f468-200d-2764-200d-1f48b-200d-1f468":1613,"1f468":1360,"1f469-200d-1f33e":1424,"1f469-200d-1f373":1427,"1f469-200d-1f37c":1486,"1f469-200d-1f393":1415,"1f469-200d-1f3a4":1445,"1f469-200d-1f3a8":1448,"1f469-200d-1f3eb":1418,"1f469-200d-1f3ed":1433,"1f469-200d-1f466-200d-1f466":1641,"1f469-200d-1f466":1640,"1f469-200d-1f467-200d-1f466":1643,"1f469-200d-1f467-200d-1f467":1644,"1f469-200d-1f467":1642,"1f469-200d-1f469-200d-1f466":1630,"1f469-200d-1f469-200d-1f466-200d-1f466":1633,"1f469-200d-1f469-200d-1f467":1631,"1f469-200d-1f469-200d-1f467-200d-1f466":1632,"1f469-200d-1f469-200d-1f467-200d-1f467":1634,"1f469-200d-1f4bb":1442,"1f469-200d-1f4bc":1436,"1f469-200d-1f527":1430,"1f469-200d-1f52c":1439,"1f469-200d-1f680":1454,"1f469-200d-1f692":1457,"1f469-200d-1f9af":1537,"1f469-200d-1f9b0":1367,"1f469-200d-1f9b1":1369,"1f469-200d-1f9b2":1373,"1f469-200d-1f9b3":1371,"1f469-200d-1f9bc":1540,"1f469-200d-1f9bd":1543,"1f469-200d-2695":1412,"1f469-200d-2696":1421,"1f469-200d-2708":1451,"1f469-200d-2764-200d-1f468":1616,"1f469-200d-2764-200d-1f469":1618,"1f469-200d-2764-200d-1f48b-200d-1f468":1612,"1f469-200d-2764-200d-1f48b-200d-1f469":1614,"1f469":1366,"1f46a":1619,"1f46b":1609,"1f46c":1610,"1f46d":1608,"1f46e-200d-2640":1460,"1f46e-200d-2642":1459,"1f46e":1458,"1f46f-200d-2640":1552,"1f46f-200d-2642":1551,"1f46f":1550,"1f470-200d-2640":1483,"1f470-200d-2642":1482,"1f470":1481,"1f471-200d-2640":1375,"1f471-200d-2642":1376,"1f471":1359,"1f472":1476,"1f473-200d-2640":1475,"1f473-200d-2642":1474,"1f473":1473,"1f474":1378,"1f475":1379,"1f476":1354,"1f477-200d-2640":1470,"1f477-200d-2642":1469,"1f477":1468,"1f478":1472,"1f479":199,"1f47a":1100,"1f47b":1101,"1f47c":1489,"1f47d":1102,"1f47e":1103,"1f47f":194,"1f480":195,"1f481-200d-2640":1394,"1f481-200d-2642":1393,"1f481":1392,"1f482-200d-2640":1466,"1f482-200d-2642":1465,"1f482":1464,"1f483":1547,"1f484":61114,"1f485":1335,"1f486-200d-2640":1522,"1f486-200d-2642":1521,"1f486":1520,"1f487-200d-2640":1525,"1f487-200d-2642":1524,"1f487":1523,"1f488":4836,"1f489":61287,"1f48a":61289,"1f48b":1117,"1f48c":1118,"1f48d":61115,"1f48e":61116,"1f48f":1611,"1f490":2621,"1f491":1615,"1f492":4813,"1f493":1123,"1f494":1128,"1f495":1125,"1f496":1121,"1f497":1122,"1f498":1119,"1f499":1133,"1f49a":1132,"1f49b":1131,"1f49c":1134,"1f49d":1120,"1f49e":1124,"1f49f":1126,"1f4a0":62859,"1f4a1":61175,"1f4a2":1139,"1f4a3":1145,"1f4a4":1151,"1f4a5":1140,"1f4a6":1142,"1f4a7":4986,"1f4a8":1143,"1f4a9":197,"1f4aa":1337,"1f4ab":1141,"1f4ac":1146,"1f4ad":1150,"1f4ae":2623,"1f4af":1138,"1f4b0":61196,"1f4b1":62754,"1f4b2":62755,"1f4b3":61203,"1f4b4":61198,"1f4b5":61199,"1f4b6":61200,"1f4b7":61201,"1f4b8":61202,"1f4b9":61205,"1f4ba":4900,"1f4bb":61152,"1f4bc":61226,"1f4bd":61158,"1f4be":61159,"1f4bf":61160,"1f4c0":61161,"1f4c1":61227,"1f4c2":61228,"1f4c3":61188,"1f4c4":61190,"1f4c5":61230,"1f4c6":61231,"1f4c7":61234,"1f4c8":61235,"1f4c9":61236,"1f4ca":61237,"1f4cb":61238,"1f4cc":61239,"1f4cd":61240,"1f4ce":61241,"1f4cf":61243,"1f4d0":61244,"1f4d1":61193,"1f4d2":61187,"1f4d3":61186,"1f4d4":61179,"1f4d5":61180,"1f4d6":61181,"1f4d7":61182,"1f4d8":61183,"1f4d9":61184,"1f4da":61185,"1f4db":62760,"1f4dc":61189,"1f4dd":61225,"1f4de":61147,"1f4df":61148,"1f4e0":61149,"1f4e1":61286,"1f4e2":61121,"1f4e3":61122,"1f4e4":61210,"1f4e5":61211,"1f4e6":61212,"1f4e7":61207,"1f4e8":61208,"1f4e9":61209,"1f4ea":61214,"1f4eb":61213,"1f4ec":61215,"1f4ed":61216,"1f4ee":61217,"1f4ef":61123,"1f4f0":61191,"1f4f1":61144,"1f4f2":61145,"1f4f3":62737,"1f4f4":62738,"1f4f5":62665,"1f4f6":62736,"1f4f7":61168,"1f4f8":61169,"1f4f9":61170,"1f4fa":61167,"1f4fb":61134,"1f4fc":61171,"1f4fd":61165,"1f4ff":61113,"1f500":62715,"1f501":62716,"1f502":62717,"1f503":62683,"1f504":62684,"1f505":62734,"1f506":62735,"1f507":61117,"1f508":61118,"1f509":61119,"1f50a":61120,"1f50b":61150,"1f50c":61151,"1f50d":61172,"1f50e":61173,"1f50f":61251,"1f510":61252,"1f511":61253,"1f512":61249,"1f513":61250,"1f514":61124,"1f515":61125,"1f516":61194,"1f517":61274,"1f518":62860,"1f519":62685,"1f51a":62686,"1f51b":62687,"1f51c":62688,"1f51d":62689,"1f51e":62666,"1f51f":62789,"1f520":62790,"1f521":62791,"1f522":62792,"1f523":62793,"1f524":62794,"1f525":4985,"1f526":61176,"1f527":61267,"1f528":61255,"1f529":61269,"1f52a":3771,"1f52b":61262,"1f52c":61284,"1f52d":61285,"1f52e":51046,"1f52f":62701,"1f530":62761,"1f531":62759,"1f532":62862,"1f533":62861,"1f534":62829,"1f535":62833,"1f536":62853,"1f537":62854,"1f538":62855,"1f539":62856,"1f53a":62857,"1f53b":62858,"1f53c":62725,"1f53d":62727,"1f549":62692,"1f54a":2576,"1f54b":4821,"1f54c":4817,"1f54d":4819,"1f54e":62700,"1f550":4919,"1f551":4921,"1f552":4923,"1f553":4925,"1f554":4927,"1f555":4929,"1f556":4931,"1f557":4933,"1f558":4935,"1f559":4937,"1f55a":4939,"1f55b":4917,"1f55c":4920,"1f55d":4922,"1f55e":4924,"1f55f":4926,"1f560":4928,"1f561":4930,"1f562":4932,"1f563":4934,"1f564":4936,"1f565":4938,"1f566":4940,"1f567":4918,"1f56f":61174,"1f570":4916,"1f573":1144,"1f574":1549,"1f575-200d-2640":1463,"1f575-200d-2642":1462,"1f575":1461,"1f576":61073,"1f577":2614,"1f578":2615,"1f579":51050,"1f57a":1548,"1f587":61242,"1f58a":61222,"1f58b":61221,"1f58c":61223,"1f58d":61224,"1f590":1305,"1f595":1319,"1f596":1307,"1f5a4":1136,"1f5a5":61153,"1f5a8":61154,"1f5b1":61156,"1f5b2":61157,"1f5bc":51066,"1f5c2":61229,"1f5c3":61246,"1f5c4":61247,"1f5d1":61248,"1f5d2":61232,"1f5d3":61233,"1f5dc":61271,"1f5dd":61254,"1f5de":61192,"1f5e1":61260,"1f5e3":1645,"1f5e8":1148,"1f5ef":1149,"1f5f3":61218,"1f5fa":4777,"1f5fb":4783,"1f5fc":4814,"1f5fd":4815,"1f5fe":4778,"1f5ff":61320,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":113,"1f608":193,"1f609":111,"1f60a":112,"1f60b":123,"1f60c":143,"1f60d":115,"1f60e":162,"1f60f":138,"1f610":135,"1f611":136,"1f612":139,"1f613":185,"1f614":144,"1f615":165,"1f616":182,"1f617":118,"1f618":117,"1f619":121,"1f61a":120,"1f61b":124,"1f61c":125,"1f61d":127,"1f61e":184,"1f61f":166,"1f620":191,"1f621":190,"1f622":179,"1f623":183,"1f624":189,"1f625":178,"1f626":174,"1f627":175,"1f628":176,"1f629":186,"1f62a":145,"1f62b":187,"1f62c":141,"1f62d":180,"1f62e":169,"1f62f":170,"1f630":177,"1f631":181,"1f632":171,"1f633":172,"1f634":147,"1f635":157,"1f636":137,"1f637":148,"1f638":1106,"1f639":1107,"1f63a":1105,"1f63b":1108,"1f63c":1109,"1f63d":1110,"1f63e":1113,"1f63f":1112,"1f640":1111,"1f641":167,"1f642":19,"1f643":110,"1f644":140,"1f645-200d-2640":1388,"1f645-200d-2642":1387,"1f645":1386,"1f646-200d-2640":1391,"1f646-200d-2642":1390,"1f646":1389,"1f647-200d-2640":1403,"1f647-200d-2642":1402,"1f647":1401,"1f648":1114,"1f649":1115,"1f64a":1116,"1f64b-200d-2640":1397,"1f64b-200d-2642":1396,"1f64b":1395,"1f64c":1329,"1f64d-200d-2640":1382,"1f64d-200d-2642":1381,"1f64d":1380,"1f64e-200d-2640":1385,"1f64e-200d-2642":1384,"1f64e":1383,"1f64f":1333,"1f680":4906,"1f681":4901,"1f682":4838,"1f683":4839,"1f684":4840,"1f685":4841,"1f686":4842,"1f687":4843,"1f688":4844,"1f689":4845,"1f68a":4846,"1f68b":4849,"1f68c":4850,"1f68d":4851,"1f68e":4852,"1f68f":4877,"1f690":4853,"1f691":4854,"1f692":4855,"1f693":4856,"1f694":4857,"1f695":4858,"1f696":4859,"1f697":4860,"1f698":4861,"1f699":4862,"1f69a":4864,"1f69b":4865,"1f69c":4866,"1f69d":4847,"1f69e":4848,"1f69f":4902,"1f6a0":4903,"1f6a1":4904,"1f6a2":4894,"1f6a3-200d-2640":1571,"1f6a3-200d-2642":1570,"1f6a3":1569,"1f6a4":4890,"1f6a5":4883,"1f6a6":4884,"1f6a7":4886,"1f6a8":4882,"1f6a9":71543,"1f6aa":61292,"1f6ab":62659,"1f6ac":61316,"1f6ad":62661,"1f6ae":62644,"1f6af":62662,"1f6b0":62645,"1f6b1":62663,"1f6b2":4873,"1f6b3":62660,"1f6b4-200d-2640":1583,"1f6b4-200d-2642":1582,"1f6b4":1581,"1f6b5-200d-2640":1586,"1f6b5-200d-2642":1585,"1f6b5":1584,"1f6b6-200d-2640":1528,"1f6b6-200d-2642":1527,"1f6b6":1526,"1f6b7":62664,"1f6b8":62657,"1f6b9":62647,"1f6ba":62648,"1f6bb":62649,"1f6bc":62650,"1f6bd":61299,"1f6be":62651,"1f6bf":61301,"1f6c0":1605,"1f6c1":61302,"1f6c2":62652,"1f6c3":62653,"1f6c4":62654,"1f6c5":62655,"1f6cb":61297,"1f6cc":1606,"1f6cd":61095,"1f6ce":4908,"1f6cf":61296,"1f6d0":62690,"1f6d1":4885,"1f6d2":61315,"1f6d5":4818,"1f6d6":4795,"1f6d7":61293,"1f6e0":61259,"1f6e1":61265,"1f6e2":4880,"1f6e3":4878,"1f6e4":4879,"1f6e5":4893,"1f6e9":4896,"1f6eb":4897,"1f6ec":4898,"1f6f0":4905,"1f6f3":4891,"1f6f4":4874,"1f6f5":4869,"1f6f6":4889,"1f6f7":51040,"1f6f8":4907,"1f6f9":4875,"1f6fa":4872,"1f6fb":4863,"1f6fc":4876,"1f7e0":62830,"1f7e1":62831,"1f7e2":62832,"1f7e3":62834,"1f7e4":62835,"1f7e5":62838,"1f7e6":62842,"1f7e7":62839,"1f7e8":62840,"1f7e9":62841,"1f7ea":62843,"1f7eb":62844,"1f90c":1309,"1f90d":1137,"1f90e":1135,"1f90f":1310,"1f910":133,"1f911":128,"1f912":149,"1f913":163,"1f914":132,"1f915":150,"1f916":1104,"1f917":129,"1f918":1314,"1f919":1315,"1f91a":1304,"1f91b":1326,"1f91c":1327,"1f91d":1332,"1f91e":1312,"1f91f":1313,"1f920":159,"1f921":198,"1f922":151,"1f923":17,"1f924":146,"1f925":142,"1f926-200d-2640":1406,"1f926-200d-2642":1405,"1f926":1404,"1f927":153,"1f928":134,"1f929":116,"1f92a":126,"1f92b":131,"1f92c":192,"1f92d":130,"1f92e":152,"1f92f":158,"1f930":1484,"1f931":1485,"1f932":1331,"1f933":1336,"1f934":1471,"1f935-200d-2640":1480,"1f935-200d-2642":1479,"1f935":1478,"1f936":1491,"1f937-200d-2640":1409,"1f937-200d-2642":1408,"1f937":1407,"1f938-200d-2640":1589,"1f938-200d-2642":1588,"1f938":1587,"1f939-200d-2640":1601,"1f939-200d-2642":1600,"1f939":1599,"1f93a":1559,"1f93c-200d-2640":1592,"1f93c-200d-2642":1591,"1f93c":1590,"1f93d-200d-2640":1595,"1f93d-200d-2642":1594,"1f93d":1593,"1f93e-200d-2640":1598,"1f93e-200d-2642":1597,"1f93e":1596,"1f93f":51037,"1f940":2626,"1f941":61142,"1f942":3760,"1f943":3761,"1f944":3770,"1f945":51033,"1f947":51012,"1f948":51013,"1f949":51014,"1f94a":51031,"1f94b":51032,"1f94c":51041,"1f94d":51028,"1f94e":51017,"1f94f":51023,"1f950":3679,"1f951":3663,"1f952":3670,"1f953":3690,"1f954":3665,"1f955":3666,"1f956":3680,"1f957":3707,"1f958":3703,"1f959":3699,"1f95a":3701,"1f95b":3749,"1f95c":3676,"1f95d":3659,"1f95e":3684,"1f95f":3726,"1f960":3727,"1f961":3728,"1f962":3767,"1f963":3706,"1f964":3762,"1f965":3662,"1f966":3672,"1f967":3742,"1f968":3682,"1f969":3689,"1f96a":3695,"1f96b":3711,"1f96c":3671,"1f96d":3651,"1f96e":3724,"1f96f":3683,"1f970":114,"1f971":188,"1f972":122,"1f973":160,"1f974":156,"1f975":154,"1f976":155,"1f977":1467,"1f978":161,"1f97a":173,"1f97b":61086,"1f97c":61075,"1f97d":61074,"1f97e":61100,"1f97f":61101,"1f980":3729,"1f981":2519,"1f982":2616,"1f983":2568,"1f984":2525,"1f985":2577,"1f986":2578,"1f987":2557,"1f988":2602,"1f989":2580,"1f98a":2514,"1f98b":2606,"1f98c":2527,"1f98d":2506,"1f98e":2589,"1f98f":2546,"1f990":3731,"1f991":3732,"1f992":2543,"1f993":2526,"1f994":2556,"1f995":2593,"1f996":2594,"1f997":2612,"1f998":2565,"1f999":2542,"1f99a":2584,"1f99b":2547,"1f99c":2585,"1f99d":2515,"1f99e":3730,"1f99f":2617,"1f9a0":2620,"1f9a1":2566,"1f9a2":2579,"1f9a3":2545,"1f9a4":2581,"1f9a5":2562,"1f9a6":2563,"1f9a7":2507,"1f9a8":2564,"1f9a9":2583,"1f9aa":3733,"1f9ab":2555,"1f9ac":2528,"1f9ad":2598,"1f9ae":2510,"1f9af":61273,"1f9b4":1349,"1f9b5":1340,"1f9b6":1341,"1f9b7":1348,"1f9b8-200d-2640":1495,"1f9b8-200d-2642":1494,"1f9b8":1493,"1f9b9-200d-2640":1498,"1f9b9-200d-2642":1497,"1f9b9":1496,"1f9ba":61076,"1f9bb":1343,"1f9bc":4871,"1f9bd":4870,"1f9be":1338,"1f9bf":1339,"1f9c0":3686,"1f9c1":3741,"1f9c2":3710,"1f9c3":3764,"1f9c4":3673,"1f9c5":3674,"1f9c6":3700,"1f9c7":3685,"1f9c8":3709,"1f9c9":3765,"1f9ca":3766,"1f9cb":3763,"1f9cd-200d-2640":1531,"1f9cd-200d-2642":1530,"1f9cd":1529,"1f9ce-200d-2640":1534,"1f9ce-200d-2642":1533,"1f9ce":1532,"1f9cf-200d-2640":1400,"1f9cf-200d-2642":1399,"1f9cf":1398,"1f9d0":164,"1f9d1-200d-1f33e":1422,"1f9d1-200d-1f373":1425,"1f9d1-200d-1f37c":1488,"1f9d1-200d-1f384":1492,"1f9d1-200d-1f393":1413,"1f9d1-200d-1f3a4":1443,"1f9d1-200d-1f3a8":1446,"1f9d1-200d-1f3eb":1416,"1f9d1-200d-1f3ed":1431,"1f9d1-200d-1f4bb":1440,"1f9d1-200d-1f4bc":1434,"1f9d1-200d-1f527":1428,"1f9d1-200d-1f52c":1437,"1f9d1-200d-1f680":1452,"1f9d1-200d-1f692":1455,"1f9d1-200d-1f91d-200d-1f9d1":1607,"1f9d1-200d-1f9af":1535,"1f9d1-200d-1f9b0":1368,"1f9d1-200d-1f9b1":1370,"1f9d1-200d-1f9b2":1374,"1f9d1-200d-1f9b3":1372,"1f9d1-200d-1f9bc":1538,"1f9d1-200d-1f9bd":1541,"1f9d1-200d-2695":1410,"1f9d1-200d-2696":1419,"1f9d1-200d-2708":1449,"1f9d1":1358,"1f9d2":1355,"1f9d3":1377,"1f9d4":1361,"1f9d5":1477,"1f9d6-200d-2640":1555,"1f9d6-200d-2642":1554,"1f9d6":1553,"1f9d7-200d-2640":1558,"1f9d7-200d-2642":1557,"1f9d7":1556,"1f9d8-200d-2640":1604,"1f9d8-200d-2642":1603,"1f9d8":1602,"1f9d9-200d-2640":1501,"1f9d9-200d-2642":1500,"1f9d9":1499,"1f9da-200d-2640":1504,"1f9da-200d-2642":1503,"1f9da":1502,"1f9db-200d-2640":1507,"1f9db-200d-2642":1506,"1f9db":1505,"1f9dc-200d-2640":1510,"1f9dc-200d-2642":1509,"1f9dc":1508,"1f9dd-200d-2640":1513,"1f9dd-200d-2642":1512,"1f9dd":1511,"1f9de-200d-2640":1516,"1f9de-200d-2642":1515,"1f9de":1514,"1f9df-200d-2640":1519,"1f9df-200d-2642":1518,"1f9df":1517,"1f9e0":1345,"1f9e1":1130,"1f9e2":61110,"1f9e3":61080,"1f9e4":61081,"1f9e5":61082,"1f9e6":61083,"1f9e7":51003,"1f9e8":5992,"1f9e9":51053,"1f9ea":61281,"1f9eb":61282,"1f9ec":61283,"1f9ed":4779,"1f9ee":61162,"1f9ef":61314,"1f9f0":61277,"1f9f1":4792,"1f9f2":61278,"1f9f3":4909,"1f9f4":61305,"1f9f5":51068,"1f9f6":51070,"1f9f7":61306,"1f9f8":51054,"1f9f9":61307,"1f9fa":61308,"1f9fb":61309,"1f9fc":61311,"1f9fd":61313,"1f9fe":61204,"1f9ff":51048,"1fa70":61104,"1fa71":61087,"1fa72":61088,"1fa73":61089,"1fa74":61097,"1fa78":61288,"1fa79":61290,"1fa7a":61291,"1fa80":51043,"1fa81":51044,"1fa82":4899,"1fa83":61263,"1fa84":51047,"1fa85":51055,"1fa86":51056,"1fa90":4957,"1fa91":61298,"1fa92":61304,"1fa93":61256,"1fa94":61178,"1fa95":61141,"1fa96":61111,"1fa97":61136,"1fa98":61143,"1fa99":61197,"1fa9a":61266,"1fa9b":61268,"1fa9c":61279,"1fa9d":61276,"1fa9e":61294,"1fa9f":61295,"1faa0":61300,"1faa1":51069,"1faa2":51071,"1faa3":61310,"1faa4":61303,"1faa5":61312,"1faa6":61318,"1faa7":61321,"1faa8":4793,"1fab0":2618,"1fab1":2619,"1fab2":2610,"1fab3":2613,"1fab4":2632,"1fab5":4794,"1fab6":2582,"1fac0":1346,"1fac1":1347,"1fac2":1648,"1fad0":3658,"1fad1":3669,"1fad2":3661,"1fad3":3681,"1fad4":3698,"1fad5":3705,"1fad6":3751,"203c":62747,"21a9":62679,"21aa":62680,"231a":4912,"231b":4910,"23cf":62732,"23e9":62719,"23ea":62723,"23eb":62726,"23ec":62728,"23ed":62720,"23ee":62724,"23ef":62721,"23f0":4913,"23f1":4914,"23f2":4915,"23f3":4911,"23f8":62729,"23f9":62730,"23fa":62731,"24c2":62803,"25aa":62851,"25ab":62852,"25b6":62718,"25c0":62722,"25fb":62848,"25fc":62847,"25fd":62850,"25fe":62849,"260e":61146,"261d":1321,"262a":62698,"262e":62699,"262f":62695,"263a":119,"264a":62704,"264b":62705,"264c":62706,"264d":62707,"264e":62708,"264f":62709,"265f":51061,"267b":62757,"267e":62746,"267f":62646,"269b":62691,"269c":62758,"26a0":62656,"26a1":4980,"26a7":62741,"26aa":62837,"26ab":62836,"26b0":61317,"26b1":61319,"26bd":51015,"26be":51016,"26c4":4983,"26c5":4963,"26c8":4964,"26ce":62714,"26cf":61257,"26d1":61112,"26d3":61275,"26d4":62658,"26e9":4820,"26ea":4816,"26f0":4781,"26f1":4979,"26f2":4822,"26f3":51034,"26f4":4892,"26f5":4888,"26f7":1561,"26f8":51035,"26f9-200d-2640":1577,"26f9-200d-2642":1576,"26f9":1575,"26fa":4823,"26fd":4881,"270a":1324,"270b":1306,"270c":1311,"270d":1334,"270f":61219,"271d":62696,"274c":62766,"274e":62767,"27a1":62671,"27b0":62768,"27bf":62769,"2b05":62675,"2b06":62669,"2b07":62673,"2b1b":62845,"2b1c":62846,"2b50":4958,"2b55":62762,"303d":62770,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0},LatinizeMap:{"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A","Ẳ":"A","Ẵ":"A","Ǎ":"A","Â":"A","Ấ":"A","Ậ":"A","Ầ":"A","Ẩ":"A","Ẫ":"A","Ä":"A","Ǟ":"A","Ȧ":"A","Ǡ":"A","Ạ":"A","Ȁ":"A","À":"A","Ả":"A","Ȃ":"A","Ā":"A","Ą":"A","Å":"A","Ǻ":"A","Ḁ":"A","Ⱥ":"A","Ã":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ḃ":"B","Ḅ":"B","Ɓ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ć":"C","Č":"C","Ç":"C","Ḉ":"C","Ĉ":"C","Ċ":"C","Ƈ":"C","Ȼ":"C","Ď":"D","Ḑ":"D","Ḓ":"D","Ḋ":"D","Ḍ":"D","Ɗ":"D","Ḏ":"D","Dz":"D","Dž":"D","Đ":"D","Ƌ":"D","DZ":"DZ","DŽ":"DZ","É":"E","Ĕ":"E","Ě":"E","Ȩ":"E","Ḝ":"E","Ê":"E","Ế":"E","Ệ":"E","Ề":"E","Ể":"E","Ễ":"E","Ḙ":"E","Ë":"E","Ė":"E","Ẹ":"E","Ȅ":"E","È":"E","Ẻ":"E","Ȇ":"E","Ē":"E","Ḗ":"E","Ḕ":"E","Ę":"E","Ɇ":"E","Ẽ":"E","Ḛ":"E","Ꝫ":"ET","Ḟ":"F","Ƒ":"F","Ǵ":"G","Ğ":"G","Ǧ":"G","Ģ":"G","Ĝ":"G","Ġ":"G","Ɠ":"G","Ḡ":"G","Ǥ":"G","Ḫ":"H","Ȟ":"H","Ḩ":"H","Ĥ":"H","Ⱨ":"H","Ḧ":"H","Ḣ":"H","Ḥ":"H","Ħ":"H","Í":"I","Ĭ":"I","Ǐ":"I","Î":"I","Ï":"I","Ḯ":"I","İ":"I","Ị":"I","Ȉ":"I","Ì":"I","Ỉ":"I","Ȋ":"I","Ī":"I","Į":"I","Ɨ":"I","Ĩ":"I","Ḭ":"I","Ꝺ":"D","Ꝼ":"F","Ᵹ":"G","Ꞃ":"R","Ꞅ":"S","Ꞇ":"T","Ꝭ":"IS","Ĵ":"J","Ɉ":"J","Ḱ":"K","Ǩ":"K","Ķ":"K","Ⱪ":"K","Ꝃ":"K","Ḳ":"K","Ƙ":"K","Ḵ":"K","Ꝁ":"K","Ꝅ":"K","Ĺ":"L","Ƚ":"L","Ľ":"L","Ļ":"L","Ḽ":"L","Ḷ":"L","Ḹ":"L","Ⱡ":"L","Ꝉ":"L","Ḻ":"L","Ŀ":"L","Ɫ":"L","Lj":"L","Ł":"L","LJ":"LJ","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ń":"N","Ň":"N","Ņ":"N","Ṋ":"N","Ṅ":"N","Ṇ":"N","Ǹ":"N","Ɲ":"N","Ṉ":"N","Ƞ":"N","Nj":"N","Ñ":"N","NJ":"NJ","Ó":"O","Ŏ":"O","Ǒ":"O","Ô":"O","Ố":"O","Ộ":"O","Ồ":"O","Ổ":"O","Ỗ":"O","Ö":"O","Ȫ":"O","Ȯ":"O","Ȱ":"O","Ọ":"O","Ő":"O","Ȍ":"O","Ò":"O","Ỏ":"O","Ơ":"O","Ớ":"O","Ợ":"O","Ờ":"O","Ở":"O","Ỡ":"O","Ȏ":"O","Ꝋ":"O","Ꝍ":"O","Ō":"O","Ṓ":"O","Ṑ":"O","Ɵ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Õ":"O","Ṍ":"O","Ṏ":"O","Ȭ":"O","Ƣ":"OI","Ꝏ":"OO","Ɛ":"E","Ɔ":"O","Ȣ":"OU","Ṕ":"P","Ṗ":"P","Ꝓ":"P","Ƥ":"P","Ꝕ":"P","Ᵽ":"P","Ꝑ":"P","Ꝙ":"Q","Ꝗ":"Q","Ŕ":"R","Ř":"R","Ŗ":"R","Ṙ":"R","Ṛ":"R","Ṝ":"R","Ȑ":"R","Ȓ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꜿ":"C","Ǝ":"E","Ś":"S","Ṥ":"S","Š":"S","Ṧ":"S","Ş":"S","Ŝ":"S","Ș":"S","Ṡ":"S","Ṣ":"S","Ṩ":"S","ẞ":"SS","Ť":"T","Ţ":"T","Ṱ":"T","Ț":"T","Ⱦ":"T","Ṫ":"T","Ṭ":"T","Ƭ":"T","Ṯ":"T","Ʈ":"T","Ŧ":"T","Ɐ":"A","Ꞁ":"L","Ɯ":"M","Ʌ":"V","Ꜩ":"TZ","Ú":"U","Ŭ":"U","Ǔ":"U","Û":"U","Ṷ":"U","Ü":"U","Ǘ":"U","Ǚ":"U","Ǜ":"U","Ǖ":"U","Ṳ":"U","Ụ":"U","Ű":"U","Ȕ":"U","Ù":"U","Ủ":"U","Ư":"U","Ứ":"U","Ự":"U","Ừ":"U","Ử":"U","Ữ":"U","Ȗ":"U","Ū":"U","Ṻ":"U","Ų":"U","Ů":"U","Ũ":"U","Ṹ":"U","Ṵ":"U","Ꝟ":"V","Ṿ":"V","Ʋ":"V","Ṽ":"V","Ꝡ":"VY","Ẃ":"W","Ŵ":"W","Ẅ":"W","Ẇ":"W","Ẉ":"W","Ẁ":"W","Ⱳ":"W","Ẍ":"X","Ẋ":"X","Ý":"Y","Ŷ":"Y","Ÿ":"Y","Ẏ":"Y","Ỵ":"Y","Ỳ":"Y","Ƴ":"Y","Ỷ":"Y","Ỿ":"Y","Ȳ":"Y","Ɏ":"Y","Ỹ":"Y","Ź":"Z","Ž":"Z","Ẑ":"Z","Ⱬ":"Z","Ż":"Z","Ẓ":"Z","Ȥ":"Z","Ẕ":"Z","Ƶ":"Z","IJ":"IJ","Œ":"OE","ᴀ":"A","ᴁ":"AE","ʙ":"B","ᴃ":"B","ᴄ":"C","ᴅ":"D","ᴇ":"E","ꜰ":"F","ɢ":"G","ʛ":"G","ʜ":"H","ɪ":"I","ʁ":"R","ᴊ":"J","ᴋ":"K","ʟ":"L","ᴌ":"L","ᴍ":"M","ɴ":"N","ᴏ":"O","ɶ":"OE","ᴐ":"O","ᴕ":"OU","ᴘ":"P","ʀ":"R","ᴎ":"N","ᴙ":"R","ꜱ":"S","ᴛ":"T","ⱻ":"E","ᴚ":"R","ᴜ":"U","ᴠ":"V","ᴡ":"W","ʏ":"Y","ᴢ":"Z","á":"a","ă":"a","ắ":"a","ặ":"a","ằ":"a","ẳ":"a","ẵ":"a","ǎ":"a","â":"a","ấ":"a","ậ":"a","ầ":"a","ẩ":"a","ẫ":"a","ä":"a","ǟ":"a","ȧ":"a","ǡ":"a","ạ":"a","ȁ":"a","à":"a","ả":"a","ȃ":"a","ā":"a","ą":"a","ᶏ":"a","ẚ":"a","å":"a","ǻ":"a","ḁ":"a","ⱥ":"a","ã":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ḃ":"b","ḅ":"b","ɓ":"b","ḇ":"b","ᵬ":"b","ᶀ":"b","ƀ":"b","ƃ":"b","ɵ":"o","ć":"c","č":"c","ç":"c","ḉ":"c","ĉ":"c","ɕ":"c","ċ":"c","ƈ":"c","ȼ":"c","ď":"d","ḑ":"d","ḓ":"d","ȡ":"d","ḋ":"d","ḍ":"d","ɗ":"d","ᶑ":"d","ḏ":"d","ᵭ":"d","ᶁ":"d","đ":"d","ɖ":"d","ƌ":"d","ı":"i","ȷ":"j","ɟ":"j","ʄ":"j","dz":"dz","dž":"dz","é":"e","ĕ":"e","ě":"e","ȩ":"e","ḝ":"e","ê":"e","ế":"e","ệ":"e","ề":"e","ể":"e","ễ":"e","ḙ":"e","ë":"e","ė":"e","ẹ":"e","ȅ":"e","è":"e","ẻ":"e","ȇ":"e","ē":"e","ḗ":"e","ḕ":"e","ⱸ":"e","ę":"e","ᶒ":"e","ɇ":"e","ẽ":"e","ḛ":"e","ꝫ":"et","ḟ":"f","ƒ":"f","ᵮ":"f","ᶂ":"f","ǵ":"g","ğ":"g","ǧ":"g","ģ":"g","ĝ":"g","ġ":"g","ɠ":"g","ḡ":"g","ᶃ":"g","ǥ":"g","ḫ":"h","ȟ":"h","ḩ":"h","ĥ":"h","ⱨ":"h","ḧ":"h","ḣ":"h","ḥ":"h","ɦ":"h","ẖ":"h","ħ":"h","ƕ":"hv","í":"i","ĭ":"i","ǐ":"i","î":"i","ï":"i","ḯ":"i","ị":"i","ȉ":"i","ì":"i","ỉ":"i","ȋ":"i","ī":"i","į":"i","ᶖ":"i","ɨ":"i","ĩ":"i","ḭ":"i","ꝺ":"d","ꝼ":"f","ᵹ":"g","ꞃ":"r","ꞅ":"s","ꞇ":"t","ꝭ":"is","ǰ":"j","ĵ":"j","ʝ":"j","ɉ":"j","ḱ":"k","ǩ":"k","ķ":"k","ⱪ":"k","ꝃ":"k","ḳ":"k","ƙ":"k","ḵ":"k","ᶄ":"k","ꝁ":"k","ꝅ":"k","ĺ":"l","ƚ":"l","ɬ":"l","ľ":"l","ļ":"l","ḽ":"l","ȴ":"l","ḷ":"l","ḹ":"l","ⱡ":"l","ꝉ":"l","ḻ":"l","ŀ":"l","ɫ":"l","ᶅ":"l","ɭ":"l","ł":"l","lj":"lj","ſ":"s","ẜ":"s","ẛ":"s","ẝ":"s","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ᵯ":"m","ᶆ":"m","ń":"n","ň":"n","ņ":"n","ṋ":"n","ȵ":"n","ṅ":"n","ṇ":"n","ǹ":"n","ɲ":"n","ṉ":"n","ƞ":"n","ᵰ":"n","ᶇ":"n","ɳ":"n","ñ":"n","nj":"nj","ó":"o","ŏ":"o","ǒ":"o","ô":"o","ố":"o","ộ":"o","ồ":"o","ổ":"o","ỗ":"o","ö":"o","ȫ":"o","ȯ":"o","ȱ":"o","ọ":"o","ő":"o","ȍ":"o","ò":"o","ỏ":"o","ơ":"o","ớ":"o","ợ":"o","ờ":"o","ở":"o","ỡ":"o","ȏ":"o","ꝋ":"o","ꝍ":"o","ⱺ":"o","ō":"o","ṓ":"o","ṑ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","õ":"o","ṍ":"o","ṏ":"o","ȭ":"o","ƣ":"oi","ꝏ":"oo","ɛ":"e","ᶓ":"e","ɔ":"o","ᶗ":"o","ȣ":"ou","ṕ":"p","ṗ":"p","ꝓ":"p","ƥ":"p","ᵱ":"p","ᶈ":"p","ꝕ":"p","ᵽ":"p","ꝑ":"p","ꝙ":"q","ʠ":"q","ɋ":"q","ꝗ":"q","ŕ":"r","ř":"r","ŗ":"r","ṙ":"r","ṛ":"r","ṝ":"r","ȑ":"r","ɾ":"r","ᵳ":"r","ȓ":"r","ṟ":"r","ɼ":"r","ᵲ":"r","ᶉ":"r","ɍ":"r","ɽ":"r","ↄ":"c","ꜿ":"c","ɘ":"e","ɿ":"r","ś":"s","ṥ":"s","š":"s","ṧ":"s","ş":"s","ŝ":"s","ș":"s","ṡ":"s","ṣ":"s","ṩ":"s","ʂ":"s","ᵴ":"s","ᶊ":"s","ȿ":"s","ɡ":"g","ß":"ss","ᴑ":"o","ᴓ":"o","ᴝ":"u","ť":"t","ţ":"t","ṱ":"t","ț":"t","ȶ":"t","ẗ":"t","ⱦ":"t","ṫ":"t","ṭ":"t","ƭ":"t","ṯ":"t","ᵵ":"t","ƫ":"t","ʈ":"t","ŧ":"t","ᵺ":"th","ɐ":"a","ᴂ":"ae","ǝ":"e","ᵷ":"g","ɥ":"h","ʮ":"h","ʯ":"h","ᴉ":"i","ʞ":"k","ꞁ":"l","ɯ":"m","ɰ":"m","ᴔ":"oe","ɹ":"r","ɻ":"r","ɺ":"r","ⱹ":"r","ʇ":"t","ʌ":"v","ʍ":"w","ʎ":"y","ꜩ":"tz","ú":"u","ŭ":"u","ǔ":"u","û":"u","ṷ":"u","ü":"u","ǘ":"u","ǚ":"u","ǜ":"u","ǖ":"u","ṳ":"u","ụ":"u","ű":"u","ȕ":"u","ù":"u","ủ":"u","ư":"u","ứ":"u","ự":"u","ừ":"u","ử":"u","ữ":"u","ȗ":"u","ū":"u","ṻ":"u","ų":"u","ᶙ":"u","ů":"u","ũ":"u","ṹ":"u","ṵ":"u","ᵫ":"ue","ꝸ":"um","ⱴ":"v","ꝟ":"v","ṿ":"v","ʋ":"v","ᶌ":"v","ⱱ":"v","ṽ":"v","ꝡ":"vy","ẃ":"w","ŵ":"w","ẅ":"w","ẇ":"w","ẉ":"w","ẁ":"w","ⱳ":"w","ẘ":"w","ẍ":"x","ẋ":"x","ᶍ":"x","ý":"y","ŷ":"y","ÿ":"y","ẏ":"y","ỵ":"y","ỳ":"y","ƴ":"y","ỷ":"y","ỿ":"y","ȳ":"y","ẙ":"y","ɏ":"y","ỹ":"y","ź":"z","ž":"z","ẑ":"z","ʑ":"z","ⱬ":"z","ż":"z","ẓ":"z","ȥ":"z","ẕ":"z","ᵶ":"z","ᶎ":"z","ʐ":"z","ƶ":"z","ɀ":"z","ff":"ff","ffi":"ffi","ffl":"ffl","fi":"fi","fl":"fl","ij":"ij","œ":"oe","st":"st","ₐ":"a","ₑ":"e","ᵢ":"i","ⱼ":"j","ₒ":"o","ᵣ":"r","ᵤ":"u","ᵥ":"v","ₓ":"x","Ё":"YO","Й":"I","Ц":"TS","У":"U","К":"K","Е":"E","Н":"N","Г":"G","Ш":"SH","Щ":"SCH","З":"Z","Х":"H","Ъ":"","ё":"yo","й":"i","ц":"ts","у":"u","к":"k","е":"e","н":"n","г":"g","ш":"sh","щ":"sch","з":"z","х":"h","ъ":"","Ф":"F","Ы":"I","В":"V","А":"A","П":"P","Р":"R","О":"O","Л":"L","Д":"D","Ж":"ZH","Э":"E","ф":"f","ы":"i","в":"v","а":"a","п":"p","р":"r","о":"o","л":"l","д":"d","ж":"zh","э":"e","Я":"Ya","Ч":"CH","С":"S","М":"M","И":"I","Т":"T","Ь":"","Б":"B","Ю":"YU","я":"ya","ч":"ch","с":"s","м":"m","и":"i","т":"t","ь":"","б":"b","ю":"yu"},TLD:["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"],MediaSizes:d(38).b};t.a.Config=a,e.a=a},16:function(f,e,d){"use strict";d.r(e),d.d(e,"langPack",(function(){return l})),d.d(e,"UNSUPPORTED_LANG_PACK_KEY",(function(){return b})),d.d(e,"I18n",(function(){return h})),d.d(e,"i18n",(function(){return g})),d.d(e,"i18n_",(function(){return p})),d.d(e,"_i18n",(function(){return m})),d.d(e,"joinElementsWith",(function(){return k})),d.d(e,"join",(function(){return y}));var t=d(30),a=d(32),s=d(89),c=d(7),n=d(15),i=d(31),o=d(0),r=d(85),u=d(42);const l={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},b=o.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var h;!function(f){let e,o;function l(){const e=c.a.langPackCode;return f.lastRequestedLangCode=e,Promise.all([d.e(8).then(d.bind(null,195)),d.e(9).then(d.bind(null,196)),d.e(27).then(d.bind(null,197))]).then(([f,d,t])=>{const a=[];h(f.default,a),h(d.default,a);return p({_:"langPackDifference",from_version:0,lang_code:e,strings:a,version:0,local:!0,countries:t.default})})}function b(e){return f.requestedServerLanguage=!0,Promise.all([a.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:c.a.langPack}),a.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:"android"}),d.e(8).then(d.bind(null,195)),d.e(9).then(d.bind(null,196)),a.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(f,e=[]){for(const d in f){const t=f[d];"string"==typeof t?e.push({_:"langPackString",key:d,value:t}):e.push(Object.assign({_:"langPackStringPluralized",key:d},t))}return e}function g(e){return f.lastRequestedLangCode=e,b(e).then(([f,e,d,t,a,s])=>{let c=[];[d,t].forEach(f=>{h(f.default,c)}),c=c.concat(f.strings);for(const f of e.strings)c.push(f);return f.strings=c,f.countries=a,p(f)})}function p(f){return f.appVersion=c.a.langPackVersion,s.a.set({langPack:f}).then(()=>(m(f),f))}function m(d){if(d.lang_code!==f.lastRequestedLangCode)return;try{e=new Intl.PluralRules(d.lang_code)}catch(f){console.error("pluralRules error",f),e=new Intl.PluralRules(d.lang_code.split("-",1)[0])}f.strings.clear();for(const e of d.strings)f.strings.set(e.key,e);d.countries&&(f.countriesList.length=0,f.countriesList.push(...d.countries.countries),d.countries.countries.forEach(e=>{if(e.name){const d=e.default_name;f.strings.set(d,{_:"langPackString",key:d,value:e.name})}})),f.lastAppliedLangCode!==d.lang_code&&(n.default.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code);Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function k(f,e,d={i:0}){let t=[];let a=0;return f.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,s,c,n,o,r,u)=>{if(t.push(u.slice(a,r)),s){let f;switch(s){case"**":f=document.createElement("b");break;case"__":f=document.createElement("i")}f.append(...k(c,e,d)),t.push(f)}else if(n)t.push(document.createElement("br"));else if(o){const f=o.lastIndexOf("]"),a=o.slice(1,f),s=o.slice(f+2,o.length-1);let c;if(s&&i.b.matchUrlProtocol(s)){c=document.createElement("a");const f=i.b.wrapUrl(s);c.href=f.url,f.onclick&&c.setAttribute("onclick",f.onclick),c.target="_blank"}else c=e[d.i++],c.textContent="";c.append(...k(a,e,d)),t.push(c)}else e&&function(f,e,d){const t=e[d.i++];Array.isArray(t)?f.push(...t):f.push(t)}(t,e,d);return a=r+f.length,""}),a!==f.length&&t.push(f.slice(a)),t}function y(d,t=!1,a){const s=f.strings.get(d);let c;if(s)if("langPackStringPluralized"===s._&&(null==a?void 0:a.length)){let f=a[0];"string"==typeof f&&(f=+f.replace(/\D/g,""));c=s[e.select(f)+"_value"]||s.other_value}else c="langPackString"===s._?s.value:d;else c=d;const n=k(c,a);return t?n.map(f=>f instanceof Node?f.textContent:f).join(""):n}f.strings=new Map,f.countriesList=[],f.requestedServerLanguage=!1,f.getCacheLangPack=function(){return o||(o=Promise.all([s.a.get("langPack"),f.polyfillPromise]).then(([e])=>e?(t.b,f.lastRequestedLangCode||(f.lastRequestedLangCode=e.lang_code),m(e),e):l()).finally(()=>{o=void 0}))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;if(f.timeFormat=e,d){Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof A&&d.update()})}},f.loadLocalLangPack=l,f.loadLangPack=b,f.getStrings=function(f,e){return a.a.invokeApi("langpack.getStrings",{lang_pack:c.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=g,f.saveLangPack=p,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(29).then(d.bind(null,198)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=m,f.superFormatter=k,f.format=y,f.weakMap=new WeakMap;class v{constructor(e){this.property="innerHTML",this.element=(null==e?void 0:e.element)||document.createElement("span"),this.element.classList.add("i18n"),e&&(e.key||e.date)&&this.update(e),f.weakMap.set(this.element,this)}}class w extends v{update(f){if(Object(u.a)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const f=this.element[this.property],e=y(this.key,!0,this.args);void 0===f?this.element.dataset[this.property]=e:this.element[this.property]=e}}compareAndUpdate(f){if(this.key!==f.key||!Object(r.a)(this.args,f.args))return this.update(f)}}f.IntlElement=w;class A extends v{update(e){Object(u.a)(this,e);const d=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,this.options);var t;this.element[this.property]=(t=d.format(this.date)).charAt(0).toUpperCase()+t.slice(1)}}f.IntlDateElement=A,f.i18n=function(f,e){return new w({key:f,args:e}).element},f.i18n_=function(f){return new w(f).element},f._i18n=function(f,e,d,t){return new w({element:f,key:e,args:d,property:t}).element}}(h||(h={}));e.default=h;const g=h.i18n,p=h.i18n_,m=h._i18n;function k(f,e){const d=f.slice(0,1);for(let t=1;t{const t=f&&e?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return d?h.format(t,!0):g(t)});return d?t.join(""):t}t.a.I18n=h},169:function(f,e,d){"use strict";var t=d(30),a=d(66),s=d(41),c=d(15),n=d(74),i=d(32);const o=new class{constructor(){this.log=Object(s.b)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),n.a.delete("xt_instance"))},this.deactivateInstance=()=>{if(this.masterInstance||this.deactivated)return!1;this.log("deactivate"),this.deactivateTimeout=0,this.deactivated=!0,this.clearInstance(),c.default.idle.deactivated=!0,c.default.dispatchEvent("instance_deactivated")},this.checkInstance=(f=c.default.idle&&c.default.idle.isIDLE)=>{if(this.deactivated)return!1;const e=Date.now(),d={id:this.instanceID,idle:f,time:e};n.a.get("xt_instance",!1).then(t=>{!f||!t||t.id===this.instanceID||t.time{const e=f.data.payload;if(0===e.fileName.indexOf("main-")){const f=this.convertPromises[e.fileName];f&&(e.bytes?f.resolve(e.bytes):f.reject(),delete this.convertPromises[e.fileName])}else c.a.postMessage(f.data)})}postMessage(f){this.init&&(this.init(),this.init=null),this.worker.postMessage(f)}convert(f,e){if(f="main-"+f,this.convertPromises.hasOwnProperty(f))return this.convertPromises[f];const d=Object(s.a)();return this.postMessage({type:"convertWebp",payload:{fileName:f,bytes:e}}),this.convertPromises[f]=d}};a.a.webpWorkerController=n;e.a=n},24:function(f,e,d){"use strict";d.r(e),d.d(e,"TelegramMeWebManager",(function(){return i}));var t=d(7),a=d(30),s=d(75),c=d(58),n=d(74);class i{constructor(){this.disabled=s.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return n.a.get("tgme_sync").then(e=>{const d=Object(c.h)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;n.a.set({tgme_sync:{canRedirect:f,ts:d}});const a=`_websync_?authed=${f?"1":"0"}&version=${encodeURIComponent(t.a.version+" "+t.a.suffix)}`,s=["//telegram.me/"+a,"//t.me/"+a].map(f=>{const e=document.createElement("script"),d=new Promise(f=>{e.onload=e.onerror=()=>{e.remove(),f()}});return e.src=f,document.body.appendChild(e),d});return Promise.all(s)})}}const o=new i;a.a&&(a.a.telegramMeWebManager=o),e.default=o},26:function(f,e,d){"use strict";d.r(e),d.d(e,"WebPushApiManager",(function(){return u}));var t=d(30),a=d(41),s=d(15),c=d(32),n=d(16),i=d(0),o=d(157),r=d(53);class u{constructor(){this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=Object(a.b)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then(f=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",f)}).catch(f=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",f),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))})})},this.isAliveNotify=()=>{if(!this.isAvailable||s.default.idle&&s.default.idle.deactivated)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"")+"#/im";const f={},e={push_action_mute1d:i.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:i.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=n.default.format(e[d],!0);const d={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:f,settings:this.settings}};c.a.postSWMessage(d),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!!f,this.pushSubscriptionNotify("init",f)}).catch(f=>{this.log.error("Error during getSubscription()",f)})})}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!1,f&&(this.pushSubscriptionNotify("unsubscribe",f),setTimeout(()=>{f.unsubscribe().then(f=>{this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})},3e3))}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.log.warn("force unsubscribe",f),f&&f.unsubscribe().then(f=>{this.log.warn("force unsubscribe successful",f),this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}setSettings(f){this.settings=Object(r.a)(f),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){if(!this.isAvailable)return;c.a.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(c.a.addServiceWorkerTaskListener("push_click",f=>{s.default.idle&&s.default.idle.deactivated?o.a.reload():s.default.dispatchEvent("push_notification_click",f.payload)}),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(f,e){if(e){const d=e.toJSON();if(!(d&&d.endpoint&&d.keys&&d.keys.p256dh&&d.keys.auth))return this.log.warn("Invalid push subscription",d),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(f);this.log.warn("Push",f,d),s.default.dispatchEvent("push_"+f,{tokenType:10,tokenValue:JSON.stringify(d)})}else this.log.warn("Push",f,!1),s.default.dispatchEvent("push_"+f,!1)}}const l=new u;t.a&&(t.a.webPushApiManager=l),e.default=l},31:function(f,e,d){"use strict";d.d(e,"a",(function(){return w}));var t=d(158);var a=d(95),s=d(0),c=d(30),n=d(10),i=d(53);function o(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}const r=t.a.Emoji,u="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",l="["+u+"0-9]",b="((?:https?|ftp)://|mailto:)?(?:"+l+"{1,64}(?::"+l+"{0,64})?@)?(?:(?: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}|"+l+"["+u+"·0-9-]{0,64}(?:\\."+l+"["+u+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+u+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",h=(new RegExp("^"+"((?:https?|ftp)://|mailto:)?".slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),g=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+b+")|(\\n)|(((?:👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍❤️?‍💋‍👨|👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍❤️?‍👨|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍❤️?‍\ud83d[\udc68\udc69]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️?⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️))|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),p=/^(([^<>()[\]\\.,;:\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,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,k={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},y={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let f in y)v.add(y[f]);var w;!function(f){function e(f){let e=Object(a.b)(f).replace(/-?fe0f/g,"");return r.hasOwnProperty(e)?e:null}function d(f){let d,a=f;const s=[];let c,n=0;for(g.lastIndex=0;d=a.match(g);){if(c=n+d.index,d[3])s.push({_:"messageEntityMention",offset:c+d[1].length,length:d[2].length+d[3].length});else if(d[4])if(p.test(d[4]))s.push({_:"messageEntityEmail",offset:c,length:d[4].length});else{let f,e=d[5];const a=d[6];if(a){if(e||"xn--"!==a.substr(0,4)&&-1===t.a.TLD.indexOf(a.toLowerCase())||(e="http://"),e){const t=C(d[4]);t.length!==d[4].length&&(d[4]=t),f=(d[5]?"":e)+d[4]}}else f=(d[5]?"":"http://")+d[4];f&&s.push({_:"messageEntityUrl",offset:c,length:d[4].length})}else if(d[7])s.push({_:"messageEntityLinebreak",offset:c,length:1});else if(d[8]){const f=e(d[8]);f&&s.push({_:"messageEntityEmoji",offset:c,length:d[8].length,unicode:f})}else d[11]?s.push({_:"messageEntityHashtag",offset:c+(d[10]?d[10].length:0),length:d[11].length}):d[13]&&s.push({_:"messageEntityBotCommand",offset:c+(d[11]?d[11].length:0)+(d[12]?d[12].length:0),length:1+d[13].length+(d[14]?1+d[14].length:0),unsafe:!0});a=a.substr(d.index+d[0].length),n+=d.index+d[0].length}return s}function c(f,e){return f.find(f=>{if(!(e._===f._||!v.has(e._)&&!v.has(f._)))return!1;return e.offset>=f.offset&&e.length+e.offset<=f.length+f.offset})}function u(f,e){const d=e.filter(e=>!c(f,e));f.push(...d),A(f);for(let e=0;ec(e,f)?a=!1:(t.push(f),a=!0),n=[];let i,o=0;for(;i=f.match(m);){const e=o+i.index;n.push(f.substr(0,i.index));const d=i[3]||i[8]||i[11]||i[13];let t;if(o-=d.length,o+=d.length,a=!1,d.match(/^`*$/))n.push(i[0]);else if(i[3])t={_:"messageEntityPre",language:"",offset:e+i[1].length,length:d.length},s(t)&&("\n"===i[5]&&(i[5]="",o-=1),n.push(i[1]+d+i[5]),o-=i[2].length+i[4].length);else if(i[7]){const f=""===i[6];t={_:y[i[7]],offset:e+(f?0:i[6].length),length:d.length},s(t)&&(f?n.push(d):n.push(i[6]+d+i[9]),o-=2*i[7].length+(f?2:0))}else i[11]?(t={_:"messageEntityMentionName",user_id:i[10].toUserId(),offset:e,length:d.length},s(t)&&(n.push(d),o-=i[0].length-d.length)):i[12]&&(t={_:"messageEntityTextUrl",url:i[14],offset:e,length:d.length},s(t)&&(n.push(d),o-=i[12].length-d.length));a||n.push(i[0]),f=f.substr(i.index+i[0].length),o+=i.index+i[0].length}n.push(f);let r=n.join("");r.replace(/\s+/g,"").length||(r=f,t.splice(0,t.length)),u(e,t),w(e);let l=r.length;if(!d){r=r.replace(/^\s*/,"");let f=l-r.length;f&&e.forEach(e=>{e.offset=Math.max(0,e.offset-f)}),r=r.replace(/\s*$/,""),f=l-r.length,l=r.length,f&&e.forEach(f=>{f.offset+f.length>l&&(f.length=l-f.offset)})}return r},f.findConflictingEntity=c,f.mergeEntities=u;const l=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function w(f){for(let e=0;el.has(f._)&&t!==e&&f._===d._&&f.offset-d.length===d.offset),-1!==t){const e=f[t];d.length+=e.length,f.splice(t,1)}}while(-1!==t)}}function A(f){f.sort((f,e)=>f.offset-e.offset||e.length-f.length)}function E(f,e={}){if(!f)return"";const t=[],a=e.entities||d(f),c=e.passEntities||{},r=e.contextSite||"Telegram",u="Telegram"!==r,l=(f,e,d)=>{const a=f.offset,s=d?f.offset+f.length:void 0;let c,n;for(let f=t.length-1;f>=0;--f){const e=t[f].offset;if(void 0===c&&a>=e&&(c=f+1),void 0!==s&&s<=e&&(n=f),a>e&&(void 0===s||s=h){if("messageEntityCaret"!==t._)continue}else t.offset+t.length>h&&(t=Object(i.a)(t),t.length=t.offset+t.length-h);switch(t._){case"messageEntityBold":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityStrike":if(e.wrappingDraft){l(t,``,"")}else e.noTextFormat||l(t,"","");break;case"messageEntityUnderline":if(e.wrappingDraft){l(t,``,"")}else e.noTextFormat||l(t,"","");break;case"messageEntityCode":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,"","");break;case"messageEntityPre":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,`
`,"
");break;case"messageEntityHighlight":l(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&c[t._]){let d,a,s=f.substr(t.offset,t.length).substr(1);-1!==(a=s.indexOf("@"))?(d=s.substr(a+1),s=s.substr(0,a)):d=e.fromBot,l(t,``,"")}break;case"messageEntityEmoji":n.a?e.wrappingDraft||l(t,'',""):l(t,``,'');break;case"messageEntityCaret":{const f='';b.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||c[t._]){const s=f.substr(t.offset,t.length);let c,n=t.url||s,i=!1;const r=T(n,!0);if(n=r.url,c=r.onclick,"messageEntityTextUrl"===t._){const f=a[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,n!==s&&(i=!0)}const u=!!c;c||!i||u||(c="showMaskedAlert"),e.wrappingDraft&&(c=void 0);l(t,``,"")}break;case"messageEntityEmail":if(!e.noLinks){l(t,``,"")}break;case"messageEntityHashtag":{const d=!e.noLinks&&k[r];if(d){const e=f.substr(t.offset,t.length).substr(1);l(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!c[t._]||l(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:a}=T("t.me/"+e);l(t,``,"")}break;case"messageEntitySpoiler":if(e.noTextFormat){const e=f.slice(0,t.offset),d=f.slice(t.offset,t.offset+t.length),a=f.slice(t.offset+t.length);f=e+S(d)+a}else e.wrappingDraft?l(t,'',""):l(t,'',"")}}let g=t.length,p=b.length;for(let f=0;f=e.offset););t.splice(d,0,e)}g+=p;const m=[];let y=0;for(let d=0;dy){const d=f.slice(y,s);m.push(e.noEncoding?d:o(d)),y=s}m.push(a)}if(yd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function S(f){const e="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",d=e.length,t=[];for(let a=0;a"messageEntityEmoji"===f._),wrappingDraft:e})}function T(f,e){let d,t,a,s;if(D(f)||(f="https://"+f),d=f.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=d[1];if(/^\W/.test(e))return s="joinchat",{url:f,onclick:s};const t=e.split("/");switch(t[0]){case"joinchat":case"addstickers":case"voicechat":s=t[0];break;default:if(t[1]&&t[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===t.length){s="im";break}}}else(t=f.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?s="im":(a=f.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(s="tg_"+a[1]);return window[s]||(s=void 0),{url:f,onclick:s}}function D(f){return f?f.match(h):null}function _(f){return{_:"messageEntityEmoji",offset:0,length:f.length,unicode:Object(a.e)(f).join("-").replace(/-?fe0f/g,"")}}f.combineSameEntities=w,f.sortEntities=A,f.wrapRichText=E,f.fixEmoji=function(f,e){return f=f.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,(f,d,t)=>{if(e){const t=f.length;d+=t,e.forEach(f=>{const e=f.offset+f.length;e===d?f.length+=t:e>d&&(f.offset+=t)})}return f+"️"})},f.wrapDraftText=function(f,e={}){return f?E(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=C,f.spoiler=S,f.wrapPlainText=function(f,e=[]){return(null==e?void 0:e.length)&&(e=e.filter(f=>"messageEntitySpoiler"===f._)),E(f,{entities:e,noEncoding:!0,noTextFormat:!0,noLinebreaks:!0,noLinks:!0})},f.wrapEmojiText=P,f.wrapUrl=T,f.matchUrlProtocol=D,f.matchUrl=function(f){return f?f.match(b):null},f.matchEmail=function(f){return f?f.match(p):null},f.getAbbreviation=function(f,e=!1){if(!f)return"";const d=f.trim().split(" ");if(!d[0])return"";const t=[...d[0]][0];return e||1===d.length?P(t):P(t+[...d[d.length-1]][0])},f.isUsernameValid=function(f){return(f.length>=5&&f.length<=32||!f.length)&&/^[a-zA-Z0-9_]*$/.test(f)},f.getEmojiEntityFromEmoji=_,f.wrapSingleEmoji=function(f){return E(f,{entities:[_(f)]})}}(w||(w={})),c.a.RichTextProcessor=w;e.b=w},32:function(f,e,d){"use strict";function t(){return new Worker(d.p+"mtproto.worker.b18e2703b7b89f161924.bundle.worker.js")}var a=d(41),s=d(15),c=d(188),n=d(30),i=d(75),o=d(50);class r extends o.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=i.a.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=f=>{this.log.error("handleError",f),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=f=>{this.debug&&this.log.debug("<-","handleMessage",f.data.byteLength),this.dispatchEvent("message",f.data)},this.send=f=>{this.debug&&this.log.debug("-> body length to send:",f.length),this.ws.send(f)};let t=a.a.Error|a.a.Log;return this.debug&&(t|=a.a.Debug),this.log=Object(a.b)("WS-"+f+d,t),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(f){}this.handleClose()}}}var u=d(169),l=d(74),b=d(26),h=d(103),g=d(157),p=d(24),m=d(80),k=d(140),y=d(128),v=d(84);const w=new class extends class{invokeCrypto(f,...e){return this.performTaskWorker(f,...e)}}{constructor(){super(),this.afterMessageIdTemp=0,this.taskId=0,this.awaiting={},this.pending=[],this.updatesProcessor=null,this.log=Object(a.b)("API-PROXY"),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.isSWRegistered=!0,this.debug=n.b,this.sockets=new Map,this.taskListeners={},this.taskListenersSW={},this.postMessagesWaiting=[],this.onWorkerMessage=f=>{const e=f.data;if(!Object(v.a)(e))return;const d=this.taskListeners[e.type];d?d(e):e.update?this.updatesProcessor&&this.updatesProcessor(e.update):e.progress?s.default.dispatchEvent("download_progress",e.progress):(e.hasOwnProperty("result")||e.hasOwnProperty("error"))&&this.finalizeTask(e.taskId,e.result,e.error)},this.log("constructor"),u.a.start(),this.registerServiceWorker(),this.addTaskListener("clear",()=>{Promise.all([h.a.toggleStorage(!1),l.a.clear(),Promise.race([p.default.setAuthorized(!1),Object(m.a)(3e3)]),b.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map(f=>caches.delete(f)))]).finally(()=>{g.a.reload()})}),this.addTaskListener("connectionStatusChange",f=>{s.default.dispatchEvent("connection_status_change",f.payload)}),this.addTaskListener("convertWebp",f=>{c.a.postMessage(f)}),this.addTaskListener("socketProxy",f=>{const e=f.payload,d=e.id;if("send"===e.type){this.sockets.get(d).send(e.payload)}else if("close"===e.type){this.sockets.get(d).close()}else if("setup"===e.type){const f=new r(e.payload.dcId,e.payload.url,e.payload.logSuffix),t=()=>{this.postMessage({type:"socketProxy",payload:{type:"open",id:d}})},a=()=>{this.postMessage({type:"socketProxy",payload:{type:"close",id:d}}),f.removeEventListener("open",t),f.removeEventListener("close",a),f.removeEventListener("message",s),this.sockets.delete(d)},s=f=>{this.postMessage({type:"socketProxy",payload:{type:"message",id:d,payload:f}})};f.addEventListener("open",t),f.addEventListener("close",a),f.addEventListener("message",s),this.sockets.set(d,f)}}),this.addTaskListener("localStorageProxy",f=>{const e=f.payload;l.a[e.type](...e.args).then(e=>{this.postMessage({type:"localStorageProxy",id:f.id,payload:e})})}),s.default.addEventListener("language_change",f=>{this.performTaskWorkerVoid("setLanguage",f)}),window.addEventListener("online",f=>{this.forceReconnectTimeout()}),this.registerWorker(),setTimeout(()=>{this.getConfig()},5e3)}isServiceWorkerOnline(){return this.isSWRegistered}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const f=navigator.serviceWorker;f.register("./sw.js",{scope:"./"}).then(f=>{this.log("SW registered",f),this.isSWRegistered=!0;(f.installing||f.waiting||f.active).addEventListener("statechange",f=>{this.log("SW statechange",f)})},f=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",f),this.onServiceWorkerFail&&this.onServiceWorkerFail()}),f.addEventListener("controllerchange",()=>{this.log.warn("controllerchange"),this.releasePending(),f.controller.addEventListener("error",f=>{this.log.error("controller error:",f)})}),f.addEventListener("message",f=>{const e=f.data;if(!Object(v.a)(e))return;const d=this.taskListenersSW[e.type];d&&d(e)}),this.addServiceWorkerTaskListener("requestFilePart",f=>{const e={type:f.type,id:f.id};this.performTaskWorker("requestFilePart",...f.payload).then(f=>{e.payload=f,this.postSWMessage(e)},d=>{e.originalPayload=f.payload,e.error=d,this.postSWMessage(e)})}),f.addEventListener("messageerror",f=>{this.log.error("SW messageerror:",f)})}postMessage(...f){this.postMessagesWaiting.push(f)}postSWMessage(f){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(f)}onWorkerFirstMessage(f){if(!this.worker){this.worker=f,this.log("set webWorker"),this.postMessage=this.worker.postMessage.bind(this.worker),this.postMessagesWaiting.forEach(f=>this.postMessage(...f)),this.postMessagesWaiting.length=0;const e=k.a;this.log("WebP supported:",e),this.postMessage({type:"webpSupport",payload:e}),this.postMessage({type:"userAgent",payload:navigator.userAgent}),this.releasePending()}}addTaskListener(f,e){this.taskListeners[f]=e}addServiceWorkerTaskListener(f,e){this.taskListenersSW[f]=e}registerWorker(){const f=new t;f.addEventListener("message",this.onWorkerFirstMessage.bind(this,f),{once:!0}),f.addEventListener("message",this.onWorkerMessage),f.addEventListener("error",f=>{this.log.error("WORKER ERROR",f)})}finalizeTask(f,e,d){const t=this.awaiting[f];void 0!==t&&(this.debug&&this.log.debug("done",t.taskName,e,d),d?t.reject(d):t.resolve(e),delete this.awaiting[f])}createTask(f,e,d){return{task:f,taskId:this.taskId++,type:e,args:d}}performTaskWorkerVoid(f,...e){const d=this.createTask(f,void 0,e);this.pending.push(d),this.releasePending()}performTaskWorkerNew(f,e,...d){return this.debug&&this.log.debug("start",f,d),new Promise((t,a)=>{const s=this.createTask(f,e,d);this.pending.push(s),this.awaiting[s.taskId]={resolve:t,reject:a,taskName:f},this.releasePending()})}performTaskWorker(f,...e){return this.performTaskWorkerNew(f,void 0,...e)}releasePending(){this.postMessage&&(this.debug&&this.log.debug("releasing tasks, length:",this.pending.length),this.pending.forEach(f=>{this.postMessage(f)}),this.debug&&this.log.debug("released tasks"),this.pending.length=0)}setUpdatesProcessor(f){this.updatesProcessor=f}invokeCrypto(f,...e){return this.performTaskWorkerNew(f,"crypto",...e)}invokeApi(f,e={},d={}){return this.performTaskWorker("invokeApi",f,e,d)}invokeApiAfter(f,e={},d={}){let t=d;return t.prepareTempMessageId=""+ ++this.afterMessageIdTemp,t=Object.assign({},d),d.messageId=t.prepareTempMessageId,this.invokeApi(f,e,t)}invokeApiHashable(f){var e,d;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{params:t,options:a,method:s}=f,c=JSON.stringify(t);let n;return this.hashes[s]&&(n=this.hashes[s][c],n&&(t.hash=n.hash)),this.invokeApiSingleProcess({method:s,processResult:e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",s,c),n.result;if(e.hash){const f=e.hash;this.hashes[s]||(this.hashes[s]={}),this.hashes[s][c]={hash:f,result:e}}return f.processResult?f.processResult(e):e},params:t,options:a})}invokeApiSingle(f,e={},d={}){const t=f+"-"+JSON.stringify(e),a=this.apiPromisesSingle;return a[t]?a[t]:a[t]=this.invokeApi(f,e,d).finally(()=>{delete a[t]})}invokeApiSingleProcess(f){var e,d,t;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{method:a,processResult:s,processError:c,params:n,options:i}=f,o=this.apiPromisesSingleProcess,r=i.cacheKey||JSON.stringify(n),u=null!==(t=o[a])&&void 0!==t?t:o[a]=new Map,l=u.get(r);if(l)return l;const b=this.invokeApi(a,n,i).then(s,c).finally(()=>{u.delete(r),u.size||delete o[a]});return u.set(r,b),b}invokeApiCacheable(f,e={},d={}){var t;const a=null!==(t=this.apiPromisesCacheable[f])&&void 0!==t?t:this.apiPromisesCacheable[f]={},s=JSON.stringify(e),c=a[s];if(c&&(!d.override||!c.fulfilled))return c.promise;let n;d.override&&(c&&c.timeout&&(clearTimeout(c.timeout),delete c.timeout),delete d.override),d.cacheSeconds&&(n=window.setTimeout(()=>{delete a[s]},1e3*d.cacheSeconds),delete d.cacheSeconds);const i=this.invokeApi(f,e,d);return a[s]={timestamp:Date.now(),fulfilled:!1,timeout:n,promise:i,params:e},i}clearCache(f,e){const d=this.apiPromisesCacheable[f];if(d)for(const f in d){const t=d[f];try{e(t.params)&&(t.timeout&&clearTimeout(t.timeout),delete d[f])}catch(e){this.log.error("clearCache error:",e,f,t)}}}setBaseDcId(f){return this.performTaskWorker("setBaseDcId",f)}setQueueId(f){return this.performTaskWorker("setQueueId",f)}setUserAuth(f){return"string"!=typeof f&&"number"!=typeof f||(f={dcID:0,date:Date.now()/1e3|0,id:f.toPeerId(!1)}),s.default.dispatchEvent("user_auth",f),this.performTaskWorker("setUserAuth",f)}setUser(f){return this.setUserAuth(f.id)}getNetworker(f,e){return this.performTaskWorker("getNetworker",f,e)}logOut(){return this.performTaskWorker("logOut")}cancelDownload(f){return this.performTaskWorker("cancelDownload",f)}downloadFile(f){return this.performTaskWorker("downloadFile",f)}uploadFile(f){return this.performTaskWorker("uploadFile",f)}toggleStorage(f){const e={type:"toggleStorage",payload:f};this.postMessage(e),this.postSWMessage(e)}stopAll(){return this.performTaskWorkerVoid("stopAll")}startAll(){return this.performTaskWorkerVoid("startAll")}forceReconnectTimeout(){this.postMessage({type:"online"})}forceReconnect(){this.postMessage({type:"forceReconnect"})}getConfig(){return this.getConfigPromise?this.getConfigPromise:this.getConfigPromise=this.invokeApi("help.getConfig").then(f=>(s.default.config=f,f))}getAppConfig(f){if(s.default.appConfig&&!f)return s.default.appConfig;if(this.getAppConfigPromise&&!f)return this.getAppConfigPromise;const e=this.getAppConfigPromise=this.invokeApi("help.getAppConfig").then(f=>{var d;return this.getAppConfigPromise!==e?this.getAppConfigPromise:(s.default.appConfig=f,Object(y.b)(null!==(d=f.ignore_restriction_reasons)&&void 0!==d?d:[]),f)});return e}};n.a.apiManagerProxy=w;e.a=w},38:function(f,e,d){"use strict";d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return t}));var t,a=d(30),s=d(141),c=d(50);class n{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return Object(s.a)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function i(f,e){return new n(f,e)}!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class o extends c.a{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:i(270,270),webpage:i(270,200),album:i(270,0),esgSticker:i(68,68),animatedSticker:i(180,180),staticSticker:i(180,180),emojiSticker:i(112,112),poll:i(240,0),round:i(200,200)},desktop:{regular:i(420,340),webpage:i(420,340),album:i(420,0),esgSticker:i(80,80),animatedSticker:i(200,200),staticSticker:i(200,200),emojiSticker:i(112,112),poll:i(330,0),round:i(280,280)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame(()=>{this.handleResize(),this.rAF=0})}),this.handleResize()}}const r=new o;a.a.mediaSizes=r,e.b=r},58:function(f,e,d){"use strict";d.d(e,"a",(function(){return i})),d.d(e,"c",(function(){return r})),d.d(e,"e",(function(){return u})),d.d(e,"d",(function(){return l})),d.d(e,"f",(function(){return b})),d.d(e,"g",(function(){return h})),d.d(e,"b",(function(){return w}));var t=d(30),a=d(16),s=d(127);d.d(e,"h",(function(){return s.a}));const c=["January","February","March","April","May","June","July","August","September","October","November","December"],n=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],i=86400,o=f=>{const e=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate())),d=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-d);const t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/i+1)/7)};function r(f){const e=new Date,d=e.getTime()/1e3|0,t=f.getTime()/1e3|0,s={};return d-t{const d=e.monthAsNumber?".":" ",t=("0"+f.getHours()).slice(-2)+":"+("0"+f.getMinutes()).slice(-2)+(e.noSeconds?"":":"+("0"+f.getSeconds()).slice(-2));return(e.leadingZero?("0"+f.getDate()).slice(-2):f.getDate())+d+(e.monthAsNumber?("0"+(f.getMonth()+1)).slice(-2):c[f.getMonth()])+d+f.getFullYear()+(e.noTime?"":", "+t)},g=new RegExp("20[0-9]{1,2}"),p=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),m=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),k=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),v=[31,29,31,30,31,30,31,31,30,31,30,31];function w(f,e){const d=f.trim().toLowerCase();if(d.length<3)return;if(0==="today".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime();f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-1;return void e.push({title:"Today",minDate:s,maxDate:c})}if(0==="yesterday".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime()-864e5;f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-86400001;return void e.push({title:"Yesterday",minDate:s,maxDate:c})}const t=function(f){const e=new Date;if(f.length<=3)return-1;for(let d=0;d<7;d++)if(e.setDate(e.getDate()+1),0===T(e.getTime()).toLowerCase().indexOf(f))return e.getDay();return-1}(d);if(t>=0){const f=new Date,d=f.getTime(),a=t-f.getDay();f.setDate(f.getDate()+a),f.getTime()>d&&f.setTime(f.getTime()-6048e5);const s=f.getFullYear(),c=f.getMonth(),n=f.getDate();f.setFullYear(s,c,n),f.setHours(0,0,0);const i=f.getTime();f.setFullYear(s,c,n+1),f.setHours(0,0,0);const o=f.getTime()-1;return void e.push({title:T(i),minDate:i,maxDate:o})}let a;if(null===(a=k.exec(d)))if(null===(a=y.exec(d)))if(null===(a=g.exec(d))){if(null!==(a=p.exec(d))){const f=a[1],d=a[2],t=_(f);if(t>=0){const f=+d;if(f>0&&f<=31){return void E(e,f-1,t)}if(f>=2013){return void A(e,t,f)}}}if(null!==(a=m.exec(d))){const f=a[1],d=_(a[2]);if(d>=0){const t=+f;if(t>0&&t<=31){return void E(e,t-1,d)}if(t>=2013){A(e,d,t)}}}}else{let f=+d;const t=(new Date).getFullYear();if(f<2013){f=2013;for(let d=t;d>=f;d--){const f=new Date;f.setFullYear(d,0,1),f.setHours(0,0,0);const t=f.getTime();f.setFullYear(d+1,0,1),f.setHours(0,0,0);const a=f.getTime()-1;e.push({title:""+d,minDate:t,maxDate:a})}}else if(f<=t){const d=new Date;d.setFullYear(f,0,1),d.setHours(0,0,0);const t=d.getTime();d.setFullYear(f+1,0,1),d.setHours(0,0,0);const a=d.getTime()-1;e.push({title:""+f,minDate:t,maxDate:a})}}else{const f=a[1],d=a[3],t=a[5];if(!a[2]===a[4])return;const s=parseInt(f),c=parseInt(d)-1;let n=parseInt(t);n>=10&&n<=99&&(n+=2e3);const i=(new Date).getFullYear();if(D(s-1,c)&&n>=2013&&n<=i){const f=new Date;f.setFullYear(n,c,s),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(n,c,s+1),f.setHours(0,0,0);const t=f.getTime()-1;return void e.push({title:P(d),minDate:d,maxDate:t})}}else{const f=a[1],d=a[3],t=parseInt(f),s=parseInt(d);if(t>0&&t<=31){if(s>=2013&&t<=12){return void A(e,t-1,s)}if(s<=12){E(e,t-1,s-1)}}else if(t>=2013&&s<=12){A(e,s-1,t)}}}function A(f,e,d){const t=(new Date).getFullYear(),a=Date.now();if(d>=2013&&d<=t){const t=new Date;t.setFullYear(d,e,1),t.setHours(0,0,0);const s=t.getTime();if(s>a)return;t.setMonth(t.getMonth()+1);const c=t.getTime()-1;f.push({title:C(s),minDate:s,maxDate:c})}}function E(f,e,d){if(D(e,d)){const a=(new Date).getFullYear(),s=Date.now();for(let c=a;c>=2013;c--){if(1===d&&28===e&&(((t=c)%4!=0||t%100==0)&&t%400!=0))continue;const n=new Date;n.setFullYear(c,d,e+1),n.setHours(0,0,0);const i=n.getTime();if(i>s)continue;n.setFullYear(c,d,e+2),n.setHours(0,0,0);const o=n.getTime()-1;c===a?f.push({title:S(i),minDate:i,maxDate:o}):f.push({title:P(i),minDate:i,maxDate:o})}}var t}function C(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getFullYear()}function S(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getDate()}function P(f){const e=new Date(f);return("0"+e.getDate()).slice(-2)+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+e.getFullYear()}function T(f){const e=new Date(f);return n[e.getDay()]}function D(f,e){return e>=0&&e<12&&f>=0&&fnew Promise(e=>{setTimeout(e,f)})},85:function(f,e,d){"use strict";function t(f,e){const d=Object.keys,a=typeof f;return f&&e&&"object"===a&&a===typeof e?d(f).length===d(e).length&&d(f).every(d=>t(f[d],e[d])):f===e}d.d(e,"a",(function(){return t}))},95:function(f,e,d){"use strict";function t(f){return n(c(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return n})),d.d(e,"d",(function(){return i})),d.d(e,"c",(function(){return o})),d.d(e,"a",(function(){return r}));const a=/\uFE0F/g,s=String.fromCharCode(8205),c=f=>f.indexOf(s)<0?f.replace(a,""):f;function n(f){const e=[];let d=0,t=0,a=0;for(;a55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function i(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function o(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function r(f){return f.split("-").reduce((f,e)=>f+String.fromCodePoint(parseInt(e,16)),"")}}}]); +//# sourceMappingURL=1.bf7f14176d3c12040199.chunk.js.map \ No newline at end of file diff --git a/public/1.bf7f14176d3c12040199.chunk.js.map b/public/1.bf7f14176d3c12040199.chunk.js.map new file mode 100644 index 00000000..a71c85ac --- /dev/null +++ b/public/1.bf7f14176d3c12040199.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/tsNow.ts","webpack:///./src/helpers/restrictions.ts","webpack:///./src/environment/webpSupport.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/lib/appManagers/appRuntimeManager.ts","webpack:///./src/lib/config.ts","webpack:///./src/lib/langPack.ts","webpack:///./src/helpers/string/capitalizeFirstLetter.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/lib/mtproto/telegramMeWebManager.ts","webpack:///./src/lib/mtproto/webPushApiManager.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/helpers/string/encodeEntities.ts","webpack:///./src/lib/richtextprocessor.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/helpers/date.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/object/deepEqual.ts","webpack:///./src/vendor/emoji/index.ts"],"names":["tsNow","seconds","t","Date","now","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","platform","isRestricted","ignoreRestrictionReasons","clear","forEach","add","IS_WEBP_SUPPORTED","document","createElement","toDataURL","startsWith","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","appRuntimeManager","location","reload","e","window","close","focus","Config","Emoji","LatinizeMap","TLD","MediaSizes","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","loadLocalLangPack","defaultCode","langPackCode","lastRequestedLangCode","Promise","all","then","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","version","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","langPack","hash","polyfillPromise","pushTo","i","v","push","key","value","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","concat","string","appVersion","langPackVersion","stateStorage","set","applyLangPack","Intl","PluralRules","err","console","error","split","countriesList","length","country","name","langPackKey","default_name","lastAppliedLangCode","rootScope","dispatchEvent","Array","from","querySelectorAll","element","instance","weakMap","get","update","superFormatter","input","args","indexHolder","out","lastIndex","replace","match","p1","p2","p3","p4","offset","slice","append","idx","lastIndexOf","text","url","a","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","target","textContent","arg","isArray","pushNextArgument","format","plain","str","select","result","map","item","Node","join","Map","getCacheLangPack","finally","undefined","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","invokeApi","keys","resolve","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","this","classList","date","IntlElement","safeAssign","formatted","dataset","deepEqual","dateTimeFormat","DateTimeFormat","charAt","toUpperCase","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","arr","isLast","useLast","joined","singleInstance","log","clearInstance","masterInstance","deactivated","warn","delete","deactivateInstance","deactivateTimeout","idle","checkInstance","isIDLE","time","newInstance","id","instanceID","curInstance","xt_instance","startAll","initial","clearTimeout","stopAll","setTimeout","started","reset","addEventListener","setInterval","documentElement","Worker_fn","Worker","webpWorkerController","convertPromises","worker","payload","data","fileName","indexOf","promise","bytes","reject","postMessage","init","hasOwnProperty","convertPromise","type","TelegramMeWebManager","disabled","test","domains","hostname","canRedirect","curValue","ts","tgme_sync","path","encodeURIComponent","suffix","promises","script","onload","onerror","remove","src","body","appendChild","telegramMeWebManager","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","settings","isFirefox","navigator","userAgent","toLowerCase","userVisibleOnly","subscribe","serviceWorker","ready","reg","pushManager","subscription","pushSubscriptionNotify","catch","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","task","localNotifications","postSWMessage","isAliveTO","getSubscription","setUpServiceWorkerChannel","unsubscribe","successful","newSettings","addServiceWorkerTaskListener","event","subscriptionObj","toJSON","endpoint","p256dh","auth","tokenType","tokenValue","JSON","stringify","webPushApiManager","encodeEntities","charCodeAt","emojiData","alphaCharsRegExp","urlAlphanumericRegExpPart","urlRegExp","urlProtocolRegExpPart","urlAnyProtocolRegExp","RegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","RichTextProcessor","getEmojiSpritesheetCoords","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","index","protocol","tld","substr","balanced","checkBrackets","emojiCoords","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","currentEntity","mergeEntities","newEntities","filtered","filter","sortEntities","entity","nextEntity","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","language","isSOH","user_id","toUserId","newText","splice","combineSameEntities","diff","Math","max","CAN_COMBINE_ENTITIES","nextEntityIdx","findIndex","_i","sort","b","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","startOffset","endOffset","startIndex","endIndex","part","pushPartsAfterSort","textLength","copy","noTextFormat","wrappingDraft","noLinks","bot","atPos","command","fromBot","html","entityText","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","username","before","spoilerBefore","after","spoiler","partsLength","pushPartsAfterSortLength","insertAt","usedLength","sliced","noEncoding","urlLength","urlOpenBrackets","urlCloseBrackets","chars","charsLength","char","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","noLinebreaks","matchUrl","matchEmail","getAbbreviation","onlyFirst","splitted","trim","first","isUsernameValid","wrapSingleEmoji","dcId","logSuffix","super","debug","handleOpen","handleError","handleClose","removeListeners","handleMessage","byteLength","send","ws","logTypes","Error","Log","Debug","logger","connect","removeEventListener","WebSocket","binaryType","apiManagerProxy","method","performTaskWorker","afterMessageIdTemp","taskId","awaiting","pending","updatesProcessor","hashes","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","isObject","callback","progress","finalizeTask","start","registerServiceWorker","addTaskListener","toggleStorage","sessionStorage","race","setAuthorized","pause","forceUnsubscribe","cacheName","caches","socketTask","socket","onOpen","onClose","onMessage","buffer","storageTask","res","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","register","scope","registration","installing","waiting","active","onServiceWorkerFail","releasePending","controller","responseTask","uploadFile","originalPayload","message","bind","isWebpSupported","onWorkerFirstMessage","once","deferred","taskName","createTask","performTaskWorkerNew","params","o","prepareTempMessageId","messageId","queryJSON","cached","invokeApiSingleProcess","processResult","includes","q","cache","processError","cacheKey","oldPromise","p","size","override","fulfilled","timeout","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","toPeerId","user","setUserAuth","dc_id","enabled","getConfigPromise","config","overwrite","appConfig","getAppConfigPromise","ignore_restriction_reasons","ScreenSize","MediaSize","width","height","boxSize","fitted","aspect","makeMediaSize","screenSizes","mobile","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","round","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","cancelAnimationFrame","requestAnimationFrame","mediaSizes","months","days","ONE_DAY","getWeekNumber","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","today","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","style","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","setHours","minDate","maxDate","title","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","ms","x","y","ok","tx","every","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","prev","curr","fromCodePoint"],"mappings":"sFAAe,SAASA,EAAMC,GAC5B,MAAMC,EAAIC,KAAKC,MACf,OAAOH,EAAUC,EAAI,IAAO,EAAIA,EAFlC,mC,iCCEA,4GAAMG,EAAY,IAAIC,IAAI,CACxB,MACA,MACA,SAGIC,EAAS,IAAID,IAEZ,SAASE,EAAqBC,GAEnC,OAAOA,EAAQC,KAAKC,GAAUN,EAAUO,IAAID,EAAOE,YAAcN,EAAOK,IAAID,EAAOA,SAG9E,SAASG,EAAaL,GAC3B,QAASD,EAAqBC,GAGzB,SAASM,EAAyBN,GACvCF,EAAOS,QACPP,EAAQQ,QAAQN,IACdJ,EAAOW,IAAIP,O,iCCtBf,MAAMQ,EAAoBC,SAASC,cAAc,UAAUC,UAAU,cAAcC,WAAW,mBAE/E,O,iCCFf,8CAce,SAASC,EAAeC,EAAgBC,EAAgBC,EAAcC,EAAcC,GAAS,GAC1G,GAAGJ,EAASE,GAAQD,EAASE,GAAQC,EACnC,OAAO,YAAcJ,EAAQC,GAG/B,IAAII,EAAcH,EACdI,EAAcH,EAsBlB,OApBIH,EAASC,EAAWC,EAAOC,EAC7BG,EAAeL,EAASC,EAAOF,EAAU,GAEzCK,EAAeL,EAASG,EAAOF,EAAU,EACtCI,EAAcH,IACfI,EAAeA,EAAcJ,EAAOG,EAAe,EACnDA,EAAcH,IASfE,GAAUC,GAAeL,GAAUM,GAAeL,IACnDI,EAAcL,EACdM,EAAcL,GAGT,YAAcI,EAAaC,GA1CpC,MA6CA,EAAeP,eAAiBA,G,iCCMhC,MAAMQ,EAAoB,IAxCnB,MACE,SACL,IACEC,SAASC,SACT,MAAMC,KAOH,QACL,IACEC,OAAOC,QACP,MAAMF,KAMH,QAeHC,OAAOE,UAME,O,iCCpDf,YAeO,MAYDC,EAAS,CACbC,MAb8C,CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GActs7DC,YAJgD,CAAC,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,MAAM,IAAK,MAAM,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAA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","file":"1.bf7f14176d3c12040199.chunk.js","sourcesContent":["export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","import { RestrictionReason } from \"../layer\";\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find(reason => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach(reason => {\n ignore.add(reason);\n });\n}\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\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 { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\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 * 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 { MOUNT_CLASS_TO } from '../config/debug';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\n\r\n// !WARNING, ТУТ СЛОЖНО! по-хорошему, надо бы это переделать без fe0f, но они здесь необходимы чтобы отрендерить панель, и ниже дописаны 3 элемента которые не воспроизводятся без fe0f\r\nexport const Emoji: {[emoji: string]: number} = {\"2049\":62748,\"2122\":62776,\"2139\":62801,\"2194\":62678,\"2195\":62677,\"2196\":62676,\"2197\":62670,\"2198\":62672,\"2199\":62674,\"2328\":61155,\"2600\":4954,\"2601\":4962,\"2602\":4977,\"2603\":4982,\"2604\":4984,\"2611\":62764,\"2614\":4978,\"2615\":3750,\"2618\":2639,\"2620\":196,\"2622\":62667,\"2623\":62668,\"2626\":62697,\"2638\":62694,\"2639\":168,\"2648\":62702,\"2649\":62703,\"2650\":62710,\"2651\":62711,\"2652\":62712,\"2653\":62713,\"2660\":51057,\"2663\":51060,\"2665\":51058,\"2666\":51059,\"2668\":4832,\"2692\":61258,\"2693\":4887,\"2694\":61261,\"2696\":61272,\"2697\":61280,\"2699\":61270,\"2702\":61245,\"2705\":62763,\"2708\":4895,\"2709\":61206,\"2712\":61220,\"2714\":62765,\"2716\":62742,\"2721\":62693,\"2728\":5993,\"2733\":62771,\"2734\":62772,\"2744\":4981,\"2747\":62773,\"2753\":62749,\"2754\":62750,\"2755\":62751,\"2757\":62752,\"2763\":1127,\"2764\":1129,\"2795\":62743,\"2796\":62744,\"2797\":62745,\"2934\":62681,\"2935\":62682,\"3030\":62753,\"3297\":62825,\"3299\":62826,\"0023-20e3\":62777,\"002a-20e3\":62778,\"0030-20e3\":62779,\"0031-20e3\":62780,\"0032-20e3\":62781,\"0033-20e3\":62782,\"0034-20e3\":62783,\"0035-20e3\":62784,\"0036-20e3\":62785,\"0037-20e3\":62786,\"0038-20e3\":62787,\"0039-20e3\":62788,\"00a9\":62774,\"00ae\":62775,\"1f004\":51063,\"1f0cf\":51062,\"1f170\":62795,\"1f171\":62797,\"1f17e\":62806,\"1f17f\":62808,\"1f18e\":62796,\"1f191\":62798,\"1f192\":62799,\"1f193\":62800,\"1f194\":62802,\"1f195\":62804,\"1f196\":62805,\"1f197\":62807,\"1f198\":62809,\"1f199\":62810,\"1f19a\":62811,\"1f1e6-1f1e8\":71550,\"1f1e6-1f1e9\":71551,\"1f1e6-1f1ea\":71552,\"1f1e6-1f1eb\":71553,\"1f1e6-1f1ec\":71554,\"1f1e6-1f1ee\":71555,\"1f1e6-1f1f1\":71556,\"1f1e6-1f1f2\":71557,\"1f1e6-1f1f4\":71558,\"1f1e6-1f1f6\":71559,\"1f1e6-1f1f7\":71560,\"1f1e6-1f1f8\":71561,\"1f1e6-1f1f9\":71562,\"1f1e6-1f1fa\":71563,\"1f1e6-1f1fc\":71564,\"1f1e6-1f1fd\":71565,\"1f1e6-1f1ff\":71566,\"1f1e7-1f1e6\":71567,\"1f1e7-1f1e7\":71568,\"1f1e7-1f1e9\":71569,\"1f1e7-1f1ea\":71570,\"1f1e7-1f1eb\":71571,\"1f1e7-1f1ec\":71572,\"1f1e7-1f1ed\":71573,\"1f1e7-1f1ee\":71574,\"1f1e7-1f1ef\":71575,\"1f1e7-1f1f1\":71576,\"1f1e7-1f1f2\":71577,\"1f1e7-1f1f3\":71578,\"1f1e7-1f1f4\":71579,\"1f1e7-1f1f6\":71580,\"1f1e7-1f1f7\":71581,\"1f1e7-1f1f8\":71582,\"1f1e7-1f1f9\":71583,\"1f1e7-1f1fb\":71584,\"1f1e7-1f1fc\":71585,\"1f1e7-1f1fe\":71586,\"1f1e7-1f1ff\":71587,\"1f1e8-1f1e6\":71588,\"1f1e8-1f1e8\":71589,\"1f1e8-1f1e9\":71590,\"1f1e8-1f1eb\":71591,\"1f1e8-1f1ec\":71592,\"1f1e8-1f1ed\":71593,\"1f1e8-1f1ee\":71594,\"1f1e8-1f1f0\":71595,\"1f1e8-1f1f1\":71596,\"1f1e8-1f1f2\":71597,\"1f1e8-1f1f3\":71598,\"1f1e8-1f1f4\":71599,\"1f1e8-1f1f5\":71600,\"1f1e8-1f1f7\":71601,\"1f1e8-1f1fa\":71602,\"1f1e8-1f1fb\":71603,\"1f1e8-1f1fc\":71604,\"1f1e8-1f1fd\":71605,\"1f1e8-1f1fe\":71606,\"1f1e8-1f1ff\":71607,\"1f1e9-1f1ea\":71608,\"1f1e9-1f1ec\":71609,\"1f1e9-1f1ef\":71610,\"1f1e9-1f1f0\":71611,\"1f1e9-1f1f2\":71612,\"1f1e9-1f1f4\":71613,\"1f1e9-1f1ff\":71614,\"1f1ea-1f1e6\":71615,\"1f1ea-1f1e8\":71616,\"1f1ea-1f1ea\":71617,\"1f1ea-1f1ec\":71618,\"1f1ea-1f1ed\":71619,\"1f1ea-1f1f7\":71620,\"1f1ea-1f1f8\":71621,\"1f1ea-1f1f9\":71622,\"1f1ea-1f1fa\":71623,\"1f1eb-1f1ee\":71624,\"1f1eb-1f1ef\":71625,\"1f1eb-1f1f0\":71626,\"1f1eb-1f1f2\":71627,\"1f1eb-1f1f4\":71628,\"1f1eb-1f1f7\":71629,\"1f1ec-1f1e6\":71630,\"1f1ec-1f1e7\":71631,\"1f1ec-1f1e9\":71632,\"1f1ec-1f1ea\":71633,\"1f1ec-1f1eb\":71634,\"1f1ec-1f1ec\":71635,\"1f1ec-1f1ed\":71636,\"1f1ec-1f1ee\":71637,\"1f1ec-1f1f1\":71638,\"1f1ec-1f1f2\":71639,\"1f1ec-1f1f3\":71640,\"1f1ec-1f1f5\":71641,\"1f1ec-1f1f6\":71642,\"1f1ec-1f1f7\":71643,\"1f1ec-1f1f8\":71644,\"1f1ec-1f1f9\":71645,\"1f1ec-1f1fa\":71646,\"1f1ec-1f1fc\":71647,\"1f1ec-1f1fe\":71648,\"1f1ed-1f1f0\":71649,\"1f1ed-1f1f2\":71650,\"1f1ed-1f1f3\":71651,\"1f1ed-1f1f7\":71652,\"1f1ed-1f1f9\":71653,\"1f1ed-1f1fa\":71654,\"1f1ee-1f1e8\":71655,\"1f1ee-1f1e9\":71656,\"1f1ee-1f1ea\":71657,\"1f1ee-1f1f1\":71658,\"1f1ee-1f1f2\":71659,\"1f1ee-1f1f3\":71660,\"1f1ee-1f1f4\":71661,\"1f1ee-1f1f6\":71662,\"1f1ee-1f1f7\":71663,\"1f1ee-1f1f8\":71664,\"1f1ee-1f1f9\":71665,\"1f1ef-1f1ea\":71666,\"1f1ef-1f1f2\":71667,\"1f1ef-1f1f4\":71668,\"1f1ef-1f1f5\":71669,\"1f1f0-1f1ea\":71670,\"1f1f0-1f1ec\":71671,\"1f1f0-1f1ed\":71672,\"1f1f0-1f1ee\":71673,\"1f1f0-1f1f2\":71674,\"1f1f0-1f1f3\":71675,\"1f1f0-1f1f5\":71676,\"1f1f0-1f1f7\":71677,\"1f1f0-1f1fc\":71678,\"1f1f0-1f1fe\":71679,\"1f1f0-1f1ff\":71680,\"1f1f1-1f1e6\":71681,\"1f1f1-1f1e7\":71682,\"1f1f1-1f1e8\":71683,\"1f1f1-1f1ee\":71684,\"1f1f1-1f1f0\":71685,\"1f1f1-1f1f7\":71686,\"1f1f1-1f1f8\":71687,\"1f1f1-1f1f9\":71688,\"1f1f1-1f1fa\":71689,\"1f1f1-1f1fb\":71690,\"1f1f1-1f1fe\":71691,\"1f1f2-1f1e6\":71692,\"1f1f2-1f1e8\":71693,\"1f1f2-1f1e9\":71694,\"1f1f2-1f1ea\":71695,\"1f1f2-1f1eb\":71696,\"1f1f2-1f1ec\":71697,\"1f1f2-1f1ed\":71698,\"1f1f2-1f1f0\":71699,\"1f1f2-1f1f1\":71700,\"1f1f2-1f1f2\":71701,\"1f1f2-1f1f3\":71702,\"1f1f2-1f1f4\":71703,\"1f1f2-1f1f5\":71704,\"1f1f2-1f1f6\":71705,\"1f1f2-1f1f7\":71706,\"1f1f2-1f1f8\":71707,\"1f1f2-1f1f9\":71708,\"1f1f2-1f1fa\":71709,\"1f1f2-1f1fb\":71710,\"1f1f2-1f1fc\":71711,\"1f1f2-1f1fd\":71712,\"1f1f2-1f1fe\":71713,\"1f1f2-1f1ff\":71714,\"1f1f3-1f1e6\":71715,\"1f1f3-1f1e8\":71716,\"1f1f3-1f1ea\":71717,\"1f1f3-1f1eb\":71718,\"1f1f3-1f1ec\":71719,\"1f1f3-1f1ee\":71720,\"1f1f3-1f1f1\":71721,\"1f1f3-1f1f4\":71722,\"1f1f3-1f1f5\":71723,\"1f1f3-1f1f7\":71724,\"1f1f3-1f1fa\":71725,\"1f1f3-1f1ff\":71726,\"1f1f4-1f1f2\":71727,\"1f1f5-1f1e6\":71728,\"1f1f5-1f1ea\":71729,\"1f1f5-1f1eb\":71730,\"1f1f5-1f1ec\":71731,\"1f1f5-1f1ed\":71732,\"1f1f5-1f1f0\":71733,\"1f1f5-1f1f1\":71734,\"1f1f5-1f1f2\":71735,\"1f1f5-1f1f3\":71736,\"1f1f5-1f1f7\":71737,\"1f1f5-1f1f8\":71738,\"1f1f5-1f1f9\":71739,\"1f1f5-1f1fc\":71740,\"1f1f5-1f1fe\":71741,\"1f1f6-1f1e6\":71742,\"1f1f7-1f1ea\":71743,\"1f1f7-1f1f4\":71744,\"1f1f7-1f1f8\":71745,\"1f1f7-1f1fa\":71746,\"1f1f7-1f1fc\":71747,\"1f1f8-1f1e6\":71748,\"1f1f8-1f1e7\":71749,\"1f1f8-1f1e8\":71750,\"1f1f8-1f1e9\":71751,\"1f1f8-1f1ea\":71752,\"1f1f8-1f1ec\":71753,\"1f1f8-1f1ed\":71754,\"1f1f8-1f1ee\":71755,\"1f1f8-1f1ef\":71756,\"1f1f8-1f1f0\":71757,\"1f1f8-1f1f1\":71758,\"1f1f8-1f1f2\":71759,\"1f1f8-1f1f3\":71760,\"1f1f8-1f1f4\":71761,\"1f1f8-1f1f7\":71762,\"1f1f8-1f1f8\":71763,\"1f1f8-1f1f9\":71764,\"1f1f8-1f1fb\":71765,\"1f1f8-1f1fd\":71766,\"1f1f8-1f1fe\":71767,\"1f1f8-1f1ff\":71768,\"1f1f9-1f1e6\":71769,\"1f1f9-1f1e8\":71770,\"1f1f9-1f1e9\":71771,\"1f1f9-1f1eb\":71772,\"1f1f9-1f1ec\":71773,\"1f1f9-1f1ed\":71774,\"1f1f9-1f1ef\":71775,\"1f1f9-1f1f0\":71776,\"1f1f9-1f1f1\":71777,\"1f1f9-1f1f2\":71778,\"1f1f9-1f1f3\":71779,\"1f1f9-1f1f4\":71780,\"1f1f9-1f1f7\":71781,\"1f1f9-1f1f9\":71782,\"1f1f9-1f1fb\":71783,\"1f1f9-1f1fc\":71784,\"1f1f9-1f1ff\":71785,\"1f1fa-1f1e6\":71786,\"1f1fa-1f1ec\":71787,\"1f1fa-1f1f2\":71788,\"1f1fa-1f1f3\":71789,\"1f1fa-1f1f8\":71790,\"1f1fa-1f1fe\":71791,\"1f1fa-1f1ff\":71792,\"1f1fb-1f1e6\":71793,\"1f1fb-1f1e8\":71794,\"1f1fb-1f1ea\":71795,\"1f1fb-1f1ec\":71796,\"1f1fb-1f1ee\":71797,\"1f1fb-1f1f3\":71798,\"1f1fb-1f1fa\":71799,\"1f1fc-1f1eb\":71800,\"1f1fc-1f1f8\":71801,\"1f1fd-1f1f0\":71802,\"1f1fe-1f1ea\":71803,\"1f1fe-1f1f9\":71804,\"1f1ff-1f1e6\":71805,\"1f1ff-1f1f2\":71806,\"1f1ff-1f1fc\":71807,\"1f201\":62812,\"1f202\":62813,\"1f21a\":62819,\"1f22f\":62816,\"1f232\":62820,\"1f233\":62824,\"1f234\":62823,\"1f235\":62828,\"1f236\":62815,\"1f237\":62814,\"1f238\":62822,\"1f239\":62818,\"1f23a\":62827,\"1f250\":62817,\"1f251\":62821,\"1f300\":4974,\"1f301\":4824,\"1f302\":4976,\"1f303\":4825,\"1f304\":4827,\"1f305\":4828,\"1f306\":4829,\"1f307\":4830,\"1f308\":4975,\"1f309\":4831,\"1f30a\":4987,\"1f30b\":4782,\"1f30c\":4961,\"1f30d\":4773,\"1f30e\":4774,\"1f30f\":4775,\"1f310\":4776,\"1f311\":4941,\"1f312\":4942,\"1f313\":4943,\"1f314\":4944,\"1f315\":4945,\"1f316\":4946,\"1f317\":4947,\"1f318\":4948,\"1f319\":4949,\"1f31a\":4950,\"1f31b\":4951,\"1f31c\":4952,\"1f31d\":4955,\"1f31e\":4956,\"1f31f\":4959,\"1f320\":4960,\"1f321\":4953,\"1f324\":4965,\"1f325\":4966,\"1f326\":4967,\"1f327\":4968,\"1f328\":4969,\"1f329\":4970,\"1f32a\":4971,\"1f32b\":4972,\"1f32c\":4973,\"1f32d\":3694,\"1f32e\":3696,\"1f32f\":3697,\"1f330\":3677,\"1f331\":2631,\"1f332\":2633,\"1f333\":2634,\"1f334\":2635,\"1f335\":2636,\"1f336\":3668,\"1f337\":2630,\"1f338\":2622,\"1f339\":2625,\"1f33a\":2627,\"1f33b\":2628,\"1f33c\":2629,\"1f33d\":3667,\"1f33e\":2637,\"1f33f\":2638,\"1f340\":2640,\"1f341\":2641,\"1f342\":2642,\"1f343\":2643,\"1f344\":3675,\"1f345\":3660,\"1f346\":3664,\"1f347\":3644,\"1f348\":3645,\"1f349\":3646,\"1f34a\":3647,\"1f34b\":3648,\"1f34c\":3649,\"1f34d\":3650,\"1f34e\":3652,\"1f34f\":3653,\"1f350\":3654,\"1f351\":3655,\"1f352\":3656,\"1f353\":3657,\"1f354\":3691,\"1f355\":3693,\"1f356\":3687,\"1f357\":3688,\"1f358\":3713,\"1f359\":3714,\"1f35a\":3715,\"1f35b\":3716,\"1f35c\":3717,\"1f35d\":3718,\"1f35e\":3678,\"1f35f\":3692,\"1f360\":3719,\"1f361\":3725,\"1f362\":3720,\"1f363\":3721,\"1f364\":3722,\"1f365\":3723,\"1f366\":3734,\"1f367\":3735,\"1f368\":3736,\"1f369\":3737,\"1f36a\":3738,\"1f36b\":3743,\"1f36c\":3744,\"1f36d\":3745,\"1f36e\":3746,\"1f36f\":3747,\"1f370\":3740,\"1f371\":3712,\"1f372\":3704,\"1f373\":3702,\"1f374\":3769,\"1f375\":3752,\"1f376\":3753,\"1f377\":3755,\"1f378\":3756,\"1f379\":3757,\"1f37a\":3758,\"1f37b\":3759,\"1f37c\":3748,\"1f37d\":3768,\"1f37e\":3754,\"1f37f\":3708,\"1f380\":51004,\"1f381\":51005,\"1f382\":3739,\"1f383\":5988,\"1f384\":5989,\"1f385\":1490,\"1f386\":5990,\"1f387\":5991,\"1f388\":5994,\"1f389\":5995,\"1f38a\":5996,\"1f38b\":5997,\"1f38c\":71544,\"1f38d\":5998,\"1f38e\":5999,\"1f38f\":51000,\"1f390\":51001,\"1f391\":51002,\"1f392\":61096,\"1f393\":61109,\"1f396\":51009,\"1f397\":51006,\"1f399\":61129,\"1f39a\":61130,\"1f39b\":61131,\"1f39e\":61164,\"1f39f\":51007,\"1f3a0\":4833,\"1f3a1\":4834,\"1f3a2\":4835,\"1f3a3\":51036,\"1f3a4\":61132,\"1f3a5\":61163,\"1f3a6\":62733,\"1f3a7\":61133,\"1f3a8\":51067,\"1f3a9\":61108,\"1f3aa\":4837,\"1f3ab\":51008,\"1f3ac\":61166,\"1f3ad\":51065,\"1f3ae\":51049,\"1f3af\":51042,\"1f3b0\":51051,\"1f3b1\":51045,\"1f3b2\":51052,\"1f3b3\":51024,\"1f3b4\":51064,\"1f3b5\":61127,\"1f3b6\":61128,\"1f3b7\":61135,\"1f3b8\":61137,\"1f3b9\":61138,\"1f3ba\":61139,\"1f3bb\":61140,\"1f3bc\":61126,\"1f3bd\":51038,\"1f3be\":51022,\"1f3bf\":51039,\"1f3c0\":51018,\"1f3c1\":71542,\"1f3c2\":1562,\"1f3c3-200d-2640\":1546,\"1f3c3-200d-2642\":1545,\"1f3c3\":1544,\"1f3c4-200d-2640\":1568,\"1f3c4-200d-2642\":1567,\"1f3c4\":1566,\"1f3c5\":51011,\"1f3c6\":51010,\"1f3c7\":1560,\"1f3c8\":51020,\"1f3c9\":51021,\"1f3ca-200d-2640\":1574,\"1f3ca-200d-2642\":1573,\"1f3ca\":1572,\"1f3cb-200d-2640\":1580,\"1f3cb-200d-2642\":1579,\"1f3cb\":1578,\"1f3cc-200d-2640\":1565,\"1f3cc-200d-2642\":1564,\"1f3cc\":1563,\"1f3cd\":4868,\"1f3ce\":4867,\"1f3cf\":51025,\"1f3d0\":51019,\"1f3d1\":51026,\"1f3d2\":51027,\"1f3d3\":51029,\"1f3d4\":4780,\"1f3d5\":4784,\"1f3d6\":4785,\"1f3d7\":4791,\"1f3d8\":4796,\"1f3d9\":4826,\"1f3da\":4797,\"1f3db\":4790,\"1f3dc\":4786,\"1f3dd\":4787,\"1f3de\":4788,\"1f3df\":4789,\"1f3e0\":4798,\"1f3e1\":4799,\"1f3e2\":4800,\"1f3e3\":4801,\"1f3e4\":4802,\"1f3e5\":4803,\"1f3e6\":4804,\"1f3e7\":62643,\"1f3e8\":4805,\"1f3e9\":4806,\"1f3ea\":4807,\"1f3eb\":4808,\"1f3ec\":4809,\"1f3ed\":4810,\"1f3ee\":61177,\"1f3ef\":4811,\"1f3f0\":4812,\"1f3f3-200d-1f308\":71547,\"1f3f3-200d-26a7\":71548,\"1f3f3\":71546,\"1f3f4-200d-2620\":71549,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71808,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71809,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71810,\"1f3f4\":71545,\"1f3f5\":2624,\"1f3f7\":61195,\"1f3f8\":51030,\"1f3f9\":61264,\"1f3fa\":3772,\"1f3fb\":9499,\"1f3fc\":9500,\"1f3fd\":9501,\"1f3fe\":9502,\"1f3ff\":9503,\"1f400\":2550,\"1f401\":2549,\"1f402\":2530,\"1f403\":2531,\"1f404\":2532,\"1f405\":2521,\"1f406\":2522,\"1f407\":2553,\"1f408-200d-2b1b\":2518,\"1f408\":2517,\"1f409\":2592,\"1f40a\":2587,\"1f40b\":2596,\"1f40c\":2605,\"1f40d\":2590,\"1f40e\":2524,\"1f40f\":2537,\"1f410\":2539,\"1f411\":2538,\"1f412\":2505,\"1f413\":2570,\"1f414\":2569,\"1f415-200d-1f9ba\":2511,\"1f415\":2509,\"1f416\":2534,\"1f417\":2535,\"1f418\":2544,\"1f419\":2603,\"1f41a\":2604,\"1f41b\":2607,\"1f41c\":2608,\"1f41d\":2609,\"1f41e\":2611,\"1f41f\":2599,\"1f420\":2600,\"1f421\":2601,\"1f422\":2588,\"1f423\":2571,\"1f424\":2572,\"1f425\":2573,\"1f426\":2574,\"1f427\":2575,\"1f428\":2560,\"1f429\":2512,\"1f42a\":2540,\"1f42b\":2541,\"1f42c\":2597,\"1f42d\":2548,\"1f42e\":2529,\"1f42f\":2520,\"1f430\":2552,\"1f431\":2516,\"1f432\":2591,\"1f433\":2595,\"1f434\":2523,\"1f435\":2504,\"1f436\":2508,\"1f437\":2533,\"1f438\":2586,\"1f439\":2551,\"1f43a\":2513,\"1f43b-200d-2744\":2559,\"1f43b\":2558,\"1f43c\":2561,\"1f43d\":2536,\"1f43e\":2567,\"1f43f\":2554,\"1f440\":1350,\"1f441-200d-1f5e8\":1147,\"1f441\":1351,\"1f442\":1342,\"1f443\":1344,\"1f444\":1353,\"1f445\":1352,\"1f446\":1318,\"1f447\":1320,\"1f448\":1316,\"1f449\":1317,\"1f44a\":1325,\"1f44b\":1303,\"1f44c\":1308,\"1f44d\":1322,\"1f44e\":1323,\"1f44f\":1328,\"1f450\":1330,\"1f451\":61106,\"1f452\":61107,\"1f453\":61072,\"1f454\":61077,\"1f455\":61078,\"1f456\":61079,\"1f457\":61084,\"1f458\":61085,\"1f459\":61090,\"1f45a\":61091,\"1f45b\":61092,\"1f45c\":61093,\"1f45d\":61094,\"1f45e\":61098,\"1f45f\":61099,\"1f460\":61102,\"1f461\":61103,\"1f462\":61105,\"1f463\":1649,\"1f464\":1646,\"1f465\":1647,\"1f466\":1356,\"1f467\":1357,\"1f468-200d-1f33e\":1423,\"1f468-200d-1f373\":1426,\"1f468-200d-1f37c\":1487,\"1f468-200d-1f393\":1414,\"1f468-200d-1f3a4\":1444,\"1f468-200d-1f3a8\":1447,\"1f468-200d-1f3eb\":1417,\"1f468-200d-1f3ed\":1432,\"1f468-200d-1f466-200d-1f466\":1636,\"1f468-200d-1f466\":1635,\"1f468-200d-1f467-200d-1f466\":1638,\"1f468-200d-1f467-200d-1f467\":1639,\"1f468-200d-1f467\":1637,\"1f468-200d-1f468-200d-1f466\":1625,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1628,\"1f468-200d-1f468-200d-1f467\":1626,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1627,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1629,\"1f468-200d-1f469-200d-1f466\":1620,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1623,\"1f468-200d-1f469-200d-1f467\":1621,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1622,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1624,\"1f468-200d-1f4bb\":1441,\"1f468-200d-1f4bc\":1435,\"1f468-200d-1f527\":1429,\"1f468-200d-1f52c\":1438,\"1f468-200d-1f680\":1453,\"1f468-200d-1f692\":1456,\"1f468-200d-1f9af\":1536,\"1f468-200d-1f9b0\":1362,\"1f468-200d-1f9b1\":1363,\"1f468-200d-1f9b2\":1365,\"1f468-200d-1f9b3\":1364,\"1f468-200d-1f9bc\":1539,\"1f468-200d-1f9bd\":1542,\"1f468-200d-2695\":1411,\"1f468-200d-2696\":1420,\"1f468-200d-2708\":1450,\"1f468-200d-2764-200d-1f468\":1617,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1613,\"1f468\":1360,\"1f469-200d-1f33e\":1424,\"1f469-200d-1f373\":1427,\"1f469-200d-1f37c\":1486,\"1f469-200d-1f393\":1415,\"1f469-200d-1f3a4\":1445,\"1f469-200d-1f3a8\":1448,\"1f469-200d-1f3eb\":1418,\"1f469-200d-1f3ed\":1433,\"1f469-200d-1f466-200d-1f466\":1641,\"1f469-200d-1f466\":1640,\"1f469-200d-1f467-200d-1f466\":1643,\"1f469-200d-1f467-200d-1f467\":1644,\"1f469-200d-1f467\":1642,\"1f469-200d-1f469-200d-1f466\":1630,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1633,\"1f469-200d-1f469-200d-1f467\":1631,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1632,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1634,\"1f469-200d-1f4bb\":1442,\"1f469-200d-1f4bc\":1436,\"1f469-200d-1f527\":1430,\"1f469-200d-1f52c\":1439,\"1f469-200d-1f680\":1454,\"1f469-200d-1f692\":1457,\"1f469-200d-1f9af\":1537,\"1f469-200d-1f9b0\":1367,\"1f469-200d-1f9b1\":1369,\"1f469-200d-1f9b2\":1373,\"1f469-200d-1f9b3\":1371,\"1f469-200d-1f9bc\":1540,\"1f469-200d-1f9bd\":1543,\"1f469-200d-2695\":1412,\"1f469-200d-2696\":1421,\"1f469-200d-2708\":1451,\"1f469-200d-2764-200d-1f468\":1616,\"1f469-200d-2764-200d-1f469\":1618,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1612,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1614,\"1f469\":1366,\"1f46a\":1619,\"1f46b\":1609,\"1f46c\":1610,\"1f46d\":1608,\"1f46e-200d-2640\":1460,\"1f46e-200d-2642\":1459,\"1f46e\":1458,\"1f46f-200d-2640\":1552,\"1f46f-200d-2642\":1551,\"1f46f\":1550,\"1f470-200d-2640\":1483,\"1f470-200d-2642\":1482,\"1f470\":1481,\"1f471-200d-2640\":1375,\"1f471-200d-2642\":1376,\"1f471\":1359,\"1f472\":1476,\"1f473-200d-2640\":1475,\"1f473-200d-2642\":1474,\"1f473\":1473,\"1f474\":1378,\"1f475\":1379,\"1f476\":1354,\"1f477-200d-2640\":1470,\"1f477-200d-2642\":1469,\"1f477\":1468,\"1f478\":1472,\"1f479\":199,\"1f47a\":1100,\"1f47b\":1101,\"1f47c\":1489,\"1f47d\":1102,\"1f47e\":1103,\"1f47f\":194,\"1f480\":195,\"1f481-200d-2640\":1394,\"1f481-200d-2642\":1393,\"1f481\":1392,\"1f482-200d-2640\":1466,\"1f482-200d-2642\":1465,\"1f482\":1464,\"1f483\":1547,\"1f484\":61114,\"1f485\":1335,\"1f486-200d-2640\":1522,\"1f486-200d-2642\":1521,\"1f486\":1520,\"1f487-200d-2640\":1525,\"1f487-200d-2642\":1524,\"1f487\":1523,\"1f488\":4836,\"1f489\":61287,\"1f48a\":61289,\"1f48b\":1117,\"1f48c\":1118,\"1f48d\":61115,\"1f48e\":61116,\"1f48f\":1611,\"1f490\":2621,\"1f491\":1615,\"1f492\":4813,\"1f493\":1123,\"1f494\":1128,\"1f495\":1125,\"1f496\":1121,\"1f497\":1122,\"1f498\":1119,\"1f499\":1133,\"1f49a\":1132,\"1f49b\":1131,\"1f49c\":1134,\"1f49d\":1120,\"1f49e\":1124,\"1f49f\":1126,\"1f4a0\":62859,\"1f4a1\":61175,\"1f4a2\":1139,\"1f4a3\":1145,\"1f4a4\":1151,\"1f4a5\":1140,\"1f4a6\":1142,\"1f4a7\":4986,\"1f4a8\":1143,\"1f4a9\":197,\"1f4aa\":1337,\"1f4ab\":1141,\"1f4ac\":1146,\"1f4ad\":1150,\"1f4ae\":2623,\"1f4af\":1138,\"1f4b0\":61196,\"1f4b1\":62754,\"1f4b2\":62755,\"1f4b3\":61203,\"1f4b4\":61198,\"1f4b5\":61199,\"1f4b6\":61200,\"1f4b7\":61201,\"1f4b8\":61202,\"1f4b9\":61205,\"1f4ba\":4900,\"1f4bb\":61152,\"1f4bc\":61226,\"1f4bd\":61158,\"1f4be\":61159,\"1f4bf\":61160,\"1f4c0\":61161,\"1f4c1\":61227,\"1f4c2\":61228,\"1f4c3\":61188,\"1f4c4\":61190,\"1f4c5\":61230,\"1f4c6\":61231,\"1f4c7\":61234,\"1f4c8\":61235,\"1f4c9\":61236,\"1f4ca\":61237,\"1f4cb\":61238,\"1f4cc\":61239,\"1f4cd\":61240,\"1f4ce\":61241,\"1f4cf\":61243,\"1f4d0\":61244,\"1f4d1\":61193,\"1f4d2\":61187,\"1f4d3\":61186,\"1f4d4\":61179,\"1f4d5\":61180,\"1f4d6\":61181,\"1f4d7\":61182,\"1f4d8\":61183,\"1f4d9\":61184,\"1f4da\":61185,\"1f4db\":62760,\"1f4dc\":61189,\"1f4dd\":61225,\"1f4de\":61147,\"1f4df\":61148,\"1f4e0\":61149,\"1f4e1\":61286,\"1f4e2\":61121,\"1f4e3\":61122,\"1f4e4\":61210,\"1f4e5\":61211,\"1f4e6\":61212,\"1f4e7\":61207,\"1f4e8\":61208,\"1f4e9\":61209,\"1f4ea\":61214,\"1f4eb\":61213,\"1f4ec\":61215,\"1f4ed\":61216,\"1f4ee\":61217,\"1f4ef\":61123,\"1f4f0\":61191,\"1f4f1\":61144,\"1f4f2\":61145,\"1f4f3\":62737,\"1f4f4\":62738,\"1f4f5\":62665,\"1f4f6\":62736,\"1f4f7\":61168,\"1f4f8\":61169,\"1f4f9\":61170,\"1f4fa\":61167,\"1f4fb\":61134,\"1f4fc\":61171,\"1f4fd\":61165,\"1f4ff\":61113,\"1f500\":62715,\"1f501\":62716,\"1f502\":62717,\"1f503\":62683,\"1f504\":62684,\"1f505\":62734,\"1f506\":62735,\"1f507\":61117,\"1f508\":61118,\"1f509\":61119,\"1f50a\":61120,\"1f50b\":61150,\"1f50c\":61151,\"1f50d\":61172,\"1f50e\":61173,\"1f50f\":61251,\"1f510\":61252,\"1f511\":61253,\"1f512\":61249,\"1f513\":61250,\"1f514\":61124,\"1f515\":61125,\"1f516\":61194,\"1f517\":61274,\"1f518\":62860,\"1f519\":62685,\"1f51a\":62686,\"1f51b\":62687,\"1f51c\":62688,\"1f51d\":62689,\"1f51e\":62666,\"1f51f\":62789,\"1f520\":62790,\"1f521\":62791,\"1f522\":62792,\"1f523\":62793,\"1f524\":62794,\"1f525\":4985,\"1f526\":61176,\"1f527\":61267,\"1f528\":61255,\"1f529\":61269,\"1f52a\":3771,\"1f52b\":61262,\"1f52c\":61284,\"1f52d\":61285,\"1f52e\":51046,\"1f52f\":62701,\"1f530\":62761,\"1f531\":62759,\"1f532\":62862,\"1f533\":62861,\"1f534\":62829,\"1f535\":62833,\"1f536\":62853,\"1f537\":62854,\"1f538\":62855,\"1f539\":62856,\"1f53a\":62857,\"1f53b\":62858,\"1f53c\":62725,\"1f53d\":62727,\"1f549\":62692,\"1f54a\":2576,\"1f54b\":4821,\"1f54c\":4817,\"1f54d\":4819,\"1f54e\":62700,\"1f550\":4919,\"1f551\":4921,\"1f552\":4923,\"1f553\":4925,\"1f554\":4927,\"1f555\":4929,\"1f556\":4931,\"1f557\":4933,\"1f558\":4935,\"1f559\":4937,\"1f55a\":4939,\"1f55b\":4917,\"1f55c\":4920,\"1f55d\":4922,\"1f55e\":4924,\"1f55f\":4926,\"1f560\":4928,\"1f561\":4930,\"1f562\":4932,\"1f563\":4934,\"1f564\":4936,\"1f565\":4938,\"1f566\":4940,\"1f567\":4918,\"1f56f\":61174,\"1f570\":4916,\"1f573\":1144,\"1f574\":1549,\"1f575-200d-2640\":1463,\"1f575-200d-2642\":1462,\"1f575\":1461,\"1f576\":61073,\"1f577\":2614,\"1f578\":2615,\"1f579\":51050,\"1f57a\":1548,\"1f587\":61242,\"1f58a\":61222,\"1f58b\":61221,\"1f58c\":61223,\"1f58d\":61224,\"1f590\":1305,\"1f595\":1319,\"1f596\":1307,\"1f5a4\":1136,\"1f5a5\":61153,\"1f5a8\":61154,\"1f5b1\":61156,\"1f5b2\":61157,\"1f5bc\":51066,\"1f5c2\":61229,\"1f5c3\":61246,\"1f5c4\":61247,\"1f5d1\":61248,\"1f5d2\":61232,\"1f5d3\":61233,\"1f5dc\":61271,\"1f5dd\":61254,\"1f5de\":61192,\"1f5e1\":61260,\"1f5e3\":1645,\"1f5e8\":1148,\"1f5ef\":1149,\"1f5f3\":61218,\"1f5fa\":4777,\"1f5fb\":4783,\"1f5fc\":4814,\"1f5fd\":4815,\"1f5fe\":4778,\"1f5ff\":61320,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":113,\"1f608\":193,\"1f609\":111,\"1f60a\":112,\"1f60b\":123,\"1f60c\":143,\"1f60d\":115,\"1f60e\":162,\"1f60f\":138,\"1f610\":135,\"1f611\":136,\"1f612\":139,\"1f613\":185,\"1f614\":144,\"1f615\":165,\"1f616\":182,\"1f617\":118,\"1f618\":117,\"1f619\":121,\"1f61a\":120,\"1f61b\":124,\"1f61c\":125,\"1f61d\":127,\"1f61e\":184,\"1f61f\":166,\"1f620\":191,\"1f621\":190,\"1f622\":179,\"1f623\":183,\"1f624\":189,\"1f625\":178,\"1f626\":174,\"1f627\":175,\"1f628\":176,\"1f629\":186,\"1f62a\":145,\"1f62b\":187,\"1f62c\":141,\"1f62d\":180,\"1f62e\":169,\"1f62f\":170,\"1f630\":177,\"1f631\":181,\"1f632\":171,\"1f633\":172,\"1f634\":147,\"1f635\":157,\"1f636\":137,\"1f637\":148,\"1f638\":1106,\"1f639\":1107,\"1f63a\":1105,\"1f63b\":1108,\"1f63c\":1109,\"1f63d\":1110,\"1f63e\":1113,\"1f63f\":1112,\"1f640\":1111,\"1f641\":167,\"1f642\":19,\"1f643\":110,\"1f644\":140,\"1f645-200d-2640\":1388,\"1f645-200d-2642\":1387,\"1f645\":1386,\"1f646-200d-2640\":1391,\"1f646-200d-2642\":1390,\"1f646\":1389,\"1f647-200d-2640\":1403,\"1f647-200d-2642\":1402,\"1f647\":1401,\"1f648\":1114,\"1f649\":1115,\"1f64a\":1116,\"1f64b-200d-2640\":1397,\"1f64b-200d-2642\":1396,\"1f64b\":1395,\"1f64c\":1329,\"1f64d-200d-2640\":1382,\"1f64d-200d-2642\":1381,\"1f64d\":1380,\"1f64e-200d-2640\":1385,\"1f64e-200d-2642\":1384,\"1f64e\":1383,\"1f64f\":1333,\"1f680\":4906,\"1f681\":4901,\"1f682\":4838,\"1f683\":4839,\"1f684\":4840,\"1f685\":4841,\"1f686\":4842,\"1f687\":4843,\"1f688\":4844,\"1f689\":4845,\"1f68a\":4846,\"1f68b\":4849,\"1f68c\":4850,\"1f68d\":4851,\"1f68e\":4852,\"1f68f\":4877,\"1f690\":4853,\"1f691\":4854,\"1f692\":4855,\"1f693\":4856,\"1f694\":4857,\"1f695\":4858,\"1f696\":4859,\"1f697\":4860,\"1f698\":4861,\"1f699\":4862,\"1f69a\":4864,\"1f69b\":4865,\"1f69c\":4866,\"1f69d\":4847,\"1f69e\":4848,\"1f69f\":4902,\"1f6a0\":4903,\"1f6a1\":4904,\"1f6a2\":4894,\"1f6a3-200d-2640\":1571,\"1f6a3-200d-2642\":1570,\"1f6a3\":1569,\"1f6a4\":4890,\"1f6a5\":4883,\"1f6a6\":4884,\"1f6a7\":4886,\"1f6a8\":4882,\"1f6a9\":71543,\"1f6aa\":61292,\"1f6ab\":62659,\"1f6ac\":61316,\"1f6ad\":62661,\"1f6ae\":62644,\"1f6af\":62662,\"1f6b0\":62645,\"1f6b1\":62663,\"1f6b2\":4873,\"1f6b3\":62660,\"1f6b4-200d-2640\":1583,\"1f6b4-200d-2642\":1582,\"1f6b4\":1581,\"1f6b5-200d-2640\":1586,\"1f6b5-200d-2642\":1585,\"1f6b5\":1584,\"1f6b6-200d-2640\":1528,\"1f6b6-200d-2642\":1527,\"1f6b6\":1526,\"1f6b7\":62664,\"1f6b8\":62657,\"1f6b9\":62647,\"1f6ba\":62648,\"1f6bb\":62649,\"1f6bc\":62650,\"1f6bd\":61299,\"1f6be\":62651,\"1f6bf\":61301,\"1f6c0\":1605,\"1f6c1\":61302,\"1f6c2\":62652,\"1f6c3\":62653,\"1f6c4\":62654,\"1f6c5\":62655,\"1f6cb\":61297,\"1f6cc\":1606,\"1f6cd\":61095,\"1f6ce\":4908,\"1f6cf\":61296,\"1f6d0\":62690,\"1f6d1\":4885,\"1f6d2\":61315,\"1f6d5\":4818,\"1f6d6\":4795,\"1f6d7\":61293,\"1f6e0\":61259,\"1f6e1\":61265,\"1f6e2\":4880,\"1f6e3\":4878,\"1f6e4\":4879,\"1f6e5\":4893,\"1f6e9\":4896,\"1f6eb\":4897,\"1f6ec\":4898,\"1f6f0\":4905,\"1f6f3\":4891,\"1f6f4\":4874,\"1f6f5\":4869,\"1f6f6\":4889,\"1f6f7\":51040,\"1f6f8\":4907,\"1f6f9\":4875,\"1f6fa\":4872,\"1f6fb\":4863,\"1f6fc\":4876,\"1f7e0\":62830,\"1f7e1\":62831,\"1f7e2\":62832,\"1f7e3\":62834,\"1f7e4\":62835,\"1f7e5\":62838,\"1f7e6\":62842,\"1f7e7\":62839,\"1f7e8\":62840,\"1f7e9\":62841,\"1f7ea\":62843,\"1f7eb\":62844,\"1f90c\":1309,\"1f90d\":1137,\"1f90e\":1135,\"1f90f\":1310,\"1f910\":133,\"1f911\":128,\"1f912\":149,\"1f913\":163,\"1f914\":132,\"1f915\":150,\"1f916\":1104,\"1f917\":129,\"1f918\":1314,\"1f919\":1315,\"1f91a\":1304,\"1f91b\":1326,\"1f91c\":1327,\"1f91d\":1332,\"1f91e\":1312,\"1f91f\":1313,\"1f920\":159,\"1f921\":198,\"1f922\":151,\"1f923\":17,\"1f924\":146,\"1f925\":142,\"1f926-200d-2640\":1406,\"1f926-200d-2642\":1405,\"1f926\":1404,\"1f927\":153,\"1f928\":134,\"1f929\":116,\"1f92a\":126,\"1f92b\":131,\"1f92c\":192,\"1f92d\":130,\"1f92e\":152,\"1f92f\":158,\"1f930\":1484,\"1f931\":1485,\"1f932\":1331,\"1f933\":1336,\"1f934\":1471,\"1f935-200d-2640\":1480,\"1f935-200d-2642\":1479,\"1f935\":1478,\"1f936\":1491,\"1f937-200d-2640\":1409,\"1f937-200d-2642\":1408,\"1f937\":1407,\"1f938-200d-2640\":1589,\"1f938-200d-2642\":1588,\"1f938\":1587,\"1f939-200d-2640\":1601,\"1f939-200d-2642\":1600,\"1f939\":1599,\"1f93a\":1559,\"1f93c-200d-2640\":1592,\"1f93c-200d-2642\":1591,\"1f93c\":1590,\"1f93d-200d-2640\":1595,\"1f93d-200d-2642\":1594,\"1f93d\":1593,\"1f93e-200d-2640\":1598,\"1f93e-200d-2642\":1597,\"1f93e\":1596,\"1f93f\":51037,\"1f940\":2626,\"1f941\":61142,\"1f942\":3760,\"1f943\":3761,\"1f944\":3770,\"1f945\":51033,\"1f947\":51012,\"1f948\":51013,\"1f949\":51014,\"1f94a\":51031,\"1f94b\":51032,\"1f94c\":51041,\"1f94d\":51028,\"1f94e\":51017,\"1f94f\":51023,\"1f950\":3679,\"1f951\":3663,\"1f952\":3670,\"1f953\":3690,\"1f954\":3665,\"1f955\":3666,\"1f956\":3680,\"1f957\":3707,\"1f958\":3703,\"1f959\":3699,\"1f95a\":3701,\"1f95b\":3749,\"1f95c\":3676,\"1f95d\":3659,\"1f95e\":3684,\"1f95f\":3726,\"1f960\":3727,\"1f961\":3728,\"1f962\":3767,\"1f963\":3706,\"1f964\":3762,\"1f965\":3662,\"1f966\":3672,\"1f967\":3742,\"1f968\":3682,\"1f969\":3689,\"1f96a\":3695,\"1f96b\":3711,\"1f96c\":3671,\"1f96d\":3651,\"1f96e\":3724,\"1f96f\":3683,\"1f970\":114,\"1f971\":188,\"1f972\":122,\"1f973\":160,\"1f974\":156,\"1f975\":154,\"1f976\":155,\"1f977\":1467,\"1f978\":161,\"1f97a\":173,\"1f97b\":61086,\"1f97c\":61075,\"1f97d\":61074,\"1f97e\":61100,\"1f97f\":61101,\"1f980\":3729,\"1f981\":2519,\"1f982\":2616,\"1f983\":2568,\"1f984\":2525,\"1f985\":2577,\"1f986\":2578,\"1f987\":2557,\"1f988\":2602,\"1f989\":2580,\"1f98a\":2514,\"1f98b\":2606,\"1f98c\":2527,\"1f98d\":2506,\"1f98e\":2589,\"1f98f\":2546,\"1f990\":3731,\"1f991\":3732,\"1f992\":2543,\"1f993\":2526,\"1f994\":2556,\"1f995\":2593,\"1f996\":2594,\"1f997\":2612,\"1f998\":2565,\"1f999\":2542,\"1f99a\":2584,\"1f99b\":2547,\"1f99c\":2585,\"1f99d\":2515,\"1f99e\":3730,\"1f99f\":2617,\"1f9a0\":2620,\"1f9a1\":2566,\"1f9a2\":2579,\"1f9a3\":2545,\"1f9a4\":2581,\"1f9a5\":2562,\"1f9a6\":2563,\"1f9a7\":2507,\"1f9a8\":2564,\"1f9a9\":2583,\"1f9aa\":3733,\"1f9ab\":2555,\"1f9ac\":2528,\"1f9ad\":2598,\"1f9ae\":2510,\"1f9af\":61273,\"1f9b4\":1349,\"1f9b5\":1340,\"1f9b6\":1341,\"1f9b7\":1348,\"1f9b8-200d-2640\":1495,\"1f9b8-200d-2642\":1494,\"1f9b8\":1493,\"1f9b9-200d-2640\":1498,\"1f9b9-200d-2642\":1497,\"1f9b9\":1496,\"1f9ba\":61076,\"1f9bb\":1343,\"1f9bc\":4871,\"1f9bd\":4870,\"1f9be\":1338,\"1f9bf\":1339,\"1f9c0\":3686,\"1f9c1\":3741,\"1f9c2\":3710,\"1f9c3\":3764,\"1f9c4\":3673,\"1f9c5\":3674,\"1f9c6\":3700,\"1f9c7\":3685,\"1f9c8\":3709,\"1f9c9\":3765,\"1f9ca\":3766,\"1f9cb\":3763,\"1f9cd-200d-2640\":1531,\"1f9cd-200d-2642\":1530,\"1f9cd\":1529,\"1f9ce-200d-2640\":1534,\"1f9ce-200d-2642\":1533,\"1f9ce\":1532,\"1f9cf-200d-2640\":1400,\"1f9cf-200d-2642\":1399,\"1f9cf\":1398,\"1f9d0\":164,\"1f9d1-200d-1f33e\":1422,\"1f9d1-200d-1f373\":1425,\"1f9d1-200d-1f37c\":1488,\"1f9d1-200d-1f384\":1492,\"1f9d1-200d-1f393\":1413,\"1f9d1-200d-1f3a4\":1443,\"1f9d1-200d-1f3a8\":1446,\"1f9d1-200d-1f3eb\":1416,\"1f9d1-200d-1f3ed\":1431,\"1f9d1-200d-1f4bb\":1440,\"1f9d1-200d-1f4bc\":1434,\"1f9d1-200d-1f527\":1428,\"1f9d1-200d-1f52c\":1437,\"1f9d1-200d-1f680\":1452,\"1f9d1-200d-1f692\":1455,\"1f9d1-200d-1f91d-200d-1f9d1\":1607,\"1f9d1-200d-1f9af\":1535,\"1f9d1-200d-1f9b0\":1368,\"1f9d1-200d-1f9b1\":1370,\"1f9d1-200d-1f9b2\":1374,\"1f9d1-200d-1f9b3\":1372,\"1f9d1-200d-1f9bc\":1538,\"1f9d1-200d-1f9bd\":1541,\"1f9d1-200d-2695\":1410,\"1f9d1-200d-2696\":1419,\"1f9d1-200d-2708\":1449,\"1f9d1\":1358,\"1f9d2\":1355,\"1f9d3\":1377,\"1f9d4\":1361,\"1f9d5\":1477,\"1f9d6-200d-2640\":1555,\"1f9d6-200d-2642\":1554,\"1f9d6\":1553,\"1f9d7-200d-2640\":1558,\"1f9d7-200d-2642\":1557,\"1f9d7\":1556,\"1f9d8-200d-2640\":1604,\"1f9d8-200d-2642\":1603,\"1f9d8\":1602,\"1f9d9-200d-2640\":1501,\"1f9d9-200d-2642\":1500,\"1f9d9\":1499,\"1f9da-200d-2640\":1504,\"1f9da-200d-2642\":1503,\"1f9da\":1502,\"1f9db-200d-2640\":1507,\"1f9db-200d-2642\":1506,\"1f9db\":1505,\"1f9dc-200d-2640\":1510,\"1f9dc-200d-2642\":1509,\"1f9dc\":1508,\"1f9dd-200d-2640\":1513,\"1f9dd-200d-2642\":1512,\"1f9dd\":1511,\"1f9de-200d-2640\":1516,\"1f9de-200d-2642\":1515,\"1f9de\":1514,\"1f9df-200d-2640\":1519,\"1f9df-200d-2642\":1518,\"1f9df\":1517,\"1f9e0\":1345,\"1f9e1\":1130,\"1f9e2\":61110,\"1f9e3\":61080,\"1f9e4\":61081,\"1f9e5\":61082,\"1f9e6\":61083,\"1f9e7\":51003,\"1f9e8\":5992,\"1f9e9\":51053,\"1f9ea\":61281,\"1f9eb\":61282,\"1f9ec\":61283,\"1f9ed\":4779,\"1f9ee\":61162,\"1f9ef\":61314,\"1f9f0\":61277,\"1f9f1\":4792,\"1f9f2\":61278,\"1f9f3\":4909,\"1f9f4\":61305,\"1f9f5\":51068,\"1f9f6\":51070,\"1f9f7\":61306,\"1f9f8\":51054,\"1f9f9\":61307,\"1f9fa\":61308,\"1f9fb\":61309,\"1f9fc\":61311,\"1f9fd\":61313,\"1f9fe\":61204,\"1f9ff\":51048,\"1fa70\":61104,\"1fa71\":61087,\"1fa72\":61088,\"1fa73\":61089,\"1fa74\":61097,\"1fa78\":61288,\"1fa79\":61290,\"1fa7a\":61291,\"1fa80\":51043,\"1fa81\":51044,\"1fa82\":4899,\"1fa83\":61263,\"1fa84\":51047,\"1fa85\":51055,\"1fa86\":51056,\"1fa90\":4957,\"1fa91\":61298,\"1fa92\":61304,\"1fa93\":61256,\"1fa94\":61178,\"1fa95\":61141,\"1fa96\":61111,\"1fa97\":61136,\"1fa98\":61143,\"1fa99\":61197,\"1fa9a\":61266,\"1fa9b\":61268,\"1fa9c\":61279,\"1fa9d\":61276,\"1fa9e\":61294,\"1fa9f\":61295,\"1faa0\":61300,\"1faa1\":51069,\"1faa2\":51071,\"1faa3\":61310,\"1faa4\":61303,\"1faa5\":61312,\"1faa6\":61318,\"1faa7\":61321,\"1faa8\":4793,\"1fab0\":2618,\"1fab1\":2619,\"1fab2\":2610,\"1fab3\":2613,\"1fab4\":2632,\"1fab5\":4794,\"1fab6\":2582,\"1fac0\":1346,\"1fac1\":1347,\"1fac2\":1648,\"1fad0\":3658,\"1fad1\":3669,\"1fad2\":3661,\"1fad3\":3681,\"1fad4\":3698,\"1fad5\":3705,\"1fad6\":3751,\"203c\":62747,\"21a9\":62679,\"21aa\":62680,\"231a\":4912,\"231b\":4910,\"23cf\":62732,\"23e9\":62719,\"23ea\":62723,\"23eb\":62726,\"23ec\":62728,\"23ed\":62720,\"23ee\":62724,\"23ef\":62721,\"23f0\":4913,\"23f1\":4914,\"23f2\":4915,\"23f3\":4911,\"23f8\":62729,\"23f9\":62730,\"23fa\":62731,\"24c2\":62803,\"25aa\":62851,\"25ab\":62852,\"25b6\":62718,\"25c0\":62722,\"25fb\":62848,\"25fc\":62847,\"25fd\":62850,\"25fe\":62849,\"260e\":61146,\"261d\":1321,\"262a\":62698,\"262e\":62699,\"262f\":62695,\"263a\":119,\"264a\":62704,\"264b\":62705,\"264c\":62706,\"264d\":62707,\"264e\":62708,\"264f\":62709,\"265f\":51061,\"267b\":62757,\"267e\":62746,\"267f\":62646,\"269b\":62691,\"269c\":62758,\"26a0\":62656,\"26a1\":4980,\"26a7\":62741,\"26aa\":62837,\"26ab\":62836,\"26b0\":61317,\"26b1\":61319,\"26bd\":51015,\"26be\":51016,\"26c4\":4983,\"26c5\":4963,\"26c8\":4964,\"26ce\":62714,\"26cf\":61257,\"26d1\":61112,\"26d3\":61275,\"26d4\":62658,\"26e9\":4820,\"26ea\":4816,\"26f0\":4781,\"26f1\":4979,\"26f2\":4822,\"26f3\":51034,\"26f4\":4892,\"26f5\":4888,\"26f7\":1561,\"26f8\":51035,\"26f9-200d-2640\":1577,\"26f9-200d-2642\":1576,\"26f9\":1575,\"26fa\":4823,\"26fd\":4881,\"270a\":1324,\"270b\":1306,\"270c\":1311,\"270d\":1334,\"270f\":61219,\"271d\":62696,\"274c\":62766,\"274e\":62767,\"27a1\":62671,\"27b0\":62768,\"27bf\":62769,\"2b05\":62675,\"2b06\":62669,\"2b07\":62673,\"2b1b\":62845,\"2b1c\":62846,\"2b50\":4958,\"2b55\":62762,\"303d\":62770,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0};\r\n\r\n/* Emoji[\"00a9-fe0f\"] = 6362;\r\nEmoji[\"00ae-fe0f\"] = 6363;\r\nEmoji[\"2122-fe0f\"] = 6364; */\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nexport const TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nexport const LatinizeMap: {[k: string]: string} = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\r\n\r\nconst Config = {\r\n Emoji,\r\n LatinizeMap,\r\n TLD,\r\n MediaSizes: mediaSizes\r\n};\r\nMOUNT_CLASS_TO.Config = Config;\r\nexport default Config;\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 DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport deepEqual from \"../helpers/object/deepEqual\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport capitalizeFirstLetter from \"../helpers/string/capitalizeFirstLetter\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\n\n if(haveToUpdate) {\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach(element => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && RichTextProcessor.matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = RichTextProcessor.wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map(item => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: /* 'innerText' | */'innerHTML' | 'placeholder',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceID ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.c0cc94110cda650246b2.bundle.worker.js\");\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 WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\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 WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\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 } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\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 fileName = 'main-' + fileName;\r\n\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;","/*\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 { tsNow } from \"../../helpers/date\";\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(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\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 const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\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 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 * 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 { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager 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\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 {\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 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 || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['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 const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\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 const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.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 rootScope.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 rootScope.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","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = \"((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from './config';\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { MessageEntity } from '../layer';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport copy from '../helpers/object/copy';\nimport encodeEntities from '../helpers/string/encodeEntities';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst emojiData = Config.Emoji;\n\nconst alphaCharsRegExp = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\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}' +\n '|' +\n // host name\n urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\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,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nconst passConflictingEntities: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export function getEmojiSpritesheetCoords(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!emojiData.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return null;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const emojiCoords = getEmojiSpritesheetCoords(match[8]);\n if(emojiCoords) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: emojiCoords\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\n\n /* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n } */\n\n export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n \n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n }\n\n const CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n ]);\n export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n }\n\n /**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n\n contextHashtag?: string,\n }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n const startOffset = entity.offset, endOffset = endPart ? entity.offset + entity.length : undefined;\n let startIndex: number, endIndex: number, length = lol.length;\n for(let i = length - 1; i >= 0; --i) {\n const offset = lol[i].offset;\n\n if(startIndex === undefined && startOffset >= offset) {\n startIndex = i + 1;\n }\n\n if(endOffset !== undefined) {\n if(endOffset <= offset) {\n endIndex = i;\n }\n }\n\n if(startOffset > offset && (endOffset === undefined || endOffset < offset)) {\n break;\n }\n }\n\n startIndex ??= 0;\n lol.splice(startIndex, 0, {part: startPart, offset: entity.offset/* , priority */});\n\n if(endOffset !== undefined) {\n endIndex ??= startIndex;\n ++endIndex;\n lol.splice(endIndex, 0, {part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n const textLength = text.length;\n for(let i = 0, length = entities.length; i < length; ++i) {\n let entity = entities[i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, ``, ``);\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n //if(!(options.wrappingDraft && IS_EMOJI_SUPPORTED)) { // * fix safari emoji\n if(!IS_EMOJI_SUPPORTED) { // no wrapping needed\n // if(IS_EMOJI_SUPPORTED) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!IS_EMOJI_SUPPORTED) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\n break;\n }\n\n /* case 'messageEntityLinebreak': {\n if(options.noLinebreaks) {\n insertPart(entity, ' ');\n } else {\n insertPart(entity, '
');\n }\n \n break;\n } */\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const after = text.slice(entity.offset + entity.length);\n text = before + spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */ + after;\n } else if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n // lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, pushPartsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < pushPartsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += pushPartsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n const sliced = text.slice(usedLength, offset);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n const sliced = text.slice(usedLength);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n }\n\n return arr.join('');\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return '';\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n\n export function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n }\n \n /* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n } */\n \n /**\n * ! This function is still unsafe to use with .innerHTML\n */\n export function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n if(entities?.length) {\n entities = entities.filter(entity => entity._ === 'messageEntitySpoiler');\n }\n \n return wrapRichText(text, {\n entities, \n noEncoding: true,\n noTextFormat: true,\n noLinebreaks: true,\n noLinks: true\n });\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n if(/^\\W/.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n \n return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.b18e2703b7b89f161924.bundle.worker.js\");\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 { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\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 { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, JSONValue, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport CryptoWorkerMethods, { CryptoMethods } from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport { pause } from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport type { ApiError } from './apiManager';\nimport { MTAppConfig } from './appConfig';\nimport { ignoreRestrictionReasons } from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise;\n private getAppConfigPromise: Promise;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \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 this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\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 this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n // const worker = new Worker(new URL('./mtproto.worker.ts', import.meta.url));\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n private createTask(task: string, type: string, args: any[]): any {\n return {\n task,\n taskId: this.taskId++,\n type,\n args,\n };\n }\n\n public performTaskWorkerVoid(taskName: string, ...args: any[]) {\n const task = this.createTask(taskName, undefined, args);\n this.pending.push(task);\n this.releasePending();\n }\n\n public performTaskWorkerNew(taskName: string, type: string, ...args: any[]) {\n this.debug && this.log.debug('start', taskName, args);\n\n return new Promise((resolve, reject) => {\n const task = this.createTask(taskName, type, args);\n this.pending.push(task);\n this.awaiting[task.taskId] = {resolve, reject, taskName: taskName};\n this.releasePending();\n });\n }\n\n public performTaskWorker(task: string, ...args: any[]) {\n return this.performTaskWorkerNew(task, undefined, ...args);\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return this.performTaskWorkerNew(method, 'crypto', ...args);\n }\n \n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T, \n processResult?: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: Omit, \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(rootScope.appConfig && !overwrite) return rootScope.appConfig;\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n const promise: Promise = this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then((config: MTAppConfig) => {\n if(this.getAppConfigPromise !== promise) {\n return this.getAppConfigPromise;\n }\n \n rootScope.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n return config;\n });\n\n return promise;\n }\n}\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\r\nimport type bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport type gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport type { Awaited } from \"../../types\";\r\nimport type getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport type computeDhKey from \"./computeDhKey\";\r\nimport type generateDh from \"./generateDh\";\r\nimport type computeSRP from \"./srp\";\r\nimport type { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport type factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\n// import type factorizeTdlibPQ from \"./utils/factorize/tdlib\";\r\nimport type pbkdf2 from \"./utils/pbkdf2\";\r\nimport type rsaEncrypt from \"./utils/rsa\";\r\nimport type sha1 from \"./utils/sha1\";\r\nimport type sha256 from \"./utils/sha256\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1': typeof sha1,\r\n 'sha256': typeof sha256,\r\n 'pbkdf2': typeof pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': typeof factorizeTdlibPQ,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP,\r\n 'generate-dh': typeof generateDh,\r\n 'compute-dh-key': typeof computeDhKey,\r\n 'get-emojis-fingerprint': typeof getEmojisFingerprint\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(\r\n method: Method, \r\n ...args: Parameters\r\n ): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize\r\n};\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\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 I18n, { i18n } from \"../lib/langPack\";\r\nimport tsNow from './tsNow';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport {tsNow};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every(key => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/102.e314611ed72b13b03b17.chunk.js b/public/102.e314611ed72b13b03b17.chunk.js deleted file mode 100644 index 35189ad5..00000000 --- a/public/102.e314611ed72b13b03b17.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[102,339],{3019:(e,t,n)=>{function i(e,t){return new Promise((n=>{const i=new FileReader;i.addEventListener("loadend",(e=>{n(e.target.result)})),i[t](e)}))}n.d(t,{Z:()=>i})},8150:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(3019);function a(e){return(0,i.Z)(e,"readAsArrayBuffer")}},7151:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(8150);function a(e){return(0,i.Z)(e).then((e=>new Uint8Array(e)))}},8576:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(1267),a=n(8975),r=n(2328);class s{constructor(e){this.dbName=e,this.useStorage=!0,i.Z.test&&(this.dbName+="_test"),s.STORAGES.length&&(this.useStorage=s.STORAGES[0].useStorage),this.openDatabase(),s.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation((t=>t.delete("/"+e)))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation((t=>t.match("/"+e)))}save(e,t){return this.timeoutOperation((n=>n.put("/"+e,t)))}getFile(e,t="blob"){return this.get(e).then((e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=(0,a.Z)(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,n)=>{return i=this,a=void 0,s=function*(){let i=!1;const a=setTimeout((()=>{n(),i=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const a=yield e(n);if(i)return;t(a)}catch(e){n(e)}clearTimeout(a)},new((r=void 0)||(r=Promise))((function(e,t){function n(e){try{u(s.next(e))}catch(e){t(e)}}function o(e){try{u(s.throw(e))}catch(e){t(e)}}function u(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,o)}u((s=s.apply(i,a||[])).next())}));var i,a,r,s})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=r.Z.getFakeFileWriter(t,(t=>this.saveFile(e,t).catch((()=>t))));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map((t=>{if(t.useStorage=e,!e)return t.deleteAll()})))}}s.STORAGES=[]},2328:(e,t,n)=>{n.d(t,{Z:()=>r});var i=n(8975),a=n(7151);const r=new class{constructor(){this.blobSupported=!0;try{(0,i.Z)([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(0,a.Z)(t).then((t=>e.write(t))):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>{return t=this,i=void 0,r=function*(){if(!this.blobSupported)throw!1;n.push(e)},new((a=void 0)||(a=Promise))((function(e,n){function s(e){try{u(r.next(e))}catch(e){n(e)}}function o(e){try{u(r.throw(e))}catch(e){n(e)}}function u(t){var n;t.done?e(t.value):(n=t.value,n instanceof a?n:new a((function(e){e(n)}))).then(s,o)}u((r=r.apply(t,i||[])).next())}));var t,i,a,r},truncate:()=>{n.length=0},finalize:(a=!0)=>{const r=(0,i.Z)(n,e);return a&&t&&t(r),r}}}}},2582:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(4727);class a{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,i.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,i.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,n)=>{n.r(t),n.d(t,{default:()=>b});var i=n(4494),a=n(503),r=n(6858),s=n(6765),o=n(4687),u=n(4727),c=n(9518),l=n(8598),h=n(2582),p=n(4874),d=n(8799),m=n(5565);let v=null;const b=new p.Z("page-signUp",!0,(()=>Promise.all([n.e(714),n.e(272)]).then(n.bind(n,8209)).then((e=>{const t=new h.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const o=document.createElement("canvas");o.id="canvas-avatar",o.className="avatar-edit-canvas";const p=document.createElement("span");p.className="tgico tgico-cameraadd",t.imageDiv.append(o,p);const b=e.default;let g;t.imageDiv.addEventListener("click",(()=>{(new s.Z).open(o,(e=>{g=e}))}));const f=e=>{const n=w.value||"",i=y.value||"",a=n||i?(n+" "+i).trim():"";a?(0,m.Z)(t.title,l.Z.wrapEmojiText(a)):(0,m.Z)(t.title,(0,u.i18n)("YourName"))},w=new a.Z({label:"FirstName",maxLength:70}),y=new a.Z({label:"LastName",maxLength:64}),S=(0,i.Z)("btn-primary btn-color-primary"),Z=new u.default.IntlElement({key:"StartMessaging"});return S.append(Z.element),t.inputWrapper.append(w.container,y.container,S),w.input.addEventListener("input",f),y.input.addEventListener("input",f),S.addEventListener("click",(function(e){if(w.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const t=w.value.trim(),i=y.value.trim(),a={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:t,last_name:i};Z.update({key:"PleaseWait"});const s=(0,r.y7)(this);c.Z.invokeApi("auth.signUp",a).then((e=>{"auth.authorization"===e._?(c.Z.setUser(e.user),new Promise(((e,t)=>{if(!g)return e();g().then((n=>{b.uploadProfilePhoto(n).then(e,t)}),t)})).finally((()=>{n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()}))}))):(Z.update({key:e._}),this.removeAttribute("disabled"),s.remove())})).catch((e=>{this.removeAttribute("disabled"),s.remove(),e.type,Z.update({key:e.type})}))})),(0,d.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}))),(e=>{v=e,o.default.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); -//# sourceMappingURL=102.e314611ed72b13b03b17.chunk.js.map \ No newline at end of file diff --git a/public/102.e314611ed72b13b03b17.chunk.js.map b/public/102.e314611ed72b13b03b17.chunk.js.map deleted file mode 100644 index c97ea978..00000000 --- a/public/102.e314611ed72b13b03b17.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"102.e314611ed72b13b03b17.chunk.js","mappings":"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","sources":["webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/fileManager.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["readBlobAs","blob","method","Promise","resolve","reader","FileReader","addEventListener","e","target","result","readBlobAsArrayBuffer","readBlobAsUint8Array","then","buffer","Uint8Array","CacheStorageController","constructor","dbName","useStorage","this","STORAGES","length","openDatabase","push","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","Blob","Response","headers","size","callback","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","getFileWriter","mimeType","fakeWriter","catch","static","enabled","all","map","storage","blobSupported","isAvailable","write","fileWriter","bytes","arr","getFakeFileWriter","saveFileCallback","blobParts","part","truncate","finalize","saveToStorage","LoginPage","options","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","i18n","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","imported","page","classList","add","avatarPreview","id","addIco","appProfileManager","default","uploadAvatar","_uploadAvatar","handleInput","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","_","user","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/104.ddc5d5d8ab3d3894ff32.chunk.js b/public/104.ddc5d5d8ab3d3894ff32.chunk.js deleted file mode 100644 index 06a4bf2e..00000000 --- a/public/104.ddc5d5d8ab3d3894ff32.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","UsernameSettings.ChangeDescription":"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); -//# sourceMappingURL=104.ddc5d5d8ab3d3894ff32.chunk.js.map \ No newline at end of file diff --git a/public/104.ddc5d5d8ab3d3894ff32.chunk.js.map b/public/104.ddc5d5d8ab3d3894ff32.chunk.js.map deleted file mode 100644 index f3d3e5ec..00000000 --- a/public/104.ddc5d5d8ab3d3894ff32.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"104.ddc5d5d8ab3d3894ff32.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterMenuDelete\": \"Delete Folder\",\n \"FilterHeaderEdit\": \"Edit Folder\",\n \"FilterAllGroups\": \"All Groups\",\n \"FilterAllContacts\": \"All Contacts\",\n \"FilterAllNonContacts\": \"All Non-Contacts\",\n \"FilterAllChannels\": \"All Channels\",\n \"FilterAllBots\": \"All Bots\",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\"\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\"\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.TimeFormat\": \"Time Format\",\n \"General.TimeFormat.h12\": \"12-hour\",\n \"General.TimeFormat.h23\": \"24-hour\",\n \"ChatBackground.UploadWallpaper\": \"Upload Wallpaper\",\n \"ChatBackground.Blur\": \"Blur Wallpaper Image\",\n \"Notifications.Sound\": \"Notification Sound\",\n \"NewPrivateChat\": \"New Private Chat\",\n \"NewPoll.OptionLabel\": \"Option %d\",\n \"Message.Context.Selection.Copy\": \"Copy selected\",\n \"Message.Context.Selection.Clear\": \"Clear selection\",\n \"Message.Context.Selection.Delete\": \"Delete selected\",\n \"Message.Context.Selection.Forward\": \"Forward selected\",\n \"Message.Context.Selection.SendNow\": \"Send Now selected\",\n \"Message.Unsupported.Desktop\": \"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__\",\n \"Message.Unsupported.Mobile\": \"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__\",\n \"Checkbox.Enabled\": \"Enabled\",\n \"Checkbox.Disabled\": \"Disabled\",\n \"Error.PreviewSender.CaptionTooLong\": \"Caption is too long.\",\n \"PreviewSender.GroupItems\": \"Group items\",\n \"PreviewSender.SendAlbum\": {\n \"one_value\": \"Send Album\",\n \"other_value\": \"Send %d Albums\"\n },\n \"Presence.YourChat\": \"chat with yourself\",\n \"Privacy.Devices\": {\n \"one_value\": \"%1$d device\",\n \"other_value\": \"%1$d devices\"\n },\n \"Privacy.SensitiveContent\": \"Sensitive Content\",\n \"PrivacyModal.Search.Placeholder\": \"Add Users or Groups...\",\n \"Permissions.NoExceptions\": \"No exceptions\",\n \"Permissions.ExceptionsCount\": {\n \"one_value\": \"%d exception\",\n \"other_value\": \"%d exceptions\"\n },\n \"Link.Available\": \"Link is available\",\n \"Link.Taken\": \"Link is already taken\",\n \"Link.Invalid\": \"Link is invalid\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n //it is from iOS\n \"VoiceChat.DiscussionGroup\": \"discussion group\",\n\n // * android\n \"AccDescrEditing\": \"Editing\",\n \"ActionCreateChannel\": \"Channel created\",\n \"ActionCreateGroup\": \"un1 created the group\",\n \"ActionChangedTitle\": \"un1 changed the group name to un2\",\n \"ActionRemovedPhoto\": \"un1 removed the group photo\",\n \"ActionChangedPhoto\": \"un1 changed the group photo\",\n \"ActionChangedVideo\": \"un1 changed the group video\",\n \"ActionAddUser\": \"un1 added un2\",\n \"ActionAddUserSelf\": \"un1 returned to the group\",\n \"ActionAddUserSelfYou\": \"You returned to the group\",\n \"ActionAddUserSelfMega\": \"un1 joined the group\",\n \"ActionLeftUser\": \"un1 left the group\",\n \"ActionKickUser\": \"un1 removed un2\",\n \"ActionInviteUser\": \"un1 joined the group via invite link\",\n \"ActionPinnedNoText\": \"un1 pinned a message\",\n \"ActionMigrateFromGroup\": \"This group was upgraded to a supergroup\",\n \"ActionYouScored\": \"You scored %1$s\",\n \"ActionUserScored\": \"un1 scored %1$s\",\n \"ActionYouScoredInGame\": \"You scored %1$s in un2\",\n \"ActionUserScoredInGame\": \"un1 scored %1$s in un2\",\n \"AndOther\": {\n \"one_value\": \"and %1$d other\",\n \"other_value\": \"and %1$d others\"\n },\n \"AttachPhoto\": \"Photo\",\n \"AttachVideo\": \"Video\",\n \"AttachGif\": \"GIF\",\n \"AttachLocation\": \"Location\",\n \"AttachLiveLocation\": \"Live Location\",\n \"AttachContact\": \"Contact\",\n //\"AttachDocument\": \"File\",\n \"AttachSticker\": \"Sticker\",\n \"AttachAudio\": \"Voice message\",\n \"AttachRound\": \"Video message\",\n \"AttachGame\": \"Game\",\n \"Bot\": \"bot\",\n //\"ChannelJoined\": \"You joined this channel\",\n \"ChannelMegaJoined\": \"You joined this group\",\n \"EnterChannelName\": \"Channel name\",\n \"DescriptionOptionalPlaceholder\": \"Description (optional)\",\n \"DescriptionPlaceholder\": \"Description\",\n \"DiscussionStarted\": \"Discussion started\",\n \"Draft\": \"Draft\",\n \"FilterAlwaysShow\": \"Include Chats\",\n \"FilterNeverShow\": \"Exclude Chats\",\n \"FilterInclude\": \"Included Chats\",\n \"FilterExclude\": \"Excluded Chats\",\n \"FilterChatTypes\": \"Chat types\",\n \"FilterChats\": \"Chats\",\n \"FilterNew\": \"New Folder\",\n \"Filters\": \"Folders\",\n \"FilterRecommended\": \"Recommended Folders\",\n \"FilterShowMoreChats\": {\n \"one_value\": \"Show %1$d More Chat\",\n \"other_value\": \"Show %1$d More Chats\"\n },\n \"ForwardedMessageCount\": {\n \"one_value\": \"Forwarded message\",\n \"other_value\": \"%1$d forwarded messages\"\n },\n \"FromYou\": \"You\",\n \"Add\": \"Add\",\n \"Chats\": {\n \"one_value\": \"%1$d chat\",\n \"other_value\": \"%1$d chats\"\n },\n \"Channels\": {\n \"one_value\": \"%1$d channel\",\n \"other_value\": \"%1$d channels\"\n },\n \"Comments\": {\n \"one_value\": \"%1$d Comment\",\n \"other_value\": \"%1$d Comments\"\n },\n \"Groups\": {\n \"one_value\": \"%1$d group\",\n \"other_value\": \"%1$d groups\"\n },\n \"Users\": {\n \"one_value\": \"%1$d user\",\n \"other_value\": \"%1$d users\"\n },\n \"Members\": {\n \"one_value\": \"%1$d member\",\n \"other_value\": \"%1$d members\"\n },\n \"messages\": {\n \"one_value\": \"%1$d message\",\n \"other_value\": \"%1$d messages\"\n },\n \"UsernameHelpLink\": \"This link opens a chat with you:\\n%1$s\",\n \"NewChannel\": \"New Channel\",\n \"NewGroup\": \"New Group\",\n \"Contacts\": \"Contacts\",\n \"SavedMessages\": \"Saved Messages\",\n \"Settings\": \"Settings\",\n \"SettingsHelp\": \"Help\",\n \"General\": \"General\",\n \"TextSize\": \"Message Text Size\",\n \"ChatBackground\": \"Chat Background\",\n \"EnableAnimations\": \"Enable Animations\",\n \"AutoDownloadMedia\": \"Auto-Download Media\",\n \"AutodownloadContacts\": \"Contacts\",\n \"AutodownloadPrivateChats\": \"Private Chats\",\n \"AutodownloadGroupChats\": \"Group Chats\",\n \"AutodownloadChannels\": \"Channels\",\n \"AutoplayGIF\": \"GIFs\",\n \"AutoplayVideo\": \"Videos\",\n \"NotificationsForGroups\": \"Notifications for groups\",\n \"NotificationsForPrivateChats\": \"Notifications for private chats\",\n \"NotificationsForChannels\": \"Notifications for channels\",\n \"NotificationsPrivateChats\": \"Private Chats\",\n \"NotificationsGroups\": \"Groups\",\n \"NotificationsChannels\": \"Channels\",\n \"NotificationsOther\": \"Other\",\n \"MarkAsUnread\": \"Mark as unread\",\n \"MarkAsRead\": \"Mark as read\",\n \"ContactJoined\": \"Contact joined Telegram\",\n \"Loading\": \"Loading...\",\n \"Unblock\": \"Unblock\",\n \"BlockedUsers\": \"Blocked Users\",\n \"BlockedUsersInfo\": \"Blocked users will not be able to contact you and will not see your Last Seen time.\",\n \"BlockedEmpty\": \"None\", \n \"TwoStepVerification\": \"Two-Step Verification\",\n \"TwoStepVerificationTitle\": \"Two-Step Verification\",\n \"PinnedMessage\": \"Pinned Message\",\n \"PinnedMessagesCount\": {\n \"one_value\": \"Pinned Message\",\n \"other_value\": \"%1$d Pinned Messages\"\n },\n //\"PreviousPinnedMessage\": \"Previous Message\",\n \"PrivacyExceptions\": \"Exceptions\",\n \"PrivacyLastSeen\": \"Last Seen & Online\",\n \"PrivacySettings\": \"Privacy and Security\",\n \"PrivacyTitle\": \"Privacy\",\n \"PrivacyPhone\": \"Phone Number\",\n \"PrivacyPhoneTitle\": \"Who can see my phone number?\",\n \"PrivacyPhoneTitle2\": \"Who can find me by my number?\",\n \"PrivacyPhoneInfo\": \"Users who have your number saved in their contacts will also see it on Telegram.\",\n \"PrivacyPhoneInfo3\": \"Users who add your number to their contacts will see it on Telegram only if they are your contacts.\",\n \"PrivacyProfilePhoto\": \"Profile Photos\",\n \"PrivacyProfilePhotoTitle\": \"Who can see my profile photos & videos?\",\n \"PrivacyP2PHeader\": \"Peer-to-Peer\",\n \"PrivacyForwardsTitle\": \"Who can add a link to my account when forwarding my messages?\",\n \"Reminders\": \"Reminders\",\n \"ScheduledMessages\": \"Scheduled Messages\",\n \"LastSeenTitle\": \"Who can see your Last Seen time?\",\n \"SessionsTitle\": \"Active Sessions\",\n \"CurrentSession\": \"This device\",\n \"TerminateAllSessions\": \"Terminate All Other Sessions\",\n \"TerminateSessionText\": \"Are you sure you want to terminate this session?\",\n \"OtherSessions\": \"Active sessions\",\n \"AreYouSureDeleteSingleMessage\": \"Are you sure you want to delete this message?\",\n \"AreYouSureDeleteFewMessages\": \"Are you sure you want to delete these messages?\",\n \"AreYouSureDeleteSingleMessageMega\": \"Are you sure you want to delete this message for everyone?\",\n \"AreYouSureDeleteFewMessagesMega\": \"Are you sure you want to delete these messages for everyone?\",\n \"AreYouSureDeleteAndExitName\": \"Are you sure you want to delete and leave the group **%1$s**?\",\n \"AreYouSureDeleteThisChatSavedMessages\": \"Are you sure you want to delete **Saved Messages**?\",\n \"AreYouSureDeleteThisChatWithUser\": \"Are you sure you want to delete the chat with **%1$s**?\",\n \"AreYouSureSessionTitle\": \"Terminate session\",\n \"AreYouSureSessionsTitle\": \"Terminate sessions\",\n \"AreYouSureSessions\": \"Are you sure you want to terminate all other sessions?\",\n \"Terminate\": \"Terminate\",\n \"WhoCanCallMe\": \"Who can call me?\",\n \"WhoCanAddMe\": \"Who can add me to group chats?\",\n \"ArchivedChats\": \"Archived Chats\",\n \"Cancel\": \"Cancel\",\n \"HistoryCleared\": \"History was cleared\",\n \"Archive\": \"Archive\",\n \"Unarchive\": \"Unarchive\",\n \"Delete\": \"Delete\",\n \"Reply\": \"Reply\",\n \"Edit\": \"Edit\",\n \"Forward\": \"Forward\",\n \"CopyLink\": \"Copy Link\",\n \"Copy\": \"Copy\",\n \"Search\": \"Search\",\n \"LinkCopied\": \"Link copied to clipboard\",\n \"LinkCopiedPrivateInfo\": \"This link will only work for members of this chat.\",\n \"GroupAddMembers\": \"Add Members\",\n \"SendMessageTo\": \"Add people...\",\n //\"SelectChat\": \"Select Chat\",\n \"JumpToDate\": \"Jump to Date\",\n \"Caption\": \"Caption\",\n \"Message\": \"Message\",\n \"Poll\": \"Poll\",\n \"SharedFilesTab2\": \"Files\",\n \"SharedMediaTab2\": \"Media\",\n //\"SharedMediaTabFull2\": \"Shared Media\",\n //\"SharedGroupsTab2\": \"Groups\",\n \"SharedLinksTab2\": \"Links\",\n \"SharedMusicTab2\": \"Music\",\n \"SharedVoiceTab2\": \"Voice\",\n //\"SharedGIFsTab2\": \"GIFs\",\n \"NewPoll\": \"New Poll\",\n \"PollOptions\": \"Poll options\",\n \"AskAQuestion\": \"Ask a Question\",\n \"AddAnExplanationInfo\": \"Users will see this text after choosing the wrong answer, good for educational purposes.\",\n \"AccDescrQuizExplanation\": \"Explanation\",\n \"PhoneCopied\": \"Phone copied to clipboard\",\n \"UsernameCopied\": \"Username copied to clipboard.\",\n //\"HashtagCopied\": \"Hashtag copied to clipboard.\",\n \"BioCopied\": \"Bio copied to clipboard.\",\n \"UserBio\": \"Bio\",\n \"Username\": \"Username\",\n \"Phone\": \"Phone\",\n \"Notifications\": \"Notifications\",\n \"AreYouSureDeleteContact\": \"Are you sure you want to delete this contact?\",\n \"AreYouSureDeleteAndExit\": \"Are you sure you want to delete and leave the group?\",\n \"AreYouSureDeleteAndExitChannel\": \"Do you want to delete and leave the channel?\",\n \"DeleteContact\": \"Delete contact\",\n \"GroupType\": \"Group Type\",\n \"ChannelType\": \"Channel Type\",\n \"TypePrivate\": \"Private\",\n \"TypePublic\": \"Public\",\n \"TypePrivateGroup\": \"Private\",\n \"TypePublicGroup\": \"Public\",\n \"GroupMembers\": \"Members\",\n \"DeleteMega\": \"Delete Group\",\n \"DeleteMegaMenu\": \"Delete group\",\n \"DeleteAndExitButton\": \"Delete and Leave Group\",\n \"ChannelDelete\": \"Delete Channel\",\n \"ChannelDeleteMenu\": \"Delete channel\",\n \"ChannelPermissions\": \"Permissions\",\n \"ChannelPermissionsHeader\": \"What can members of this group do?\",\n \"ChannelAddException\": \"Add Exception\",\n \"ChannelBlockedUsers\": \"Removed users\",\n \"NoBlockedUsers\": \"No removed users\",\n \"UserRestrictions\": \"User Permissions\",\n \"UserRestrictionsDisabled\": \"This option is disabled for all members in Group Permissions\",\n \"UserRestrictionsCanDo\": \"What can this user do?\",\n \"UserRestrictionsRead\": \"Read Messages\",\n \"UserRestrictionsSend\": \"Send Messages\",\n \"UserRestrictionsSendMedia\": \"Send Media\",\n \"UserRestrictionsSendPolls\": \"Send Polls\",\n \"UserRestrictionsSendStickers\": \"Send Stickers and GIFs\",\n \"UserRestrictionsEmbedLinks\": \"Embed Links\",\n \"UserRestrictionsChangeInfo\": \"Change Chat Info\",\n \"UserRestrictionsPinMessages\": \"Pin Messages\",\n \"UserRestrictionsInviteUsers\": \"Add Users\",\n //\"UserRestrictionsNoRead\": \"can't read\",\n \"UserRestrictionsNoSend\": \"can't send messages\",\n \"UserRestrictionsNoSendMedia\": \"no media\",\n \"UserRestrictionsNoSendPolls\": \"no polls\",\n \"UserRestrictionsNoSendStickers\": \"no stickers & GIFs\",\n \"UserRestrictionsNoEmbedLinks\": \"no embed links\",\n \"UserRestrictionsNoChangeInfo\": \"can't change Info\",\n \"UserRestrictionsNoPinMessages\": \"no pins\",\n \"UserRestrictionsNoInviteUsers\": \"can't add users\",\n \"UserRestrictionsBlock\": \"Ban and remove from group\",\n \"ChannelPublic\": \"Public Channel\",\n \"MegaPublic\": \"Public Group\",\n //\"MegaLocation\": \"Location-based Group\",\n \"ChannelPublicInfo\": \"Public channels can be found in search, anyone can join them.\",\n \"MegaPublicInfo\": \"Public groups can be found in search, chat history is available to everyone and anyone can join.\",\n \"ChannelPrivate\": \"Private Channel\",\n \"MegaPrivate\": \"Private Group\",\n \"ChannelPrivateInfo\": \"Private channels can only be joined via an invite link.\",\n \"MegaPrivateInfo\": \"Private groups can only be joined if you were invited or have an invite link.\",\n \"ChannelPrivateLinkHelp\": \"People can join your channel by following this link. You can revoke the link any time.\",\n \"MegaPrivateLinkHelp\": \"People can join your group by following this link. You can revoke the link any time.\",\n \"RevokeButton\": \"Revoke\",\n \"RevokeLink\": \"Revoke Link\",\n \"RevokeAlert\": \"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.\",\n \"SetUrlPlaceholder\": \"Link\",\n \"Subscribers\": {\n \"one_value\": \"%1$d subscriber\",\n \"other_value\": \"%1$d subscribers\"\n },\n \"SearchGifsTitle\": \"Search GIFs\",\n \"PinMessageAlert\": \"Pin this message in the group?\",\n \"PinMessageAlertTitle\": \"Pin message\",\n \"PinMessageAlertChannel\": \"Do you want to pin this message in this channel?\",\n \"PinMessageAlertChat\": \"Do you want to pin this message at the top of the chat?\",\n \"UnpinMessageAlertTitle\": \"Unpin message\",\n \"UnpinMessageAlert\": \"Do you want to unpin this message?\",\n \"PinNotify\": \"Notify all members\",\n \"PinMessage\": \"Pin\",\n \"UnpinMessage\": \"Unpin\",\n \"PinAlsoFor\": \"Also pin for %1$s\",\n \"DeleteMessagesTitle\": \"Delete %1$s\",\n \"DeleteSingleMessagesTitle\": \"Delete message\",\n \"DeleteMessagesOption\": \"Unsend My Messages\",\n \"DeleteMessagesOptionAlso\": \"Also delete for %1$s\",\n \"DeleteForAll\": \"Delete for all members\",\n \"DeleteMessagesTextGroup\": \"You can also delete the %1$s you sent from the inboxes of other group members by checking \\\"Unsend my messages\\\".\",\n \"LeaveChannel\": \"Leave Channel\",\n \"LeaveChannelMenu\": \"Leave channel\",\n \"ChannelLeaveAlertWithName\": \"Are you sure you want to leave **%1$s**?\",\n \"LeaveMegaMenu\": \"Leave group\",\n \"DeleteChatUser\": \"Delete chat\",\n \"PleaseEnterCurrentPassword\": \"Enter your password\",\n \"PleaseEnterFirstPassword\": \"Enter a password\",\n \"PleaseReEnterPassword\": \"Re-enter your password\",\n \"Continue\": \"Continue\",\n \"YourEmailSkip\": \"Skip\",\n \"YourEmailSkipWarning\": \"Warning\",\n \"YourEmailSkipWarningText\": \"No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.\",\n \"TurnPasswordOffQuestionTitle\": \"Disable password\",\n \"TurnPasswordOffQuestion\": \"Are you sure you want to disable your password?\",\n \"Disable\": \"Disable\",\n \"TwoStepVerificationSetPassword\": \"Set Password\",\n \"TwoStepVerificationPasswordSet\": \"Password Set!\",\n \"TwoStepVerificationPasswordSetInfo\": \"This password will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepVerificationPasswordReturnSettings\": \"Return to Settings\",\n \"RecoveryEmail\": \"Recovery email\",\n \"RecoveryEmailTitle\": \"Recovery Email\",\n \"ResendCode\": \"Resend code\",\n \"PasswordAsHintError\": \"Hint must be different from your password\",\n \"AddStickersCount\": \"ADD %1$s\",\n \"RemoveStickersCount\": \"REMOVE %1$s\",\n \"Stickers\": {\n \"one_value\": \"%1$d sticker\",\n \"other_value\": \"%1$d stickers\"\n },\n \"HidAccount\": \"The account was hidden by the user\",\n \"TelegramFeatures\": \"Telegram Features\",\n \"SetColor\": \"Set a color\",\n \"Open\": \"Open\",\n \"OpenUrlTitle\": \"Open Link\",\n \"OpenUrlAlert2\": \"Do you want to open %1$s?\",\n \"FilterNoChatsToDisplay\": \"Folder is empty\",\n \"FilterNoChatsToDisplayInfo\": \"No chats currently belong to this folder.\",\n \"SupportStatus\": \"support\",\n \"Lately\": \"last seen recently\",\n \"WithinAWeek\": \"last seen within a week\",\n \"WithinAMonth\": \"last seen within a month\",\n \"ALongTimeAgo\": \"last seen a long time ago\",\n \"Online\": \"online\",\n \"MessageScheduleSend\": \"Send Now\",\n \"MessageScheduleEditTime\": \"Reschedule\",\n \"YouLeft\": \"You left this group\",\n \"Recent\": \"Recent\",\n \"Of\": \"%1$d of %2$d\",\n \"NoResult\": \"No results\",\n \"Updating\": \"Updating...\",\n \"Emoji\": \"Emoji\",\n \"AddContactTitle\": \"Add Contact\",\n \"HiddenName\": \"Deleted Account\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can't add this user to groups because of user's privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can't add this user to channels because of user's privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can't pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n \"GlobalSearch\": \"Global search\",\n \"SearchMessages\": \"Messages\",\n \"SearchAllChatsShort\": \"Chats\",\n \"ClearButton\": \"Clear\",\n \"FilterAllChats\": \"All Chats\",\n \"FilterAllChatsShort\": \"All\",\n \"Call\": \"Call\",\n \"VideoCall\": \"Video Call\",\n \"CallMessageOutgoing\": \"Outgoing Call\",\n \"CallMessageIncoming\": \"Incoming Call\",\n \"CallMessageVideoOutgoing\": \"Outgoing Video Call\",\n \"CallMessageVideoIncoming\": \"Incoming Video Call\",\n \"VoipExchangingKeys\": \"Exchanging encryption keys\",\n \"VoipUnmute\": \"Unmute\",\n \"SavingContentTitle\": \"Saving content\",\n \"RestrictSavingContent\": \"Restrict saving content\",\n \"RestrictSavingContentInfoGroup\": \"Members won't be able to copy, save and forward content from this group.\",\n \"RestrictSavingContentInfoChannel\": \"Subscribers won't be able to copy, save and forward content from this channel.\",\n \"ClearOtherSessionsHelp\": \"Logs out all devices except for this one.\",\n \"SessionsListInfo\": \"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.\",\n \"SponsoredMessage\": \"sponsored\",\n \"OpenChannelPost\": \"VIEW POST\",\n \"FilterNameHint\": \"Folder name\",\n \"BotStart\": \"START\",\n \"BotUnblock\": \"RESTART\",\n \"BotStop\": \"Stop bot\",\n \"BotRestart\": \"Restart bot\",\n \"ShareYouPhoneNumberTitle\": \"Share your phone number?\",\n \"AreYouSureShareMyContactInfoBot\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n \"DistanceUnitsTitle\": \"Distance units\",\n \"DistanceUnitsKilometers\": \"Kilometers\",\n \"DistanceUnitsMiles\": \"Miles\",\n \"PeopleNearby\": \"People Nearby\",\n \"MakeMyselfVisible\": \"Make Myself Visible\",\n \"MakeMyselfVisibleTitle\": \"Show Your Profile?\",\n \"MakeMyselfVisibleInfo\": \"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.\",\n \"StopShowingMe\": \"Stop Showing Me\",\n \"PeopleNearbyInfo2\": \"Exchange contact info with people nearby and find new friends.\",\n \"NearbyCreateGroup\": \"Create a Local group\",\n \"AwayTo\": \"%1$s away\",\n \"MessagePreview\": \"Message Preview\",\n \"KMetersAway2\": \"%1$s km away\",\n \"MetersAway2\": \"%1$s m away\",\n \"MilesAway\": \"%1$s mi away\",\n \"FootsAway\": \"%1$s ft away\",\n \"PeopleNearbyHeader\": \"People nearby\",\n \"ChatsNearbyHeader\": \"Groups nearby\",\n \"ChatLocation\": \"Location\",\n \"RequestToJoinGroupDescription\": \"This group accepts new members only after they are approved by its admins.\",\n \"RequestToJoinChannelDescription\": \"This channel accepts new subscribers only after they are approved by its admins.\",\n \"RequestToJoinSent\": \"Join request sent\",\n \"RequestToJoinGroupApproved\": \"Your request to join the group was approved\",\n \"RequestToJoinChannelApproved\": \"Your request to join the channel was approved\",\n \"Update\": \"UPDATE\",\n \"Reactions\": \"Reactions\",\n \"DoubleTapSetting\": \"Quick Reaction\",\n \"EnableReactions\": \"Enable Reactions\",\n \"EnableReactionsChannelInfo\": \"Allow subscribers to react to channel posts.\",\n \"EnableReactionsGroupInfo\": \"Allow members to react to group messages.\",\n \"AvailableReactions\": \"Available reactions\",\n \"NobodyViewed\": \"Nobody viewed\",\n \"MessageSeen\": {\n \"one_value\": \"Seen\",\n \"other_value\": \"%1$d Seen\"\n },\n // \"Close\": \"Close\",\n \"DataSettings\": \"Data and Storage\",\n \"GroupsAndChannelsHelp\": \"Change who can add you to groups and channels.\",\n \"SessionsInfo\": \"Control your sessions on other devices.\",\n \"StickersBotInfo\": \"Artists are welcome to add their own sticker sets using our @stickers bot.\",\n \"AutomaticMediaDownload\": \"Automatic media download\",\n \"AutoDownloadPhotos\": \"Photos\",\n \"AutoDownloadVideos\": \"Videos\",\n \"AutoDownloadFiles\": \"Files\",\n \"AutoDownloadOnAllChats\": \"On in all chats\",\n \"AutoDownloadUpToOnAllChats\": \"Up to %1$s in all chats\",\n \"AutoDownloadOff\": \"Off\",\n \"AutoDownloadOnUpToFor\": \"Up to %1$s for %2$s\",\n \"AutoDownloadOnFor\": \"On for %1$s\",\n \"AutoDownloadContacts\": \"Contacts\",\n \"AutoDownloadPm\": \"PM\",\n \"AutoDownloadGroups\": \"Groups\",\n \"AutoDownloadChannels\": \"Channels\",\n \"AutoDownloadAudioInfo\": \"Voice messages are tiny, so they're always downloaded automatically.\",\n \"AutoplayMedia\": \"Auto-play media\",\n \"AutoDownloadPhotosTitle\": \"Auto-download photos\",\n \"AutoDownloadVideosTitle\": \"Auto-download videos and GIFs\",\n \"AutoDownloadFilesTitle\": \"Auto-download files and music\",\n \"AutoDownloadMaxFileSize\": \"Maximum file size\",\n \"AutodownloadSizeLimitUpTo\": \"up to %1$s\",\n \"ResetAutomaticMediaDownload\": \"Reset Auto-Download Settings\",\n \"ResetAutomaticMediaDownloadAlertTitle\": \"Reset settings\",\n \"ResetAutomaticMediaDownloadAlert\": \"Are you sure you want to reset auto-download settings?\",\n \"Reset\": \"Reset\",\n \"SendMessageAsTitle\": \"Send message as...\",\n \"Devices\": \"Devices\",\n \"LanguageName\": \"English\",\n \"EditCantEditPermissionsPublic\": \"This permission is not available in public groups.\",\n \"VoipUserMicrophoneIsOff\": \"%s\\'s microphone is off\",\n \"VoipUserCameraIsOff\": \"%s\\'s camera is off\",\n\n // * macos\n \"AccountSettings.Filters\": \"Chat Folders\",\n \"AccountSettings.Notifications\": \"Notifications and Sounds\",\n \"AccountSettings.PrivacyAndSecurity\": \"Privacy and Security\",\n \"AccountSettings.Language\": \"Language\",\n \"Alert.UserDoesntExists\": \"Sorry, this user doesn't seem to exist.\",\n \"Alert.Confirm.Discard\": \"Discard\",\n \"Appearance.Reset\": \"Reset to Defaults\",\n \"AutoDownloadSettings.Delimeter\": \", \",\n \"AutoDownloadSettings.LastDelimeter\": \" and \",\n \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\n \"Call.Accept\": \"Accept\",\n \"Call.Decline\": \"Decline\",\n \"Call.End\": \"End\",\n \"Call.Camera\": \"Camera\",\n \"Call.Mute\": \"Mute\",\n \"Call.Recall\": \"Recall\",\n \"Call.Close\": \"Close\",\n \"Call.Screen\": \"Screen\",\n \"Call.Confirm.Discard.Voice.Header\": \"Video Chat in Progress\",\n \"Call.Confirm.Discard.Voice.ToVoice.Text\": \"Leave video chat in \\\"%1$@\\\" and start a new one in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Voice.ToCall.Text\": \"Leave video chat in \\\"%1$@\\\" and start a call with \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.Header\": \"Call in Progress\",\n \"Call.Confirm.Discard.Call.ToVoice.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.ToCall.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.PrivacyErrorMessage\": \"Sorry, you cannot call %@ because of their privacy settings.\",\n \"Call.StatusRequesting\": \"Contacting...\",\n \"Call.StatusRinging\": \"Ringing...\",\n \"Call.StatusConnecting\": \"Connecting...\",\n \"Call.StatusEnded\": \"Call Ended\",\n \"Call.StatusFailed\": \"Call Failed\",\n \"Call.StatusBusy\": \"Busy\",\n \"Call.StatusCalling\": \"is calling you...\",\n \"Contacts.PhoneNumber.NotRegistred\": \"The person with this phone number is not registered on Telegram yet.\",\n \"Channel.UsernameAboutChannel\": \"People can share this link with others and can find your channel using Telegram search.\",\n \"Channel.UsernameAboutGroup\": \"People can share this link with others and find your group using Telegram search.\",\n \"Chat.Accessory.Forward\": {\n \"one_value\": \"Forward Message\",\n \"other_value\": \"Forward %d Messages\"\n },\n \"Chat.Accessory.Forward.You\": \"You\",\n \"Chat.Accessory.Forward.From\": \"From\",\n \"Chat.Accessory.Hidden\": {\n \"one_value\": \"Forward Message (sender's name hidden)\",\n \"other_value\": \"Forward %d Messages (senders' names hidden)\"\n },\n \"Chat.Alert.Forward.Action.Another\": \"Forward to Another Chat\",\n \"Chat.Alert.Forward.Action.Hide1\": {\n \"one_value\": \"Hide Sender's Name\",\n \"other_value\": \"Hide Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.Show1\": {\n \"one_value\": \"Show Sender's Name\",\n \"other_value\": \"Show Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.ShowCaption\": {\n \"one_value\": \"Show Caption\",\n \"other_value\": \"Show Captions\"\n },\n \"Chat.Alert.Forward.Action.HideCaption\": {\n \"one_value\": \"Hide Caption\",\n \"other_value\": \"Hide Captions\"\n },\n \"Chat.CopySelectedText\": \"Copy Selected Text\",\n \"Chat.Confirm.Unpin\": \"Would you like to unpin this message?\",\n \"Chat.Context.Reacted\": \"%1$@/%2$@ Reacted\",\n \"Chat.Context.ReactedFast\": {\n \"other_value\": \"%d Reacted\"\n },\n \"Chat.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.Call.Cancelled\": \"Cancelled\",\n \"Chat.Service.Call.Missed\": \"Missed\",\n \"Chat.Service.PeerJoinedTelegram\": \"%@ joined Telegram\",\n \"Chat.Service.Channel.UpdatedTitle\": \"Channel renamed to \\\"%@\\\"\",\n \"Chat.Service.Channel.UpdatedPhoto\": \"Channel photo updated\",\n \"Chat.Service.Channel.RemovedPhoto\": \"Channel photo removed\",\n \"Chat.Service.Channel.UpdatedVideo\": \"Channel video updated\",\n \"Chat.Service.BotPermissionAllowed\": \"You allowed this bot to message you when you logged in on %@\",\n \"Chat.Service.Group.UpdatedPinnedMessage\": \"%@ pinned \\\"%@\\\"\",\n \"Chat.Service.VoiceChatStarted\": \"%1$@ started a [video chat](open)\",\n \"Chat.Service.VoiceChatStartedYou\": \"You started a [video chat](open)\",\n \"Chat.Service.VoiceChatStarted.Channel\": \"[Live Stream](open) started\",\n \"Chat.Service.VoiceChatFinished\": \"%1$@ ended the video chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the video chat (%@)\",\n \"Chat.Service.VoiceChatFinished.Channel\": \"Live Stream ended (%1$@)\",\n \"Chat.Service.VoiceChatInvitation\": \"%1$@ invited %2$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationByYou\": \"You invited %1$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationForYou\": \"%1$@ invited you to the [video chat](open)\",\n \"ChatService.UserJoinedGroupByRequest\": \"%@ was accepted to the group\",\n \"ChatService.UserJoinedChannelByRequest\": \"%@ joined the channel by request\",\n \"ChatList.Service.VoiceChatScheduled\": \"%1$@ scheduled a video chat for %2$@\",\n \"ChatList.Service.VoiceChatScheduledYou\": \"You scheduled a video chat for %2$@\",\n \"Chat.Poll.Unvote\": \"Retract Vote\",\n \"Chat.Poll.Stop\": \"Stop Poll\",\n \"Chat.Poll.ViewResults\": \"View Results\",\n \"Chat.Poll.SubmitVote\": \"Vote\",\n \"Chat.Poll.Type.Anonymous\": \"Anonymous Poll\",\n \"Chat.Poll.Type.Public\": \"Poll\",\n \"Chat.Poll.Type.AnonymousQuiz\": \"Anonymous Quiz\",\n \"Chat.Poll.Type.Quiz\": \"Quiz\",\n \"Chat.Poll.Type.Closed\": \"Final Results\",\n \"Chat.Poll.TotalVotes1\": {\n \"one_value\": \"%d vote\",\n \"other_value\": \"%d votes\"\n },\n \"Chat.Quiz.TotalVotes\": {\n \"one_value\": \"%d answer\",\n \"other_value\": \"%d answers\"\n },\n \"Chat.Poll.TotalVotesEmpty\": \"No votes yet\",\n \"Chat.Poll.TotalVotesResultEmpty\": \"No votes\",\n \"Chat.Quiz.TotalVotesEmpty\": \"No answers yet\",\n \"Chat.Quiz.TotalVotesResultEmpty\": \"No answers\",\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n \"Chat.Pinned.DontShow\": \"Don't Show Pinned Messages\",\n \"Chat.Title.Comments\": {\n \"one_value\": \"%d Comment\",\n \"other_value\": \"%d Comments\"\n },\n \"ChatTitle.ReportMessages\": \"Report Messages\",\n \"Chat.Send.WithoutSound\": \"Send Without Sound\",\n \"Chat.Send.SetReminder\": \"Set a Reminder\",\n \"Chat.Send.ScheduledMessage\": \"Schedule Message\",\n \"Chat.SendAs.PersonalAccount\": \"personal account\",\n \"Chat.UnpinAllMessagesConfirmation\": {\n \"one_value\": \"Do you want to unpin %d message in this chat?\",\n \"other_value\": \"Do you want to unpin all %d messages in this chat?\"\n },\n \"Chat.Message.Ad.Text\": \"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.\",\n \"Chat.Message.Ad.ReadMore\": \"Read More\",\n \"Chat.Message.ViewChannel\": \"VIEW CHANNEL\",\n \"Chat.Message.ViewBot\": \"VIEW BOT\",\n \"Chat.Message.ViewGroup\": \"VIEW GROUP\",\n \"Chat.Message.Sponsored.What\": \"What are sponsored messages?\",\n \"Chat.Message.Sponsored.Link\": \"https://promote.telegram.org\",\n \"ChatList.Context.Mute\": \"Mute\",\n \"ChatList.Context.Unmute\": \"Unmute\",\n \"ChatList.Context.Pin\": \"Pin\",\n \"ChatList.Context.Unpin\": \"Unpin\",\n \"ChatList.Context.DeleteChat\": \"Delete Chat\",\n \"ChatList.Context.DeleteAndExit\": \"Delete and Leave\",\n \"ChatList.Context.LeaveChannel\": \"Leave Channel\",\n \"ChatList.Context.LeaveGroup\": \"Leave Group\",\n \"ChatList.Service.Call.incoming\": \"Incoming Call (%@)\",\n \"ChatList.Service.Call.outgoing\": \"Outgoing Call (%@)\",\n \"ChatList.Service.VideoCall.incoming\": \"Incoming Video Call (%@)\",\n \"ChatList.Service.VideoCall.outgoing\": \"Outgoing Video Call (%@)\",\n \"ChatList.Service.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed Call\",\n \"ChatList.Service.VideoCall.Cancelled\": \"Cancelled Video Call\",\n \"ChatList.Service.VideoCall.Missed\": \"Missed Video Call\",\n \"ChatList.Service.VoiceChatScheduled.Channel\": \"Voice chat scheduled for %@\",\n \"ChatList.Filter.Header\": \"Create folders for different groups of chats and quickly switch between them.\",\n \"ChatList.Filter.NewTitle\": \"Create Folder\",\n \"ChatList.Filter.List.Title\": \"Chat Folders\",\n \"ChatList.Filter.Include.AddChat\": \"Add Chats\",\n \"ChatList.Filter.Exclude.AddChat\": \"Add Chats\",\n //\"ChatList.Filter.All\": \"All\",\n \"ChatList.Filter.Contacts\": \"Contacts\",\n \"ChatList.Filter.NonContacts\": \"Non-Contacts\",\n \"ChatList.Filter.Groups\": \"Groups\",\n \"ChatList.Filter.Channels\": \"Channels\",\n \"ChatList.Filter.Bots\": \"Bots\",\n \"ChatList.Filter.MutedChats\": \"Muted\",\n \"ChatList.Filter.ReadChats\": \"Read\",\n \"ChatList.Filter.Archive\": \"Archived\",\n \"ChatList.Filter.Include.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Exclude.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Confirm.Remove.Header\": \"Remove Folder\",\n \"ChatList.Filter.Confirm.Remove.Text\": \"Are you sure you want to remove this folder? Your chats will not be deleted.\",\n \"ChatList.Mute.1Hour\": \"For 1 Hour\",\n \"ChatList.Mute.4Hours\": \"For 4 Hours\",\n \"ChatList.Mute.8Hours\": \"For 8 Hours\",\n \"ChatList.Mute.1Day\": \"For 1 Day\",\n \"ChatList.Mute.3Days\": \"For 3 Days\",\n \"ChatList.Mute.Forever\": \"Forever\",\n \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"FileSize.B\": \"%@ B\",\n \"FileSize.KB\": \"%@ KB\",\n \"FileSize.MB\": \"%@ MB\",\n \"FileSize.GB\": \"%@ GB\",\n \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\n \"LastSeen.HoursAgo\": {\n \"one_value\": \"last seen %d hour ago\",\n \"other_value\": \"last seen %d hours ago\"\n },\n \"Login.Register.LastName.Placeholder\": \"Last Name\",\n \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"Modal.Send\": \"Send\",\n \"NewPoll.Anonymous\": \"Anonymous Voting\",\n \"NewPoll.Explanation.Placeholder\": \"Add a Comment (Optional)\",\n \"NewPoll.OptionsAddOption\": \"Add an Option\",\n \"NewPoll.MultipleChoice\": \"Multiple Answers\",\n \"NewPoll.Quiz\": \"Quiz Mode\",\n \"Notification.Contact.Reacted\": \"%1$@ to your \\\"%2$@\\\"\",\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \\\"%3$@\\\"\",\n \"Peer.Activity.User.PlayingGame\": \"playing a game\",\n \"Peer.Activity.User.TypingText\": \"typing\",\n \"Peer.Activity.User.SendingPhoto\": \"sending a photo\",\n \"Peer.Activity.User.RecordingVideo\": \"recording video\",\n \"Peer.Activity.User.SendingVideo\": \"sending a video\",\n \"Peer.Activity.User.RecordingAudio\": \"recording voice\",\n \"Peer.Activity.User.SendingFile\": \"sending file\",\n \"Peer.Activity.User.ChoosingSticker\": \"choosing a sticker\",\n \"Peer.Activity.User.EnjoyingAnimations\": \"watching %@\",\n \"Peer.Activity.Chat.PlayingGame\": \"%@ is playing a game\",\n \"Peer.Activity.Chat.TypingText\": \"%@ is typing\",\n \"Peer.Activity.Chat.SendingPhoto\": \"%@ is sending a photo\",\n \"Peer.Activity.Chat.RecordingVideo\": \"%@ is recording video\",\n \"Peer.Activity.Chat.SendingVideo\": \"%@ is sending a video\",\n \"Peer.Activity.Chat.RecordingAudio\": \"%@ is recording voice\",\n \"Peer.Activity.Chat.SendingFile\": \"%@ is sending a file\",\n \"Peer.Activity.Chat.ChoosingSticker\": \"%@ is choosing a sticker\",\n \"Peer.Activity.Chat.EnjoyingAnimations\": \"%@ is watching %@\",\n \"Peer.Activity.Chat.Multi.PlayingGame1\": \"%@ and %d others are playing a game\",\n \"Peer.Activity.Chat.Multi.TypingText1\": \"%@ and %d others are typing\",\n \"Peer.Activity.Chat.Multi.SendingPhoto1\": \"%@ and %d others are sending photos\",\n \"Peer.Activity.Chat.Multi.RecordingVideo1\": \"%@ and %d others are recording video\",\n \"Peer.Activity.Chat.Multi.SendingVideo1\": \"%@ and %d others are sending videos\",\n \"Peer.Activity.Chat.Multi.RecordingAudio1\": \"%@ and %d others are recording voice\",\n //\"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n \"Peer.Activity.Chat.Multi.SendingFile1\": \"%@ and %d others are sending files\",\n \"Peer.Activity.Chat.Multi.ChoosingSticker1\": \"%@ and %d others are choosing stickers\",\n \"Peer.ServiceNotifications\": \"service notifications\",\n \"Peer.RepliesNotifications\": \"Reply Notifications\",\n \"Peer.Status.justNow\": \"last seen just now\",\n \"Peer.Status.Today\": \"today\",\n \"Peer.Status.Yesterday\": \"yesterday\",\n \"Peer.Status.LastSeenAt\": \"last seen %@ at %@\",\n \"Peer.Status.minAgo\": {\n \"one_value\": \"last seen %d minute ago\",\n \"other_value\": \"last seen %d minutes ago\"\n },\n \"Peer.Status.Member\": {\n \"one_value\": \"%d member\",\n \"other_value\": \"%d members\"\n },\n \"Peer.Status.Subscribers\": {\n \"one_value\": \"%d subscriber\",\n \"other_value\": \"%d subscribers\"\n },\n \"PeerInfo.Administrators\": \"Administrators\",\n \"PeerInfo.DeleteChannel\": \"Delete Channel\",\n \"PeerInfo.Discussion\": \"Discussion\",\n \"PeerInfo.Discussion.Add\": \"Add\",\n \"PeerInfo.SignMessages\": \"Sign Messages\",\n \"PeerInfo.SharedMedia\": \"Shared Media\",\n \"PeerInfo.Subscribers\": \"Subscribers\",\n \"PeerInfo.DeleteContact\": \"Delete Contact\",\n //\"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n \"PeerInfo.Action.VoiceChat\": \"Video Chat\",\n \"PeerInfo.Action.LiveStream\": \"Live Stream\",\n \"PeerMedia.Members\": \"Members\",\n \"PollResults.Title.Poll\": \"Poll Results\",\n \"PollResults.Title.Quiz\": \"Quiz Results\",\n \"PollResults.LoadMore\": {\n \"other_value\": \"Show More (%d)\"\n },\n //\"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n \"Preview.Dragging.AddItems\": {\n \"one_value\": \"Add Item\",\n \"other_value\": \"Add Items\"\n },\n \"PreviewSender.CaptionPlaceholder\": \"Add a caption...\",\n \"PreviewSender.CompressFile\": \"Send compressed\",\n \"PreviewSender.SendFile\": {\n \"one_value\": \"Send File\",\n \"other_value\": \"Send %d Files\"\n },\n \"PreviewSender.SendPhoto\": {\n \"one_value\": \"Send Photo\",\n \"other_value\": \"Send %d Photos\"\n },\n \"PreviewSender.SendVideo\": {\n \"one_value\": \"Send Video\",\n \"other_value\": \"Send %d Videos\"\n },\n \"PrivacyAndSecurity.Item.On\": \"On\",\n \"PrivacyAndSecurity.Item.Off\": \"Off\",\n \"PrivacyAndSecurity.SensitiveText\": \"Disable filtering\",\n \"PrivacyAndSecurity.SensitiveDesc\": \"Display sensitive media in public channels on all your Telegram devices.\",\n \"PrivacySettings.VoiceCalls\": \"Calls\",\n \"PrivacySettings.Forwards\": \"Forwarded Messages\",\n \"PrivacySettings.Groups\": \"Groups and Channels\",\n \"PrivacySettingsController.AddUsers\": \"Add Users\",\n \"PrivacySettingsController.GroupDescription\": \"You can restrict who can add you to groups and channels with granular precision.\",\n \"PrivacySettingsController.Forwards.CustomHelp\": \"You can restrict who can add a link to your account when forwarding your messages.\",\n \"PrivacySettingsController.P2p.Desc\": \"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.\",\n \"PrivacySettingsController.PhoneCallDescription\": \"You can restrict who can call you with granular precision.\",\n \"PrivacySettingsController.ProfilePhoto.CustomHelp\": \"You can restrict who can see your profile photo with granular precision.\",\n \"PrivacySettingsController.LastSeenDescription\": \"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).\",\n \"PrivacySettingsController.PeerInfo\": \"You can add users or entire groups as exceptions that will override the settings above.\",\n \"PrivacySettingsController.Everbody\": \"Everybody\",\n \"PrivacySettingsController.MyContacts\": \"My Contacts\",\n \"PrivacySettingsController.Nobody\": \"Nobody\",\n \"PrivacySettingsController.NeverShare\": \"Never Share With\",\n \"PrivacySettingsController.AlwaysShare\": \"Always Share With\",\n \"PrivacySettingsController.NeverAllow\": \"Never Allow\",\n \"PrivacySettingsController.AlwaysAllow\": \"Always Allow\",\n \"PrivacySettingsController.UserCount\": {\n \"one_value\": \"%d user\",\n \"other_value\": \"%d users\"\n },\n \"RecentSessions.Error.FreshReset\": \"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.\",\n \"RequestJoin.Button\": \"Request to Join\",\n \"Stickers.SearchAdd\": \"Add\",\n \"Stickers.SearchAdded\": \"Added\",\n \"Stickers.SuggestStickers\": \"Suggest Stickers by Emoji\",\n \"ShareModal.Search.Placeholder\": \"Share to...\",\n \"ShareModal.Search.ForwardPlaceholder\": \"Forward to...\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\n \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"Search.Confirm.ClearHistory\": \"Are you sure you want to clear your search history?\",\n \"Separator.ShowMore\": \"show more\",\n \"Separator.ShowLess\": \"show less\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"StickerSet.DontExist\": \"Sorry, this sticker set doesn't seem to exist.\",\n \"Text.Context.Copy.Username\": \"Copy Username\",\n \"Text.Context.Copy.Hashtag\": \"Copy Hashtag\",\n \"Time.TomorrowAt\": \"tomorrow at %@\",\n \"TwoStepAuth.SetPasswordHelp\": \"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepAuth.GenericHelp\": \"You have enabled Two-Step verification.\\nYou'll need the password you set up here to log in to your Telegram account.\",\n \"TwoStepAuth.ChangePassword\": \"Change Password\",\n \"TwoStepAuth.RemovePassword\": \"Turn Password Off\",\n \"TwoStepAuth.SetupEmail\": \"Set Recovery Email\",\n \"TwoStepAuth.ChangeEmail\": \"Change Recovery Email\",\n \"TwoStepAuth.ConfirmEmailCodeDesc\": \"Please enter the code we've just emailed to %@.\",\n \"TwoStepAuth.RecoveryTitle\": \"Email Code\",\n \"TwoStepAuth.RecoveryCode\": \"Code\",\n \"TwoStepAuth.RecoveryCodeInvalid\": \"Invalid code. Please try again.\",\n \"TwoStepAuth.RecoveryCodeExpired\": \"Code Expired\",\n \"TwoStepAuth.SetupHintTitle\": \"Password Hint\",\n \"TwoStepAuth.SetupHintPlaceholder\": \"Hint\",\n \"UsernameSettings.ChangeDescription\": \"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\",\n \"VoiceChat.Chat.StartNew\": \"Video chat ended. Start a new one?\",\n \"VoiceChat.Chat.StartNew.OK\": \"Start\",\n \"VoiceChat.Chat.Ended\": \"Video chat ended.\",\n \"VoiceChat.Invite.InviteMembers\": \"Invite members\",\n \"VoiceChat.Status.Connecting\": \"Connecting...\",\n \"VoiceChat.Status.Members\": {\n \"one_value\": \"%d participant\",\n \"other_value\": \"%d participants\"\n },\n \"VoiceChat.Status.MutedForYou\": \"muted for you\",\n \"VoiceChat.Status.Speaking\": \"speaking\",\n \"VoiceChat.Status.Listening\": \"listening\",\n \"VoiceChat.Status.WantsSpeak\": \"wants to speak\",\n \"VoiceChat.Status.Muted\": \"muted\",\n \"VoiceChat.Status.You\": \"This is you\",\n \"VoiceChat.Video.Stream.Video\": \"video\",\n \"VoiceChat.Video.Stream.Screencast\": \"screen\",\n \"VoiceChat.Video.Stream.More\": \"more\",\n \"VoiceChat.Leave\": \"Leave\",\n \"VoiceChat.End.Title\": \"Leave video chat\",\n \"VoiceChat.End.Text\": \"Are you sure you want to leave this video chat?\",\n \"VoiceChat.End.Third\": \"End Video Chat\",\n \"VoiceChat.End.OK\": \"Leave\",\n \"VoiceChat.MutePeer\": \"Mute\",\n \"VoiceChat.UnmutePeer\": \"Allow To Speak\",\n \"VoiceChat.RemovePeer\": \"Remove\",\n \"VoiceChat.OpenProfile\": \"Open Profile\",\n \"VoiceChat.MuteForMe\": \"Mute For Me\",\n \"VoiceChat.UnmuteForMe\": \"Unmute For Me\",\n \"VoiceChat.RemovePeer.Confirm.Channel\": \"Do you want to remove %1$@ from the channel?\",\n \"VoiceChat.RemovePeer.Confirm\": \"Are you sure you want to remove %1$@ from the group?\",\n \"VoiceChat.RemovePeer.Confirm.OK\": \"Remove\"\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/110.7c36f242e1f6a813f553.chunk.js b/public/110.7c36f242e1f6a813f553.chunk.js deleted file mode 100644 index adaf85eb..00000000 --- a/public/110.7c36f242e1f6a813f553.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[110],{4110:(t,r,e)=>{e.r(r),String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(t){return(+this).toPeerId(t)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(t){return void 0===t?this:t?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0}}}]); -//# sourceMappingURL=110.7c36f242e1f6a813f553.chunk.js.map \ No newline at end of file diff --git a/public/110.7c36f242e1f6a813f553.chunk.js.map b/public/110.7c36f242e1f6a813f553.chunk.js.map deleted file mode 100644 index 5c1843d8..00000000 --- a/public/110.7c36f242e1f6a813f553.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"110.7c36f242e1f6a813f553.chunk.js","mappings":"kGAMAA,OAAOC,UAAUC,SAAW,WAC1B,QAASC,MAAMD,YAGjBF,OAAOC,UAAUG,SAAW,WAC1B,QAASD,MAAMC,YAGjBJ,OAAOC,UAAUI,SAAW,SAASC,GACnC,QAASH,MAAME,SAASC,IAG1BN,OAAOC,UAAUM,SAAW,WAC1B,MAAO,SAASC,KAAKL,KAAKM,aAG5BC,OAAOT,UAAUC,SAAW,WAC1B,OAAOC,MAGTO,OAAOT,UAAUG,SAAW,WAC1B,OAAOO,KAAKC,IAAIT,OAGlBO,OAAOT,UAAUI,SAAW,SAASC,GACnC,YAAkBO,IAAXP,EAAuBH,KAAkBG,GAAUK,KAAKC,IAAIT,MAAkBA,MAGvFO,OAAOT,UAAUM,SAAW,WAC1B,OAAO","sources":["webpack://tweb/./src/helpers/peerIdPolyfill.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\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n }\n}\n\nexport {};\n"],"names":["String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","Math","abs","undefined"],"sourceRoot":""} \ No newline at end of file diff --git a/public/12.baab8418093ca242b164.chunk.js b/public/12.baab8418093ca242b164.chunk.js new file mode 100644 index 00000000..e2e071a1 --- /dev/null +++ b/public/12.baab8418093ca242b164.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[12,6,13,20,23,25],{106:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),a=n(29),s=n(9),o=n(16),r=n(32),l=n(15),c=n(34),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==o.default.lastRequestedLangCode?Promise.all([e,o.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=o.default.strings.get(e.key);t&&(r.push(t),o.default.strings.set(e.key,e))});const u=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(s.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),l.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{o.default.strings.set(e.key,e)}),Object(a.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),o.default.getLangPack(t.suggested_lang_code)})})}},112:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var i=n(75),a=n(93),s=n(97);function o(e){return function(e){return Object(s.a)(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}var r=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{l(i.next(e))}catch(e){s(e)}}function r(e){try{l(i.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};var l=new class{constructor(){this.blobSupported=!0;try{Object(a.a)([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?o(t).then(t=>e.write(t)):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>r(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(e)})),truncate:()=>{n.length=0},finalize:(i=!0)=>{const s=Object(a.a)(n,e);return i&&t&&t(s),s}}}},c=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{l(i.next(e))}catch(e){s(e)}}function r(e){try{l(i.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class d{constructor(e){this.dbName=e,this.useStorage=!0,i.a.test&&(this.dbName+="_test"),d.STORAGES.length&&(this.useStorage=d.STORAGES[0].useStorage),this.openDatabase(),d.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=Object(a.a)(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,n)=>c(this,void 0,void 0,(function*(){let i=!1;const a=setTimeout(()=>{n(),i=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const a=yield e(n);if(i)return;t(a)}catch(e){n(e)}clearTimeout(a)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=l.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}d.STORAGES=[]},115:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},116:function(e,t,n){"use strict";function i(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;i1){let n;s.IS_APPLE?n=-.16*e:s.IS_ANDROID&&(n=0),t.style.setProperty("--letter-spacing",n+"px")}const n=this.setValueSilently.bind(this);this.setValueSilently=e=>{n(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const n=this.value;let i;Math.abs(n.length-this.lastValue.length)>1&&!this.pasted&&s.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+n),this.pasted=!1,this.setLabel();let o,r,l,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(a.a)(this.value),o=i.formatted,r=i.country,c=i.leftPattern,l=i.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=c,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},130:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(51);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},131:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(36);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},20:function(e,t,n){"use strict";n.r(t);var i=n(32),a=n(69),s=n(78),o=n(7),r=n(34),l=n(16),c=n(17),d=n(15),u=n(35),h=n(106),p=n(80),m=n(115),f=n(116);function g(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var b=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{l(i.next(e))}catch(e){s(e)}}function r(e){try{l(i.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let v,y=()=>b(void 0,void 0,void 0,(function*(){const e=E.pageEl.querySelector(".auth-image");let t=Object(u.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const c=Object(r.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(c),Object(h.a)(a);const y=e.parentElement,L=document.createElement("h4");Object(l._i18n)(L,"Login.QR.Title");const S=document.createElement("ol");S.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),S.append(t)}),y.append(L,S,a),c.addEventListener("click",()=>{Promise.all([n.e(6),n.e(25)]).then(n.bind(null,21)).then(e=>e.default.mount()),O=!0});const w=(yield Promise.all([n.e(11).then(n.t.bind(null,199,7))]))[0].default;let O=!1;d.default.addEventListener("user_auth",()=>{O=!0,v=null},{once:!0});let k,_={ignoreErrors:!0};const T=a=>b(void 0,void 0,void 0,(function*(){try{let r=yield i.a.invokeApi("auth.exportLoginToken",{api_id:o.a.id,api_hash:o.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(_.dcId||(_.dcId=r.dc_id,i.a.setBaseDcId(r.dc_id)),r=yield i.a.invokeApi("auth.importLoginToken",{token:r.token},_)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!k||!Object(f.a)(k,r.token)){k=r.token;let n=function(e){let t,n="";for(let i=e.length,a=0,s=0;s>>t&24),2!==t&&i-s!=1||(n+=String.fromCharCode(g(a>>>18&63),g(a>>>12&63),g(a>>>6&63),g(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token),i="tg://login?token="+Object(m.a)(n,!0);const a=window.getComputedStyle(document.documentElement),s=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),l=a.getPropertyValue("--primary-color").trim(),c=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new w({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:c,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:s},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(p.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(a){let e=Date.now()/1e3,t=r.expires-e-s.a.serverTimeOffset;yield Object(p.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(16).then(n.bind(null,23)).then(e=>e.default.mount()),O=!0,v=null;break;default:console.error("pageSignQR: default error:",e),O=!0}return!0}return!1}));return()=>b(void 0,void 0,void 0,(function*(){for(O=!1;;){if(O)break;if(yield T(!0))break}}))}));const E=new a.a("page-signQR",!0,()=>v,()=>{v||(v=y()),v.then(e=>{e()}),c.default.pushToState("authState",{_:"authStateSignQr"})});t.default=E},21:function(e,t,n){"use strict";n.r(t);var i=n(35),a=n(44),s=n(17),o=n(32),r=n(31),l=n(69),c=n(36),d=n(46),u=n(34),h=n(86),p=n(1),m=n(7),f=n(16),g=n(51),b=n(18),v=n(61),y=n(6),E=n(66),L=n(103),S=n(112),w=n(20),O=n(106),k=n(5),_=n(29),T=n(33),x=n(55),A=n(74),j=n(87),P=n(95),C=n(81),N=n(89),D=n(15),F=n(121),R=n(10),H=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{l(i.next(e))}catch(e){s(e)}}function r(e){try{l(i.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let M,I=null;const V=new l.a("page-sign",!0,()=>{const e=()=>{t=f.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),D.default.addEventListener("language_change",()=>{e()});const l=new Map;let b,U;const B=document.createElement("div");B.classList.add("input-wrapper");const q=new c.b({label:"Login.CountrySelectorLabel",name:Object(E.b)()});q.container.classList.add("input-select");const z=q.input,$=document.createElement("div");$.classList.add("select-wrapper","z-depth-3","hide");const W=document.createElement("span");W.classList.add("arrow","arrow-down"),q.container.append(W);const Q=document.createElement("ul");$.appendChild(Q);new a.b($);let K=()=>{K=null,t.forEach(e=>{const t=Object(P.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const a=document.createElement("li");let s=r.a.wrapEmojiText(t);if(R.a){const e=document.createElement("span");e.innerHTML=s,a.append(e)}else a.innerHTML=s;const o=Object(f.i18n)(e.default_name);o.dataset.defaultName=e.default_name,a.append(o);const l=document.createElement("span");l.classList.add("phone-code"),l.innerText="+"+i.country_code,a.appendChild(l),n.push(a),Q.append(a)}),l.set(e.iso2,n)}),Q.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");G(t)}),q.container.appendChild($)};const G=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,a=i.replace(/\D/g,"");Object(T.a)(z,Object(f.i18n)(n)),Object(C.a)(z,"input"),b=t.find(e=>e.default_name===n),U=b.country_codes.find(e=>e.country_code===a),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(j.a)(te,!0)},0)};let X;K(),z.addEventListener("focus",(function(e){K?K():t.forEach(e=>{l.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(X),X=void 0,$.classList.remove("hide"),$.offsetWidth,$.classList.add("active"),q.select(),Object(h.b)({container:V.pageEl.parentElement.parentElement,element:z,position:"start",margin:4}),setTimeout(()=>{Y||(document.addEventListener("mousedown",J,{capture:!0}),Y=!0)},0)}));let Y=!1;const J=e=>{Object(y.a)(e.target,"input-select")||e.target!==z&&(Z(),document.removeEventListener("mousedown",J,{capture:!0}),Y=!1)},Z=()=>{void 0===X&&($.classList.remove("active"),X=window.setTimeout(()=>{$.classList.add("hide"),X=void 0},200))};z.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=q.value.toLowerCase(),a=[];t.forEach(e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach(e=>{const n=e.split(" ").filter(e=>/\w/.test(e)).map(e=>e[0]).join("");n.length>1&&t.push(n)});let n=!!t.filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));l.get(e.iso2).forEach(e=>e.style.display=n?"":"none"),n&&a.push(e)}),0===a.length?t.forEach(e=>{l.get(e.iso2).forEach(e=>e.style.display="")}):1===a.length&&"Enter"===n&&G(l.get(a[0].iso2)[0])}),W.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),z.matches(":focus")?z.blur():z.focus()}));const ee=new F.a({onInput:e=>{g.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===q.value||b&&t&&n&&(b===t||U.country_code===n.country_code)||(Object(T.a)(z,t?Object(f.i18n)(t.default_name):i),b=t,U=n),t||ee.value.length-1>1?I.style.visibility="":I.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!I.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;s.default.pushToState("keepSigned",e),L.a.toggleStorage(e),S.a.toggleStorage(e),o.a.toggleStorage(e),A.a.toggleStorage(e)}),s.default.getState().then(e=>{s.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),I=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),I.style.visibility="hidden";const ie=e=>{e&&Object(k.a)(e);const t=Object(x.a)([I,M],!0);Object(T.a)(I,Object(f.i18n)("PleaseWait")),Object(i.f)(I);let a=ee.value;o.a.invokeApi("auth.sendCode",{phone_number:a,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(23).then(n.bind(null,22)).then(t=>t.default.mount(Object.assign(e,{phone_number:a})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(T.a)(ee.label,Object(f.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(T.a)(I,Object(f.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),I.innerText=e.type}})};Object(_.b)(I,ie),M=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});M.addEventListener("click",()=>{w.default.mount()}),B.append(q.container,ee.container,ne.label,I,M);const ae=document.createElement("h4");ae.classList.add("text-center"),Object(f._i18n)(ae,"Login.Title");const se=document.createElement("div");se.classList.add("subtitle","text-center"),Object(f._i18n)(se,"Login.StartText"),V.pageEl.querySelector(".container").append(ae,se,B);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(B),o.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=N.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&f.default.getLangPack(n.lang_code).then(()=>{Object(C.a)(te,"input")});const i=new Set([1,2,3,4,5]),a=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=o.a.getNetworker(e.nearest_dc).then(()=>{a.push(e.nearest_dc)})),(s||Promise.resolve()).then(()=>{a.forEach(e=>{i.delete(e)});const e=[...i],t=()=>H(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield A.a.get(i))return t();setTimeout(()=>{o.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{q.value.length||ee.value.length||G(l.get(e.country)[0])})},()=>{I&&(Object(T.a)(I,Object(f.i18n)("Login.Next")),Object(b.ripple)(I,void 0,void 0,!0),I.removeAttribute("disabled")),M&&M.removeAttribute("disabled"),s.default.pushToState("authState",{_:"authStateSignIn"})});t.default=V},22:function(e,t,n){"use strict";n.r(t);var i=n(38),a=n(17),s=n(32),o=n(69),r=n(21),l=n(130),c=n(131),d=n(16),u=n(66),h=n(33),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{l(i.next(e))}catch(e){s(e)}}function r(e){try{l(i.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let m,f=null,g=null,b=null;const v=new o.a("page-authCode",!0,()=>{const e=f.type.length,t=new c.a({label:"Code",name:Object(u.b)(),length:e,onFill:e=>{o(e)}});m=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container);v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return r.default.mount()}));const a=()=>{setTimeout(()=>{y.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:f.phone_number,phone_code_hash:f.phone_code_hash,phone_code:e};s.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":s.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(7),n.e(26)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:f.phone_number,phone_code_hash:f.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(19).then(n.bind(null,23))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},g=v.pageEl.querySelector(".auth-image"),b=i.b.isMobile?100:166,y=new l.a(t,b);return g.append(y.container),y.load()},e=>{if(f=e,g){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else g=v.pageEl.getElementsByClassName("phone")[0],b=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(g.innerText=f.phone_number,f.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[f.type._]}Object(h.a)(b,Object(d.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=v},33:function(e,t,n){"use strict";function i(e,t){if("string"==typeof t)return void(e.innerHTML=t);const n=e.firstChild;n?e.lastChild===n?n.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}n.d(t,"a",(function(){return i}))},36:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var i=n(81),a=n(71),s=n(57),o=n(77);var r=n(16),l=n(31),c=n(48);let d=()=>{document.addEventListener("paste",e=>{if(!Object(a.a)(e.target,'contenteditable="true"'))return;let t,n;e.preventDefault();let i=(e.originalEvent||e).clipboardData.getData("text/plain"),o=!0,r=(e.originalEvent||e).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const e=r.match(/([\s\S]*)<\/body>/);e&&(r=e[1].trim());let a=document.createElement("span");a.innerHTML=r;let c=a.firstChild;for(;c;){let e=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=e}const d=Object(s.a)(a,!0);if(d.value.replace(/\s/g,"").length===i.replace(/\s/g,"").length){t=d.value,n=d.entities,o=!1;let e=l.b.parseEntities(t);e=e.filter(e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._),l.b.mergeEntities(n,e)}}o&&(t=i,n=l.b.parseEntities(t),n=n.filter(e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._)),t=l.b.wrapDraftText(t,{entities:n}),window.document.execCommand("insertHTML",!1,t)}),d=null};var u;!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(u||(u={}));t.b=class{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:n,showLengthOn:i,name:a,plainText:l,canBeEdited:c=!0}=e;let u,h,p=e.label||e.labelText;if(l)this.container.innerHTML=`\n \n `,u=this.container.firstElementChild;else{d&&d(),this.container.innerHTML=`\n
\n `,u=this.container.firstElementChild;const t=new MutationObserver(()=>{h&&h()});u.addEventListener("input",()=>{Object(o.a)(u)&&(u.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=u.innerHTML,this.onFakeInput())}),t.observe(u,{characterData:!0,childList:!0,subtree:!0}),e.animate&&(u.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=u.className+" input-field-input-fake")}if(u.setAttribute("dir","auto"),t&&(Object(r._i18n)(u,t,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,t,void 0,"placeholder")),p||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const e=this.container.lastElementChild;let t=!1;h=()=>{const a=u.classList.contains("error"),o=l?u.value.length:[...Object(s.a)(u,!1).value].length,r=n-o,c=r<0;u.classList.toggle("error",c),c||r<=i?(this.setLabel(),e.append(` (${n-o})`),t||(t=!0)):(a&&!c||t)&&(this.setLabel(),t=!1)},u.addEventListener("input",h)}this.input=u}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const n=window.getSelection();n.removeAllRanges(),n.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,n=+this.input.style.height.replace("px","");if(n===t)return;const i=Math.round(50*Math.log(Math.abs(t-n)));this.input.style.transitionDuration=i+"ms",e&&(this.input.style.height=t?t+"px":"");Object(c.a)(this.input,"is-changing-height",!0,i,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(s.a)(this.input,!1).value}set value(e){this.setValueSilently(e,!1),Object(i.a)(this.input,"input")}setValueSilently(e,t=!0){this.options.plainText?this.input.value=e:(this.input.innerHTML=e,this.inputFake&&(this.inputFake.innerHTML=e,t&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t=!1){this.options.plainText||(e=l.b.wrapDraftText(e)),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t=!1){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t&&(this.label.textContent="",this.label.append(Object(r.i18n)(t,this.options.labelOptions))),this.input.classList.toggle("error",!!(e&u.Error)),this.input.classList.toggle("valid",!!(e&u.Valid))}setError(e){this.setState(u.Error,e)}}},44:function(e,t,n){"use strict";n.d(t,"b",(function(){return c})),n.d(t,"a",(function(){return d}));var i=n(1),a=n(41),s=n(86),o=n(82),r=n(5);class l{constructor(e,t="",n=document.createElement("div")){this.el=e,this.container=n,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e)),e.append(this.container))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),this.removeHeavyAnimationListener=Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)}))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.container.removeEventListener("scroll",this.onScroll,{capture:!0}),this.removeHeavyAnimationListener())}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(s.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class c extends l{constructor(e,t="",n=300,i){super(e,t),this.onScrollOffset=n,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,n=this.lastScrollPosition;this.onScrolledTop&&n<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-n<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends l{constructor(e,t="",n=300,a=15,s=document.createElement("div")){if(super(e,t,s),this.onScrollOffset=n,this.splitCount=a,this.container=s,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},46:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(17),a=n(18),s=n(16),o=n(113);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const n=this.input=document.createElement("input");let r;if(n.classList.add("checkbox-field-input"),n.type="checkbox",e.name&&(n.id="input-"+e.name),e.checked&&(n.checked=!0),e.stateKey&&i.default.getState().then(t=>{const a=Object(o.a)(t,e.stateKey);let s;s=e.stateValues?1===e.stateValues.indexOf(a):a,this.setValueSilently(s),n.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[n.checked?1:0]:n.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(s._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(n),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.classList.add("checkbox-box-check"),n.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),n.append(i);const a=document.createElement("div");a.classList.add("checkbox-box-background");const s=document.createElement("div");s.classList.add("checkbox-box-border"),e.append(s,a,n),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(a.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},48:function(e,t,n){"use strict";var i=n(15);const a=(e,t,n,s,o,r)=>{const{timeout:l,raf:c}=e.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete e.dataset.raf),r&&i.default.settings.animationsEnabled&&s)return void(e.dataset.raf=""+window.requestAnimationFrame(()=>{delete e.dataset.raf,a(e,t,n,s,o,r-1)}));n&&t&&e.classList.add(t);const d=()=>{delete e.dataset.timeout,!n&&t&&e.classList.remove("backwards",t),e.classList.remove("animating"),o&&o()};if(!i.default.settings.animationsEnabled||!s)return e.classList.remove("animating","backwards"),void d();e.classList.add("animating"),e.classList.toggle("backwards",!n),e.dataset.timeout=""+setTimeout(d,s)};t.a=a},55:function(e,t,n){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}n.d(t,"a",(function(){return i}))},57:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var i=n(30),a=n(31),s=n(72);function o(e,t=!0){const n=[],i=[],o=t?[]:void 0;Object(s.a)(e,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(a.b.combineSameEntities(o),a.b.sortEntities(o)),{value:r,entities:o}}i.a.getRichValue=o},61:function(e,t,n){"use strict";function i(e,t){return e.closest(t)}n.d(t,"a",(function(){return i}))},71:function(e,t,n){"use strict";function i(e,t){return e.closest(`[${t}]`)}n.d(t,"a",(function(){return i}))},72:function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return s}));const i={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function s(e,t,n,o,r,l,c={offset:0}){if(3===e.nodeType){let t=e.nodeValue;if(o===e?n.push(t.substr(0,r)+""+t.substr(r)):n.push(t),l&&t.length&&e.parentNode){const n=e.parentElement;for(const e in i){const a=i[e],s=n.closest(a.match+", [contenteditable]");null===(null==s?void 0:s.getAttribute("contenteditable"))&&("messageEntityTextUrl"===a.entityName?l.push({_:a.entityName,url:s.href,offset:c.offset,length:t.length}):"messageEntityMentionName"===a.entityName?l.push({_:a.entityName,offset:c.offset,length:t.length,user_id:s.dataset.follow.toUserId()}):l.push({_:a.entityName,offset:c.offset,length:t.length}))}}return void(c.offset+=t.length)}if(1!==e.nodeType)return;const d=o===e,u=a.has(e.tagName);if(u&&n.length)t.push(n.join("")),n.splice(0,n.length),++c.offset;else if(e instanceof HTMLImageElement){const t=e.alt;t&&(n.push(t),c.offset+=t.length)}d&&!r&&n.push("");const h=e.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=e.firstChild;for(;m;)s(m,t,n,o,r,l,c),m=m.nextSibling;if(d&&r&&n.push(""),h&&e.nextSibling&&(n.push(" "),++c.offset,void 0!==p))for(let e=p,t=l.length;e{e&&(this.serverTimeOffset=e)}),s.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=o),t.a=o},87:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(1);function a(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var n=document.createRange();n.selectNodeContents(e),n.collapse(!1);var a=window.getSelection();a.removeAllRanges(),a.addRange(n)}else if(void 0!==document.body.createTextRange){var s=document.body.createTextRange();s.moveToElementText(e),s.collapse(!1),s.select()}}},92:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(16);const a=new Map;let s=0;const o=(e,t,n="")=>{n=t.country_code+n,s=Math.max(s,n.length),a.set(n,{country:e,code:t})};function r(e){e=e||"",a.size||i.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{o(e,t,n)}):o(e,t)})});let t,n=e.replace(/\D/g,""),r=n.slice(0,s);for(let e=r.length-1;e>=0&&(t=a.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const l=t.country,c=t.code.patterns||[],d=n.slice(t.code.country_code.length);let u="",h=0,p="";for(let e=c.length-1;e>=0;--e){u=c[e];const t=u.replace(/ /g,"");let n=0;for(let e=0,i=Math.min(d.length,t.length);eh&&(h=n,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=t.code.country_code+" "+u,u.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let m=u&&u.length>n.length?u.slice(n.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:n,country:l,code:t.code,leftPattern:m}}},97:function(e,t,n){"use strict";function i(e,t){return new Promise(n=>{const i=new FileReader;i.addEventListener("loadend",e=>{n(e.target.result)}),i[t](e)})}n.d(t,"a",(function(){return i}))}}]); +//# sourceMappingURL=12.baab8418093ca242b164.chunk.js.map \ No newline at end of file diff --git a/public/12.baab8418093ca242b164.chunk.js.map b/public/12.baab8418093ca242b164.chunk.js.map new file mode 100644 index 00000000..4abb5524 --- /dev/null +++ b/public/12.baab8418093ca242b164.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/helpers/bytes/bytesToBase64.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageAuthCode.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/helpers/blob/readBlobAs.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","readBlobAsUint8Array","blob","readBlobAs","readBlobAsArrayBuffer","buffer","Uint8Array","blobSupported","blobConstruct","this","fileWriter","bytes","Blob","arr","write","mimeType","saveFileCallback","blobParts","part","truncate","length","finalize","saveToStorage","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","Response","headers","size","save","callback","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","map","storage","deleteAll","fixBase64String","str","toUrl","replace","bytesCmp","bytes1","bytes2","len","i","TelInputField","options","super","label","name","pasted","lastValue","container","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","formattedPhoneNumber","Math","abs","setLabel","formatted","country","countryCode","leftPattern","code","dataset","onInput","metaKey","ctrlKey","shiftKey","preventDefault","TrackingMonkey","inputField","max","needFrame","document","createElement","playAnimation","animation","frame","min","round","idleAnimation","stop","canvas","display","direction","setDirection","setSpeed","play","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","waitForFirstFrame","_animation","currentFrame","pause","CodeInputField","plainText","setAttribute","lastLength","slice","onFill","uint6ToBase64","nUint6","onFirstMount","imageDiv","pageEl","querySelector","preloader","inputWrapper","btnBack","parentElement","h4","helpList","li","m","default","mount","QRCodeStyling","rootScope","prevToken","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","reader","FileReader","onload","target","readAsDataURL","qrCode","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","_canvas","_image","c","children","Array","from","el","timestamp","Date","now","diff","expires","serverTimeManager","serverTimeOffset","console","warn","handled","error","func","appStateManager","pushToState","btnQr","btnNext","page","setCountries","countries","countriesList","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","emoji","iso2","liArr","country_codes","wrapped","wrapEmojiText","spanEmoji","innerHTML","defaultName","span","innerText","country_code","button","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","hidePicker","focus","hideTimeout","offsetWidth","select","element","position","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","_value","toLowerCase","matches","names","Boolean","abbr","split","word","join","good","indexOf","cancelBubble","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","toggleStorage","getState","state","isAvailable","toggle","phone_number","settings","Object","assign","setError","subtitle","nearestDcResult","langPack","getFromCache","lang_code","dcs","Set","done","this_dc","nearest_dc","getNetworker","_dcs","g","shift","dbKey","finally","removeAttribute","codeInput","authCode","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","cleanup","monkey","params","phone_code_hash","phone_code","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","replaceContent","elem","node","firstChild","replaceWith","textContent","init","findUpAttribute","entities","originalEvent","clipboardData","getData","usePlainText","html","curChild","nextSibling","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","placeholder","canBeEdited","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","className","border","labelEl","showingLength","wasError","contains","inputLength","isError","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelAnimationFrame","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollPosition","scrollProperty","checkForTriggers","removeHeavyAnimationListener","passive","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withHover","event","Event","bubbles","cancelable","disable","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","animationsEnabled","afterTimeout","field","withEntities","lines","line","combineSameEntities","sortEntities","findUpTag","tag","closest","attribute","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","getRichElementValue","selNode","selOffset","offset","substr","parentNode","getAttribute","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","wasEntitiesLength","wasLength","hasAttribute","to","addTaskListener","task","payload","placeCaretAtEnd","ignoreTouchCheck","activeElement","collapse","body","createTextRange","textRange","moveToElementText","prefixes","maxPrefixLength","setPrefix","prefix","formatPhoneNumber","originalStr","prefixCountry","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","symbol","idx"],"mappings":"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","file":"12.baab8418093ca242b164.chunk.js","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 apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = 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;\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 btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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","/*\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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 placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\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 InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\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 InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\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 type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\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 appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\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\nlet 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 let 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 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 apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await 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 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 let encoded = bytesToBase64(loginToken.token);\r\n let 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((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;\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((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 let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\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 console.warn('pageSignQR: 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>;\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 appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\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 { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\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 findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\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 { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet 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 const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\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 let 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 replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\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 appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.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 let phone_number = telInputField.value;\r\n 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 let 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 let tryAgain = () => {\r\n 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 simulateEvent(telEl, 'input');\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;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(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 => {\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 apiManager.getNetworker(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 selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\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 appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\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 mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\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 replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n private removeHeavyAnimationListener: () => void;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n\r\n this.removeHeavyAnimationListener();\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\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 appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \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\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\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 { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/13.2690683310eb11d72c46.chunk.js b/public/13.2690683310eb11d72c46.chunk.js new file mode 100644 index 00000000..0a1dab11 --- /dev/null +++ b/public/13.2690683310eb11d72c46.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[13,6,20,25],{106:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),s=n(29),a=n(9),o=n(16),r=n(32),l=n(15),c=n(34),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==o.default.lastRequestedLangCode?Promise.all([e,o.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=o.default.strings.get(e.key);t&&(r.push(t),o.default.strings.set(e.key,e))});const u=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(a.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),l.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{o.default.strings.set(e.key,e)}),Object(s.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),o.default.getLangPack(t.suggested_lang_code)})})}},112:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var i=n(75),s=n(93),a=n(97);function o(e){return function(e){return Object(a.a)(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}var r=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};var l=new class{constructor(){this.blobSupported=!0;try{Object(s.a)([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?o(t).then(t=>e.write(t)):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>r(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(e)})),truncate:()=>{n.length=0},finalize:(i=!0)=>{const a=Object(s.a)(n,e);return i&&t&&t(a),a}}}},c=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class d{constructor(e){this.dbName=e,this.useStorage=!0,i.a.test&&(this.dbName+="_test"),d.STORAGES.length&&(this.useStorage=d.STORAGES[0].useStorage),this.openDatabase(),d.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=Object(s.a)(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,n)=>c(this,void 0,void 0,(function*(){let i=!1;const s=setTimeout(()=>{n(),i=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(n);if(i)return;t(s)}catch(e){n(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=l.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}d.STORAGES=[]},115:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},116:function(e,t,n){"use strict";function i(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;i1){let n;a.IS_APPLE?n=-.16*e:a.IS_ANDROID&&(n=0),t.style.setProperty("--letter-spacing",n+"px")}const n=this.setValueSilently.bind(this);this.setValueSilently=e=>{n(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const n=this.value;let i;Math.abs(n.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+n),this.pasted=!1,this.setLabel();let o,r,l,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(s.a)(this.value),o=i.formatted,r=i.country,c=i.leftPattern,l=i.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=c,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},20:function(e,t,n){"use strict";n.r(t);var i=n(32),s=n(69),a=n(78),o=n(7),r=n(34),l=n(16),c=n(17),d=n(15),u=n(35),h=n(106),p=n(80),f=n(115),m=n(116);function g(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var b=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let v,y=()=>b(void 0,void 0,void 0,(function*(){const e=L.pageEl.querySelector(".auth-image");let t=Object(u.f)(e,!0);const s=document.createElement("div");s.classList.add("input-wrapper");const c=Object(r.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});s.append(c),Object(h.a)(s);const y=e.parentElement,E=document.createElement("h4");Object(l._i18n)(E,"Login.QR.Title");const S=document.createElement("ol");S.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),S.append(t)}),y.append(E,S,s),c.addEventListener("click",()=>{Promise.all([n.e(6),n.e(25)]).then(n.bind(null,21)).then(e=>e.default.mount()),O=!0});const w=(yield Promise.all([n.e(11).then(n.t.bind(null,199,7))]))[0].default;let O=!1;d.default.addEventListener("user_auth",()=>{O=!0,v=null},{once:!0});let k,T={ignoreErrors:!0};const x=s=>b(void 0,void 0,void 0,(function*(){try{let r=yield i.a.invokeApi("auth.exportLoginToken",{api_id:o.a.id,api_hash:o.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(T.dcId||(T.dcId=r.dc_id,i.a.setBaseDcId(r.dc_id)),r=yield i.a.invokeApi("auth.importLoginToken",{token:r.token},T)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!k||!Object(m.a)(k,r.token)){k=r.token;let n=function(e){let t,n="";for(let i=e.length,s=0,a=0;a>>t&24),2!==t&&i-a!=1||(n+=String.fromCharCode(g(s>>>18&63),g(s>>>12&63),g(s>>>6&63),g(63&s)),s=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token),i="tg://login?token="+Object(f.a)(n,!0);const s=window.getComputedStyle(document.documentElement),a=s.getPropertyValue("--surface-color").trim(),o=s.getPropertyValue("--primary-text-color").trim(),l=s.getPropertyValue("--primary-color").trim(),c=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new w({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:c,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:a},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(p.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(s){let e=Date.now()/1e3,t=r.expires-e-a.a.serverTimeOffset;yield Object(p.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(16).then(n.bind(null,23)).then(e=>e.default.mount()),O=!0,v=null;break;default:console.error("pageSignQR: default error:",e),O=!0}return!0}return!1}));return()=>b(void 0,void 0,void 0,(function*(){for(O=!1;;){if(O)break;if(yield x(!0))break}}))}));const L=new s.a("page-signQR",!0,()=>v,()=>{v||(v=y()),v.then(e=>{e()}),c.default.pushToState("authState",{_:"authStateSignQr"})});t.default=L},21:function(e,t,n){"use strict";n.r(t);var i=n(35),s=n(44),a=n(17),o=n(32),r=n(31),l=n(69),c=n(36),d=n(46),u=n(34),h=n(86),p=n(1),f=n(7),m=n(16),g=n(51),b=n(18),v=n(61),y=n(6),L=n(66),E=n(103),S=n(112),w=n(20),O=n(106),k=n(5),T=n(29),x=n(33),_=n(55),j=n(74),A=n(87),P=n(95),N=n(81),C=n(89),D=n(15),R=n(121),H=n(10),M=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let V,F=null;const I=new l.a("page-sign",!0,()=>{const e=()=>{t=m.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),D.default.addEventListener("language_change",()=>{e()});const l=new Map;let b,B;const U=document.createElement("div");U.classList.add("input-wrapper");const q=new c.b({label:"Login.CountrySelectorLabel",name:Object(L.b)()});q.container.classList.add("input-select");const $=q.input,W=document.createElement("div");W.classList.add("select-wrapper","z-depth-3","hide");const Q=document.createElement("span");Q.classList.add("arrow","arrow-down"),q.container.append(Q);const K=document.createElement("ul");W.appendChild(K);new s.b(W);let z=()=>{z=null,t.forEach(e=>{const t=Object(P.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const s=document.createElement("li");let a=r.a.wrapEmojiText(t);if(H.a){const e=document.createElement("span");e.innerHTML=a,s.append(e)}else s.innerHTML=a;const o=Object(m.i18n)(e.default_name);o.dataset.defaultName=e.default_name,s.append(o);const l=document.createElement("span");l.classList.add("phone-code"),l.innerText="+"+i.country_code,s.appendChild(l),n.push(s),K.append(s)}),l.set(e.iso2,n)}),K.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");G(t)}),q.container.appendChild(W)};const G=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,s=i.replace(/\D/g,"");Object(x.a)($,Object(m.i18n)(n)),Object(N.a)($,"input"),b=t.find(e=>e.default_name===n),B=b.country_codes.find(e=>e.country_code===s),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(A.a)(te,!0)},0)};let X;z(),$.addEventListener("focus",(function(e){z?z():t.forEach(e=>{l.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(X),X=void 0,W.classList.remove("hide"),W.offsetWidth,W.classList.add("active"),q.select(),Object(h.b)({container:I.pageEl.parentElement.parentElement,element:$,position:"start",margin:4}),setTimeout(()=>{J||(document.addEventListener("mousedown",Y,{capture:!0}),J=!0)},0)}));let J=!1;const Y=e=>{Object(y.a)(e.target,"input-select")||e.target!==$&&(Z(),document.removeEventListener("mousedown",Y,{capture:!0}),J=!1)},Z=()=>{void 0===X&&(W.classList.remove("active"),X=window.setTimeout(()=>{W.classList.add("hide"),X=void 0},200))};$.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=q.value.toLowerCase(),s=[];t.forEach(e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach(e=>{const n=e.split(" ").filter(e=>/\w/.test(e)).map(e=>e[0]).join("");n.length>1&&t.push(n)});let n=!!t.filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));l.get(e.iso2).forEach(e=>e.style.display=n?"":"none"),n&&s.push(e)}),0===s.length?t.forEach(e=>{l.get(e.iso2).forEach(e=>e.style.display="")}):1===s.length&&"Enter"===n&&G(l.get(s[0].iso2)[0])}),Q.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),$.matches(":focus")?$.blur():$.focus()}));const ee=new R.a({onInput:e=>{g.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===q.value||b&&t&&n&&(b===t||B.country_code===n.country_code)||(Object(x.a)($,t?Object(m.i18n)(t.default_name):i),b=t,B=n),t||ee.value.length-1>1?F.style.visibility="":F.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!F.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;a.default.pushToState("keepSigned",e),E.a.toggleStorage(e),S.a.toggleStorage(e),o.a.toggleStorage(e),j.a.toggleStorage(e)}),a.default.getState().then(e=>{a.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),F=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),F.style.visibility="hidden";const ie=e=>{e&&Object(k.a)(e);const t=Object(_.a)([F,V],!0);Object(x.a)(F,Object(m.i18n)("PleaseWait")),Object(i.f)(F);let s=ee.value;o.a.invokeApi("auth.sendCode",{phone_number:s,api_id:f.a.id,api_hash:f.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(23).then(n.bind(null,22)).then(t=>t.default.mount(Object.assign(e,{phone_number:s})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(x.a)(ee.label,Object(m.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(x.a)(F,Object(m.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),F.innerText=e.type}})};Object(T.b)(F,ie),V=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});V.addEventListener("click",()=>{w.default.mount()}),U.append(q.container,ee.container,ne.label,F,V);const se=document.createElement("h4");se.classList.add("text-center"),Object(m._i18n)(se,"Login.Title");const ae=document.createElement("div");ae.classList.add("subtitle","text-center"),Object(m._i18n)(ae,"Login.StartText"),I.pageEl.querySelector(".container").append(se,ae,U);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(U),o.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=C.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&m.default.getLangPack(n.lang_code).then(()=>{Object(N.a)(te,"input")});const i=new Set([1,2,3,4,5]),s=[e.this_dc];let a;return e.nearest_dc!==e.this_dc&&(a=o.a.getNetworker(e.nearest_dc).then(()=>{s.push(e.nearest_dc)})),(a||Promise.resolve()).then(()=>{s.forEach(e=>{i.delete(e)});const e=[...i],t=()=>M(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield j.a.get(i))return t();setTimeout(()=>{o.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{q.value.length||ee.value.length||G(l.get(e.country)[0])})},()=>{F&&(Object(x.a)(F,Object(m.i18n)("Login.Next")),Object(b.ripple)(F,void 0,void 0,!0),F.removeAttribute("disabled")),V&&V.removeAttribute("disabled"),a.default.pushToState("authState",{_:"authStateSignIn"})});t.default=I},33:function(e,t,n){"use strict";function i(e,t){if("string"==typeof t)return void(e.innerHTML=t);const n=e.firstChild;n?e.lastChild===n?n.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}n.d(t,"a",(function(){return i}))},36:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var i=n(81),s=n(71),a=n(57),o=n(77);var r=n(16),l=n(31),c=n(48);let d=()=>{document.addEventListener("paste",e=>{if(!Object(s.a)(e.target,'contenteditable="true"'))return;let t,n;e.preventDefault();let i=(e.originalEvent||e).clipboardData.getData("text/plain"),o=!0,r=(e.originalEvent||e).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const e=r.match(/([\s\S]*)<\/body>/);e&&(r=e[1].trim());let s=document.createElement("span");s.innerHTML=r;let c=s.firstChild;for(;c;){let e=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=e}const d=Object(a.a)(s,!0);if(d.value.replace(/\s/g,"").length===i.replace(/\s/g,"").length){t=d.value,n=d.entities,o=!1;let e=l.b.parseEntities(t);e=e.filter(e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._),l.b.mergeEntities(n,e)}}o&&(t=i,n=l.b.parseEntities(t),n=n.filter(e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._)),t=l.b.wrapDraftText(t,{entities:n}),window.document.execCommand("insertHTML",!1,t)}),d=null};var u;!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(u||(u={}));t.b=class{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:n,showLengthOn:i,name:s,plainText:l,canBeEdited:c=!0}=e;let u,h,p=e.label||e.labelText;if(l)this.container.innerHTML=`\n \n `,u=this.container.firstElementChild;else{d&&d(),this.container.innerHTML=`\n
\n `,u=this.container.firstElementChild;const t=new MutationObserver(()=>{h&&h()});u.addEventListener("input",()=>{Object(o.a)(u)&&(u.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=u.innerHTML,this.onFakeInput())}),t.observe(u,{characterData:!0,childList:!0,subtree:!0}),e.animate&&(u.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=u.className+" input-field-input-fake")}if(u.setAttribute("dir","auto"),t&&(Object(r._i18n)(u,t,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,t,void 0,"placeholder")),p||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const e=this.container.lastElementChild;let t=!1;h=()=>{const s=u.classList.contains("error"),o=l?u.value.length:[...Object(a.a)(u,!1).value].length,r=n-o,c=r<0;u.classList.toggle("error",c),c||r<=i?(this.setLabel(),e.append(` (${n-o})`),t||(t=!0)):(s&&!c||t)&&(this.setLabel(),t=!1)},u.addEventListener("input",h)}this.input=u}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const n=window.getSelection();n.removeAllRanges(),n.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,n=+this.input.style.height.replace("px","");if(n===t)return;const i=Math.round(50*Math.log(Math.abs(t-n)));this.input.style.transitionDuration=i+"ms",e&&(this.input.style.height=t?t+"px":"");Object(c.a)(this.input,"is-changing-height",!0,i,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(e){this.setValueSilently(e,!1),Object(i.a)(this.input,"input")}setValueSilently(e,t=!0){this.options.plainText?this.input.value=e:(this.input.innerHTML=e,this.inputFake&&(this.inputFake.innerHTML=e,t&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t=!1){this.options.plainText||(e=l.b.wrapDraftText(e)),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t=!1){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t&&(this.label.textContent="",this.label.append(Object(r.i18n)(t,this.options.labelOptions))),this.input.classList.toggle("error",!!(e&u.Error)),this.input.classList.toggle("valid",!!(e&u.Valid))}setError(e){this.setState(u.Error,e)}}},44:function(e,t,n){"use strict";n.d(t,"b",(function(){return c})),n.d(t,"a",(function(){return d}));var i=n(1),s=n(41),a=n(86),o=n(82),r=n(5);class l{constructor(e,t="",n=document.createElement("div")){this.el=e,this.container=n,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e)),e.append(this.container))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),this.removeHeavyAnimationListener=Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)}))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.container.removeEventListener("scroll",this.onScroll,{capture:!0}),this.removeHeavyAnimationListener())}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(a.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class c extends l{constructor(e,t="",n=300,i){super(e,t),this.onScrollOffset=n,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,n=this.lastScrollPosition;this.onScrolledTop&&n<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-n<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends l{constructor(e,t="",n=300,s=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=n,this.splitCount=s,this.container=a,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},46:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(17),s=n(18),a=n(16),o=n(113);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const n=this.input=document.createElement("input");let r;if(n.classList.add("checkbox-field-input"),n.type="checkbox",e.name&&(n.id="input-"+e.name),e.checked&&(n.checked=!0),e.stateKey&&i.default.getState().then(t=>{const s=Object(o.a)(t,e.stateKey);let a;a=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(a),n.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[n.checked?1:0]:n.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(a._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(n),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.classList.add("checkbox-box-check"),n.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),n.append(i);const s=document.createElement("div");s.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,s,n),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(s.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},48:function(e,t,n){"use strict";var i=n(15);const s=(e,t,n,a,o,r)=>{const{timeout:l,raf:c}=e.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete e.dataset.raf),r&&i.default.settings.animationsEnabled&&a)return void(e.dataset.raf=""+window.requestAnimationFrame(()=>{delete e.dataset.raf,s(e,t,n,a,o,r-1)}));n&&t&&e.classList.add(t);const d=()=>{delete e.dataset.timeout,!n&&t&&e.classList.remove("backwards",t),e.classList.remove("animating"),o&&o()};if(!i.default.settings.animationsEnabled||!a)return e.classList.remove("animating","backwards"),void d();e.classList.add("animating"),e.classList.toggle("backwards",!n),e.dataset.timeout=""+setTimeout(d,a)};t.a=s},55:function(e,t,n){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}n.d(t,"a",(function(){return i}))},57:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var i=n(30),s=n(31),a=n(72);function o(e,t=!0){const n=[],i=[],o=t?[]:void 0;Object(a.a)(e,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}i.a.getRichValue=o},61:function(e,t,n){"use strict";function i(e,t){return e.closest(t)}n.d(t,"a",(function(){return i}))},71:function(e,t,n){"use strict";function i(e,t){return e.closest(`[${t}]`)}n.d(t,"a",(function(){return i}))},72:function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return a}));const i={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(e,t,n,o,r,l,c={offset:0}){if(3===e.nodeType){let t=e.nodeValue;if(o===e?n.push(t.substr(0,r)+""+t.substr(r)):n.push(t),l&&t.length&&e.parentNode){const n=e.parentElement;for(const e in i){const s=i[e],a=n.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:t.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:t.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:t.length}))}}return void(c.offset+=t.length)}if(1!==e.nodeType)return;const d=o===e,u=s.has(e.tagName);if(u&&n.length)t.push(n.join("")),n.splice(0,n.length),++c.offset;else if(e instanceof HTMLImageElement){const t=e.alt;t&&(n.push(t),c.offset+=t.length)}d&&!r&&n.push("");const h=e.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let f=e.firstChild;for(;f;)a(f,t,n,o,r,l,c),f=f.nextSibling;if(d&&r&&n.push(""),h&&e.nextSibling&&(n.push(" "),++c.offset,void 0!==p))for(let e=p,t=l.length;e{e&&(this.serverTimeOffset=e)}),a.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=o),t.a=o},87:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(1);function s(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var n=document.createRange();n.selectNodeContents(e),n.collapse(!1);var s=window.getSelection();s.removeAllRanges(),s.addRange(n)}else if(void 0!==document.body.createTextRange){var a=document.body.createTextRange();a.moveToElementText(e),a.collapse(!1),a.select()}}},92:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(16);const s=new Map;let a=0;const o=(e,t,n="")=>{n=t.country_code+n,a=Math.max(a,n.length),s.set(n,{country:e,code:t})};function r(e){e=e||"",s.size||i.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{o(e,t,n)}):o(e,t)})});let t,n=e.replace(/\D/g,""),r=n.slice(0,a);for(let e=r.length-1;e>=0&&(t=s.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const l=t.country,c=t.code.patterns||[],d=n.slice(t.code.country_code.length);let u="",h=0,p="";for(let e=c.length-1;e>=0;--e){u=c[e];const t=u.replace(/ /g,"");let n=0;for(let e=0,i=Math.min(d.length,t.length);eh&&(h=n,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=t.code.country_code+" "+u,u.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let f=u&&u.length>n.length?u.slice(n.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:n,country:l,code:t.code,leftPattern:f}}},97:function(e,t,n){"use strict";function i(e,t){return new Promise(n=>{const i=new FileReader;i.addEventListener("loadend",e=>{n(e.target.result)}),i[t](e)})}n.d(t,"a",(function(){return i}))}}]); +//# sourceMappingURL=13.2690683310eb11d72c46.chunk.js.map \ No newline at end of file diff --git a/public/13.2690683310eb11d72c46.chunk.js.map b/public/13.2690683310eb11d72c46.chunk.js.map new file mode 100644 index 00000000..7e0181d9 --- /dev/null +++ b/public/13.2690683310eb11d72c46.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/helpers/bytes/bytesToBase64.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/helpers/blob/readBlobAs.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","readBlobAsUint8Array","blob","readBlobAs","readBlobAsArrayBuffer","buffer","Uint8Array","blobSupported","blobConstruct","this","fileWriter","bytes","Blob","arr","write","mimeType","saveFileCallback","blobParts","part","truncate","length","finalize","saveToStorage","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","Response","headers","size","save","callback","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","map","storage","deleteAll","fixBase64String","str","toUrl","replace","bytesCmp","bytes1","bytes2","len","i","TelInputField","options","super","label","name","pasted","lastValue","container","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","formattedPhoneNumber","Math","abs","setLabel","formatted","country","countryCode","leftPattern","code","dataset","onInput","metaKey","ctrlKey","shiftKey","preventDefault","uint6ToBase64","nUint6","onFirstMount","imageDiv","pageEl","querySelector","preloader","inputWrapper","document","createElement","btnBack","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","reader","FileReader","onload","target","readAsDataURL","qrCode","width","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","serverTimeManager","serverTimeOffset","console","warn","handled","error","func","appStateManager","pushToState","btnQr","btnNext","page","setCountries","countries","countriesList","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","emoji","iso2","liArr","country_codes","wrapped","wrapEmojiText","spanEmoji","innerHTML","defaultName","span","innerText","country_code","button","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","hidePicker","focus","hideTimeout","offsetWidth","select","element","position","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","_value","toLowerCase","matches","names","Boolean","abbr","split","word","join","good","indexOf","cancelBubble","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","toggleStorage","getState","state","isAvailable","toggle","phone_number","settings","Object","assign","setError","subtitle","nearestDcResult","langPack","getFromCache","lang_code","dcs","Set","done","this_dc","nearest_dc","getNetworker","_dcs","g","shift","dbKey","finally","removeAttribute","replaceContent","elem","node","firstChild","replaceWith","textContent","init","findUpAttribute","entities","plainText","originalEvent","clipboardData","getData","usePlainText","html","curChild","nextSibling","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","labelEl","showingLength","wasError","contains","inputLength","isError","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelAnimationFrame","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollPosition","scrollProperty","checkForTriggers","removeHeavyAnimationListener","passive","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","animationsEnabled","afterTimeout","field","withEntities","lines","line","combineSameEntities","sortEntities","findUpTag","tag","closest","attribute","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","getRichElementValue","selNode","selOffset","offset","substr","parentNode","getAttribute","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","wasEntitiesLength","wasLength","hasAttribute","to","addTaskListener","task","payload","placeCaretAtEnd","ignoreTouchCheck","activeElement","collapse","body","createTextRange","textRange","moveToElementText","prefixes","maxPrefixLength","setPrefix","prefix","max","formatPhoneNumber","originalStr","prefixCountry","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","symbol","idx"],"mappings":"+FAAA,oGAgBA,IAmBIA,EAnBAC,GAAM,EAqBK,SAASC,EAAwBC,GAC3CF,IAnBAD,IACIA,EAAgB,IAAWI,YAAYC,KAAKC,GAC9CA,EAAOC,sBAAwB,UAAKC,sBAG9BC,QAAQC,IAAI,CACjBJ,EACA,UAAKK,WAAWL,EAAOC,oBAAqB,CAAC,6BAC7C,UAAKK,qBAGA,MASDP,KAAK,EAAEC,EAAQO,MACvB,IAAIP,EACF,OAGF,MAAMQ,EAA2B,GACjCD,EAAQE,QAAQC,IACd,MAAMC,EAAe,UAAKJ,QAAQK,IAAIF,EAAOG,KACzCF,IAIJH,EAAOM,KAAKH,GACZ,UAAKJ,QAAQZ,IAAIe,EAAOG,IAAoBH,MAG9C,MAAMK,EAAoB,YAAO,4DAA6D,CAACC,KAAM,6BACrGD,EAAkBE,iBAAiBC,UAAUC,OAAO,QACpD,cAAYpB,KAAK,KACfqB,OAAOC,sBAAsB,KAC3BxB,EAASyB,OAAOP,OAIpB,UAAUQ,iBAAiB,kBAAmB,KAC5CR,EAAkBI,UACjB,CAACK,MAAM,IAEVhB,EAAOC,QAAQC,IACb,UAAKH,QAAQZ,IAAIe,EAAOG,IAAoBH,KAG9C,YAAiBK,EAAoBU,IACnC,YAAYA,GAEZ9B,GAAM,EAENoB,EAAkBW,UAAW,EAC7B,YAAaX,GAEb,UAAKY,YAAY3B,EAAOC,2B,+FCvEf,SAAS2B,EAAqBC,GAC3C,OCDa,SAA+BA,GAC5C,OAAO,OAAAC,EAAA,GAAWD,EAAM,qBDAjBE,CAAsBF,GAAM9B,KAAKiC,GAAU,IAAIC,WAAWD,I,0SE0DpD,UArDR,MAGL,cAFQ,KAAAE,eAAgB,EAGtB,IACE,OAAAC,EAAA,GAAc,GAAI,IAClB,MAAMV,GACNW,KAAKF,eAAgB,GAIlB,cACL,OAAOE,KAAKF,cAGP,MAAMG,EAA0DC,GACrE,OAAGA,aAAiBC,KACXX,EAAqBU,GAAOvC,KAAKyC,GAC/BH,EAAWI,MAAMD,IAGnBH,EAAWI,MAAMH,GAIrB,kBAAkBI,EAAkBC,GACzC,MAAMC,EAAwC,GAuB9C,MAtBuB,CACrBH,MAAaI,GAA8B,EAAD,gCACxC,IAAIT,KAAKF,cACP,MAAM,EAGRU,EAAU9B,KAAK+B,MAEjBC,SAAU,KACRF,EAAUG,OAAS,GAErBC,SAAU,CAACC,GAAgB,KACzB,MAAMpB,EAAO,OAAAM,EAAA,GAAcS,EAAWF,GAMtC,OAJGO,GAAiBN,GAClBA,EAAiBd,GAGZA,M,sSC7CA,MAAM,EAQnB,YAAoBqB,GAAA,KAAAA,SAJZ,KAAAC,YAAa,EAKhB,IAAMC,OACPhB,KAAKc,QAAU,SAGd,EAAuBG,SAASN,SACjCX,KAAKe,WAAa,EAAuBE,SAAS,GAAGF,YAGvDf,KAAKkB,eACL,EAAuBD,SAASvC,KAAKsB,MAG/B,e,MACN,OAAyB,QAAlB,EAAAA,KAAKmB,qBAAa,QAAKnB,KAAKmB,cAAgBC,OAAOC,KAAKrB,KAAKc,QAG/D,OAAOQ,GACZ,OAAOtB,KAAKuB,iBAAkBC,GAAUA,EAAMC,OAAO,IAAMH,IAGtD,YACL,OAAOF,OAAOK,OAAOzB,KAAKc,QAGrB,IAAIQ,GACT,OAAOtB,KAAKuB,iBAAkBC,GAAUA,EAAME,MAAM,IAAMJ,IAGrD,KAAKA,EAAmBK,GAE7B,OAAO3B,KAAKuB,iBAAkBC,GAAUA,EAAMI,IAAI,IAAMN,EAAWK,IAG9D,QAAQE,EAAkBC,EAAmC,QAOlE,OAAO9B,KAAKxB,IAAIqD,GAAUlE,KAAMgE,IAC9B,IAAIA,EAEF,KAAM,iBAOR,OAJgBA,EAASG,OAQtB,SAASD,EAAkBpC,GAE3BA,aAAgBU,OACnBV,EAAO,OAAAM,EAAA,GAAcN,IAGvB,MAAMkC,EAAW,IAAII,SAAStC,EAAM,CAClCuC,QAAS,CACP,iBAAkB,GAAKvC,EAAKwC,QAIhC,OAAOjC,KAAKkC,KAAKL,EAAUF,GAAUhE,KAAK,IAAM8B,GAG3C,iBAAoB0C,GACzB,OAAInC,KAAKe,WAIF,IAAIhD,QAAW,CAAMqE,EAASC,IAAW,kCAC9C,IAAIC,GAAW,EACf,MAAMC,EAAUC,WAAW,KACzBH,IAEAC,GAAW,GACV,MAEH,IACE,MAAMd,QAAcxB,KAAKkB,eACzB,IAAIM,EAGF,MAFAxB,KAAKe,YAAa,EAClBf,KAAKmB,mBAAgBsB,EACf,YAGR,MAAMC,QAAYP,EAASX,GAE3B,GAAGc,EAAU,OACbF,EAAQM,GACR,MAAMC,GACNN,EAAOM,GAGTC,aAAaL,OA3BNxE,QAAQsE,OAAO,mBA+BnB,cAAcR,EAAkBvB,GACrC,MAAMuC,EAAa,EAAYC,kBAAkBxC,EAAWb,GACnDO,KAAK+C,SAASlB,EAAUpC,GAAMuD,MAAM,IAAMvD,IAGnD,OAAO1B,QAAQqE,QAAQS,GAGlB,qBAAqBI,GAC1B,OAAOlF,QAAQC,IAAIgC,KAAKiB,SAASiC,IAAIC,IAGnC,GAFAA,EAAQpC,WAAakC,GAEjBA,EACF,OAAOE,EAAQC,gBA3HN,EAAAnC,SAAqC,I,iCCfvC,SAASoC,EAAgBC,EAAaC,GACnD,OAAGA,EACMD,EAAIE,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,OAAQ,IAE5DF,EAAIE,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAJhD,mC,iCCAe,SAASC,EAASC,EAA+BC,GAC9D,MAAMC,EAAMF,EAAO/C,OACnB,GAAGiD,IAAQD,EAAOhD,OAChB,OAAO,EAGT,IAAI,IAAIkD,EAAI,EAAGA,EAAID,IAAOC,EACxB,GAAGH,EAAOG,KAAOF,EAAOE,GACtB,OAAO,EAIX,OAAO,EAZT,mC,iCCAA,qEAYe,MAAMC,UAAsB,IAIzC,YAAYC,EAER,IACFC,MAAM,OAAD,QACHC,MAAO,mCAEPC,KAAM,SACHH,IAVC,KAAAI,QAAS,EACV,KAAAC,UAAY,GAYjBpE,KAAKqE,UAAUvF,UAAUwF,IAAI,qBAE7B,IAAIC,EAAQvE,KAAKwE,MACjB,GAAGD,aAAiBE,iBAClBF,EAAMG,KAAO,MACbH,EAAMI,aAAe,qBAChB,CACLJ,EAAMK,UAAY,UAElB,MAAMC,EAAa7F,OAAO8F,iBAC1B,GAAGD,EAAa,EAAG,CACjB,IAAIE,EACD,WACDA,GAA8B,IAAdF,EACR,eACRE,EAAgB,GAGlBR,EAAMS,MAAMC,YAAY,mBAAoBF,EAAgB,MAG9D,MAAMG,EAAelF,KAAKmF,iBAAiBC,KAAKpF,MAChDA,KAAKmF,iBAAoBE,IACvBH,EAAaG,GACb,YAAgBrF,KAAKwE,OAAO,IAIhCD,EAAMpF,iBAAiB,QAAS,KAE9BoF,EAAMzF,UAAUC,OAAO,SAEvB,MAAMsG,EAAQrF,KAAKqF,MAUnB,IAAIC,EATSC,KAAKC,IAAIH,EAAM1E,OAASX,KAAKoE,UAAUzD,QAC1C,IAAMX,KAAKmE,QAAU,mBAC7BnE,KAAKmF,iBAAiBnF,KAAKoE,UAAYiB,GAGzCrF,KAAKmE,QAAS,EAEdnE,KAAKyF,WAGL,IAAIC,EAAmBC,EAAsBC,EAA8BC,EAAc,GACnD,MAAnC7F,KAAKqF,MAAM7B,QAAQ,MAAO,KAC3BxD,KAAKmF,iBAAiB,MAEtBG,EAAuB,YAAkBtF,KAAKqF,OAC9CK,EAAYJ,EAAqBI,UACjCC,EAAUL,EAAqBK,QAC/BE,EAAcP,EAAqBO,YACnCD,EAAcN,EAAqBQ,KACnC9F,KAAKmF,iBAAiBnF,KAAKoE,UAAYsB,EAAY,IAAMA,EAAY,KAGvEnB,EAAMwB,QAAQF,YAAcA,EAI5B9B,EAAQiC,SAAWjC,EAAQiC,QAAQV,KAGrCf,EAAMpF,iBAAiB,QAAS,KAC9Ba,KAAKmE,QAAS,IAQhBI,EAAMpF,iBAAiB,WAAaE,IAElC,MAAMZ,EAAMY,EAAEZ,IACd,GAAG,KAAKuC,KAAKvC,KAAUY,EAAE4G,UAAW5G,EAAE6G,SAAoB,cAARzH,IAAiC,MAARA,IAAeY,EAAE8G,UAE1F,OADA9G,EAAE+G,kBACK,O,qJCjFR,SAASC,EAAcC,GAC5B,OAAOA,EAAS,GACZA,EAAS,GACTA,EAAS,GACPA,EAAS,GACTA,EAAS,GACPA,EAAS,EACE,KAAXA,EACE,GACW,KAAXA,EACE,GACA,G,0SCNd,IAyNIhJ,EAzNAiJ,EAAe,IAAW,OAAD,6BAC3B,MACMC,EADc,EAAKC,OACIC,cAAc,eAE3C,IAAIC,EAAY,YAAaH,GAAU,GAEvC,MAAMI,EAAeC,SAASC,cAAc,OAC5CF,EAAa9H,UAAUwF,IAAI,iBAE3B,MAAMyC,EAAU,YAAO,4DAA6D,CAACnI,KAAM,oBAC3FgI,EAAa1H,OAAO6H,GAEpB,YAAwBH,GAExB,MAAMvC,EAAYmC,EAASQ,cAErBC,EAAKJ,SAASC,cAAc,MAClC,gBAAMG,EAAI,kBAEV,MAAMC,EAAWL,SAASC,cAAc,MACxCI,EAASpI,UAAUwF,IAAI,kBACtB,CAAC,iBAAkB,iBAAkB,kBAAoCjG,QAASI,IACjF,MAAM0I,EAAKN,SAASC,cAAc,MAClCK,EAAGjI,OAAO,eAAKT,IACfyI,EAAShI,OAAOiI,KAGlB9C,EAAUnF,OAAO+H,EAAIC,EAAUN,GAE/BG,EAAQ5H,iBAAiB,QAAS,KAChC,oDAAuBxB,KAAKyJ,GAAKA,EAAEC,QAAQC,SAC3CC,GAAO,IAGT,MAGMC,SAHgBzJ,QAAQC,IAAI,CAChC,sCAE4B,GAAGqJ,QAEjC,IAAIE,GAAO,EACXE,EAAA,QAAUtI,iBAAiB,YAAa,KACtCoI,GAAO,EACPjK,EAAgB,MACf,CAAC8B,MAAM,IAEV,IACIsI,EADA3D,EAA6C,CAAC4D,cAAc,GAGhE,MAAMC,EAAgBC,GAAoB,OAAD,6BACvC,IACE,IAAIC,QAAmB,IAAWC,UAAU,wBAAyB,CACnEC,OAAQ,IAAIC,GACZC,SAAU,IAAIC,KACdC,WAAY,IACX,CAACT,cAAc,IAclB,GAZoB,6BAAjBG,EAAWO,IACRtE,EAAQuE,OACVvE,EAAQuE,KAAOR,EAAWS,MAC1B,IAAWC,YAAYV,EAAWS,QAIpCT,QAAmB,IAAWC,UAAU,wBAAyB,CAC/DU,MAAOX,EAAWW,OACjB1E,IAGe,2BAAjB+D,EAAWO,EAAgC,CAC5C,MAAMK,EAAgBZ,EAAWY,cAGjC,OAFA,IAAWC,QAAQD,EAAcE,MACjC,6BAAmBjL,KAAKyJ,GAAKA,EAAEC,QAAQC,UAChC,EAOT,IAAII,IAAc,OAAAjE,EAAA,GAASiE,EAAWI,EAAWW,OAAQ,CACvDf,EAAYI,EAAWW,MAEvB,IAAII,ED5GG,SAAuB3I,GACpC,IAAI4I,EACAC,EAAS,GAEb,IAAI,IAAIC,EAAO9I,EAAMS,OAAQsI,EAAU,EAAGC,EAAO,EAAGA,EAAOF,IAAQE,EACjEJ,EAAOI,EAAO,EACdD,GAAW/I,EAAMgJ,KAAU,KAAOJ,EAAO,IAC7B,IAATA,GAAcE,EAAOE,GAAS,IAC/BH,GAAUI,OAAOC,aACf/C,EAAc4C,IAAY,GAAK,IAC/B5C,EAAc4C,IAAY,GAAK,IAC/B5C,EAAc4C,IAAY,EAAI,IAC9B5C,EAAwB,GAAV4C,IAEhBA,EAAU,GAId,OAAOF,EAAOvF,QAAQ,aAAc,KC0FhB6F,CAAcvB,EAAWW,OACnCa,EAAM,oBAAsB,OAAAjG,EAAA,GAAgBwF,GAAS,GAEzD,MAAM7D,EAAQhG,OAAOuK,iBAAiB1C,SAAS2C,iBACzCC,EAAezE,EAAM0E,iBAAiB,mBAAmBC,OACzDC,EAAY5E,EAAM0E,iBAAiB,wBAAwBC,OAC3DE,EAAe7E,EAAM0E,iBAAiB,mBAAmBC,OAEzDG,QAAgBC,MAAM,8BAC3BpM,KAAK+E,GAAOA,EAAI9D,QAChBjB,KAAKiB,IACJA,EAAOA,EAAK4E,QAAQ,gBAAiB,KAAKqG,OAC1C,MAAMpK,EAAO,IAAIU,KAAK,CAACvB,GAAO,CAAC8F,KAAM,gCAGrC,OAAO,IAAI3G,QAAiBqE,IAC1B,MAAM4H,EAAS,IAAIC,WACnBD,EAAOE,OAAU7K,IACf+C,EAAQ/C,EAAE8K,OAAOpB,SAEnBiB,EAAOI,cAAc3K,OAKnB4K,EAAS,IAAI7C,EAAc,CAC/B8C,MAAO,IAAMtL,OAAO8F,iBACpByF,OAAQ,IAAMvL,OAAO8F,iBACrB0F,KAAMlB,EACNmB,MAAOX,EACPY,YAAa,CACXC,MAAOf,EACPlF,KAAM,WAERkG,qBAAsB,CACpBlG,KAAM,iBAERmG,aAAc,CACZC,UAAW,EACXC,OAAQ,GAEVC,kBAAmB,CACjBL,MAAOlB,GAETwB,UAAW,CACTC,qBAAsB,OAO1B,IAAIC,EAHJd,EAAOnL,OAAOsH,GACbA,EAAS4E,UAAgCtM,UAAUwF,IAAI,aAItD6G,EADCd,EAAOgB,gBACEhB,EAAOgB,gBAEPtN,QAAQuN,KAAK,CACrB,OAAAC,EAAA,GAAM,KACN,IAAIxN,QAAeqE,IACjBiI,EAAOmB,QAAQC,OAAOtM,iBAAiB,OAAQ,KAC7CH,OAAOC,sBAAsB,IAAMmD,MAClC,CAAChD,MAAM,cAMV+L,EAAQxN,KAAK,KACjB,GAAGgJ,EAAW,CACZA,EAAU3B,MAAM0G,UAAY,yBAE5B,MAAMC,EAAInF,EAASoF,SAAS,GAC5BD,EAAE3G,MAAM6G,QAAU,OAClBF,EAAE3G,MAAM0G,UAAY,yBACpBlJ,WAAW,KACTmJ,EAAE3G,MAAM6G,QAAU,IACjB,KAEHrJ,WAAW,KACTmJ,EAAE3G,MAAM0G,UAAY,IACnB,KACH/E,OAAYlE,OAEZqJ,MAAMC,KAAKvF,EAASoF,UAAUI,MAAM,GAAI,GAAG3N,QAAQ4N,IACjDA,EAAGlN,aAMX,GAAG8I,EAAQ,CACT,IAAIqE,EAAYC,KAAKC,MAAQ,IACzBC,EAAOvE,EAAWwE,QAAUJ,EAAYK,EAAA,EAAkBC,uBAExD,OAAAjB,EAAA,GAAMc,EAlLG,EAkLqB,IAAuB,IAAMA,EAAO,IAE1E,MAAM1J,GACN,OAAQA,EAAiB+B,MACvB,IAAK,0BACH+H,QAAQC,KAAK,uCACZ/J,EAAiBgK,SAAU,EAC5B,8BAAyBhP,KAAKyJ,GAAKA,EAAEC,QAAQC,SAC7CC,GAAO,EACPjK,EAAgB,KAChB,MACF,QACEmP,QAAQG,MAAM,6BAA8BjK,GAC5C4E,GAAO,EAIX,OAAO,EAGT,OAAO,KAKT,MAAO,IAAW,OAAD,6BAGf,IAFAA,GAAO,IAEJ,CACD,GAAGA,EACD,MAIF,SADwBK,GAAQ,GAE9B,aAOR,MAAM,EAAO,IAAI,IAAK,eAAe,EAAM,IAClCtK,EACN,KAEGA,IAAeA,EAAgBiJ,KACnCjJ,EAAcK,KAAKkP,IACjBA,MAGFC,EAAA,QAAgBC,YAAY,YAAa,CAAC1E,EAAG,sBAGhC,a,gCChQf,2R,sSA4CA,IAAuC2E,EAAnCC,EAA6B,KAgdjC,MAAMC,EAAO,IAAI,IAAK,aAAa,EA9chB,KAmBjB,MAAMC,EAAe,KACnBC,EAAY,UAAKC,cAChBC,OAAO3H,IAAU,MAAC,QAAe,QAAd,EAAAA,EAAQ4H,cAAM,eAAEC,UACnCC,KAAK,CAACC,EAAGC,KAAOD,EAAExJ,MAAQwJ,EAAEE,cAAcC,cAAcF,EAAEzJ,MAAQyJ,EAAEC,gBAEvE,IAAIR,EAEJD,IAEA,UAAUhO,iBAAiB,kBAAmB,KAC5CgO,MAGF,MAAMW,EAAsC,IAAIC,IAEhD,IAAIC,EAAkCC,EAEtC,MAAMrH,EAAeC,SAASC,cAAc,OAC5CF,EAAa9H,UAAUwF,IAAI,iBAE3B,MAAM4J,EAAoB,IAAI,IAAW,CACvCjK,MAAO,6BACPC,KAAM,gBAGRgK,EAAkB7J,UAAUvF,UAAUwF,IAAI,gBAE1C,MAAM6J,EAAeD,EAAkB1J,MAGjC4J,EAAgBvH,SAASC,cAAc,OAC7CsH,EAActP,UAAUwF,IAAI,iBAAkB,YAAa,QAE3D,MAAM+J,EAAYxH,SAASC,cAAc,QACzCuH,EAAUvP,UAAUwF,IAAI,QAAS,cACjC4J,EAAkB7J,UAAUnF,OAAOmP,GAEnC,MAAMC,EAAazH,SAASC,cAAc,MAC1CsH,EAAcG,YAAYD,GAEX,IAAI,IAAWF,GAE9B,IAAII,EAAa,KACfA,EAAa,KAEbpB,EAAU/O,QAASsN,IACjB,MAAM8C,EAAQ,YAAgB9C,EAAE+C,MAE1BC,EAA8B,GACpChD,EAAEiD,cAAcvQ,QAASuH,IACvB,MAAMuB,EAAKN,SAASC,cAAc,MAElC,IAAI+H,EAAU,IAAkBC,cAAcL,GAC9C,GAAG,IAAoB,CACrB,MAAMM,EAAYlI,SAASC,cAAc,QACzCiI,EAAUC,UAAYH,EACtB1H,EAAGjI,OAAO6P,QAEV5H,EAAG6H,UAAYH,EAGjB,MAAM5C,EAAK,eAAKN,EAAEiC,cAClB3B,EAAGlG,QAAQkJ,YAActD,EAAEiC,aAC3BzG,EAAGjI,OAAO+M,GAEV,MAAMiD,EAAOrI,SAASC,cAAc,QACpCoI,EAAKpQ,UAAUwF,IAAI,cACnB4K,EAAKC,UAAY,IAAMvJ,EAAYwJ,aACnCjI,EAAGoH,YAAYW,GAEfP,EAAMjQ,KAAKyI,GACXmH,EAAWpP,OAAOiI,KAGpB2G,EAAMvQ,IAAIoO,EAAE+C,KAAMC,KAGpBL,EAAWnP,iBAAiB,YAAcE,IACxC,GAAgB,IAAbA,EAAEgQ,OACH,OAGF,MAAMlF,EAAS,YAAU9K,EAAE8K,OAAQ,MACnCmF,EAAsBnF,KAIxB+D,EAAkB7J,UAAUkK,YAAYH,IAG1C,MAAMkB,EAAyBnF,IAC7B,MAAM8E,EAAe9E,EAAOoF,WAAW,GAAmBxJ,QAAQkJ,YAC5DO,EAAYrF,EAAOzD,cAA2B,eAAeyI,UAC7DvJ,EAAc4J,EAAUhM,QAAQ,MAAO,IAE7C,YAAe2K,EAAc,eAAKc,IAClC,YAAcd,EAAc,SAC5BH,EAAsBZ,EAAUqC,KAAK9D,GAAKA,EAAEiC,eAAiBqB,GAC7DhB,EAA0BD,EAAoBY,cAAca,KAAKC,GAAgBA,EAAaN,eAAiBxJ,GAE/G+J,GAActK,MAAQsK,GAAcvL,UAAYoL,EAChDI,IACApN,WAAW,KACT+B,GAAMsL,QACN,YAAgBtL,IAAO,IACtB,IAKL,IAAIuL,EAFJtB,IAIAL,EAAahP,iBAAiB,SAAS,SAAoCE,GACtEmP,EACDA,IAEApB,EAAU/O,QAASsN,IACjBmC,EAAMtP,IAAImN,EAAE+C,MAAMrQ,QAAQ8I,GAAMA,EAAGnC,MAAM6G,QAAU,MAIvDjJ,aAAakN,GACbA,OAAcrN,EAEd2L,EAActP,UAAUC,OAAO,QAC1BqP,EAAc2B,YACnB3B,EAActP,UAAUwF,IAAI,UAE5B4J,EAAkB8B,SAElB,YAAiB,CACf3L,UAAW6I,EAAKzG,OAAOO,cAAcA,cACrCiJ,QAAS9B,EACT+B,SAAU,QACVnF,OAAQ,IAGVvI,WAAW,KACL2N,IACFtJ,SAAS1H,iBAAiB,YAAaiR,EAAa,CAACC,SAAS,IAC9DF,GAA2B,IAE5B,MAGL,IAAIA,GAA2B,EAC/B,MAAMC,EAAe/Q,IAChB,YAAgBA,EAAE8K,OAAQ,iBAG1B9K,EAAE8K,SAAWgE,IAIhByB,IACA/I,SAASyJ,oBAAoB,YAAaF,EAAa,CAACC,SAAS,IACjEF,GAA2B,IAGvBP,EAAa,UACEnN,IAAhBqN,IACH1B,EAActP,UAAUC,OAAO,UAC/B+Q,EAAc9Q,OAAOwD,WAAW,KAC9B4L,EAActP,UAAUwF,IAAI,QAC5BwL,OAAcrN,GACb,OAQL0L,EAAahP,iBAAiB,QAAUE,IACtC,MAAMZ,EAAMY,EAAEZ,IACd,GAAGY,EAAE6G,SAAmB,YAARzH,EAAmB,OAAO,EAG1C,IAAI8R,EAASrC,EAAkB7I,MAAMmL,cACjCC,EAAyB,GAC7BrD,EAAU/O,QAASsN,IACjB,MAAM+E,EAAQ,CACZ/E,EAAEzH,KACFyH,EAAEiC,aACFjC,EAAE+C,MAGJgC,EAAMpD,OAAOqD,SAAStS,QAAQ6F,IAC5B,MAAM0M,EAAO1M,EAAK2M,MAAM,KAAKvD,OAAOwD,GAAQ,KAAK9P,KAAK8P,IAAO5N,IAAI4N,GAAQA,EAAK,IAAIC,KAAK,IACpFH,EAAKjQ,OAAS,GACf+P,EAAMhS,KAAKkS,KAIf,IAAII,IAASN,EAAMpD,OAAOqD,SAASlB,KAAKnM,IAA8C,IAAvCA,EAAIkN,cAAcS,QAAQV,IAEzEzC,EAAMtP,IAAImN,EAAE+C,MAAMrQ,QAAQ8I,GAAMA,EAAGnC,MAAM6G,QAAUmF,EAAO,GAAK,QAC5DA,GAAMP,EAAQ/R,KAAKiN,KAYQ,IAAnB8E,EAAQ9P,OACnByM,EAAU/O,QAASsN,IACjBmC,EAAMtP,IAAImN,EAAE+C,MAAMrQ,QAAQ8I,GAAMA,EAAGnC,MAAM6G,QAAU,MAE1B,IAAnB4E,EAAQ9P,QAAwB,UAARlC,GAChC6Q,EAAsBxB,EAAMtP,IAAIiS,EAAQ,GAAG/B,MAAM,MAIrDL,EAAUlP,iBAAiB,aAAa,SAAiCE,GACvEA,EAAE6R,cAAe,EACjB7R,EAAE+G,iBACC+H,EAAasC,QAAQ,UAAWtC,EAAagD,OAC3ChD,EAAa0B,WAGpB,MAAMF,GAAgB,IAAI,IAAc,CACtC3J,QAAUN,IACR,IAAa0L,oBAEb,MAAM,QAACzL,EAAO,KAAEG,GAAQJ,GAAa,GACrC,IAAI2L,EAAc1L,EAAUA,EAAQzB,MAAQyB,EAAQiI,aAAe,GAChEyD,IAAgBnD,EAAkB7I,OAChC2I,GACArI,GACAG,IACCkI,IAAwBrI,GACxBsI,EAAwBmB,eAAiBtJ,EAAKsJ,gBAIlD,YAAejB,EAAcxI,EAAU,eAAKA,EAAQiI,cAAuByD,GAC3ErD,EAAsBrI,EACtBsI,EAA0BnI,GAIzBH,GAAYgK,GAActK,MAAM1E,OAAS,EAAK,EAC/CsM,EAAQjI,MAAMsM,WAAa,GAE3BrE,EAAQjI,MAAMsM,WAAa,YAK3B/M,GAAQoL,GAAcnL,MAE5BD,GAAMpF,iBAAiB,WAAaE,IAElC,IAAI4N,EAAQjI,MAAMsM,YAAuD,UAAVjS,EAAEZ,IAC/D,OAAO8S,OAQX,MAAMC,GAAsB,IAAI,IAAc,CAC5C5S,KAAM,mBACNsF,KAAM,cACNuN,YAAY,EACZC,SAAS,IAGXF,GAAoBhN,MAAMrF,iBAAiB,SAAU,KACnD,MAAMwS,EAAaH,GAAoBE,QACvC,UAAgB3E,YAAY,aAAc4E,GAE1C,IAAWC,cAAcD,GACzB,IAAuBC,cAAcD,GACrC,IAAWC,cAAcD,GACzB,IAAeC,cAAcD,KAG/B,UAAgBE,WAAWlU,KAAKmU,IAC1B,UAAgB3O,QAAQ4O,cAI1BP,GAAoBE,QAAUI,EAAMH,YAHpCH,GAAoBE,SAAU,EAC9BF,GAAoBvN,MAAMnF,UAAUwF,IAAI,wBAM5C2I,EAAU,YAAO,gCAAiC,CAACrO,KAAM,eACzDqO,EAAQjI,MAAMsM,WAAa,SAE3B,MAAMC,GAAYlS,IACbA,GACD,YAAYA,GAGd,MAAM2S,EAAS,YAAiB,CAA4B/E,EAASD,IAAQ,GAE7E,YAAeC,EAAS,eAAK,eAC7B,YAAaA,GAIb,IAAIgF,EAAetC,GAActK,MACjC,IAAW0C,UAAU,gBAAiB,CACpCkK,aAAcA,EACdjK,OAAQ,IAAIC,GACZC,SAAU,IAAIC,KACd+J,SAAU,CACR7J,EAAG,kBAGJ1K,KAAMmI,IAGP,8BAAyBnI,KAAKyJ,GAAKA,EAAEC,QAAQC,MAAM6K,OAAOC,OAAOtM,EAAM,CAACmM,aAAcA,QACrFjP,MAAML,IAGP,OAFAqP,IAEOrP,EAAI+B,MACT,IAAK,uBACHiL,GAAc0C,WACd,YAAe1C,GAAc1L,MAAO,eAAK,4BACzCM,GAAMzF,UAAUwF,IAAI,SACpB,YAAe2I,EAAS,eAAK,eAC7B,MACF,QACER,QAAQG,MAAM,uBAAwBjK,GACtCsK,EAAQkC,UAAYxM,EAAI+B,SAMhC,YAAiBuI,EAASsE,IAE1BvE,EAAQ,YAAO,4DAA6D,CAACpO,KAAM,mBAGnFoO,EAAM7N,iBAAiB,QAAS,KAC9B,UAAWmI,UAsBbV,EAAa1H,OAAOgP,EAAkB7J,UAAWsL,GAActL,UAAWmN,GAAoBvN,MAAOgJ,EAASD,GAE9G,MAAM/F,GAAKJ,SAASC,cAAc,MAClCG,GAAGnI,UAAUwF,IAAI,eACjB,gBAAM2C,GAAI,eAEV,MAAMqL,GAAWzL,SAASC,cAAc,OACxCwL,GAASxT,UAAUwF,IAAI,WAAY,eACnC,gBAAMgO,GAAU,mBAEhBpF,EAAKzG,OAAOC,cAAc,cAAcxH,OAAO+H,GAAIqL,GAAU1L,GAuDzD,sBACFpE,WAAW,KACT+B,GAAMsL,SACL,GAGL,YAAwBjJ,GA1DtB,IAAWmB,UAAU,qBAAqBpK,KAAM4U,I,MAC9C,MAAMC,EAAW,IAAaC,aAAa,YACxCD,KAA+B,QAAlB,EAAAA,EAASpF,iBAAS,eAAEjF,OAClC,UAAK5I,YAAYiT,EAASE,WAAW/U,KAAK,KACxC,YAAc4G,GAAO,WAIzB,MAAMoO,EAAM,IAAIC,IAAI,CAAC,EAAG,EAAG,EAAG,EAAG,IAC3BC,EAAiB,CAACN,EAAgBO,SAExC,IAAI3H,EA+BJ,OA9BGoH,EAAgBQ,aAAeR,EAAgBO,UAChD3H,EAAU,IAAW6H,aAAaT,EAAgBQ,YAAYpV,KAAK,KACjEkV,EAAKnU,KAAK6T,EAAgBQ,gBAI7B5H,GAAWpN,QAAQqE,WAAWzE,KAAK,KAClCkV,EAAKxU,QAAQiK,IACXqK,EAAIlR,OAAO6G,KAGb,MAAM2K,EAAO,IAAIN,GACXO,EAAI,IAA0B,OAAD,6BACjC,MAAM5K,EAAO2K,EAAKE,QAClB,IAAI7K,EAAM,OAEV,MAAM8K,EAAmB,KAAK9K,aAE9B,SADkB,IAAe9J,IAAI4U,GAEnC,OAAOF,IAGT1Q,WAAW,KACT,IAAWwQ,aAAa1K,GAAkC+K,QAAQH,IACjC,QAGrCA,MAGKX,IACN5U,KAAM4U,IACHrE,EAAkB7I,MAAM1E,QAAWgP,GAActK,MAAM1E,QACzD2O,EAAsBxB,EAAMtP,IAAI+T,EAAgB5M,SAAS,OAkBV,KAClDsH,IACD,YAAeA,EAAS,eAAK,eAC7B,iBAAOA,OAASxK,OAAWA,GAAW,GACtCwK,EAAQqG,gBAAgB,aAGvBtG,GACDA,EAAMsG,gBAAgB,YAGxB,UAAgBvG,YAAY,YAAa,CAAC1E,EAAG,sBAGhC,a,gCCpgBA,SAASkL,EAAeC,EAAmBC,GACxD,GAAoB,iBAAX,EAEP,YADAD,EAAKxE,UAAYyE,GAKnB,MAAMC,EAAaF,EAAKE,WACrBA,EACEF,EAAKpI,YAAcsI,EACpBA,EAAWC,YAAYF,IAEvBD,EAAKI,YAAc,GACnBJ,EAAKtU,OAAOuU,IAGdD,EAAKtU,OAAOuU,GAtBhB,mC,kICgBA,IAAII,EAAO,KACThN,SAAS1H,iBAAiB,QAAUE,IAClC,IAAI,OAAAyU,EAAA,GAAgBzU,EAAE8K,OAAQ,0BAC5B,OAIF,IAAIvL,EAAcmV,EADlB1U,EAAE+G,iBAIF,IAAI4N,GAAqB3U,EAAE4U,eAAiB5U,GAAG6U,cAAcC,QAAQ,cACjEC,GAAe,EAGfC,GAAgBhV,EAAE4U,eAAiB5U,GAAG6U,cAAcC,QAAQ,aAChE,GAAGE,EAAK1K,OAAQ,CACd0K,EAAOA,EAAK7Q,QAAQ,2BAA4B,IAChD6Q,EAAOA,EAAK7Q,QAAQ,mBAAoB,IAExC,MAAM9B,EAAQ2S,EAAK3S,MAAM,2BACtBA,IACD2S,EAAO3S,EAAM,GAAGiI,QAGlB,IAAIuF,EAAoBrI,SAASC,cAAc,QAC/CoI,EAAKF,UAAYqF,EAEjB,IAAIC,EAAWpF,EAAKwE,WACpB,KAAMY,GAAU,CACd,IAAIC,EAAcD,EAASC,YACF,IAAtBD,EAASE,WACNF,EAASG,UAAU9K,QACrB2K,EAASvV,UAIbuV,EAAWC,EAGb,MAAMG,EAAY,OAAAC,EAAA,GAAazF,GAAM,GACrC,GAAGwF,EAAUrP,MAAM7B,QAAQ,MAAO,IAAI7C,SAAWqT,EAAUxQ,QAAQ,MAAO,IAAI7C,OAAQ,CACpF/B,EAAO8V,EAAUrP,MACjB0O,EAAWW,EAAUX,SACrBK,GAAe,EAEf,IAAIQ,EAAY,IAAkBC,cAAcjW,GAChDgW,EAAYA,EAAUtH,OAAOjO,GAAa,uBAARA,EAAEgJ,GAAsC,2BAARhJ,EAAEgJ,GACpE,IAAkByM,cAAcf,EAAUa,IAI3CR,IACDxV,EAAOoV,EACPD,EAAW,IAAkBc,cAAcjW,GAC3CmV,EAAWA,EAASzG,OAAOjO,GAAa,uBAARA,EAAEgJ,GAAsC,2BAARhJ,EAAEgJ,IAGpEzJ,EAAO,IAAkBmW,cAAcnW,EAAM,CAACmV,aAE9C/U,OAAO6H,SAASmO,YAAY,cAAc,EAAOpW,KAGnDiV,EAAO,MAoBT,IAAYoB,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,MAAU,KAuRP,IAlQf,MAeE,YAAmBlR,EAA6B,IAA7B,KAAAA,UACjB/D,KAAKqE,UAAYwC,SAASC,cAAc,OACxC9G,KAAKqE,UAAUvF,UAAUwF,IAAI,eAE7BtE,KAAKkV,SAAWnR,EAAQmR,SACxBlV,KAAKmV,SAAWpR,EAAQoR,cAEC1S,IAAtBsB,EAAQqR,gBAAoD3S,IAAzBsB,EAAQsR,eAC5CtR,EAAQsR,aAAe9P,KAAK+P,IAAI,GAAI/P,KAAKgQ,MAAMxR,EAAQqR,UAAY,KAGrE,MAAM,YAACI,EAAW,UAAEJ,EAAS,aAAEC,EAAY,KAAEnR,EAAI,UAAE8P,EAAS,YAAEyB,GAAc,GAAQ1R,EAEpF,IAEIS,EAyEAkR,EA3EAzR,EAAQF,EAAQE,OAASF,EAAQ4R,UAGrC,GAAI3B,EA0CFhU,KAAKqE,UAAU2K,UAAY,8BACN9K,EAAO,SAASA,KAAU,yBAAyBD,EAAQ,cAAgB,wCAGhGO,EAAQxE,KAAKqE,UAAUuR,sBA9CV,CACV/B,GACDA,IAGF7T,KAAKqE,UAAU2K,UAAY,iCACH7F,SAASsM,+CAGjCjR,EAAQxE,KAAKqE,UAAUuR,kBACvB,MAAMC,EAAW,IAAIC,iBAAiB,KAGjCJ,GACDA,MAKJlR,EAAMrF,iBAAiB,QAAS,KAC3B,OAAA4W,EAAA,GAAavR,KACdA,EAAMwK,UAAY,IAGjBhP,KAAKgW,YACNhW,KAAKgW,UAAUhH,UAAYxK,EAAMwK,UACjChP,KAAKiW,iBAKTJ,EAASK,QAAQ1R,EAAO,CAAC2R,eAAe,EAAMC,WAAW,EAAMC,SAAS,IAErEtS,EAAQuS,UACT9R,EAAM1F,UAAUwF,IAAI,aAAc,gBAGlCtE,KAAKgW,UAAYnP,SAASC,cAAc,OACxC9G,KAAKgW,UAAUO,aAAa,kBAAmB,QAC/CvW,KAAKgW,UAAUQ,UAAYhS,EAAMgS,UAAY,2BAqBjD,GAVAhS,EAAM+R,aAAa,MAAO,QAEvBf,IACD,gBAAMhR,EAAOgR,OAAa/S,EAAW,eAElCzC,KAAKgW,WACN,gBAAMhW,KAAKgW,UAAWR,OAAa/S,EAAW,gBAI/CwB,GAASuR,EAAa,CACvB,MAAMiB,EAAS5P,SAASC,cAAc,OACtC2P,EAAO3X,UAAUwF,IAAI,sBACrBtE,KAAKqE,UAAUnF,OAAOuX,GAUxB,GAPGxS,IACDjE,KAAKiE,MAAQ4C,SAASC,cAAc,SACpC9G,KAAKyF,WACLzF,KAAKqE,UAAUnF,OAAOc,KAAKiE,QAI1BmR,EAAW,CACZ,MAAMsB,EAAU1W,KAAKqE,UAAUxF,iBAC/B,IAAI8X,GAAgB,EAEpBjB,EAAe,KACb,MAAMkB,EAAWpS,EAAM1F,UAAU+X,SAAS,SAEpCC,EAAc9C,EAAaxP,EAA2Ba,MAAM1E,OAAS,IAAI,OAAAgU,EAAA,GAAanQ,GAAO,GAAOa,OAAO1E,OAC3G0L,EAAO+I,EAAY0B,EACnBC,EAAU1K,EAAO,EACvB7H,EAAM1F,UAAUkT,OAAO,QAAS+E,GAI7BA,GAAW1K,GAAQgJ,GACpBrV,KAAKyF,WACLiR,EAAQxX,OAAO,KAAKkW,EAAY0B,MAC5BH,IAAeA,GAAgB,KAC1BC,IAAaG,GAAYJ,KAClC3W,KAAKyF,WACLkR,GAAgB,IAIpBnS,EAAMrF,iBAAiB,QAASuW,GAGlC1V,KAAKwE,MAAQA,EAGR,SACDxE,KAAKqF,QAINrF,KAAK+D,QAAQiQ,UACbhU,KAAKwE,MAA2BwL,SClQxB,SAA+B/D,GAC5C,MAAM+K,EAAQnQ,SAASoQ,cACvBD,EAAME,mBAAmBjL,GACzB,MAAMkL,EAAMnY,OAAOoY,eACnBD,EAAIE,kBACJF,EAAIG,SAASN,GD+PTO,CAAsBvX,KAAKwE,QAIxB,WACLxE,KAAKiE,MAAM2P,YAAc,GACtB5T,KAAK+D,QAAQ4R,UACd3V,KAAKiE,MAAM+K,UAAYhP,KAAK+D,QAAQ4R,UAEpC3V,KAAKiE,MAAM/E,OAAO,eAAKc,KAAK+D,QAAQE,MAAOjE,KAAK+D,QAAQyT,eAIrD,YAAYC,GAAY,GAC7B,MAAOC,aAAcC,GAAiC3X,KAAKgW,UAMrD4B,GAAiB5X,KAAKwE,MAAMQ,MAAMuF,OAAO/G,QAAQ,KAAM,IAC7D,GAAGoU,IAAkBD,EACnB,OAGF,MACME,EAAqBtS,KAAKgQ,MADG,GAEJhQ,KAAKuS,IAAIvS,KAAKC,IAAImS,EAAYC,KAI7D5X,KAAKwE,MAAMQ,MAAM6S,mBAAwBA,EAAH,KAEnCJ,IACDzX,KAAKwE,MAAMQ,MAAMuF,OAASoN,EAAYA,EAAY,KAAO,IAI3D,YAAc3X,KAAKwE,MADD,sBACmB,EAAMqT,EAAoB,KAC7D7X,KAAKwE,MAAM1F,UAAUC,OAFL,wBAMpB,YACE,OAAOiB,KAAK+D,QAAQiQ,UAAahU,KAAKwE,MAA2Ba,MAAQ,OAAAsP,EAAA,GAAa3U,KAAKwE,OAAO,GAAOa,MAI3G,UAAUA,GACRrF,KAAKmF,iBAAiBE,GAAO,GAE7B,YAAcrF,KAAKwE,MAAO,SAGrB,iBAAiBa,EAAe0S,GAAgB,GAClD/X,KAAK+D,QAAQiQ,UACbhU,KAAKwE,MAA2Ba,MAAQA,GAEzCrF,KAAKwE,MAAMwK,UAAY3J,EAEpBrF,KAAKgW,YACNhW,KAAKgW,UAAUhH,UAAY3J,EAExB0S,GACD/X,KAAKiW,gBAMN,YACL,OAAOjW,KAAKqF,QAAUrF,KAAKgY,cAGtB,UACL,OAAQhY,KAAKwE,MAAM1F,UAAU+X,SAAS,YAClC7W,KAAKmV,UAAYnV,KAAKmV,eACtBnV,KAAKkV,WAAa,OAAAa,EAAA,GAAa/V,KAAKwE,QAGnC,kBACL,OAAOxE,KAAKiY,WAAajY,KAAKkY,YAGzB,cAAc7S,EAAQ,GAAI8S,GAAS,GACpCnY,KAAK+D,QAAQiQ,YACf3O,EAAQ,IAAkB0P,cAAc1P,IAGvC8S,EACDnY,KAAKmF,iBAAiBE,GAAO,GAE7BrF,KAAKqF,MAAQA,EAIV,iBAAiBA,EAAqC,GAAI8S,GAAS,GACxEnY,KAAKgY,cAAgB3S,EACrBrF,KAAKoY,cAAc/S,EAAO8S,GAGrB,SAASrG,EAAmB7N,GAC9BA,IACDjE,KAAKiE,MAAM2P,YAAc,GACzB5T,KAAKiE,MAAM/E,OAAO,eAAK+E,EAAOjE,KAAK+D,QAAQyT,gBAG7CxX,KAAKwE,MAAM1F,UAAUkT,OAAO,WAAYF,EAAQmD,EAAWoD,QAC3DrY,KAAKwE,MAAM1F,UAAUkT,OAAO,WAAYF,EAAQmD,EAAWqD,QAGtD,SAASrU,GACdjE,KAAKuY,SAAStD,EAAWoD,MAAOpU,M,gCErXpC,8GAsDO,MAAMuU,EAsBX,YAAmBvM,EAAiBwM,EAAY,GAAWpU,EAAyBwC,SAASC,cAAc,QAAxF,KAAAmF,KAAwC,KAAA5H,YAlBpD,KAAAqU,gBAA0B,EAE1B,KAAAC,mBAA6B,EAC7B,KAAAC,oBAA8B,EAM9B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAqE7B,KAAAC,SAAW,KAOhB,GAAG/Y,KAAK6Y,2BAMN,OALG7Y,KAAK0Y,iBACN1Z,OAAOga,qBAAqBhZ,KAAK0Y,sBAGnC1Y,KAAK8Y,yBAA0B,IAK5B9Y,KAAKiZ,eAAkBjZ,KAAKkZ,kBAAsBlZ,KAAKmZ,SAAYnZ,KAAKoZ,sBAC1EpZ,KAAK0Y,iBAAiB1Z,OAAOga,qBAAqBhZ,KAAK0Y,iBAC1D1Y,KAAK0Y,gBAAkB1Z,OAAOC,sBAAsB,KAClDe,KAAK0Y,gBAAkB,EAEvB,MAAMW,EAAiBrZ,KAAKqE,UAAUrE,KAAKsZ,gBAC3CtZ,KAAK4Y,oBAAsB5Y,KAAK2Y,qBAAuBU,EAAiB,EAAKrZ,KAAK2Y,mBAAqBU,EAAiB,GAAK,EAC7HrZ,KAAK2Y,mBAAqBU,EAEvBrZ,KAAKoZ,oBAAmD,IAA7BpZ,KAAK4Y,qBACjC5Y,KAAKoZ,qBAGJpZ,KAAKuZ,kBACNvZ,KAAKuZ,uBA3FTvZ,KAAKqE,UAAUvF,UAAUwF,IAAI,cAE7BtE,KAAK8X,IAAM,YAAO,UAAYW,EAAY,IAAMA,EAAY,IAAK,IAASJ,OAEvEpM,IACDH,MAAMC,KAAKE,EAAGL,UAAUvN,QAAQsN,GAAK3L,KAAKqE,UAAUnF,OAAOyM,IAE3DM,EAAG/M,OAAOc,KAAKqE,YAKZ,eACFrE,KAAKwZ,+BAIRxa,OAAOG,iBAAiB,SAAUa,KAAK+Y,SAAU,CAACU,SAAS,IAC3DzZ,KAAKqE,UAAUlF,iBAAiB,SAAUa,KAAK+Y,SAAU,CAACU,SAAS,EAAMpJ,SAAS,IAElFrQ,KAAKwZ,6BAA+B,YAAuB,KACzDxZ,KAAK6Y,4BAA6B,EAE/B7Y,KAAK0Y,kBACN1Y,KAAK8Y,yBAA0B,EAC/B9Z,OAAOga,qBAAqBhZ,KAAK0Y,mBAElC,KACD1Y,KAAK6Y,4BAA6B,EAE/B7Y,KAAK8Y,0BACN9Y,KAAK+Y,WACL/Y,KAAK8Y,yBAA0B,MAK9B,kBACD9Y,KAAKwZ,+BAITxa,OAAOsR,oBAAoB,SAAUtQ,KAAK+Y,UAC1C/Y,KAAKqE,UAAUiM,oBAAoB,SAAUtQ,KAAK+Y,SAAU,CAAC1I,SAAS,IAEtErQ,KAAKwZ,gCAGA,OAAOvJ,GACZjQ,KAAKqE,UAAUnF,OAAO+Q,GAGjB,kBAAkBlM,GAEvB,OAAO,YAAiB,OAAD,wBAClBA,GAAO,CACVM,UAAWrE,KAAKqE,cA4CP,MAAMqV,UAAmBlB,EAKtC,YAAYvM,EAAiBwM,EAAY,GAAWkB,EAAiB,IAAKC,GACxE5V,MAAMiI,EAAIwM,GADwC,KAAAkB,iBAF7C,KAAAE,UAAiC,CAACC,KAAK,EAAMC,QAAQ,GAsBrD,KAAAR,iBAAmB,KACxB,IAAKvZ,KAAKiZ,gBAAkBjZ,KAAKkZ,iBAAmB,OAEpD,GAAGlZ,KAAK6Y,2BAEN,YADA7Y,KAAK+Y,WAIP,MAAMrB,EAAe1X,KAAKqE,UAAUqT,aACpC,IAAIA,EACF,OAGF,MACMsC,EAAetC,EADA1X,KAAKqE,UAAU4V,aAE9BC,EAAYla,KAAK2Y,mBAIpB3Y,KAAKiZ,eAAiBiB,GAAala,KAAK2Z,gBAAkB3Z,KAAK4Y,qBAAuB,GACvF5Y,KAAKiZ,gBAGJjZ,KAAKkZ,kBAAqBc,EAAeE,GAAcla,KAAK2Z,gBAAkB3Z,KAAK4Y,qBAAuB,GAC3G5Y,KAAKkZ,oBAlCPlZ,KAAKqE,UAAUvF,UAAUwF,IAAI,gBAC7BtE,KAAKma,eACLna,KAAKsZ,eAAiB,YAGjB,oBAAoBrN,GACzBjM,KAAKmZ,QAAUlN,EACfjM,KAAK8X,IAAI,uBAAwB7L,EAAIjM,MA+BhC,WAAWoa,IACfpa,KAAKmZ,SAAWnZ,KAAKqa,SAAWra,KAAKqE,WAAWiW,WAAWF,GAGvD,UAAUA,IACdpa,KAAKmZ,SAAWnZ,KAAKqa,SAAWra,KAAKqE,WAAWnF,UAAUkb,GAGtD,mBACL,OAAOpa,KAAK0X,aAAenS,KAAKgQ,MAAMvV,KAAKka,UAAYla,KAAKqE,UAAUkW,cAGxE,qBACE,OAAOva,KAAKwa,oBAAsB,EAGpC,cAAcC,GACZza,KAAKqE,UAAU6V,UAAYO,EAG7B,gBAEE,OAAOza,KAAKqE,UAAU6V,UAGxB,mBACE,OAAOla,KAAKqE,UAAUqT,cAInB,MAAMgD,UAAoBlC,EAC/B,YAAYvM,EAAiBwM,EAAY,GAAWkB,EAAiB,IAAYgB,EAAa,GAAWtW,EAAyBwC,SAASC,cAAc,QAKvJ,GAJA9C,MAAMiI,EAAIwM,EAAWpU,GAD6B,KAAAsV,iBAA6B,KAAAgB,aAAwB,KAAAtW,YAGvGrE,KAAKqE,UAAUvF,UAAUwF,IAAI,iBAEzB,qBAAoB,CACtB,MAAMsW,EAAsBvb,KACtBA,EAAEwb,QAAU7a,KAAKqE,UAAUyW,YAAc9a,KAAKqE,UAAU0W,cAC1D/a,KAAKqE,UAAU2W,YAAc3b,EAAE4b,OAAS,EACxC,YAAY5b,KAIhBW,KAAKqE,UAAUlF,iBAAiB,QAASyb,EAAoB,CAACnB,SAAS,IAGzEzZ,KAAKsZ,eAAiB,gB,gCCrR1B,uEAyBe,MAAM4B,EAKnB,YAAYnX,EAAgC,IAC1C,MAAME,EAAQjE,KAAKiE,MAAQ4C,SAASC,cAAc,SAClD7C,EAAMnF,UAAUwF,IAAI,kBAEjBP,EAAQoX,aACTlX,EAAMnF,UAAUwF,IAAI,8BAGnBP,EAAQwR,OACTtR,EAAMnF,UAAUwF,IAAI,wBAGnBP,EAAQzE,UACTU,KAAKob,kBAAiB,GAGxB,MAAM5W,EAAQxE,KAAKwE,MAAQqC,SAASC,cAAc,SAoClD,IAAIoI,EAWJ,GA9CA1K,EAAM1F,UAAUwF,IAAI,wBACpBE,EAAME,KAAO,WACVX,EAAQG,OACTM,EAAMyD,GAAK,SAAWlE,EAAQG,MAG7BH,EAAQ2N,UACTlN,EAAMkN,SAAU,GAGf3N,EAAQsX,UACT,UAAgBxJ,WAAWlU,KAAKmU,IAC9B,MAAMwJ,EAAa,YAAgBxJ,EAAO/N,EAAQsX,UAClD,IAAI3J,EAEFA,EADC3N,EAAQwX,YAC6C,IAA5CxX,EAAQwX,YAAYtK,QAAQqK,GAE5BA,EAGZtb,KAAKmF,iBAAiBuM,GAEtBlN,EAAMrF,iBAAiB,SAAU,KAC/B,IAAIkG,EAEFA,EADCtB,EAAQwX,YACDxX,EAAQwX,YAAY/W,EAAMkN,QAAU,EAAI,GAExClN,EAAMkN,QAGhB,UAAgB8J,SAASzX,EAAQsX,SAAUhW,OAM9CtB,EAAQnF,MACTsQ,EAAOlP,KAAKkP,KAAOrI,SAASC,cAAc,QAC1CoI,EAAKpQ,UAAUwF,IAAI,oBACnB,gBAAM4K,EAAMnL,EAAQnF,KAAMmF,EAAQ0X,WAElCxX,EAAMnF,UAAUwF,IAAI,4BAGtBL,EAAM/E,OAAOsF,GAEVT,EAAQiO,OAAQ,CACjB/N,EAAMnF,UAAUwF,IAAI,yBAEpB,MAAM0N,EAASnL,SAASC,cAAc,OACtCkL,EAAOlT,UAAUwF,IAAI,mBACrBL,EAAM/E,OAAO8S,OACR,CACL,MAAM0J,EAAM7U,SAASC,cAAc,OACnC4U,EAAI5c,UAAUwF,IAAI,gBAElB,MAAMqX,EAAW9U,SAAS+U,gBAAgB,6BAA8B,OACxED,EAAS7c,UAAUwF,IAAI,sBACvBqX,EAASE,eAAe,KAAM,UAAW,aACzC,MAAMC,EAAMjV,SAAS+U,gBAAgB,6BAA8B,OACnEE,EAAID,eAAe,KAAM,OAAQ,UACjCC,EAAID,eAAe,KAAM,IAAK,MAC9BF,EAASzc,OAAO4c,GAEhB,MAAMC,EAAKlV,SAASC,cAAc,OAClCiV,EAAGjd,UAAUwF,IAAI,2BAEjB,MAAMmS,EAAS5P,SAASC,cAAc,OACtC2P,EAAO3X,UAAUwF,IAAI,uBAErBoX,EAAIxc,OAAOuX,EAAQsF,EAAIJ,GAEvB1X,EAAM/E,OAAOwc,GAGZxM,GACDjL,EAAM/E,OAAOgQ,GAGZnL,EAAQ0N,YACTxN,EAAMnF,UAAUwF,IAAI,kBAAmB,gBACvC,iBAAOL,OAAOxB,OAAWA,GAAW,IAE5BsB,EAAQiY,WAChB/X,EAAMnF,UAAUwF,IAAI,gBAIxB,cACE,OAAOtE,KAAKwE,MAAMkN,QAGpB,YAAYA,GAKV1R,KAAKmF,iBAAiBuM,GAEtB,MAAMuK,EAAQ,IAAIC,MAAM,SAAU,CAACC,SAAS,EAAMC,YAAY,IAC9Dpc,KAAKwE,MAAM6X,cAAcJ,GAGpB,iBAAiBvK,GACtB1R,KAAKwE,MAAMkN,QAAUA,EAGhB,iBAAiB4K,GAEtB,OADAtc,KAAKiE,MAAMnF,UAAUkT,OAAO,oBAAqBsK,GAC1C,IAAMtc,KAAKob,kBAAkBkB,M,gCC5JxC,YAQA,MAAMC,EAAgB,CACpBtM,EACAuG,EACAgG,EACAC,EACAC,EACAC,KAEA,MAAM,QAACpa,EAAO,IAAEqa,GAAO3M,EAAQlK,QAgB/B,QAfetD,IAAZF,GACDK,cAAcL,QAGLE,IAARma,IACD5d,OAAOga,sBAAsB4D,GACzBD,UACK1M,EAAQlK,QAAQ6W,KAQxBD,GAAW,UAAUzK,SAAS2K,mBAAqBJ,EAMpD,YALAxM,EAAQlK,QAAQ6W,IAAM,GAAK5d,OAAOC,sBAAsB,YAC/CgR,EAAQlK,QAAQ6W,IACvBL,EAActM,EAASuG,EAAWgG,EAAUC,EAAUC,EAAiBC,EAAU,MAMlFH,GAAYhG,GACbvG,EAAQnR,UAAUwF,IAAIkS,GAGxB,MAAMsG,EAAe,YACZ7M,EAAQlK,QAAQxD,SACnBia,GAAYhG,GACdvG,EAAQnR,UAAUC,OAAO,YAAayX,GAGxCvG,EAAQnR,UAAUC,OAAO,aAEzB2d,GAAmBA,KAGrB,IAAI,UAAUxK,SAAS2K,oBAAsBJ,EAG3C,OAFAxM,EAAQnR,UAAUC,OAAO,YAAa,kBACtC+d,IAIF7M,EAAQnR,UAAUwF,IAAI,aAEtB2L,EAAQnR,UAAUkT,OAAO,aAAcwK,GACvCvM,EAAQlK,QAAQxD,QAAU,GAAKC,WAAWsa,EAAcL,IAG3C,O,gCC9DA,SAASrB,EAAiBhB,EAAyBkC,GAOhE,OANGA,EACDlC,EAAS/b,QAAQ4N,GAAMA,EAAGsK,aAAa,WAAY,SAEnD6D,EAAS/b,QAAQ4N,GAAMA,EAAGqH,gBAAgB,aAGrC,IAAM8H,EAAiBhB,GAAWkC,GAb3C,mC,gCCAA,8DAgBe,SAAS3H,EAAaoI,EAAoBC,GAAe,GACtE,MAAMC,EAAkB,GAClBC,EAAiB,GAEjBnJ,EAA4BiJ,EAAe,QAAKva,EACtD,YAAoBsa,EAAOE,EAAOC,OAAMza,OAAWA,EAAWsR,GAC3DmJ,EAAKvc,QACNsc,EAAMve,KAAKwe,EAAKnM,KAAK,KAGvB,IAAI1L,EAAQ4X,EAAMlM,KAAK,MAkBvB,OAjBA1L,EAAQA,EAAM7B,QAAQ,UAAW,MAE9BuQ,aAAQ,EAARA,EAAUpT,UASX,IAAkBwc,oBAAoBpJ,GACtC,IAAkBqJ,aAAarJ,IAK1B,CAAC1O,QAAO0O,YAGjB,IAAeY,aAAeA,G,gCCzCf,SAAS0I,EAAUpR,EAASqR,GACzC,OAAOrR,EAAGsR,QAAQD,GAPpB,mC,gCCMe,SAASxJ,EAAgB7H,EAASuR,GAC/C,OAAOvR,EAAGsR,QAAQ,IAAIC,MAPxB,mC,gCCAA,oEAoBO,MAAMC,EAAsD,CACjEC,KAAM,CACJhc,MAAO,+IACPic,WAAY,qBAEdC,UAAW,CACTlc,MAAO,+BACPic,WAAY,0BAEdE,OAAQ,CACNnc,MAAO,2BACPic,WAAY,uBAEdG,UAAW,CACTpc,MAAO,gDACPic,WAAY,oBAEdI,cAAe,CACbrc,MAAO,0CACPic,WAAY,uBAEdK,KAAM,CACJtc,MAAO,iBACPic,WAAY,wBAEdM,YAAa,CACXvc,MAAO,WACPic,WAAY,4BAEdO,QAAS,CACPxc,MAAO,qBACPic,WAAY,yBAoBVQ,EAAkB,IAAIvL,IAAI,CAC9B,MACA,IACA,KACA,KACA,UACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGa,SAASwL,EAAoB3K,EAAmBwJ,EAAiBC,EAAgBmB,EAAgBC,EAAoBvK,EAA4BwK,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlB9K,EAAKe,SAAgB,CACtB,IAAIC,EAAYhB,EAAKgB,UAerB,GANG4J,IAAY5K,EACbyJ,EAAKxe,KAAK+V,EAAU+J,OAAO,EAAGF,GAAa,IAAS7J,EAAU+J,OAAOF,IAErEpB,EAAKxe,KAAK+V,GAGTV,GAAYU,EAAU9T,QACpB8S,EAAKgL,WAAY,CAClB,MAAMzX,EAAgByM,EAAKzM,cAG3B,IAAI,MAAMtC,KAAQ+Y,EAAc,CAC9B,MAAMH,EAAMG,EAAa/Y,GACnB6Y,EAAUvW,EAAcuW,QAAQD,EAAI5b,MAAQ,uBACF,QAA7C6b,aAAO,EAAPA,EAASmB,aAAa,sBAUH,yBAAnBpB,EAAIK,WACL5J,EAASrV,KAAK,CACZ2J,EAAGiV,EAAIK,WACPrU,IAAMiU,EAA8BoB,KACpCJ,OAAQA,EAAOA,OACf5d,OAAQ8T,EAAU9T,SAEO,6BAAnB2c,EAAIK,WACZ5J,EAASrV,KAAK,CACZ2J,EAAGiV,EAAIK,WACPY,OAAQA,EAAOA,OACf5d,OAAQ8T,EAAU9T,OAClBie,QAAUrB,EAAwBxX,QAAQ8Y,OAAOC,aAGnD/K,EAASrV,KAAK,CACZ2J,EAAGiV,EAAIK,WACPY,OAAQA,EAAOA,OACf5d,OAAQ8T,EAAU9T,WAQ5B,YADA4d,EAAOA,QAAU9J,EAAU9T,QAI7B,GAAqB,IAAlB8S,EAAKe,SACN,OAGF,MAAMuK,EAAaV,IAAY5K,EACzBuL,EAAUb,EAAgBc,IAAIxL,EAAKyL,SACzC,GAAGF,GAAW9B,EAAKvc,OACjBsc,EAAMve,KAAKwe,EAAKnM,KAAK,KACrBmM,EAAKiC,OAAO,EAAGjC,EAAKvc,UAClB4d,EAAOA,YACJ,GAAG9K,aAAgB2L,iBAAkB,CAC1C,MAAMC,EAAM5L,EAAK4L,IACdA,IACDnC,EAAKxe,KAAK2gB,GACVd,EAAOA,QAAUc,EAAI1e,QAItBoe,IAAeT,GAChBpB,EAAKxe,KAAK,KAGZ,MAAM4gB,EAAc7L,EAAKhD,QArHH,iCAsHhB8O,EAAoBxL,aAAQ,EAARA,EAAUpT,OAEpC,IAAI2T,EAAWb,EAAKC,WACpB,KAAMY,GACJ8J,EAAoB9J,EAAU2I,EAAOC,EAAMmB,EAASC,EAAWvK,EAAUwK,GACzEjK,EAAWA,EAASC,YAOtB,GAJGwK,GAAcT,GACfpB,EAAKxe,KAAK,KAGT4gB,GAAe7L,EAAKc,cACrB2I,EAAKxe,KAAK,OACR6f,EAAOA,YAGgB9b,IAAtB8c,GACD,IAAI,IAAI1b,EAAI0b,EAAmB5e,EAASoT,EAASpT,OAAQkD,EAAIlD,IAAUkD,IACnEkQ,EAASlQ,GAAGlD,OAKpB,MAAM6e,EAAYtC,EAAKvc,OACpBqe,GAAWQ,IACZvC,EAAMve,KAAKwe,EAAKnM,KAAK,KACrBmM,EAAKiC,OAAO,EAAGK,KACbjB,EAAOA,QAGRiB,GAA8B,MAAjB/L,EAAKyL,SAAmBzL,EAAKc,cAC3C0I,EAAMve,KAAK,MACT6f,EAAOA,U,gCC9Mb,8CAQe,SAASxI,EAAa9F,GACnC,OAAGA,EAAQwP,aAAa,oBAA0C,UAApBxP,EAAQiP,SAI5C,YAAajP,GAAS,GAAO5K,MAAMsE,QAElCsG,EAA6B5K,MAAMsE,S,gCCfhD,4BAwDA,MAAM4C,EAAoB,IAvCnB,MAYL,cAQEvM,KAAKwM,iBAAmB,EAMxB,IAAehO,IAAI,sBAAsBb,KAAM+hB,IAC1CA,IACD1f,KAAKwM,iBAAmBkT,KAK5B,IAAWC,gBAAgB,wBAA0BC,IACnD5f,KAAKwM,iBAAmBoT,EAAKC,YAMnC,MAAmB,IAAetT,kBAAoBA,GACvC,O,gCC1Df,6CAae,SAASuT,EAAgB7T,EAAiB8T,GAAmB,GAC1E,IAAG,sBAAwBA,GAAoBlZ,SAASmZ,gBAAkB/T,EAK1E,GADAA,EAAG4D,aAC+B,IAAxB7Q,OAAOoY,mBAAgE,IAAzBvQ,SAASoQ,YAA6B,CAC5F,IAAID,EAAQnQ,SAASoQ,cACrBD,EAAME,mBAAmBjL,GACzB+K,EAAMiJ,UAAS,GACf,IAAI9I,EAAMnY,OAAOoY,eACjBD,EAAIE,kBACJF,EAAIG,SAASN,QAER,QAA4C,IAAlCnQ,SAASqZ,KAAKC,gBAAiC,CAE9D,IAAIC,EAAYvZ,SAASqZ,KAAKC,kBAC9BC,EAAUC,kBAAkBpU,GAC5BmU,EAAUH,UAAS,GACnBG,EAAUpQ,Y,gCChCd,8CAWA,MAAMsQ,EAAuC,IAAIvS,IACjD,IAAIwS,EAAkB,EACtB,MAAMC,EAAY,CAAC7a,EAAsBG,EAAuB2a,EAAiB,MAC/EA,EAAS3a,EAAKsJ,aAAeqR,EAI7BF,EAAkBhb,KAAKmb,IAAIH,EAAiBE,EAAO9f,QACnD2f,EAAS/iB,IAAIkjB,EAAQ,CAAC9a,UAASG,UAG1B,SAAS6a,EAAkBC,GAMhCA,EAAcA,GAAe,GAEzBN,EAASre,MACX,UAAKoL,cAAchP,QAAQsH,IACzBA,EAAQiJ,cAAcvQ,QAAQyH,IACzBA,EAAKwa,SACNxa,EAAKwa,SAASjiB,QAAQoiB,IACpBD,EAAU7a,EAASG,EAAM2a,KAG3BD,EAAU7a,EAASG,OAO3B,IAYI+a,EAZAvd,EAAMsd,EAAYpd,QAAQ,MAAO,IACjCgM,EAAYlM,EAAI0I,MAAM,EAAGuU,GAY7B,IAAI,IAAI1c,EAAI2L,EAAU7O,OAAS,EAAGkD,GAAK,IACrCgd,EAAgBP,EAAS9hB,IAAIgR,EAAUxD,MAAM,EAAGnI,EAAI,KACjDgd,KAFuChd,GAO5C,IAAIgd,EACF,MAAO,CACLnb,UAAWpC,EACXqC,aAASlD,EACTqD,UAAMrD,EACNoD,YAAa,IAKjB,MAAMF,EAAUkb,EAAclb,QAExBmb,EAAWD,EAAc/a,KAAKgb,UAAY,GAC1CC,EAAmBzd,EAAI0I,MAAM6U,EAAc/a,KAAKsJ,aAAazO,QACnE,IAAIqgB,EAAU,GAAIC,EAA4B,EAAGC,EAAqB,GACtE,IAAI,IAAIrd,EAAIid,EAASngB,OAAS,EAAGkD,GAAK,IAAKA,EAAG,CAC5Cmd,EAAUF,EAASjd,GAEnB,MAAMsd,EAAWH,EAAQxd,QAAQ,KAAM,IACvC,IAAI4d,EAAiB,EACrB,IAAI,IAAIC,EAAI,EAAG1gB,EAAS4E,KAAK+P,IAAIyL,EAAiBpgB,OAAQwgB,EAASxgB,QAAS0gB,EAAI1gB,IAAU0gB,EAAG,CAC3F,GAAGN,EAAiBM,KAAOF,EAASE,IAAsB,MAAhBF,EAASE,GAE5C,CACLD,EAAiB,EACjB,QAHEA,EAOHA,EAAiBH,IAClBA,EAA4BG,EAC5BF,EAAqBF,GAIzBA,EAAUE,GAAsBF,EAChCA,EAAUA,EAAQxd,QAAQ,MAAO,KAEjCwd,EAAUH,EAAc/a,KAAKsJ,aAAe,IAAM4R,EAElDA,EAAQnQ,MAAM,IAAIxS,QAAQ,CAACijB,EAAQC,KACnB,MAAXD,GAA+B,MAAbhe,EAAIie,IAAgBje,EAAI3C,OAAS4gB,IACpDje,EAAMA,EAAI0I,MAAM,EAAGuV,GAAO,IAAMje,EAAI0I,MAAMuV,MAQ9C,IAAI1b,EAAcmb,GAAWA,EAAQrgB,OAAS2C,EAAI3C,OAASqgB,EAAQhV,MAAM1I,EAAI3C,QAAU,GAQvF,OAPGkF,IAGDA,EAAcA,EAAYrC,QAAQ,KAAM,MAInC,CAACkC,UAAWpC,EAAKqC,UAASG,KAAM+a,EAAc/a,KAAMD,iB,gCC/G9C,SAASnG,EAAWD,EAAYqC,GAE7C,OAAO,IAAI/D,QAAcqE,IACvB,MAAM4H,EAAS,IAAIC,WACnBD,EAAO7K,iBAAiB,UAAYE,IAElC+C,EAAQ/C,EAAE8K,OAAOpB,UAEnBiB,EAAOlI,GAAQrC,KApBnB","file":"13.2690683310eb11d72c46.chunk.js","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 apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = 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;\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 btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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","/*\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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 placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\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 type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\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 appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\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\nlet 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 let 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 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 apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await 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 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 let encoded = bytesToBase64(loginToken.token);\r\n let 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((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;\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((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 let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\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 console.warn('pageSignQR: 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>;\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 appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\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 { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\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 findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\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 { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet 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 const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\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 let 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 replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\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 appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.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 let phone_number = telInputField.value;\r\n 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 let 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 let tryAgain = () => {\r\n 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 simulateEvent(telEl, 'input');\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;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(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 => {\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 apiManager.getNetworker(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 selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\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 appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\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 replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n private removeHeavyAnimationListener: () => void;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n\r\n this.removeHeavyAnimationListener();\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\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 appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \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\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\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 { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/14.0a9c2a5a1b393dfdfb0d.chunk.js b/public/14.0a9c2a5a1b393dfdfb0d.chunk.js new file mode 100644 index 00000000..032f6489 --- /dev/null +++ b/public/14.0a9c2a5a1b393dfdfb0d.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[14,7,26],{108:function(e,t,n){"use strict";function i(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function s(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{i(e,t,!1)})}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}n.d(t,"e",(function(){return i})),n.d(t,"b",(function(){return s})),n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return r}))},112:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var i=n(75),s=n(93),a=n(97);function o(e){return function(e){return Object(a.a)(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}var r=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};var l=new class{constructor(){this.blobSupported=!0;try{Object(s.a)([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?o(t).then(t=>e.write(t)):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>r(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(e)})),truncate:()=>{n.length=0},finalize:(i=!0)=>{const a=Object(s.a)(n,e);return i&&t&&t(a),a}}}},c=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class u{constructor(e){this.dbName=e,this.useStorage=!0,i.a.test&&(this.dbName+="_test"),u.STORAGES.length&&(this.useStorage=u.STORAGES[0].useStorage),this.openDatabase(),u.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=Object(s.a)(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,n)=>c(this,void 0,void 0,(function*(){let i=!1;const s=setTimeout(()=>{n(),i=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(n);if(i)return;t(s)}catch(e){n(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=l.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}u.STORAGES=[]},122:function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return s}));function i(e,t){const n=""["".length-1]||"";let i;switch(e._){case"inputPhotoFileLocation":i=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":i=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":i=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":i=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":i=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":i=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),i=""}return i+(n?"."+n:n)}function s(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},136:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var i=n(73);var s=function(e,t){let n,i,s,a={},o=0,r=0,l=0,c=0,u=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,s=new Image,s.src=e.src,s.draggable=!1,s.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),i=document.createElement("div"),i.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),n.appendChild(i);e.parentNode.appendChild(n),n.appendChild(s),n.appendChild(e),n.appendChild(a),i.appendChild(s),s.style.maxWidth=e.width+"px",u=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;d(200,200),p(o,r),m(o,r),i.addEventListener("mousedown",g,!1),i.addEventListener("touchstart",g,!1),i.addEventListener("wheel",v,!1),document.addEventListener("keypress",b,!1)}function d(e,t){l=e*u,c=t*u,i.style.width=e+"px",i.style.height=t+"px"}function p(e,t){r=t*u,o=e*u,s.style.top=-t+"px",s.style.left=-e+"px"}function m(e,t){i.style.top=t+"px",i.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,a,o,r=Math.floor(i.clientWidth+e),l=Math.floor(i.clientHeight+e),c=s.clientWidth,u=s.clientHeight;r<50||r>c||(t=i.offsetLeft-e/2,n=i.offsetTop-e/2,a=t+r,o=n+l,t<0&&(t=0),n<0&&(n=0),a>c||o>u||(d(r,r),p(t,n),m(t,n)))}function b(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function v(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=i.offsetWidth,a.container_height=i.offsetHeight,a.container_left=i.offsetLeft,a.container_top=i.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,n,o,r,l={x:0,y:0};e.preventDefault(),e.stopPropagation(),l.x=e.pageX||e.touches&&e.touches[0].pageX,l.y=e.pageY||e.touches&&e.touches[0].pageY,t=l.x-(a.mouse_x-a.container_left),n=l.y-(a.mouse_y-a.container_top),o=i.offsetWidth,r=i.offsetHeight,t<0?t=0:t>s.offsetWidth-o&&(t=s.offsetWidth-o),n<0?n=0:n>s.offsetHeight-r&&(n=s.offsetHeight-r),p(t,n),m(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=l,t.height=c,t.getContext("2d").drawImage(e,o,r,l,c,0,0,l,c)},removeHandlers:function(){i.removeEventListener("mousedown",g),i.removeEventListener("touchstart",g),i.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",b),n.remove(),i.remove(),s.remove()}}},a=n(54),o=n(16),r=n(29),l=n(144);class c extends a.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(o._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(l.a)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=s(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(r.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>i.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},143:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(15),s=n(0);function a(e){if("Enter"===e.key&&!s.IS_MOBILE&&!e.isComposing){if("enter"===i.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=s.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(s.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},144:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(97);function s(e){return Object(i.a)(e,"readAsDataURL")}},25:function(e,t,n){"use strict";n.r(t);var i=n(34),s=n(36),a=n(35),o=n(136),r=n(17),l=n(16),c=n(32),u=n(31),h=n(98),d=n(69),p=n(8),m=n(33);let f=null;const b=new d.a("page-signUp",!0,()=>n.e(5).then(n.bind(null,60)).then(e=>{const t=new h.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const r=document.createElement("canvas");r.id="canvas-avatar",r.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(r,d);const b=e.default;let v;t.imageDiv.addEventListener("click",()=>{(new o.a).open(r,e=>{v=e})});const g=e=>{const n=y.value||"",i=w.value||"",s=n||i?(n+" "+i).trim():"";s?Object(m.a)(t.title,u.b.wrapEmojiText(s)):Object(m.a)(t.title,Object(l.i18n)("YourName"))};const y=new s.b({label:"FirstName",maxLength:70}),w=new s.b({label:"LastName",maxLength:64}),E=Object(i.a)("btn-primary btn-color-primary"),L=new l.default.IntlElement({key:"StartMessaging"});return E.append(L.element),t.inputWrapper.append(y.container,w.container,E),y.input.addEventListener("input",g),w.input.addEventListener("input",g),E.addEventListener("click",(function(e){if(y.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!y.value.length)return y.input.classList.add("error"),!1;this.disabled=!0;const t=y.value.trim(),i=w.value.trim(),s={phone_number:f.phone_number,phone_code_hash:f.phone_code_hash,first_name:t,last_name:i};L.update({key:"PleaseWait"});const o=Object(a.f)(this);c.a.invokeApi("auth.signUp",s).then(e=>{switch(e._){case"auth.authorization":c.a.setUser(e.user),new Promise((e,t)=>{if(!v)return e();v().then(n=>{b.uploadProfilePhoto(n).then(e,t)},t)}).finally(()=>{n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()})});break;default:L.update({key:e._}),this.removeAttribute("disabled"),o.remove()}}).catch(e=>{this.removeAttribute("disabled"),o.remove(),e.type,L.update({key:e.type})})})),Object(p.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{f=e,r.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=b},33:function(e,t,n){"use strict";function i(e,t){if("string"==typeof t)return void(e.innerHTML=t);const n=e.firstChild;n?e.lastChild===n?n.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}n.d(t,"a",(function(){return i}))},36:function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var i=n(81),s=n(71),a=n(57),o=n(77);var r=n(16),l=n(31),c=n(48);let u=()=>{document.addEventListener("paste",e=>{if(!Object(s.a)(e.target,'contenteditable="true"'))return;let t,n;e.preventDefault();let i=(e.originalEvent||e).clipboardData.getData("text/plain"),o=!0,r=(e.originalEvent||e).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const e=r.match(/([\s\S]*)<\/body>/);e&&(r=e[1].trim());let s=document.createElement("span");s.innerHTML=r;let c=s.firstChild;for(;c;){let e=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=e}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===i.replace(/\s/g,"").length){t=u.value,n=u.entities,o=!1;let e=l.b.parseEntities(t);e=e.filter(e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._),l.b.mergeEntities(n,e)}}o&&(t=i,n=l.b.parseEntities(t),n=n.filter(e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._)),t=l.b.wrapDraftText(t,{entities:n}),window.document.execCommand("insertHTML",!1,t)}),u=null};var h;!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(h||(h={}));t.b=class{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:n,showLengthOn:i,name:s,plainText:l,canBeEdited:c=!0}=e;let h,d,p=e.label||e.labelText;if(l)this.container.innerHTML=`\n \n `,h=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,h=this.container.firstElementChild;const t=new MutationObserver(()=>{d&&d()});h.addEventListener("input",()=>{Object(o.a)(h)&&(h.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=h.innerHTML,this.onFakeInput())}),t.observe(h,{characterData:!0,childList:!0,subtree:!0}),e.animate&&(h.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=h.className+" input-field-input-fake")}if(h.setAttribute("dir","auto"),t&&(Object(r._i18n)(h,t,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,t,void 0,"placeholder")),p||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const e=this.container.lastElementChild;let t=!1;d=()=>{const s=h.classList.contains("error"),o=l?h.value.length:[...Object(a.a)(h,!1).value].length,r=n-o,c=r<0;h.classList.toggle("error",c),c||r<=i?(this.setLabel(),e.append(` (${n-o})`),t||(t=!0)):(s&&!c||t)&&(this.setLabel(),t=!1)},h.addEventListener("input",d)}this.input=h}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const n=window.getSelection();n.removeAllRanges(),n.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,n=+this.input.style.height.replace("px","");if(n===t)return;const i=Math.round(50*Math.log(Math.abs(t-n)));this.input.style.transitionDuration=i+"ms",e&&(this.input.style.height=t?t+"px":"");Object(c.a)(this.input,"is-changing-height",!0,i,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(e){this.setValueSilently(e,!1),Object(i.a)(this.input,"input")}setValueSilently(e,t=!0){this.options.plainText?this.input.value=e:(this.input.innerHTML=e,this.inputFake&&(this.inputFake.innerHTML=e,t&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t=!1){this.options.plainText||(e=l.b.wrapDraftText(e)),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t=!1){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t&&(this.label.textContent="",this.label.append(Object(r.i18n)(t,this.options.labelOptions))),this.input.classList.toggle("error",!!(e&h.Error)),this.input.classList.toggle("valid",!!(e&h.Valid))}setError(e){this.setState(h.Error,e)}}},48:function(e,t,n){"use strict";var i=n(15);const s=(e,t,n,a,o,r)=>{const{timeout:l,raf:c}=e.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete e.dataset.raf),r&&i.default.settings.animationsEnabled&&a)return void(e.dataset.raf=""+window.requestAnimationFrame(()=>{delete e.dataset.raf,s(e,t,n,a,o,r-1)}));n&&t&&e.classList.add(t);const u=()=>{delete e.dataset.timeout,!n&&t&&e.classList.remove("backwards",t),e.classList.remove("animating"),o&&o()};if(!i.default.settings.animationsEnabled||!a)return e.classList.remove("animating","backwards"),void u();e.classList.add("animating"),e.classList.toggle("backwards",!n),e.dataset.timeout=""+setTimeout(u,a)};t.a=s},54:function(e,t,n){"use strict";n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return E}));var i=n(15),s=n(18),a=n(62),o=n(70),r=n(16),l=n(6),c=n(8),u=n(63),h=n(29),d=n(143),p=n(5),m=n(50),f=n(108),b=n(59);const v=document.body;let g=v;const y=()=>{g=Object(f.c)()||v,w.reAppend()};Object(f.a)(v,y);class w extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{o.a.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new u.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(h.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&Object(h.b)(this.element,e=>{Object(l.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(r.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(s.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let i=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(s.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(r.i18n)(e.langKey,e.langArgs)),Object(h.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!i&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(i=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),w.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},o.a.pushItem(this.navigationItem),Object(c.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(i.default.isOverlayActive=!0,a.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(d.a)(e):"Enter"===e.key)&&(Object(h.d)(this.btnConfirmOnEnter),Object(p.a)(e))})},0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(i.default.isOverlayActive=!1),o.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(b.a)(w.POPUPS,this),y(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||a.a.checkAnimations(!1)},150)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,i=t.parentElement;i&&i!==g&&g!==n&&g.append(t)})}static getPopups(e){return this.POPUPS.filter(t=>t instanceof e)}}w.POPUPS=[];const E=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},57:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var i=n(30),s=n(31),a=n(72);function o(e,t=!0){const n=[],i=[],o=t?[]:void 0;Object(a.a)(e,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}i.a.getRichValue=o},63:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));class i{constructor(){this.listeners=new Set}add(e){return(t,n,i)=>{const s={element:e,event:t,callback:n,options:i};return this.addManual(s),s}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,i){let s;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===n&&a.options===i){s=a;break}s&&this.remove(s)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}},71:function(e,t,n){"use strict";function i(e,t){return e.closest(`[${t}]`)}n.d(t,"a",(function(){return i}))},72:function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return a}));const i={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(e,t,n,o,r,l,c={offset:0}){if(3===e.nodeType){let t=e.nodeValue;if(o===e?n.push(t.substr(0,r)+""+t.substr(r)):n.push(t),l&&t.length&&e.parentNode){const n=e.parentElement;for(const e in i){const s=i[e],a=n.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:t.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:t.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:t.length}))}}return void(c.offset+=t.length)}if(1!==e.nodeType)return;const u=o===e,h=s.has(e.tagName);if(h&&n.length)t.push(n.join("")),n.splice(0,n.length),++c.offset;else if(e instanceof HTMLImageElement){const t=e.alt;t&&(n.push(t),c.offset+=t.length)}u&&!r&&n.push("");const d=e.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=e.firstChild;for(;m;)a(m,t,n,o,r,l,c),m=m.nextSibling;if(u&&r&&n.push(""),d&&e.nextSibling&&(n.push(" "),++c.offset,void 0!==p))for(let e=p,t=l.length;e{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const i=this.downloads[t.fileName];i&&i.notifyAll(t)})}getNewDeferred(e){const t=Object(a.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",s.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(o.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),i=e=>{n.reject(e)};return(()=>{if(!s.a.worker||e.onlyCache){const a=this.cacheStorage.getFile(t).then(t=>{if(t.sizes.a.downloadFile(e).then(n.resolve,i))}s.a.downloadFile(e).then(n.resolve,i)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return s.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const i=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),i&&t(i)}createDownloadAnchor(e,t,n){const i=document.createElement("a");i.href=e,i.download=t,i.target="_blank",i.style.position="absolute",i.style.top="1px",i.style.left="1px",document.body.append(i);try{var s=document.createEvent("MouseEvents");s.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),i.dispatchEvent(s)}catch(t){console.error("Download click error",t);try{i.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{i.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,i;const s=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(i=s[t])&&void 0!==i?i:s[t]={downloaded:0,url:""}}};l.a&&(l.a.appDownloadManager=c),t.a=c},77:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(57);function s(e){return e.hasAttribute("contenteditable")||"INPUT"!==e.tagName?!Object(i.a)(e,!1).value.trim():!e.value.trim()}},97:function(e,t,n){"use strict";function i(e,t){return new Promise(n=>{const i=new FileReader;i.addEventListener("loadend",e=>{n(e.target.result)}),i[t](e)})}n.d(t,"a",(function(){return i}))},98:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(16);class s{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(i.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(i.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); +//# sourceMappingURL=14.0a9c2a5a1b393dfdfb0d.chunk.js.map \ No newline at end of file diff --git a/public/14.0a9c2a5a1b393dfdfb0d.chunk.js.map b/public/14.0a9c2a5a1b393dfdfb0d.chunk.js.map new file mode 100644 index 00000000..4e510312 --- /dev/null +++ b/public/14.0a9c2a5a1b393dfdfb0d.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/helpers/blob/readBlobAsDataURL.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/listenerSetter.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/helpers/blob/readBlobAs.ts","webpack:///./src/pages/loginPage.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","readBlobAsUint8Array","blob","readBlobAs","readBlobAsArrayBuffer","then","buffer","Uint8Array","blobSupported","blobConstruct","e","this","fileWriter","bytes","Blob","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","length","finalize","saveToStorage","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","get","Response","headers","size","save","Promise","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","getFileNameByLocation","location","options","ext","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","h6","btnClose","header","append","cropContainer","input","display","file","target","files","readBlobAsDataURL","contents","show","value","btnConfirm","className","hide","toBlob","darkenCanvas","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","isSendShortcutPressed","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","authCode","page","imported","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","title","avatarPreview","addIco","appProfileManager","default","uploadAvatar","_uploadAvatar","handleInput","name","nameInputField","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","inputWrapper","contains","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","setUser","user","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","requestAnimationFrame","_authCode","pushToState","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","findUpAttribute","text","entities","plainText","originalEvent","clipboardData","getData","usePlainText","html","replace","span","curChild","nextSibling","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","border","setLabel","labelEl","lastElementChild","showingLength","wasError","inputLength","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","currentHeight","transitionDuration","log","abs","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","state","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","dataset","cancelAnimationFrame","animationsEnabled","afterTimeout","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","onEscape","backByItem","navigationItem","confirmShortcutIsSendShortcut","prepend","once","withoutOverlay","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","b","button","isDanger","langKey","langArgs","destroy","find","isCancel","POPUPS","onPop","pushItem","isOverlayActive","checkAnimations","dispatchEvent","removeAll","removeItem","cleanup","popup","parentElement","popupConstructor","addCancelButton","field","withEntities","lines","line","combineSameEntities","sortEntities","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","_listener","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","getRichElementValue","selNode","selOffset","offset","substr","tag","getAttribute","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","callbacks","download","notifyAll","deferred","cancel","cancelDownload","clearDownload","getNewDeferred","fetch","hasOwnProperty","onError","worker","onlyCache","promise","getFile","downloadFile","tryDownload","indexOf","uploadFile","onRemove","a","position","clickEvent","createEvent","initMouseEvent","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","downloaded","hasAttribute","reader","FileReader","result","LoginPage","querySelector","subtitle"],"mappings":"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","file":"14.0a9c2a5a1b393dfdfb0d.chunk.js","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 type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\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\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\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 appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\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 rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\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 { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\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 replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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 rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\r\nimport { addFullScreenListener, getFullScreenElement } from \"../../helpers/dom/fullScreen\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: () => this.destroy(),\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n protected destroy() {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\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 findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/141.f006cd3b8bcd5e635657.chunk.js b/public/141.f006cd3b8bcd5e635657.chunk.js deleted file mode 100644 index 98a4cb33..00000000 --- a/public/141.f006cd3b8bcd5e635657.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[141,512],{3127:(e,t,s)=>{s.d(t,{Z:()=>r});const r={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},410:(e,t,s)=>{s.d(t,{GO:()=>i,ZP:()=>o});const r=s(1267).Z.debug,i="undefined"!=typeof window?window:self,o=r},1267:(e,t,s)=>{s.d(t,{Z:()=>i});const r={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};r.http=location.search.indexOf("http=1")>0,r.http&&(r.transport="https");const i=r},8975:(e,t,s)=>{s.d(t,{Z:()=>i});var r=s(7119);function i(e,t=""){let s;const i=(0,r.Z)(t);try{s=new Blob(e,{type:i})}catch(t){let r=new BlobBuilder;e.forEach((e=>{r.append(e)})),s=r.getBlob(i)}return s}},7119:(e,t,s)=>{function r(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}s.d(t,{Z:()=>r})},3725:(e,t,s)=>{s.d(t,{b:()=>i});var r=s(319);function i(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((s,r)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,r(...e))}}));return t.catch(r.Z).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})})),Object.assign(t,e),t}},1352:(e,t,s)=>{s.d(t,{Di:()=>a,N5:()=>i,SU:()=>r,kC:()=>o});const r="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,i="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!r,o=i||r,n=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((s=>{s.length&&s.slice(e?0:-1).forEach((e=>{e.postMessage(...t)}))}))},a=r?n.bind(null,!1):i?(...e)=>{self.postMessage(...e)}:()=>{};r&&n.bind(null,!0)},3241:(e,t,s)=>{s.d(t,{Z:()=>r});class r{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var r;(null!==(r=this.listeners[e])&&void 0!==r?r:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null==s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice((e=>e.callback===t))}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const r=t&&[],i=this.listeners[e];return i&&i.slice().forEach((t=>{var o;if(-1===i.findIndex((e=>e.callback===t.callback)))return;let n;try{n=t.callback(...s)}catch(e){console.error(e)}r&&r.push(n),(null===(o=t.options)||void 0===o?void 0:o.once)&&this.removeEventListener(e,t.callback)})),r}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},319:(e,t,s)=>{function r(){}s.d(t,{Z:()=>r})},8479:(e,t,s)=>{function r(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e))return e.map((e=>r(e)));let t=new e.constructor;for(var s in e)e.hasOwnProperty(s)&&(t[s]=r(e[s]));return t}s.d(t,{Z:()=>r})},5880:(e,t,s)=>{function r(e){return"object"==typeof e&&null!==e}s.d(t,{Z:()=>r})},5953:(e,t,s)=>{function r(e,t){if(t)for(let s in t)void 0!==t[s]&&(e[s]=t[s]);return e}s.d(t,{Z:()=>r})},144:(e,t,s)=>{s.d(t,{a:()=>o,d:()=>i});const r={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function i(e){const t=r[e];return crypto.getRandomValues(t),t[0]}function o(){return""+i(32)+i(32)%16777215}},6724:(e,t,s)=>{function r(e,t,s=!0){let r,i,o=null;return(...n)=>{r=!0,i=n,o||(s&&(r=!1,e(...i)),o=setInterval((()=>{if(!r)return clearInterval(o),void(o=null);r=!1,e(...i)}),t))}}s.d(t,{Z:()=>r})},5003:(e,t,s)=>{s.d(t,{kg:()=>y,v9:()=>r});var r,i=s(410),o=s(4762),n=s(1352);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(r||(r={}));const a=[r.None,r.Error,r.Warn,r.Log,r.Debug],c=Date.now();function l(){return"["+((Date.now()-c)/1e3).toFixed(3)+"]"}let h;const d=o.IS_SAFARI||o.IS_FIREFOX;h=d?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const u=!d,g=d?2:3;function f(){const e=(new Error).stack.split("\n"),t=e[g]||e[e.length-1];return"["+(h(t)||"")+"]"}const m="",p="",v=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log]];function y(e,t=r.Log|r.Warn|r.Error,s=!1,o=""){let c;i.ZP||s||(t=r.Error),u?o||(n.SU?o=m:n.N5&&(o=p)):o="";let h=o;o=o?`%s ${o}%s`:"%s";const d=function(...s){return t&r.Log&&console.log(o,l(),e,f(),...s)};return v.forEach((([s,r])=>{d[s]=function(...i){return t&r&&console[s](o,l(),e,f(),...i)}})),d.setPrefix=function(t){c=t,e="["+t+"]"},d.setPrefix(e),d.setLevel=function(e){t=a.slice(0,e+1).reduce(((e,t)=>e|t),0)},d.bindPrefix=function(e){return y(`${c}] [${e}`,t,s,h)},d}},1507:(e,t,s)=>{s.d(t,{NM:()=>r,gZ:()=>a,hj:()=>i,rU:()=>n,yF:()=>o});const r=0,i=1271266957,o=777e3,n=2147483647,a=""},3512:(e,t,s)=>{s.r(t),s.d(t,{RootScope:()=>n,default:()=>c});var r=s(1507),i=s(3241),o=s(410);class n extends i.Z{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",(e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)})),this.addEventListener("user_auth",(({id:e})=>{this.myId="number"==typeof r.NM?+e:""+e})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.addEventListener("idle",(e=>{e?this.idle.focusPromise=new Promise((e=>{this.idle.focusResolve=e})):this.idle.focusResolve()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find((t=>t.name===e))}}const a=new n;o.GO.rootScope=a;const c=a},7487:(e,t,s)=>{s.d(t,{Z:()=>l});var r=s(410),i=s(1267),o=s(1352);class n{constructor(){this.prefix="",this.cache={},this.useStorage=!0,i.Z.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const s in e)if(e.hasOwnProperty(s)){const r=e[s];if(this.cache[s]=r,this.useStorage&&!t)try{const e=JSON.stringify(r);localStorage.setItem(this.prefix+s,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class a{constructor(){this.taskId=0,this.tasks={},a.STORAGES.push(this),o.kC||(this.storage=new n)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise(((s,r)=>{if(o.kC){const r=this.taskId++;this.tasks[r]=s;const i={type:"localStorageProxy",id:r,payload:{type:e,args:t}};(0,o.Di)(i)}else t=Array.prototype.slice.call(t),s(this.storage[e].apply(this.storage,t))}))}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}a.STORAGES=[];const c=new a;r.GO.appStorage=c;const l=c},7922:(e,t,s)=>{s.d(t,{Z:()=>a});var r=s(410),i=s(6947),o=s(3127);const n=new i.Z(o.Z,"session");r.GO.stateStorage=n;const a=n},6947:(e,t,s)=>{s.d(t,{Z:()=>u});var r=s(3725),i=s(6724),o=s(1267),n=s(8975),a=s(5953),c=s(5003);class l{constructor(e,t){this.storageIsAvailable=!0,(0,a.Z)(this,e),o.Z.test&&(this.name+="_test"),this.storeName=t,this.log=(0,c.kg)("IDB-"+this.storeName),this.openDatabase(!0),l.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach((t=>{if(e&&e===t)return;const s=t.db;s&&(s.onclose=()=>{},s.close())}))}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||t.onerror({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,r)=>{t.onsuccess=i=>{s=!0;const o=t.result;let n=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},o.onclose=e=>{this.log.error("closed:",e),!n&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(n=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},t.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},t.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach((e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var s;const r=e.createObjectStore(t.name);if(null===(s=t.indexes)||void 0===s?void 0:s.length)for(const e of t.indexes)r.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)}))}}))}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"")}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(s=>e.map(((e,r)=>s.put(t[r],e)))),"")}saveFile(e,t){return t instanceof Blob||(t=(0,n.Z)([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"")}getObjectStore(e,t,s,r=this.storeName){let i;return s&&(i=performance.now(),this.log(s+": start")),this.openDatabase().then((o=>new Promise(((n,a)=>{const c=o.transaction([r],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),s&&this.log(s+": end",performance.now()-i);const t=u.map((e=>e.result));n(d?t:t[0])};const l=setTimeout((()=>{this.log.error("transaction not finished",c)}),1e4),h=t(c.objectStore(r)),d=Array.isArray(h),u=d?h:[].concat(h)}))))}getAll(){return this.getObjectStore("readonly",(e=>e.getAll()),"")}}l.STORAGES=[];var h=function(e,t,s,r){return new(s||(s=Promise))((function(i,o){function n(e){try{c(r.next(e))}catch(e){o(e)}}function a(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(n,a)}c((r=r.apply(e,t||[])).next())}))};function d(){}class u{constructor(e,t){this.db=e,this.storeName=t,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,r.b)(),this.keysToDelete=new Set,this.deleteDeferred=(0,r.b)(),this.storage=new l(e,t),u.STORAGES.length?this.useStorage=u.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,u.STORAGES.push(this),this.saveThrottled=(0,i.Z)((()=>h(this,void 0,void 0,(function*(){const e=this.saveDeferred;this.saveDeferred=(0,r.b)();const t=this.keysToSet;if(t.size){const e=Array.from(t.values());t.clear();try{const t=e.map((e=>this.cache[e]));yield this.storage.save(e,t)}catch(t){console.error("[AS]: set error:",t,e)}}e.resolve(),t.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,i.Z)((()=>h(this,void 0,void 0,(function*(){const e=this.deleteDeferred;this.deleteDeferred=(0,r.b)();const t=this.keysToDelete;if(t.size){const e=Array.from(t.values());t.clear();try{yield this.storage.delete(e)}catch(t){console.error("[AS]: delete error:",t,e)}}e.resolve(),t.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,i.Z)((()=>h(this,void 0,void 0,(function*(){const e=Array.from(this.getPromises.keys());this.storage.get(e).then((t=>{for(let s=0,r=e.length;s{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(s)||(this.useStorage=!1,console.error("[AS]: get error:",s,e,t));for(let t=0,s=e.length;t{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(e){return this.cache[e]}setToCache(e,t){return this.cache[e]=t}get(e,t=!0){return h(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(e)&&t)return this.getFromCache(e);if(this.useStorage){const t=this.getPromises.get(e);if(t)return t;const s=(0,r.b)();return this.getPromises.set(e,s),this.getThrottled(),s}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(e,t=!1){const s=this.useStorage&&!t&&!this.savingFreezed;for(const t in e)if(e.hasOwnProperty(t)){const r=e[t];this.setToCache(t,r),s&&(this.keysToSet.add(t),this.keysToDelete.delete(t),this.saveThrottled())}return s?this.saveDeferred:Promise.resolve()}delete(e,t=!1){return e=""+e,t||delete this.cache[e],this.useStorage&&(this.keysToSet.delete(e),this.keysToDelete.add(e),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(e=!1){if(!e)for(const e in this.cache)delete this.cache[e];return this.storage.clear().catch(d)}static toggleStorage(e){return Promise.all(this.STORAGES.map((t=>(t.useStorage=e,e?t.set(t.cache):(t.keysToSet.clear(),t.keysToDelete.clear(),t.getPromises.forEach((e=>e.resolve(void 0))),t.getPromises.clear(),t.clear(!0)))))).catch(d)}static freezeSaving(e,t){this.STORAGES.forEach((e=>e.savingFreezed=!0));try{e()}catch(e){}this.STORAGES.forEach((e=>e.savingFreezed=!1))}}u.STORAGES=[]}}]); -//# sourceMappingURL=141.f006cd3b8bcd5e635657.chunk.js.map \ No newline at end of file diff --git a/public/141.f006cd3b8bcd5e635657.chunk.js.map b/public/141.f006cd3b8bcd5e635657.chunk.js.map deleted file mode 100644 index c9a5ca5f..00000000 --- a/public/141.f006cd3b8bcd5e635657.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"141.f006cd3b8bcd5e635657.chunk.js","mappings":"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","sources":["webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/idb.ts","webpack://tweb/./src/lib/storage.ts"],"sourcesContent":["/*\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 { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\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 noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function noop() {}\r\n","export default function copy(obj: T): T {\n //in case of premitives\n if(obj === null || typeof(obj) !== \"object\") {\n return obj;\n }\n \n //date objects should be \n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n \n //handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\n return clonedArr;\n }\n \n //lastly, handle objects\n // @ts-ignore\n let clonedObj = new obj.constructor();\n for(var prop in obj){\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\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\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\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 DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\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\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\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\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 { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_reactions': {message: Message.message, changedResults: ReactionCount[]},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\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 * 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 Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\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 for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\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 { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\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 { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\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 blobConstruct from '../helpers/blob/blobConstruct';\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 default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.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\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 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 createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\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({type: '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 // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\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 }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): 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(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\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[]) {\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(', ') : '');\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]) as 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[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): 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 return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\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.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 transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\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 requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\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 * 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\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nexport default class AppStorage, T extends Database/* Storage extends {[name: string]: any} *//* Storage extends Record */> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then(values => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach(storage => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {}\r\n this.STORAGES.forEach(storage => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n"],"names":["name","version","stores","DEBUG","MOUNT_CLASS_TO","window","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","blobConstruct","blobParts","mimeType","blob","safeMimeType","Blob","type","e","bb","BlobBuilder","forEach","blobPart","append","getBlob","blobSafeMimeType","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","length","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","listener","postMessage","notifySomeone","bind","EventListenerBase","constructor","reuseResults","this","_constructor","listenerResults","addEventListener","options","hasOwnProperty","once","pop","addMultipleEventsListeners","obj","i","removeEventListener","findAndSplice","l","_dispatchEvent","collectResults","arr","findIndex","result","err","console","error","dispatchResultableEvent","dispatchEvent","cleanup","noop","copy","Date","getTime","Array","isArray","map","el","clonedObj","prop","isObject","object","safeAssign","fromObject","undefined","arrays","Uint8Array","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","throttle","fn","ms","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","IS_SAFARI","IS_FIREFOX","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","peerId","document","body","classList","toggle","id","myId","status","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","color","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","setTheme","addListener","colorScheme","documentElement","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","LocalStorage","cache","useStorage","get","key","useCache","localStorage","getItem","JSON","parse","set","onlyLocal","stringified","stringify","setItem","delete","saveLocal","removeItem","clear","keys","toggleStorage","enabled","LocalStorageController","taskId","tasks","STORAGES","storage","finishTask","proxy","task","payload","prototype","call","apply","sessionStorage","stateStorage","IDBStorage","db","storeName","storageIsAvailable","openDatabase","static","preserve","onclose","close","isAvailable","createNew","openDbPromise","request","indexedDB","open","message","finished","setTimeout","onerror","onsuccess","event","calledNew","onabort","transaction","target","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","concat","getObjectStore","objectStore","save","idx","put","saveFile","fileName","mode","perf","performance","clearTimeout","timeout","oncomplete","results","r","requests","getAll","AppStorage","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","size","from","values","deleteThrottled","getThrottled","includes","getCache","getFromCache","setToCache","p","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/15.4ca01b561eb65470bbb6.chunk.js b/public/15.4ca01b561eb65470bbb6.chunk.js new file mode 100644 index 00000000..8078dc0a --- /dev/null +++ b/public/15.4ca01b561eb65470bbb6.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[15,16,19],{107:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var n=i(5),s=i(36);class a extends s.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},117:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(51);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},23:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(38),a=i(17),o=i(88),r=i(69),l=i(34),c=i(107),u=i(117),d=i(31),h=i(16),p=i(98),m=i(5),g=i(29),b=i(99),f=i(33),v=i(55);let w;const y=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let y;w=r.input,t.inputWrapper.append(r.container,e);let E,L=()=>(y||(y=window.setInterval(L,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(f.a)(r.label,Object(b.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const k=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(v.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.setValueSilently(""+Math.random()),r.setValueSilently(l),o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(y),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),T&&T.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),L()})};Object(g.b)(e,k),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return k()}));const S=s.b.isMobile?100:166,T=new u.a(r,S);return t.imageDiv.append(T.container),Promise.all([T.load(),L()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=y},33:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},36:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(81),s=i(71),a=i(57),o=i(77);var r=i(16),l=i(31),c=i(48);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),o=!0,r=(t.originalEvent||t).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const t=r.match(/([\s\S]*)<\/body>/);t&&(r=t[1].trim());let s=document.createElement("span");s.innerHTML=r;let c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r._i18n)(d,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},48:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},55:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},57:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(30),s=i(31),a=i(72);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}n.a.getRichValue=o},71:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},72:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return a}));const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,o,r,l,c={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),l&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:e.length}))}}return void(c.offset+=e.length)}if(1!==t.nodeType)return;const u=o===t,d=s.has(t.tagName);if(d&&i.length)e.push(i.join("")),i.splice(0,i.length),++c.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),c.offset+=e.length)}u&&!r&&i.push("");const h=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,i,o,r,l,c),m=m.nextSibling;if(u&&r&&i.push(""),h&&t.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let t=p,e=l.length;tt)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},98:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},99:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=15.4ca01b561eb65470bbb6.chunk.js.map \ No newline at end of file diff --git a/public/15.4ca01b561eb65470bbb6.chunk.js.map b/public/15.4ca01b561eb65470bbb6.chunk.js.map new file mode 100644 index 00000000..f5ded1ad --- /dev/null +++ b/public/15.4ca01b561eb65470bbb6.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","element","label","getStateInterval","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","target","text","entities","preventDefault","originalEvent","clipboardData","getData","usePlainText","html","trim","replace","match","span","curChild","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","undefined","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","transitionDuration","log","abs","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","timeout","raf","dataset","clearTimeout","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","setTimeout","toggleDisability","elements","disable","forEach","field","withEntities","lines","line","push","join","combineSameEntities","sortEntities","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","selNode","selOffset","offset","substr","parentNode","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","hasAttribute","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","LoginPage","body","querySelector","title","subtitle","htmlToSpan"],"mappings":"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","file":"15.4ca01b561eb65470bbb6.chunk.js","sourcesContent":["/*\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// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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 { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\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 replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/16.dd165468586f22f31041.chunk.js b/public/16.dd165468586f22f31041.chunk.js new file mode 100644 index 00000000..421102fe --- /dev/null +++ b/public/16.dd165468586f22f31041.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[16,15,19],{107:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var n=i(5),s=i(36);class a extends s.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},117:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(51);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},23:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(38),a=i(17),o=i(88),r=i(69),l=i(34),c=i(107),u=i(117),d=i(31),h=i(16),p=i(98),m=i(5),g=i(29),b=i(99),f=i(33),v=i(55);let w;const y=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let y;w=r.input,t.inputWrapper.append(r.container,e);let E,L=()=>(y||(y=window.setInterval(L,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(f.a)(r.label,Object(b.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const k=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(v.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.setValueSilently(""+Math.random()),r.setValueSilently(l),o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(y),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),T&&T.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),L()})};Object(g.b)(e,k),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return k()}));const S=s.b.isMobile?100:166,T=new u.a(r,S);return t.imageDiv.append(T.container),Promise.all([T.load(),L()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=y},33:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},36:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(81),s=i(71),a=i(57),o=i(77);var r=i(16),l=i(31),c=i(48);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),o=!0,r=(t.originalEvent||t).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const t=r.match(/([\s\S]*)<\/body>/);t&&(r=t[1].trim());let s=document.createElement("span");s.innerHTML=r;let c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r._i18n)(d,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},48:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},55:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},57:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(30),s=i(31),a=i(72);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}n.a.getRichValue=o},71:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},72:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return a}));const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,o,r,l,c={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),l&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:e.length}))}}return void(c.offset+=e.length)}if(1!==t.nodeType)return;const u=o===t,d=s.has(t.tagName);if(d&&i.length)e.push(i.join("")),i.splice(0,i.length),++c.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),c.offset+=e.length)}u&&!r&&i.push("");const h=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,i,o,r,l,c),m=m.nextSibling;if(u&&r&&i.push(""),h&&t.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let t=p,e=l.length;tt)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},98:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},99:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=16.dd165468586f22f31041.chunk.js.map \ No newline at end of file diff --git a/public/16.dd165468586f22f31041.chunk.js.map b/public/16.dd165468586f22f31041.chunk.js.map new file mode 100644 index 00000000..d991c7dd --- /dev/null +++ b/public/16.dd165468586f22f31041.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","element","label","getStateInterval","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","target","text","entities","preventDefault","originalEvent","clipboardData","getData","usePlainText","html","trim","replace","match","span","curChild","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","undefined","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","transitionDuration","log","abs","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","timeout","raf","dataset","clearTimeout","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","setTimeout","toggleDisability","elements","disable","forEach","field","withEntities","lines","line","push","join","combineSameEntities","sortEntities","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","selNode","selOffset","offset","substr","parentNode","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","hasAttribute","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","LoginPage","body","querySelector","title","subtitle","htmlToSpan"],"mappings":"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","file":"16.dd165468586f22f31041.chunk.js","sourcesContent":["/*\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// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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 { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\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 replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/17.1e43fc20a20ae160385c.chunk.js b/public/17.1e43fc20a20ae160385c.chunk.js new file mode 100644 index 00000000..eb1c9064 --- /dev/null +++ b/public/17.1e43fc20a20ae160385c.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[17,21],{120:function(e,t,s){"use strict";var n=s(45),i=s(52),r=s(30),o=s(90);const c=new class{constructor(){this.promises={},this.raf=n.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(i.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e),n=s?this.mutate():Promise.resolve();return void 0!==t&&(s?t():n.then(()=>t())),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};r.a&&(r.a.sequentialDom=c),t.a=c},15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return o}));var n=s(43),i=s(50),r=s(30);class o extends i.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof n.c?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;r.a.rootScope=c,t.default=c},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return a}));var n=s(6),i=s(120),r=s(1),o=s(15),c=s(96);let l=0;function a(e,t=(()=>Promise.resolve()),s=null,a=!1,u=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&d.classList.add("is-square"),e[a?"prepend":"append"](d);const m=(e,n)=>{const o=Date.now(),c=document.createElement("div"),a=l++,u=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{i.a.mutate(()=>{c.remove()}),s&&s(a)};if(ec.classList.add("hiding"),Math.max(s-u/2,0)),setTimeout(t,s)}else c.classList.add("hiding"),setTimeout(t,u/2);r.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,p=!1},t&&t(a),window.requestAnimationFrame(()=>{const t=d.getBoundingClientRect();c.classList.add("c-ripple__circle");const s=e-t.left,i=n-t.top,r=Math.sqrt(Math.pow(Math.abs(i-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-r/2,l=i-r/2;c.style.width=c.style.height=r+"px",c.style.left=o+"px",c.style.top=l+"px",d.append(c)})},f=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(n.a)(t.target,"c-ripple")!==d)&&(u===e||!Object(c.a)(t.target,u));let p=!1;if(r.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};u.addEventListener("touchstart",t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||p||f(t))return;p=!0;let{clientX:s,clientY:n}=t.touches[0];m(s,n),u.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),u.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else u.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===u.dataset.ripple||f(e))return;if(p)return void(p=!1);let{clientX:t,clientY:s}=e;m(t,s),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},30:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const n=s(75).a.debug,i="undefined"!=typeof window?window:self;t.b=n},43:function(e,t,s){"use strict";s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return i})),s.d(t,"e",(function(){return r})),s.d(t,"b",(function(){return o})),s.d(t,"a",(function(){return c}));const n=0,i=1271266957,r=777e3,o=2147483647,c=""},45:function(e,t,s){"use strict";let n;function i(e){n?n.push(e):(n=[e],requestAnimationFrame(()=>{const e=n;n=void 0,e.forEach(e=>e())}))}s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return l})),s.d(t,"d",(function(){return a})),s.d(t,"a",(function(){return u}));let r,o,c=!1;function l(e){r?c?e():r.push(e):(r=[e],requestAnimationFrame(()=>{c=!0;for(let e=0;e{o=void 0}),o)}function u(){return new Promise(e=>{i(()=>{i(e)})})}},50:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));class n{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var n,i;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(i=s)||void 0===i?void 0:i.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const n=t&&[],i=this.listeners[e];if(i){i.slice().forEach(t=>{var r;if(-1===i.findIndex(e=>e.callback===t.callback))return;let o;try{o=t.callback(...s)}catch(e){console.error(e)}n&&n.push(o),(null===(r=t.options)||void 0===r?void 0:r.once)&&this.removeEventListener(e,t.callback)})}return n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},52:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));var n=s(76);function i(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((s,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(n.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},75:function(e,t,s){"use strict";const n={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};n.http=location.search.indexOf("http=1")>0,n.http&&(n.transport="https"),t.a=n},76:function(e,t,s){"use strict";function n(){}s.d(t,"a",(function(){return n}))},90:function(e,t,s){"use strict";function n(e){return null==e?void 0:e.isConnected}s.d(t,"a",(function(){return n}))},96:function(e,t,s){"use strict";function n(e,t){if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}s.d(t,"a",(function(){return n}))}}]); +//# sourceMappingURL=17.1e43fc20a20ae160385c.chunk.js.map \ No newline at end of file diff --git a/public/17.1e43fc20a20ae160385c.chunk.js.map b/public/17.1e43fc20a20ae160385c.chunk.js.map new file mode 100644 index 00000000..adf9d050 --- /dev/null +++ b/public/17.1e43fc20a20ae160385c.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/rootScope.ts","webpack:///./src/components/ripple.ts","webpack:///./src/config/debug.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/dom/findUpAsChild.ts"],"names":["sequentialDom","promises","raf","bind","scheduled","kind","callback","promise","this","scheduleFlush","undefined","then","do","element","isConnected","mutate","Promise","resolve","read","write","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","addEventListener","peerId","document","body","classList","toggle","id","myId","status","name","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","rippleClickId","ripple","elem","onEnd","prepend","attachListenerTo","add","r","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","DEBUG","debug","MOUNT_CLASS_TO","self","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","fastRafCallbacks","fastRaf","push","currentCallbacks","forEach","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","i","fastRafPromise","doubleRaf","EventListenerBase","reuseResults","_constructor","listeners","listenerResults","options","hasOwnProperty","pop","obj","findAndSplice","l","collectResults","args","arr","slice","listener","findIndex","result","console","error","_dispatchEvent","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","deferred","reject","catch","finally","cancel","Object","assign","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","transport","noop","isInDOM","findUpAsChild","el","parent","parentElement"],"mappings":"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","file":"17.1e43fc20a20ae160385c.chunk.js","sourcesContent":["/*\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 { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\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 { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_reactions': {message: Message.message, changedResults: ReactionCount[]},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\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 findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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\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\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\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(requestAnimationFrame);\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\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\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 noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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 { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","export default function noop() {}\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\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\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 findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/18.29da8a83178db260ea59.chunk.js b/public/18.29da8a83178db260ea59.chunk.js new file mode 100644 index 00000000..58de8020 --- /dev/null +++ b/public/18.29da8a83178db260ea59.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[18],{107:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(5),n=s(36);class a extends n.b{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{Object(i.a)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const s=document.createElement("input");s.classList.add("stealthy"),s.tabIndex=-1,s.type="password",t.parentElement.prepend(s),t.parentElement.insertBefore(s.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},116:function(e,t,s){"use strict";function i(e,t){const s=e.length;if(s!==t.length)return!1;for(let i=0;i(this.animation=e,this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},i.a.waitForFirstFrame(e)))}remove(){this.animation&&this.animation.remove()}}},130:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(51);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const s=e.input;s.addEventListener("blur",()=>{this.playAnimation(0)}),s.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const s=this.needFrame>t?-1:1;this.animation.setDirection(s),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},131:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(36);class n extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let s=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===s)return;s=n})}}},154:function(e,t,s){"use strict";function i(...e){const t=e.reduce((e,t)=>e+(t.byteLength||t.length),0),s=new Uint8Array(t);let i=0;return e.forEach(e=>{s.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),s}s.d(t,"a",(function(){return i}))},185:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return Mc}));var i=s(39),n=s(60),a=s(15),o=s(40),r=s(56),l=s(29),c=s(5),d=s(124),h=s(179),p=s(191);const u=[...h.a].concat([...p.a]);var g=new Set(u);function m(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var b=s(38),v=s(100),f=s(67);function y(e){Object(f.a)(e.history,(t,s,i)=>{t.action.photo||(i.splice(s,1),void 0!==e.count&&--e.count)})}var w=s(42);class S{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,Object(w.a)(this,e)}setTargets(e,t,s){this.previous=e,this.next=t,this.reverse=s}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.loadedAllUp=this.loadedAllDown=e,this.loadPromiseUp=this.loadPromiseDown=null}go(e,t=!0){let s,i;if(e>0){if(s=this.next.splice(0,e),i=s.pop(),!i)return;this.previous.push(this.current,...s)}else{if(s=this.previous.splice(this.previous.length+e,-e),i=s.shift(),!i)return;this.next.unshift(...s,this.current)}return this.next.length0),this.current}load(e){if(e&&this.loadedAllDown)return Promise.resolve();if(!e&&this.loadedAllUp)return Promise.resolve();if(e&&this.loadPromiseDown)return this.loadPromiseDown;if(!e&&this.loadPromiseUp)return this.loadPromiseUp;let t;t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0];const s=this.loadMore(t,e,this.loadCount).then(t=>{if(e&&this.loadPromiseDown!==s||!e&&this.loadPromiseUp!==s)return;t.items.length{const s=this.processItem?this.processItem(t):t;s&&(e?this.reverse?this.previous.unshift(s):this.next.push(s):this.reverse?this.next.push(s):this.previous.unshift(s))}),this.onLoadedMore&&this.onLoadedMore()},()=>{}).then(()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null});return e?this.loadPromiseDown=s:this.loadPromiseUp=s,s}}class C extends S{constructor(e={}){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var n;const a=t?0:s;let o=null===(n=this.current)||void 0===n?void 0:n.mid;return e&&(o=e.mid),t||(o=v.a.incrementMessageId(o,1)),i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:s,backLimit:a})).then(e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&y(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history}))},processItem:t=>{if(this.filterMids([t.mid]).length)return e.processItem(t)}})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const s=s=>s.peerId===e&&t.has(s.mid),i=(e,t,i)=>{s(e)&&i.splice(t,1)};Object(f.a)(this.previous,i),Object(f.a)(this.next,i),this.current&&s(this.current)&&this.onEmptied&&this.onEmptied()},this.onHistoryMultiappend=e=>{if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const t=e[this.searchContext.peerId];if(!t)return;const s=Array.from(t).sort((e,t)=>e-t),i=this.filterMids(s).map(e=>this.processItem(e)).filter(Boolean);i.length&&this.next.push(...i)},this.onMessageSent=({message:e})=>{this.onHistoryMultiappend({[e.peerId]:new Set([e.mid])})},a.default.addEventListener("history_delete",this.onHistoryDelete),a.default.addEventListener("history_multiappend",this.onHistoryMultiappend),a.default.addEventListener("message_sent",this.onMessageSent)}filterMids(e){const t=this.searchContext.isScheduled?i.a.getScheduledMessagesStorage(this.searchContext.peerId):i.a.getMessagesStorage(this.searchContext.peerId);return i.a.filterMessagesByInputFilter(this.searchContext.inputFilter._,e,t,e.length)}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),this.searchContext.useSearch||(this.loadedAllDown=this.loadedAllUp=!0)}reset(){super.reset(),this.searchContext=void 0}cleanup(){this.reset(),a.default.removeEventListener("history_delete",this.onHistoryDelete),a.default.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.default.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0}}var L=s(68),I=s(62),M=s(17),E=s(37),P=s(44),T=s(33),k=s(16);class x{constructor(e,t,s=!0,i,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=s,this.autonomous=a,this.onFound=o,this.list=Pc.createChatList(),this.container=document.createElement("div"),i&&(this.container.className=i),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append(Object(k.i18n)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&Pc.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class A{constructor(e,t,s,i){this.container=e,this.searchInput=t,this.searchGroups=s,this.onSearch=i,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new P.b(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout(()=>{this.searchMore(),this.searchTimeout=0},0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,s=""){this.peerId=e,this.threadId=t,this.query!==s&&(this.searchInput.inputField.value=s),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=i.a.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then(t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:s,history:i}=t;i.length&&i[0].mid===this.minMsgId&&i.shift();const n=this.searchGroups.messages;i.forEach(t=>{try{const s=this.peerId?t.fromId:t.peerId;Pc.addDialogAndSetLastMessage({peerId:s,container:this.scrollable,drawStatus:!1,avatarSize:54,meAsSaved:!1,message:t,query:e})}catch(e){console.error("[appSearch] render search result",e)}}),n.toggle(),this.minMsgId=i.length&&i[i.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=i.length,-1===this.foundCount&&(this.foundCount=s,n.nameEl&&Object(T.a)(n.nameEl,Object(k.i18n)(s?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[s])),this.onSearch&&this.onSearch(this.foundCount))}).catch(e=>{console.error("search error",e),this.searchPromise=null})}}var O=s(36);class _{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.onChange(e)},200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new O.b({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const s=document.createElement("i");s.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(s,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var F=s(142),D=s(70),j=s(50),R=s(63),B=s(34);var U=(e,t={})=>Object(B.a)("btn-icon",Object.assign({icon:e||void 0},t)),N=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class H{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=U("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new P.b(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider.addTab(this),this.listenerSetter=new R.a}close(){return this.slider.closeTab(this)}open(...e){return N(this,void 0,void 0,(function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)}))}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append(Object(k.i18n)(e))}}class z extends H{constructor(e){super(e),this.eventListener=new j.a}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}var V=s(59);class K{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{D.a.findItemByType(this.navigationType)?D.a.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,s)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const i=this.historyTabIds.pop();this.onCloseTab(i,t,s);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof H?n.container:n:this.canHideFirst?-1:0,t),!0},Object(w.a)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=Object(F.a)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach(e=>{Object(l.b)(e,this.onCloseBtnClick)})}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof H?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout(()=>{t.onOpenAfterTimeout()},250)),D.a.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof H?e.container:e),!0}removeTabFromHistory(e){Object(V.a)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let s=this.historyTabIds.length-1;s>=0;--s){const i=this.historyTabIds[s];if(i!==t){if(i instanceof e)break;this.removeTabFromHistory(i)}}}getTab(e){return this.historyTabIds.find(t=>t instanceof e)}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,s){s||D.a.removeByType(this.navigationType,!0);const i=e instanceof H?e:this.tabs.get(e);i&&(i.onClose&&i.onClose(),i.onCloseAfterTimeout&&setTimeout(()=>{i.onCloseAfterTimeout()},250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}}var G=s(47),W=s(136);class q{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),Object(l.b)(this.container,()=>{(new W.a).open(this.canvas,e)})}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}var $=(e={})=>Object(B.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class Q extends H{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(){this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new zn({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new O.b({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new O.b({label:"ChatLocation",name:"location",canBeEdited:!1}),t.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.groupNameInputField.input.addEventListener("input",()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)}),this.nextBtn=$({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.groupNameInputField.value;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;G.a.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),this.peerIds.length&&G.a.inviteToChannel(e,this.peerIds),qn.removeTabFromHistory(this),qn.selectTab(0)})}else this.nextBtn.disabled=!0,G.a.createChat(e,this.peerIds.map(e=>e.toUserId())).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),qn.removeTabFromHistory(this),qn.selectTab(0)})});const s=new zn({name:"Members",nameArgs:[this.peerIds.length]}),i=this.list=Pc.createChatList({new:!0});s.content.append(i),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,s.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const s=super.open();return s.then(()=>{t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(k.default.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),this.peerIds.forEach(e=>{const{dom:t}=Pc.addDialogNew({dialog:e,container:this.list,drawStatus:!1,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(E.a.getUserStatusString(e))})}),s}startLocating(){navigator.geolocation.getCurrentPosition(e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then(e=>e.json()).then(e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)})},e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")})}}var Y=s(41),X=s(31),J=s(129),Z=s(83),ee=s(35),te=s(18),se=s(95),ie=s(52),ne=s(58),ae=s(0),oe=s(51),re=s(188),le=s(30),ce=s(73),de=s(81),he=s(1),pe=s(110),ue=s(53),ge=s(85),me=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const be=(()=>{try{return ae.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();const ve=new class{constructor(){if(this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this._volume=1,this._muted=!1,this._playbackRate=1,this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=e=>{const t=this.playingMedia;t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=L.a.getDoc(t.docId);"audio"===s.type&&s.supportsStreaming&&be&&this.handleSafariStreamable(e);const i=ce.a.getCacheContext(s);e.src=i.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate);const n=this.waitingDocumentsForLoad[s.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[s.id])},this.onPlay=e=>{const t=e.target,s=this.mediaDetails.get(t),{peerId:i,mid:n}=s,o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop();const e=e=>e.mid===n&&e.peerId===i;if(!this.listLoader.current||!e(this.listLoader.current)){let t,s=this.listLoader.previous.findIndex(e);-1!==s?t=-(this.listLoader.previous.length-s):(s=this.listLoader.next.findIndex(e),-1!==s&&(t=s+1)),-1!==s?t&&this.listLoader.go(t,!1):this.setTargets({peerId:i,mid:n})}this.setMedia(t,o)}setTimeout(()=>{this.playingMedia===t&&a.default.dispatchEvent("media_play",this.getPlayingDetails())},0)},this.onPause=e=>{a.default.dispatchEvent("media_pause")},this.onEnded=e=>{e.isTrusted&&(this.onPause(e),this.next()||(this.stop(),a.default.dispatchEvent("media_stop")))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=()=>{const e=this.playingMedia;if(!e)return!1;e.paused||e.pause(),e.currentTime=0,Object(de.a)(e,"ended");const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const s=t.peerId,i=t.isScheduled?this.scheduled:this.media,n=i.get(s);n&&(n.delete(t.mid),n.size||i.delete(s)),e.remove(),this.mediaDetails.delete(e)}return this.playingMedia=void 0,this.playingMediaType=void 0,!0},this.playItem=e=>{const{peerId:t,mid:s}=e,i=this.searchContext.isScheduled;this.getMedia(t,s,i).play(),setTimeout(()=>{this.resolveWaitingForLoadMedia(t,s,i)},0)},this.next=()=>!this.lockedSwitchers&&this.listLoader.go(1),this.previous=()=>{const e=this.playingMedia;return e&&(e.currentTime>5||!this.listLoader.previous.length)?(e.currentTime=0,void this.toggle(!0)):!this.lockedSwitchers&&this.listLoader.go(-1)},this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.play,pause:this.pause,stop:this.stop,seekbackward:this.seekBackward,seekforward:this.seekForward,seekto:this.seekTo,previoustrack:this.previous,nexttrack:this.next};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}a.default.addEventListener("document_downloaded",e=>{const t=this.waitingDocumentsForLoad[e.id];if(t)for(const e of t)this.onMediaDocumentLoad(e)});const e={};["volume","muted","playbackRate"].forEach(t=>{const s="_"+t;e[t]={get:()=>this[s],set:e=>{this[s]!==e&&(this[s]=e,this.playingMedia&&(this.playingMedia[t]=e),"playbackRate"===t&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=e),this.dispatchPlaybackParams())}}}),Object.defineProperties(this,e)}dispatchPlaybackParams(){const{volume:e,muted:t,playbackRate:s}=this;a.default.dispatchEvent("media_playback_params",{volume:e,muted:t,playbackRate:s})}addMedia(e,t,s){const{peerId:n,mid:o}=e,r=!!e.pFlags.is_scheduled?this.scheduled:this.media;let l=r.get(e.peerId);l||r.set(e.peerId,l=new Map);let c=l.get(o);if(c)return c;const d=i.a.getMediaFromMessage(e);l.set(o,c=document.createElement("round"===d.type||"video"===d.type?"video":"audio")),"round"===d.type&&c.setAttribute("playsinline","true");const h={peerId:n,mid:o,docId:d.id,clean:s,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(c,h),c.volume=1,this.container.append(c),c.addEventListener("play",this.onPlay),c.addEventListener("pause",this.onPause),c.addEventListener("ended",this.onEnded),"audio"!==d.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==a.default.myId&&c.addEventListener("timeupdate",()=>{i.a.readMessages(n,[o])},{once:!0});const p=Object(ie.a)();if(t)p.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let s=t.get(n);s||t.set(n,s=new Map),s.set(o,p)}return p.then(()=>{const e=ce.a.getCacheContext(d);if(d.supportsStreaming||e.url)this.onMediaDocumentLoad(c);else{let e=this.waitingDocumentsForLoad[d.id];e||(e=this.waitingDocumentsForLoad[d.id]=new Set),e.add(c),L.a.downloadDoc(d)}}),c}getMedia(e,t,s){const i=(s?this.scheduled:this.media).get(e);return null==i?void 0:i.get(t)}handleSafariStreamable(e){e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",()=>{e.currentTime=e.duration-1,e.addEventListener("progress",()=>{e.currentTime=t,e.paused||e.play()},{once:!0})},{once:!0})})}resolveWaitingForLoadMedia(e,t,s){const i=s?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=i.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||i.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var s;return me(this,void 0,void 0,(function*(){yield Object(pe.e)(t,void 0,!1);const n=i.a.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let c="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=ce.a.getCacheContext(n,s.type);if(i.url)a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(n,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(l){const s=e.fromId||e.peerId,i=o.a.getPeerPhoto(s);if(i){const n=d.a.loadAvatar(s,i,"photo_small");if(n.cached){const e=yield n.loadPromise;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}c=o.a.getPeerTitle(s,!0,!1),h=k.default.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find(e=>"documentAttributeAudio"===e._);c=e&&e.title||n.file_name,h=e&&e.performer}a.length||(ae.IS_APPLE?he.IS_TOUCH_SUPPORTED?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach(e=>{const t=`${e}x${e}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const p=new MediaMetadata({title:c,artist:h,artwork:a});navigator.mediaSession.metadata=p}))}getMessageByMedia(e){const t=this.mediaDetails.get(e),{peerId:s,mid:n}=t;return t.isScheduled?i.a.getScheduledMessageByPeer(s,n):i.a.getMessageByPeer(s,n)}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:i.a.getMediaFromMessage(t),message:t,media:e}}toggle(e){return!!this.playingMedia&&(void 0===e&&(e=this.playingMedia.paused),this.playingMedia.paused===e&&(e?this.playingMedia.play():this.playingMedia.pause(),!0))}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!Object(ge.a)(this.searchContext,e)&&(this.searchContext=Object(ue.a)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,s){this.listLoader?this.listLoader.reset():this.listLoader=new C({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{a.default.dispatchEvent("media_stop"),this.stop()}});const i=void 0===this.searchContext.folderId;t?this.listLoader.setTargets(t,s,i):this.listLoader.reverse=i,this.listLoader.setSearchContext(this.searchContext),this.listLoader.current=e,this.listLoader.load(!0),this.listLoader.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=i.a.getMediaFromMessage(e);let s="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?s="voice":"video"===t.type&&(s="video")),s}setMedia(e,t){const s=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[s],this.playingMedia=e,this.playingMediaType=s,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const s=this.playingMedia,i=this.pause();return this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),()=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),e&&this.playingMedia===e&&this.stop(),i&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}};le.a.appMediaPlaybackController=ve;var fe=ve,ye=s(119);function we(e,t,s,i){const n=e=>{s({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),i&&i({x:t.pageX,y:t.pageY,event:t})},o=s=>{0===s.button?(t({x:s.pageX,y:s.pageY,event:s}),n(s),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),s({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),i&&i({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}var Se=s(105);class Ce{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},Object(w.a)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const s=this.seek=document.createElement("input");s.classList.add("progress-line__seek"),s.type="range",s.step=""+this.step,s.min=""+this.min,s.max=""+this.max,s.value=""+t,t&&this.setProgress(t);const i=""+this.step,n=i.indexOf(".");this.decimals=-1===n?0:i.length-n-1,this.container.append(this.filled,s)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=we(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=Object(Se.a)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const s=this.vertical?this.rect.height:this.rect.width,i=Object(Se.a)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,s);let n=this.min+i/s*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=Object(Se.a)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}const Le=e=>{if(e.element)return e.element;const{icon:t,text:s,onClick:i,checkboxField:n,noCheckboxClickListener:a}=e,o=document.createElement("div");o.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:""),Object(te.ripple)(o);let r=e.textElement;r||(r=e.textElement=s?Object(k.i18n)(s,e.textArgs):document.createElement("span"),e.regularText&&(r.innerHTML=e.regularText)),r.classList.add("btn-menu-item-text"),o.append(r);const d=!!n||!!e.keepOpen;return i&&Object(l.b)(o,e=>{Object(c.a)(e);!1!==i(e)&&(d||Object(ee.c)(),n&&!a&&(n.checked="radio"===n.input.type||!n.checked))},e.options),n&&o.append(n.label),e.element=o};var Ie=(e,t)=>{const s=document.createElement("div");s.classList.add("btn-menu"),t&&e.forEach(e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}});const i=e.map(Le);return s.append(...i),s};const Me=(e,t,s,i)=>{((null==s?void 0:s.listenerSetter)?s.listenerSetter.add(e):e.addEventListener.bind(e))(l.a,s=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const n=e.querySelector(".btn-menu");Object(c.a)(s),e.classList.contains("menu-open")?Object(ee.c)():(t&&t(s),Object(ee.d)(n,i))})};var Ee=(e={},t,s,i,n)=>{var a;e.asDiv=!0;const o=null!==(a=e.container)&&void 0!==a?a:U("more",e);o.classList.add("btn-menu-toggle");const r=Ie(s,e.listenerSetter);return r.classList.add(t),Me(o,i,e,n),o.append(r),o},Pe=s(6);class Te extends j.a{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){Object(w.a)(this,e);const{listenerSetter:t,element:s}=this;he.IS_TOUCH_SUPPORTED?t.add(s)("click",e=>{this.ignoreClickClassName&&Object(Pe.a)(e.target,this.ignoreClickClassName)||this.toggleControls()}):(t.add(s)("mousemove",()=>{this.showControls()}),t.add(s)("mouseenter",()=>{this.showControls(!1)}),t.add(s)("mouseleave",e=>{e.relatedTarget&&this.showOnLeaveToClassName&&Object(Pe.a)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()}))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}var ke=s(108);class xe extends Ce{constructor(e,t,s,i){super({step:1e3/60/1e3,min:0,max:1,withTransition:s,useTransform:i},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let s=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{s=!this.media.paused,s&&this.media.pause()},onMouseUp:e=>{s&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,s=this.media.currentTime;let i=0,n=0;for(let a=0;a=t&&t>=i&&(i=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}class Ae extends Ce{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&Object(c.a)(e),fe.muted=!fe.muted},this.setVolume=()=>{const{volume:e,muted:t}=fe;let s;s=!e||t?0:e>.5?3:e>0&&e<.25?1:2,Ae.ICONS.forEach(e=>this.icon.classList.remove("tgico-"+e)),this.icon.classList.add("tgico-"+Ae.ICONS[s]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);fe.muted=!1,fe.volume=t}});const s=this.btn=document.createElement("div");s.classList.add("btn-icon","player-volume");const i=this.icon=document.createElement("span");i.classList.add("player-volume__icon"),s.append(i,this.container),Object(l.b)(i,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("media_playback_params",this.setVolume),this.setVolume()}}Ae.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class Oe extends Te{constructor({video:e,play:t=!1,streamable:s=!1,duration:i,onPlaybackRackMenuToggle:n}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.listenerSetter=new R.a,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(i),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new xe(e,s),t.prepend(this.progress.container)}if(t){e.play().catch(t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())}).finally(()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)})}}stylePlayer(e){const{wrapper:t,video:s,skin:i,listenerSetter:n}=this;t.classList.add(i);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===i){this.playbackRateButton=this.wrapper.querySelector(".playback-rate");const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=String(0|s.duration).toHHMMSS();const l=new Ae(n),d=t.querySelector(".left-controls");l.btn.classList.remove("btn-icon"),d.insertBefore(l.btn,o.parentElement),Array.from(e).forEach(e=>{n.add(e)("click",()=>{this.togglePlay()})}),he.IS_TOUCH_SUPPORTED||(n.add(s)("click",()=>{this.togglePlay()}),n.add(document)("keydown",e=>{if(a.default.overlaysActive>1)return;const{key:s,code:i}=e;let n=!0;if("KeyF"===i)this.toggleFullScreen();else if("KeyM"===i)fe.muted=!fe.muted;else if("Space"===i)this.togglePlay();else if(!e.altKey||"Equal"!==i&&"Minus"!==i)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?n=!1:"ArrowLeft"===s?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"});else{const e="Equal"===i?1:-1,t=fe.playbackRate,s=Oe.PLAYBACK_RATES.indexOf(t)+e;s>=0&&s{he.IS_TOUCH_SUPPORTED||this.toggleFullScreen()}),n.add(i)("click",()=>{this.toggleFullScreen()}),Object(ke.a)(t,this.onFullScreen.bind(this,i),n),n.add(s)("timeupdate",()=>{o.innerHTML=String(0|s.currentTime).toHHMMSS()}),n.add(s)("play",()=>{t.classList.add("played"),he.IS_TOUCH_SUPPORTED||n.add(s)("play",()=>{this.hideControls(!0)})},{once:!0}),n.add(s)("pause",()=>{this.showControls(!1)}),n.add(a.default)("media_playback_params",()=>{this.setPlaybackRateIcon()})}n.add(s)("play",()=>{t.classList.add("is-playing")}),n.add(s)("pause",()=>{t.classList.remove("is-playing")}),s.duration||e?r.innerHTML=String(Math.round(s.duration||e)).toHHMMSS():Object(pe.e)(s).then(()=>{r.innerHTML=String(Math.round(s.duration)).toHHMMSS()})}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`}setBtnMenuToggle(){const e=Oe.PLAYBACK_RATES.map((e,t)=>({regularText:e+"x",onClick:()=>{fe.playbackRate=e}})),t=Ie(e);t.classList.add("top-left"),Me(this.playbackRateButton,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,void 0,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;Oe.PLAYBACK_RATES_ICONS.forEach(t=>{t="tgico-"+t,e.classList.remove(t)});let t=Oe.PLAYBACK_RATES.indexOf(fe.playbackRate);-1===t&&(t=Oe.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+Oe.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(ae.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}Object(ke.d)()?Object(ke.b)():Object(ke.e)(e)}onFullScreen(e){const t=Object(ke.d)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}removeListeners(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=void 0}}Oe.PLAYBACK_RATES=[.5,1,1.5,2],Oe.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var _e=s(133),Fe=s(76),De=s(99),je=s(45);function Re(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(je.b,e)}var Be=s(43);function Ue(e,t=2){if(0===e)return Object(k.i18n)("FileSize.B",[0]);const s=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1024));return Object(k.i18n)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][i],[parseFloat((e/Math.pow(1024,i)).toFixed(s))])}var Ne=s(114);function He(e){e.classList.add("is-voice");const t=e.message,s=i.a.getMediaFromMessage(t);t.pFlags.out&&e.classList.add("is-out");let n=s.attributes.find(e=>"documentAttributeAudio"===e._).waveform||new Uint8Array([]);n=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let s;try{const i=new DataView(e.buffer);s=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){s=new Uint8Array([])}return s}(n.slice(0,63));const{svg:a,container:o,availW:r}=function(e,t){const s=b.b.isMobile?16:23,i=b.b.isMobile?152:190,n=b.b.isMobile?190:256,a=Object(Se.a)(t/60*n,i,n),o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.classList.add("audio-waveform-bars"),o.setAttributeNS(null,"width",""+a),o.setAttributeNS(null,"height",""+s),o.setAttributeNS(null,"viewBox",`0 0 ${a} ${s}`);const r=Math.max(...e),l=e.length?e.length:100,c=Math.min(a/4|0,l);let d=0;const h=s-4;let p="";for(let t=0,i=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&d\n `,i+=4,d=n<(c+1)/2?0:a}else d{let t=e.audio;const s=()=>{d.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&s();const i=Re(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.addAudioListener("play",()=>{Object(Ne.b)(()=>(s(),!t.paused),e)}),e.readyPromise.then(()=>{let e=!1,s=!1;function i(e){let s;if(e instanceof MouseEvent)s=e.offsetX;else{const t=e.target.getBoundingClientRect();s=e.targetTouches[0].pageX-t.left}const i=s/r*t.duration;t.currentTime=i}u.addEventListener("mouseleave",i=>{e&&(t.play(),e=!1),s=!1}),u.addEventListener("mousemove",t=>{s=!0,e&&i(t)}),u.addEventListener("mousedown",s=>{s.preventDefault(),0===s.button&&(t.paused||t.pause(),i(s),e=!0)}),u.addEventListener("mouseup",i=>{s&&e&&(t.play(),e=!1)}),Object(l.b)(u,e=>{Object(c.a)(e),t.paused||i(e)})},Fe.a),()=>{u.remove(),u=null,t=null}}}function ze(e=!0){const t=new ye.a({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}a.default.addEventListener("messages_media_read",({mids:e,peerId:t})=>{e.forEach(e=>{const s=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${s}, .media-round.is-unread${s}`)).forEach(e=>{e.classList.remove("is-unread")})})});const Ve=e=>{let t,s;const i=!e.classList.contains("search-super-item"),n=Object(Pe.a)(e,i?"bubbles-inner":"tabs-tab");if(n){const a=':not([data-is-outgoing="1"])',o=".audio:not(.is-voice)"+a;let r;if(r=e.matches(o)?[o]:[".audio.is-voice"+a,".media-round"+a],i){const e=".bubble:not(.webpage) ";r=r.map(t=>e+t)}const l=r.join(", "),c=Array.from(n.querySelectorAll(l)),d=c.indexOf(e),h=c.map(e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid}));t=h.slice(0,d),s=h.slice(d+1)}return[t,s]};class Ke extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new R.a}render(){var e,t;this.classList.add("audio"),this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=i.a.getMediaFromMessage(this.message),n="voice"===s.type,a=!this.voiceAsMusic&&n,o=this.message.pFlags.is_outgoing,r=o&&this.preloader,d=String(0|s.duration).toHHMMSS();this.innerHTML='\n
\n
\n
\n
\n
\n
';const h=this.firstElementChild,p=document.createElement("div");p.classList.add("audio-download");"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),r&&(this.classList.add("is-outgoing"),this.append(p));const u=a?He(this):function(e){const t=e.withTime,s=e.message,n=i.a.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push(Object(De.a)(n.audioPerformer)),t?a.push(Object(ne.d)(s.date)):a.length||a.push(Ue(n.size)),e.showSender&&a.push(i.a.wrapSenderToPeer(s)),o.append(...Object(k.joinElementsWith)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new _e.a;l.dataset.fontWeight=e.dataset.fontWeight,a?l.append(i.a.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.a.wrapSentTime(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,s=new xe(e.audio,n.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&c.lastChild.replaceWith(s.container))};return e.addAudioListener("play",i),(!e.audio.paused||e.audio.currentTime>0)&&i(),()=>{s.removeListeners(),s.container.remove(),s=null}}}(this),g=this.querySelector(".audio-time");g.innerHTML=d;const m=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=fe.addMedia(this.message,e),s=this.readyPromise=Object(ie.a)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?s.resolve():this.addAudioListener("canplay",()=>s.resolve(),{once:!0}),this.onTypeDisconnect=u();const i=()=>String(0|t.currentTime).toHHMMSS()+(a?" / "+d:""),n=()=>{g.innerText=i(),h.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&n();const o=(e,s=t.paused)=>{if(e&&Object(c.a)(e),s){const e=!!this.searchContext;if(fe.setSearchContext(this.searchContext||{peerId:Be.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?Ve(this):[];fe.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,s)}t.play().catch(()=>{})}else t.pause()};return Object(l.b)(h,e=>o(e),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",()=>{h.classList.remove("playing"),g.innerText=d}),this.addAudioListener("timeupdate",()=>{!t.currentTime&&t.paused||fe.isSafariBuffering(t)||(g.innerText=i())}),this.addAudioListener("pause",()=>{h.classList.remove("playing")}),this.addAudioListener("play",n),o};if(null===(e=s.thumbs)||void 0===e?void 0:e.length){const e=[],t=As({photo:s,message:null,container:h,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});h.style.width=h.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach(e=>e.classList.add("audio-thumb"))}if(o)r&&(this.dataset.isOutgoing="1",this.preloader.attach(p,!1));else{let e=this.preloader;const i="audio"!==s.type;m(i);const n=t=>{if(this.audio.src)return;fe.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(fe.willBePlayed(this.audio),ae.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=ze(!1),s=Object(ie.a)();s.notifyAll({done:75,total:100}),s.catch(()=>{this.audio.pause(),fe.willBePlayed(void 0)}),s.cancel=()=>{s.cancel=Fe.a;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(p,!1,s),e=this.addAudioListener("pause",()=>{s.cancel()},{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then(()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)})}else{e=ze(),t||(this.readyPromise=Object(ie.a)());const n=()=>{i();const n=L.a.downloadDoc(s);return t||n.then(()=>{this.readyPromise.resolve()}),e.attach(p,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?h.append(p):this.append(p),this.classList.add("downloading"),this.readyPromise.then(()=>{this.classList.remove("downloading"),p.classList.add("downloaded"),setTimeout(()=>{p.remove()},200),fe.willBePlayedMedia===this.audio&&(this.audio.play(),fe.willBePlayed(void 0))})};(null===(t=this.audio)||void 0===t?void 0:t.src)||(i?n(!1):Object(l.b)(h,()=>{n(!0)},{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",Ke);var Ge=s(123);class We{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function qe(e){var t,s;let{title:n,titleEl:a,subtitle:o,subtitleEl:l,mediaEl:c,message:d,loadPromises:h}=e;void 0!==n&&("string"==typeof n&&(n=Object(Ge.a)(n,140),n=X.a.wrapEmojiText(n)),Object(T.a)(a,n)),h||(h=[]);let p=d&&d.media,u=!1,g=!1;const m=c?Array.from(c.children).slice():[];let b;if(p&&c){if(l.textContent="",l.append(i.a.wrapMessageForReply(d,void 0,void 0,void 0,void 0,!0)),p.webpage&&(p=p.webpage),p.photo||p.document&&(null===(t=p.document.thumbs)||void 0===t?void 0:t.length)){b=Jl.chat.bubbles.getMiddleware();const e=Jl.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,Fs({doc:p.document,div:c,lazyLoadQueue:e,group:Ql,width:32,height:32,middleware:b,loadPromises:h});else{const t=p.photo||p.document;g="round"===t.type;try{As({photo:t,container:c,boxWidth:32,boxHeight:32,size:r.a.choosePhotoSize(t,32,32),middleware:b,lazyLoadQueue:e,noBlur:!0,withoutPreloader:!0,loadPromises:h}),u=!0}catch(e){}}}}else d?(l.textContent="",l.append(i.a.wrapMessageForReply(d))):("string"==typeof o&&(o=Object(Ge.a)(o,140),o=X.a.wrapEmojiText(o)),Object(T.a)(l,o||""));return Promise.all(h).then(()=>{b&&!b()||(m.forEach(e=>e.remove()),c&&c.classList.toggle("is-round",g))}),u}class $e extends We{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=qe({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s});this.container.classList.toggle("is-media",i),i?this.content.prepend(this.mediaEl):this.mediaEl.remove()}),this.className=e}}function Qe(e,t){return e.reduce((e,t)=>e+t,t)}const Ye=0,Xe=1,Je=2,Ze=4,et=8;class tt{constructor(e,t,s,i,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=s,this.spacing=i,this.maxHeight=n,this.count=e.length,this.ratios=tt.countRatios(e),this.proportions=tt.countProportions(this.ratios),this.averageRatio=Qe(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find(e=>e>2)?new st(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:et|Xe|Je},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:et|Ze|Je}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:Xe|et|Ze},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:Xe|Je|Ze}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),s=this.maxWidth-t-this.spacing,i=Math.min(this.maxHeight,Math.round(Math.min(s/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:s,height:i},sides:Xe|et|Ze},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:Xe|Je|Ze}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),s=e-t-this.spacing,i=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],s*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-i);return[{geometry:{x:0,y:0,width:n,height:e},sides:Xe|et|Ze},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:Xe|Je},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:Ze|Je}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=(this.maxWidth-this.spacing)/2,i=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(s/this.ratios[1],s/this.ratios[2]))),n=e-s-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:et|Xe|Je},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:Ze|et},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:Ze|Je}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),i=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),s*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),s*this.ratios[3])),a=e-i-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,s);return[{geometry:{x:0,y:0,width:e,height:t},sides:et|Xe|Je},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:Ze|et},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:Ze},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:Je|Ze}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),s=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),i=Math.round(s/this.ratios[1]),n=Math.round(s/this.ratios[2]),a=e-i-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,s));return[{geometry:{x:0,y:0,width:t,height:e},sides:Xe|et|Ze},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:Xe|Je},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:Je},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:Ze|Je}]}static countRatios(e){return e.map(e=>e.w/e.h)}static countProportions(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}}class st{constructor(e,t,s,i,n,a=4*s/3){this.averageRatio=t,this.maxWidth=s,this.minWidth=i,this.spacing=n,this.maxHeight=a,this.ratios=st.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map(e=>t>1.1?Object(Se.a)(e,1,2.75):Object(Se.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=Qe(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/s},i=e=>{let i=[],n=0;for(let t of e)i.push(s(n,t)),n+=t;t.push({lineCounts:e,heights:i})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||i([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const s=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||s>3||i([e,t,s])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let s=1;s!==this.count-e-t;++s){const n=this.count-e-t-s;e>3||t>3||s>3||n>3||i([e,t,s,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:s}=e,i=s.length,o=Qe(t,0)+this.spacing*(i-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==i;++e)if(s[e-1]>s[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d{if(this.uploadAvatar)return!0;let e=0,t=0,s=0;return this.inputFields.forEach(i=>{i.isValid()&&(i.isChanged()&&++e,i.required&&++s),i.required&&++t}),t===s&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},Object(w.a)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=$({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.setAttribute("peer",""+this.peerId),e.doNotEditAvatar||(this.avatarEdit=new q(e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach(e=>{this.listenerSetter.add(e.input)("input",this.handleChange)}),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach(t=>t.input.toggleAttribute("disabled",e)),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then(()=>{t&&(this.disabled=!1)},()=>{this.disabled=!1})}}function ot(e,t){const s=document.createElement("form");return e.forEach(e=>{const{container:i,input:n}=e;s.append(i),n.addEventListener("change",e=>{n.checked&&t(n.value,e)})}),s}class rt{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?m(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append(Object(k.i18n)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),t=!0),e.checkboxField){this.checkboxField=e.checkboxField;const s=e.checkboxField.label.classList.contains("checkbox-field-toggle");s?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(t=!0,this.container.append(this.checkboxField.label)),e.noCheckboxSubtitle||s||this.checkboxField.input.addEventListener("change",()=>{Object(T.a)(this.subtitle,Object(k.i18n)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))})}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const s=e.titleRight||e.titleRightSecondary;if(s?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?"string"==typeof e.title?this.title.innerHTML=e.title:this.title.append(e.title):this.title.append(Object(k.i18n)(e.titleLangKey)),t.append(this.title),s){const i=this.titleRight=document.createElement("div");i.classList.add("row-title","row-title-right"),e.titleRightSecondary&&i.classList.add("row-title-right-secondary"),"string"==typeof s?i.innerHTML=s:i.append(s),t.append(i)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",t=>{this.freezed||e.clickable(t)}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||Object(te.ripple)(this.container,void 0,void 0,!0))}createMedia(e){this.container.classList.add("row-with-padding");const t=this.media=document.createElement("div");return t.classList.add("row-media"),e&&t.classList.add("row-media-"+e),this.container.append(t),t}}const lt=(e,t)=>ot(e.map(e=>({container:e.container,input:e.radioField.input})),t);function ct(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var dt=s(66),ht=s(113);class pt{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const s=this.input=document.createElement("input");s.type="radio",s.name="input-radio-"+e.name,e.value&&(s.value=e.value,e.stateKey&&(M.default.getState().then(t=>{s.checked=Object(ht.a)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{M.default.setByKey(e.stateKey,e.value)})));const i=this.main=document.createElement("div");i.classList.add("radio-field-main"),e.text?i.innerHTML=e.text:e.langKey&&Object(k._i18n)(i,e.langKey),t.append(s,i)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const ut=document.createElement("div");function gt(e){Object(T.a)(ut,e),document.body.append(ut),ut.dataset.timeout&&clearTimeout(+ut.dataset.timeout),ut.dataset.timeout=""+setTimeout(()=>{ut.remove(),delete ut.dataset.timeout},3e3)}function mt(e){gt(Object(k.i18n)(e.langPackKey))}function bt(e,t,s=!0,i=!0){let n,a,o,r,l=!1;return(...c)=>(a||(a=new Promise((e,t)=>(o=e,r=t))),n?(clearTimeout(n),l=!0,r(),a=new Promise((e,t)=>(o=e,r=t))):s&&(o(e(...c)),l=!1),n=setTimeout(()=>{!i||s&&!l||o(e(...c)),n=a=o=r=void 0,l=!1},t),a.catch(()=>{}),a)}ut.classList.add("toast");var vt=s(32);class ft extends O.b{constructor(e){super(e),this.checkUsernameDebounced=bt(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(O.a.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());X.b.isUsernameValid(e)?this.setState(O.a.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)})}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=vt.a.invokeApi("channels.checkUsername",{channel:G.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=vt.a.invokeApi("account.checkUsername",{username:e}),this.checkUsernamePromise.then(t=>{this.getValue()===e&&(t?this.setState(O.a.Valid,this.options.availableText):this.setError(this.options.takenText))},t=>{if(this.getValue()===e)switch(t.type){case"USERNAME_INVALID":this.setError(this.options.invalidText)}}).then(()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&X.b.isUsernameValid(t)&&this.checkUsername(t)}))}}var yt=s(54),wt=s(46);class St extends yt.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(yt.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){let e=new hc;e.setAttribute("dialog","1"),e.setAttribute("peer",""+t.peerId),e.classList.add("avatar-32"),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append(Object(k.i18n)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const s=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append(Object(k.i18n)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new wt.a(e);e.checkboxField=t,s.append(t.label)}),t.buttons.forEach(e=>{if(e.callback){const s=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach(t=>{t.checkboxField.checked&&e.add(t.text)}),s(e)}}})),this.container.insertBefore(s,this.header.nextElementSibling)}}var Ct=s(55);class Lt extends z{init(){this.container.classList.add("edit-peer-container","group-type-container");const e=G.a.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new zn({name:e?"ChannelType":"GroupType"}),s=Object(dt.b)(),i=new rt({radioField:new pt({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new rt({radioField:new pt({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=lt([i,o],e=>{const t=[d,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),m()}),c=G.a.getChat(this.chatId);t.content.append(r);const d=new zn({}),h=new rt({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{ct(this.chatFull.exported_invite.link),gt(k.default.format("LinkCopied",!0))}}),p=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(p,()=>{new St("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(Ct.a)([p],!0);n.default.getChatInviteLink(this.chatId,!0).then(t=>{e(),h.title.innerHTML=t})}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()},{listenerSetter:this.listenerSetter}),d.content.append(h.container,p);const u=new zn({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),g=document.createElement("div");g.classList.add("input-wrapper");const m=()=>{const e=i.radioField.checked&&"t.me/"!==v||b.isValidToChange()&&b.input.classList.contains("valid");f.classList.toggle("is-visible",e)},b=new ft({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:m,peerId:this.chatId.toPeerId(!0),head:"t.me/"}),v="t.me/"+(c.username||"");g.append(b.container),u.content.append(g);const f=$({icon:"check",className:"is-visible"});this.content.append(f),Object(l.b)(f,()=>{Object(ee.g)(f);const e=o.radioField.checked?b.getValue():"";G.a.migrateChat(this.chatId).then(t=>G.a.updateUsername(t,e)).then(()=>{this.close()})},{listenerSetter:this.listenerSetter}),("t.me/"!==v?o:i).radioField.checked=!0,b.setOriginalValue(v),this.scrollable.append(t.container,d.container,u.container);{const t=new zn({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),s=new wt.a({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);G.a.toggleNoForwards(this.chatId,s.checked).then(()=>{e()})});const i=()=>{s.setValueSilently(!!c.pFlags.noforwards)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&i()}),i(),t.content.append(s.label),this.scrollable.append(t.container)}}}var It=s(61);class Mt{constructor(e){this.loading=!1,this.loaded=!1,Object(w.a)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then(e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()},()=>{this.promise=void 0,this.loading=!1})))}}var Et=s(86),Pt=s(71),Tt=s(49),kt=s(102),xt=s(171),At=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ot{constructor(e){this.container=document.createElement("div"),this.list=Pc.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=Pc.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},Object(w.a)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>(this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter(e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t}),this.filterPeerTypeBy&&(e=e.filter(e=>{if(e.isPeerId()){if(!o.a.getPeer(e).deleted)return this.filterPeerTypeBy.find(t=>o.a[t](e))}return!0})),t(e)),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?Object(k._i18n)(this.input,this.placeholder,void 0,"placeholder"):Object(k._i18n)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new zn({});e.innerContainer.classList.add("selector-search-section");let t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new P.b(t),Object(l.b)(this.selectedContainer,e=>{if(this.freezed)return;let t=e.target;if(t=Object(Pe.a)(t,"selector-user"),!t)return;const s=t.dataset.key,i=this.chatsContainer.querySelector('[data-peer-id="'+s+'"]');i?i.click():this.remove(s.toPeerId())}),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const s=new zn({name:this.sectionNameLangPackKey,noShadow:!0});s.content.append(this.list),this.chatsContainer.append(s.container),this.scrollable=new P.b(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),Object(l.b)(this.chatsContainer,e=>{const t=Object(Pt.a)(e.target,"data-peer-id");if(Object(c.a)(e),!t)return;if(this.freezed)return;let s=t.dataset.peerId;if(s=s.isPeerId()?s.toPeerId():s,!this.multiSelect)return void this.add(s);this.selected.has(s)?this.remove(s):this.add(s);const i=t.querySelector("input");i.checked=!i.checked});const i=bt(this.onInput,200,!1,!0);this.input.addEventListener("input",i),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(Kn()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout(()=>{let t=this.getMoreResults();e.onFirstRender&&t.then(()=>{e.onFirstRender()})},0)}renderSaved(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!E.a.testSelfSearch(this.query)||this.renderResultsFunc([a.default.myId])}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return At(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=kt.a.height/72*1.25|0,t=this.getTempId("dialogs"),s=i.a.getConversations(this.query,this.offsetIndex,e,this.folderId,!0).promise;this.promise=s;const n=yield s;if(this.tempIds.dialogs!==t)return;this.promise=null;let o=n.dialogs;if(o.length){const e=o[o.length-1].index||0;o=o.slice(),o.findAndSplice(e=>e.peerId===a.default.myId),this.chatRightsAction&&(o=o.filter(e=>this.filterByRights(e.peerId))),this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(o.map(e=>e.peerId)),n.isEnd){if(!this.loadedWhat.dialogs)return this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return e.isUser()&&("send_messages"!==this.chatRightsAction||E.a.canSendToUser(e))||G.a.hasRights(e.toChatId(),this.chatRightsAction)}getMoreContacts(){return At(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),s=Promise.all([e?E.a.getContactsPeerIds(this.query):[],this.query?E.a.searchContacts(this.query):void 0]);this.promise=s;let[i,n]=yield s;if(this.tempIds.contacts!==t)return;if(n){let t=e?n.my_results.concat(n.results):n.my_results;this.chatRightsAction&&(t=t.filter(e=>this.filterByRights(e))),this.peerType.includes("dialogs")||(t=t.filter(e=>e.isUser())),this.cachedContacts=Object(xt.a)(i.concat(t))}else this.cachedContacts=i.slice();Object(V.a)(this.cachedContacts,a.default.myId),this.promise=null}const t=kt.a.height/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return At(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=n.default.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),s=yield t;if(this.tempIds.channelParticipants!==e)return;const i=s.participants.map(e=>G.a.getParticipantPeerId(e));Object(V.a)(i,a.default.myId),this.renderResultsFunc(i),(this.list.childElementCount>=s.count||s.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=e.filter(e=>E.a.isNonContactUser(e))),e.forEach(e=>{const{dom:t}=Pc.addDialogNew({dialog:e,container:this.scrollable,drawStatus:!1,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const s=this.selected.has(e),i=new wt.a;s&&(i.input.checked=!0),t.containerEl.prepend(i.label)}let s;s=e.isAnyChat()?n.default.getChatMembersString(e.toChatId()):e===a.default.myId?Object(k.i18n)(this.selfPresence):E.a.getUserStatusString(e),t.lastMessageSpan.append(s)})}add(e,t,s=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const i=document.createElement("div");i.classList.add("selector-user","scale-in");const n=document.createElement("avatar-element");return n.classList.add("selector-user-avatar","tgico"),n.setAttribute("dialog","1"),n.classList.add("avatar-32"),i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Tt.a({peerId:e.toPeerId(),dialog:!0}).element),n.setAttribute("peer",""+e)),t&&("string"==typeof t?i.innerHTML=t:(Object(T.a)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(i,this.input),this.onChange&&this.onChange(this.selected.size),s&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),i}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const s=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};a.default.settings.animationsEnabled?t.addEventListener("animationend",s,{once:!0}):s()}getSelected(){return[...this.selected]}addInitial(e){e.forEach(e=>{this.add(e,void 0,!1)}),window.requestAnimationFrame(()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:Et.a.Static})})}}var _t=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ft extends yt.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new Ot({appendTo:this.body,onChange:()=>_t(this,void 0,void 0,(function*(){const t=this.selector.getSelected(),s=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(s);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()})),peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),he.IS_TOUCH_SUPPORTED||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence}),this.title.append(this.selector.input)}}class Dt extends z{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new zn({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=Pc.createChatList({new:!0});s.append(i);const{dom:n}=Pc.addDialogNew({dialog:this.userId.toPeerId(!1),container:i,drawStatus:!1,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(E.a.getUserStatusString(this.userId));const a=new Rt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0});e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&Object(ge.a)(this.participant.banned_rights.pFlags,e.pFlags)||G.a.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new zn({});if("channelParticipantBanned"===this.participant._){const s=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});Object(l.b)(s,()=>{const t=Object(Ct.a)([s],!0);G.a.clearChannelParticipantBannedRights(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()},()=>{t()})},{listenerSetter:this.listenerSetter}),t.content.append(s)}const s=Object(B.a)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});Object(l.b)(s,()=>{Object(Ct.a)([s],!0);G.a.kickFromChannel(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()})},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container)}}}var jt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Rt{constructor(e){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const t=G.a.getChat(e.chatId),s=t.default_banned_rights,i=e.participant?G.a.combineParticipantBannedRights(e.chatId,e.participant.banned_rights):s,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0];a.checkboxField=new wt.a({text:a.text,checked:G.a.hasRights(e.chatId,o,i),restriction:!0,withRipple:!0}),(e.participant&&s.pFlags[o]||t.username&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,Object(l.b)(a.checkboxField.label,e=>{gt(k.default.format(n,!0))},{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",()=>{if(!a.checkboxField.checked){this.v.filter(e=>this.toggleWith[o].includes(e.flags[0])).forEach(e=>{e.checkboxField.checked=!1})}}),e.appendTo.append(a.checkboxField.label)}}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v){!t.checkboxField.checked&&t.flags.forEach(t=>{e.pFlags[t]=!0})}return e}}class Bt extends z{init(){return jt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new zn({name:"ChannelPermissionsHeader"});e=new Rt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content}),this.eventListener.addEventListener("destroy",()=>{G.a.editChatDefaultBannedRights(this.chatId,e.takeOut())},{once:!0}),this.scrollable.append(t.container)}{const t=new zn({name:"PrivacyExceptions"}),s=new rt({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Ft({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>jt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void gt("User is no longer participant")}const s=new Dt(this.slider);s.participant=t,s.chatId=this.chatId,s.userId=e,s.open()}));t.content.append(s.container);const r=t.generateContentElement();r.classList.add("chatlist-container");const c=Pc.createChatList({new:!0});r.append(c),Object(l.b)(c,e=>{const t=Object(It.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();i(s)},{listenerSetter:this.listenerSetter});const d=(t,s)=>{const i=s.banned_rights,n=G.a.getChat(this.chatId).default_banned_rights,a=[];e.v.forEach(e=>{const t=e.flags[0];i.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)});const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...Object(k.join)(a.map(e=>Object(k.i18n)(e)),!1))),o.classList.toggle("hide",!a.length)},h=(e,t)=>{const{dom:s}=Pc.addDialogNew({dialog:o.a.getPeerId(e.peer),container:c,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t});d(s.listEl,e)};this.listenerSetter.add(a.default)("updateChannelParticipant",e=>{var t,s,i;const n="channelParticipantBanned"===(null===(t=e.new_participant)||void 0===t?void 0:t._)&&!e.new_participant.banned_rights.pFlags.view_messages,a=c.querySelector(`[data-peer-id="${e.user_id}"]`);n?(a?d(a,e.new_participant):h(e.new_participant,!1),"channelParticipantBanned"!==(null===(s=e.prev_participant)||void 0===s?void 0:s._)&&++g):(a&&a.remove(),"channelParticipantBanned"===(null===(i=e.prev_participant)||void 0===i?void 0:i._)&&--g),p()});const p=()=>{Object(T.a)(s.subtitle,Object(k.i18n)(g?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[g]))};let u,g=0;const m=()=>(u=new Mt({scrollable:this.scrollable,getPromise:()=>n.default.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,c.childElementCount).then(e=>{for(const t of e.participants)h(t,!0);return g=e.count,p(),e.participants.length<50||e.count===c.childElementCount})}),u.load());this.scrollable.append(t.container),G.a.isChannel(this.chatId)?yield m():(p(),this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,m())}))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class Ut{constructor(e,t=o.a.getDialogType(e),s){const n=new Tt.a({peerId:e}).element,a=(t,n=p&&!!t.size)=>{let a=G.a.leave(e.toChatId());n&&(a=a.finally(()=>i.a.flushHistory(e))),s&&s(a)},r=t=>{let n;if(e.isUser())n=i.a.flushHistory(e,!1,p?!!t.size:void 0);else{if(!t.size)return a(t);n=G.a.delete(e.toChatId())}s&&s(n)};let l,c,d,h,p;switch(t){case"channel":G.a.hasRights(e.toChatId(),"delete_chat")?(G.a.deleteChannel,l="ChannelDeleteMenu",c="AreYouSureDeleteAndExitChannel",h=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChannelForAll"}]):(l="LeaveChannelMenu",c="ChannelLeaveAlertWithName",d=[n],h=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":l="DeleteChatUser",c="AreYouSureDeleteThisChatWithUser",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}],p=[{text:"DeleteMessagesOptionAlso",textArgs:[new Tt.a({peerId:e}).element]}];break;case"saved":l="DeleteChatUser",c="AreYouSureDeleteThisChatSavedMessages",h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}];break;case"megagroup":case"group":G.a.hasRights(e.toChatId(),"delete_chat")?(l="DeleteMegaMenu",c="AreYouSureDeleteAndExit",h=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChat.DeleteGroupForAll"}]):(l="LeaveMegaMenu",c="AreYouSureDeleteAndExitName",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new St("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}var Nt=s(104),Ht=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class zt extends z{init(){var e;return Ht(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield Nt.a.getActiveAvailableReactions(),s=yield n.default.getChatFull(this.chatId);let i=null!==(e=s.available_reactions)&&void 0!==e?e:[];const a=new Set(i),o=new zn({caption:G.a.isBroadcast(this.chatId)?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),r=new wt.a({toggle:!0,checked:!!a.size}),l=new rt({checkboxField:r,titleLangKey:"EnableReactions"});o.content.append(l.container);const c=new zn({name:"AvailableReactions"}),d=t.map(e=>{const t=new wt.a({toggle:!0,checked:a.has(e.reaction)});this.listenerSetter.add(t.input)("change",()=>{t.checked?(a.add(e.reaction),r.checked||r.setValueSilently(!0)):(a.delete(e.reaction),!a.size&&r.checked&&r.setValueSilently(!1)),p()});const s=new rt({checkboxField:t,title:e.title,havePadding:!0});return js({row:s,doc:e.static_icon,size:"small"}),c.content.append(s.container),t});this.listenerSetter.add(l.checkboxField.input)("change",()=>{r.checked?d.every(e=>!e.checked)&&(d.forEach(e=>e.checked=!0),p()):(d.forEach(e=>e.checked=!1),p())});const h=()=>{const e=Array.from(a);if([...e].sort().join()===[...i].sort().join())return;const t=n.default.getCachedFullChat(this.chatId);t&&(t.available_reactions=e),G.a.setChatAvailableReactions(this.chatId,e),i=e},p=bt(h,3e3,!1,!0);this.eventListener.addEventListener("destroy",h,{once:!0}),this.scrollable.append(o.container,c.container)}))}}var Vt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Kt extends H{_init(){var e;return Vt(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",null!==(e=this.tempId)&&void 0!==e||(this.tempId=0);const t=++this.tempId;this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let s=yield n.default.getChatFull(this.chatId,!0);const i=G.a.getChat(this.chatId),o=G.a.isBroadcast(this.chatId),r=G.a.isChannel(this.chatId),c=[],d=e=>{c.push(e)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&c.forEach(e=>e())}),this.listenerSetter.add(a.default)("chat_full_update",e=>{this.chatId===e&&(s=n.default.getCachedFullChat(e)||s)});const h=this.chatId.toPeerId(!0),p=G.a.hasRights(this.chatId,"change_type"),u=G.a.hasRights(this.chatId,"change_permissions");{const e=new zn({noDelimiter:!0}),n=[],r=document.createElement("div");if(r.classList.add("input-wrapper"),this.chatNameInputField=new O.b({label:o?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new O.b({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(i.title),this.descriptionInputField.setOriginalValue(s.about),r.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new at({peerId:h,inputFields:n,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.content.append(this.editPeer.avatarEdit.container,r),p){const t=new rt({titleLangKey:o?"ChannelType":"GroupType",clickable:()=>{const e=new Lt(this.slider);e.chatId=this.chatId,e.chatFull=s,e.open(),this.listenerSetter.add(e.eventListener)("destroy",n)},icon:"lock"}),n=()=>{let e;t.subtitle.textContent="",e=o?i.username?"TypePublic":"TypePrivate":i.username?"TypePublicGroup":"TypePrivateGroup",t.subtitle.append(Object(k.i18n)(e))};n(),e.content.append(t.container)}if(p||u){const i=new rt({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=new zt(this.slider);e.chatId=this.chatId,e.open().then(()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)})}}),n=(yield Nt.a.getAvailableReactions()).filter(e=>!e.pFlags.inactive).length,a=()=>{var e;const t=null!==(e=s.available_reactions)&&void 0!==e?e:[];i.subtitle.innerHTML=t.length+"/"+n};a(),e.content.append(i.container)}if(u&&!o){const t=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],s=new rt({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new Bt(this.slider);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>{s.subtitle.innerHTML=t.reduce((e,t)=>e+ +G.a.hasRights(this.chatId,t,i.default_banned_rights),0)+"/"+t.length};n(),e.content.append(s.container),this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&n()})}if(this.scrollable.append(e.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(G.a.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(G.a.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>G.a.editPhoto(t,e))),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter}),o&&G.a.hasRights(this.chatId,"change_info")){const t=new wt.a({text:"PeerInfo.SignMessages",checked:!!i.pFlags.signatures,withRipple:!0});this.listenerSetter.add(t.input)("change",()=>{const e=t.toggleDisability(!0);G.a.toggleSignatures(this.chatId,t.checked).then(()=>{e()})}),d(()=>{t.setValueSilently(!!i.pFlags.signatures)}),e.content.append(t.label)}}if(!o){const e=new zn({});if(!o&&p){const t=new wt.a({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(t.input)("change",()=>{const e=t.toggleDisability(!0);G.a.togglePreHistoryHidden(this.chatId,!t.checked).then(()=>{e()})});const i=()=>{t.setValueSilently(r&&!s.pFlags.hidden_prehistory)};i(),d(i),e.content.append(t.label)}e.content.childElementCount&&this.scrollable.append(e.container)}if(G.a.hasRights(this.chatId,"delete_chat")){const e=new zn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new Ut(h,void 0,e=>{const s=Object(Ct.a)([t],!0);e.then(()=>{this.close()},()=>{s()})})},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}r||this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{h===e&&(this.chatId=t.toChatId(),this._init())})}))}init(){return this._init()}}var Gt=s(109);class Wt extends H{init(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!E.a.isContact(this.peerId.toUserId());this.setTitle(e?"AddContactTitle":"Edit");{const t=new zn({noDelimiter:!0}),s=[],n=document.createElement("div");if(n.classList.add("input-wrapper"),this.nameInputField=new O.b({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new O.b({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=E.a.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(n.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new at({peerId:this.peerId,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const r=new wt.a({text:"Notifications"});r.input.addEventListener("change",e=>{e.isTrusted&&i.a.togglePeerMute(this.peerId)}),this.listenerSetter.add(a.default)("notify_settings",e=>{if("notifyPeer"!==e.peer._)return;const t=o.a.getPeerId(e.peer.peer);if(this.peerId===t){const t=!Gt.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new Tt.a({peerId:this.peerId}).element);const c=document.createElement("div");if(c.classList.add("profile-subtitle"),c.append(Object(k.i18n)("EditContact.OriginalName")),t.content.append(s,l,c,n),e){const e=E.a.getUser(this.peerId),s=new rt({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?E.a.formatUserPhone(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new Tt.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new rt({checkboxField:r}),s=!Gt.a.isPeerLocalMuted(this.peerId,!1);r.checked=s,t.content.append(e.container)}}else t.content.append(n);this.scrollable.append(t.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0,E.a.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,E.a.getUser(this.peerId).phone).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter})}if(!e){const e=new zn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new St("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(yt.a)([{langKey:"Delete",callback:()=>{const e=Object(Ct.a)([t],!0);E.a.deleteContacts([this.peerId]).then(()=>{this.close()},()=>{e()})},isDanger:!0}])}).show()},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}}class qt extends H{init(){this.container.classList.add("add-members-container"),this.nextBtn=$({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",()=>{const e=this.selector.getSelected().map(e=>e.toPeerId());if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}})}attachToPromise(e){const t=Object(ee.g)(this.nextBtn,"arrow_next");e.then(()=>{this.close()},()=>{t()})}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const s="privacy"===this.peerType;return this.selector=new Ot({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[s?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:s,filterPeerTypeBy:s?["isAnyGroup","isUser"]:void 0}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}var $t=!ae.IS_FIREFOX&&!1,Qt=s(126);function Yt(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-check"),s.classList.add("verified-check"),e.append(t,s),e}const Xt=e=>e.touches?e.touches[0]:e,Jt=window;let Zt=!1;a.default.addEventListener("context_menu_toggle",e=>{Zt=e});class es{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{he.IS_TOUCH_SUPPORTED?Jt.removeEventListener("touchmove",this.handleMove,{capture:!0}):(Jt.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{const t=Xt(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,he.IS_TOUCH_SUPPORTED?Jt.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):Jt.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||Zt)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=Xt(e),s=t.clientX,i=t.clientY,n=this.xDown-s,a=this.yDown-i;if(!this.hadMove){if(!n&&!a)return;this.hadMove=!0,he.IS_TOUCH_SUPPORTED||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const o=this.onSwipe(n,a,e);void 0!==o&&o&&this.reset()},Object(w.a)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){he.IS_TOUCH_SUPPORTED?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),Jt.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),Jt.addEventListener("mouseup",this.reset))}removeListeners(){he.IS_TOUCH_SUPPORTED?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),Jt.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),Jt.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!he.IS_TOUCH_SUPPORTED&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var ts=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ss{constructor(e){this.scrollable=e,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(ss.BASE_CLASS+"-avatar","media-container"),e&&(s="object"!=typeof e?r.a.getPhoto(e):e.action.photo);const i=new Image;i.classList.add("avatar-photo"),i.draggable=!1;const n=()=>{if(s){const e=As({container:t,photo:s,size:r.a.choosePhotoSize(s,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach(e=>{e.classList.add("avatar-photo")})}else{const e=o.a.getPeerPhoto(this.peerId);d.a.putAvatar(t,this.peerId,e,"photo_big",i)}};return this.avatars.childElementCount<=3?n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.avatars.append(t),this.addTab(),e},this.container=document.createElement("div"),this.container.classList.add(ss.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(ss.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(ss.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(ss.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(ss.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(ss.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(ss.BASE_CLASS+"-arrow",ss.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new R.a;const t=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1);let s=!1,i=!1;Object(l.b)(this.container,e=>ts(this,void 0,void 0,(function*(){if(i)return void Object(c.a)(e);if(s)return void(s=!1);if(!t())return;const n=this.container.getBoundingClientRect(),a=e.pageX,o=a-n.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||o>n.width*(1/3)&&o{t.push({element:this.avatars.children[s],item:e})});const s=t.slice(0,this.listLoader.previous.length),n=t.slice(this.listLoader.previous.length+1),a=this.avatars.children[this.listLoader.previous.length];i=!0,lc(a,e,()=>e===this.peerId,this.listLoader.current,s,n),i=!1}else{const e=a>n.right-n.width/2;let t;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,t=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(t),Object(je.b)(()=>{this.avatars.classList.remove("no-transition")})}})),{listenerSetter:this.listenerSetter});const n=()=>{s=!0,document.body.addEventListener(he.IS_TOUCH_SUPPORTED?"touchend":"click",e=>{s=!1},{once:!0})};let a=0,h=0,p=0,u=0;this.swipeHandler=new es({element:this.avatars,onSwipe:(e,t)=>{p=e;let s=h+e*-ss.SCALE;return s>0?s=0:st()?!this.container.classList.contains("is-single")&&!i:(n(),Object(c.a)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();a=e.width,u=-a*(this.tabs.childElementCount-1),h=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=ss.TRANSLATE_TEMPLATE.replace("{x}",h+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(p)/(a/ss.SCALE))*(p>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(je.b)(()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")})}});this.intersectionObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)})})}setPeer(e){this.peerId=e;const t=o.a.getPeerPhoto(e);if(!t)return;const s=this.listLoader=new S({loadCount:50,loadMore:(t,a,o)=>{if(!a)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t||s.current;return r.a.getUserPhotos(e,i,o).then(e=>({count:e.count,items:e.photos}))}{const t=[];return s.current||t.push(Promise.resolve(n.default.getChatFull(e.toChatId()))),t.push(i.a.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:o,backLimit:0})),Promise.all(t).then(e=>{const t=e.pop();if(y(t),!s.current){const n=e[0],a=t.history.findAndSplice(e=>e.action.photo.id===n.chat_photo.id);s.current=a||i.a.generateFakeAvatarMessage(this.peerId,n.chat_photo)}return{count:t.count,items:t.history}})}},processItem:this.processItem,onJump:(e,t)=>{const s=this.listLoader.index,i=100*ss.SCALE*s;this.avatars.style.transform=ss.TRANSLATE_TEMPLATE.replace("{x}",`-${i}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active");this.tabs.children[s].classList.add("active"),this.loadNearestToTarget(this.avatars.children[s])}});"userProfilePhoto"===t._&&(s.current=t.photo_id),this.processItem(s.current),s.load(!0)}addTab(){const e=document.createElement("div");e.classList.add(ss.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),s=t.indexOf(e);t.slice(Math.max(0,s-3),Math.min(t.length,s+3)).forEach(e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))})}cleanup(){this.listenerSetter.removeAll(),this.swipeHandler.removeListeners()}}ss.BASE_CLASS="profile-avatars",ss.SCALE=$t?2:1,ss.TRANSLATE_TEMPLATE=$t?`translate3d({x}, 0, -1px) scale(${ss.SCALE})`:"translate({x}, 0)";let is=(e,t)=>{t.title.innerHTML=e||"",t.container.style.display=e?"":"none"};class ns{constructor(e,t,s=!0){this.scrollable=e,this.listenerSetter=t,this.isDialog=s,this.setPeerStatus=(e=!1)=>{const t=this.peerId;!t||a.default.myId===t&&this.isDialog||Jl.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId,!this.isDialog)},$t||this.scrollable.container.classList.add("no-parallax"),t||(this.listenerSetter=new R.a)}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new zn({noDelimiter:!0}),this.avatar=new hc,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.setAttribute("dialog",""+ +this.isDialog),this.avatar.setAttribute("clickable",""),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new rt({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&Promise.resolve(n.default.getProfileByPeerId(this.peerId)).then(e=>{ct(e.about),gt(k.default.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new rt({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{ct("@"+o.a.getPeer(this.peerId).username),gt(k.default.format("UsernameCopied",!0))}}),this.phone=new rt({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{ct("+"+E.a.getUser(this.peerId).phone),gt(k.default.format("PhoneCopied",!0))}}),this.link=new rt({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{ct(this.link.title.textContent),gt(k.default.format("LinkCopied",!0))}}),this.location=new rt({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new rt({checkboxField:new wt.a({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),e.add(this.notifications.checkboxField.input)("change",e=>{e.isTrusted&&i.a.togglePeerMute(this.peerId)}),e.add(a.default)("dialog_notify_settings",e=>{if(this.peerId===e.peerId){const e=Gt.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),$t&&this.element.append(Kn()),e.add(a.default)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),e.add(a.default)("peer_bio_edit",e=>{e===this.peerId&&this.setMoreDetails(!0)}),e.add(a.default)("peer_title_edit",e=>{e===this.peerId&&this.fillUsername()}),e.add(a.default)("user_update",e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()}),e.add(a.default)("contacts_update",e=>{if(this.peerId===e.toPeerId()){E.a.getUser(e).pFlags.self&&this.isDialog||this.fillUserPhone()}}),e.add(a.default)("avatar_update",e=>{this.peerId===e&&this.setAvatar()}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach(e=>{e.container.style.display="none"}),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0)}canBeDetailed(){return this.peerId!==a.default.myId||!this.isDialog}setAvatar(){if(this.canBeDetailed()){if(o.a.getPeerPhoto(this.peerId)){const e=this.avatars;return this.avatars=new ss(this.scrollable),this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void($t&&this.scrollable.container.classList.add("parallax"))}}$t&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),this.avatar.setAttribute("peer",""+this.peerId),this.section.content.prepend(this.avatar,this.name,this.subtitle)}fillUsername(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=o.a.getPeerUsername(e);is(t,this.username)}}fillUserPhone(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=E.a.getUser(e);is(t.phone?E.a.formatUserPhone(t.phone):void 0,this.phone)}}fillNotifications(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=Gt.a.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else Object(je.b)(()=>{e.container.style.display="none"})}fillRows(){var e;const t=this.peerId;this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(),Object(T.a)(this.name,new Tt.a({peerId:t,dialog:this.isDialog}).element);const s=o.a.getPeer(t);(null===(e=null==s?void 0:s.pFlags)||void 0===e?void 0:e.verified)&&this.name.append(Yt()),this.setPeerStatus(!0)}fillProfileElements(){this.cleaned&&(this.cleaned=!1,this.cleanupHTML(),this.setAvatar(),this.fillRows())}setMoreDetails(e){this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0);const t=this.peerId,s=this.threadId;t&&!o.a.isRestricted(t)&&this.canBeDetailed()&&Object(Qt.a)(n.default.getProfileByPeerId(t,e),e=>{if(this.peerId!==t||this.threadId!==s||o.a.isRestricted(t))return;if(is(e.about?X.b.wrapRichText(e.about):void 0,this.bio),!t.isUser()){const s=G.a.getChat(t.toChatId());if(s.username)is("https://t.me/"+s.username,this.link);else{const t=e.exported_invite;t&&is(t.link,this.link)}}const i=e.location;"channelLocation"==(null==i?void 0:i._)&&is(i.address,this.location),this.setMoreDetailsTimeout=window.setTimeout(()=>this.setMoreDetails(!0),6e4)})}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}}class as extends H{constructor(e){super(e,!1),this.threadId=0,this.historiesStorage={}}init(){this.container.classList.add("shared-media-container","profile-container");const e=Object(B.a)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const s=document.createElement("div");s.className="transition slide-fade";const i=document.createElement("div");i.classList.add("transition-item"),this.title.append(Object(k.i18n)("Profile")),this.editBtn=U("edit"),i.append(this.title,this.editBtn);const n=document.createElement("div");n.classList.add("transition-item");const o=this.title.cloneNode();o.append(Object(k.i18n)("PeerInfo.SharedMedia")),n.append(o),s.append(i,n),this.header.append(s),this.profile=new ns(this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element);this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const s=e.top-1<=56;t.classList.toggle("state-back",s),this.searchSuper.container.classList.toggle("is-full-viewport",s),r(+s),s||this.searchSuper.cleanScrollPositions()};const r=Object(F.a)(s,"slide-fade",400,null,!1);r(0),Object(l.b)(this.closeBtn,e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),r(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),Object(l.b)(this.editBtn,e=>{let t;t=this.peerId.isAnyChat()?new Kt(this.slider):new Wt(this.slider),t&&(t instanceof Kt?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())}),a.default.addEventListener("contacts_update",e=>{this.peerId===e&&this.toggleEditBtn()}),a.default.addEventListener("chat_update",e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()}),a.default.addEventListener("history_multiappend",e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))}),a.default.addEventListener("history_delete",({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))}),a.default.addEventListener("message_sent",({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])}),this.searchSuper=new gi({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&a.default.settings.animationsEnabled?250:0;setTimeout(()=>{c.classList.toggle("is-hidden","members"!==e.type)},t)}}),this.profile.element.append(this.searchSuper.container);const c=$({icon:"addmember_filled"});this.content.append(c),c.addEventListener("click",()=>{const e=this.peerId,t=this.peerId.toChatId(),s=G.a.isChannel(t),i=(t,i)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[Object(k.i18n)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map(e=>{const t=document.createElement("b");return t.append(new Tt.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Tt.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Tt.a({peerId:t[0]}).element],checked:!0}])}r.push(new Tt.a({peerId:e}).element),new St("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:i}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&mt({langPackKey:"InviteToGroupError"})};if(s){const e=new qt(this.slider);e.open({type:"channel",skippable:!1,takeOut:s=>(i(s,()=>{const i=G.a.inviteToChannel(t,s);i.catch(n),e.attachToPromise(i)}),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Ft({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout(()=>{i([e],s=>{G.a.addChatUser(t,e,s.size?void 0:0).catch(n)})},0)}})})}renderNewMessages(e,t){if(!this.init&&this.historiesStorage[e]){t=t.slice().reverse();for(const s of this.searchSuper.mediaTabs){const n=s.inputFilter,a=this.searchSuper.filterMessagesByType(t.map(t=>i.a.getMessageByPeer(e,t)),n);if(a.length){const t=this.historiesStorage[e][n];t&&t.unshift(...a.map(e=>({mid:e.mid,peerId:e.peerId}))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[n]&&(this.searchSuper.usedFromHistory[n]+=a.length,this.searchSuper.performSearchResult(a,s,!1))}}}}deleteDeletedMessages(e,t){if(!this.init&&this.historiesStorage[e]){for(const s of t)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=this.historiesStorage[e][i];if(!n)continue;const a=n.findIndex(e=>e.mid===s);if(-1!==a){if(n.splice(a,1),this.peerId===e){const t=this.searchSuper.tabs[i].querySelector(`div[data-mid="${s}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[i]>=a+1&&this.searchSuper.usedFromHistory[i]--}break}}this.scrollable.onScroll()}}cleanupHTML(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",this.searchSuper.canViewMembers()&&G.a.hasRights(this.peerId.toChatId(),"invite_users"))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var s;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){this.peerChanged&&(this.peerChanged=!1,this.cleanupHTML(),this.profile.fillProfileElements(),this.toggleEditBtn())}toggleEditBtn(){let e;e=this.peerId.isUser()?this.peerId!==a.default.myId&&E.a.isContact(this.peerId.toUserId()):G.a.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}loadSidebarMedia(e,t=!1){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}}const os=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1,b.b.addEventListener("changeScreen",(e,t)=>{t===b.a.medium&&e!==b.a.mobile&&this.toggleSidebar(!1)}),b.b.addEventListener("resize",()=>{this.setColumnProportion()}),this.sharedMediaTab=new as(this)}onCloseTab(e,t,s){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,s)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const s=document.body.classList.contains("is-right-column-shown");let i;if(void 0!==e?e?s||(i=!0):s&&(i=!0):i=!0,!i)return Promise.resolve();s||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=Jl.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};le.a.appSidebarRight=os;var rs=os;class ls extends H{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=super.open(),s=it.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);hs(n);const a=document.createDocumentFragment();return s.results.results.forEach((t,i)=>{if(!t.voters)return;const o=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");c.innerHTML=X.a.wrapEmojiText(r.text);const d=document.createElement("div");d.innerText=Math.round(n[i])+"%",l.append(c,d);const h=Pc.createChatList();h.classList.add("poll-results-voters"),Pc.setListClickListener(h,()=>{rs.onCloseBtnClick()},void 0,!0),h.style.minHeight=50*Math.min(t.voters,4)+"px",a.append(o,l,h);let p,u=4,g=!1,m=t.voters-4;const b=()=>{g||(g=!0,it.a.getVotes(e,r.option,p,u).then(e=>{e.votes.forEach(e=>{const{dom:t}=Pc.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()}),p&&(m-=e.votes.length,v.lastElementChild.replaceWith(Object(k.i18n)("PollResults.LoadMore",[Math.min(20,m)]))),p=e.next_offset,u=20,m&&e.votes.length||v.remove()}).finally(()=>{g=!1}))};if(b(),m<=0)return;const v=document.createElement("div");v.classList.add("poll-results-more","show-more","rp-overflow"),v.addEventListener("click",b),Object(te.ripple)(v);const f=document.createElement("div");f.classList.add("tgico-down"),v.append(f,Object(k.i18n)("PollResults.LoadMore",[Math.min(20,m)])),a.append(v)}),this.resultsDiv.append(i,a),rs.toggleSidebar(!0).then(()=>{}),t}}var cs=s(48);let ds=0;const hs=e=>{const t=e.reduce((e,t)=>e+Math.round(t),0);if(t>100){const s=t-100,i=e.length;for(let t=0;t=.5&&is&&(s=i,t=n)}if(-1===t)return;e[t]+=1-s}}};a.default.addEventListener("poll_update",({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach(s=>{s.isClosed=!!e.pFlags.closed,s.performResults(t,e.chosenIndexes)})}),a.default.addEventListener("peer_changed",()=>{us&&ps(us,gs,ms)}),b.b.addEventListener("resize",()=>{bs.setMaxLength(),bs.resizePolls()}),b.b.addEventListener("changeScreen",()=>{bs.setMaxLength()});const ps=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),us===e&&gs===t&&ms===s&&(us=gs=null,ms=0)},200)};let us,gs,ms;class bs extends HTMLElement{constructor(){super(),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=kt.a.width<=360?kt.a.width-120:b.b.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){if(!this.MAX_LENGTH)return;Array.from(document.querySelectorAll("poll-element.is-voted")).forEach(e=>{e.svgLines.forEach((t,s)=>{e.setLineProgress(s,1)})})}render(){ds||(ds=document.getElementById("poll-line").getTotalLength(),bs.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=it.a.getPoll(e);let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),t.pFlags&&(this.isPublic=!!t.pFlags.public_voters,this.isQuiz=!!t.pFlags.quiz,this.isClosed=!!t.pFlags.closed,this.isMultiple=!!t.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const n=this.isMultiple?'':"",a=t.answers.map((e,t)=>`\n
\n
\n
\n \n \n \n ${n}\n
\n
\n
${X.a.wrapEmojiText(e.text)}
\n \n \n
\n `).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append(Object(k.i18n)(i)),this.isQuiz&&(this.classList.add("is-quiz"),t.close_period&&t.close_date)){const e=document.createElement("div");e.classList.add("poll-time"),this.descDiv.append(e);const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("poll-quiz-timer"),this.quizTimer=s;const i=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+i),s.append(o),this.descDiv.append(s);const r=1e3*t.close_period,l=1e3*(t.close_date-nt.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=String(i).toHHMMSS(),i<=5&&(e.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+s*a,o.style.strokeDasharray=`${a} ${a}`,t>=l&&(clearInterval(this.quizInterval),e.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout(()=>{it.a.getResults(this.message)},3e3))},1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append(Object(k.i18n)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",e=>{Object(c.a)(e),rs.isTabExists(ls)||new ls(rs).open(this.message)}),Object(te.ripple)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append(Object(k.i18n)("Chat.Poll.SubmitVote")),Object(te.ripple)(this.sendVoteBtn),t.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),Object(l.b)(this.sendVoteBtn,e=>{Object(c.a)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then(()=>{this.chosingIndexes.length=0,this.answerDivs.forEach(e=>{e.classList.remove("is-chosing")})})}),o.append(this.sendVoteBtn));const r=!(t.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(s,t.chosenIndexes,!1),r&&(this.setVotersCount(s),Object(l.b)(this,this.clickHandler))}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),Object(l.b)(t,s=>{Object(c.a)(s),t.classList.add("active"),((e,t,s)=>{us&&ps(us,gs,ms);const i=document.createElement("div");i.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),i.append(n),a.innerHTML=X.a.wrapRichText(e,{entities:t}),Jl.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),us=i,gs=s,ms=window.setTimeout(()=>{ps(i,s,ms)},he.IS_TOUCH_SUPPORTED?5e3:7e3)})(e.solution,e.solution_entities,()=>{t.classList.remove("active")})}),this.sentVote){const s=e.results.find(e=>e.pFlags.correct);s&&!s.pFlags.chosen&&t.click()}}}clickHandler(e){const t=Object(Pe.a)(e.target,"poll-answer");if(!t)return;Object(c.a)(e);const s=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(s);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(s)}else this.sendVotes([s])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter((t,s)=>e.includes(s));return t.forEach(e=>{e.classList.add("is-voting")}),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=it.a.sendVote(this.message,e).then(()=>{t.forEach(e=>{e.classList.remove("is-voting")}),this.classList.remove("disable-hover")}).catch(()=>{this.sentVote=!1}).finally(()=>{this.sendVotePromise=null})}performResults(e,t,s=!0){var i,n;if(a.default.settings.animationsEnabled||(s=!1),this.isQuiz&&((null===(i=e.results)||void 0===i?void 0:i.length)||this.isClosed)){this.answerDivs.forEach((t,s)=>{t.classList.toggle("is-correct",!!e.results[s].pFlags.correct)}),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),Object(T.a)(this.typeDiv,Object(k.i18n)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?Object(l.b)(this,this.clickHandler):Object(l.c)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map(t=>e.total_voters?t.voters/e.total_voters*100:0);this.classList.toggle("no-transition",!s),s&&Object(cs.a)(this,"",!this.isRetracted,340),Object(je.b)(()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,s),this.percents=t,this.isRetracted=!1})}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));let t="";(e.recent_voters||[]).forEach((e,s)=>{const i=0===s?"":`style="transform: translateX(-${3*s}px);"`;t+=``}),this.avatarsDiv.innerHTML=t}if(this.isMultiple){const t=!!this.chosenIndexes.length,s=this.isClosed||t,i=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",s),this.viewResults.classList.toggle("hide",i),this.votersCountDiv.classList.toggle("hide",!s||!i)}}setResults(e,t,s){this.svgLines.forEach(e=>e.style.display=""),this.answerDivs.forEach((e,s)=>{e.classList.toggle("is-chosen",t.includes(s))});const i=Math.max(...e);if(this.maxPercents=e.map(e=>e/i),this.isRetracted)this.svgLines.forEach((e,t)=>{this.setLineProgress(t,-1)});else{const e=()=>{this.svgLines.forEach((e,t)=>{this.setLineProgress(t,1)})};s?Object(je.b)(e):e()}let n;e=e.slice(),hs(e);const a=t=>{e.forEach((e,s)=>{const i=n(e,t);this.numberDivs[s].innerText=i+"%"})};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),s)for(let e=9,t=0;e>=0;--e,++t)setTimeout(()=>{a(e)},34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),s)for(let e=0;e<10;++e)setTimeout(()=>{a(e)},34*e);else a(9);if(this.isRetracted){s&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach(e=>e.style.display="none")};s?setTimeout(()=>{this.classList.remove("is-retracting"),e()},340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let s,i=[t];s=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",Object(T.a)(this.votersCountDiv,Object(k.i18n)(s,i))}setLineProgress(e,t){const s=this.svgLines[e];-1===t?(s.style.strokeDasharray="",s.style.strokeDashoffset=""):(s.style.strokeDasharray=t*this.maxPercents[e]*bs.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*bs.MAX_OFFSET)}}bs.MAX_OFFSET=-46.5,bs.MAX_LENGTH=0,customElements.define("poll-element",bs);var vs=s(101),fs=s(120),ys=s(65),ws=s(90),Ss=s(145),Cs=s(153),Ls=s(140),Is=s(79),Ms=s(94),Es=s(172),Ps=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let Ts=0;function ks({doc:e,container:t,message:s,boxWidth:i,boxHeight:n,withTail:o,isOut:r,middleware:d,lazyLoadQueue:h,noInfo:p,group:u,onlyPreview:g,withoutPreloader:m,loadPromises:v,noPlayButton:f,size:y,searchContext:w,autoDownload:S}){var C,M;const E=null==S?void 0:S.video;let P=0===E;const T=!(i&&n),k=("video"!==e.type||e.size<=52428800&&!T)&&("gif"===e.type?a.default.settings.autoPlay.gifs:a.default.settings.autoPlay.videos);let x,A;if(!p){x=document.createElement("span"),x.classList.add("video-time"),t.append(x);let s=!1;"gif"!==e.type?(x.innerText=(e.duration+"").toHHMMSS(!1),f||"round"===e.type||(k&&!P?x.classList.add("tgico","can-autoplay"):s=!0)):(x.innerText="GIF",k||f||(s=!0,P=void 0)),s&&(A=document.createElement("span"),A.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(A))}let O,_={};if("image/gif"===e.mime_type){const a=As({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:m,loadPromises:v,autoDownloadSize:E,size:y});return _.thumb=a,_.loadPromise=a.loadPromises.full,_}const F=document.createElement("video");if(F.classList.add("media-video"),F.setAttribute("playsinline","true"),F.muted=!0,"round"===e.type){const i=document.createElement("div");i.classList.add("media-round","z-depth-1"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,i.message=s;const n=b.b.active.round,a=n.width/2,o=3.5,r=a-2*o;i.innerHTML=`\n \n `;const d=i.firstElementChild.firstElementChild;Ts||(Ts=2*Math.PI*r),d.style.strokeDasharray=Ts+" "+Ts,d.style.strokeDashoffset=""+Ts,x.classList.add("tgico");s.pFlags.media_unread&&i.classList.add("is-unread");const h=document.createElement("canvas");h.width=h.height=e.w,i.prepend(h,x),i.append(F),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=fe.addMedia(e,!P),s=()=>{(Jl.chat.setPeerPromise||Promise.resolve()).finally(()=>{Object(ws.a)(t)||(t.removeEventListener("play",r),t.removeEventListener("timeupdate",o),t.removeEventListener("pause",u),t.removeEventListener("ended",g))})},n=()=>{p.drawImage(t,0,0);const e=Ts-t.currentTime/t.duration*Ts;return d.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&(Object(ws.a)(t)?(t.paused&&n(),x.innerText=(t.duration-t.currentTime+"").toHHMMSS(!1)):s())},o=Re(a),r=()=>{F.classList.add("hide"),i.classList.remove("is-paused"),Object(Ne.b)(n,h),O&&O.preloader&&O.preloader.classList.contains("manual")&&O.onClick()},u=()=>{Object(ws.a)(t)?i.classList.add("is-paused"):s()},g=()=>{F.classList.remove("hide"),i.classList.add("is-paused"),F.currentTime=0,x.innerText=(""+t.duration).toHHMMSS(!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",r),t.addEventListener("timeupdate",o),t.addEventListener("pause",u),t.addEventListener("ended",g),Object(l.b)(h,s=>{if(Object(c.a)(s),O&&!O.detached&&O.onClick(),t.paused){const s=!!w;if(fe.setSearchContext(w||{peerId:Be.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?Ve(i):[];fe.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()}),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(n(),a(),F.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else F.autoplay=!0;let D;if(s){if(D=As({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:!0,loadPromises:v,autoDownloadSize:null==S?void 0:S.photo,size:y}),_.thumb=D,!k&&"gif"!==e.type||g)return _.loadPromise=D.loadPromises.full,_;if(o){const e=(D.images.thumb||D.images.full).parentElement;F.width=+e.getAttributeNS(null,"width"),F.height=+e.getAttributeNS(null,"height"),e.append(F)}}else{const t=L.a.getThumb(e,!1);t&&t.promise.then(()=>{F.poster=t.cacheContext.url})}!F.parentElement&&t&&((null==D?void 0:D.aspecter)||t).append(F);const j=ce.a.getCacheContext(e),R=!!(null===(C=null==s?void 0:s.media)||void 0===C?void 0:C.preloader);R?(O=s.media.preloader,O.attach(t,!1),P=void 0):j.downloaded||e.supportsStreaming||m?e.supportsStreaming&&(O=new ye.a({cancelable:!1,attachMethod:"prepend"})):O=new ye.a({attachMethod:"prepend"});const B=Object(ie.a)();F.addEventListener("error",e=>{4!==F.error.code&&console.error("Error "+F.error.code+"; details: "+F.error.message),O&&!R&&O.detach(),B.isFulfilled||B.resolve()},{once:!0}),Object(pe.e)(F).then(()=>{u&&I.a.addAnimation(F,u),O&&!R&&O.detach(),B.resolve()}),"video"===e.type&&(F.addEventListener("timeupdate",()=>{x.innerText=(F.duration-F.currentTime+"").toHHMMSS(!1)}),A&&F.addEventListener("timeupdate",()=>{A.remove()},{once:!0})),F.muted=!0,F.loop=!0,F.autoplay=!0;let U=P&&(null===(M=null==D?void 0:D.preloader)||void 0===M?void 0:M.loadFunc);const N=()=>{O&&P&&!m&&(O.construct(),O.setManual());let i=Promise.resolve();if(O&&!R||m)if(j.downloaded||e.supportsStreaming)e.supportsStreaming&&(P?i=Promise.reject():!j.downloaded&&O&&(O.attach(t,!1,null),F.addEventListener(ae.IS_SAFARI?"timeupdate":"canplay",()=>{O.detach()},{once:!0})));else{const s=i=L.a.downloadDoc(e,null==h?void 0:h.queueId,P);O&&O.attach(t,!1,s)}return!P&&U&&(U(),U=null),P=void 0,i.then(()=>{!d||d()?("round"===e.type&&fe.resolveWaitingForLoadMedia(s.peerId,s.mid,s.pFlags.is_scheduled),Object(vs.a)(F,j.url)):B.resolve()},()=>{}),{download:i,render:B}};return O&&!R&&O.setDownloadFunction(N),"gif"!==e.type||k?_.loadPromise=h?(h.push({div:t,load:()=>N().render}),Promise.resolve()):N().render:Object(l.b)(t,e=>{Object(c.a)(e),A.remove(),N()},{capture:!0,once:!0}),_}function xs({message:e,withTime:t,fontWeight:s,voiceAsMusic:n,showSender:o,searchContext:c,loadPromises:d,autoDownloadSize:h,lazyLoadQueue:p}){var u,m;s||(s=500);const b=0===h,v=e.media.document||e.media.webpage.document,f=e.pFlags.is_outgoing&&(null===(u=e.media)||void 0===u?void 0:u.preloader);if("audio"===v.type||"voice"===v.type||"round"===v.type){const i=new Ke;return i.withTime=t,i.message=e,i.noAutoDownload=b,i.lazyLoadQueue=p,i.loadPromises=d,n&&(i.voiceAsMusic=n),c&&(i.searchContext=c),o&&(i.showSender=o),f&&(i.preloader=e.media.preloader),i.dataset.fontWeight=""+s,i.render(),i}let y=v.file_name?v.file_name.split("."):"",w="";w=y.length>1&&Array.isArray(y)?Object(Ss.a)(y.pop().split(" ",1)[0].toLowerCase()):"file";let S=document.createElement("div");S.classList.add("document","ext-"+w),S.dataset.docId=""+v.id;const C=document.createElement("div");C.classList.add("document-ico");const I=ce.a.getCacheContext(v);if((null===(m=v.thumbs)||void 0===m?void 0:m.length)||e.pFlags.is_outgoing&&I.url&&"photo"===v.type){S.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing)C.innerHTML=``,t.push(C.firstElementChild);else{const e=As({photo:v,message:null,container:C,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:p,size:r.a.choosePhotoSize(v,54,54,!0)});C.style.width=C.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach(e=>e.classList.add("document-thumb"))}else C.innerText=w;let M=v.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const E=[Ue(v.size)];t&&E.push(Object(ne.d)(e.date)),o&&E.push(i.a.wrapSenderToPeer(e)),S.innerHTML=`\n ${I.downloaded&&!f?"":'
'}\n
\n
\n `;const P=S.querySelector(".document-name"),T=new _e.a;T.dataset.fontWeight=""+s,T.innerHTML=M,P.append(T),o&&P.append(i.a.wrapSentTime(e));if(S.querySelector(".document-size").append(...Object(k.joinElementsWith)(E," · ")),S.prepend(C),!f&&e.pFlags.is_outgoing)return S;let x,A=null;const O=()=>{if(x){x.classList.add("downloaded");const e=x;setTimeout(()=>{e.remove()},200),x=null}A&&(A=null)},_=e=>{var t;const s=!e||e.isTrusted,i=L.a.getDoc(S.dataset.docId);let n;const o=Jl.chat.bubbles?Jl.chat.bubbles.lazyLoadQueue.queueId:void 0;if(s)if("pdf"===i.type){const e=L.a.downloading.has(i.id)||I.downloaded;n=L.a.downloadDoc(i,o),e&&n.then(()=>{setTimeout(()=>{const e=ce.a.getCacheContext(i).url;window.open(e)},a.default.settings.animationsEnabled?250:0)})}else n=g.has(i.mime_type)&&(null===(t=i.thumbs)||void 0===t?void 0:t.length)?L.a.downloadDoc(i,o):L.a.saveDocFile(i,o);else n=L.a.downloadDoc(i,o);return x&&(n.then(O),A.attach(x,!0,n)),{download:n}};return L.a.downloading.has(v.id)?(x=S.querySelector(".document-download"),A=new ye.a,A.attach(x,!1,L.a.downloading.get(v.id))):I.downloaded&&!f||(x=S.querySelector(".document-download"),A=e.media.preloader,A?(A.attach(x),e.media.promise.then(O)):(A=new ye.a,A.construct(),A.setManual(),A.attach(x),A.setDownloadFunction(_),void 0!==h&&h>=v.size&&Object(l.d)(A.preloader))),Object(l.b)(S,e=>{A?A.onClick(e):_(e)}),S}function As({photo:e,message:t,container:s,boxWidth:i,boxHeight:n,withTail:o,isOut:l,lazyLoadQueue:c,middleware:d,size:h,withoutPreloader:p,loadPromises:u,autoDownloadSize:g,noBlur:m,noThumb:v,noFadeIn:f,blurAfter:y}){var w;if(!e.sizes&&!e.thumbs)return i&&n&&!h&&"document"===e._&&r.a.setAttachmentSize(e,s,i,n,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};let S=0===g;h||(void 0===i&&(i=b.b.active.regular.width),void 0===n&&(n=b.b.active.regular.height)),s.classList.add("media-container");let C,I,M,E=s,P=!0,T=Promise.resolve();const k="document"===e._&&"image/gif"===e.mime_type&&!h;if(I=new Image,i&&n&&!h){const a=r.a.setAttachmentSize(e,s,i,n,void 0,t,void 0,k?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=a.photoSize,P=a.isFit,M=ce.a.getCacheContext(e,h.type),!P){E=document.createElement("div"),E.classList.add("media-container-aspecter"),E.style.width=a.size.width+"px",E.style.height=a.size.height+"px";const i=r.a.getStrippedThumbIfNeeded(e,M,!m,!0);if(i){T=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{As({container:s,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:c,isOut:l,loadPromises:u,middleware:d,withoutPreloader:p,withTail:o,autoDownloadSize:g,noBlur:m,noThumb:!0,blurAfter:!0}).images.full.classList.add("media-photo","thumbnail")}s.classList.add("media-container-fitted"),s.append(E)}}else h||(h=r.a.choosePhotoSize(e,i,n,!0)),M=ce.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,M,!m);t&&(T=Promise.all([T,t.loadPromise]),C=t.image,C.classList.add("media-photo"),E.append(C))}I.classList.add("media-photo");const x=(C||!M.downloaded)&&a.default.settings.animationsEnabled&&!f;let A;(null===(w=null==t?void 0:t.media)||void 0===w?void 0:w.preloader)&&!p?(A=t.media.preloader,A.attach(s),S=void 0):M.downloaded||(A=new ye.a({attachMethod:"prepend"}));const O=e=>Os(s,I,e,x,E,C),_=()=>d&&!d()?Promise.resolve():y?Object(Cs.a)(M.url,12).then(e=>O(e)):O(M.url);let F;const D=h.w>=150&&h.h>=150||S,j=()=>{S&&!p&&A&&(A.construct(),A.setManual());const t=k&&!h?L.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,S);A&&!M.downloaded&&!p&&D&&A.attach(s,!1,t),S=void 0;const i=t.then(_);return i.catch(()=>{}),{download:t,render:i}};return A&&A.setDownloadFunction(j),M.downloaded?T=F=j().render:c?c.push({div:s,load:()=>j().download}):F=j().render,u&&T&&u.push(T),{loadPromises:{thumb:T,full:F||Promise.resolve()},images:{thumb:C,full:I},preloader:A,aspecter:E}}function Os(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(vs.a)(t,s,()=>{fs.a.mutateElement(e,()=>{n.append(t),Object(je.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{fs.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function _s({size:e,doc:t,middleware:s,target:i,side:n,skipRatio:a,play:o}){const r=document.createElement("div");r.classList.add("emoji-animation"),r.style.width=e+"px",r.style.height=e+"px";const l=Fs({div:r,doc:t,middleware:s,withThumb:!1,needFadeIn:!1,loop:!1,width:e,height:e,play:o,group:"none",skipRatio:a}).then(e=>(Object(Is.a)(e),e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(e.remove(),r.remove(),Jl.chat.bubbles.scrollable.container.removeEventListener("scroll",g))}),Es.a&&e.addEventListener("firstFrame",()=>{navigator.vibrate(100)},{once:!0}),e)),c=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},d=c(16),h=c(4),p=e/8*("right"===n?1:-1),u=()=>{if(!Object(ws.a)(i))return;const t=i.getBoundingClientRect(),s=("right"===n?t.right:t.left)+("center"===n?(t.width-e)/2:("right"===n?-e:0)+p+d),a=t.top+(t.height-e)/2+("center"===n?0:h);r.style.top=a+"px",r.style.left=s+"px"},g=Re(u);return Jl.chat.bubbles.scrollable.container.addEventListener("scroll",g),u(),Jl.emojiAnimationContainer.append(r),{animationDiv:r,stickerPromise:l}}function Fs({doc:e,div:t,middleware:s,lazyLoadQueue:n,group:o,play:d,onlyThumb:h,emoji:p,width:u,height:g,withThumb:m,loop:b,loadPromises:f,needFadeIn:y,needUpscale:w,skipRatio:S,static:C}){var M;const E=e.sticker;if(1===E&&(C=!0),u||(u=p?void 0:200),g||(g=p?void 0:200),2===E&&oe.a.loadLottieWorkers(),!E)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");let P;if(t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper"),C&&1!==E){const t=r.a.choosePhotoSize(e,u,g,!1);P=ce.a.getCacheContext(e,t.type)}else P=ce.a.getCacheContext(e);const T=p?Object(se.d)(p):-1,k=P.downloaded&&!y,x=!C&&(2===E||3===E),A=x;let O=Object(ie.a)(),_=!1;if(((null===(M=e.thumbs)||void 0===M?void 0:M.length)||e.stickerCachedThumbs)&&!t.firstElementChild&&(!k||A||h)&&!1!==m){let i,a=e.stickerCachedThumbs&&e.stickerCachedThumbs[T]||e.thumbs[0];const o=()=>{t.childElementCount||(i.classList.add("media-sticker","thumbnail"),fs.a.mutateElement(t,()=>{t.append(i),O.resolve()}))};if("url"in a)i=new Image,Object(vs.a)(i,a.url,o),_=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}else a=e.thumbs.find(e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length})||a;a&&"photoPathSize"!==a._&&T<=0&&(i=new Image,Ls.a||e.pFlags.stickerThumbConverted||P.url?(Object(vs.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o),_=!0):re.a.convert(""+e.id,a.bytes).then(n=>{a.bytes=n,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(vs.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o)}).catch(()=>{}))}else if((2===E&&T<=0||3===E)&&(m||h)){i=new Image;const r=()=>{if(t.childElementCount||s&&!s())return;const n=()=>{t.childElementCount||s&&!s()||Object(vs.a)(i,P.url,o)};return P.url?(n(),Promise.resolve()):L.a.getThumbURL(e,a).promise.then(n)};if(n&&h)return n.push({div:t,load:r}),Promise.resolve();r(),a.url&&(_=!0)}}if(f&&_&&f.push(O),h)return Promise.resolve();const F=()=>Ps(this,void 0,void 0,(function*(){if(!s||s()){if(2===E&&!C)return yield L.a.downloadDoc(e,null==n?void 0:n.queueId).then(n=>Ps(this,void 0,void 0,(function*(){if(s&&!s())throw new Error("wrapSticker 2 middleware");let r=yield oe.a.loadAnimationWorker({container:t,loop:b&&!p,autoplay:d,animationData:n,width:u,height:g,name:"doc"+e.id,needUpscale:w,skipRatio:S,toneIndex:T},o,s);if(r.addEventListener("firstFrame",()=>{const s=t.firstElementChild;!1!==y&&(y=(y||!s||"svg"===s.tagName)&&a.default.settings.animationsEnabled);const i=()=>{s&&s!==r.canvas&&s.remove()};y?fs.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{fs.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&fs.a.mutate(i),!1!==m&&L.a.saveLottiePreview(e,r.canvas,T)},{once:!0}),p){const e={a:[],v:1};let n;ys.a.preloadAnimatedEmojiStickerAnimation(p),Object(l.b)(t,a=>Ps(this,void 0,void 0,(function*(){Object(c.a)(a);const o=oe.a.getAnimation(t);if(o.paused){const e=ys.a.getAnimatedEmojiSoundDocument(p);if(e){const s=document.createElement("audio");s.style.display="none",t.parentElement.append(s);try{yield L.a.downloadDoc(e);const t=ce.a.getCacheContext(e);s.src=t.url,s.play(),yield Object(pe.e)(s,void 0,!0),s.addEventListener("ended",()=>{s.src="",s.remove()},{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}if(!Jl.chat.peerId.isUser())return;const r=ys.a.getAnimatedEmojiSticker(p,!0);if(!r)return;const l=Object(Pe.a)(t,"bubble"),d=l.classList.contains("is-out"),{animationDiv:h}=_s({doc:r,middleware:s,side:d?"right":"left",size:280,target:t,play:!0});l&&(d?h.classList.add("is-out"):h.classList.add("is-in")),n||(n=Object(Ms.a)(()=>{if(!e.a.length)return;const s=e.a[0].t;e.a.forEach(e=>{e.t=(e.t-s)/1e3});const n=Object(Pe.a)(t,"bubble");i.a.setTyping(Jl.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:v.a.getServerMessageId(+n.dataset.mid),emoticon:p,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0},1e3,!1)),a.isTrusted&&(e.a.push({i:1,t:Date.now()}),n())})))}return r})));if(C||3===E){let i;C?i=new Image:(i=document.createElement("video"),i.setAttribute("playsinline","true"),i.muted=!0,d&&(i.autoplay=!0,i.loop=!0));const l=t.firstElementChild!==i&&t.firstElementChild;return!1!==y&&(y=(y||!k||(C?l:!l||"svg"===l.tagName))&&a.default.settings.animationsEnabled),i.classList.add("media-sticker"),y&&i.classList.add("fade-in"),new Promise((a,c)=>{const d=()=>{if(s&&!s())return a();const n=()=>{fs.a.mutateElement(t,()=>{if(t.append(i),l&&l.classList.add("fade-out"),3===E&&!L.a.isSavingLottiePreview(e,T)){Object(Is.a)(i);const t=document.createElement("canvas");t.width=u*window.devicePixelRatio,t.height=g*window.devicePixelRatio;t.getContext("2d").drawImage(i,0,0,t.width,t.height),L.a.saveLottiePreview(e,t,T)}3===E&&o&&I.a.addAnimation(i,o),a(),y&&i.addEventListener("animationend",()=>{i.classList.remove("fade-in"),l&&l.remove()},{once:!0})})};C?Object(vs.a)(i,P.url,n):(i.src=P.url,Object(pe.e)(i).then(n))};if(P.url)d();else{let t;if(2===E&&C){const s=r.a.choosePhotoSize(e,u,g,!1);t=L.a.getThumbURL(e,s).promise}else t=L.a.downloadDoc(e,null==n?void 0:n.queueId);t.then(d,a)}})}}})),D=!n||k&&!x?F():(n.push({div:t,load:F}),Promise.resolve());return k&&C&&(O=D,f&&f.push(O)),D}function Ds({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return Ps(this,void 0,void 0,(function*(){if(null===(r=e.thumbs)||void 0===r?void 0:r.length)return s.classList.add("media-sticker-wrapper"),void t.push({div:s,load:()=>{const t=ys.a.getStickerSetThumbDownloadOptions(e),r=ce.a.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then(t=>{oe.a.loadAnimationWorker({container:s,loop:!0,autoplay:n,animationData:t,width:a,height:o,needUpscale:!0,name:"setThumb"+e.id},i)});{let t;return e.pFlags.videos?(t=document.createElement("video"),t.setAttribute("playsinline","true"),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then(e=>{Object(vs.a)(t,URL.createObjectURL(e),()=>{s.append(t)})})}}});const l=ys.a.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&Fs({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function js({doc:e,row:t,size:s}){const i=t.media,n=t.createMedia("small");i&&n.classList.add("hide");const a=i?[]:void 0,o="small"===s?32:48,r=Fs({div:n,doc:e,width:o,height:o,loadPromises:a});return a&&Promise.all(a).then(()=>{n.classList.remove("hide"),i.remove()}),r}function Rs(e,t,s){const i=new $e("reply");return i.fill(e,t,s),i.container}function Bs(e){const t=new tt(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&Je),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&Ze),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=i+"px",o.style.height=a+"px";const r=o.children;t.forEach(({geometry:t,sides:s},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/i*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/i*100+"%",s&et&&s&Xe&&(l.style.borderTopLeftRadius="inherit"),s&et&&s&Ze&&(l.style.borderBottomLeftRadius="inherit"),s&Je&&s&Xe&&(l.style.borderTopRightRadius="inherit"),s&Je&&s&Ze&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Us({groupId:e,attachmentDiv:t,middleware:s,uploading:n,lazyLoadQueue:a,isOut:o,chat:l,loadPromises:c,autoDownload:d}){const h=[],p=i.a.getMidsByAlbum(e);for(const e of p){const t=l.getMessage(e),s=t.media.photo||t.media.document,i="photo"===s._?r.a.choosePhotoSize(s,480,480):{w:s.w,h:s.h};h.push({size:i,media:s,message:t})}Bs({container:t,items:h.map(e=>({w:e.size.w,h:e.size.h})),maxWidth:b.b.active.album.width,minWidth:100,spacing:2,forMedia:!0}),h.forEach((e,i)=>{const{size:n,media:r,message:l}=e,h=t.children[i];h.dataset.mid=""+l.mid,h.dataset.peerId=""+l.peerId;const p=h.firstElementChild;"photo"===r._?As({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,autoDownloadSize:d.photo}):ks({doc:l.media.document,container:p,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:s,loadPromises:c,autoDownload:d})})}b.b.addEventListener("changeScreen",(e,t)=>{if(t===b.a.mobile||e===b.a.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=b.b.active.round.width,s=t/2,i=s-7;Ts=2*Math.PI*i,e.forEach(e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+s),n.setAttributeNS(null,"cy",""+s),n.setAttributeNS(null,"r",""+i),n.style.strokeDasharray=Ts+" "+Ts,n.style.strokeDashoffset=""+Ts})}}),a.default.addEventListener("download_start",e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach(e=>{e.querySelector(".preloader-container.manual")&&Object(l.d)(e)})});var Ns=s(82),Hs=s(111),zs=s(91);function Vs(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(zs.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}var Ks=s(147);class Gs{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(Hs.a)(),Object(w.a)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach(e=>{this.update(e.id,!0)}),this.onSort&&this.sorted.forEach((e,t)=>{this.onSort(e,t)})}updateList(e){const t=this.middleware.get();this.updateListWith(s=>{if(!t()||void 0!==s&&!s)return e(!1);this._updateList(),e(!0)})}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,s,i=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,i,n,s),n}delete(e,t){const s=this.elements.get(e);if(!s)return!1;this.elements.delete(e);const i=this.sorted.indexOf(s);if(-1!==i&&this.sorted.splice(i,1),this.onDelete)if(t)this.onDelete(s);else{const e=this.middleware.get();this.updateElementWith(()=>{e()&&this.onDelete(s)})}return!0}update(e,t=!1,s=this.get(e),i){if(!s)return;s.index=this.getIndex(s),this.onUpdate&&this.onUpdate(s);const n=Object(Ks.a)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var Ws=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class qs extends Gs{constructor(e={}){let t;super({getIndex:e.getIndex||(e=>E.a.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>{const t=E.a.getUserStatusString(e.id);Object(T.a)(e.dom.lastMessageSpan,t)}),onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Vs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=Pc.addDialogNew({dialog:e.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:je.b,updateListWith:e=>Ws(this,void 0,void 0,(function*(){return Object(ws.a)(this.list)?(yield Object(Ns.c)(),Object(ws.a)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,Object(w.a)(this,e),this.list=Pc.createChatList(this.createChatListOptions);const s=()=>{t=window.setTimeout(()=>{this.updateList(e=>{e&&s()})},qs.SORT_INTERVAL)};s()}}qs.SORT_INTERVAL=3e4;var $s=s(170);function Qs(e){let t=!1;return new es(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Pe.a)(t.target,"progress-line")&&!Object($s.a)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(s,i,n)=>{if(!t&&Math.abs(i)>20)return!0;if(Math.abs(s)>Math.abs(i))Object(c.a)(n),t=!0;else if(!t&&Math.abs(i)>Math.abs(s))return!0;return e.onSwipe(s,i,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Ys(e){return Qs(Object.assign(Object.assign({},e),{onSwipe:(t,s,i)=>{if(Math.abs(t)>50)return e.onSwipe(t,s,i),Object(ee.b)(),!0}}))}var Xs=s(92),Js=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Zs extends Ft{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>Js(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}Jl.setInnerPeer({peerId:s}),Jl.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class ei{constructor(e,t,s,n){const r=new Tt.a({peerId:e}).element;t=t.slice();const l=(a,o)=>{n&&n(),"scheduled"===s?i.a.deleteScheduledMessages(e,t):i.a.deleteMessages(e,t,!!a.size||o)};let c,d,h,p,u,g=[];if(1===t.length?c="DeleteSingleMessagesTitle":(c="DeleteMessagesTitle",d=[Object(k.i18n)("messages",[t.length])]),h=o.a.isMegagroup(e)?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:l}],e===a.default.myId||"scheduled"===s);else if(e.isUser())g.push({text:"DeleteMessagesOptionAlso",textArgs:[r]});else{const s=G.a.getChat(e.toChatId()),n=G.a.hasRights(e.toChatId(),"delete_messages");if("chat"===s._){const s=n?t.slice():t.filter(t=>i.a.getMessageByPeer(e,t).fromId===a.default.myId);s.length&&(s.length===t.length?g.push({text:"DeleteForAll"}):(g.push({text:"DeleteMessagesOption"}),h="DeleteMessagesTextGroup",p=[Object(k.i18n)("messages",[s.length])]))}else u[0].callback=e=>l(e,!0)}Object(yt.a)(u);new St("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:g}).show()}}var ti=s(161);class si{constructor(e,t,s){let n,a,o=[];n=`Send Message${t.length>1?"s":""} Now`,a=t.length>1?"Send "+t.length+" messages now?":"Send message now?";o.push({langKey:"Send",callback:()=>{s&&s(),i.a.sendScheduledMessages(e,t)}});new St("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var ii=s(8);function ni(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var ai=s(96);const oi=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class ri extends j.a{constructor(e){if(super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.cancelSelection=e=>{e&&(this.doNotAnimate=!0),this.onCancelSelection&&this.onCancelSelection(),this.selectedMids.clear(),this.toggleSelection(),ni(),e&&(this.doNotAnimate=void 0)},Object(w.a)(this,e),this.navigationType="multiselect-"+Object(dt.b)(),he.IS_TOUCH_SUPPORTED)return this.listenerSetter.add(this.listenElement)("touchend",()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")}),void Object(ee.a)(this.listenElement,e=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),this.listenElement.addEventListener("touchend",e=>{Object(c.a)(e),document.body.classList.remove("no-select")},{once:!0,capture:!0}),ni();const t=this.getElementFromTarget(e.target);t&&this.toggleByElement(t)},this.listenerSetter);const t=(e,t)=>{if(e===t)return[];const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=(s.top-i.top||s.left-i.left)<0,a=Object(Pe.a)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);n||([l,r]=[r,l]);return o.slice(r+1,l)};this.listenerSetter.add(this.listenElement)("mousedown",e=>{const s=Object(Pe.a)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,s))return;const i=new Map;let n,a=s;const o=(e,s=!0)=>{const r=+e.dataset.mid;if(!r||!e.dataset.peerId)return;const l=e.dataset.peerId.toPeerId();Object(ws.a)(a)||(a=e);let c=i.get(l);if(c||i.set(l,c=new Set),!c.has(r)){const d=this.isMidSelected(l,r);if(void 0===n&&(n=!d),c.add(r),n&&!d||!n&&d){const n=oi(i);if(this.toggleByElement&&s){n<2&&Object(ai.a)(e,a)&&(a=e);const s=t(a,e);s.length&&s.forEach(e=>{o(e,!1)})}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===n&&this.toggleByMid)for(const[e,t]of i)for(const s of t)this.toggleByMid(e,s)}}};let r=!1;const d=e=>{r||(ni(),r=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,n)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,p)):void o(t)},h=e=>{i.size&&Object(l.b)(window,c.a,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),ni()},p={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,p)})}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const s=!!this.getCheckboxInputFromElement(e);if(t){if(s)return!1;const t=new wt.a({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else s&&this.getCheckboxInputFromElement(e).parentElement.remove();return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){const t=this.selectedMids.size;if(!t&&!e)return;let s=!t,i=!t,n=!t;for(const[e,t]of this.selectedMids){const n=this.isScheduled?this.appMessagesManager.getScheduledMessagesStorage(e):this.appMessagesManager.getMessagesStorage(e);for(const e of t){const t=this.appMessagesManager.getMessageFromStorage(n,e);if(s||(s=!this.appMessagesManager.canForward(t)),i||(i=!this.appMessagesManager.canDeleteMessage(t)),s&&i)break}if(s&&i)break}this.onUpdateContainer&&this.onUpdateContainer(s,i,n)}toggleSelection(e=!0,t=!1){const s=this.isSelecting,i=this.selectedMids.size;if(this.isSelecting=!!i||t,s===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),he.IS_TOUCH_SUPPORTED||(this.listenElement.classList.toggle("no-select",this.isSelecting),s&&ni()),Object(ii.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),ae.IS_MOBILE_SAFARI||(n?D.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):D.a.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0);this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),Object(cs.a)(e,"is-selected",t,200)}isMidSelected(e,t){const s=this.selectedMids.get(e);return null==s?void 0:s.has(t)}length(){return oi(this.selectedMids)}toggleMid(e,t,s){let i=this.selectedMids.get(e);if(s||void 0===s&&(null==i?void 0:i.has(t)))i&&(i.delete(t),i.size||this.selectedMids.delete(e));else{if(a.default.config.forwarded_count_max-this.length()-1<0)return gt(k.default.format("Chat.Selection.LimitToast",!0)),!1;i||(i=new Set,this.selectedMids.set(e,i)),i.add(t)}return!0}deleteSelectedMids(e,t){const s=this.selectedMids.get(e);s&&(t.forEach(e=>{s.delete(e)}),s.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class li extends ri{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Pe.a)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,s=e.dataset.peerId.toPeerId();this.toggleMid(s,t)&&this.updateElementSelection(e,this.isMidSelected(s,t))},this.toggleByMid=(e,t)=>{const s=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(s)},this.onUpdateContainer=(e,t,s)=>{const i=this.length();Object(T.a)(this.selectionCountEl,Object(k.i18n)("messages",[i])),this.selectionGotoBtn.classList.toggle("hide",1!==i),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if(Object(cs.a)(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}),Object(cs.a)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=U(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",()=>this.cancelSelection(),{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=U(`message ${e}-goto`);const s={listenerSetter:this.listenerSetter};Object(l.b)(this.selectionGotoBtn,()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),a.default.dispatchEvent("history_focus",{peerId:e,mid:t})},s),this.selectionForwardBtn=U(`forward ${e}-forward`),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Zs(e,()=>{this.cancelSelection()})},s),this.isPrivate&&(this.selectionDeleteBtn=U(`delete danger ${e}-delete`),Object(l.b)(this.selectionDeleteBtn,()=>{const e=[...this.selectedMids.keys()][0];new ei(e,[...this.selectedMids.get(e)],"chat",()=>{this.cancelSelection()})},s)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const i=this.selectionContainer;i.style.opacity="0",this.searchSuper.navScrollableContainer.append(i),i.offsetLeft,i.style.opacity=""}},this.isPrivate=!e.showSender}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e){Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach(e=>{this.toggleElementCheckbox(e,this.isSelecting)})}return s}}class ci extends ri{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Pe.a)(e,"grouped-item")||Object(Pe.a)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,s)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===s&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=s,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const e=this.selectedMids.get(this.bubbles.peerId);if(e){this.chat.getMidsByMid(t).forEach(t=>e.delete(t))}}return void this.bubbles.getBubbleGroupedItems(e).forEach(this.toggleByElement)}if(!this.toggleMid(this.bubbles.peerId,t))return;if(e.classList.contains("grouped-item")){const s=Object(Pe.a)(e,"bubble"),i=this.isGroupedBubbleSelected(s),n=this.isGroupedMidsSelected(t);(n||i)&&this.updateElementSelection(s,n)}this.updateElementSelection(e,this.isMidSelected(this.bubbles.peerId,t))},this.toggleByMid=(e,t)=>{const s=this.bubbles.getMountedBubble(t);s&&this.toggleByElement(s.bubble)},this.onToggleSelection=(e,t)=>{const{needTranslateX:s,widthFrom:i,widthTo:n}=this.chat.input.center(t);Object(cs.a)(this.listenElement,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)});const a=ithis.cancelSelection(),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=Object(B.a)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append(Object(k.i18n)("MessageScheduleSend")),Object(l.b)(this.selectionSendNowBtn,()=>{new si(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],()=>{this.cancelSelection()})},e)):(this.selectionForwardBtn=Object(B.a)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append(Object(k.i18n)("Forward")),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Zs(e,()=>{this.cancelSelection()})},e)),this.selectionDeleteBtn=Object(B.a)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append(Object(k.i18n)("Delete")),Object(l.b)(this.selectionDeleteBtn,()=>{new ei(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],this.chat.type,()=>{this.cancelSelection()})},e);const s=this.selectionLeft=document.createElement("div");s.classList.add("selection-container-left"),s.append(t,this.selectionCountEl);const i=this.selectionRight=document.createElement("div");i.classList.add("selection-container-right"),i.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==a&&(s.style.transform=`translateX(${-a}px)`,i.style.transform=`translateX(${a}px)`),this.selectionContainer.append(s,i),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",s.style.transform="",i.style.transform=""}}else this.selectionLeft&&void 0!==a&&(this.selectionLeft.style.transform=`translateX(-${a}px)`,this.selectionRight.style.transform=`translateX(${a}px)`)},this.onUpdateContainer=(e,t,s)=>{Object(T.a)(this.selectionCountEl,Object(k.i18n)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",s),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>{for(const[e,t]of this.selectedMids)for(const e of t){const t=this.bubbles.getMountedBubble(e);t&&this.toggleByElement(t.bubble)}}}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e)for(const e in this.bubbles.bubbles){const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return s}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const s=super.toggleElementCheckbox(e,t);if(s){e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach(e=>this.toggleElementCheckbox(e,t))}return s}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(+e.dataset.mid))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}isGroupedMidsSelected(e){const t=this.chat.getMidsByMid(e),s=t.filter(e=>this.isMidSelected(this.bubbles.peerId,e));return t.length===s.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}var di=s(152),hi=s(184),pi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ui{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{a.default.dispatchEvent("history_focus",{peerId:this.peerId,mid:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionForwardBtn):new Zs({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionDeleteBtn):new ei(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Pe.a)(e.target,"search-super-item")}catch(e){}if(s){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.target=s,this.peerId=s.dataset.peerId.toPeerId(),this.mid=+s.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),this.buttons.forEach(e=>{let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||e.verify()),e.element.classList.toggle("hide",!t)}),s.classList.add("menu-open"),Object(ee.e)(e,this.element),Object(ee.d)(this.element,()=>{s.classList.remove("menu-open")})}};he.IS_TOUCH_SUPPORTED||Object(ee.a)(e,s)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>i.a.canForward(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>i.a.canDeleteMessage(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=Ie(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class gi{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new Z.d,this.middleware=Object(Hs.a)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=Object(Y.b)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},Object(w.a)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new ui(this.container,this),this.selection=new li(this,i.a);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const s=this.navScrollable=new P.a(t);s.container.classList.add("search-super-nav-scrollable");const n=this.nav=document.createElement("nav");n.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=n,s.container.append(n);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("i");s.append(Object(k.i18n)(e.name)),s.append(i),t.append(s),Object(te.ripple)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),he.IS_TOUCH_SUPPORTED&&Ys({element:this.tabsContainer,onSwipe:(e,t,s)=>{const i=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=i+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{Object(c.a)(e)};let s=2;const i=()=>{--s||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",i,{once:!0}),i}(this.tabsContainer),this.selectTab(o))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const s=document.createElement("div");s.classList.add("search-super-content-"+e.type),t.append(s),this.tabsContainer.append(t),this.tabs[e.inputFilter]=s,e.contentTab=s}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new x(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&!this.loaded[this.mediaTab.inputFilter]&&this.load(!0)},this.selectTab=Object(J.a)(this.tabsMenu,this.tabsContainer,(e,t,s)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start"});const i=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(i);const n=this.mediaTab;if(this.mediaTab=i,-1!==this.prevTabId&&s&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(i.scroll={scrollTop:n,scrollHeight:0})}if(i.scroll){const e=n.scroll.scrollTop-i.scroll.scrollTop;e&&(i.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||i.contentTab.childElementCount||this.load(!0),this.prevTabId=e},()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()},void 0,s),Object(l.b)(this.tabsContainer,e=>{this.selection.isSelecting&&(Object(c.a)(e),this.selection.toggleByElement(Object(Pe.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Pe.a)(n.target,e);if(!a)return;const o=+a.dataset.mid;if(!o)return void this.log.warn("no messageId by click on target:",a);const r=a.dataset.peerId.toPeerId(),l=Array.from(this.tabs[s].querySelectorAll("."+t)).map(t=>{const s=Object(Pe.a)(t,e);return{element:t,mid:+s.dataset.mid,peerId:s.dataset.peerId.toPeerId()}}),c=l.findIndex(e=>e.mid===o&&e.peerId===r),d=i.a.getMessageByPeer(r,o);(new sc).setSearchContext(this.copySearchContext(s)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))};Object(l.b)(this.tabs.inputMessagesFilterPhotoVideo,o.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),Object(l.b)(this.tabs.inputMessagesFilterDocument,o.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],Object(Ns.a)(()=>{this.lazyLoadQueue.lock()},()=>{this.lazyLoadQueue.unlockAndRefresh()})}filterMessagesByType(e,t){if("inputMessagesFilterEmpty"===t)return e;"inputMessagesFilterUrl"!==t&&(e=e.filter(e=>!!e.media));let s=[];switch(t){case"inputMessagesFilterPhotoVideo":for(let t of e){let e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document;e&&("document"===e._&&"video"!==e.type||s.push(t))}break;case"inputMessagesFilterDocument":for(let t of e)t.media.document&&!["voice","audio","gif","sticker","round"].includes(t.media.document.type)&&s.push(t);break;case"inputMessagesFilterUrl":for(let t of e)s.push(t);break;case"inputMessagesFilterMusic":for(let t of e)t.media.document&&"audio"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterVoice":for(let t of e)t.media.document&&"voice"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterRoundVoice":for(let t of e)t.media.document&&["voice","round"].includes(t.media.document.type)&&s.push(t)}return s}processEmptyFilter({message:e,searchGroup:t}){const{dialog:s,dom:i}=Pc.addDialogNew({dialog:e.peerId,container:t.list,drawStatus:!1,avatarSize:54});Pc.setLastMessage(s,e,i,this.searchContext.query)}processPhotoVideoFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){const a=i.a.getMediaFromMessage(e),o=document.createElement("div");let l;o.classList.add("grid-item");const c=r.a.choosePhotoSize(a,200,200);l="photo"!==a._?ks({doc:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:c}).thumb:As({photo:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,withoutPreloader:!0,noBlur:!0,size:c}),[l.images.thumb,l.images.full].filter(Boolean).forEach(e=>{e.classList.add("grid-item-media")}),t.push(l.loadPromises.thumb),n.push({element:o,message:e})}processDocumentFilter({message:e,elemsToAppend:t,inputFilter:s}){const n=i.a.getMediaFromMessage(e),a=this.showSender||["voice","round"].includes(n.type),o=xs({message:e,withTime:!a,fontWeight:400,voiceAsMusic:!0,showSender:a,searchContext:this.copySearchContext(s),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});["audio","voice","round"].includes(n.type)&&o.classList.add("audio-48"),t.push({element:o,message:e})}processUrlFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){var a;let o=null===(a=e.media)||void 0===a?void 0:a.webpage;if(!o){const t=e.totalEntities?e.totalEntities.find(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._):null;let s,i,n;if(t)n=e.message.slice(t.offset,t.offset+t.length);else{const t=X.b.matchUrl(e.message);if(!t)return;s=t[0]}s="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:s||n,i=s;const a=e.message===s;s.match(/^(ftp|http|https):\/\//)||(i="https://"+s,s=s.includes("@")?s:"https://"+s),i=new URL(i).hostname,o={_:"webPage",url:s,display_url:i,id:"",hash:0},a||(o.description=e.message,o.rDescription=X.b.wrapRichText(Object(Ge.a)(e.message,150,180)))}let l=document.createElement("div");if(l.classList.add("preview","row-media"),o.photo){As({container:l,message:null,photo:o.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,size:r.a.choosePhotoSize(o.photo,60,60,!1),loadPromises:t,noBlur:!0})}else l.classList.add("empty"),l.innerHTML=X.b.getAbbreviation(o.title||o.display_url||o.description||o.url,!0);let c=o.rTitle||"",d=o.rDescription||"";const h=Object(ti.a)(d),p=Object(ti.a)(X.b.wrapRichText(o.url||"")).firstElementChild;if(p instanceof HTMLAnchorElement)try{p.innerText=decodeURIComponent(p.href)}catch(e){}h.firstChild&&h.append("\n"),h.append(p),this.showSender&&h.append("\n",i.a.wrapSenderToPeer(e)),c||(c=X.b.wrapPlainText(o.display_url.split("/",1)[0]));const u=new rt({title:c,titleRight:i.a.wrapSentTime(e),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});u.container.append(l),u.container.innerText.trim().length&&n.push({element:u.container,message:e})}performSearchResult(e,t,s=!0){return pi(this,void 0,void 0,(function*(){const i=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield Object(Ns.c)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const c={elemsToAppend:i,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let d;switch(l){case"inputMessagesFilterEmpty":d=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":d=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":d=this.processDocumentFilter;break;case"inputMessagesFilterUrl":d=this.processUrlFilter}if(d){d=d.bind(this);for(const t of e)try{c.message=t,d(c)}catch(e){this.log.error("error rendering filter",l,c,t,e)}}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(i.length){const e=s?"append":"prepend";i.forEach(t=>{const{element:s,message:i}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?i.date:0,l);s.classList.add("search-super-item"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,n.items[e](s),this.selection.isSelecting&&this.selection.toggleElementCheckbox(s,!0)})}this.afterPerforming("inputMessagesFilterEmpty"===l?1:e.length,n)}}))}afterPerforming(e,t){if(t){const s=t.parentElement;if(Array.from(s.children).slice(1).forEach(e=>{e.remove()}),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),s.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const s=this.searchContext.query;if(s){const r=(t,i,r=!1)=>{t.forEach(t=>{if(e.has(t))return;e.add(t);const l=o.a.getPeer(t),{dom:c}=Pc.addDialogNew({dialog:t,container:i.list,drawStatus:!1,avatarSize:48,autonomous:i.autonomous});if(r&&(l.participants_count||l.participants)){const e=new RegExp(`(${Object(hi.a)(s)}|${Object(hi.a)(Object(Ss.b)(s))})`,"gi");c.titleSpan.innerHTML=c.titleSpan.innerHTML.replace(e,"$1"),c.lastMessageSpan.append(n.default.getChatMembersString(t.toChatId()))}else if(t===a.default.myId)c.lastMessageSpan.append(Object(k.i18n)("Presence.YourChat"));else{let e=o.a.getPeerUsername(t);if(e)e="@"+e;else{const s=E.a.getUser(t);s&&s.phone&&(e="+"+Object(Xs.a)(s.phone).formatted)}c.lastMessageSpan.innerHTML=""+e+""}}),i.toggle()},c=e=>{if(t())return e};return Promise.all([E.a.getContactsPeerIds(s,!0).then(c).then(e=>{e&&r(e,this.searchGroups.contacts,!0)}),E.a.searchContacts(s,20).then(c).then(e=>{if(e&&(r(e.my_results,this.searchGroups.contacts,!0),r(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new k.default.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),Object(l.b)(e,()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()})}}),i.a.getConversations(s,0,20,0).promise.then(c).then(e=>{e&&r(e.dialogs.map(e=>e.peerId),this.searchGroups.contacts,!0)})])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>M.default.getState().then(s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach(e=>{let{dialog:t,dom:s}=Pc.addDialogNew({dialog:e,container:this.searchGroups.recent.list,drawStatus:!1,meAsSaved:!0,avatarSize:48,autonomous:!0});s.lastMessageSpan.append(e.isUser()?E.a.getUserStatusString(e):n.default.getChatMembersString(e.toChatId()))}),s.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())});return Promise.all([E.a.getTopPeers("correspondents").then(e=>{if(!t())return;const s=e.findIndex(e=>e.id===a.default.myId);-1!==s&&(e=e.slice()).splice(s,1),e.length&&e.forEach(e=>{Pc.addDialogNew({dialog:e.id,container:this.searchGroups.people.list,drawStatus:!1,onlyFirstName:!0,avatarSize:54,autonomous:!1})}),this.searchGroups.people.setActive()}),e()])}}loadMembers(e){const t=this.searchContext.peerId.toChatId(),s=this.middleware.get();let i;const a=t=>pi(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new qs({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),Object(l.b)(this.membersList.list,e=>{const t=Object(It.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=rs.toggleSidebar(!1)),i.then(()=>{Jl.setInnerPeer({peerId:s})})}),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab)),t.forEach(e=>{const t=G.a.getParticipantPeerId(e);if(t.isAnyChat())return;E.a.getUser(t).pFlags.deleted||this.membersList.add(t)}))}));if(G.a.isChannel(t)){const o=this.membersList?200:50;i=n.default.getChannelParticipants(t,void 0,o,this.nextRates[e.inputFilter]).then(t=>{if(!s())return;let i=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(i?i.childElementCount:0)+t.participants.length,t.participants.length{if(!s())return;this.loaded[e.inputFilter]=!0;const i=t.participants;return"chatParticipantsForbidden"!==i._?a(i.participants):void 0});return this.loadPromises[e.inputFilter]=i.finally(()=>{s()&&(this.loadPromises[e.inputFilter]=null)})}loadType(e,t,s,n){var a,o;const r=e.inputFilter;if(this.loadPromises[r])return this.loadPromises[r];if("members"===e.type)return this.loadMembers(e);const l=null!==(a=this.historyStorage[r])&&void 0!==a?a:this.historyStorage[r]=[];if(!("inputMessagesFilterEmpty"!==r||l.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[r]=!0,Promise.resolve();const c="load ["+r+"]: ";if(l.length&&this.usedFromHistory[r]i.a.getMessageByPeer(e.peerId,e.mid)),r))}while(a{setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}let d=l.length?l[l.length-1].mid:0;return this.loadPromises[r]=i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:r},maxId:d,limit:s,nextRate:null!==(o=this.nextRates[r])&&void 0!==o?o:this.nextRates[r]=0})).then(i=>{if(l.push(...i.history.map(e=>({mid:e.mid,peerId:e.peerId}))),this.log(c+"search house of glass",r,i),n())return(i.history.length{setTimeout(()=>{if(n()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then(()=>{n()&&setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}},0)}),this.performSearchResult(this.filterMessagesByType(i.history,r),e))}).catch(e=>{this.log.error("load error:",e)}).finally(()=>{this.loadPromises[r]=null})}load(e=!1,t=!1){return pi(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(this.hideEmptyTabs){const e=this.mediaTabs.filter(e=>"inputMessagesFilterEmpty"!==e.inputFilter),t=e.map(e=>({_:e.inputFilter})),a=yield i.a.getSearchCounters(s,t);if(!n())return;if(this.loadMutex&&(yield this.loadMutex,!n()))return;let o,r=0;e.forEach(e=>{const t=a.find(t=>t.filter._===e.inputFilter);e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&void 0===o&&(o=e),t.count&&++r});const l=this.mediaTabsMap.get("members"),c=this.canViewMembers();l.menuTab.classList.toggle("hide",!c),c&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),o.menuTab.classList.add("active"),this.navScrollableContainer.classList.toggle("hide",r<=1))}this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter(e=>e!==this.mediaTab);if(a=a.filter(e=>{const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"members"===e.type),!a.length)return;const o=t?50:Math.round(3*(kt.a.height/130|0)*1.25),r=a.map(e=>this.loadType(e,t,o,n));return Promise.all(r).catch(e=>{this.log.error("Load error all promises:",e)})}))}getMonthContainerByTimestamp(e,t){var s;const i=new Date(1e3*e);i.setHours(0,0,0),i.setDate(1);const n=i.getTime(),a=null!==(s=this.monthContainers[t])&&void 0!==s?s:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const s=document.createElement("div");s.classList.add("search-super-month-name");const o={month:"long"};i.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new k.default.IntlDateElement({date:i,options:o}).element;s.append(r),e.append(s);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(s,l);const c=Object(di.a)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},Vs(e,this.tabs[t],d)}return a[n]}canViewMembers(){return this.searchContext.peerId.isAnyChat()&&!G.a.isBroadcast(this.searchContext.peerId.toChatId())&&G.a.hasRights(this.searchContext.peerId.toChatId(),"view_participants")}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.lazyLoadQueue.clear(),this.mediaTabs.forEach(e=>{this.usedFromHistory[e.inputFilter]=-1}),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach(e=>{e.scroll=void 0})}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach(e=>{URL.revokeObjectURL(e)}),this.urlsToRevoke.length=0),this.mediaTabs.forEach(e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||Object(ee.f)(t,!0);const s=t.querySelector(".content-empty");s&&s.remove()}}),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=Object(ue.a)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:s,historyStorage:i,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:s,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=i?i:{},this.cleanup()}}var mi,bi=s(64),vi=s(173);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(mi||(mi={}));const fi=new class{constructor(){this.privacy={},a.default.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,a.default.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return vt.a.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then(s=>(E.a.saveApiUsers(s.users),G.a.saveApiChats(s.chats),bi.a.processLocalUpdate({_:"updatePrivacy",key:{_:Object(vi.a)(e)},rules:t.map(e=>{const t={};return Object.assign(t,e),t._=Object(vi.a)(t._),t})}),s.rules))}getPrivacy(e){const t=Object(vi.a)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=vt.a.invokeApi("account.getPrivacy",{key:{_:e}}).then(e=>(E.a.saveApiUsers(e.users),G.a.saveApiChats(e.chats),this.privacy[t]=e.rules))}getPrivacyRulesDetails(e){const t=[];let s={users:[],chats:[]},i={users:[],chats:[]};return e.forEach(e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueAllowUsers":s.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueDisallowUsers":i.users.push(...e.users)}}),{type:t[0],disallowPeers:i,allowPeers:s}}};le.a.appPrivacyManager=fi;var yi=fi;class wi{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],s=this.radioSection.caption;t?t instanceof HTMLElement?Object(T.a)(s,t):Object(k._i18n)(s,t):s.innerHTML="",s.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===mi.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===mi.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new zn({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:mi.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:mi.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:mi.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter(t=>!e.skipTypes.includes(t.type)));const s=Object(dt.b)();t.forEach(({type:e,langKey:t})=>{const i=new rt({radioField:new pt({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=lt([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=Vn(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach(s=>{s.row=new rt(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new qt(e.tab.slider).open({type:"privacy",skippable:!0,title:s.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),s.row.subtitle.innerHTML="",s.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})})}),t.append(s.row.container)})}const n=yi.getPrivacy(e.inputKey).then(t=>{const s=yi.getPrivacyRulesDetails(t);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach(e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map(e=>e.toPeerId())),t.push(...i.chats.map(e=>e.toPeerId(!0))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))})),e.tab.eventListener.addEventListener("destroy",()=>{const t=[];switch(this.type){case mi.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case mi.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case mi.Nobody:t.push({_:"inputPrivacyValueDisallowAll"})}this.exceptions&&[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]].forEach(([e,s,i],n)=>{if(this.exceptions.get(e).row.container.classList.contains("hide"))return;const a=this.peerIds[e];if(a){const e=this.splitPeersByType(a);e.chats.length&&t.push({_:s,chats:e.chats}),e.users.length&&t.push({_:i,users:e.users.map(e=>E.a.getUserInput(e))})}}),yi.setPrivacy(e.inputKey,t)},{once:!0})})}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach(e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)}),t}generateStr(e){return e.users.length||e.chats.length?Object(k.join)([e.users.length?Object(k.i18n)("Users",[e.users.length]):null,e.chats.length?Object(k.i18n)("Chats",[e.chats.length]):null].filter(Boolean),!1):[Object(k.i18n)("PrivacySettingsController.AddUsers")]}}class Si extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e=document.createElement("div");e.append(Object(k.i18n)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),Object(k.i18n)("PrivacyPhoneInfo4"),document.createElement("br"),function(e={}){const t=document.createElement("a");if(t.classList.add("anchor-copy"),e.mePath){const s="https://t.me/"+e.mePath;t.href=t.innerText=s}return Object(l.b)(t,e=>{Object(c.a)(e),ct(t.href),mt({langPackKey:"LinkCopied"})}),t}({mePath:"+380509144504"}));const t=new wi({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[e,e,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{s.setRadio(mi.Everybody),s.radioSection.container.classList.toggle("hide",e!==mi.Nobody)}}),s=new wi({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[mi.Nobody]});this.scrollable.container.insertBefore(s.radioSection.container,t.radioSection.container.nextSibling)}}var Ci=s(88);class Li extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new zn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=ys.a.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?Fs({doc:t,div:s,loop:!0,play:!0,width:160,height:160}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=Object(B.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});Object(l.b)(a,e=>{this.close()}),this.slider.sliceTabsUntilTab(On,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var Ii=s(131);function Mi(e){return!ae.IS_MOBILE_SAFARI||!e}class Ei extends H{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new zn({caption:!0,noDelimiter:!0});Object(k._i18n)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=ys.a.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?Fs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"📬"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.codeInputField=new Ii.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),Ci.a.confirmPasswordEmail(""+e).then(e=>{c()}).catch(e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),Object(T.a)(a.label,Object(k.i18n)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),Object(T.a)(a.label,Object(k.i18n)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)})}}),o=Object(B.a)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),c=()=>{new Li(this.slider).open()},d=e=>{Object(Ct.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),Ci.a.cancelPasswordEmail().then(e=>{this.slider.sliceTabsUntilTab(Pi,this),this.close()},()=>{d(!1)})}),Object(l.b)(r,e=>{d(!0);const t=Object(ee.f)(r);Ci.a.resendPasswordEmail().then(e=>{t.remove(),d(!1)})}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Mi(this.isFirst)&&this.codeInputField.input.focus()}}class Pi extends H{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new zn({caption:!0,noDelimiter:!0}),t=ys.a.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?Fs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💌"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.inputField=new O.b({name:"recovery-email",label:"RecoveryEmail",plainText:!0});a.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),h()}),a.input.addEventListener("input",e=>{a.input.classList.remove("error")});const o=Object(B.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=()=>{new Li(this.slider).open()},h=()=>{const e=a.value.trim(),t=X.b.matchEmail(e);if(!t||t[0].length!==e.length)return void a.input.classList.add("error");p(!0);const s=Object(ee.f)(o);Ci.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then(e=>{d()},t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const s=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],i=new Ei(this.slider);i.state=this.state,i.email=e,i.length=s,i.open()}else console.log("password set error",t);p(!1),s.remove()})};Object(l.b)(o,h);const p=e=>{e?(o.setAttribute("disabled","true"),r.setAttribute("disabled","true")):(o.removeAttribute("disabled"),r.removeAttribute("disabled"))};Object(l.b)(r,e=>{new St("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),Object(ee.f)(r),Ci.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then(()=>{d()},e=>{p(!1)})},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Mi(this.isFirst)&&this.inputField.input.focus()}}var Ti=s(117),ki=s(107),xi=s(130);class Ai extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new zn({noDelimiter:!0}),t=ys.a.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?Fs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💡"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=document.createElement("div");i.classList.add("input-wrapper");const n=this.inputField=new O.b({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});n.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),n.value?d():h()});const a=(e,t)=>{e&&Object(c.a)(e);const s=t?n.value:void 0;if(s&&this.newPassword===s)return void gt(k.default.format("PasswordAsHintError",!0));const i=new Pi(this.slider);i.state=this.state,i.plainPassword=this.plainPassword,i.newPassword=this.newPassword,i.hint=s,i.open()},o=Object(B.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=e=>a(e,!0),h=e=>a(e,!1);Object(l.b)(o,d),Object(l.b)(r,h),i.append(n.container,o,r),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class Oi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new zn({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new ki.a({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new xi.a(s,157),n=Object(B.a)("btn-primary btn-color-primary",{text:"Continue"});t.append(s.container,n),e.content.append(i.container,t),this.scrollable.container.append(e.container),s.input.addEventListener("keypress",e=>{if(s.input.classList.contains("error")&&s.setState(O.a.Neutral),"Enter"===e.key)return o()});const a=()=>this.newPassword===s.value||(s.setError(),!1),o=e=>{if(e&&Object(c.a)(e),!a())return;const t=new Ai(this.slider);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return Object(l.b)(n,o),i.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class _i extends H{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new zn({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new ki.a({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?X.b.wrapEmojiText(this.state.hint):void 0}),n=new Ti.a(i,157),a=Object(B.a)("btn-primary btn-color-primary"),o=new k.default.IntlElement({key:"Continue"});a.append(o.element),s.append(i.container,a),t.content.append(n.container,s),this.scrollable.container.append(t.container),i.input.addEventListener("keypress",e=>{if(i.input.classList.contains("error")&&(i.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()});const r=()=>!!i.value.length||(i.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&Object(c.a)(e),!r())return;const t=new Oi(this.slider);t.state=this.state,t.newPassword=i.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),Ci.a.getState().then(e=>{this.state=e,this.state.hint?i.label.innerHTML=X.b.wrapEmojiText(this.state.hint):Object(T.a)(i.label,Object(k.i18n)("LoginPassword"))}));d=s=>{if(!r())return void Object(c.a)(s);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const l=Object(ee.f)(a),d=i.value;Ci.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new Fi(this.slider);t.state=this.state,t.plainPassword=d,t.open(),this.slider.removeTabFromHistory(this)}},e=>{a.removeAttribute("disabled"),i.input.classList.add("error"),e.type,o.key="TwoStepAuth.InvalidPassword",o.update(),l.remove(),i.select(),t()})},t()}return Object(l.b)(a,d),n.load()}onOpenAfterTimeout(){Mi(this.isFirst)&&this.passwordInputField.input.focus()}}class Fi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new zn({caption:!0,noDelimiter:!0}),t=ys.a.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?Fs({doc:t,div:s,loop:!1,play:!0,width:168,height:168,emoji:"🔐"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement();if(this.state.pFlags.has_password){Object(k._i18n)(e.caption,"TwoStepAuth.GenericHelp");const t=Object(B.a)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=Object(B.a)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=Object(B.a)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});Object(l.b)(t,()=>{const e=new _i(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new St("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{Ci.a.updateSettings({currentPassword:this.plainPassword}).then(()=>{this.slider.sliceTabsUntilTab(On,this),this.close()})},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()}),Object(l.b)(n,()=>{const e=new Pi(this.slider);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()}),i.append(t,s,n)}else{Object(k._i18n)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=Object(B.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),Object(l.b)(s,e=>{const t=new _i(this.slider);t.state=this.state,t.open()})}this.scrollable.container.append(e.container)}}class Di extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new wi({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class ji extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new wi({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[mi.Nobody]})}}class Ri extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new wi({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class Bi extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new wi({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[mi.Nobody]})}}class Ui extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new wi({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new wi({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Ni extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new rt({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:Object(ne.c)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const s=document.createElement("div");return s.classList.add("row-midtitle"),s.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(s,t.subtitle),t},t=this.authorizations.slice();{const n=new zn({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=t.findAndSplice(e=>e.pFlags.current),o=e(a);if(n.content.append(o.container),t.length){const e=Object(B.a)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});Object(l.b)(e,t=>{new St("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(Ct.a)([e],!0);vt.a.invokeApi("auth.resetAuthorizations").then(t=>{e.remove(),s.container.remove()},i).finally(()=>{t()})}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const s=new zn({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach(t=>{s.content.append(e(t).container)}),this.scrollable.append(s.container);const i=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&>(k.default.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new St("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{vt.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&n.remove()},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Ie([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),Object(ee.a)(this.scrollable.container,e=>{n=Object(Pe.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(ee.e)(e,o),Object(ee.d)(o))}),Object(l.b)(this.scrollable.container,e=>{n=Object(Pe.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()})}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Hi extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");{const e=new zn({caption:"BlockedUsersInfo"});this.scrollable.append(e.container)}const e=$({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,e=>{new Ft({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{E.a.toggleBlock(e,!0)}})},{listenerSetter:this.listenerSetter});const t=Pc.createChatList();this.scrollable.container.classList.add("chatlist-container"),this.scrollable.append(t);const s=(e,s)=>{const{dom:i}=Pc.addDialogNew({dialog:e,container:t,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:s}),n=E.a.getUser(e);n.pFlags.bot?i.lastMessageSpan.append("@"+n.username):n.phone?i.lastMessageSpan.innerHTML=E.a.formatUserPhone(n.phone):i.lastMessageSpan.append(n.username?"@"+n.username:E.a.getUserStatusString(e))};for(const e of this.peerIds)s(e,!0);let i;const n=this.menuElement=Ie([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=i.dataset.peerId.toPeerId();E.a.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);n.id="blocked-users-contextmenu",n.classList.add("contextmenu"),document.getElementById("page-chats").append(n),Object(ee.a)(this.scrollable.container,e=>{i=Object(It.a)(e.target,"LI"),i&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(ee.e)(e,n),Object(ee.d)(n))},this.listenerSetter),this.listenerSetter.add(a.default)("peer_block",e=>{const{peerId:i,blocked:n}=e,a=t.querySelector(`[data-peer-id="${i}"]`);n?a||s(i,!1):a&&a.remove()});let o=!1;this.scrollable.onScrolledBottom=()=>{o||(o=!0,E.a.getBlocked(t.childElementCount,50).then(e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||t.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()}).finally(()=>{o=!1}))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var zi=s(134);function Vi(e){return e="input"+(e=e[0].toUpperCase()+e.slice(1))}class Ki extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");{const e=new zn({noDelimiter:!0,caption:"SessionsInfo"});let t;const s=new rt({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:"Loading",clickable:()=>{const e=new Hi(this.slider);e.peerIds=t,e.open()}});let i;s.freezed=!0;const n=new rt({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new _i(this.slider):i.email_unconfirmed_pattern?(t=new Ei(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,Ci.a.resendPasswordEmail()):t=new Fi(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new rt({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:"Loading",clickable:()=>{const e=new Ni(this.slider);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",()=>{this.updateActiveSessions()},{once:!0}),e.open()}});o.freezed=!0,e.content.append(s.container,n.container,o.container),this.scrollable.append(e.container);const r=e=>{e?Object(T.a)(s.subtitle,Object(k.i18n)("PrivacySettingsController.UserCount",[e])):Object(T.a)(s.subtitle,Object(k.i18n)("BlockedEmpty",[e]))};this.listenerSetter.add(a.default)("peer_block",()=>{l()});const l=()=>{E.a.getBlocked().then(e=>{s.freezed=!1,r(e.count),t=e.peerIds})};l(),Ci.a.getState().then(e=>{i=e,Object(T.a)(n.subtitle,Object(k.i18n)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),n.freezed=!1}),this.updateActiveSessions()}{const e=new zn({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new rt({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new Si(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new rt({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new Di(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new rt({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new ji(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new rt({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Ui(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new rt({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new Ri(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new rt({titleLangKey:"WhoCanAddMe",subtitleLangKey:"Loading",clickable:()=>{new Bi(this.slider).open()}}),c=e=>{const s=t[e];s&&yi.getPrivacy(e).then(e=>{const t=yi.getPrivacyRulesDetails(e),i=t.type===mi.Everybody?"PrivacySettingsController.Everbody":t.type===mi.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=t.disallowPeers.users.length+t.disallowPeers.chats.length,a=t.allowPeers.users.length+t.allowPeers.chats.length;s.subtitle.innerHTML="";const o=Object(k.i18n)(i);s.subtitle.append(o),(n||a)&&s.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)})};e.content.append(s.container,i.container,n.container,o.container,r.container,l.container),this.scrollable.append(e.container);for(const e in t)c(e);a.default.addEventListener("privacy_update",e=>{c(Vi(e.key._))})}const e=[];{const t=new zn({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(vt.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new rt({checkboxField:new wt.a({text:"PrivacyAndSecurity.SensitiveText",checked:s}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});t.content.append(i.container),t.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",()=>{const e=i.checkboxField.checked;e!==s&&vt.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new zn({name:"FilterChats"}),t=()=>{new St("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(Ct.a)([s],!0);zi.a.clearAllDrafts().then(()=>{e()})},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},s=Object(B.a)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(s)("click",t),e.content.append(s),this.scrollable.append(e.container)}return Promise.all(e)}updateActiveSessions(){vt.a.invokeApi("account.getAuthorizations").then(e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,Object(k._i18n)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])})}}function Gi(e){const t=e.getContext("2d"),s=new Array(4).fill(0),i=t.getImageData(0,0,e.width,e.height).data;for(let e=0;e.5?i/(2-n-a):i/(n+a),n){case e:o=(t-s)/i+(t1&&(s-=1),s<1/6?e+6*(t-e)*s:s<.5?t:s<2/3?e+(t-e)*(2/3-s)*6:e},r=s<.5?s*(1+t):s+t-s*t,l=2*s-r;n=i(l,r,e+1/3),a=i(l,r,e),o=i(l,r,e-1/3)}return[Math.round(255*n),Math.round(255*a),Math.round(255*o),Math.round(255*i)]}function $i(e){const t=[],s="#"===e[0]?1:0;if(e.length===5+s&&(e=(s?"#":"")+"0"+e.slice(s)),e.length===3+s)for(let i=s;i("0"+e.toString(16)).slice(-2)).join("")}function Xi(e){return Yi(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map(e=>e.endsWith("%")?+e.slice(0,-1):+e);return qi(i[0],i[1],i[2],s)}(e))}function Ji(e){let{h:t,s:s,l:i}=Wi(e[0],e[1],e[2]);s>0&&(s=Math.min(100,s+5+.1*(100-s))),i=Math.max(0,.65*i);return`hsla(${t}, ${s}%, ${i}%, .4)`}class Zi{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{let e=this._scrollDelta/this._scrollTails;if(this._scrollDelta%=this._scrollTails,e=e>0?Math.floor(e):Math.ceil(e),e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}this._onWheelRAF=void 0},this.drawNextPositionAnimated=()=>{const e=this._frames,t=e.shift();t&&this.drawImageData(t);const s=e.length;return s||(this._animatingToNextPosition=void 0),!!s};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,s=this._curve.length;t{var i;return e-(null!==(i=s[t-1])&&void 0!==i?i:0)})}hexToRgb(e){const t=Qi(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();for(;e>0;)t.push(t.shift()),--e;const s=[];for(let e=0;e({x:(e.x-i[s].x)/t,y:(e.y-i[s].y)/t}));return s.map(e=>n.map((t,s)=>({x:i[s].x+t.x*e,y:i[s].y+t.y*e})))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),s=t.data;let i=0;for(let t=0;tthis.hexToRgb(e)),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d")),this._canvas=e,this._ctx=this._canvas.getContext("2d"),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(){var e;if(this._colors.length<2)return;const t=this._tail,s=this._tails;let i;const n=[];for(let a=0,o=this._incrementalCurve.length;as&&void 0===i&&(i=a,r%=s),n.push(r)}[n.slice(0,i),void 0!==i?n.slice(i):[]].forEach((e,t,i)=>{const n=e[e.length-1];if(void 0!==n&&n>s&&(e[e.length-1]=+n.toFixed(2)),this._tail=null!=n?n:0,!e.length)return;const a=this.getNextPositions(this._phase,s,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=a.map(e=>this.getGradientImageData(e));this._frames.push(...o)}),this._animatingToNextPosition=!0,Object(Ne.a)(this.drawNextPositionAnimated)}scrollAnimate(e){this._colors.length<2&&e||(e&&!this._addedScrollListener?(document.addEventListener("wheel",this.onWheel),this._addedScrollListener=!0):!e&&this._addedScrollListener&&(document.removeEventListener("wheel",this.onWheel),this._addedScrollListener=!1))}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),s=new Zi;return s.init(t),{gradientRenderer:s,canvas:t}}}class en{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(en.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new O.b({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new O.b({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=en.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),s=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(s?O.a.Neutral:O.a.Error),e="#"+e,this.hexInputField.setValueSilently(e),s&&this.setColor(e,!1,!0)});const s=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",()=>{const e=this.rgbInputField.value.match(s);this.rgbInputField.setState(e?O.a.Neutral:O.a.Error),e&&this.setColor(Wi(+e[1],+e[2],+e[3]),!0,!1)}),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){we(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){we(this.elements.hue,()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()},e=>{this.hueHandler(e.x)},()=>{this.onGrabEnd()})}setColor(e,t=!0,s=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=function(e){const t=$i(e);return Wi(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=Wi(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const i=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+i,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,s)}getCurrentColor(){const e=qi(this.hue,this.saturation,this.lightness,this.alpha),t=Yi(e),s=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:s,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const s=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",s.hex),e&&(this.hexInputField.setValueSilently(s.hex),this.hexInputField.setState(O.a.Neutral)),t&&(this.rgbInputField.setValueSilently(s.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(O.a.Neutral)),this.onChange&&this.onChange(s)}hueHandler(e,t=!0){const s=Object(Se.a)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*s);const i=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*s+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",i),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",i),t&&this.updatePicker()}saturationHandler(e,t,s=!0){const i=this.boxRect.width,n=this.boxRect.height,a=Object(Se.a)(e-this.boxRect.left,0,i)/i*100,o=Object(Se.a)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=Object(Se.a)(a,0,100),c=100-l/2,d=100-Object(Se.a)(o,0,100),h=Object(Se.a)(d/100*c,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}en.BASE_CLASS="color-picker";class tn extends H{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=$i(e),s=this.theme.background,i=Ji(t);s.id="2",s.intensity=0,s.slug="",s.color=e.toLowerCase(),s.highlightningColor=i,M.default.pushToState("settings",a.default.settings),Jl.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=a.default.getTheme();const e=new zn({});this.colorPicker=new en,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new zn({}),s=this.grid=document.createElement("div");s.classList.add("grid");["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach(e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const i=document.createElement("div");i.classList.add("grid-item-media"),i.style.backgroundColor=e,t.append(i),s.append(t)}),Object(l.b)(s,e=>{const t=Object(Pe.a)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const s=t.dataset.color;s&&this.applyColor(s)},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container),this.applyColor=Object(Ms.a)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,s=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}onOpen(){setTimeout(()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],s=!!t&&!e.slug;s&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),s||(this.colorPicker.onChange=this.onColorChange)},0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}let sn=0;class nn extends H{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallpapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{Object(pe.f)("image/x-png,image/png,image/jpeg").then(e=>{const t="wallpaper-upload-"+ ++sn,s={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let i={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[s],file_name:e.name};i=L.a.saveDoc(i);const n=ce.a.getCacheContext(i);n.downloaded=e.size,n.url=URL.createObjectURL(e);let a={_:"wallPaper",access_hash:"",document:i,id:t,slug:t,pFlags:{}};const o=ce.a.upload(e,e.name),r=Object(ie.a)();r.addNotifyListener=o.addNotifyListener,r.cancel=o.cancel,o.then(t=>{vt.a.invokeApi("account.uploadWallPaper",{file:t,mime_type:e.type,settings:{_:"wallPaperSettings"}}).then(e=>{const t=e.document,s=ce.a.getCacheContext(t);Object.assign(s,n),a=e,a.document=L.a.saveDoc(a.document),this.setBackgroundDocument(a).then(r.resolve,r.reject)},r.reject)},r.reject);const l=this.getWallpaperKey(a);r.then(()=>{this.clicked.delete(l)},e=>{d.remove()});const c=new ye.a({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),d=this.addWallPaper(a,!1);this.clicked.add(l),c.attach(d,!1,r)})},this.onResetClick=()=>{const e=M.STATE_INIT.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(ue.a)(e.background),M.default.pushToState("settings",a.default.settings),Jl.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Pe.a)(e.target,"grid-item");if(!t)return;const s=this.wallpapersByElement.get(t);if("wallPaperNoFile"===s._)return void this.setBackgroundDocument(s);const i=this.getWallpaperKey(s);if(this.clicked.has(i))return;this.clicked.add(i);const n=s.document,a=new ye.a({cancelable:!0,tryAgainOnFail:!1}),o=()=>{const e=this.setBackgroundDocument(s);ce.a.getCacheContext(n).url&&!this.theme.background.blur||a.attach(t,!0,e)};a.construct(),Object(l.b)(t,e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()},{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then(t=>{ce.a.cacheStorage.save("backgrounds/"+e,t)})},this.setBackgroundDocument=e=>{let t=++this.tempId;const s=()=>t===this.tempId,i=e.document,n=Object(ie.a)();let o;return i?(o=L.a.downloadDoc(i,Jl.chat.bubbles?Jl.chat.bubbles.lazyLoadQueue.queueId:0),n.addNotifyListener=o.addNotifyListener,n.cancel=o.cancel):o=Promise.resolve(),o.then(()=>{if(!s())return void n.resolve();const t=this.theme.background,o=i=>{let o;if(i&&!this.theme.background.color)o=function(e){const t=document.createElement("img");return new Promise(s=>{Object(vs.a)(t,e,()=>{const e=document.createElement("canvas"),i=t.naturalWidth/t.naturalHeight;1===i?(e.width=50,e.height=e.width/i):i>1?(e.height=50,e.width=e.height/i):e.width=e.height=50;e.getContext("2d").drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height),s(Gi(e))})})}(i);else{const{canvas:t}=Zi.create(this.getColorsFromWallpaper(e));o=Promise.resolve(Gi(t))}o.then(o=>{var r,l,c;if(!s())return void n.resolve();const d=Ji(Array.from(o)),h=null!==(r=e.slug)&&void 0!==r?r:"";t.id=e.id,t.intensity=null!==(c=null===(l=e.settings)||void 0===l?void 0:l.intensity)&&void 0!==c?c:0,t.color=this.getColorsFromWallpaper(e),t.slug=h,t.highlightningColor=d,M.default.pushToState("settings",a.default.settings),h&&this.saveToCache(h,i),Jl.applyCurrentTheme(h,i,!0).then(n.resolve)})};if(!i)return void o();const r=ce.a.getCacheContext(i);t.blur?setTimeout(()=>{Object(Cs.a)(r.url,12,4).then(e=>{s()?o(e):n.resolve()})},200):o(r.url)}),n},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallpaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground"),this.theme=a.default.getTheme();{const e=Vn(this.scrollable),s=Object(B.a)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=Object(B.a)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),n=Object(B.a)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});Object(l.b)(s,this.onUploadClick,{listenerSetter:this.listenerSetter}),Object(l.b)(i,()=>{new tn(this.slider).open()},{listenerSetter:this.listenerSetter}),Object(l.b)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new wt.a({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(o.input)("change",()=>{this.theme.background.blur=o.input.checked,M.default.pushToState("settings",a.default.settings),setTimeout(()=>{const e=t.querySelector(".active");if(!e)return;const s=this.wallpapersByElement.get(e);s.pFlags.pattern||"wallPaperNoFile"===s._||this.setBackgroundDocument(s)},100)}),e.append(s,i,n,o.label)}a.default.addEventListener("background_change",this.setActive),vt.a.invokeApiHashable({method:"account.getWallPapers"}).then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=Vn(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),Object(l.b)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallpaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map(e=>"#"+e.toString(16)).join(","):""}getWallpaperKey(e){return""+e.id}getWallpaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){var s;const i=this.getColorsFromWallpaper(e),n="wallPaper"===e._;if(n&&e.pFlags.pattern&&!i)return;const a=!!e.pFlags.dark,o=n?e.document=L.a.saveDoc(e.document):void 0,l=document.createElement("div");l.classList.add("grid-item"),l.dataset.id=""+e.id;const c=this.getWallpaperKey(e);this.wallpapersByElement.set(l,e),this.elementsByKey.set(c,l);const d=document.createElement("div");let h,p;if(d.classList.add("grid-item-media"),n?(p=r.a.choosePhotoSize(o,200,200),h=As({photo:o,message:null,container:d,withoutPreloader:!0,size:p,noFadeIn:e.pFlags.pattern}),(h.loadPromises.thumb||h.loadPromises.full).then(()=>{fs.a.mutate(()=>{l.append(d)})}),e.pFlags.pattern&&(d.classList.add("is-pattern"),a?(h.images.full.style.display="none",h.images.thumb&&(h.images.thumb.style.display="none")):(null===(s=e.settings)||void 0===s?void 0:s.intensity)&&(h.images.full.style.opacity=""+Math.abs(e.settings.intensity)/100))):l.append(d),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Zi.create(i);if(t.classList.add("background-colors-canvas"),a&&n){const s=ce.a.getCacheContext(o,p.type);h.loadPromises.full.then(()=>{t.style.webkitMaskImage=`url(${s.url})`,t.style.opacity=""+Math.abs(e.settings.intensity)/100,d.append(t)})}else d.append(t)}return this.getWallpaperKeyFromTheme(this.theme)===c&&l.classList.add("active"),this.grid[t?"append":"prepend"](l),l}}class an extends yt.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Pe.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;Jl.chat.input.sendMessageWithDocument(s)?this.hide():console.warn("got no doc by id:",s)},this.h6=document.createElement("h6"),this.h6.append(Object(k.i18n)("Loading")),this.header.append(this.h6),this.addEventListener("close",()=>{I.a.setOnlyOnePlayableGroup("")});const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),Object(l.b)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),Object(ee.f)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const s=Object(B.a)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(s),this.body.append(t);new P.b(this.body);this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return ys.a.getStickerSet(this.stickerSetInput).then(e=>{if(!e)return mt({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,I.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),this.h6.innerHTML=X.a.wrapEmojiText(e.set.title),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=Object(B.a)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append(Object(k.i18n)("RemoveStickersCount",[Object(k.i18n)("Stickers",[e.set.count])]))):(t=Object(B.a)("btn-primary btn-color-primary",{noRipple:!0}),t.append(Object(k.i18n)("AddStickersCount",[Object(k.i18n)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),Object(l.b)(t,()=>{const e=Object(Ct.a)([t],!0);ys.a.toggleStickerSet(this.set).then(()=>{this.hide()}).catch(()=>{e()})});const s=new Z.d;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const i=b.b.active.esgSticker.width;Fs({doc:t,div:e,lazyLoadQueue:s,group:"STICKERS-POPUP",play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}})}}var on,rn=s(2);function ln(e,t=!0){return function(e,t,s=!0){const i=e;let n;return s||(e=Fe.a),function s(){e(),n=rn.a.setTimeout(s,t())}(),e=i,()=>{clearTimeout(n)}}(e,()=>1e3*(60-(new Date).getSeconds()),t)}var cn=!!(null===(on=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===on?void 0:on.getCurrentPosition)&&!1;class dn extends H{init(){return this.header.classList.add("with-border"),this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([Nt.a.getQuickReaction(),Nt.a.getAvailableReactions()]).then(([e,t])=>{t=t.filter(e=>!e.pFlags.inactive);const s=new zn,i=t.map(t=>{const s=new pt({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),i=new rt({radioField:s,havePadding:!0});return s.main.classList.add("quick-reaction-title"),js({row:i,doc:t.static_icon,size:"small"}),t===e&&s.setValueSilently(!0),i}),n=lt(i,e=>{Nt.a.setDefaultReaction(e)});s.content.append(n),this.scrollable.append(s.container)})}}class hn{constructor(e,t,s,i,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const l=document.createElement("div");l.classList.add(o+"-name"),Object(k._i18n)(l,e);const c=this.valueContainer=document.createElement("div");c.classList.add(o+"-value"),a&&(c.innerHTML=""+s),r.append(l,c),this.range=new Ce({step:t,min:i,max:n},s),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(c.innerText=""+e)}}),this.container.append(r,this.range.container)}}class pn extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=Vn.bind(null,this.scrollable);{const t=e("Settings"),s=new hn("TextSize",1,a.default.settings.messagesTextSize,12,20);s.onChange=e=>{M.default.setByKey("settings.messagesTextSize",e)};const i=Object(B.a)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});Object(l.b)(i,()=>{new nn(this.slider).open()});const n=new wt.a({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(s.container,i,n.label)}{const t=e("General.Keyboard"),s=document.createElement("form"),i="send-shortcut",n="settings.sendShortcut",a=new rt({radioField:new pt({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new rt({radioField:new pt({name:i,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});Object(k._i18n)(o.radioField.main,"General.SendShortcut.CtrlEnter",[ae.IS_APPLE?"⌘":"Ctrl"]),s.append(a.container,o.container),t.append(s)}if(cn){const t=e("DistanceUnitsTitle"),s=document.createElement("form"),i="distance-unit",n="settings.distanceUnit",a=new rt({radioField:new pt({langKey:"DistanceUnitsKilometers",name:i,value:"kilometers",stateKey:n})}),o=new rt({radioField:new pt({langKey:"DistanceUnitsMiles",name:i,value:"miles",stateKey:n})});s.append(a.container,o.container),t.append(s)}{const t=e("General.TimeFormat"),s=document.createElement("form"),i="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map(([e,t])=>new rt({radioField:new pt({langKey:t,name:i,value:e,stateKey:n})})),r=ln(()=>{const e=new Date;a.forEach(([t],s)=>{const i=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[s].subtitle.textContent=i})});this.eventListener.addEventListener("destroy",r),s.append(...o.map(e=>e.container)),t.append(s)}{const t=e("Emoji"),s=new wt.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new wt.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const e=new zn({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new rt({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{new dn(this.slider).open()}}),s=()=>{Promise.resolve(Nt.a.getQuickReaction()).then(e=>{js({row:t,doc:e.static_icon,size:"small"})})};s(),this.listenerSetter.add(a.default)("quick_reaction",s);const i=new wt.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),n=new wt.a({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),o={},r=e.generateContentElement(),l=new Z.d,c=(e,t="append")=>{const s=new rt({title:X.b.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new an({id:e.id,access_hash:e.access_hash}).show()}});o[e.id]=s;const i=document.createElement("div");i.classList.add("row-media"),Ds({set:e,container:i,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),s.container.append(i),r[t](s.container)};ys.a.getAllStickers().then(e=>{Object(Is.a)(e);for(const t of e.sets)c(t)}),this.listenerSetter.add(a.default)("stickers_installed",e=>{const t=e;o[t.id]||c(t,"prepend")}),this.listenerSetter.add(a.default)("stickers_deleted",e=>{const t=e;o[t.id]&&(o[t.id].container.remove(),delete o[t.id])}),e.content.append(t.container,i.label,n.label),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}var un=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class gn extends H{init(){return un(this,void 0,void 0,(function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=Vn(this.scrollable,void 0,"Bio.Description"),s=document.createElement("div");s.classList.add("input-wrapper"),this.firstNameInputField=new O.b({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new O.b({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new O.b({label:"EditProfile.BioLabel",name:"bio",maxLength:70}),s.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const i=document.createElement("div");i.classList.add("caption"),Object(k.i18n_)({element:i,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new at({peerId:a.default.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,s)}{const t=new zn({name:"EditAccount.Username",caption:!0}),s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new ft({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"}),s.append(this.usernameInputField.container);const i=t.caption;i.append(Object(k.i18n)("UsernameSettings.ChangeDescription")),i.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append(Object(k.i18n)("UsernameHelpLink",[a])),i.append(n),e.push(this.usernameInputField),t.content.append(s),this.scrollable.append(t.container)}Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(n.default.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then(()=>{this.close()},e=>{console.error("updateProfile error:",e)})),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>n.default.uploadProfilePhoto(e))),this.usernameInputField.isValidToChange()&&e.push(E.a.updateUsername(this.usernameInputField.value)),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter});const t=E.a.getSelf(),s=yield n.default.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(s.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()}))}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var mn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class bn extends H{constructor(){super(...arguments),this.renderResults=e=>mn(this,void 0,void 0,(function*(){yield E.a.getContacts(),e.forEach(e=>{const{dom:t}=Pc.addDialogNew({dialog:e,container:this.selector.scrollable,drawStatus:!1,rippleEnabled:!0,avatarSize:46}),s=this.selector.selected.has(e);t.containerEl.append(this.checkbox(s));const i=[];this.dialogsByFilters.forEach((t,s)=>{if(t.has(e)){const e=document.createElement("span");e.innerHTML=X.b.wrapEmojiText(s.title),i.push(e)}});Object(k.join)(i,!1).forEach(e=>{t.lastMessageSpan.append(e)})})})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=U("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",()=>{const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const s of e)s.isPeerId()?t.push(s.toPeerId()):this.filter.pFlags[s]=!0;let s;s="included"===this.type?e=>t.includes(e):e=>!t.includes(e),Object(f.a)(this.filter.pinnedPeerIds,(e,t)=>{s(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))});const i="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";Object(f.a)(this.filter[i],(e,s)=>{t.includes(e)&&(this.filter[i].splice(s,1),this.filter[n].splice(s,1))}),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=t.map(e=>o.a.getInputPeerById(e)),this.editFolderTab.setFilter(this.filter,!1),this.close()}),this.dialogsByFilters=new Map,i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.dialogsByFilters.set(t,new Set(i.a.dialogsStorage.getFolderDialogs(t.id).map(e=>e.peerId)))})}checkbox(e){const t=new wt.a({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new zn({noDelimiter:!0,name:"FilterChatTypes"});let s;t.container.classList.add("folder-categories"),s="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const i=document.createDocumentFragment();for(const e in s){const t=Object(B.a)("btn-primary btn-transparent folder-category-button",{icon:s[e].ico,text:s[e].text});t.dataset.peerId=e,t.append(this.checkbox()),i.append(t)}t.content.append(i);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new Ot({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats"}),this.selector.selected=new Set(n);let a=!1;const o=this.selector.add.bind(this.selector);this.selector.add=(e,t,i)=>{if(this.selector.selected.size>=100&&a&&!s[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout(()=>{t.checked=!1},0);return void gt(k.default.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=o(e,s[e]?Object(k.i18n)(s[e].text):void 0,i);return s[e]&&n.querySelector("avatar-element").classList.add("tgico-"+s[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const i in e.pFlags)s.hasOwnProperty(i)&&e.pFlags[i]&&t.content.querySelector(`[data-peer-id="${i}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,s){return this.originalFilter=e,this.filter=Object(ue.a)(this.originalFilter),this.type=t,this.editFolderTab=s,super.open()}}class vn extends H{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append(Object(k.i18n)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=U("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new St("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),i.a.filtersStorage.updateDialogFilter(this.filter,!0).then(e=>{e&&this.close()}).finally(()=>{e.element.removeAttribute("disabled")})},isDanger:!0}]}).show()}};this.menuBtn=Ee({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new zn({}),s=document.createElement("div");s.classList.add("input-wrapper"),this.nameInputField=new O.b({label:"FilterNameHint",maxLength:12}),s.append(this.nameInputField.container),t.content.append(s);const n=(e,t,s,i)=>{const n=new zn({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),s.forEach(e=>{const t=Object(B.a)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(i[e.name]=t),a.append(t)}),n};this.includePeerIds=n("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=n("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),o=this.excludePeerIds.container.querySelector(".folder-categories");a.querySelector(".btn").addEventListener("click",()=>{new bn(this.slider).open(this.filter,"included",this)}),o.querySelector(".btn").addEventListener("click",()=>{new bn(this.slider).open(this.filter,"excluded",this)}),this.confirmBtn.addEventListener("click",()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(a.children).slice(1).reduce((e,t)=>e+ +!t.style.display,0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?i.a.filtersStorage.updateDialogFilter(this.filter):i.a.filtersStorage.createDialogFilter(this.filter),e.then(e=>{e&&this.close()}).catch(e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?gt("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):gt("Please choose at least one chat for this folder.")}),this.nameInputField.input.addEventListener("input",()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()});const r="edit"===this.type?[i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=oe.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then(e=>(this.animation=e,oe.a.waitForFirstFrame(e))),...r])}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=X.b.wrapDraftText(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach(t=>{const s=this[t],i=Pc.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20)),o.append(Object(k.i18n)("FilterShowMoreChats",[n.length])),e.append(o)}a(4)})}editCheckForChange(){if("edit"===this.type){const e=!Object(ge.a)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach(e=>e.remove()),t?(this.originalFilter=e,this.filter=Object(ue.a)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then(()=>{"edit"===this.type?this.onEditOpen():this.onCreateOpen()})}}var fn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class yn extends H{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,s){let n,a,r="",c=[];if("dialogFilterSuggested"===e._)n=e.filter,r=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&c.push(Object(k.i18n)(t))}if(!c.length){const e=i.a.dialogsStorage.getFolderDialogs(n.id);let t=0,s=0,a=0;for(const i of e)o.a.isAnyGroup(i.peerId)?a++:o.a.isBroadcast(i.peerId)?s++:t++;t&&c.push(Object(k.i18n)("Chats",[t])),s&&c.push(Object(k.i18n)("Channels",[s])),a&&c.push(Object(k.i18n)("Groups",[a]))}}if(s)s.subtitle.textContent="",Object(k.join)(c).forEach(e=>{s.subtitle.append(e)});else if(s=new rt({title:X.a.wrapEmojiText(n.title),subtitle:r,clickable:!0}),c.length&&Object(k.join)(c).forEach(e=>{s.subtitle.append(e)}),"dialogFilter"===e._){const e=n.id;this.filtersRendered.hasOwnProperty(n.id)||Object(l.b)(s.container,()=>{new vn(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?Vs(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return fn(this,void 0,void 0,(function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),Object(k.i18n_)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=Object(B.a)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new zn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new zn({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),Object(l.b)(this.createFolderBtn,()=>{Object.keys(this.filtersRendered).length>=10?gt("Sorry, you can't create more folders."):new vn(this.slider).open()},{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.renderFolder(t,this.foldersSection.content);t()}),this.listenerSetter.add(a.default)("filter_update",e=>{this.filtersRendered.hasOwnProperty(e.id)?this.renderFolder(e,null,this.filtersRendered[e.id]):this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()}),this.listenerSetter.add(a.default)("filter_delete",e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()}),this.listenerSetter.add(a.default)("filter_order",e=>{e.forEach((e,t)=>{const s=this.filtersRendered[e].container;Vs(s,s.parentElement,t+1)})}),this.loadAnimationPromise=oe.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then(e=>(this.animation=e,oe.a.waitForFirstFrame(e))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}getSuggestedFilters(){return vt.a.invokeApi("messages.getSuggestedDialogFilters").then(e=>{this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach(e=>e.remove()),e.forEach(e=>{const t=this.renderFolder(e),s=Object(B.a)("btn-primary btn-color-primary",{text:"Add"});t.append(s),this.suggestedSection.content.append(t),Object(l.b)(s,n=>{if(Object(c.a)(n),Object.keys(this.filtersRendered).length>=10)return void gt("Sorry, you can't create more folders.");s.setAttribute("disabled","true");const a=e.filter;a.includePeerIds=[],a.excludePeerIds=[],a.pinnedPeerIds=[],i.a.filtersStorage.createDialogFilter(a,!0).then(e=>{e&&t.remove()}).finally(()=>{s.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter})})})}}class wn extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new zn({name:e.name}),s=new rt({checkboxField:new wt.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new rt({checkboxField:new wt.a({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Gt.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=Gt.a.isMuted(t);return s.checkboxField.checked=!e,i.checkboxField.checked=t.show_previews,e};o(),this.eventListener.addEventListener("destroy",()=>{const e=!s.checkboxField.checked,a=i.checkboxField.checked;if(e===Gt.a.isMuted(t)&&a===t.show_previews)return;const o=Object(ue.a)(t);o._="inputPeerNotifySettings",o.mute_until=e?2147483647:0,o.show_previews=a,Gt.a.updateNotifySettings(n,o)},{once:!0}),this.listenerSetter.add(a.default)("notify_settings",s=>{const i=Vi(s.peer._);e.inputKey===i&&(t=s.notify_settings,o())})})};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new zn({name:"NotificationsOther"}),t=new rt({checkboxField:new wt.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new rt({checkboxField:new wt.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});M.default.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),Gt.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&Gt.a.setContactSignUpNotification(!s)},{once:!0})})}}}var Sn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Cn extends H{init(){return Sn(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new zn({}),t=new Map,s=vt.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(dt.b)();s.forEach(e=>{const s=new rt({radioField:new pt({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=lt([...t.values()],e=>{k.default.getLangPack(e)});k.default.getCacheLangPack().then(e=>{const s=t.get(e.lang_code);s?s.radioField.setValueSilently(!0):console.error("no row",s,e)}),e.content.append(n)});return this.scrollable.append(e.container),s}))}}function Ln(e){return new Promise((t,s)=>{const{button:i,checkbox:n}=e;i.callback=e=>{t(e?!!e.size:void 0)};const a=Object(yt.a)([i]);a.find(e=>e.isCancel).callback=()=>{s()},e.buttons=a,e.checkboxes=n&&[n],new St("popup-confirmation",e).show()})}function In(e,t){const s=new zn({name:t}),i="settings.autoDownload."+e+".",n=new wt.a({text:"AutodownloadContacts",name:"contacts",stateKey:i+"contacts",withRipple:!0}),a=new wt.a({text:"AutodownloadPrivateChats",name:"private",stateKey:i+"private",withRipple:!0}),o=new wt.a({text:"AutodownloadGroupChats",name:"groups",stateKey:i+"groups",withRipple:!0}),r=new wt.a({text:"AutodownloadChannels",name:"channels",stateKey:i+"channels",withRipple:!0});return s.content.append(n.label,a.label,o.label,r.label),s}class Mn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=In("photo","AutoDownloadPhotosTitle");this.scrollable.append(e.container)}}class En extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=bt(e=>{M.default.setByKey("settings.autoDownloadNew.file_size_max",e)},200,!1,!0),t=In("file","AutoDownloadFilesTitle"),s=a.default.settings.autoDownloadNew.file_size_max,i=Math.sqrt(Math.sqrt((s-524288)/20447232)),n=new k.default.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[Ue(s)]}),o=new hn("AutoDownloadMaxFileSize",.01,i,0,1,!1);o.onChange=t=>{const s=20447232*Math.pow(t,4)+524288|0;n.compareAndUpdate({args:[Ue(s)]}),e(s)},o.valueContainer.append(n.element),t.content.append(o.container),this.scrollable.append(t.container)}}class Pn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=In("video","AutoDownloadVideosTitle");this.scrollable.append(e.container)}}var Tn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const kn={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class xn extends z{init(){return Tn(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new zn({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield M.default.getState(),s=new wt.a({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),i=()=>{Object(Ct.a)([h],Object(ge.a)(t.settings.autoDownload,M.STATE_INIT.settings.autoDownload)&&Object(ge.a)(t.settings.autoDownloadNew,M.STATE_INIT.settings.autoDownloadNew))},n=()=>{this.setAutoDownloadSubtitle(r,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(d,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},o=e=>{const t=new e(this.slider,!0);t.open(),this.listenerSetter.add(t.eventListener)("destroy",()=>{n(),i()},{once:!0})},r=new rt({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{o(Mn)}}),c=new rt({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{o(Pn)}}),d=new rt({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{o(En)}}),h=Object(B.a)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});Object(l.b)(h,()=>{Ln({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then(()=>{a.default.settings.autoDownloadNew=Object(ue.a)(M.STATE_INIT.settings.autoDownloadNew),a.default.settings.autoDownload=Object(ue.a)(M.STATE_INIT.settings.autoDownload),M.default.pushToState("settings",a.default.settings),a.default.dispatchEvent("settings_updated",{key:"settings",value:a.default.settings}),n(),s.checked=!t.settings.autoDownloadNew.pFlags.disabled})});const p=()=>{const e=!s.checked,t=a.default.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[r,c,d].forEach(t=>{t.container.classList.toggle("is-disabled",e)}),M.default.pushToState("settings",t),a.default.dispatchEvent("settings_updated",{key:"settings",value:t}),i()};s.input.addEventListener("change",p),p(),n(),e.content.append(s.label,r.container,c.container,d.container,h),this.scrollable.append(e.container)}{const e=new zn({name:"AutoplayMedia"}),t=new wt.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),s=new wt.a({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});e.content.append(t.label,s.label),this.scrollable.append(e.container)}}))}setAutoDownloadSubtitle(e,t,s){let i,n=[];const a=Object.keys(t),o=a.map(e=>t[e]?kn[e]:void 0).filter(Boolean);if(o.length&&0!==s){const e=o.length===a.length;if(void 0!==s?(i=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push(Ue(s))):i=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...Object(k.join)(o.map(e=>Object(k.i18n)(e)),!0,!1)),n.push(e)}}else i="AutoDownloadOff";Object(T.a)(e.subtitle,Object(k.i18n)(i,n))}}var An=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class On extends H{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=Ee({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new St("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{vt.a.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=U("edit"),this.header.append(this.buttons.edit,e),this.profile=new ns(this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(a.default.myId),this.profile.fillProfileElements();const t=Object(B.a)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});t.addEventListener("click",()=>{const e=document.createElement("canvas");(new W.a).open(e,e=>{e().then(e=>n.default.uploadProfilePhoto(e))})}),this.profile.element.lastElementChild.firstElementChild.append(t);const s=()=>{var e;const s=E.a.getSelf();t.classList.toggle("hide","userProfilePhoto"!==(null===(e=s.photo)||void 0===e?void 0:e._))};s(),this.listenerSetter.add(a.default)("avatar_update",e=>{a.default.myId===e&&s()});const i=document.createElement("div");i.classList.add("profile-buttons");const o=[["unmute","AccountSettings.Notifications",wn],["data","DataSettings",xn],["lock","AccountSettings.PrivacyAndSecurity",Ki],["settings","Telegram.GeneralSettingsViewController",pn],["folder","AccountSettings.Filters",yn]].map(([e,t,s])=>new rt({titleLangKey:t,icon:e,clickable:()=>{new s(this.slider,!0).open()}}));o.push(this.devicesRow=new rt({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>An(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=new Ni(this.slider);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",()=>{this.authorizations=void 0,this.updateActiveSessions(!0)},{once:!0}),e.open()}))}),this.languageRow=new rt({titleLangKey:"AccountSettings.Language",titleRightSecondary:Object(k.i18n)("LanguageName"),icon:"language",clickable:()=>{new Cn(this.slider).open()}})),i.append(...o.map(e=>e.container));const r=new zn;r.content.append(i),this.scrollable.append(this.profile.element,r.container),this.buttons.edit.addEventListener("click",()=>{new gn(this.slider).open()}),oe.a.loadLottieWorkers(),this.updateActiveSessions()}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=vt.a.invokeApi("account.getAuthorizations").finally(()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)});return t}updateActiveSessions(e){return this.getAuthorizations(e).then(e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length})}}class _n extends H{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new zn({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new O.b({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new O.b({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const s=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",s),this.channelDescriptionInputField.input.addEventListener("input",s),this.nextBtn=$({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,G.a.createChannel({title:e,about:t,broadcast:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),qn.removeTabFromHistory(this),new qt(this.slider).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>G.a.inviteToChannel(e,t)})})}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var Fn=s(121);class Dn extends yt.b{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),Object(k._i18n)(this.title,"AddContactTitle"),Object(l.b)(this.btnConfirm,()=>{const e=E.a.importContact(s.value,i.value,n.value);e.then(()=>{this.hide()},e=>{"NO_USER"===e.type&&(mt({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)}),c.lockWithPromise(e)},{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const s=new O.b({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),i=new O.b({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Fn.a({required:!0});e.push(s,i,n);const a=()=>{const e=s.value+" "+i.value;c.avatarElem.setAttribute("peer-title",e),c.avatarElem.update()};this.listenerSetter.add(s.input)("input",a),this.listenerSetter.add(i.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=E.a.getSelf(),r=Object(Xs.a)(o.phone);r.code&&(n.value="+"+r.code.country_code);const c=new at({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(s.container,i.container,c.avatarElem),this.container.append(t,n.container),this.show()}}class jn extends H{init(){this.container.id="contacts-container";const e=$({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new Dn},{listenerSetter:this.listenerSetter}),this.inputSearch=new _("Search",e=>{this.openContacts(e)}),this.listenerSetter.add(a.default)("contacts_update",e=>{const t=E.a.isContact(e),s=e.toPeerId();t?this.sortedUserList.add(s):this.sortedUserList.delete(s)}),this.title.replaceWith(this.inputSearch.container),this.middleware=Object(Hs.a)()}createList(){const e=new qs,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),Pc.setListClickListener(t,()=>{this.close()},void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!ae.IS_MOBILE&&Mi(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",E.a.getContactsPeerIds(e,void 0,"online").then(e=>{if(!t())return;const s=this.sortedUserList=this.createList();let i=()=>{const t=kt.a.height/72*1.25|0;e.splice(0,t).forEach(e=>{s.add(e)}),e.length||(i=void 0,this.scrollable.onScrolledBottom=null)};i(),this.scrollable.onScrolledBottom=()=>{i?i():this.scrollable.onScrolledBottom=null},Object(T.a)(this.scrollable.container,s.list)})}open(){return this.openContacts(),super.open()}}class Rn extends H{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!Pc.sortedLists[Rn.filterId]){const e=Pc.createChatList();Pc.generateScrollable(e,Rn.filterId).container.append(e),Pc.setListClickListener(e,null,!0)}const e=Pc.scrollables[Rn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=Pc.filterId,Pc.setFilterId(Rn.filterId),Pc.onTabChange()}onOpenAfterTimeout(){Pc.sortedLists[this.wasFilterId].clear()}onClose(){Pc.setFilterId(this.wasFilterId),Pc.onTabChange()}onCloseAfterTimeout(){return Pc.sortedLists[Rn.filterId].clear(),super.onCloseAfterTimeout()}}Rn.filterId=1;class Bn extends H{constructor(){super(...arguments),this.isLocationWatched=!1}init(){this.container.classList.add("people-nearby-container"),this.setTitle("PeopleNearby"),this.errorCategory=document.createElement("div"),this.errorCategory.classList.add("text","hide","nearby-error"),this.retryBtn=$({icon:"check"});const e=ys.a.getAnimatedEmojiSticker("🧭"),t=document.createElement("div");t.classList.add("sticker-container"),e?Fs({doc:e,div:t,loop:!1,play:!0,width:86,height:86,emoji:"🧭",needUpscale:!0}).then(()=>{}):t.classList.add("media-sticker-wrapper");const s=document.createElement("div");s.classList.add("caption"),Object(k._i18n)(s,"PeopleNearbyInfo2"),this.locatedPeers=new Map;const i=()=>{const e=new qs({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onUpdate:e=>{const t=this.locatedPeers.get(e.id),s=[this.parseDistance(t.distance)];e.id.isUser()||s.push(n.default.getChatMembersString(e.id.toChatId())),e.dom.lastMessageSpan.textContent="",e.dom.lastMessageSpan.append(...Object(k.join)(s,!1))},getIndex:e=>2147483647-this.locatedPeers.get(e.id).distance});return Pc.setListClickListener(e.list,void 0,void 0,!1),e},a=this.peopleSection=new Gn({name:"PeopleNearbyHeader",sortedList:i()}),o=this.chatsSection=new Gn({name:"ChatsNearbyHeader",sortedList:i()}),r=a.makeButton({text:"MakeMyselfVisible",icon:"location"}),c=a.makeButton({text:"StopShowingMe",icon:"location"}),d=o.makeButton({text:"NearbyCreateGroup",icon:"newgroup"});Object(l.b)(r,()=>{Ln({titleLangKey:"MakeMyselfVisibleTitle",descriptionLangKey:"MakeMyselfVisibleInfo",button:{langKey:"OK"}}).then(()=>{this.startWatching()})},{listenerSetter:this.listenerSetter}),Object(l.b)(c,()=>{this.stopWatching()},{listenerSetter:this.listenerSetter}),Object(l.b)(d,()=>{new Q(this.slider).open([],!0)},{listenerSetter:this.listenerSetter}),r.classList.add("primary"),c.classList.add("danger"),d.classList.add("primary"),this.content.append(this.retryBtn),this.scrollable.append(t,s,a.container,o.container,this.errorCategory)}parseDistance(e){return"miles"===a.default.settings.distanceUnit?e>1609.34?Object(k.i18n)("MilesAway",[Math.round(e/1609)]):Object(k.i18n)("FootsAway",[Math.round(3.281*e)]):e>=1e3?Object(k.i18n)("KMetersAway2",[e/1e3]):Object(k.i18n)("MetersAway2",[e])}open(){const e=super.open();return e.then(()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition(e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),E.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then(e=>{const t=e.updates[0].peers,s=t.sort((e,t)=>e.distance-t.distance),i=t.filter(e=>"peerChannel"==e.peer._).length,n=t.filter(e=>"peerChannel"!=e.peer._).length;null==s||s.forEach(e=>{const t=o.a.getPeerId(e.peer),s=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),s.sortedList.add(t)}),this.errorCategory.classList.toggle("hide",!(!n&&!i)),this.errorCategory.innerHTML="No groups or channels found around you."})},e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."})}),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,gt("Your position is now being shared. Do not close the page or it will be suspended."),E.a.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition(e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,s=e.coords.latitude!==this.latestLocationSaved.latitude,i=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(s||t)&&i&&(E.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})}))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,gt("The sharing of your position has been stopped. You will no longer be visible to other users."),E.a.getLocated(0,0,0,!1,0))}calculateDistance(e,t,s,i){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((s-e)*n)+Math.cos(e*n)*Math.cos(s*n)*(1-Math.cos((i-t)*n)/2)))}}var Un=s(7),Nn=s(74);function Hn(e,t=2){if(0===e)return"0";const s=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,i)).toFixed(s))+["","K","M","B","T"][i]}class zn{constructor(e={}){const t=this.container=document.createElement("div");t.classList.add("sidebar-left-section-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add("sidebar-left-section"),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append(Kn()),s.classList.add("with-fake-delimiter");else if(e.noDelimiter)s.classList.add("no-delimiter");else{const e=document.createElement("hr");s.append(e)}const i=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2","sidebar-left-section-name"),Object(k.i18n_)({element:t,key:e.name,args:e.nameArgs}),i.append(t)}if(t.append(s),e.caption){const s=this.caption=this.generateContentElement();s.classList.add("sidebar-left-section-caption"),t.append(s),!0!==e.caption&&Object(k.i18n_)({element:s,key:e.caption})}}generateContentElement(){const e=document.createElement("div");return e.classList.add("sidebar-left-section-content"),this.innerContainer.append(e),e}}const Vn=(e,t,s)=>{const i=new zn({name:t,caption:s});return e.append(i.container),i.content},Kn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e};class Gn extends zn{constructor(e){super(e),this.sortedList=e.sortedList,this.content.append(this.sortedList.list)}makeButton(e){const t=Object(B.a)("folder-category-button btn btn-primary btn-transparent",e);return this.title?this.content.insertBefore(t,this.title.nextSibling):this.content.prepend(t),t}}const Wn=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new _("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new jn(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new Rn(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new wt.a({toggle:!0,checked:"night"===a.default.getTheme().name});n.input.addEventListener("change",()=>{a.default.settings.theme=n.input.checked?"night":"day",M.default.pushToState("settings",a.default.settings),a.default.dispatchEvent("theme_change")}),a.default.addEventListener("theme_change",()=>{n.setValueSilently("night"===a.default.getTheme().name)});const o=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout(()=>{Jl.setPeer({peerId:Jl.myId})},0)}},s,{icon:"user",text:"Contacts",onClick:t},cn?{icon:"group",text:"PeopleNearby",onClick:()=>{new Bn(this).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{new On(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new wt.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{Jl.openUsername({userName:"TelegramTips"})}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout(()=>{e.remove()},0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([Nn.a.set({kz_version:"Z"}),Nn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>Un.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Nn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>Un.a.isMainDomain}].filter(Boolean);this.toolsBtn=Ee({},"bottom-right",o,e=>{o.forEach(e=>{e.verify&&e.element.classList.toggle("hide",!e.verify())})}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const r=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(l.a,e=>{e.stopPropagation(),Object(ee.c)()});const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+Un.a.suffix+" "+Un.a.versionFull,c.append(d),r.classList.add("has-footer"),r.append(c),this.newBtnMenu=Ee({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new _n(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new qt(this).open({type:"chat",skippable:!1,takeOut:e=>{new Q(this).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:t}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",e.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",Object(te.ripple)(this.updateBtn),this.updateBtn.append(Object(k.i18n)("Update")),Object(l.b)(this.updateBtn,()=>{location.reload()}),e.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",()=>this.initSearch(),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",s.element.append(this.archivedCount),a.default.addEventListener("folder_unread",e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+Hn(t,1),this.archivedCount.classList.toggle("hide",!t)}}),E.a.getTopPeers("correspondents"),M.default.getState().then(e=>{const t=e.recentSearch||[];for(let e=0,s=t.length;e{fetch("version",{cache:"no-cache"}).then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e!==Un.a.versionFull&&(this.hasUpdate=!0,clearInterval(s),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))}).catch(Fe.a)},18e5)})}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new P.b(e),s=()=>{this.backBtn.click()};this.searchGroups={contacts:new x("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,s),globalContacts:new x("GlobalSearch","contacts",void 0,void 0,void 0,void 0,s),messages:new x("SearchMessages","messages"),people:new x(!1,"contacts",!0,"search-group-people",!0,!1,s),recent:new x("Recent","contacts",!0,"search-group-recent",!0,!0,s)};const n=this.searchSuper=new gi({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0});e.prepend(n.nav.parentElement.parentElement),t.container.append(n.container);n.setQuery({peerId:"".toPeerId(),folderId:0}),n.selectTab(0),n.load(!0);let a=[],o="".toPeerId(),r=0,l=0;const c=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},d=document.createElement("div");d.classList.add("search-helper"),d.addEventListener("click",e=>{const t=Object(Pe.a)(e.target,"selector-user");if(!t)return;const s=t.dataset.key;if(0===s.indexOf("date_")){const[e,t,i]=s.split("_");r=+t,l=+i}else o=s.toPeerId();t.addEventListener("click",()=>{p(t)}),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),c()}),n.nav.parentElement.append(d);const h=(e,t)=>{const s=document.createElement("div");s.classList.add("selector-user");const i=document.createElement("avatar-element");return i.classList.add("selector-user-avatar","tgico"),i.setAttribute("dialog","1"),i.classList.add("avatar-30"),s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Tt.a({peerId:e.toPeerId()}).element),i.setAttribute("peer",""+e)):i.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?s.innerHTML=t:(Object(T.a)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",i),s},p=e=>{0===e.dataset.key.indexOf("date_")?r=l=0:o="".toPeerId(),e.remove(),Object(V.a)(a,e),setTimeout(()=>{c(),this.inputSearch.onChange(this.inputSearch.value)},0)};this.inputSearch.onClear=()=>{a.forEach(e=>{p(e)})},this.inputSearch.onChange=e=>{if(n.cleanupHTML(),n.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:r,maxDate:l}),n.load(!0),d.innerHTML="",n.nav.classList.remove("hide"),!o&&e.trim()){const t=n.middleware.get();Promise.all([i.a.getConversations(e).promise.then(({dialogs:e})=>e.map(e=>e.peerId)),E.a.getContactsPeerIds(e,!0)]).then(e=>{if(!t())return;new Set(e[0].concat(e[1])).forEach(e=>{d.append(h(e))}),n.nav.classList.toggle("hide",!!d.innerHTML)})}if(!r&&e.trim()){const t=[];Object(ne.b)(e,t),t.forEach(e=>{d.append(h("date_"+e.minDate+"_"+e.maxDate,e.title))}),n.nav.classList.toggle("hide",!!d.innerHTML)}},n.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",e=>{const t=Object(It.a)(e.target,"LI");if(!t)return;const s=Object(Pe.a)(t,"search-group");if(!s||s.classList.contains("search-group-recent")||s.classList.contains("search-group-people"))return;const i=t.getAttribute("data-peer-id").toPeerId();M.default.getState().then(e=>{const t=e.recentSearch||[];if(t[0]!==i){Object(V.a)(t,i),t.unshift(i),t.length>20&&(t.length=20),M.default.pushToState("recentSearch",t);for(const e of t)M.default.requestPeer(e,"recentSearch")}})},{capture:!0});let u=document.createElement("div");u.classList.add("search-group-scrollable"),u.append(this.searchGroups.people.list),this.searchGroups.people.container.append(u);new P.a(u);let g,m=!0;const b=Object(F.a)(e.parentElement,"zoom-fade",150,e=>{g&&clearTimeout(g),0!==e||m||(n.selectTab(0,!1),this.inputSearch.onClearClick(),g=window.setTimeout(()=>{g=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")},150)),m=!1});b(0);const v=()=>{this.toolsBtn.classList.remove("is-visible"),this.backBtn.classList.add("is-visible"),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0),ae.IS_MOBILE_SAFARI||D.a.findItemByType("global-search")||D.a.pushItem({onPop:()=>{s()},type:"global-search"}),b(1)};this.inputSearch.input.addEventListener("focus",v),v(),this.backBtn.addEventListener("click",e=>{this.toolsBtn.classList.add("is-visible"),this.backBtn.classList.remove("is-visible"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),D.a.removeByType("global-search"),b(0)});const f=U("close");this.searchGroups.recent.nameEl.append(f),f.addEventListener("click",()=>{Ln({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then(()=>{M.default.getState().then(e=>{this.searchGroups.recent.clear();const t=e.recentSearch||[];for(const e of t)M.default.releaseSinglePeer(e,"recentSearch");t.length=0,M.default.pushToState("recentSearch",t)})})})}};le.a.appSidebarLeft=Wn;var qn=Wn;class $n{constructor(e){this.chat=e,this.bubbles=[],this.detailsMap=new Map,this.groups=[],this.newGroupDiff=121}removeBubble(e){const t=this.detailsMap.get(e);t&&(t.group.length&&(t.group.findAndSplice(t=>t.bubble===e),t.group.length?this.updateGroup(t.group):Object(V.a)(this.groups,t.group)),this.detailsMap.delete(e))}changeBubbleMid(e,t){const s=this.detailsMap.get(e);s&&(s.mid=t)}addBubble(e,t,s){const i=t.date,n=t.mid;let o,r=t.viaBotId||t.fromId;r===a.default.myId&&t.peerId===a.default.myId&&t.fwdFromId===r&&(r=r.toPeerId(!0)),this.removeBubble(e);const l={bubble:e,mid:n,timestamp:i};if(this.bubbles.length){let e,t=-1;for(let e=0;es.mid)break}if(-1!==t&&(e=this.bubbles[t]),e){o=e.group;let t=0,s=0;for(;tt.mid===e);t&&this.updateGroup(t.group)}cleanup(){this.bubbles=[],this.groups=[],this.detailsMap.clear()}}class Qn extends yt.b{constructor(e,t,s={}){if(super("popup-date-picker",s.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},s)),this.onPick=t,this.options=s,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const s=+t.dataset.timestamp;this.selectedDate=new Date(s),this.setTitle(),this.setTimeTitle()},this.minDate=s.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&i&&i(+o[1]),o="0"+o[0]),t.setValueSilently(o),s(o.length)})};this.hoursInputField=new O.b({plainText:!0}),this.minutesInputField=new O.b({plainText:!0}),s(23,this.hoursInputField,e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()},e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)}),s(59,this.minutesInputField,e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()}),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),Object(l.b)(this.btnConfirm,()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()},{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const i=document.createElement("div");i.classList.add("popup-centerer"),i.append(this.container),this.element.append(i),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=s.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),s.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const s=new Date;s.setHours(0,0,0,0);const i={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===s.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const i={month:"short",day:"numeric"};n.getFullYear()!==s.getFullYear()&&(i.year="numeric"),t.push(new k.default.IntlDateElement({date:n,options:i}).element)}t.push(new k.default.IntlDateElement({date:n,options:i}).element),this.btnConfirm.firstChild.replaceWith(Object(k.i18n)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new k.default.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const s=document.createElement("button");return s.classList.add("btn-icon","date-picker-month-date"),e&&s.setAttribute("disabled","true"),t&&s.append(t),s}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&b.b.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new k.default.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const s=new Date,i=s.getDay();1!==i&&s.setHours(-24*(i-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new k.default.IntlDateElement({date:s,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),s.setDate(s.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{for(const t of e){const e=t.boundingClientRect,s=t.target.parentElement,i=t.rootBounds;e.bottom=i.top&&e.bottom{let t=e.filter(e=>e.boundingClientRect.top<0).sort((e,t)=>e.boundingClientRect.top-t.boundingClientRect.top)[0];if(!t)return;let s=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,s)},{root:this.container})}addSentinel(e,t){const s=document.createElement("div");return s.classList.add("sticky_sentinel",t),e.appendChild(s)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}class Xn{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add("stacked-avatars"),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const s=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach((e,i)=>{let n=s[i];n||(n=document.createElement("div"),n.classList.add("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new hc,a.setAttribute("dialog","0"),a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),a.lazyLoadQueue=this.lazyLoadQueue,a.loadPromises=t),a.setAttribute("peer",""+e),a.parentNode||n.append(a),n.parentNode||this.container.append(n)}),Array.from(s).slice(e.length).forEach(e=>e.remove())}}class Jn extends HTMLElement{constructor(){super(),this.classList.add("reaction")}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e){this.type=e,this.classList.add("reaction-"+e)}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("reaction-sticker"),this.append(this.stickerContainer));const s=this.reactionCount;if(!e&&!t){const e=Nt.a.getReaction(s.reaction);Object(Qt.a)(e,e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive");const s="inline"===this.type?14:22,i=this.wrapStickerPromise=Fs({div:this.stickerContainer,doc:null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon,width:s,height:s,static:!0}).finally(()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)})})}}renderCounter(){var e;const t=this.reactionCount,s="inline"===this.type?2:4;if(t.count>=s||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add("reaction-counter"));const e=Hn(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new Xn({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map(e=>o.a.getPeerId(e.peer_id)))))}setIsChosen(e=!!this.reactionCount.pFlags.chosen){if("inline"===this.type)return;(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&Object(cs.a)(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){Object(Qt.a)(Nt.a.getReaction(this.reactionCount.reaction),e=>{const t="inline"===this.type?28:40,s=document.createElement("div");s.classList.add("reaction-sticker-activate"),Promise.all([Fs({div:s,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1}),_s({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1}).stickerPromise]).then(([e,t])=>{const i=()=>{Object(je.b)(()=>{e.remove(),s.remove(),this.stickerContainer.classList.remove("has-animation")})};e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then(()=>{setTimeout(i,1e3)}):i())}),e.addEventListener("firstFrame",()=>{this.stickerContainer.append(s),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()},{once:!0})})})}}customElements.define("reaction-element",Jn);const Zn=new Map;class ea extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[]}connectedCallback(){let e=Zn.get(this.key);e||Zn.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=Zn.get(this.key);e.delete(this),e.size||Zn.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,s){void 0!==this.key&&this.disconnectedCallback(),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add("reactions-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.isPlaceholder)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,s=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!s),!s&&!this.sorted.length)return;const i=Nt.a.getAvailableReactions(),n=s?i instanceof Promise?t.results:t.results.filter(e=>Nt.a.isReactionActive(e.reaction)):[];Object(f.a)(this.sorted,(e,t,s)=>{const i=e.reactionCount.reaction;n.some(e=>e.reaction===i)||(s.splice(t,1),e.remove())});const a=n.reduce((e,t)=>e+t.count,0),o=t&&!!t.pFlags.can_see_list&&a<4;if(this.sorted=n.map((e,s)=>{const i=this.sorted.findIndex(t=>t.reactionCount.reaction===e.reaction);let n=-1!==i&&this.sorted[i];n||(n=new Jn,n.init(this.type)),Vs(n,this,s);const a=t.recent_reactions?t.recent_reactions.filter(t=>t.reaction===e.reaction):[];return n.reactionCount=Object.assign({},e),n.setCanRenderAvatars(o),n.render(this.isPlaceholder),n.renderCounter(),n.renderAvatars(a),n.setIsChosen(),n}),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===a.default.peerId&&e.forEach(e=>{const t=this.sorted.find(t=>t.reactionCount.reaction===e.reaction);t&&t.fireAroundAnimation()})}}customElements.define("reactions-element",ea);a.default.addEventListener("replies_updated",e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach(t=>{t.message=e,t.render()})});class ta extends HTMLElement{constructor(){super(),this.updated=!1}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new Xn({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map(e=>o.a.getPeerId(e)),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new k.default.IntlElement);const s=this.text;if(e?e.replies?s.compareAndUpdate({key:"Comments",args:[e.replies]}):s.compareAndUpdate({key:"LeaveAComment"}):s.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?Hn(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(i.a.subscribeRepliesThread(this.message.peerId,this.message.mid),i.a.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",ta);const sa=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(k._i18n)(e,"EditedMessage"),e},ia=()=>Object(k.i18n)("SponsoredMessage");var na,aa;(aa=na||(na={})).setTime=e=>{var t;const{chatType:s,message:n}=e,a=new Date(1e3*n.date),o=[];let r,l,c,d;const h=!!n.pFlags.sponsored,p=!("action"in n)&&!h;let u,g=h?void 0:Object(ne.f)(a);if(p){if(n.views){const e=n.post_author||(null===(t=n.fwd_from)||void 0===t?void 0:t.post_author),s=document.createElement("span");s.classList.add("post-views"),s.innerHTML=Hn(n.views,1);const i=document.createElement("i");if(i.classList.add("tgico-channelviews","time-icon"),o.push(s,i),e){const t=document.createElement("span");t.innerHTML=X.b.wrapEmojiText(e)+", ",o.push(t)}}if(n.edit_date&&"scheduled"!==s&&!n.pFlags.edit_hide&&o.unshift(r=sa()),"pinned"!==s&&n.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),o.unshift(e)}"peerUser"===n.peer_id._&&(u=!0,d=i.a.getGroupsFirstMessage(n),c=new ea,c.init(d,"inline",!0),c.render(),o.unshift(c))}else h&&o.push(l=ia());g&&o.push(g);let m=h?void 0:Object(ne.g)(a);p&&(m+=(n.edit_date&&!n.pFlags.edit_hide?"\nEdited: "+Object(ne.g)(new Date(1e3*n.edit_date)):"")+(n.fwd_from?"\nOriginal: "+Object(ne.g)(new Date(1e3*n.fwd_from.date)):""));const b=document.createElement("span");b.classList.add("time","tgico"),b.append(...o);const v=document.createElement("div");v.classList.add("inner","tgico"),m&&(v.title=m);let f=o;if(r&&(f[f.indexOf(r)]=sa()),l&&(f[f.indexOf(l)]=ia()),c){const e=f[f.indexOf(c)]=new ea;e.init(d,"inline"),e.render()}return f=f.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e),g&&(f[f.length-1]=Object(ne.f)(a)),v.append(...f),b.append(v),b},aa.renderReplies=({bubble:e,bubbleContainer:t,message:s,messageDiv:i,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ta;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},aa.setReply=({chat:e,bubble:t,bubbleContainer:s,message:i})=>{const n=!s;n&&(s=t.querySelector(".bubble-content"));const a=n?s.querySelector(".reply"):null;if(!i.reply_to_mid)return a&&a.remove(),void t.classList.remove("is-reply");const o=i.reply_to.reply_to_peer_id?e.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):e.peerId;let r,l=e.appMessagesManager.getMessageByPeer(o,i.reply_to_mid);"messageEmpty"===l._?(e.appMessagesManager.wrapSingleMessage(o,i.reply_to_mid),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:i.reply_to_mid,mid:i.mid}),r=Object(k.i18n)("Loading")):r=new Tt.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=Rs(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var oa=s(146);function ra(e,t,s){const i=e.getBoundingClientRect(),n="center"===s?Math.ceil(i.left+(i.right-i.left)/2+1):Math.ceil(i.left+1),a="bottom"===t?Math.floor(i.top+i.height-1):Math.ceil(i.top+1);return document.elementFromPoint(n,a)}function la(e){e.style.display="none",e.offsetLeft,e.style.display=""}le.a.getElementByPoint=ra;var ca=s(80),da=s(84),ha=s(139),pa=s(132),ua=s(89);const ga={keywords:{},version:0,langCode:Un.a.langPackCode};class ma{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=Un.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=ua.a.get(s).then(t=>(Object(da.a)(t)||(t={}),Object(ha.a)(ga,t),t.langCode=e,this.keywordLangPacks[e]=t,vt.a.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then(e=>{t.version=e.version;const i=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return k.default.lastRequestedLangCode!==Un.a.langPackCode&&e.push(this.getEmojiKeywords(k.default.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new pa.a(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const s=t[e];this.index.indexObject(s,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const s=this.index.search(e);t=Array.from(s).reduce((e,t)=>e.concat(t),[])}else t=this.recent.concat(ma.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=M.default.getState().then(e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[])}pushRecentEmoji(e){e=X.b.fixEmoji(e),this.getRecentEmojis().then(t=>{Object(V.a)(t,e),t.unshift(e),t.length>36&&(t.length=36),M.default.pushToState("recentEmoji",t),a.default.dispatchEvent("emoji_recent",e)})}}ma.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const ba=new ma;le.a&&(le.a.appEmojiManager=ba);var va=ba,fa=s(158),ya=s(10);const wa=new Set;function Sa(e,t,s=!1,i=!1){const n=document.createElement("span");let o;if(n.classList.add("super-emoji"),i&&!ya.a?o=X.a.wrapSingleEmoji(e):(e=X.a.fixEmoji(e),o=X.a.wrapEmojiText(e)),n.innerHTML=o,n.children.length>1){const e=n.firstElementChild;n.innerHTML="",n.append(e)}if(n.firstElementChild&&!ya.a){const e=n.firstElementChild,t=e.src;if(!wa.has(t)){e.setAttribute("loading","lazy");const s=document.createElement("span");s.classList.add("emoji-placeholder"),a.default.settings.animationsEnabled&&(e.style.opacity="0",s.style.opacity="1"),e.addEventListener("load",()=>{Object(je.b)(()=>{a.default.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),n.classList.remove("empty"),wa.add(t)})},{once:!0}),n.append(s)}}s?t.prepend(n):t.appendChild(n)}function Ca(e){return Object(Pe.a)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class La{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=Ca(e.target);t&&(Jl.chat.input.onEmojiSelected(t,!1),he.IS_TOUCH_SUPPORTED&&Object(ii.a)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},s=new Map([["Emoji.Recent",[]]]);for(const t in fa.a.Emoji){const i=""+fa.a.Emoji[t],n=e[+i[0]-1];if(!n)continue;let a=s.get(n);a||(a=[],s.set(n,a)),a[+i.slice(1)||0]=t}s.delete(e.pop()),s.forEach((e,s)=>{const i=document.createElement("div");i.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append(Object(k.i18n)(s));const a=document.createElement("div");a.classList.add("super-emojis"),i.append(n,a),e.forEach(e=>{Sa(Object(se.a)(e),a,!1)}),t[s]=i});const i=this.menu=this.content.previousElementSibling,n=this.scroll=new P.b(this.content,"EMOJI"),o=Object(ee.f)(this.content,!0);Promise.all([Object(ca.a)(200),va.getRecentEmojis().then(e=>{const t=!!e.length,s=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[s].classList.add("active");const a=Ha.menuOnClick(i,n,void 0,s);return this.stickyIntersector=a.stickyIntersector,this.setMenuActive=a.setActive,e})]).then(([s,i])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of i)Sa(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map(e=>{const s=t[e];return s||console.error("no div by category:",e),n.container.append(s),this.stickyIntersector.observeStickyHeaderChanges(s),s})}),this.content.addEventListener("click",this.onContentClick),this.init=null,a.default.addEventListener("emoji_recent",e=>{const t=Array.from(this.recentItemsDiv.children);for(let s=0,i=t.length;s{this.closeScrollTop=this.scroll.scrollTop})}onClose(){}}var Ia=s(141),Ma=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ea{constructor(e,t,s,i=!0){this.element=e,this.group=t,this.scrollable=s,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=Object(ie.a)(),this.timeout=window.setTimeout(()=>{this.timeout=0,this.scrollPromise.resolve()},150)},this.processInvisibleDiv=e=>this.scrollPromise.then(()=>Ma(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),s=e.querySelector("img");if(s&&(s&&s.classList.remove("hide"),yield Object(je.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();I.a.getAnimations(t).forEach(e=>{I.a.checkAnimation(e,!0,!0)})}}))),this.lazyLoadQueue=new Z.c(void 0,(e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)}),i&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){if(e.querySelector("video"))return;this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId,s=L.a.getDoc(t);return this.scrollPromise.then(()=>{const t=ks({doc:s,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0}).loadPromise;return t.finally(()=>{const t=e.querySelector("video");e.style.opacity="";const s=e.querySelector("img");s&&s.classList.add("hide"),t&&!t.parentElement&&setTimeout(()=>{t.src="",t.load();I.a.getAnimations(t).forEach(e=>{I.a.checkAnimation(e,!0,!0)})},0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)}),t})}})}add(e,t=this.element){var s;let i=e.w,n=e.h;n<100&&(i*=100/n,n=100);const a=Math.min(300,400,i),o=Object(Ia.a)(i,n,a,100),r=document.createElement("div");r.classList.add("gif","fade-in-transition"),r.style.width=o.width+"px",r.style.opacity="0",r.dataset.docId=""+e.id,t.append(r),this.lazyLoadQueue.observe(r);const l=L.a.getThumb(e,!1);let c;!!l&&(c=new Image,c.classList.add("media-poster"),l.cacheContext.url||l.promise.then(()=>{c.src=l.cacheContext.url}));const d=()=>{c&&(r.append(c),r.style.opacity="")};(null===(s=null==l?void 0:l.cacheContext)||void 0===s?void 0:s.url)?Object(vs.a)(c,l.cacheContext.url,d):d()}}class Pa{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",Ha.onMediaClick);const t=new P.b(this.content,"GIFS"),s=new Ea(e,Na,t),i=Object(ee.f)(this.content,!0);vt.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=L.a.saveDoc(t),s.add(t)}),i.remove()}),Va.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var Ta=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ka{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{I.a.getAnimations(e).forEach(e=>{t?I.a.checkAnimation(e,!1):I.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=L.a.getDoc(t),i=b.b.active.esgSticker.width,n=Fs({doc:s,div:e,width:i,height:i,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0});return n.then(()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))}),n},this.processInvisibleDiv=e=>{const t=e.dataset.docId,s=L.a.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(s,e)},this.lazyLoadQueue=new Z.b(void 0,(e,t)=>{t||this.processInvisibleDiv(e)})}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,s){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),e.animated&&this.observeAnimatedDiv(t)),Fs({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:s}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class xa{constructor(){this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",s,i){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&(a.innerHTML=t),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:i}),s.then(e=>{e.forEach(e=>{n.append(this.superStickerRenderer.renderSticker(e))}),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach(({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)}),this.queueCategoryPush.length=0)}),{titleDiv:a}}renderStickerSet(e,t=!1){return Ta(this,void 0,void 0,(function*(){const s=document.createElement("div");s.classList.add("sticker-category"),s.dataset.id=""+e.id,s.dataset.access_hash=""+e.access_hash;const i=document.createElement("button");i.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:s,tab:i},t?this.menu.insertBefore(i,this.menu.firstElementChild.nextSibling):this.menu.append(i);const n=ys.a.getStickerSet(e);this.categoryPush(s,X.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;Ds({set:e,container:i,group:Na,lazyLoadQueue:Ha.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new P.a(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),a.default.addEventListener("stickers_installed",e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)}),a.default.addEventListener("stickers_deleted",e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}}),this.stickersDiv.addEventListener("click",e=>{const t=e.target;if(Object(Pe.a)(t,"category-title")){const e=Object(Pt.a)(t,"data-id");new an({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else Ha.onMediaClick(e)});const s=(e=!1)=>{a.default.dispatchEvent("choosing_sticker",!e)};this.scroll=new P.b(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{s()},Va.addEventListener("closed",()=>{s(!0)}),Va.addEventListener("opened",()=>{s()}),this.stickyIntersector=Ha.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(ee.f)(this.content,!0);Promise.all([ys.a.getRecentStickers().then(e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},i.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append(Object(k.i18n)("Stickers.Recent"))}),ys.a.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new ka(Ha.lazyLoadQueue,Na),Va.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(ys.a.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let s=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);s||(s=this.superStickerRenderer.renderSticker(e));const i=this.recentDiv.querySelector(".category-items");i.prepend(s),i.childElementCount>20&&Array.from(i.children).slice(20).forEach(e=>e.remove())}onClose(){}}var Aa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Oa=new class{constructor(){this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,s="",i="",n){return vt.a.invokeApi("messages.getInlineBotResults",{bot:E.a.getUserInput(t),peer:o.a.getInputPeerById(e),query:s,geo_point:n?this.getGeoInput(n):void 0,offset:i},{stopTime:-1,noErrorBox:!0}).then(e=>{const t=e.query_id;return e.results.forEach(e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=L.a.saveDoc(e.document)),e.photo&&(e.photo=r.a.savePhoto(e.photo))),this.inlineResults[this.generateQId(t,e.id)]=e}),e})}generateQId(e,t){return e+"_"+t}pushPopularBot(e){E.a.getTopPeers("bots_inline").then(t=>{const s=e.toPeerId(),i=t.findIndex(e=>e.id===s);let n;n=-1!==i?t[i]:{id:s,rating:0},++n.rating,Object(Ks.a)(t,n,"rating"),M.default.setKeyValueToStorage("topPeersCache")})}switchToPM(e,t,s){return this.setHash[t]={peerId:e,time:Date.now()},a.default.dispatchEvent("history_focus",{peerId:t.toPeerId()}),i.a.startBot(t,void 0,s)}checkSwitchReturn(e){return Aa(this,void 0,void 0,(function*(){const t=E.a.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const s=this.setHash[e];return s&&(delete this.setHash[e],Date.now()-s.time<36e5)?s.peerId:void 0}))}switchInlineQuery(e,t,s,i){a.default.dispatchEvent("history_focus",{peerId:e,threadId:t}),zi.a.setDraft(e,t,"@"+E.a.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return vt.a.invokeApi("messages.getBotCallbackAnswer",{peer:o.a.getInputPeerById(e),msg_id:v.a.getServerMessageId(t),data:s.data},{stopTime:-1,noErrorBox:!0}).then(e=>{"string"==typeof e.message&&e.message.length&>(X.a.wrapRichText(e.message,{noLinks:!0,noLinebreaks:!0}))})}sendInlineResult(e,t,s,n={}){var a;const o=this.inlineResults[s];if(!o)return;this.pushPopularBot(t);const l=s.split("_"),c=l.shift(),d=l.join("_");if(n.viaBotId=t,n.queryId=c,n.resultId=d,o.send_message.reply_markup&&(n.replyMarkup=o.send_message.reply_markup),"botInlineMessageText"===o.send_message._)n.entities=o.send_message.entities,i.a.sendText(e,o.send_message.message,n);else{let t,s="";const l=o.send_message;switch(l._){case"botInlineMessageMediaAuto":if(s=l.message,"botInlineMediaResult"===o._){const{document:e,photo:s}=o;t=e?L.a.getMediaInput(e):r.a.getMediaInput(s)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(l.geo)},n.geoPoint=l.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(l.geo),title:l.title,address:l.address,provider:l.provider,venue_id:l.venue_id,venue_type:l.venue_type},n.geoPoint=l.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:l.phone_number,first_name:l.first_name,last_name:l.last_name,vcard:l.vcard}}t||(t={_:"messageMediaPending",type:o.type,file_name:o.title||(null===(a=o.content)||void 0===a?void 0:a.url)||o.url,size:0,progress:{percent:30,total:0}}),i.a.sendOther(e,t,n)}}};le.a&&(le.a.appInlineBotsManager=Oa);var _a=Oa,Fa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Da extends H{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Pe.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;Jl.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&rs.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new _("SearchGifsTitle",e=>{this.reset(),this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),Object(l.b)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Ea(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",I.a.checkAnimations(void 0,"GIFS-SEARCH"),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return rs.toggleSidebar(!0).then(()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}),e}search(e,t=!0){return Fa(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield E.a.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=_a.getInlineResults(Be.c,this.gifBotPeerId,e,this.nextOffset);const{results:s,next_offset:i}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=i,t&&(this.gifsDiv.innerHTML=""),s.length?s.forEach(e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)}):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}class ja extends H{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new Z.d,this.inputSearch=new _("StickersTab.SearchPlaceholder",e=>{this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),Object(l.b)(this.setsDiv,e=>{const t=Object(Pe.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void Jl.chat.input.sendMessageWithDocument(e)}const s=Object(Pe.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Pe.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),ys.a.getStickerSet({id:i,access_hash:n}).then(e=>{ys.a.toggleStickerSet(e.set).then(t=>{t&&(a.textContent="",a.append(Object(k.i18n)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))}).finally(()=>{a.removeAttribute("disabled")})})):ys.a.getStickerSet({id:i,access_hash:n}).then(e=>{new an(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",I.a.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const s=document.createElement("div");s.classList.add("sticker-set-header");const i=document.createElement("div");i.classList.add("sticker-set-details"),i.innerHTML=`\n
${X.a.wrapEmojiText(e.title)}
\n `;const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append(Object(k.i18n)("Stickers",[e.count])),i.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append(Object(k.i18n)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),s.append(i,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()}),e}renderFeatured(){return ys.a.getFeaturedStickers().then(e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach(e=>{this.renderSet(e.set)})})}filterRendered(e,t){t=t.slice();const s=Array.from(this.setsDiv.children);return Object(f.a)(s,s=>{const i=s.dataset.stickerSet,n=t.findIndex(e=>e.set.id===i);-1!==n?t.splice(n,1):e&&s.dataset.title.toLowerCase().includes(e.toLowerCase())||s.remove()}),I.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?ys.a.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}var Ra=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ba extends j.a{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&Object(ai.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>Ra(this,void 0,void 0,(function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.forceClose=!1,this.dispatchEvent("opened")},he.IS_TOUCH_SUPPORTED?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")},he.IS_TOUCH_SUPPORTED?0:200)})),Object(w.a)(this,e)}attachButtonListener(e,t){let s=!0;he.IS_TOUCH_SUPPORTED?Object(l.b)(e,()=>{s?(s=!1,this.toggle(!0)):this.toggle()},{listenerSetter:t}):t.add(e)("mouseover",i=>{s&&(t.add(e)("mouseout",this.onMouseOut),s=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.toggle(!0)},200)})}init(){he.IS_TOUCH_SUPPORTED||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}var Ua=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Na="emoticons-dropdown";class Ha extends Ba{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(I.a.checkAnimations(!0,Na),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=Jl.chat,s=this.tabsEl.children,n=Array.from(s),a=i.a.canSendToPeer(e,t,"send_stickers");n[2].toggleAttribute("disabled",!a);const o=i.a.canSendToPeer(e,t,"send_gifs");n[3].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||1===Object(zs.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>Ua(this,void 0,void 0,(function*(){he.IS_TOUCH_SUPPORTED&&Object(ii.a)()&&(yield Object(ca.a)(100)),this.element.parentElement!==Jl.chat.input.chatInput&&Jl.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),Ha.lazyLoadQueue.lock(),I.a.lockIntersectionGroup(Na)}))),this.addEventListener("opened",()=>{I.a.unlockIntersectionGroup(Na),Ha.lazyLoadQueue.unlock(),Ha.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{Ha.lazyLoadQueue.lock(),I.a.lockIntersectionGroup(Na),I.a.checkAnimations(!0,Na)}),this.addEventListener("closed",()=>{I.a.unlockIntersectionGroup(Na),Ha.lazyLoadQueue.unlock(),Ha.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new La,this.stickersTab=new xa,this.gifsTab=new Pa,this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=Object(J.a)(this.tabsEl,this.container,this.onSelectTabClick,()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),I.a.checkAnimations(!1,Na)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?rs.isTabExists(ja)||new ja(rs).open():rs.isTabExists(Da)||new Da(rs).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=Jl.chat.input.messageInput;(null===(t=s.lastChild)||void 0===t?void 0:t.tagName)?s.lastElementChild.remove():s.lastChild&&(s.lastChild.textContent.length?s.lastChild.textContent=s.lastChild.textContent.slice(0,-1):s.lastChild.remove());const i=new Event("input",{bubbles:!0,cancelable:!0});Jl.chat.input.messageInput.dispatchEvent(i),Object(c.a)(e)});const e=ae.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),a.default.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",()=>{e.lock()}),this.addEventListener("closed",()=>{const s=e.intersector.getVisible();for(const e of s)t(e);e.intersector.clearVisible()}),this.addEventListener("opened",()=>{e.unlockAndRefresh()})}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===Jl.chat.input.messageInput)return e.getRangeAt(0)}}Ha.lazyLoadQueue=new Z.d,Ha.menuOnClick=(e,t,s,i=0)=>{let n=-1;const a=t=>t!==i&&(e.children[i].classList.remove("active"),e.children[t].classList.add("active"),i=t,!0),o=new Yn(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(zs.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Pe.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(zs.a)(s);if(!a(i))return;const o=(t.splitUp||t.container).children[i].offsetTop+1;t.container.scrollTop=n=o}),{stickyIntersector:o,setActive:a}},Ha.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(It.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(Jl.chat.input.sendMessageWithDocument(i,void 0,t)?(za.container&&(za.forceClose=!0,za.container.classList.add("disable-hover"),za.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const za=new Ha;le.a.emoticonsDropdown=za;var Va=za;var Ka=s(190);var Ga=!("undefined"==typeof RTCPeerConnection||ae.IS_FIREFOX);var Wa=Ga;function qa(e,t,s,i=e.getBoundingClientRect()){const n=t.getBoundingClientRect();let{top:a,right:o,bottom:r,left:l}=n;if(s){const e=t.querySelector(".sticky");if(e){a=e.getBoundingClientRect().bottom}}if(i.top>=r||i.bottom<=a||i.right<=l||i.left>=o)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},d="visualViewport"in window?window.visualViewport:window,h=d.width||d.innerWidth,p=d.height||d.innerHeight;return{rect:{top:i.topo&&o!==h?(c.right=!0,++c.horizontal,o):i.right,bottom:i.bottom>r&&r!==p?(c.bottom=!0,++c.vertical,r):i.bottom,left:i.left{vt.a.invokeApi("messages.importChatInvite",{hash:e}).then(e=>{bi.a.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.default.dispatchEvent("history_focus",{peerId:t})},e=>{"INVITE_REQUEST_SENT"===e.type&&mt({langPackKey:"RequestToJoinSent"})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new hc;s.setAttribute("dialog","0"),s.classList.add("avatar-100"),"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),As({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,Be.c,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=X.b.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=Object(k.i18n)(n?"Subscribers":"Members",[Object(Qa.a)(t.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,i,o),t.pFlags.request_needed){const e=document.createElement("div");Object(k._i18n)(e,n?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT"}($a||($a={}));class Xa{constructor(e,t){this.scrollable=e,this.reverse=t}get container(){return this.scrollable.container}save(){const{scrollTop:e,scrollHeight:t}=this.container;this.previousScrollHeight=t,this.previousScrollHeightMinusTop=this.reverse?t-e:e}restore(e){const{container:t,previousScrollHeightMinusTop:s,scrollable:i}=this;if(void 0!==s){const n=t.scrollHeight;if(n===this.previousScrollHeight)return;const a=this.reverse?n-s:s;t.scrollTop=a,i.lastScrollPosition=a,ae.IS_SAFARI&&e&&la(t)}}}var Ja=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Za=new Set(["messageActionHistoryClear","messageActionChatCreate"]),eo=new Set;Wa&&eo.add("messageActionPhoneCall");let to=void 0,so=0;class io{constructor(e,t,s,i,n,o,r,d,h,p,u,g){if(this.chat=e,this.appMessagesManager=t,this.appStickersManager=s,this.appUsersManager=i,this.appInlineBotsManager=n,this.appPhotosManager=o,this.appPeersManager=r,this.appProfileManager=d,this.appDraftsManager=h,this.appMessagesIdsManager=p,this.appChatsManager=u,this.appReactionsManager=g,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.loadedTopTimes=0,this.loadedBottomTimes=0,this.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRender=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=Object(Hs.a)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.onBubblesMouseMove=e=>{const t=Object(Pe.a)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=Object(Pe.a)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:s,hoverReaction:i}=this;if(e===s)return;if(this.unhoverPrevious(),s=this.hoverBubble=e,i=this.hoverReaction,i)i.dataset.loaded&&this.setHoverVisible(i,!0);else{i=this.hoverReaction=document.createElement("div"),i.classList.add("bubble-hover-reaction");const s=document.createElement("div");s.classList.add("bubble-hover-reaction-sticker"),i.append(s),t.append(i);let n=this.chat.getMessage(+e.dataset.mid);n=this.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware(()=>this.hoverReaction===i);Promise.all([this.appReactionsManager.getAvailableReactionsByMessage(n),Object(ca.a)(400)]).then(([e])=>{const t=e[0];t?Fs({div:s,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:Ql,withThumb:!1,needFadeIn:!1}).then(e=>{Object(Is.a)(e),a()&&(e.addEventListener("firstFrame",()=>{a()&&(i.dataset.loaded="1",this.setHoverVisible(i,!0))},{once:!0}),Object(l.b)(i,e=>{Object(c.a)(e),this.appReactionsManager.sendReaction(n,t.reaction),this.unhoverPrevious()},{listenerSetter:this.listenerSetter}))}):i.remove()})}}else this.unhoverPrevious()},this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>{var t;let s=e.target,i=null;try{i=Object(Pe.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Pe.a)(s,"bubble-content")){if(i.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages){if(this.dateMessages[e].div===i){new Qn(new Date(+e),this.onDatePick).show();break}}return}if(!he.IS_TOUCH_SUPPORTED&&Object(Pe.a)(s,"time"))return void this.chat.selection.toggleByElement(i);if(this.chat.selection.isSelecting&&e.isTrusted){if(i.classList.contains("service")&&void 0===i.dataset.mid)return;return Object(c.a)(e),he.IS_TOUCH_SUPPORTED&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement(Object(Pe.a)(s,"grouped-item")||i)}const n=Object(Pe.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=Object(Pe.a)(s,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);const o=Object(Pe.a)(s,"spoiler");if(o){const t=Object(Pe.a)(o,"message"),s="is-spoiler-visible",i=t.classList.contains(s);i||Object(c.a)(e);const n=200,a=5e3,r=i?0:2;r&&t.classList.add("will-change");const l=t.dataset.spoilerTimeout;return null!==l&&(clearTimeout(+l),delete t.dataset.spoilerTimeout),void Object(cs.a)(t,s,!0,n,()=>{t.dataset.spoilerTimeout=""+window.setTimeout(()=>{Object(cs.a)(t,s,!1,n,()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout})},a)},r)}const r=Object(It.a)(s,"REACTION-ELEMENT");if(r){if(Object(c.a)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,s=t.getReactionCount(r),i=t.getMessage();return void this.appReactionsManager.sendReaction(i,s.reaction)}if(Object(Pe.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Be.d){const t=this.chat.getMessage(e),s=this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id),i=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(s,n,i)}else{const t=this.appMessagesManager.filterMessages(this.chat.getMessage(e),e=>!!e.replies)[0],s=t.replies;s&&this.appMessagesManager.getDiscussionMessage(this.peerId,t.mid).then(e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})})}return}const d=Object(Pe.a)(s,"is-via");if(d){const t=d.querySelector(".peer-title");if(s===t||Object(ai.a)(s,t)){const s=t.innerText+" ";return this.appDraftsManager.setDraft(this.peerId,this.chat.threadId,s),void Object(c.a)(e)}}const h=Object(Pe.a)(s,"peer-title")||Object(It.a)(s,"AVATAR-ELEMENT")||Object(Pt.a)(s,"data-saved-from");if(h&&h!==i){s=h||s;const e=s.dataset.peerId||s.getAttribute("peer"),t=s.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,s]=t.split("_");this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+s})}else{const t=e.toPeerId();t!==Be.c?this.chat.appImManager.setInnerPeer({peerId:t}):gt(k.default.format("HidAccount",!0))}return}if(i.classList.contains("sticker")&&s.parentElement.classList.contains("attachment")){const e=+i.dataset.mid,s=null===(t=this.chat.getMessage(e).media)||void 0===t?void 0:t.document;return void((null==s?void 0:s.stickerSetInput)&&new an(s.stickerSetInput).show())}const p=Object(Pe.a)(s,"document-with-thumb");if("IMG"===s.tagName&&!s.classList.contains("emoji")&&!s.classList.contains("document-thumb")||s.classList.contains("album-item")||"VIDEO"===s.tagName&&!i.classList.contains("round")||p&&!p.querySelector(".preloader-container")){const t=Object(Pe.a)(s,"album-item")||Object(Pe.a)(s,"document-container"),n=+(t||i).dataset.mid,a=this.chat.getMessage(n);if(!a)return void this.log.warn("no message by messageId:",n);const o=(t||i).querySelector(".preloader-container");if(o)return Object(l.d)(o),void Object(c.a)(e);const r="webpage",d=i.classList.contains(r),h=p?e=>sc.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),u=[],g=d?[n]:Object.keys(this.bubbles).map(e=>+e).filter(e=>{const t=this.chat.getMessage(e),s=this.appMessagesManager.getMediaFromMessage(t);return s&&h(s)}).sort((e,t)=>e-t);g.forEach(e=>{let t;if(p)t=".document-container";else{t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img"}const s=Array.from(this.bubbles[e].querySelectorAll(t)),i=new Set;if(p)s.forEach(e=>{u.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})});else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");s.forEach(s=>{if(t&&!Object(Pe.a)(s,"media-container-aspecter"))return;let n=Object(Pe.a)(s,"album-item");const a=n||s.parentElement;i.has(a)||(i.add(a),u.push({element:s,mid:n?+n.dataset.mid:e,peerId:this.peerId}))})}}),u.sort((e,t)=>e.mid-t.mid);let m=u.findIndex(e=>e.mid===n);return le.b&&this.log("open mediaViewer single with ids:",g,m,u),u[m]?((new sc).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:p?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(a,u[m].element,0,!0,u.slice(0,m),u.slice(m+1)),void Object(c.a)(e)):void this.log("no target for media viewer!",s)}if(-1===["IMG","DIV","SPAN"].indexOf(s.tagName)&&(s=Object(It.a)(s,"DIV")),-1!==["DIV","SPAN"].indexOf(s.tagName)){if(s.classList.contains("goto-original")){const e=i.dataset.savedFrom,[t,s]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+s})}if(s.classList.contains("forward")){const e=+i.dataset.mid,t=this.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Zs({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Pe.a)(e.target,"reply")}catch(e){}if(t&&i.classList.contains("is-reply")){const e=+i.dataset.mid;this.replyFollowHistory.push(e);const t=this.chat.getMessage(e),s=t.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:s,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}},this.onScroll=()=>{if(this.isHeavyAnimationInProgress&&this.scrolledDown)return;const e=this.scrollable.getDistanceToEnd();!he.IS_TOUCH_SUPPORTED&&0!==this.scrollable.lastScrollDirection&&e>0&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350)),e<300&&(this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.bubblesContainer.classList.add("scrolled-down"),this.scrolledDown=!0):this.bubblesContainer.classList.contains("scrolled-down")&&(this.bubblesContainer.classList.remove("scrolled-down"),this.scrolledDown=!1),this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection),this.setStickyDateManually()},this.onDatePick=e=>{const t=this.peerId;this.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then(e=>{var s;(null===(s=null==e?void 0:e.messages)||void 0===s?void 0:s.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")})},this.listenerSetter=new R.a,this.bubblesContainer=document.createElement("div"),this.bubblesContainer.classList.add("bubbles","scrolled-down"),this.chatInner=document.createElement("div"),this.chatInner.classList.add("bubbles-inner"),this.setScroll(),this.bubblesContainer.append(this.scrollable.container),this.log=this.chat.log,this.bubbleGroups=new $n(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new Z.d,this.lazyLoadQueue.queueId=++so,this.listenerSetter.add(a.default)("history_update",({storage:e,peerId:t,mid:s})=>{if(this.chat.getMessagesStorage()===e){const e=this.bubbles[s];if(!e)return;const t=this.chat.getMessage(s);if(+e.dataset.timestamp>=t.date+nt.a.serverTimeOffset-1)return void this.bubbleGroups.changeBubbleMid(e,s);this.setBubblePosition(e,t,!1),this.scrollingToBubble&&this.scrollToEnd()}}),this.listenerSetter.add(a.default)("dialog_flush",({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map(e=>+e))}),this.listenerSetter.add(a.default)("message_sent",e=>{var t,s,i,n,o,r,l,c;const{storage:d,tempId:h,tempMessage:p,mid:u}=e;if(this.chat.getMessagesStorage()!==d)return;const g=this.getMountedBubble(h,p)||this.getMountedBubble(u);if(g){const e=this.chat.getMessage(u),a=g.bubble,d=Array.from(a.querySelectorAll("reactions-element"));if(d.length&&d.forEach(t=>{t.changeMessage(e)}),e.replies){const t=a.querySelector("replies-element");t&&(t.message=e,t.init())}if(null===(t=e.media)||void 0===t?void 0:t.document){const t=a.querySelector(`.document-container[data-mid="${h}"] .document`);if(t){const a=Object(Pe.a)(t,"document-container");!(null===(n=null===(i=null===(s=p.media)||void 0===s?void 0:s.document)||void 0===i?void 0:i.thumbs)||void 0===n?void 0:n.length)&&(null===(o=e.media.document.thumbs)||void 0===o?void 0:o.length)&&t.replaceWith(xs({message:e})),a&&(a.dataset.mid=""+u)}}if(e.grouped_id){const e=a.querySelector(`.grouped-item[data-mid="${h}"]`)||a;e&&(e.dataset.mid=""+u)}if(null===(r=e.media)||void 0===r?void 0:r.poll){const t=a.querySelector("poll-element");if(t){const s=e.media.poll;t.message=e,t.setAttribute("poll-id",s.id),t.setAttribute("message-id",""+u)}}if(null===(l=e.media)||void 0===l?void 0:l.document){const t=a.querySelector(`audio-element[data-mid="${h}"], .document[data-doc-id="${h}"], .media-round[data-mid="${h}"]`);t&&(t instanceof Ke||t.classList.contains("media-round")?(t.dataset.mid=""+e.mid,delete t.dataset.isOutgoing,t.message=e,t.onLoad(!0)):t.dataset.docId=e.media.document.id)}(null===(c=e.media)||void 0===c?void 0:c.webpage)&&!a.querySelector(".web")&&Object(Ns.c)().then(()=>{this.safeRenderMessage(e,!0,!1,a,!1),this.scrollToBubbleIfLast(a)})}else this.log.warn("message_sent there is no bubble",e);const m=this.bubbles;if(m[h]){const e=m[h];m[u]=e,delete m[h],Object(je.b)(()=>{e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===a.default.myId&&"scheduled"!==this.chat.type?"is-read":"is-sent"))}),e.dataset.mid=""+u}if(this.unreadOut.has(h)&&(this.unreadOut.delete(h),this.unreadOut.add(u)),"scheduled"===this.chat.type){(Date.now()/1e3|0)>=p.date-10&&this.deleteMessagesByIds([u])}}),this.listenerSetter.add(a.default)("message_edit",({storage:e,peerId:t,mid:s})=>{if(e!==this.chat.getMessagesStorage())return;const i=this.chat.getMessage(s),n=i.grouped_id?this.getGroupedBubble(i.grouped_id):this.getMountedBubble(s);if(!n)return;const a="scheduled"===this.chat.type;this.saveOnUpdateScroll(),this.safeRenderMessage(n.message,!0,!1,n.bubble,a),a&&(this.messagesQueuePromise||Promise.resolve()).then(()=>{this.deleteEmptyDateGroups()})}),"scheduled"!==this.chat.type&&(this.listenerSetter.add(a.default)("missed_reactions_element",({message:e,changedResults:t})=>{if(this.peerId!==e.peerId||!e.reactions||!e.reactions.results.length)return;const s=this.getBubbleByMessage(e);if(s){if(e.grouped_id){e=this.getGroupedBubble(e.grouped_id).message}this.appendReactionsElementToBubble(s,e,t)}}),this.listenerSetter.add(a.default)("message_reactions",({message:e,changedResults:t})=>{if(this.peerId!==e.peerId)return;if(!this.getBubbleByMessage(e))return;this.saveOnUpdateScroll();const s=e.peerId+"_"+e.mid,i=Zn.get(s);if(i)for(const s of i)s.update(e,t);else a.default.dispatchEvent("missed_reactions_element",{message:e,changedResults:t})})),this.listenerSetter.add(a.default)("album_edit",({peerId:e,groupId:t,deletedMids:s})=>{if(e!==this.peerId)return;const i=this.appMessagesManager.getMidsByAlbum(t).concat(s).find(e=>this.bubbles[e]);if(!i)return;const n=Object(di.a)(this.appMessagesManager.groupedMessagesStorage[t],"asc").pop();this.safeRenderMessage(this.chat.getMessage(n),!0,!1,this.bubbles[i],!1)}),this.listenerSetter.add(a.default)("messages_downloaded",({peerId:e,mids:t})=>{const s=this.getMiddleware();Object(Ns.c)().then(()=>{s()&&t.forEach(t=>{Object(f.a)(this.needUpdate,(s,i)=>{if(s.replyMid===t&&s.replyToPeerId===e){const{mid:e,replyMid:t}=this.needUpdate.splice(i,1)[0],n=this.bubbles[e];if(!n)return;const a=this.chat.getMessage(e);this.appMessagesManager.getMessageByPeer(s.replyToPeerId,t).deleted&&delete a.reply_to_mid,na.setReply({chat:this.chat,bubble:n,message:a})}})})})}),he.IS_TOUCH_SUPPORTED){const e="is-gesturing-reply",t=64,s=.75*t;let i,n,a=!1;Qs({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.chat.canSend())&&(i=Object(Pe.a)(t.target,"bubble"),i&&(Object(cs.a)(i,e,!0,250),i.offsetLeft,n?(n.classList.remove("is-visible"),n.style.opacity=""):(n=document.createElement("span"),n.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),i.append(n)),!!i),onSwipe:(e,o)=>{a=e>=s,a&&!n.classList.contains("is-visible")&&n.classList.add("is-visible"),n.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(t,e));i.style.transform=`translateX(${r}px)`,Object(ee.b)()},onReset:()=>{const t=i;Object(cs.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(je.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let m;Object(l.b)(this.bubblesContainer,this.onBubblesClick,{listenerSetter:this.listenerSetter}),le.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Pe.a)(e.target,"grouped-item")||Object(Pe.a)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",this.chat.getMessage(e)),this.highlightBubble(t)}}),ae.IS_MOBILE||"pinned"===this.chat.type||this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{if(this.chat.selection.isSelecting||!this.chat.canSend())return;const t=e.target,s=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(s&&!s.classList.contains("bubble-first")){const e=+s.dataset.mid;if(this.chat.getMessage(e).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}),Object(Ns.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),m=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,m&&m()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),m=null},this.listenerSetter)}constructPeerHelpers(){if(this.listenerSetter.add(a.default)("history_append",({storage:e,mid:t})=>{if(e===this.chat.getMessagesStorage()&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId(),a.default.settings.animationsEnabled)){const e=this.chat.gradientRenderer;e&&e.toNextPosition()}}),this.listenerSetter.add(a.default)("history_multiappend",e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort((e,t)=>t-e);this.renderNewMessagesByIds(t)}),this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))}),this.listenerSetter.add(a.default)("dialog_unread",({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),this.updateUnreadByDialog())}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.peerId]&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("chat_update",e=>{if(this.peerId===e.toPeerId(!0)){this.chatInner.classList.contains("has-rights")!==this.chat.canSend()&&(this.finishPeerChange(),this.chat.input.finishPeerChange())}}),this.listenerSetter.add(a.default)("settings_updated",e=>{if("settings.emoji.big"===e.key){const e=this.scrollable.isScrolledDown;e||this.setMessagesQueuePromise();Object(di.a)(this.bubbles,"desc").forEach(e=>{const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji")){const s=this.chat.getMessage(e);this.safeRenderMessage(s,void 0,!1,t)}}),e?this.scrollable.scrollTop=99999:this.performHistoryResult([],!0,!1,void 0)}}),this.listenerSetter.add(a.default)("message_views",({peerId:e,views:t,mid:s})=>{this.peerId===e&&Object(je.b)(()=>{const e=this.bubbles[s];if(!e)return;const i=Array.from(e.querySelectorAll(".post-views"));if(i.length){const e=Hn(t,1);let s=!1;i.forEach(t=>{(s||t.innerHTML!==e)&&(this.saveOnUpdateScroll(),s=!0,t.innerHTML=e)})}})}),this.unreadedObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=e.target,s=this.unreaded.get(t);this.onUnreadedInViewport(t,s)}})}),this.viewsObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.viewsObserver.unobserve(e.target),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this;e&&e.random_id&&(delete e.random_id,this.chat.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId()),random_id:e.random_id}))}}})}),this.sendViewCountersDebounced=bt(()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.appMessagesManager.incrementMessageViews(this.peerId,e)},1e3,!1,!0),"ResizeObserver"in window){let e=this.scrollable.container.offsetHeight,t=!1,s=!1,i=0,n=0,a=0;const o=()=>{const o=this.scrollable.container.offsetHeight,r=this.scrollable.isScrolledDown;o===e||s&&r||(n+=e-o),n&&(this.scrollable.scrollTop+=Math.round(n)),e=o,i=0,a=0,n=0,t=!1,s=!1},r=e=>{a&&window.cancelAnimationFrame(a),a=window.requestAnimationFrame(e?o:()=>{a=window.requestAnimationFrame(o)})};new ResizeObserver(a=>{if(s)return void r(!1);const o=a[0].contentRect.height;if(!e)return void(e=o);const l=e-o;let c=l+n;const d=c%1;if(c-=d,!t&&(t=!0,l<0&&this.scrollable.isScrolledDown))return n=-l,s=!0,void r(!1);if(i+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.scrollTop=e}r(!1),n=d,e=o}).observe(this.bubblesContainer)}}saveOnUpdateScroll(){this.onUpdateScrollSaver||(this.onUpdateScrollSaver=new Xa(this.scrollable,!0),setTimeout(()=>{this.onUpdateScrollSaver.restore(),this.onUpdateScrollSaver=void 0},0),this.onUpdateScrollSaver.save())}setReactionsHoverListeners(){this.listenerSetter.add(a.default)("context_menu_toggle",this.unhoverPrevious),this.listenerSetter.add(a.default)("overlay_toggle",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.bubblesContainer)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){Object(cs.a)(e,"is-visible",t,200,t?void 0:()=>{e.remove()},2)}setStickyDateManually(){const e=Object.keys(this.dateMessages).map(e=>+e).sort((e,t)=>t-e);let t;const{scrollTop:s}=this.scrollable.container;if(s>0)for(const s of e){const e=this.dateMessages[s],i=qa(e.container,this.scrollable.container);if(i&&i.overflow.top)t=e.div;else if(t)break}if(t!==this.previousStickyDate){if(t){const e=!this.previousStickyDate;e&&t.classList.add("no-transition"),t.classList.add("is-sticky"),e&&(t.offsetLeft,t.classList.remove("no-transition"))}this.previousStickyDate&&this.previousStickyDate!==t&&this.previousStickyDate.classList.remove("is-sticky"),this.previousStickyDate=t}}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.unreadedObserver.unobserve(e),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=a.default.idle.focusPromise.then(()=>{if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map(e=>+e));t>=e&&(t=Math.max(this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).maxId||0,t))}this.unreaded.forEach((e,s)=>{e<=t&&this.onUnreadedInViewport(s,e)});const s=[];for(const e of this.unreadedSeen){const t=this.chat.getMessage(e);this.appMessagesManager.isMentionUnread(t)&&s.push(e)}return this.appMessagesManager.readMessages(this.peerId,s),this.unreadedSeen.clear(),le.b&&this.log("will readHistory by maxId:",t),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch(e=>{this.log.error("readHistory err:",e),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)}).finally(()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())})})}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&(i||this.deleteMessagesByIds(s))})}constructScheduledHelpers(){const e=()=>{this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size)};this.listenerSetter.add(a.default)("scheduled_new",({peerId:t,mid:s})=>{t===this.peerId&&(this.renderNewMessagesByIds([s]),e())}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:t,mids:s})=>{t===this.peerId&&(this.deleteMessagesByIds(s),e())})}onGoDownClick(){if(this.replyFollowHistory.length){Object(f.a)(this.replyFollowHistory,(e,t)=>{const s=this.bubbles[e];let i=!0;if(s){const e=s.getBoundingClientRect();i=kt.a.height/2>e.top}else{this.chat.getMessage(e).deleted||(i=!1)}i&&this.replyFollowHistory.splice(t,1)}),this.replyFollowHistory.sort((e,t)=>t-e);const e=this.replyFollowHistory.pop();this.chat.setMessageId(e)}else this.chat.setMessageId()}getBubbleByPoint(e){let t=ra(this.scrollable.container,e,"center");return t&&(t=Object(Pe.a)(t,"bubble")),t}getGroupedBubble(e){const t=this.appMessagesManager.groupedMessagesStorage[e];for(const[e]of t)if(this.bubbles[e]){const s=Math.max(...t.keys());return{bubble:this.bubbles[e],mid:+e,message:this.chat.getMessage(s)}}}getBubbleByMessage(e){if(!e.grouped_id)return this.bubbles[e.mid];const t=this.getGroupedBubble(e.grouped_id);return null==t?void 0:t.bubble}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t=this.chat.getMessage(e)){if(t.grouped_id&&this.appMessagesManager.getMidsByAlbum(t.grouped_id).length>1){const s=this.getGroupedBubble(t.grouped_id);if(s)return s.bubble=s.bubble.querySelector(`.document-container[data-mid="${e}"]`)||s.bubble,s}const s=this.bubbles[e];if(s)return{bubble:s,mid:e,message:t}}findNextMountedBubbleByMsgId(e){return this.bubbles[Object(di.a)(this.bubbles).find(t=>{var s;return!(t+e).sort((e,t)=>e-t);if(s.length)if(e)le.b&&this.log("Will load more (up) history by id:",s[0],"maxId:",s[s.length-1],t),this.getHistory(s[0],!0,void 0,void 0,t);else{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);if(-1!==s.indexOf(e.maxId))return void this.setLoaded("bottom",!0);le.b&&this.log("Will load more (down) history by id:",s[s.length-1],t),this.getHistory(s[s.length-1],!1,!0,void 0,t)}}setScroll(){this.scrollable=new P.b(null,"IM",300),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),he.IS_TOUCH_SUPPORTED&&(this.scrollable.container.addEventListener("touchmove",()=>{this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling")},{passive:!0}),this.scrollable.container.addEventListener("touchend",()=>{this.chatInner.classList.contains("is-scrolling")&&(this.isScrollingTimeout&&clearTimeout(this.isScrollingTimeout),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350))},{passive:!0}))}updateUnreadByDialog(){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),t=this.peerId===a.default.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(t.classList.contains("is-outgoing"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}this.unreadOut.delete(e)}}deleteMessagesByIds(e,t=!0){let s=!1;e.forEach(e=>{if(!(e in this.bubbles))return;s=!0;const t=this.bubbles[e];delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeBubble(t),this.unreadedObserver&&(this.unreadedObserver.unobserve(t),this.unreaded.delete(t)),this.viewsObserver&&(this.viewsObserver.unobserve(t),this.viewsMids.delete(e)),t.remove(),this.emptyPlaceholderMid===e&&(this.emptyPlaceholderMid=void 0)}),s&&(t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),I.a.checkAnimations(!1,Ql),this.deleteEmptyDateGroups(),this.onScroll())}renderNewMessagesByIds(e,t){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const s=this.getMiddleware();t.then(()=>{s()&&this.renderNewMessagesByIds(e)})}return}this.chat.threadId&&(e=e.filter(e=>{const t=this.chat.getMessage(e).reply_to;return t&&(t.reply_to_top_id||t.reply_to_msg_id)===this.chat.threadId})),e=e.filter(e=>!this.bubbles[e]),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const s=this.getMiddleware();let i,n=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:t}=this.scrollable.container;n=e===t,n&&(i=this.chatInner,i.style.paddingTop=e+"px",this.scrollable.scrollTop=t,this.isTopPaddingSet=!0)}const a=this.performHistoryResult(e,!1,!0);t&&a.then(()=>{if(!s())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();n&&a.then(()=>{s()&&n&&(i.style.paddingTop="",this.isTopPaddingSet=!1)})})}getLastBubble(){const e=this.getLastDateGroup();if(e)return e.lastElementChild}scrollToBubble(e,t,s,i){const n=Object(Pe.a)(e,"bubble");let a;if(n&&"end"!==t&&Object(zs.a)(n)===(this.stickyIntersector?2:1)){a=n.parentElement}const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper");return this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:s,forceDuration:i,axis:"y",getNormalSize:o?({rect:e})=>{let t=kt.a.height;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||kt.a.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a})}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return Ja(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}getLastDateGroup(){let e,t=0;for(const s in this.dateMessages){const i=this.dateMessages[s];i.firstTimestamp>t&&(e=i.container,t=i.firstTimestamp)}return e}scrollToBubbleIfLast(e){return Ja(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout(()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]},2e3)}getDateContainerByMessage(e,t){const s=new Date(1e3*e.date);s.setHours(0,0,0);const i=s.getTime();if(!this.dateMessages[i]){let t;const n=new Date;n.setHours(0,0,0,0);const a="scheduled"===this.chat.type;if(n.getTime()===s.getTime())t=Object(k.i18n)(a?"Chat.Date.ScheduledForToday":"Date.Today");else if(a&&2147483646===e.date)t=Object(k.i18n)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};s.getFullYear()!==n.getFullYear()&&(e.year="numeric"),t=new k.default.IntlDateElement({date:s,options:e}).element,a&&(t=Object(k.i18n)("Chat.Date.ScheduledFor",[t]))}const o=document.createElement("div");o.className="bubble service is-date";const r=document.createElement("div");r.classList.add("bubble-content");const l=document.createElement("div");l.classList.add("service-msg"),l.append(t),r.append(l),o.append(r);const c=document.createElement("section");c.className="bubbles-date-group",c.append(o),this.dateMessages[i]={div:o,container:c,firstTimestamp:s.getTime()};const d=Object(di.a)(this.dateMessages,"asc");let h,p=0,u=d.length;for(;p+e)))}else this.isFirstLoad=!0;const v=this.chatInner;this.cleanup();const f=this.chatInner=document.createElement("div");let y;n?(f.className=v.className,f.classList.remove("disable-hover","is-scrolling")):f.classList.add("bubbles-inner"),this.lazyLoadQueue.lock(),y=d?{promise:Object(Ns.c)().then(()=>this.performHistoryResult(d.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,u,m);const{promise:w,cached:S}=y;S||n||(g.container.textContent="",this.chat.finishPeerChange(l,u,t,s),this.preloader.attach(this.bubblesContainer)),I.a.lockGroup(Ql);const C=w.then(()=>{if(S?n||this.chat.finishPeerChange(l,u,t,s):this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),g.lastScrollDirection=0,g.lastScrollPosition=0,Object(T.a)(g.container,f),I.a.unlockGroup(Ql),I.a.checkAnimations(!1,Ql),this.lazyLoadQueue.unlock(),d)g.scrollTop=g.lastScrollPosition=d.top;else if(r&&u||l){const e=b>0&&(b{g.checkForTriggers()}),this.chat.dispatchEvent("setPeer",t,!u);if(this.appPeersManager.isChannel(e)){const e=this.getMiddleware(),t=()=>{if(!e())return;const s=[];for(const e in this.bubbles){let t=this.chat.getMessage(+e);"message"===t._&&(t=this.appMessagesManager.getGroupsFirstMessage(t),s.push(t.mid))}(s.length?this.appReactionsManager.getMessagesReactions(this.peerId,s):Promise.resolve()).then(()=>{setTimeout(t,1e4)})};Promise.all([o,Object(Ns.c)(),Object(ca.a)(500)]).then(()=>{t()})}const h=this.appMessagesManager.isFetchIntervalNeeded(e);if(d||h?o.then(()=>{if(i()&&(g.checkForTriggers(),h)){const t=()=>{this.fetchNewPromise=new Promise(s=>{i()&&this.appMessagesManager.isFetchIntervalNeeded(e)?this.appMessagesManager.getNewHistory(e,this.chat.threadId).then(e=>{if(!i()||!e)return void s();const n=e.history.slice.isEnd(oa.a.Bottom);g.loadedAll.bottom&&g.loadedAll.bottom!==n&&(this.setLoaded("bottom",n),this.onScroll()),setTimeout(t,3e4),s()}):s()}).finally(()=>{this.fetchNewPromise=void 0})};n?setTimeout(t,3e4):t()}}):t&&!this.bubbles[r]&&t!==r||this.setLoaded("bottom",!0),this.log("scrolledAllDown:",g.loadedAll.bottom),g.loadedAll.bottom&&r&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===a){const t=this.appMessagesManager.getDialogOnly(e);(null==t?void 0:t.pFlags.unread_mark)&&this.appMessagesManager.markDialogUnread(e,!0)}}).catch(e=>{throw this.log.error("getHistory promise error:",e),this.preloader.detach(),e});return{cached:S,promise:C}}onScrolledAllDown(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);this.appMessagesManager.readHistory(this.peerId,e.maxId,this.chat.threadId,!0)}}finishPeerChange(){const e=this.appPeersManager.isChannel(this.peerId),t=this.chat.canSend();this.chatInner.classList.toggle("has-rights",t),this.bubblesContainer.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",this.chat.isAnyGroup()),this.chatInner.classList.toggle("is-channel",e)}renderMessagesQueue(e,t,s,i){return this.messagesQueue.push({message:e,bubble:t,reverse:s,promises:i}),this.setMessagesQueuePromise()}setMessagesQueuePromise(){return this.messagesQueuePromise||!this.messagesQueue.length?Promise.resolve():this.messagesQueuePromise=new Promise((e,t)=>{setTimeout(()=>{const s=this.messagesQueue.slice();this.messagesQueue.length=0;const i=s.reduce((e,{promises:t})=>(e.push(...t),e),[]);this.log("promises to call",i,s,this.isHeavyAnimationInProgress);const n=this.getMiddleware();Promise.all(i).then(()=>{if(!n())throw"setMessagesQueuePromise: peer changed!";this.messagesQueueOnRender&&this.messagesQueueOnRender(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),s.forEach(({message:e,bubble:t,reverse:s})=>{this.setBubblePosition(t,e,s)}),e(),this.messagesQueuePromise=null,this.messagesQueue.length&&this.setMessagesQueuePromise(),this.setUnreadDelimiter()}).catch(t)},0)})}setBubblePosition(e,t,s){if(t.pFlags.local)return void this.chatInner[t.pFlags.sponsored?"append":"prepend"](e);const i=this.getDateContainerByMessage(t,s);if("scheduled"===this.chat.type||"pinned"===this.chat.type){const s=this.stickyIntersector?2:1;let n=Array.from(i.container.children).slice(s),a=0,o=0;for(;as.includes(e)));i.className=n.join(" "),S=i.lastElementChild,S.classList.contains("bubble-content-wrapper")||(S=i.querySelector(".bubble-content-wrapper")),w=S.firstElementChild,w.innerHTML="",w.style.cssText="",S.innerHTML="",S.appendChild(w);const a=S.style.transitionDelay;S.style.cssText="",S.style.transitionDelay=a,i===this.firstUnreadBubble&&i.classList.add("is-first-unread");const o=+i.dataset.mid;+e.mid===o||(delete this.bubbles[o],this.skippedMids.delete(o))}else if(S=document.createElement("div"),S.classList.add("bubble-content-wrapper"),w=document.createElement("div"),w.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),S.appendChild(w),i.appendChild(S),!f&&!e.pFlags.out&&this.unreadedObserver){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=L.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3&&I.length===e.length){if(a.default.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(L);if(1===e.length&&!M&&t)M={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=E,i.classList.add("emoji-"+e.length+"x"),w.append(t)}i.classList.add("is-message-empty","emoji-big"),T=!0,P=!1,x=!1}i.classList.add("can-have-big-emoji")}}x&&m(y,E);const A=na.setTime({chatType:this.chat.type,message:e});if(y.append(A),w.prepend(y),p&&e.views){if(i.classList.add("channel-post"),!(null===(h=e.fwd_from)||void 0===h?void 0:h.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),w.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.viewsObserver&&this.viewsObserver.observe(i)}const O=p&&e.reply_markup;if(O&&"replyInlineMarkup"===O._&&O.rows&&O.rows.length){const t=O.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach(t=>{const i=t.buttons;if(!i||!i.length)return;const n=document.createElement("div");n.classList.add("reply-markup-row"),i.forEach(t=>{const s=X.b.wrapRichText(t.text,{noLinks:!0,noLinebreaks:!0});let i;switch(t._){case"keyboardButtonUrl":{const e=X.b.wrapRichText(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=Object(ti.a)(e).firstElementChild,i.classList.add("is-link","tgico");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline","tgico"),Object(l.b)(i,s=>{Object(c.a)(s);const i=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.appInlineBotsManager.checkSwitchReturn(i).then(e=>e||new Promise((e,t)=>{new Zs({[this.peerId]:[]},t=>{e(t)},!0).addEventListener("close",()=>{t()})})),n.then(e=>{const s=this.peerId===e?this.chat.threadId:void 0;this.appInlineBotsManager.switchInlineQuery(e,s,i,t.query)})});break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp"),i.insertAdjacentHTML("beforeend",s),Object(te.ripple)(i),n.append(i)}),s.append(n)}),Object(l.b)(s,s=>{let i=s.target;if(i.classList.contains("reply-markup-button")||(i=Object(Pe.a)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline"))return;Object(c.a)(s);const n=Object(zs.a)(i),a=t[Object(zs.a)(i.parentElement)];if(!a.buttons||!a.buttons[n])return void this.log.warn("no such button",a,n,e);const o=a.buttons[n];this.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,o)}),P=!1,i.classList.add("with-reply-markup"),S.append(s)}const _=e.pFlags.is_outgoing;if(f){(e.pFlags.unread||_)&&this.unreadOut.add(e.mid);let t="";t=_?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}_&&i.classList.add("is-outgoing");const F=p&&this.appMessagesManager.getMessageWithReplies(e),D=!!F&&e.mid>0;D&&i.classList.add("with-replies");const j=p&&e.fwd_from,R=p&&e.fwdFromId,B=f&&(!j||this.peerId!==a.default.myId);let U=w;const N=!(e.viaBotId||e.fromId!==a.default.myId&&e.pFlags.out);if(M){let t=document.createElement("div");t.classList.add("attachment"),L||i.classList.add("is-message-empty");let s=!1;switch(M._){case"messageMediaPhoto":{const s=M.photo;L||(P=!1),N&&i.classList.add("hide-name"),i.classList.add("photo");const n=this.appMessagesManager.groupedMessagesStorage[u];if(u&&1!==n.size&&g){i.classList.add("is-album","is-grouped"),Us({groupId:u,attachmentDiv:t,middleware:this.getMiddleware(),isOut:f,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});break}const a=!ae.IS_ANDROID&&P&&!D&&!1;a&&i.classList.add("with-media-tail"),As({photo:s,message:e,container:t,withTail:a,isOut:B,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:C,autoDownloadSize:this.chat.autoDownload.photo});break}case"messageMediaWebPage":{s=!0;let t=M.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let n=document.createElement("div");n.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));const c=t.document;if(c)if("gif"===c.type||"video"===c.type||"round"===c.type){const t="round"===c.type?b.b.active.round:b.b.active.webpage;"round"===c.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),ks({doc:c,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:B,group:Ql,loadPromises:C,autoDownload:this.chat.autoDownload})}else{const t=xs({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:C});o.append(t),o.classList.add("preview-with-document")}let d,h=document.createElement("div");if(h.classList.add("quote-text"),a&&h.append(a),t.site_name){const e=X.b.wrapRichText(t.url),s=Object(ti.a)(e).firstElementChild;s.classList.add("webpage-name");const i=document.createElement("strong");m(i,X.b.wrapEmojiText(t.site_name)),s.textContent="",s.append(i),h.append(s),d=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title");const s=document.createElement("strong");m(s,t.rTitle),e.append(s),h.append(e),d=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),m(e,t.rDescription),h.append(e),d=e}if(r.append(h),l&&!c){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&d?(i.classList.add("is-square-photo"),s=!0,this.appPhotosManager.setAttachmentSize(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),As({photo:l,message:e,container:o,boxWidth:s?0:b.b.active.webpage.width,boxHeight:s?0:b.b.active.webpage.height,isOut:B,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:C,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}n.append(r),y.insertBefore(n,A);break}case"messageMediaDocument":{const n=M.document;if(n.sticker){i.classList.add("sticker"),P=!1,T=!0,n.animated&&i.classList.add("sticker-animated");const e=b.b.active,s=i.classList.contains("emoji-big")?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;this.appPhotosManager.setAttachmentSize(n,t,s.width,s.height),w.style.minWidth=t.style.width,w.style.minHeight=t.style.height,Fs({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:Ql,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?L:void 0,withThumb:!0,loadPromises:C})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(T=!0),!s&&L||(P=!1),N&&i.classList.add("hide-name"),i.classList.add(s?"round":"video");const a=this.appMessagesManager.groupedMessagesStorage[u];if(u&&1!==a.size&&g)i.classList.add("is-album","is-grouped"),Us({groupId:u,attachmentDiv:t,middleware:this.getMiddleware(),isOut:f,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});else{const a=!ae.IS_ANDROID&&!ae.IS_APPLE&&!s&&P&&!D&&!1;a&&i.classList.add("with-media-tail"),ks({doc:n,container:t,message:e,boxWidth:b.b.active.regular.width,boxHeight:b.b.active.regular.height,withTail:a,isOut:B,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:Ql,loadPromises:C,autoDownload:this.chat.autoDownload,searchContext:s?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=function({albumMustBeRenderedFull:e,message:t,bubble:s,messageDiv:i,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,useSearch:c}){let d;const h=e?n.getMidsByMid(t.mid):[t.mid];return h.forEach((e,t)=>{const s=n.getMessage(e),c=xs({message:s,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l}),p=document.createElement("div");p.classList.add("document-container"),p.dataset.mid=""+e,p.dataset.peerId=""+s.peerId;const u=document.createElement("div");if(u.classList.add("document-wrapper"),s.message){const e=document.createElement("div");e.classList.add("document-message");const t=X.b.wrapRichText(s.message,{entities:s.totalEntities});e.innerHTML=t,u.append(e)}if(h.length>1){const e=document.createElement("div");e.classList.add("document-selection"),p.append(e),p.classList.add("grouped-item"),0===t&&(d=u)}u.append(c),p.append(u),i.append(p)}),h.length>1&&s.classList.add("is-multiple-documents","is-grouped"),d}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:C,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0});t&&(U=t);const a=y.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(A),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),s=!0}break}case"messageMediaCall":{const e=M.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";t.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),Object(k._i18n)(a,B?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append(Object(Ka.a)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),Object(k._i18n)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),s=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(t);break}case"messageMediaContact":{const e=M,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,s=!0;const n=[];e.first_name&&n.push(X.b.wrapEmojiText(e.first_name)),e.last_name&&n.push(X.b.wrapEmojiText(e.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.phone_number?"+"+Object(Xs.a)(e.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new hc;a.lazyLoadQueue=this.lazyLoadQueue,a.setAttribute("peer",""+e.user_id.toPeerId()),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e){const t=new bs;return t.message=e,t.setAttribute("peer-id",""+e.peerId),t.setAttribute("poll-id",e.media.poll.id),t.setAttribute("message-id",""+e.mid),t.render(),t}(e);y.prepend(t),y.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),y.append(Object(k.i18n)(k.UNSUPPORTED_LANG_PACK_KEY),A),this.log.warn("unrecognized media type:",M._,e)}s||w.append(t)}T&&i.classList.add("just-media"),this.chat.selection.isSelecting&&this.chat.selection.toggleElementCheckbox(i,!0);let H="";const z=e.fromId!==a.default.myId&&this.appPeersManager.isAnyGroup(v)||e.viaBotId||e.pFlags.sponsored;if(z||j||e.reply_to_mid){let t,s;const n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===R;let o,r=j&&!j.from_id;if(e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+this.appUsersManager.getUser(e.viaBotId).username,s.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),t.innerHTML=X.b.wrapEmojiText(j.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Tt.a({peerId:R||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&p&&na.setReply({chat:this.chat,bubble:i,bubbleContainer:w,message:e}),R||j)if(this.peerId===a.default.myId||n||i.classList.add("forwarded"),e.savedFrom&&(H=e.savedFrom,t.dataset.savedFrom=H),o=document.createElement("div"),t.dataset.peerId=""+R,this.peerId!==a.default.myId&&this.peerId!==Be.d&&!n||T){const e=[t];T&&e.unshift(document.createElement("br")),o.append(Object(k.i18n)("ForwardedFrom",[e]))}else o.style.color=this.appPeersManager.getPeerColorById(R,!1),o.append(t);else e.viaBotId||(!T&&z?(o=document.createElement("div"),o.append(t),f||(o.style.color=this.appPeersManager.getPeerColorById(e.fromId,!1)),o.dataset.peerId=""+e.fromId):i.classList.add("hide-name"));if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append(Object(k.i18n)("ViaBot")," ",s),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),U.append(o));if(this.chat.isAnyGroup()&&!B){let t=new hc;t.lazyLoadQueue=this.lazyLoadQueue,t.classList.add("user-avatar","avatar-40"),t.loadPromises=C,!R&&j&&j.from_name&&t.setAttribute("peer-title",j.from_name),t.setAttribute("peer",""+((j&&(this.peerId===a.default.myId||this.peerId===Be.d)||n?R:e.fromId)||Be.c)),S.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(H=`${this.chat.peerId}_${e.mid}`);if(F&&F.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),H&&("pinned"===this.chat.type||j.saved_from_msg_id)&&this.peerId!==Be.d){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),w.append(e),i.dataset.savedFrom=H,i.classList.add("with-beside-button")}if(i.classList.add(B?"is-out":"is-in"),n&&this.renderMessagesQueue(e,i,t,C),D){na.renderReplies({bubble:i,bubbleContainer:w,message:F,messageDiv:y,loadPromises:C,lazyLoadQueue:this.lazyLoadQueue})&&(P=!0)}return p&&this.appendReactionsElementToBubble(i,e),P&&(i.classList.add("can-have-tail"),w.append(no())),i}appendReactionsElementToBubble(e,t,s){if(this.peerId.isUser())return;const i=this.appMessagesManager.getGroupsFirstMessage(t);if(!i.reactions||!i.reactions.results.length)return;const n=new ea;if(n.init(i,"block"),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let i=e.querySelector(".document-message"),a=i&&i.querySelector(".time");a||(a=na.setTime({chatType:this.chat.type,message:t})),n.append(a),i||(i=document.createElement("div"),i.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(i)),i.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}safeRenderMessage(e,t,s,i,n){try{return this.renderMessage(e,t,s,i,n)}catch(e){this.log.error("renderMessage error:",e)}}performHistoryResult(e,t,s,i){return Ja(this,void 0,void 0,(function*(){let s;e=e.slice(),i&&e.unshift(i),this.messagesQueueOnRender=()=>{s=new Xa(this.scrollable,t),s.save()},this.needReflowScroll&&(la(this.scrollable.container),this.needReflowScroll=!1);const n=e=>{const s="number"==typeof e?this.chat.getMessage(e):e;s.pFlags.local?this.processLocalMessageRender(s):this.safeRenderMessage(s,t,!0)},a=e.length;if(t)for(let t=0;t=0;--t)n(e[t]);if("scheduled"!==this.chat.type){const t=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),s=t.history.first,i=t.history.last;!s.isEnd(oa.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(oa.a.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);return yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),s&&s.restore(!(1===e.length&&!t)),!0}))}requestHistory(e,t,s){if("chat"===this.chat.type||"discussion"===this.chat.type)return this.appMessagesManager.getHistory(this.peerId,e,t,s,this.chat.threadId);if("pinned"===this.chat.type){return this.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:s}).then(e=>({history:e.history.map(e=>e.mid)}))}return"scheduled"===this.chat.type?this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>({history:e.slice().reverse()})):void 0}animateAsLadder(e,t,s,i,n){return Ja(this,void 0,void 0,(function*(){if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,s,i,n));if(!Object.keys(this.bubbles).length)return;let a,o=Object(di.a)(this.bubbles,"desc");s&&t.length&&(o=o.filter(e=>!t.includes(e))),a=i?n||Math.max(...o):e||Math.max(...o);const r=o.slice(o.findIndex(e=>a>e)),l=s?[]:[a],c=s?[]:o.slice(0,o.findIndex(e=>a>=e)).reverse();le.b&&this.log("getHistory: targeting mid:",a,n,e,r.map(e=>this.appMessagesIdsManager.getServerMessageId(e)),c.map(e=>this.appMessagesIdsManager.getServerMessageId(e)));const d=[];this.chatInner.classList.add("zoom-fading");const h=s?10:40,p=s?0:1,u=(e,t=0)=>{const s=Object(ie.a)();let i=0;return e.forEach((n,a)=>{if(!this.bubbles[n]||this.skippedMids.has(n))return void this.log.warn("animateAsLadder: no bubble by mid:",n);const o=this.bubbles[n].lastElementChild;if(i=(a+t||.1)*h,o.classList.add("zoom-fade"),o.style.transitionDelay=i+"ms",a===e.length-1){const e=t=>{t.target===o&&(s.resolve(),o.removeEventListener("transitionend",e))};o.addEventListener("transitionend",e)}d.push(o)}),e.length||s.resolve(),{lastMsDelay:i,animationPromise:s}},g=u(r,p),m=u(l),b=u(c,p),v=[g.animationPromise,m.animationPromise,b.animationPromise],f=[g.lastMsDelay,m.lastMsDelay,b.lastMsDelay];let y;return this.onAnimateLadder&&(yield this.onAnimateLadder()),Object(je.b)(()=>{this.setStickyDateManually(),d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(Ns.b)(y,Math.max(...f)+200).then(()=>{Object(je.b)(()=>{d.forEach(e=>{e.style.transitionDelay=""}),this.chatInner.classList.remove("zoom-fading")}),ae.IS_SAFARI||(this.needReflowScroll=!0)})),y}))}renderEmptyPlaceholder(e,t,s,i){const n="empty-bubble-placeholder";let a,o;if(t.classList.add(n,n+"-"+e),"group"===e?a=Object(k.i18n)("GroupEmptyTitle1"):"saved"===e?a=Object(k.i18n)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?a=Object(k.i18n)("NoMessages"):"noScheduledMessages"===e?a=Object(k.i18n)("NoScheduledMessages"):"restricted"===e&&(a=document.createElement("span"),a.innerText=this.appPeersManager.getRestrictionReasonText(this.peerId)),a.classList.add("center",n+"-title"),i.push(a),"group"===e)i.push(Object(k.i18n)("GroupEmptyTitle2")),o=[Object(k.i18n)("GroupDescription1"),Object(k.i18n)("GroupDescription2"),Object(k.i18n)("GroupDescription3"),Object(k.i18n)("GroupDescription4")];else if("saved"===e)o=[Object(k.i18n)("ChatYourSelfDescription1"),Object(k.i18n)("ChatYourSelfDescription2"),Object(k.i18n)("ChatYourSelfDescription3"),Object(k.i18n)("ChatYourSelfDescription4")];else if("greeting"===e){const e=Object(k.i18n)("NoMessagesGreetingsDescription");e.classList.add("center",n+"-subtitle"),this.messagesQueue.findAndSplice(e=>e.bubble===t);const a=document.createElement("div");a.classList.add(n+"-sticker");const o=this.getMiddleware(),r=this.appStickersManager.getGreetingSticker().then(e=>{if(!o())return;const t=[];return Fs({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:Ql,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),Ha.onMediaClick({target:e.target})}),Promise.all(t)});this.renderMessagesQueue(s,t,!1,[r]),i.push(e,a)}o&&(i.push(...o.map(e=>{const t=document.createElement("span");return t.classList.add(n+"-list-item"),t.append(e),t})),"group"===e?o.forEach(e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)}):"saved"===e&&o.forEach(e=>{const t=document.createElement("span");t.classList.add(n+"-list-bullet"),t.innerText="•",e.prepend(t)})),i.length>1&&t.classList.add("has-description"),i.forEach(e=>e.classList.add(n+"-line"))}processLocalMessageRender(e){const t=!!e.pFlags.sponsored,s=this.safeRenderMessage(e,void 0,void 0,void 0,t);s.classList.add("is-group-last","is-group-first"),t||(s.classList.add("bubble-first"),s.classList.remove("can-have-tail","is-in"));const i=[],n=this.appPeersManager.isBot(this.peerId);if(this.chat.isRestricted)this.renderEmptyPlaceholder("restricted",s,e,i);else{if(t){let t,i,n,o;s.classList.add("avoid-selection");const r=this.sponsoredMessage=e.sponsoredMessage,c=this.appPeersManager.getPeerId(r.from_id);r.channel_post?(t="OpenChannelPost",i=this.appMessagesIdsManager.generateMessageId(r.channel_post)):r.start_param||this.appUsersManager.isBot(c.toUserId())?(t="Chat.Message.ViewBot",n=r.start_param):t=this.appPeersManager.isAnyGroup(c)?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ya(r.chat_invite_hash,r.chat_invite).show()}:r.chat_invite_hash?()=>{const e={_:$a.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{a.default.dispatchEvent("history_focus",{peerId:c,mid:i,startParam:n})};const d=Object(B.a)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.viewsObserver.observe(d),o&&Object(l.b)(d,o),void s.querySelector(".bubble-content").prepend(d)}if(n&&"message"===e._){const e=document.createElement("b");e.append(Object(k.i18n)("BotInfoTitle")),i.push(e,"\n\n")}else this.appPeersManager.isAnyGroup(this.peerId)&&this.appPeersManager.getPeer(this.peerId).pFlags.creator?this.renderEmptyPlaceholder("group",s,e,i):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",s,e,i):a.default.myId===this.peerId?this.renderEmptyPlaceholder("saved",s,e,i):this.appPeersManager.isUser(this.peerId)&&!n&&this.chat.canSend()&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",s,e,i):this.renderEmptyPlaceholder("noMessages",s,e,i)}if(i.length){s.querySelector(".message, .service-msg").prepend(...i)}const o=t?"append":"prepend";this.messagesQueueOnRenderAdditional?this.onAnimateLadder=()=>{if(this.chatInner[o](s),this.onAnimateLadder=void 0,!this.messagesQueuePromise)return Object(je.d)()}:this.chatInner[o](s),this.emptyPlaceholderMid=e.mid}generateLocalMessageId(e=0){let t=("scheduled"===this.chat.type?-1:0)+e;const s=-Math.abs(t);return{id:s,mid:-Math.abs(this.appMessagesIdsManager.generateMessageId(s))}}generateLocalFirstMessage(e,t,s=0){const{id:i,mid:n}=this.generateLocalMessageId(s),a={_:e?"messageService":"message",date:0,id:i,mid:n,peer_id:this.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),Object(Is.a)(a),t&&t(a),this.appMessagesManager.saveMessages([a],{storage:new Map}),a.mid=n,a}setLoaded(e,t,s=!0){if(this.scrollable.loadedAll[e]!==t){if(this.scrollable.loadedAll[e]=t,"bottom"===e&&this.appPeersManager.isBroadcast(this.peerId)&&!this.chat.isRestricted){const{mid:e}=this.generateLocalMessageId(1);if(t){const t=this.getMiddleware(()=>this.scrollable.loadedAll.bottom&&!this.bubbles[e]&&this.getSponsoredMessagePromise===s),s=this.getSponsoredMessagePromise=this.chat.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId())},{cacheSeconds:300}).then(e=>{if(!t())return;this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const s=e.messages.shift();if(!s)return;e.messages.push(s);const i=this.generateLocalFirstMessage(!1,e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s},1);return Promise.all([this.getHistoryTopPromise,this.messagesQueuePromise]).then(()=>{if(!t())return;this.performHistoryResult([i],!1,!0)})}).finally(()=>{this.getSponsoredMessagePromise=void 0})}else this.deleteMessagesByIds([e]),this.getSponsoredMessagePromise=void 0}if("top"===e&&t&&this.appPeersManager.isBot(this.peerId)&&!this.chat.isRestricted){this.log("inject bot description");const e=this.getMiddleware();return Promise.resolve(this.appProfileManager.getProfile(this.peerId.toUserId())).then(t=>{var s;if(!e())return;if(!(null===(s=t.bot_info)||void 0===s?void 0:s.description))return void this.checkIfEmptyPlaceholderNeeded();const i=this.generateLocalFirstMessage(!1,e=>{e.message=t.bot_info.description});this.processLocalMessageRender(i)})}this.checkIfEmptyPlaceholderNeeded()}}checkIfEmptyPlaceholderNeeded(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderMid&&(this.chat.isRestricted||!this.appMessagesManager.getHistoryStorage(this.peerId).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=this.generateLocalFirstMessage(!0);return this.processLocalMessageRender(e),!0}return!1}getHistory(e=0,t=!1,s=!1,i=0,n=!1){const o=this.peerId,r=this.appPeersManager.isBroadcast(o),l=Math.min(30,kt.a.height/48|0),c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;let d=c;if(void 0!==to){if(!to)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--to}let h,p=0;if(s&&(p=d,t||(d=0)),i&&!s)if("pinned"===this.chat.type)h=[i];else{const t=this.appMessagesManager.getHistoryStorage(o,this.chat.threadId).history.slice;if(t.length=0;--e){if(!this.chat.getMessage(h[e]).grouped_id)break;h.splice(e,1)}e=h[h.length-1]||e}}let u,g=this.requestHistory(e,d,p);const m=(null==h?void 0:h.length)&&g instanceof Promise,b=this.isFirstLoad&&p&&g instanceof Promise||m;m&&(u=g,g={history:h}),this.isFirstLoad=!1;const v=e=>Ja(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(oa.a.Top)){if("discussion"===this.chat.type){const t=this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId+"_"+this.chat.threadId];t&&e.history.push(t),e.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse())}yield this.setLoaded("top",!0)}})),f=e=>Object(Ns.c)().then(()=>v(e)).then(()=>this.performHistoryResult(e.history||[],t,s,!m&&i)),y=e=>{const s=e.then(e=>(t?this.getHistoryTopPromise!==s:this.getHistoryBottomPromise!==s)?(this.log.warn("getHistory: peer changed"),Promise.reject()):n?(this.scrollable.onScroll(),!0):f(e),e=>{throw this.log.error("getHistory error:",e),e});return s};let w,S;if(g instanceof Promise)S=!1,w=y(g);else{if(n)return null;S=!0,w=f(g)}const C=m?y(u):w;if(b&&a.default.settings.animationsEnabled){let s=m?2:1;this.messagesQueueOnRenderAdditional=()=>{if(this.log("ship went past rocks of magnets"),--s)return;this.messagesQueueOnRenderAdditional=void 0;this.animateAsLadder(i,h,m,p,e).then(()=>{setTimeout(()=>{this.loadMoreHistory(t,!0)},0)})}}else this.messagesQueueOnRenderAdditional=void 0;return t?this.getHistoryTopPromise=C:this.getHistoryBottomPromise=C,C.then(()=>{t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0}),n?null:(!b&&w.then(()=>{let e;t?(this.loadedTopTimes++,this.loadedBottomTimes=Math.max(0,--this.loadedBottomTimes)):(this.loadedBottomTimes++,this.loadedTopTimes=Math.max(0,--this.loadedTopTimes)),(t&&this.loadedTopTimes>2||!t&&this.loadedBottomTimes>2)&&(e=Object(di.a)(this.bubbles));const s=2*c;e&&e.length>s&&(t?(e=e.slice(s),this.setLoaded("bottom",!1)):(e=e.slice(0,e.length-s),this.setLoaded("top",!1)),this.deleteMessagesByIds(e,!1))}),w.then(()=>{"chat"===this.chat.type&&setTimeout(()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)},0)}),{cached:S,promise:w})}setUnreadDelimiter(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);let t=this.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter(e=>!this.bubbles[e].classList.contains("is-out")).map(e=>+e).sort((e,t)=>e-t).find(e=>e>t),t&&this.bubbles[t])){let s=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==s&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e.maxId&&s.classList.add("is-first-unread"),this.firstUnreadBubble=s,this.attachedUnreadBubble=!0}}deleteEmptyDateGroups(){const e=+!!this.stickyIntersector+1;let t=!1;for(const s in this.dateMessages){const i=this.dateMessages[s];i.container.childElementCount===e&&(i.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(i.container,i.div),delete this.dateMessages[s],t=!0)}t&&(this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function no(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class ao{constructor(e,t,s,n){var r;let l,c,d,h=[],p=[];const u=o.a.canPinMessage(e),g=(a,o,r)=>{setTimeout(()=>{let a;a=s&&!t?u?i.a.unpinAllMessages(e):i.a.hidePinnedMessages(e):i.a.updatePinnedMessage(e,t,s,r,o),n&&a.then(n)},300)};if(s){let s="UnpinMessage";t?(l="UnpinMessageAlertTitle",c="Chat.Confirm.Unpin"):u?(l="Popup.Unpin.AllTitle",c="Chat.UnpinAllMessagesConfirmation",d=[""+((null===(r=i.a.pinnedMessages[e])||void 0===r?void 0:r.count)||1)]):(l="Popup.Unpin.HideTitle",c="Popup.Unpin.HideDescription",s="Popup.Unpin.Hide"),h.push({langKey:s,isDanger:!0,callback:g})}else{l="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(h.push({langKey:t,callback:e=>g(0,!1,!e.size)}),G.a.isBroadcast(e.toChatId())?c="PinMessageAlertChannel":(c="PinMessageAlert",p.push({text:"PinNotify",checked:!0}))):(c="PinMessageAlertChat",e===a.default.myId?h.push({langKey:t,callback:g}):(h.push({langKey:t,callback:e=>g(0,!e.size)}),p.push({text:"PinAlsoFor",textArgs:[new Tt.a({peerId:e}).element],checked:!0})))}Object(yt.a)(h);new St("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}function oo(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class ro extends St{constructor(e,t,s,n){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{o.isValid()&&(n&&n(),i.a.reportMessages(e,t,s,o.value).then(e=>{e&&mt({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");Fs({doc:ys.a.getAnimatedEmojiSticker(ro.STICKER_EMOJI),div:a,emoji:ro.STICKER_EMOJI,width:100,height:100,loop:!1,play:!0}).finally(()=>{this.show()}),this.header.append(a);const o=new O.b({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});o.input.addEventListener("input",()=>{this.buttons[0].element.toggleAttribute("disabled",!o.isValid())}),this.body.append(o.container)}}ro.STICKER_EMOJI="👮‍♀️";class lo extends St{constructor(e,t,s){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const i=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"]];i.forEach(e=>{const t=Object(B.a)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)});const n=ys.a.preloadAnimatedEmojiSticker(ro.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Pe.a)(a.target,"btn-primary"),r=i[Object(zs.a)(o)][1];n.then(()=>{this.hide(),new ro(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class co extends St{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[Object(k.i18n)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(k.default.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}]});const e=new P.b(void 0);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},this.description.replaceWith(e.container),e.container.append(this.description),e.container.classList.add("scrolled-top"),this.show()}}var ho=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class po extends yt.b{constructor(e,t){super("popup-reacted-list",null,{closable:!0,overlayClosable:!0,body:!0}),this.appMessagesManager=e,this.message=t,this.init()}init(){return ho(this,void 0,void 0,(function*(){const e=this.appMessagesManager.getGroupsFirstMessage(this.message),t=this.appMessagesManager.canViewMessageReadParticipants(e),s=new ea,i=Object.assign(Object.assign({},e),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},e.reactions),{pFlags:{},recent_reactions:[]})});i.reactions.results=i.reactions.results.map(e=>Object.assign(Object.assign({},e),{pFlags:{}})),s.init(i,"block"),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const n=document.createElement("div");n.classList.add("tabs-container"),n.dataset.animation="tabs";const a=new Map;let o=!1;if(i.reactions.results.length){const e=this.createFakeReaction("reactions",i.reactions.results.reduce((e,t)=>e+t.count,0));s.prepend(e),i.reactions.results.unshift(e.reactionCount),o=!0}let r=!1;if(t)try{const t=yield this.appMessagesManager.getMessageReadParticipants(e.peerId,e.mid);if(!t.length)throw"";const n=this.createFakeReaction("checks",t.length);s.prepend(n),i.reactions.results.unshift(n.reactionCount),r=!0}catch(e){}i.reactions.results.forEach(t=>{const s=new P.b(void 0);s.container.classList.add("tabs-tab");const i=new zn({noShadow:!0,noDelimiter:!0}),o=Pc.createChatList({dialogSize:72});Pc.setListClickListener(o,()=>{this.hide()},void 0,!1,!0),i.content.append(o),s.container.append(i.container);const r="checks"!==t.reaction,l="checks"===t.reaction;let c;["checks","reactions"].includes(t.reaction)&&(t.reaction=void 0);const d=new Mt({scrollable:s,getPromise:()=>ho(this,void 0,void 0,(function*(){const s=yield this.appMessagesManager.getMessageReactionsListAndReadParticipants(e,void 0,t.reaction,c,r,l);return c=s.nextOffset,s.combined.forEach(({peerId:e,reaction:t})=>{const{dom:s}=Pc.addDialogNew({dialog:e,autonomous:!0,container:o,avatarSize:54,rippleEnabled:!1,meAsSaved:!1,drawStatus:!1});if(t){const e=document.createElement("div");e.classList.add("reacted-list-reaction-icon");Fs({doc:Nt.a.getReactionCached(t).static_icon,div:e,width:24,height:24}),s.listEl.append(e)}Object(T.a)(s.lastMessageSpan,E.a.getUserStatusString(e.toUserId()))}),!c}))});a.set(s.container,d),n.append(s.container)}),this.body.append(n);const l=Object(J.a)(s,n,(e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0);a.get(t).load()});l(0,!1),this.show()}))}createFakeReaction(e,t){const s=new Jn;s.init("block"),s.reactionCount={_:"reactionCount",count:t,reaction:e},s.setCanRenderAvatars(!1),s.renderCounter();const i=document.createElement("div");return i.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),s.prepend(i),s}}const uo="btn-menu-reactions-reaction",go=!ae.IS_SAFARI;class mo{constructor(e,t,s){this.appReactionsManager=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach((e,t)=>{this.onScrollProcessItem(t,e)})},this.onMouseMove=e=>{var t;const s=Object(Pe.a)(e.target,uo);if(!s)return;const i=this.reactionsMap.get(s);if(!i)return;if(!(null===(t=i.appear)||void 0===t?void 0:t.paused))return;const n=i.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const i=this.widthContainer=document.createElement("div");i.classList.add("btn-menu-reactions-container"),i.classList.add("btn-menu-reactions-container-"+t);const n=this.container=document.createElement("div");n.classList.add("btn-menu-reactions");const a=this.scrollable="vertical"===t?new P.b(void 0):new P.a(void 0);n.append(a.container),a.onAdditionalScroll=this.onScroll,a.setListeners(),a.container.classList.add("no-scrollbar"),["big"].forEach(e=>{const t=document.createElement("div");t.classList.add("btn-menu-reactions-bubble","btn-menu-reactions-bubble-"+e),n.append(t)}),this.reactionsMap=new Map,this.animationGroup="CHAT-MENU-REACTIONS-"+Date.now(),I.a.setOverrideIdleGroup(this.animationGroup,!0),he.IS_TOUCH_SUPPORTED||n.addEventListener("mousemove",this.onMouseMove),Object(l.b)(n,e=>{const t=Object(Pe.a)(e.target,uo);if(!t)return;const s=this.reactionsMap.get(t);s&&this.appReactionsManager.sendReaction(this.message,s.reaction)}),i.append(n),this.middleware=null!=s?s:Object(Hs.a)()}init(e){this.message=e;const t=this.middleware.get(),s=this.appReactionsManager.getAvailableReactionsByMessage(e);Object(Qt.a)(s,e=>{if(!t()||!e.length)return;e.forEach(e=>{this.renderReaction(e)});const i=()=>{this.container.classList.add("is-visible")};s instanceof Promise?Object(je.b)(i):i()})}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),I.a.setOverrideIdleGroup(this.animationGroup,!1),I.a.checkAnimations(!0,this.animationGroup,!0)}renderReaction(e){const t=document.createElement("div");t.classList.add(uo);const s=document.createElement("div");s.classList.add(uo+"-scale");const i=document.createElement("div");let n;i.classList.add(uo+"-appear"),a.default.settings.animationsEnabled&&(n=document.createElement("div"),n.classList.add(uo+"-select","hide"));const o={selectWrapper:n,appearWrapper:i,reaction:e.reaction};this.reactionsMap.set(t,o);const r=this.middleware.get(),l=28*(he.IS_TOUCH_SUPPORTED?1:1.25),c={width:l,height:l,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:r};if(a.default.settings.animationsEnabled){let t=!0;Fs(Object.assign({doc:e.appear_animation,div:i,play:!0},c)).then(e=>{Object(Is.a)(e),o.appear=e,e.addEventListener("enterFrame",a=>{e.maxFrame===a&&s.then(e=>{Object(Is.a)(e),i.classList.add("hide"),n.classList.remove("hide"),t&&(o.select=e,t=!1)},Fe.a)})},Fe.a);const s=Fs(Object.assign({doc:e.select_animation,div:n},c)).then(e=>(Object(Is.a)(e),oe.a.waitForFirstFrame(e))).catch(Fe.a)}else delete c.needFadeIn,delete c.withThumb,Fs(Object.assign({doc:e.static_icon,div:i},c));s.append(i),n&&s.append(n),t.append(s),this.scrollable.append(t)}onScrollProcessItem(e,t){const s=e.firstElementChild,i=qa(e,this.scrollable.container);let n;if(i)if(i.overflow.left||i.overflow.right){const e=Math.abs(i.rect.left-i.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(36,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}go&&(s.style.transform=n)}}class bo{constructor(e,t,s,i,n,a,o,r){this.attachTo=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.appPollsManager=n,this.appDocsManager=a,this.appMessagesIdsManager=o,this.appReactionsManager=r,this.onContextMenu=e=>{let t,s;try{s=Object(Pe.a)(e.target,"bubble-content-wrapper"),t=s?s.parentElement:Object(Pe.a)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let i=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),i&&i.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;if(!n)return;const a=this.isSponsored=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!oo(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention"),this.chat.selection.isSelecting&&!s){if(a)return;const e=this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find(e=>this.chat.selection.isMidSelected(this.peerId,e));t&&(n=t)}}this.isOverBubble=!!s;const o=Object(Pe.a)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=this.chat.getMessage(this.mid),this.noForwards=!a&&!this.appMessagesManager.canForward(this.message),this.viewerPeerId=void 0,this.canOpenReactedList=void 0;const r=this.init();i=r.element;const{cleanup:l,destroy:c,menuPadding:d}=r,h=t.classList.contains("is-in")?"left":"right";Object(ee.e)(e.touches?e.touches[0]:e,i,h,d),Object(ee.d)(i,()=>{this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout(()=>{c()},300)})},this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new si(this.peerId,this.chat.getMidsByMid(this.mid))},this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>{if(oo()){ct((this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort((e,t)=>e-t):[this.mid]).reduce((e,t)=>{const s=this.chat.getMessage(t);return e+((null==s?void 0:s.message)?s.message+"\n":"")},"").trim())}else document.execCommand("copy")},this.onCopyAnchorLinkClick=()=>{ct(this.target.href)},this.onCopyLinkClick=()=>{let e;"discussion"===this.chat.type&&(e=this.appMessagesManager.getMessageByPeer(this.peerId,this.chat.threadId));const t=this.appPeersManager.getPeerUsername(e?e.fromId:this.peerId),s=this.appMessagesIdsManager.getServerMessageId(this.mid);let i,n="https://t.me/";t?(n+=t+"/"+(e?this.appMessagesIdsManager.getServerMessageId(e.fwd_from.channel_post):s),e&&(n+="?comment="+s),i="LinkCopied"):(n+="c/"+this.peerId.toChatId()+"/"+s,e&&(n+="?thread="+this.appMessagesIdsManager.getServerMessageId(e.mid)),i="LinkCopiedPrivateInfo"),gt(k.default.format(i,!0)),ct(n)},this.onPinClick=()=>{new ao(this.peerId,this.mid)},this.onUnpinClick=()=>{new ao(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>{if(this.chat.selection.isSelecting)Object(l.d)(this.chat.selection.selectionForwardBtn);else{const e=this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid);new Zs({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Pe.a)(this.target,"grouped-item")||Object(Pe.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new ei(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)},this.listenerSetter=new R.a,this.middleware=Object(Hs.a)(),he.IS_TOUCH_SUPPORTED?Object(l.b)(e,e=>{if(t.selection.isSelecting)return;const s=e.target.className;if(!s||!s.includes)return;t.log("touchend",e);["bubble","bubble-content-wrapper","bubble-content","message","time","inner"].find(e=>s.match(new RegExp(e+"($|\\s)")))&&(Object(c.a)(e),this.onContextMenu(e))},{listenerSetter:this.chat.bubbles.listenerSetter}):Object(ee.a)(e,this.onContextMenu,this.chat.bubbles.listenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup()}filterButtons(e){return this.isSponsored?e.filter(e=>e.isSponsored):e.filter(e=>{let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||he.IS_TOUCH_SUPPORTED,t=e.verify()),t})}setButtons(){this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending(()=>{Object(Is.a)(this.message),this.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)},new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>this.chat.canSend()&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>this.appMessagesManager.canEditMessage(this.message,"text")&&!!this.chat.input.messageInput},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>{if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const s of t)if(this.appMessagesManager.getMessageByPeer(e,s).message)return!0;return!1},notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{ct(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{ct(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>this.appPeersManager.isChannel(this.peerId)&&!this.message.pFlags.is_outgoing},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)&&"scheduled"!==this.chat.type},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{this.appDocsManager.saveDocFile(this.message.media.document)},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let s=!!he.IS_TOUCH_SUPPORTED;const i=!t.type||!["gif","video","sticker"].includes(t.type);return i&&(s=s||!!Object(Pe.a)(this.target,"document")||!!Object(Pe.a)(this.target,"audio")),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return this.appMessagesManager.canEditMessage(this.message,"poll")&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.pFlags.out||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new lo(this.peerId,[this.mid])},verify:()=>!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&this.appPeersManager.isChannel(this.peerId),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new po(this.appMessagesManager,this.message)}},verify:()=>{var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||this.appMessagesManager.canViewMessageReadParticipants(this.message))},notDirect:()=>!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>this.appMessagesManager.canDeleteMessage(this.message)},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new co},verify:()=>!1,isSponsored:!0}]}init(){this.cleanup(),this.setButtons();const e=this.filterButtons(this.buttons),t=this.element=Ie(e,this.listenerSetter);t.id="bubble-contextmenu",t.classList.add("contextmenu");const s=e.find(e=>!e.icon);if(s){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,i=!!(null==t?void 0:t.length),n=this.appMessagesManager.canViewMessageReadParticipants(this.message)?this.appPeersManager.getPeer(this.peerId).participants_count:void 0,a=e?e.results.reduce((e,t)=>e+t.count,0):void 0;s.element.classList.add("tgico-"+(i?"reactions":"checks"));const o=new k.default.IntlElement({key:i?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:i?void 0===n?[a]:[n,n]:void 0,element:s.textElement});let r;r=i?void 0===n?Object(k.i18n)("Chat.Context.ReactedFast",[a]):Object(k.i18n)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):Object(k.i18n)("Loading"),r.classList.add("btn-menu-item-text-fake"),s.element.append(r);const l=3,c=.875;o.element.style.visibility="hidden",o.element.style.paddingRight=i?c*Math.min(l,t.length)+"rem":"1rem";const d=this.middleware.get();this.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then(e=>{if(!d())return;r&&r.remove();const a=e.combined,h=void 0===n?e.reactionsCount:i?a.filter(e=>e.reaction).length:a.length;let p;if(1===a.length)p=new Tt.a({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!i||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(i){const e=h===a.length||void 0===n;p=Object(k.i18n)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[h]:[h,a.length])}else a.length?p=Object(k.i18n)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,h)+"rem",p.classList.add("btn-menu-item-text-fake"),s.element.append(p)),a.length){const e=new Xn({avatarSize:24});e.render(t?t.map(e=>this.appPeersManager.getPeerId(e.peer_id)):a.map(e=>e.peerId)),s.element.append(e.container),this.canOpenReactedList=!0}})}let i,n;if("message"===this.message._&&!this.chat.selection.isSelecting&&!this.message.pFlags.is_outgoing&&!this.message.pFlags.is_scheduled){const e=ae.IS_APPLE||he.IS_TOUCH_SUPPORTED?"horizontal":"vertical";n=this.reactionsMenu=new mo(this.appReactionsManager,e,this.middleware),n.init(this.appMessagesManager.getGroupsFirstMessage(this.message)),t.prepend(n.widthContainer);const s=42+8;i="vertical"===e?{top:24,left:s}:{top:s,right:36,left:24}}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove()},menuPadding:i}}}var vo=s(194),fo=s.n(vo),yo=s(175);class wo{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=Ie(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Object(ee.a)(e.onContextElement,t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach(e=>{e.element.classList.toggle("hide",!e.verify())}),Object(c.a)(t),Object(ee.d)(this.sendMenu))},e.listenerSetter)}setPeerId(e){this.type=e===a.default.myId?"reminder":"schedule"}}var So=s(57),Co=s(77);class Lo extends yt.b{constructor(e){if(super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,s=Object(It.a)(t,"LABEL"),i=Object(Co.a)(t);i||(t.parentElement.classList.add("is-filled"),s.classList.remove("hidden-widget"),s.firstElementChild.removeAttribute("disabled"));!s.nextElementSibling&&!i&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,s=Object(It.a)(t,"LABEL"),i=Object(zs.a)(s);this.correctAnswers&&this.correctAnswers[0][0]===i&&(this.correctAnswers=void 0),s.remove(),this.optionInputFields.splice(i,1),this.optionInputFields.forEach((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1);k.default.weakMap.get(e.label.firstElementChild).update()}),this.handleChange()},Object(k._i18n)(this.title,"NewPoll"),this.questionInputField=new O.b({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()}),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new wo({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const t=document.createElement("hr"),s=document.createElement("div");s.classList.add("caption"),Object(k._i18n)(s,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const n=document.createElement("div");n.classList.add("caption"),Object(k._i18n)(n,"Settings"),this.chat.appPeersManager.isBroadcast(this.chat.peerId)||(this.anonymousCheckboxField=new wt.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new wt.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new wt.a({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)}),this.listenerSetter.add(this.quizCheckboxField.input)("change",()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map(t=>{t.classList.toggle("radio-field",e)}),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach(t=>t.classList.toggle("hide",!e)),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()}),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),Object(k._i18n)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),c=document.createElement("div");c.classList.add("poll-create-questions"),this.quizSolutionField=new O.b({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()});const d=document.createElement("div");d.classList.add("subtitle"),Object(k._i18n)(d,"AddAnExplanationInfo"),c.append(this.quizSolutionField.container,d),a.push(r,o,c),a.forEach(e=>e.classList.add("hide")),this.body.parentElement.insertBefore(t,this.body),this.body.append(s,this.questions,document.createElement("hr"),n,i,...a),Object(l.b)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new P.b(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}getFilledAnswers(){return Array.from(this.questions.children).map((e,t)=>{const s=e.querySelector(".input-field-input");return s instanceof HTMLInputElement?s.value:Object(So.a)(s,!1).value}).filter(e=>!!e.trim())}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const s=this.getFilledAnswers();if(s.length<2)return!1;if(s.find(e=>e.length>100))return!1;const{value:i}=Object(So.a)(this.quizSolutionField.input,!1);return!(i.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){const t=this.questionInputField.value,s=this.getFilledAnswers(),{value:i,entities:n}=Object(So.a)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:s.map((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])})),id:void 0},r=this.chat.appPollsManager.getInputMediaPoll(o,this.correctAnswers,i,n);this.chat.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,s=new O.b({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(s.input)("input",this.onInput);const i=new pt({text:"",name:"question"});i.main.append(s.container),Object(l.b)(s.input,c.a,{listenerSetter:this.listenerSetter}),i.label.classList.add("hidden-widget"),i.input.disabled=!0,this.quizCheckboxField.input.checked||i.label.classList.remove("radio-field"),this.listenerSetter.add(i.input)("change",()=>{if(i.input.checked){const e=Object(zs.a)(i.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}});const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),s.container.append(n),Object(l.b)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(i.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(s)}}var Io=s(87);function Mo(e){const t=e.src;return fetch(t).then(e=>e.arrayBuffer()).then(e=>{const t=new Uint8Array(e);let s=0;for(let e=0,i=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),Object(Io.a)(this.input)}},this.attachFile=e=>{const t=this.willAttach,s=this.shouldCompress(e.type),i={};i.file=e;const n=document.createElement("div");n.classList.add("popup-item"),i.itemDiv=n;const a=s?this.attachMedia(e,i,n):this.attachDocument(e,i,n);return t.sendFileDetails.push(i),a},this.willAttach={type:s,sendFileDetails:[],group:!1},Object(l.b)(this.btnConfirm,()=>this.send(),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new wo({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new P.b(null);i.container.append(this.mediaContainer),this.inputField=new O.b({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:a.default.config.caption_length_max}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",()=>{this.files=[],Eo=void 0}),Eo=this}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new wt.a({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()})):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find(e=>g.has(e.type));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new wt.a({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()})):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter(e=>!this.files.find(t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});let t=this.inputField.value;if(t.length>a.default.config.caption_length_max)return void gt(k.default.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const s=this.willAttach;s.isMedia="media"===s.type||void 0;const{sendFileDetails:i,isMedia:n}=s,{peerId:o,input:r}=this.chat;i.forEach(e=>{e.itemDiv=void 0});const{length:l}=i,c=this.chat.getMessageSendingParams();this.iterate(e=>{t&&e.length!==l&&(this.chat.appMessagesManager.sendText(o,t,Object.assign(Object.assign({},c),{clearDraft:!0})),t=void 0);const i=Object.assign(Object.assign({},s),{sendFileDetails:e});this.chat.appMessagesManager.sendAlbum(o,i.sendFileDetails.map(e=>e.file),Object.assign(Object.assign(Object.assign({},c),{caption:t,isMedia:n,clearDraft:!0}),i)),t=void 0}),r.replyToMsgId=this.chat.threadId,r.onMessageSent()}attachMedia(e,t,s){s.classList.add("popup-item-media");let i;if(e.type.startsWith("video/")){const n=document.createElement("video"),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.setAttribute("playsinline","true"),n.addEventListener("timeupdate",()=>{n.pause()},{once:!0}),i=Object(pe.e)(n).then(()=>{t.width=n.videoWidth,t.height=n.videoHeight,t.duration=Math.floor(n.duration);const e=n.webkitAudioDecodedByteCount;return void 0!==e&&(t.noSound=!e),s.append(n),Object(pe.c)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})}),n.append(a)}else{const n=new Image;i=new Promise(i=>{n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,s.append(n),"image/gif"===e.type?(t.noSound=!0,Promise.all([Mo(n).then(e=>{t.duration=Math.ceil(e)}),Object(pe.b)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})]).then(()=>{i()})):i()}}),n.src=t.objectURL=URL.createObjectURL(e)}return i}attachDocument(e,t,s){s.classList.add("popup-item-document");const i=e.type.startsWith("image/"),n=e.type.startsWith("audio/");(i||n)&&(t.objectURL=URL.createObjectURL(e));const a={_:"document",file:e,file_name:e.name||"",fileName:e.name?X.b.wrapEmojiText(e.name):"",size:e.size,type:i?"photo":"doc"},o=ce.a.getCacheContext(a);o.url=t.objectURL,o.downloaded=e.size;const r=xs({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}}});return new Promise(e=>{const n=()=>{s.append(r),e()};if(i){const e=new Image;e.src=t.objectURL,e.onload=()=>{t.width=e.naturalWidth,t.height=e.naturalHeight,n()},e.onerror=n}else n()})}shouldCompress(e){return"media"===this.willAttach.type&&g.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)}),this.show())}setTitle(){const{willAttach:e,title:t,files:s}=this;let i;const n=[];if("document"===e.type)i="PreviewSender.SendFile",n.push(s.length);else{let e=0,t=0,a=0;s.forEach(s=>{s.type.startsWith("image/")?++e:s.type.startsWith("video/")?++t:++a}),[e,t,a].filter(e=>e>0).length>1?(i="PreviewSender.SendFile",n.push(s.length)):e?(i="PreviewSender.SendPhoto",n.push(e)):t&&(i="PreviewSender.SendVideo",n.push(t))}Object(T.a)(t,Object(k.i18n)(i,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const s=Object(Ia.a)(t.width,t.height,380,320);e.style.width=s.width+"px",e.style.height=s.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach(t=>e([t]));const s=t.length;for(let i=0;i{s.innerHTML="",e.length&&(this.setTitle(),this.iterate(e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map(e=>e.itemDiv)),Bs({container:t,items:e.map(e=>({w:e.width,h:e.height})),maxWidth:380,minWidth:100,spacing:4}),s.append(t)}else e.forEach(e=>{this.appendMediaToContainer(e.itemDiv,e)})}))}).then(()=>{this.onRender()})}}const ko=["ArrowUp","ArrowDown"],xo=["ArrowLeft","ArrowRight"];function Ao({list:e,type:t,onSelect:s,once:i,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?ko.concat(xo):"x"===t?xo:ko);let r;const d=()=>r||e.querySelector(".active")||e.firstElementChild,h=(e,s)=>{if(r===e)return;let i=!1;r&&(i=!0,r.classList.remove("active")),r=e,r&&(r.classList.add("active"),i&&m&&s&&Object(Et.b)({container:m,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},p=(t,s)=>{let i;return i=s?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,i};let u;u="xy"===t?(t,s)=>"ArrowUp"===s||"ArrowDown"===s?((t,s)=>{const i=s?"nextElementSibling":"previousElementSibling",n=s?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[i]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[i]||e[n]}return o})(t,"ArrowDown"===s):p(t,"ArrowRight"===s):(e,t)=>p(e,"ArrowRight"===t||"ArrowDown"===t);let g=s=>{const i=s.key;if(o.has(i)){if(Object(c.a)(s),e.childElementCount>1){let e=d();e=u(e,i),h(e,!0)}}else("Enter"===i||"xy"!==t&&"Tab"===i)&&(Object(c.a)(s),f(d()))};const m=Object(Pe.a)(e,"scrollable");e.classList.add("navigable-list");const b=t=>{const s=Object(ai.a)(t.target,e);s&&h(s,!1)},v=t=>{Object(c.a)(t);const s=Object(ai.a)(t.target,e);s&&(h(s,!1),f(d()))},f=e=>{const t=s(e);(void 0!==t?!t:i)&&S()};let y=!1;const w=()=>{y||(y=!0,document.addEventListener("keydown",g,{capture:!0,passive:!1}),e.addEventListener("mousemove",b,{passive:!0}),Object(l.b)(e,v))},S=()=>{y&&(y=!1,document.removeEventListener("keydown",g,{capture:!0}),e.removeEventListener("mousemove",b),Object(l.c)(e,v))},C=()=>{a||h(e.firstElementChild,!1)};if(a){const e=g;g=t=>{a.has(t.key)&&(Object(c.a)(t),document.removeEventListener("keydown",g,{capture:!0}),g=e,document.addEventListener("keydown",g,{capture:!0,passive:!1}),a=void 0,C())}}else C();return w(),{attach:w,detach:S,resetTarget:C}}class Oo extends j.a{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:s,resetTarget:i}=Ao({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=s,this.resetTarget=i,ae.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},D.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",s(),this.navigationItem&&(D.a.removeItem(this.navigationItem),this.navigationItem=void 0)},{once:!0})},Object(w.a)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,s){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(D.a.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const i=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),Object(cs.a)(this.container,"is-visible",!e,a.default.settings.animationsEnabled&&!s?300:0,()=>{this.hidden&&this.dispatchEvent("hidden")},i)}}class _o extends Oo{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!Ha.onMediaClick({target:e},!0),waitForKey:["ArrowUp","ArrowDown"]}),this.container.classList.add("stickers-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0),a.default.dispatchEvent("choosing_sticker",!0)}),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),a.default.dispatchEvent("choosing_sticker",!1)})}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),ys.a.preloadAnimatedEmojiSticker(e),ys.a.getStickersByEmoticon(e).then(e=>{if(!t())return;this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();let i;this.lazyLoadQueue.clear(),i=e.length?new Promise(t=>{const i=[];e.forEach(e=>{s.append(this.superStickerRenderer.renderSticker(e,void 0,i))}),Promise.all(i).finally(t)}):Promise.resolve(),i.then(()=>{this.list.replaceWith(s),this.list=s,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0})})}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.lazyLoadQueue=new Z.d,this.superStickerRenderer=new ka(this.lazyLoadQueue,Ql)}}const Fo=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Do=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class jo extends Qn{constructor(e,t,s){var i;if(super((i=e).getTime()>Do().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Fo(),maxDate:Do(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),s){const e=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),Object(l.b)(e,()=>{t(2147483646),this.hide()})}}}var Ro=s(143),Bo=s(72);function Uo(e,t=!0){const s=[],i=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),s=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&s==t.endOffset){const i=s-1,n=e.childNodes;if(t.startContainer===e&&n[i]){a=n[i],o=0;for(let e=0;e{s.onEmojiSelected(Ca(e),!0)}}),this.appEmojiManager=i,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new P.a(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollLeft=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach(e=>{Sa(e,this.list,!1,!0)})),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const s=this.controller.getMiddleware();this.appEmojiManager.getBothEmojiKeywords().then(()=>{if(!s())return;const i=e.replace(/^:/,""),n=this.appEmojiManager.searchEmojis(i);this.render(n,":"!==t)})}}class Ho extends Oo{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Ho.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Ho.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach(e=>{const t=Ho.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)})),t||this.toggle(!e.length)}static listElement(e){const t=Ho.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const s=document.createElement("div");s.classList.add(t,e.className),s.dataset.peerId=""+e.peerId;const i=new hc;i.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),i.setAttribute("dialog","0"),i.setAttribute("peer",""+e.peerId);const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?n.innerHTML=X.b.wrapEmojiText(e.name):n.append(new Tt.a({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),s.append(i,n),e.description){const i=document.createElement("div");i.classList.add(t+"-description",e.className+"-description"),i.innerHTML=X.b.wrapEmojiText(e.description),s.append(i)}return s}}function zo(e,t){const s=[].concat(e.bot_info);let i;void 0!==t&&(i=new pa.a({ignoreCase:!0}));const n=new Map;let a;if(s.forEach(e=>{e.commands.forEach((t,s)=>{const a="/"+t.command;n.set(t.command,{peerId:e.user_id.toPeerId(!1),command:t.command,name:a,description:t.description,index:s}),i&&i.indexObject(t.command,a)})}),i){const e=i.search(t);a=Array.from(e).map(e=>n.get(e))}else a=[...n.values()];return a=a.sort((e,t)=>n.get(e.command).index-n.get(t.command).index),a}Ho.BASE_CLASS="autocomplete-peer-helper",Ho.BASE_CLASS_LIST_ELEMENT=Ho.BASE_CLASS+"-list-element";class Vo extends Ho{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${Ho.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return s.getReadyToSend(()=>{s.messageInput.innerHTML=t,s.sendMessage(!0)})}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t){if(!this.appUsersManager.isBot(t))return!1;const s=this.controller.getMiddleware();return Promise.resolve(this.appProfileManager.getProfileByPeerId(t)).then(t=>{if(!s())return;const i=zo(t,e);this.render(i)}),!0}}class Ko{constructor(){this.helpers=new Set,this.middleware=Object(Hs.a)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach(t=>{t!==e&&t.toggle(!0,!0)}),e||this.middleware.clean()}}class Go extends Ho{constructor(e,t,s,i,n){super(e,t,"mentions-helper",e=>{const t=n.getUser(e.dataset.peerId.toUserId());let i,a="";t.username?a="@"+t.username:(a=t.first_name||t.last_name,i={_:"messageEntityMentionName",length:a.length,offset:0,user_id:t.id}),a+=" ",s.insertAtCaret(a,i)}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t,s){const i=e.trim();if(e.length!==i.length)return!1;const n=this.controller.getMiddleware();return this.appProfileManager.getMentions(t&&t.toChatId(),i,s).then(e=>{if(!n())return;const t=i.slice(1).toLowerCase();this.render(e.map(e=>{const s=this.appUsersManager.getUser(e);if(!s.username||s.username.toLowerCase()!==t)return{peerId:e,description:s.username?"@"+s.username:void 0}}).filter(Boolean))}),!0}}var Wo=s(4);class qo extends Ba{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(ai.a)(t,this.element)||t===this.btnHover||(Object(c.a)(e),this.toggle(!1))},Object(w.a)(this,e),this.element.classList.add(qo.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(a.default)("history_reply_markup",({peerId:e})=>{this.peerId===e&&(this.checkAvailability()&&this.isActive()&&this.render(),Object(Ns.c)().then(()=>{this.checkForceReply()}))})}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",()=>{this.render(),he.IS_TOUCH_SUPPORTED&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",()=>{this.listenerSetter.remove(this.touchListener)},{once:!0}))}),this.listenerSetter.add(this.element)("click",e=>{const t=Object(Pe.a)(e.target,"btn");if(!t)return;const s=t.dataset.type,{peerId:i}=this;switch(s){case"keyboardButtonRequestPhone":Ln({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then(()=>{this.appMessagesManager.sendContact(i,a.default.myId)});break;default:this.appMessagesManager.sendText(i,t.dataset.text)}this.toggle(!1)}),super.init()}checkForceReply(){const e=this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}getReplyMarkup(){var e;return null!==(e=this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}render(e=this.getReplyMarkup()){this.element.innerHTML="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(qo.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add(qo.BASE_CLASS+"-button","btn"),t.innerHTML=X.b.wrapEmojiText(s.text),t.dataset.text=s.text,t.dataset.type=s._,e.append(t)}this.element.append(e)}}checkAvailability(e=this.getReplyMarkup()){var t;const s="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",s),s&&this.toggle(!1),!s}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}qo.BASE_CLASS="reply-keyboard";var $o=s(144),Qo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Yo extends Oo{constructor(e,t,s,i,n){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:s,queryId:i}=this.list.dataset;return this.chat.input.getReadyToSend(()=>{const n=this.appInlineBotsManager.generateQId(i,e.dataset.resultId);this.appInlineBotsManager.sendInlineResult(t.toPeerId(),s,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)})}}),this.chat=s,this.appUsersManager=i,this.appInlineBotsManager=n,this._checkQuery=(e,t,s)=>Qo(this,void 0,void 0,(function*(){const i=this.controller.getMiddleware(),n=yield this.appUsersManager.resolveUsername(t);if(!i())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.appInlineBotsManager.getInlineResults(e,n.id,s).then(t=>{var s;if(!i())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const a=this.list.cloneNode();a.dataset.peerId=""+e,a.dataset.botId=""+n.id,a.dataset.queryId=""+t.query_id;const o=new Ea(null,"INLINE-HELPER",this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],c=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=c?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),a.append(t),c)t.classList.add("grid-item");else{n.classList.add("empty"),n.innerHTML=X.b.wrapEmojiText([...e.title.trim()][0]);const s=document.createElement("div");s.classList.add("inline-helper-result-title"),s.innerHTML=X.b.wrapEmojiText(e.title);const i=document.createElement("div");i.classList.add("inline-helper-result-description"),i.innerHTML=X.b.wrapRichText(e.description,{noCommands:!0,noLinks:!0}),t.append(s,i);const o=document.createElement("div");o.classList.add("inline-helper-separator"),a.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let s;n?(s=document.createElement("div"),n.append(s)):s=t,s.classList.add("media-container"),c&&s.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>ce.a.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then(e=>{const t=new Image;t.classList.add("media-photo"),Object($o.a)(e).then(e=>{Os(s,t,e,!0)})})})}}else{const a=e.document||e.photo;if(["sticker","gif"].includes(null===(s=a)||void 0===s?void 0:s.type)&&c)Object(Is.a)(a),"gif"===a.type?o.add(a,t):"sticker"===a.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(a,t,r),2===a.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(a){const e=c?48:void 0;c&&t.classList.add("no-border-radius"),As({photo:a,container:c?t:n,boxWidth:e,boxHeight:e,middleware:i,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then(()=>{if(!i())return void o.clear();a.classList.toggle("is-gallery",c),a.classList.toggle("super-stickers",c),this.container.classList.toggle("is-gallery",c);const s=this.list.parentElement;if(s.textContent="",t.switch_pm){const i=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary");i.insertAdjacentHTML("beforeend",X.b.wrapEmojiText(t.switch_pm.text)),Object(l.b)(i,s=>{this.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)}),s.append(i)}s.append(this.list=a),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0})});return{user:n,renderPromise:a}})),this.container.classList.add("inline-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)}),this.checkQuery=bt(this._checkQuery,200,!0,!0),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)})}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.lazyLoadQueue=new Z.d,this.superStickerRenderer=new ka(this.lazyLoadQueue,"INLINE-HELPER")}}var Xo=s(3);class Jo extends Ho{constructor(e,t,s){super(e,void 0,"bot-commands",e=>{const s=e.querySelector(`.${Ho.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend(()=>{t.messageInput.innerHTML=s,t.sendMessage(!0),this.toggle(!0)})}),this.chatInput=t,this.appProfileManager=s}setUserId(e,t){var s;if(this.userId!==e||!(null===(s=this.list)||void 0===s?void 0:s.childElementCount))return this.userId=e,Object(Qt.a)(this.appProfileManager.getProfile(e),e=>{if(!t())return;const s=zo(e),i=50*s.length+8+24;this.container.style.setProperty("--height",i+"px"),this.render(s)});this.toggle(!1)}}class Zo{constructor(e,t,s,i,n,o,r,d,h,p,u,g,m,b,v){this.chat=e,this.appMessagesManager=t,this.appMessagesIdsManager=s,this.appDocsManager=i,this.appChatsManager=n,this.appPeersManager=o,this.appWebPagesManager=r,this.appImManager=d,this.appDraftsManager=h,this.serverTimeManager=p,this.appNotificationsManager=u,this.appEmojiManager=g,this.appUsersManager=m,this.appInlineBotsManager=b,this.appProfileManager=v,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&Object(c.a)(e),this.recordCanceled=!0,this.recorder.stop(),yo.a.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=he.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=he.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>{const{peerId:s}=this.chat,i=this.chat.bubbles.getMiddleware(),n=a.default.myId!==s&&s.isUser()&&this.appUsersManager.isUserOnlineVisible(s);new jo(t,t=>{if(!i())return;t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout(()=>{i()&&this.appImManager.openScheduled(s)},0)},n).show()},this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,s)=>{Object(c.a)(e);let i=this.messageInput.innerHTML;if(i&&i!==s){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const s=this.messageInput.innerHTML;if(i===s){if(++e>2)break}else e=0;i=s}while(i!==s);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const s=e.code,i=t[s];if(document.getSelection().toString().trim().length&&i&&("KeyK"===s?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(i),Object(c.a)(e)),"KeyZ"===s){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:s,entities:i,caretPos:n}=Uo(this.messageInputField.input),a=X.b.parseMarkdown(s,i,!0),o=X.b.mergeEntities(i,X.b.parseEntities(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._);if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=s.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=vt.a.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.appWebPagesManager.saveWebPage(e),params:{url:t}}).then(s=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===s._?(this.setTopInfo("webpage",()=>{},s.site_name||s.title||"Webpage",s.description||s.url||""),delete this.noWebPage,this.willSendWebPage=s):this.willSendWebPage&&this.onHelperCancel())})}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(!s.trim())this.lastTimeType&&this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide();else{const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"})),this.botCommands&&this.botCommands.toggle(!0)}this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(s,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,X.b.getEmojiEntityFromEmoji(e),t)},this.onBtnSendClick=e=>{if(Object(c.a)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!this.chat.canSend("send_media"))return void gt("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(ii.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),yo.a.setKeepAlive(!0);const e=()=>{new St("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{Object(l.d)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",t=>{Object(Pe.a)(t.target,"chat-input")||Object(Pe.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),D.a.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout(()=>{e()},0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,s=t.context.createAnalyser();t.connect(s),s.fftSize=32;const i=new Uint8Array(s.frequencyBinCount),n=255*i.length;let a=()=>{if(!this.recording)return;s.getByteFrequencyData(i);let e=0;i.forEach(t=>{e+=t});let t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;let o=Date.now()-this.recordStartTime,r=o%1e3,l=(""+o/1e3).toHHMMSS()+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(je.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":gt("Please allow access to your microphone");break;case"NotReadableError":gt(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),gt(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")})}},this.onHelperCancel=(e,t)=>{if(e&&Object(c.a)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=X.b.parseMarkdown(this.messageInputField.value,[]);if(e.message!==t)return void new St("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if(Object(c.a)(e),Object(Pe.a)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&he.IS_TOUCH_SUPPORTED&&!e.container.classList.contains("active")&&Object(ee.d)(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new R.a}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input"),this.chatInput.style.display="none",this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=no();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const s=this.fakeSelectionWrapper=document.createElement("div");s.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,s),this.chatInput.append(this.inputContainer),this.goDownBtn=$({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),Object(l.b)(this.goDownBtn,e=>{Object(c.a)(e),this.chat.bubbles.onGoDownClick()},{listenerSetter:this.listenerSetter});const i=this.controlContainer=document.createElement("div");i.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(i)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=U(""),this.replyElements.cancelBtn=U("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(i=!0,this.canToggleHideAuthor()),t=()=>{i=!1},s=this.forwardElements={};let i=!1;const n=[s.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new wt.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new wt.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new wt.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new wt.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Ie(n,this.listenerSetter),r=Array.from(o.children);if([{elements:r.slice(0,2),onChange:(e,t)=>{const n=!!+e;i&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=k.default.weakMap.get(e),i=s.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=i,t.update()}}},{elements:r.slice(2,4),onChange:e=>{const t=!!+e;let i;i=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?s.hideSender:s.showSender:t?s.showSender:s.hideSender,i.checkboxField.checked=!0}}].forEach(e=>{const t=ot(e.elements.map(e=>({container:e,input:e.querySelector("input")})),e.onChange),s=document.createElement("hr");t.append(s),o.append(t)}),o.append(s.changePeer.element),!he.IS_TOUCH_SUPPORTED){this.forwardHover=new Ba({element:o})}s.modifyArgs=n.slice(0,-1),this.replyElements.container.append(o),s.modifyArgs.forEach((e,t)=>{const{input:s}=e.checkboxField;s.type="radio",s.name=t<2?"author":"caption",s.value=""+ +!(t%2)}),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.sendAsContainer=document.createElement("div"),this.sendAsContainer.classList.add("new-message-send-as-container"),this.sendAsCloseBtn=document.createElement("div"),this.sendAsCloseBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const d=[{text:"SendMessageAsTitle",onClick:void 0}];let h;const p=e=>{e&&(h=this.sendAsAvatar);const t=this.sendAsAvatar!==h,s=!e&&t?2:0;Object(cs.a)(this.sendAsCloseBtn,"is-visible",e,300,void 0,s),t||Object(cs.a)(h,"is-visible",!e,300,void 0,s)};if(Ee({noRipple:!0,listenerSetter:this.listenerSetter,container:this.sendAsContainer},"top-right",d,()=>{p(!0)},()=>{p(!1)}),d[0].element.classList.add("btn-menu-item-header"),this.sendAsBtnMenu=this.sendAsContainer.firstElementChild,this.sendAsBtnMenu.classList.add("scrollable","scrollable-y"),this.sendAsContainer.append(this.sendAsCloseBtn),this.btnToggleEmoticons=U("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type){this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=$({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),Object(l.b)(this.goMentionBtn,e=>{Object(c.a)(e),this.appMessagesManager.goToNextMention(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.btnScheduled=U("scheduled btn-scheduled float hide",{noRipple:!0}),Object(l.b)(this.btnScheduled,e=>{this.appImManager.openScheduled(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("scheduled_new",({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e})=>{this.chat.peerId===e&&this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(e=>{this.btnScheduled.classList.toggle("hide",!e.length)})}),this.btnToggleReplyMarkup=U("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new qo({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,appMessagesManager:this.appMessagesManager,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",()=>this.btnToggleReplyMarkup.classList.add("active")),this.listenerSetter.add(this.replyKeyboard)("close",()=>this.btnToggleReplyMarkup.classList.remove("active")),this.botCommands=new Jo(this.rowsWrapper,this,this.appProfileManager),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const e=document.createElement("div");e.classList.add("new-message-bot-commands-icon-scale");const t=this.botCommandsIcon=document.createElement("div");t.classList.add("animated-menu-icon","animated-menu-close-icon"),e.append(t),this.botCommandsToggle.append(e),Object(l.b)(this.botCommandsToggle,e=>{Object(c.a)(e);t.classList.contains("state-back")?(this.botCommands.toggle(!0),t.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),t.classList.add("state-back"))},{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",()=>{t.classList.add("state-back")}),this.botCommands.addEventListener("hiding",()=>{t.classList.remove("state-back")})}this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...g].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{new Lo(this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=Ee({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.sendAsContainer,this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new Ko,this.stickersHelper=new _o(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new No(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Vo(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new Go(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new Yo(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.appUsersManager,this.appInlineBotsManager),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=U("delete btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=U("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new wo({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),Va.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Va)("open",this.onEmoticonsOpen),this.listenerSetter.add(Va)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(a.default)("settings_updated",()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()}),this.listenerSetter.add(a.default)("draft_updated",({peerId:e,threadId:t,draft:s,force:i})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(s,!0,i)}),this.listenerSetter.add(a.default)("peer_changing",e=>{this.chat===e&&this.saveDraft()}),this.listenerSetter.add(a.default)("chat_changing",({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)}),this.sendAsContainer&&this.listenerSetter.add(a.default)("peer_full_update",e=>{e.isChannel()&&this.chat.peerId===e&&this.updateSendAs()}),"scheduled"===this.chat.type?this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()}):(this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.chat.peerId]&&(this.startParam===Be.a?this.setStartParam():this.center(!0))}));try{this.recorder=new fo.a({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",e=>{let t=e.target.files;t.length&&(new To(this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")},!1),Object(l.b)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&(Object(l.b)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(D.a.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:s}=this.chat,i=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});yo.a.decode(e,!0).then(e=>{yo.a.setKeepAlive(!1),this.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:i,threadId:s,clearDraft:!0}),this.onMessageSent(!1,!0)})}),Object(l.b)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),Object(l.b)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=bt(()=>this.saveDraft(),2500,!1,!0),this.botStartBtn=Object(B.a)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append(Object(k.i18n)("BotStart")),Object(l.b)(this.botStartBtn,()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=Object(Ct.a)([this.botStartBtn],!0),s=this.chat.peerId,i=this.chat.bubbles.getMiddleware(()=>this.chat.peerId===s&&this.startParam===e&&this.toggleBotStartBtnDisability===t);this.appMessagesManager.startBot(s.toUserId(),void 0,e).then(()=>{i()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())})},{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn)}constructPinnedHelpers(){this.pinnedControlBtn=Object(B.a)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",()=>{const e=this.chat.peerId;new ao(e,0,!0,()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)})}),this.chatInput.classList.add("type-pinned")}center(e=!1){const t=this.getNeededFakeContainer();if(!t&&!this.inputContainer.classList.contains("is-centering"))return;if(t===this.fakeWrapperTo)return;const s=t||this.fakeWrapperTo,i=!!t,n=this.fakeWrapperTo;let a,o="",r="";const l=s.getBoundingClientRect(),c=this.fakeRowsWrapper.getBoundingClientRect(),d=c.width,h=l.width;if(d!==h){const e=h/d,t=(d-h)/2;if(a=l.left-c.left-t,i&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=t;const p=e?200:0;return Object(cs.a)(this.inputContainer,"is-centering",i,p),Object(cs.a)(this.rowsWrapperWrapper,"is-centering-to-control",!!(i&&t&&t.classList.contains("chat-input-control")),p),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(t&&t.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:d,widthTo:h}}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==this.startParam||!this.chat.canSend()||"pinned"===this.chat.type||this.chat.isStartButtonNeeded()?this.controlContainer:void 0}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){if(!this.goDownUnreadBadge)return;const e=this.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=Object(So.a)(this.messageInputField.input);let s;(e.length||this.replyToMsgId)&&(s={_:"draftMessage",date:Object(ne.h)(!0)+this.serverTimeManager.serverTimeOffset,message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,s)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.style.display="none",this.goDownBtn.classList.add("hide")),ni(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,s=!1){return!(!s&&!Object(Co.a)(this.messageInput)||"scheduled"===this.chat.type)&&(e||(e=this.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId))?(this.messageInputField.value!==e.rMessage||this.replyToMsgId!==e.reply_to_msg_id)&&(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(e.rMessage,t,t),!0):(s&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then(()=>{Object(je.b)(()=>{this.onMessageSent()})})),!1))}finishPeerChange(e){const t=this.chat.peerId,{forwardElements:s,btnScheduled:i,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,sendAsContainer:l,botCommandsToggle:c}=this;r.style.display="";const d=this.appPeersManager.isBroadcast(t);if(o.classList.toggle("is-broadcast",d),o.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",this.appPeersManager.canPinMessage(t)),s&&(this.forwardWasDroppingAuthor=!1,s.showCaption.checkboxField.setValueSilently(!0),s.showSender.checkboxField.setValueSilently(!0)),i){i.classList.add("hide");const e=this.chat.bubbles.getMiddleware();this.appMessagesManager.getScheduledMessages(t).then(t=>{e()&&i.classList.toggle("hide",!t.length)})}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),c&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),c.remove(),this.appPeersManager.isBot(t))){const e=t.toUserId(),s=this.chat.bubbles.getMiddleware(),i=this.appProfileManager.getProfile(e);Object(Qt.a)(i,e=>{s()&&this.updateBotCommands(e,!(i instanceof Promise))})}l&&(this.sendAsAvatar&&(this.sendAsAvatar.remove(),this.sendAsAvatar=void 0),l.remove(),this.sendAsPeerId=void 0,this.updatingSendAsPromise=void 0,this.updateSendAs(!0)),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput():this.pinnedControlBtn&&this.pinnedControlBtn.append(Object(k.i18n)(this.appPeersManager.canPinMessage(this.chat.peerId)?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this.center(!1)}updateOffset(e,t,s,i){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,Object(cs.a)(this.newMessageWrapper,"has-offset",t,s?0:300,void 0,i)}updateBotCommands(e,t){this.hasBotCommands=e.bot_info&&e.bot_info.commands.length,this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:s}=this,i=s&&this.isInputEmpty();s||t.remove();const n=i,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}updateSendAsButtons(e){const t=e.map((e,t)=>{const s=document.createElement("div"),i=document.createElement("div");return i.classList.add("btn-menu-item-subtitle"),e.isUser()?i.append(Object(k.i18n)("Chat.SendAs.PersonalAccount")):e===this.chat.peerId?i.append(Object(k.i18n)("VoiceChat.DiscussionGroup")):i.append(this.appProfileManager.getChatMembersString(e.toChatId())),s.append(new Tt.a({peerId:e}).element,i),{onClick:t?()=>{const t=this.chat.peerId;if(t.isChannel()){const s=this.appProfileManager.getCachedFullChat(t.toChatId());if(s){s.default_send_as=this.appPeersManager.getOutputPeer(e),this.sendAsPeerId=e,this.updateSendAsAvatar(e),this.updateMessageInputPlaceholder();const t=this.chat.bubbles.getMiddleware(),i=()=>{if(this.sendAsPeerId!==e||!t())return;const s=this.sendAsPeerIds.slice();Object(V.a)(s,e),s.unshift(e),this.updateSendAsButtons(s)};a.default.settings.animationsEnabled?setTimeout(i,250):i()}}vt.a.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(t),send_as:this.appPeersManager.getInputPeerById(e)})}:void 0,textElement:s}}),s=Ie(t);t.forEach((t,s)=>{const i=e[s],n=new hc;n.classList.add("avatar-32","btn-menu-item-icon"),n.setAttribute("peer",""+i),s||n.classList.add("active"),t.element.prepend(n)}),Array.from(this.sendAsBtnMenu.children).slice(1).forEach(e=>e.remove()),this.sendAsBtnMenu.append(...Array.from(s.children))}updateSendAsAvatar(e,t){const s=this.sendAsAvatar;if(s&&+s.getAttribute("peer")===e)return;s||(t=!0);let i=t?0:2;const n=t?0:300,a=this.sendAsAvatar=new hc;a.setAttribute("dialog","0"),a.setAttribute("peer",""+e),a.classList.add("new-message-send-as-avatar","avatar-30"),Object(cs.a)(a,"is-visible",!0,n,void 0,i),s&&Object(cs.a)(s,"is-visible",!1,n,()=>{s.remove()},i),this.sendAsContainer.append(a)}getDefaultSendAs(){return Object(Qt.a)(this.appProfileManager.getChannelFull(this.chat.peerId.toChatId()),e=>e.default_send_as?this.appPeersManager.getPeerId(e.default_send_as):void 0)}updateSendAs(e){const t=this.chat.peerId;if(!t.isChannel()||this.updatingSendAsPromise)return;const s=this.chat.bubbles.getMiddleware(()=>!this.updatingSendAsPromise||this.updatingSendAsPromise===r),{sendAsContainer:i}=this,n=t.toChatId(),a=this.getDefaultSendAs();a instanceof Promise&&(e=void 0);const o=Object(Qt.a)(a,t=>{if(!s()||void 0===t)return;this.sendAsPeerId=t,this.updateSendAsAvatar(t,e),this.updateMessageInputPlaceholder(),this.appChatsManager.getSendAs(n).then(e=>{if(!s())return;const i=e.map(e=>this.appPeersManager.getPeerId(e));this.sendAsPeerIds=i.slice(),Object(V.a)(i,t),i.unshift(t),this.updateSendAsButtons(i)});let a=0;i.parentElement||(this.newMessageWrapper.prepend(i),a=2),this.updateOffset("as",!0,e,a),this.updatingSendAsPromise=void 0}),r=this.updatingSendAsPromise=Promise.resolve(o);return r}updateMessageInputPlaceholder(){const e=k.default.weakMap.get(this.messageInput);if(e){const{peerId:t,threadId:s}=this.chat;let i;i=s?"Comment":this.appPeersManager.isBroadcast(t)?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==a.default.myId||this.appMessagesManager.isAnonymousSending(t)?"SendAnonymously":"Message",e.compareAndUpdate({key:i})}}updateMessageInput(){const{chatInput:e,attachMenu:t,messageInput:s}=this,{peerId:i,threadId:n}=this.chat,a=this.chat.canSend();e.classList.contains("is-hidden")!==!a&&(e.classList.add("no-transition"),e.classList.toggle("is-hidden",!a),e.offsetLeft,e.classList.remove("no-transition")),this.updateMessageInputPlaceholder();const o=this.attachMenuButtons.filter(e=>{const t=e.verify(i,n);return e.element.classList.toggle("hide",!t),t});a?(s.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),s.innerHTML||this.messageInputField.onFakeInput()):s.removeAttribute("contenteditable"),t.toggleAttribute("disabled",!o.length),t.classList.toggle("btn-disabled",!o.length),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new O.b({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),Xo.a&&Object(Xo.b)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",e=>{const t=e.key;if(Object(Ro.a)(e))Object(c.a)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else Object(Io.a)(this.messageInput)}),he.IS_TOUCH_SUPPORTED&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),Va.toggle(!1)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",()=>{this.checkAutocomplete()}),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)})}applyMarkdown(e,t){const s={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"monospace"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!s[e])return!1;const i=s[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e||"spoiler"===e){let t=!1;const s=window.getSelection();if(!s.isCollapsed){const i=s.getRangeAt(0),n=Bo.b[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(document.execCommand("fontName",!1,"Roboto")):a.push("function"==typeof i?i():document.execCommand(i,!1,null))}else a.push("function"==typeof i?i():document.execCommand(i,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=Uo(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match(Zo.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,p=X.b.parseEntities(i);X.b.mergeEntities(a,p);const u=t?Math.max(t.length,e.length):e.length,g=[];t&&(g.push(t),t.offset=d);const m=c?u-c[2].length:u;a.forEach(e=>{e.offset>=d&&(e.offset+=m)}),X.b.mergeEntities(a,g);{const e={_:"messageEntityCaret",offset:d+u,length:0};let t=0;for(let s=a.length;te.offset)break}a.splice(t,0,e)}const b=X.b.wrapDraftText(h,{entities:a});this.messageInputField.setValueSilently(b,!0);const v=this.messageInput.querySelector(".composer-sel");v&&(!function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const s=document.createTextNode("");e.parentNode.insertBefore(s,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=s}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const s=window.getSelection();s.removeAllRanges(),s.addRange(t)}}(v),v.remove()),this.onMessageInput()}checkAutocomplete(e,t,s){if(void 0===e){const i=Uo(this.messageInputField.input,!0);e=i.value,t=i.caretPos,s=i.entities}if(-1===t&&(t=e.length),void 0===s){const t=X.b.parseMarkdown(e,s,!0);s=X.b.mergeEntities(s,X.b.parseEntities(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const i=e.match(Zo.AUTO_COMPLETE_REG_EXP);let n;if(i){const t=s[0];let o=i[2];const r=o[0];if(this.stickersHelper&&a.default.settings.stickers.suggest&&this.chat.canSend("send_stickers")&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?this.appMessagesIdsManager.getServerMessageId(this.chat.threadId):void 0;this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?Be.c:this.chat.peerId,e)&&(n=this.mentionsHelper)}else i[1]||"/"!==r?a.default.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(n=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):this.commandsHelper.checkQuery(o,this.chat.peerId)&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}checkInlineAutocomplete(e,t){let s=!1;if(!t){const i=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(i){const n=i[1],a=e.slice(i[0].length);s=i[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Object(cs.a)(this.btnPreloader,"show",!0,400):(this.btnPreloader=U("none btn-preloader float show disable-hover",{noRipple:!0}),Object(ee.f)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then(({user:e,renderPromise:t})=>{s&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then(()=>{Object(cs.a)(this.btnPreloader,"show",!1,400)})}).catch(Fe.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(cs.a)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Object(cs.a)(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=this.helperFunc;this.clearHelper(),this.updateSendBtn();let t=!1;new Zs(Object(ue.a)(this.forwarding),()=>{t=!0}).addEventListener("close",()=>{this.helperWaitingForward=!1,t||e()})}clearInput(e=!0,t=!0,s=""){if(document.activeElement===this.messageInput&&ae.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),Object(Wo.a)(e),this.messageInputField.setValueSilently(s),Object(Wo.a)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(s);he.IS_TOUCH_SUPPORTED||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let i=!1;e&&(i=this.setDraft(void 0,!1)),!i&&t&&this.onMessageInput()}isInputEmpty(){return Object(Co.a)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach(t=>{this.btnSend.classList.toggle(t,e===t)}),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const s=this.messageInputField.value;X.b.parseEntities(s).filter(e=>"messageEntityEmoji"===e._).forEach(e=>{const t=Object(se.a)(e.unicode);this.appEmojiManager.pushRecentEmoji(t)}),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:s}=this;if("scheduled"===s.type&&!e&&!t)return void this.scheduleSending();const{peerId:i}=s,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=Object(So.a)(this.messageInputField.input);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new ei(i,[t],s.type);this.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.appMessagesManager.sendText(i,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),this.onMessageSent(!1,!1));if(this.forwarding){const e=Object(ue.a)(this.forwarding);setTimeout(()=>{for(const t in e)this.appMessagesManager.forwardMessages(i,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()}));o||this.onMessageSent()},0)}}sendMessageWithDocument(e,t=!1,s=!1){var i;const n="sticker"===(e=this.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!this.chat.canSend(n)?(gt("Posting media content isn't allowed in this group."),!1):"scheduled"!==this.chat.type||t?!!e&&(this.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:s||void 0})),this.onMessageSent(s,!0),"sticker"===e.type&&(null===(i=Va.stickersTab)||void 0===i||i.pushRecentSticker(e)),!0):(this.scheduleSending(()=>this.sendMessageWithDocument(e,!0,s)),!1)}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||Object(It.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=X.b.wrapDraftText(t.message,{entities:t.totalEntities});const i=()=>{const n=this.appMessagesManager.wrapMessageForReply(t,void 0,[t.mid]);this.setTopInfo("edit",i,Object(k.i18n)("AccDescrEditing"),n,s,t),this.editMsgId=e,this.editMessage=t,s=void 0};i()}initMessagesForward(e){const t=()=>{const s=Object.keys(e).map(e=>e.toPeerId()),i=new Set;let n=0,o=0;s.forEach(t=>{const s=e[t];s.forEach(e=>{var s;const n=this.appMessagesManager.getMessageByPeer(t,e);!(null===(s=n.fwd_from)||void 0===s?void 0:s.from_name)||n.fromId||n.fwdFromId?i.add("P"+n.fromId):i.add("N"+n.fwd_from.from_name),n.media&&n.message&&++o}),n+=s.length});const r=i.size>2,l=[...i].map(e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===a.default.myId?Object(k.i18n)("Chat.Accessory.Forward.You"):new Tt.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(It.a)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const d=c.hideCaption.checkboxField.checked;o&&d?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const h=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=Object(k.i18n)(h,[n]),u=document.createDocumentFragment();let g,m;if(l.length<3?u.append(...Object(k.join)(l,!1)):u.append(l[0],Object(k.i18n)("AndOther",[l.length-1])),1===s.length){const t=s[0],i=e[t];if(g=this.appMessagesManager.getMessageByPeer(t,i[0]),m=!!g.grouped_id,m){const e=this.appMessagesManager.getMidsByMessage(g);(e.length!==n||e.find(e=>!i.includes(e)))&&(m=!1)}}const b=document.createDocumentFragment();if(m||1===n){const t=e[s[0]],i=this.appMessagesManager.wrapMessageForReply(g,void 0,t);b.append(u,": ",i)}else b.append(Object(k.i18n)("Chat.Accessory.Forward.From"),": ",u);let v=this.setTopInfo("forward",t,p,b);c.modifyArgs.forEach((e,t)=>{const i=e.textElement,n=k.default.weakMap.get(i);n.args=[t<2?s.length:o],n.update()}),this.forwardHover&&this.forwardHover.attachButtonListener(v,this.listenerSetter),this.forwarding=e};t()}initMessageReply(e){if(this.replyToMsgId===e)return;let t=this.chat.getMessage(e);const s=()=>{let i;"messageEmpty"===t._?(i=Object(k.i18n)("Loading"),this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then(i=>{this.replyToMsgId===e&&(t=i,"messageEmpty"===t._?this.clearHelper("reply"):s())})):i=new Tt.a({peerId:t.fromId,dialog:!1}).element,this.setTopInfo("reply",s,i,t&&t.message,void 0,t),this.replyToMsgId=e};s()}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(D.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(cs.a)(this.chat.container,"is-toggling-helper",!0,150,()=>{this.chat.container.classList.remove("is-toggling-helper")})}setInputValue(e,t=!0,s=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),Object(je.b)(()=>{s&&Object(Io.a)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight})}setTopInfo(e,t,s="",i="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=U(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const c=Rs(s,i,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),"webpage"===e&&(c.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),ae.IS_MOBILE||D.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}Zo.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class er{constructor(e){this.floating=!1,Object(w.a)(this,e);const{divAndCaption:t,className:s}=this;t.container.classList.add("pinned-container","hide"),t.title.classList.add("pinned-container-title"),t.subtitle.classList.add("pinned-container-subtitle"),t.content.classList.add("pinned-container-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add("pinned-container-close",`pinned-${s}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("pinned-container-wrapper"),Object(te.ripple)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add("pinned-container-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){Object(l.b)(e,e=>{Object(c.a)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then(e=>{e&&this.toggle(!0)})},{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const s=(this.floating||b.b.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",s),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",s),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}fill(e,t,s){this.divAndCaption.container.dataset.peerId=""+s.peerId,this.divAndCaption.container.dataset.mid=""+s.mid,this.divAndCaption.fill(e,t,s),this.topbar.setUtilsWidth()}}class tr extends er{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new We("pinned-audio",(e,t)=>{Object(T.a)(this.divAndCaption.title,e),Object(T.a)(this.divAndCaption.subtitle,t)}),onClose:()=>{fe.stop()},floating:!0}),this.topbar=e,this.chat=t,this.appMessagesManager=s,this.onPlaybackRateChange=e=>{this.fasterEl.classList.toggle("active",e>1)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:s})=>{let i,n;"voice"===e.type||"round"===e.type?(i=new Tt.a({peerId:t.fromId}).element,n=Object(ne.d)(t.date),this.fasterEl.classList.remove("hide")):(i=e.audioTitle||e.fileName,n=e.audioPerformer||Object(k.i18n)("AudioUnknownArtist"),this.fasterEl.classList.add("hide")),this.progressLine.setMedia(s),this.fill(i,n,t),this.toggleEl.classList.toggle("flip-icon",!s.paused),this.toggle(!1)},this.divAndCaption.border.remove();const i=U("fast_rewind active",{noRipple:!0}),n=U("fast_forward active",{noRipple:!0}),o=(e,t)=>{Object(l.b)(e,e=>{Object(c.a)(e),t()},{listenerSetter:this.topbar.listenerSetter})};o(i,()=>{fe.previous()}),o(n,()=>{fe.next()}),this.toggleEl=U("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),o(this.toggleEl,()=>{fe.toggle()}),this.wrapper.prepend(this.wrapper.firstElementChild,i,this.toggleEl,n),this.volumeSelector=new Ae(this.listenerSetter,!0);const r=document.createElement("div");r.classList.add("progress-line-container"),r.append(this.volumeSelector.container);const d=document.createElement("div");d.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(d),this.volumeSelector.btn.append(r);const h=this.fasterEl=U("playback_2x",{noRipple:!0});o(h,()=>{fe.playbackRate=h.classList.contains("active")?1:1.75}),this.wrapperUtils.prepend(this.volumeSelector.btn,h);const p=document.createElement("div");p.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new xe(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),p.append(this.progressLine.container),this.wrapper.insertBefore(p,this.wrapperUtils),this.topbar.listenerSetter.add(a.default)("media_play",this.onMediaPlay),this.topbar.listenerSetter.add(a.default)("media_pause",this.onPause),this.topbar.listenerSetter.add(a.default)("media_stop",this.onStop),this.topbar.listenerSetter.add(a.default)("media_playback_params",({playbackRate:e})=>{this.onPlaybackRateChange(e)});const u=fe.getPlayingDetails();u&&(this.onMediaPlay(u),this.onPlaybackRateChange(fe.playbackRate))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}var sr;!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(sr||(sr={}));class ir{constructor(){this.drawRect=(e,t,s,i,n)=>`M${e},${t+n}a${n},${n},0,0,1,${s},0v${i-2*n}a${n},${n},0,0,1,${-s},0Z`,this.getClipPath=(e,t,s)=>{let i="";if(2===s)i=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let s;return e<=1?s=sr.ONE:2===e?s=sr.TWO:3===e?s=sr.THREE:4===e?s=sr.FOUR:e>3&&(s=sr.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=sr.ONE:2===e?s=sr.TWO:3===e?s=sr.THREE:4===e?s=sr.FOUR:e>3&&(s=sr.MORE),s},this.getMarkTranslateY=(e,t,s)=>1===s?0:2===s?e?t+1:0:3===s?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,s,i)=>t<=4||e<=1?0:e>=t-2?i-sr.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?sr.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add("pinned-message-border"),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className="pinned-message-border-wrapper-1",this.border.classList.remove("pinned-message-border-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const s=this.getBarHeight(e,t),i=this.getMarkHeight(e,t),n=this.getTrackHeight(e,s),a="clipPath_"+e,o=this.getClipPath(a,s,e),r=this.getMarkTranslateY(t,s,e),l=this.getTrackTranslateY(t,e,s,n);return this.border.classList.toggle("pinned-message-border-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className="pinned-message-border-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add("pinned-message-border-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${i}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var nr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ar{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=ar.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const s=document.createElement("div"),i=!Object.keys(this.rows).length&&!t;return s.className=ar.BASE_CLASS+"-row"+(i?"":" is-hiding hide"),this.rows[e]={element:s,new:!0},this.container.append(s),s}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout(()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)},ar.DURATION)}setNewRow(e,t=!1){const s=this.rows[e];s.new&&(t?(s.element.classList.remove("hide"),s.element.offsetLeft):s.element.classList.remove("is-hiding","hide"),delete s.new),this.clearRows(e)}animate(e,t,s=e>t,i=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!i)return this.setNewRow(e);const o=["from-top","from-bottom"];s||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}ar.DURATION=200,ar.BASE_CLASS="animated-super";class or{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=or.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=or.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=or.BASE_CLASS+"-decimal-placeholder";const i=new ar;return i.container.className=or.BASE_CLASS+"-decimal-wrapper",t.append(s,i.container),this.container.append(t),this.decimals[e]={container:t,placeholder:s,animatedSuper:i}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout(()=>{this.decimals.splice(t,this.decimals.length-t).forEach(e=>{e.container.remove()})},ar.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(or.EMPTY_INDEX,!0);t.animatedSuper.animate(or.EMPTY_INDEX,s,this.reverse?ethis.previousNumber,!0)}),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map(e=>+e);Array.from(""+e).map(e=>+e).forEach((s,i)=>{var n;const a=this.getDecimal(i),o=a.animatedSuper.getRow(s,!0),r=null!==(n=t[i])&&void 0!==n?n:or.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}or.EMPTY_INDEX=-1,or.BASE_CLASS="animated-counter";class rr{constructor(e,t,s,i){this.topbar=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.isStatic=!1,this.debug=!1,this.listenerSetter=new R.a;const n=new $e("pinned-message");this.pinnedMessageContainer=new er({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>nr(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new ao(this.topbar.peerId,this.pinnedMid,!0):new ao(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new ir,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new ar,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new ar,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new or(!0),n.title.append(Object(k.i18n)("PinnedMessage")," ",this.animatedCounter.container);const o=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(o),n.container.prepend(o),this.btnOpen=U("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),Object(l.b)(this.btnOpen,e=>{Object(c.a)(e),this.topbar.openPinned(!0)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e})=>{e===this.topbar.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))}),this.listenerSetter.add(a.default)("peer_pinned_hidden",({peerId:e})=>{e===this.topbar.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)}),this.setPinnedMessage=bt(()=>this._setPinnedMessage(),100,!0,!0),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const s=t.dataset.mid;t&&void 0!==s&&this.testMid(+s,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let s=this.mids.findIndex(t=>t<=e);if(-1===s||this.isNeededMore(s)){if(!(this.loadedTop&&es))return;this.pinnedIndex=s,this.pinnedMid=this.mids.find(t=>t<=e)||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>rr.LOAD_COUNT&&(!this.loadedBottom&&e<=rr.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=rr.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return nr(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{let s=!1;const i=[this.appMessagesManager.getSearch({peerId:this.topbar.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:rr.LOAD_COUNT,backLimit:rr.LOAD_COUNT}).then(e=>(s=!0,e))];if(!this.pinnedMaxMid){const e=this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))});i.push(e)}const n=(yield Promise.all(i))[0];let a=n.history.findIndex(t=>t.mid<=e);-1===a&&(a=n.history.length),this.offsetIndex=n.offset_id_offset?n.offset_id_offset-a:0,this.mids=n.history.map(e=>e.mid).slice(),this.count=n.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,this.debug&&this.chat.log("[PM]: getCurrentIndex result:",e,n,a,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.chat.log.error("[PM]: getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new R.a,function(e,t,s,i){if(he.IS_TOUCH_SUPPORTED){let n;const a={passive:!0};i.add(e)("touchstart",t=>{t.touches.length>1?r():(n=t.touches[0].clientY,i.add(e)("touchmove",o,a),i.add(e)("touchend",r,a))},a);const o=e=>{const i=e.touches[0].clientY,a=i{i.removeManual(e,"touchmove",o,a),i.removeManual(e,"touchend",r,a)}}else i.add(e)("wheel",e=>{const i=e.deltaY>0;"bottom"===t&&i?s():"top"!==t||i||s()},{passive:!0})}(this.chat.bubbles.scrollable.container,"bottom",()=>{this.unsetScrollDownListener()},this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return nr(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield Object(Ns.c)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.chat.log.error("[PM]: handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return nr(this,void 0,void 0,(function*(){const t=this.chat.getMessage(e);t&&!t.deleted&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then(()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)}))}))}_setPinnedMessage(){return nr(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,s=this.chat.getMessage(this.pinnedMid),i=0===t;this.animatedCounter.container.classList.toggle("is-last",i),i||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.chat.log("[PM]: setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=qe({title:void 0,titleEl:null,subtitle:s.message,subtitleEl:a,message:s,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+s.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}rr.LOAD_COUNT=50,rr.LOAD_OFFSET=5;var lr=Ga,cr=s(127);class dr extends St{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{i.a.mutePeer(e,-1===s?Be.b:Object(cr.a)(!0)+s)}}],body:!0});const t=[{time:3600,langKey:"ChatList.Mute.1Hour"},{time:14400,langKey:"ChatList.Mute.4Hours"},{time:28800,langKey:"ChatList.Mute.8Hours"},{time:86400,langKey:"ChatList.Mute.1Day"},{time:259200,langKey:"ChatList.Mute.3Days"},{time:-1,langKey:"ChatList.Mute.Forever"}].map(e=>new rt({radioField:new pt({langKey:e.langKey,name:"mute-time",value:""+e.time})}));let s;const n=lt(t,e=>{s=+e});t[t.length-1].radioField.checked=!0;const a=new zn({noShadow:!0,noDelimiter:!0});a.content.append(n),this.body.append(a.container),this.show()}}class hr{constructor(e,t,s,i,n,a,o,r,l){this.chat=e,this.appSidebarRight=t,this.appMessagesManager=s,this.appPeersManager=i,this.appChatsManager=n,this.appNotificationsManager=a,this.appProfileManager=o,this.appUsersManager=r,this.appGroupCallsManager=l,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&Object(c.a)(e);const s=e=>{e.forEach(e=>{e.element.classList.toggle("hide",!e.verify())})};t&&(s(this.menuButtons),this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith(Object(k.i18n)(this.appPeersManager.getDeleteButtonText(this.peerId)))),s(this.buttonsToVerify)},this.verifyVideoChatButton=e=>{var t;if(!lr||this.peerId.isUser())return!1;const s=this.appGroupCallsManager.groupCall,i=this.peerId.toChatId();if((null==s?void 0:s.chatId)===i)return!1;if(e&&(this.peerId.isBroadcast()&&"group"===e||this.peerId.isAnyGroup()&&"broadcast"===e))return!1;return(null===(t=this.appChatsManager.getChatTyped(i).pFlags)||void 0===t?void 0:t.call_active)||this.appChatsManager.hasRights(i,"manage_call")},this.verifyCallButton=e=>{if(!Wa||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),s=this.appProfileManager.getCachedFullUser(t);return!!s&&!!("voice"===e?s.pFlags.phone_calls_available:s.pFlags.video_calls_available)},this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new dr(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",b.b.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===b.a.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),ae.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame(()=>{ae.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0})},this.setFloating=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer].filter(Boolean).reduce((e,t)=>{const s=t.divAndCaption.container.classList.contains("is-floating");return this.container.classList.toggle(`is-pinned-${t.className}-floating`,s),e+ +s},0);this.container.dataset.floating=""+e},this.setPeerStatus=(e=!1)=>{if(!this.subtitle)return;const t=this.peerId;this.chat.appImManager.setPeerStatus(this.peerId,this.subtitle,e,!1,()=>t===this.peerId)},this.listenerSetter=new R.a,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar"),this.container.dataset.floating="0",this.btnBack=U("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const s=document.createElement("div");s.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),s.append(this.title);const i=document.createElement("div");i.classList.add("bottom"),this.subtitle&&i.append(this.subtitle),t.append(s,i),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new tr(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=Ee({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(b.b)("changeScreen",this.onChangeScreen),Object(l.b)(this.container,e=>{const t=Object(Pe.a)(e.target,"pinned-container");if(Object(ii.a)(),t){if(Object(c.a)(e),Object(Pe.a)(e.target,"progress-line"))return;const s=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(s);else{const e=t.dataset.peerId.toPeerId(),i=fe.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:s,type:i.isScheduled?"scheduled":i.threadId?"discussion":void 0,threadId:i.threadId})}}else b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown")?n():Object(It.a)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains("is-right-column-shown")):this.appSidebarRight.toggleSidebar(!0)},{listenerSetter:this.listenerSetter});const n=e=>{if(e&&Object(c.a)(e),b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown"))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);D.a.back(e?"im":"chat")}};Object(l.b)(this.btnBack,n,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>b.b.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&!this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.appMessagesManager.togglePeerMute(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.appProfileManager.getChannelFull(this.peerId.toChatId())).then(t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null===(e=t)||void 0===e?void 0:e.linked_chat_id)}},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),M.default.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{M.default.pushToState("chatContextMenuHintWasShown",!0),gt(Object(k.i18n)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}})},verify:()=>!this.chat.selection.isSelecting&&!!Object.keys(this.chat.bubbles.bubbles).length},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(Wt)){const e=new Wt(this.appSidebarRight);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>this.peerId.isUser()&&!this.appPeersManager.isContact(this.peerId)},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Ft({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new St("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Tt.a({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{s(),this.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{i()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()}),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>a.default.myId!==this.peerId&&this.peerId.isUser()&&this.appPeersManager.isContact(this.peerId)&&!!this.appUsersManager.getUser(this.peerId.toUserId()).phone},{icon:"lock",text:"BlockUser",onClick:()=>{new St("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Tt.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&&mt({langPackKey:"UserBlocked"})})}}]}).show()},verify:()=>{var e;if(!this.peerId.isUser())return!1;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==a.default.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"lockoff",text:"Unblock",onClick:()=>{this.appUsersManager.toggleBlock(this.peerId,!1).then(e=>{e&&mt({langPackKey:"UserUnblocked"})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"delete danger",text:"Delete",onClick:()=>{new Ut(this.peerId)},verify:()=>"chat"===this.chat.type&&!!this.appMessagesManager.getDialogOnly(this.peerId)}],this.btnSearch=U("search"),this.attachClickEvent(this.btnSearch,e=>{this.chat.initSearch()},!0)}attachClickEvent(e,t,s){Object(l.b)(e,e=>{Object(c.a)(e),!s&&Object(ii.a)(),t(e)},{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructPeerHelpers(){return this.avatarElement=new hc,this.avatarElement.setAttribute("dialog","1"),this.avatarElement.classList.add("avatar-42","person-avatar"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new rr(this,this.chat,this.appMessagesManager,this.appPeersManager),this.btnJoin=Object(B.a)("btn-primary btn-color-primary chat-join hide"),this.btnCall=U("phone"),this.btnGroupCall=U("videochat"),this.btnPinned=U("pinlist"),this.btnMute=U("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,()=>{this.openPinned(!0)}),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,()=>{const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let s;s=this.appChatsManager.isChannel(t)?this.appChatsManager.joinChannel(t):this.appChatsManager.addChatUser(t,a.default.myId),s.finally(()=>{e()&&this.btnJoin.removeAttribute("disabled")})}),this.listenerSetter.add(a.default)("chat_update",e=>{var t,s;if(this.peerId===e.toPeerId(!0)){const i=this.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(s=null===(t=i)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.left)),this.setUtilsWidth(),this.verifyButtons()}}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{e.peerId===this.peerId&&this.setMutedState()}),this.listenerSetter.add(a.default)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("user_update",e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("peer_full_update",e=>{this.peerId===e&&this.verifyButtons()}),this.pinnedMessage&&this.chat.addEventListener("setPeer",(e,t)=>{const s=this.chat.bubbles.getMiddleware();M.default.getState().then(i=>{s()&&(this.pinnedMessage.hidden=!!i.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))})}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()})}constructDiscussionHelpers(){this.pinnedMessage=new rr(this,this.chat,this.appMessagesManager,this.appPeersManager)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),this.chatAudio&&this.chatAudio.destroy(),delete this.chatAudio,delete this.pinnedMessage}setPeer(e){this.wasPeerId=this.peerId,this.peerId=e,this.container.style.display=e?"":"none"}finishPeerChange(e,t,s){var i,n;const a=this.peerId;this.avatarElement&&(this.avatarElement.setAttribute("peer",""+a),this.avatarElement.update());const o=this.appPeersManager.isBroadcast(a);if(this.btnMute&&this.btnMute.classList.toggle("hide",!o),this.btnJoin)if(this.appPeersManager.isAnyChat(a)){const e=a.toChatId();Object(T.a)(this.btnJoin,Object(k.i18n)(this.appChatsManager.isBroadcast(e)?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(n=null===(i=this.appChatsManager.getChat(e))||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.left))}else this.btnJoin.classList.add("hide");this.setUtilsWidth(),this.verifyButtons();const r=this.chat.bubbles.getMiddleware();if(this.pinnedMessage)if("chat"===this.chat.type){if(void 0!==this.wasPeerId){const e=new rr(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}M.default.getState().then(t=>{r()&&(this.pinnedMessage.hidden=!!t.hiddenPinnedMessages[a],e||this.pinnedMessage.setCorrectIndex(0))})}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());Object(je.b)(()=>{this.setTitle(),this.setPeerStatus(!0),this.setMutedState()})}setTitle(e){var t;let s;if("pinned"===this.chat.type?(s=void 0===e?Object(k.i18n)("Loading"):Object(k.i18n)("PinnedMessagesCount",[e]),void 0===e&&this.appMessagesManager.getSearchCounters(this.peerId,[{_:"inputMessagesFilterPinned"}],!1).then(e=>{const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}})):"scheduled"===this.chat.type?(s=this.peerId===a.default.myId?Object(k.i18n)("Reminders"):Object(k.i18n)("ScheduledMessages"),void 0===e&&this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>{this.setTitle(e.length)})):"discussion"===this.chat.type?(s=void 0===e?Object(k.i18n)("Loading"):Object(k.i18n)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.appMessagesManager.getHistory(this.peerId,0,1,0,this.chat.threadId),Promise.resolve()]).then(()=>{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).count;null===e?setTimeout(()=>{this.setTitle()},30):this.setTitle(e)})):"chat"===this.chat.type&&(s=new Tt.a({peerId:this.peerId,dialog:!0}).element),Object(T.a)(this.title,s),"chat"===this.chat.type){const e=this.appPeersManager.getPeer(this.peerId);(null===(t=null==e?void 0:e.pFlags)||void 0===t?void 0:t.verified)&&this.title.append(Yt())}}setMutedState(){if(!this.btnMute)return;const e=this.peerId;let t=this.appNotificationsManager.isPeerLocalMuted(e,!1);this.appPeersManager.isBroadcast(e)?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}}class pr extends H{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new _("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=U("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new A(e,this.inputSearch,{messages:new x("Chat.Search.PrivateSearch","messages")})}open(e,t,s,i){const n=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,i):(this.query=i,this.peerId=e,this.threadId=t,this.onDatePick=s,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&Object(l.b)(this.btnPickDate,()=>{new Qn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),rs.toggleSidebar(!0)),n}}class ur{constructor(e,t,s){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new Qn(new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=Object(It.a)(e.target,"LI");t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.bubblesContainer.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),Object(te.ripple)(this.backBtn);const i=this.listenerSetter=new R.a,n=(e,t)=>{Object(l.b)(e,t,{listenerSetter:i})};n(this.backBtn,()=>{this.destroy()}),this.inputSearch=new _("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new x(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new A(this.results,this.inputSearch,{messages:this.searchGroup},e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):(Object(T.a)(this.foundCountEl,this.inputSearch.value?Object(k.i18n)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))}),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.bubblesContainer.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),Object(te.ripple)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),s&&this.setQuery(s),ae.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},D.a.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.chat.search=void 0,D.a.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),s=+e.dataset.mid||void 0,i=Object(zs.a)(e);i===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),i?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active");const n=this.chat.setPeer(t,s);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then(()=>{this.selectedIndex=i,Object(T.a)(this.foundCountEl,Object(k.i18n)("Of",[i+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()}).finally(()=>{this.setPeerPromise=null})}}class gr{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find(t=>Object(ge.a)(t.options,e));return t||(t=new gr,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.createCanvasPattern(e).then(()=>this.fillCanvas(e))}createCanvasPattern(e){return this.createCanvasPatternPromise?this.createCanvasPatternPromise:this.createCanvasPatternPromise=new Promise(t=>{const s=document.createElement("img");s.crossOrigin="anonymous",Object(vs.b)(s,this.options.url,!1).then(()=>{let i;if(ae.IS_SAFARI){const e=i=document.createElement("canvas");e.width=s.naturalWidth,e.height=s.naturalHeight;e.getContext("2d").drawImage(s,0,0,e.width,e.height)}else i=s;this.pattern=e.getContext("2d").createPattern(i,"repeat-x"),t()})})}exportCanvasPatternToImage(e){return this.exportCanvasPatternToImagePromise?this.exportCanvasPatternToImagePromise:this.exportCanvasPatternToImagePromise=new Promise(t=>{e.toBlob(e=>{const s=this.objectUrl=URL.createObjectURL(e);t(s)},"image/png")})}cleanup(e){this.canvases.delete(e),this.canvases.size||(Object(V.a)(gr.INSTANCES,this),this.objectUrl&&URL.revokeObjectURL(this.objectUrl))}fillCanvas(e){const t=e.getContext("2d");t.fillStyle=this.pattern,t.fillRect(0,0,e.width,e.height)}setCanvasDimensions(e){e.width=this.options.width*window.devicePixelRatio,e.height=this.options.height*window.devicePixelRatio*1.5}createCanvas(){const e=document.createElement("canvas");return this.canvases.add(e),this.setCanvasDimensions(e),e}}gr.INSTANCES=[];class mr extends j.a{constructor(e,t,s,i,n,a,o,r,l,c,d,h,p,u,g,m,b,v,f,y,w){super(),this.appImManager=e,this.appChatsManager=t,this.appDocsManager=s,this.appInlineBotsManager=i,this.appMessagesManager=n,this.appPeersManager=a,this.appPhotosManager=o,this.appProfileManager=r,this.appStickersManager=l,this.appUsersManager=c,this.appWebPagesManager=d,this.appPollsManager=h,this.apiManager=p,this.appDraftsManager=u,this.serverTimeManager=g,this.storage=m,this.appNotificationsManager=b,this.appEmojiManager=v,this.appMessagesIdsManager=f,this.appGroupCallsManager=y,this.appReactionsManager=w,this.type="chat",this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=Object(Y.b)("CHAT",Y.a.Log|Y.a.Warn|Y.a.Debug|Y.a.Error),this.peerId=Be.c,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0}setBackground(e,t){const s=a.default.getTheme();let i;if(!!s.background.color&&!s.background.slug&&!s.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=s.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const n=++this.backgroundTempId,o=this.gradientRenderer,r=this.patternRenderer,l=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const c=s.background.intensity&&s.background.intensity/100,d=!!c&&c<0;let h,p,u,g=null==i?void 0:i.firstElementChild;if(!i)if(i=document.createElement("div"),i.classList.add("chat-background-item"),e)if(c){i.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=gr.getInstance({url:e,width:t.width,height:t.height}),g=this.patternCanvas=h.createCanvas(),g.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas")}else s.background.slug&&i.classList.add("is-image");else s.background.color&&i.classList.add("is-color");const m=s.background.color;if(m){const{canvas:e,gradientRenderer:t}=Zi.create(m);u=this.gradientRenderer=t,p=this.gradientCanvas=e,p.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),a.default.settings.animationsEnabled&&u.scrollAnimate(!0)}if(h){(d?p:g).style.setProperty("--opacity-max",""+Math.abs(c))}const b=new Promise(s=>{const a=()=>{if(this.backgroundTempId!==n)return h&&h.cleanup(g),void(u&&u.cleanup());const e=this.backgroundEl.lastElementChild;if(e===i)return void s();const a=[p,d?void 0:g].filter(Boolean);a.length&&i.append(...a),this.backgroundEl.append(i),Object(cs.a)(i,"is-visible",!0,t?0:200,e?()=>{r&&r.cleanup(l),o&&o.cleanup(),e.remove()}:null,2),s()};if(h){h.renderToCanvas(g).then(()=>{let e;e=d?h.exportCanvasPatternToImage(g).then(e=>{this.backgroundTempId===n&&(p.style.webkitMaskImage=`url(${e})`)}):Promise.resolve(),e.then(a)})}else e?Object(vs.a)(i,e,a):a()});return this.setBackgroundPromise=Promise.race([Object(ca.a)(500),b])}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new hr(this,rs,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new io(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager,this.appChatsManager,this.appReactionsManager),this.input=new Zo(this,this.appMessagesManager,this.appMessagesIdsManager,this.appDocsManager,this.appChatsManager,this.appPeersManager,this.appWebPagesManager,this.appImManager,this.appDraftsManager,this.serverTimeManager,this.appNotificationsManager,this.appEmojiManager,this.appUsersManager,this.appInlineBotsManager,this.appProfileManager),this.selection=new ci(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new bo(this.bubbles.bubblesContainer,this,this.appMessagesManager,this.appPeersManager,this.appPollsManager,this.appDocsManager,this.appMessagesIdsManager,this.appReactionsManager),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),"scheduled"===this.type||he.IS_TOUCH_SUPPORTED||this.bubbles.setReactionsHoverListeners(),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.bubblesContainer,this.input.chatInput),this.bubbles.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)}),this.bubbles.listenerSetter.add(a.default)("dialog_drop",e=>{e.peerId===this.peerId&&this.appImManager.setPeer()})}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.selection.cleanup()}setPeer(e,t,s){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const i=this.peerId===e;if(i){if(this.setPeerPromise)return}else a.default.dispatchEvent("peer_changing",this),this.peerId=e||Be.c;if(!e)return rs.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.default.dispatchEvent("peer_changed",e);if(!i){const t=rs.getTab(pr);t&&t.close(),this.noForwards=this.appPeersManager.noForwards(e),this.isRestricted=this.appPeersManager.isRestricted(e),this.container.classList.toggle("no-forwards",this.noForwards),rs.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=i,void 0===s&&this.isStartButtonNeeded()&&(s=Be.a);const n=this.bubbles.setPeer(e,t,s);if(!n)return;const{promise:o}=n,r=this.setPeerPromise=o.finally(()=>{this.setPeerPromise===r&&(this.setPeerPromise=null)});return i||(rs.sharedMediaTab.setLoadMutex(this.setPeerPromise),rs.sharedMediaTab.loadSidebarMedia(!0)),n}setAutoDownloadMedia(){this.autoDownload=function(e){let t,s=0,i=0,n=0;const o=a.default.settings;return!o.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?e.isContact()?"contacts":"private":e.isBroadcast()?"channels":"groups",o.autoDownload.photo[t]&&(s=o.autoDownloadNew.photo_size_max),o.autoDownload.video[t]&&(i=o.autoDownloadNew.video_size_max),o.autoDownload.file[t]&&(n=o.autoDownloadNew.file_size_max)),{photo:s,video:i,file:n}}(this.peerId)}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,s,i){if(this.peerChanged)return;let n=this.peerId;this.peerChanged=!0,this.cleanup(!1),this.topbar.setPeer(n),this.topbar.finishPeerChange(e,t,s),this.bubbles.finishPeerChange(),this.input.finishPeerChange(i),rs.sharedMediaTab.fillProfileElements(),this.log.setPrefix("CHAT-"+n+"-"+this.type),a.default.dispatchEvent("peer_changed",n),this.wasAlreadyUsed=!0}getMessagesStorage(){return this.appMessagesManager.getMessagesStorage(this.peerId)}getMessage(e){return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(),e)}getMidsByMid(e){return this.appMessagesManager.getMidsByMessage(this.getMessage(e))}isAnyGroup(){return this.peerId===a.default.myId||this.peerId===Be.d||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)this.search?this.search.setQuery(e):this.search=new ur(this.topbar,this,e);else{let t=rs.getTab(pr);t||(t=new pr(rs)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return this.appPeersManager.isBot(this.peerId)&&!this.appMessagesManager.getDialogOnly(this.peerId)&&!this.appMessagesManager.getHistoryStorage(this.peerId).history.length}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,sendSilent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}}var br=s(178);class vr{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,he.IS_TOUCH_SUPPORTED){if(e&&Object(c.a)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools");["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach(t=>{const s=U(t,{noRipple:!0});e.append(this.buttons[t]=s),"link"!==t?s.addEventListener("mousedown",e=>{Object(c.a)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()}):Object(l.b)(s,e=>{Object(c.a)(e),this.showLinkEditor(),this.cancelClosening()})}),this.linkBackButton=U("left",{noRipple:!0}),this.linkInput=document.createElement("input"),Object(k._i18n)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",e=>{const t=!this.linkInput.value.length||!!X.b.matchUrl(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))}),this.linkInput.addEventListener("input",e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")}),this.linkBackButton.addEventListener("mousedown",e=>{Object(c.a)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()}),this.linkApplyButton=U("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",e=>{this.applyLink(e)});const s=document.createElement("div");s.classList.add("markup-tooltip-link-apply-container");const i=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");i.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(i,this.buttons.link),s.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,s),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",()=>{this.hide()})}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout(()=>{this.linkInput.focus()},200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){Object(c.a)(e),this.resetSelection();let t=this.linkInput.value;t&&!X.b.matchUrlProtocol(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout(()=>{this.hide()},0)}isLinkValid(){return!this.linkInput.value.length||!!X.b.matchUrl(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,D.a.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout(()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")},200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let s=0;s!!e)}(),t=[...new Set(e.map(e=>e.parentNode))],s=new Set;return t.forEach(e=>{for(const t in Bo.b){const i=Bo.b[t];e.closest(i.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&s.add(this.buttons[t])}}),[...s]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const s=this.buttons[t];s.classList.toggle("active",e.includes(s))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),s=document.body.getBoundingClientRect(),i=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=qa(void 0,this.appImManager.chat.input.messageInput,!1,i).rect.top+-1*s.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=Object(Se.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(Se.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),oo())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),ae.IS_MOBILE||D.a.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){he.IS_TOUCH_SUPPORTED&&!ae.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",e=>{Object(c.a)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()},{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const s=document.getSelection();if(oo(s))this.hide();else if(he.IS_TOUCH_SUPPORTED)if(ae.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=s.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()}))}}function fr(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function yr(e,t,s,i,n,a,o,r){const l=[];return l.push("M"+(e+s/2)+","+t),l.push("H"+(e+s-a)),a>0&&l.push("A"+fr(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+fr(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+fr(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+fr(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}le.a.generatePathData=yr;class wr{constructor(e,t){let s;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(s=document.createElement("div"),s.classList.add("drop-icon","tgico-"+t.icon));const i=document.createElement("div");let n;i.classList.add("drop-header"),i.append(Object(k.i18n)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append(Object(k.i18n)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,s,i,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",""+e.width),this.svg.setAttributeNS(null,"height",""+e.height);const t=yr(5,5,e.width-10,e.height-10,10,10,10,10);this.path.setAttributeNS(null,"d",t)}}function Sr(e){e.forEach(e=>e.classList.add("no-transition")),Object(je.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var Cr=s(169),Lr=s(24),Ir=s(137),Mr=s(125);class Er{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:s,minRadius:i,speed:n}=this,a=s-i;e[t]=i+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:s,N:i}=this;for(let n=0;n=1&&(i[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,s,i,n,a,o,r){if(n.getContext){const l=n.getContext("2d");l.beginPath(),l.moveTo(s,i),l.lineTo(e,i);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const s=this.progress[n],i=(t-(c[n]*(1-s)+d[n]*s))*r+o*(1-r);l.lineTo(e,i)}else{const a=this.progress[n-1],p=c[n-1]*(1-a)+d[n-1]*a,u=this.progress[n],g=(s-e)/h*(n-1),m=(s-e)/h*n,b=g+(m-g)/2,v=(t-p)*r+o*(1-r),f=(t-(c[n]*(1-u)+d[n]*u))*r+o*(1-r);l.bezierCurveTo(b,v,b,f,m,f),n===h&&l.lineTo(s,i)}a(l),l.fill(),l.closePath()}}}class Pr{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,s,i,n,a)=>{t.fillStyle=Pr.getGradientFromType(t,e,s,i,n,a)}}static getGradientFromType(e,t,s,i,n,a){const o=e.createLinearGradient(s,i,n,a);return t===Mr.a.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===Mr.a.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===Mr.a.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===Mr.a.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,s,i){}}class Tr{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout(()=>{this.resizing=!1,this.invokeDraw()},250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:s,lbd2:i,scale:n,left:a,top:o,right:r,bottom:l,currentState:c,previousState:d,focused:h,resizing:p,canvas:u}=this;if(!h&&!p&&this.progressToState>=1)return;let g=Date.now()-this.lastUpdateTime;g>20&&(g=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*g,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:m,amplitude2:b,progressToState:v}=this,f=6*b*n,y=6*b*n;u.getContext("2d").clearRect(0,0,u.width,u.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,t.update(m,.3),s.update(m,.7),i.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-v,h=d):(n=d?v:1,c.update(l-o,r-a,g,m),h=c);const p=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},b=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};s.draw(a,o-f,r,l,u,p,o,1),i.draw(a,o-y,r,l,u,p,o,1),t.draw(a,o,r,l,u,b,o,1)}e||(this.raf=requestAnimationFrame(()=>this.draw()))},this.setCurrentState=(e,t)=>{const{currentState:s,states:i}=this;(null==s?void 0:s.stateId)!==e&&(this.previousState=t?s:null,this.currentState=i.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[Mr.a.UNMUTED,new Pr(Mr.a.UNMUTED)],[Mr.a.MUTED,new Pr(Mr.a.MUTED)],[Mr.a.MUTED_BY_ADMIN,new Pr(Mr.a.MUTED_BY_ADMIN)],[Mr.a.CONNECTING,new Pr(Mr.a.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(Mr.a.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new Er(3),this.lbd1=new Er(7),this.lbd2=new Er(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const s=this.canvas=document.createElement("canvas");return s.classList.add(e+"-canvas"),t.append(s),t}}var kr=new class{constructor(){this.cache={},a.default.addEventListener("theme_change",()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let t in e)this.getProperty(t)})}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}};class xr{constructor(e,t){this.item=e,Object(w.a)(this,t)}play(e){return this.item.playPart(this,e)}}class Ar{constructor(e,t){this.icon=e,this.autoplay=!1,Object(w.a)(this,t),this.parts=this.parts.map(e=>this.createPart(e))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:s,canvas:i,width:n,height:a}=this.icon;return t=oe.a.loadAnimationAsAsset({container:s,canvas:i,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then(e=>oe.a.waitForFirstFrame(e)).then(e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)}),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new xr(this,e)}getPart(e){return e instanceof xr?e:"string"==typeof e?this.parts.find(t=>t.name===e):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class Or{constructor(e){Object(w.a)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:s}=this;this.container.style.width=t+"px",this.container.style.height=s+"px";const i=this.canvas=document.createElement("canvas");i.classList.add("rlottie"),i.width=t,i.height=s,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Fe.a)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Ar(this,e);return this.items.set(e.name,t),t}playPart(e,t,s){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,s)});const i=e.getPart(t);e.player.playPart({from:a.default.settings.animationsEnabled&&!this.skipAnimation?i.startFrame:i.endFrame,to:i.endFrame,callback:s})}static generateEqualParts(e,t){return new Array(e).fill(0).map((e,s)=>{const i=s*t;return{startFrame:i,endFrame:i+t-1}})}}class _r extends Or{constructor(e){super({width:e.width,height:e.height}),Object(w.a)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const s=this.getPart(e),i=void 0!==t&&this.getColor&&this.getColor(t),n=s.item;n.initFrame=s.endFrame,n.color=i;const a=[...this.items.values()].map(e=>e.load());return Promise.all(a).then(Fe.a)}setState(e,t,s){this.loaded||this.load(e,t);let i=!1,n=!1;return void 0!==e?i=this.setPartState(e,t,s):void 0!==t&&(n=this.setColorState(t)),i||n}setPartState(e,t,s){const{partState:i}=this;if(i===e)return void 0!==t&&this.setColorState(t);void 0!==t&&this.setColorState(t,!1),this.partState=e;return this.getPart(e,i).play(s),!0}setColorState(e,t=!0){const{colorState:s}=this;if(s===e||!this.getColor)return!1;this.colorState=e;const i=this.getItem(),n=this.getColor(e,s),a=()=>{i.player.setColor(n,t)};return i.player?a():i.onLoadForColor=a,!0}destroy(){this.items.forEach(e=>{e.loadPromise.then(()=>{e.player.remove()})})}}class Fr extends _r{constructor(){super({width:36,height:36,getPart:(e,t)=>{const s=Yr;let i;switch(e){case s.HAND:i=t===s.MUTED?"muted-to-hand":"unmuted-to-hand";break;case s.MUTED:i=t===s.HAND?"hand-to-muted":"mute";break;case s.UNMUTED:i="unmute"}return this.getItem().getPart(i)}});this.container.classList.add("group-call-microphone-icon-container");this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}class Dr extends _r{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const s=Qr;let i;switch(e){case s.HAND:i=3;break;case s.MUTED:i=t===s.HAND?0:2;break;case s.UNMUTED:i=1}return this.getItem().getPart(i)},getColor:e?(e,t)=>function(e){const t=Qr;let s,i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const n=kr.getProperty("gc-"+i+"-text-color");return s=Qi(n),s}(e):void 0}),this.colored=e;this.container.classList.add("group-call-participant-muted-icon-container");const t=Or.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=Qr;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}class jr{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-status-container")}setState(e,t){const s=Qr,i=this.withIcons.filter(e=>!!t[e]).map(e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),s=document.createElement("i");return s.classList.add("group-call-participant-status-icon","group-call-participant-status-icon-"+e,t),s});let n,a;if(e===s.MUTED_FOR_ME)n=Object(k.i18n)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===s.UNMUTED)n=Object(k.i18n)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===s.HAND)n=Object(k.i18n)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!i.length)return void m(this.container,X.b.wrapEmojiText(t.about));n=Object(k.i18n)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add("group-call-participant-status",a),o.append(...i,n),Object(T.a)(this.container,o)}}class Rr extends Gs{constructor(e){super({getIndex:e=>e.participant.date,onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>{const{participant:t}=e,s=tl(t);e.mutedIcon.setState(s),e.status.setState(s,t)},onSort:(e,t)=>{Vs(e.dom.listEl,this.list,t)},onElementCreate:t=>{const{dom:s}=Pc.addDialogNew({dialog:t.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});s.listEl.classList.add("group-call-participant");const i=e.participants.get(t.id),n=tl(i),a=new Dr(!0),o=new jr(["presentation","video"]);return a.setState(n),o.setState(n,i),Object(T.a)(s.lastMessageSpan,o.container),s.listEl.append(a.container),t.dom=s,t.participant=i,t.mutedIcon=a,t.status=o,t},updateElementWith:je.b}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=Pc.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach(e=>{this.onElementDestroy(e)})}onElementDestroy(e){e.mutedIcon.destroy()}}function Br(e){const t=document.createElement("canvas");t.classList.add("call-video-blur");t.width=16,t.height=16;const s=t.getContext("2d");s.filter="blur(2px)";const i=()=>{s.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return Object(Ne.a)(()=>(i(),t.isConnected)),i(),t}class Ur{constructor(e,t,s){this.appPeersManager=e,this.instance=t,this.source=s,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-video-container"),this.info=document.createElement("div"),this.info.classList.add("group-call-participant-video-info"),this.left=document.createElement("div"),this.left.classList.add("group-call-participant-video-info-left"),this.right=document.createElement("div"),this.right.classList.add("group-call-participant-video-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add("group-call-participant-video-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,s){let i;e.pFlags.self?(i=Object(k.i18n)("VoiceChat.Status.You"),i.classList.add("peer-title")):(this.peerTitle=new Tt.a({peerId:this.appPeersManager.getPeerId(e.peer)}),i=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Dr(!1),this.groupCallParticipantStatus=new jr([t]),this.left.append(i,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),s.classList.add("group-call-participant-video","call-video"),s.paused&&s.play();const n=Br(s);n.classList.add("group-call-participant-video-blur"),this.container.prepend(n,s),this.updateParticipant(e)}updateParticipant(e){const t=tl(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Nr extends Te{constructor(e){super(),Object(w.a)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:s}=this;s.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)}),s.add(this.instance)("pinned",e=>{this.participantsElements.forEach(t=>{t.forEach(t=>{this.setElementDisplay(t,e)})})}),Object(l.b)(this.container,e=>{const t=Object(Pe.a)(e.target,"group-call-participant-video-container");if(!t)return;const s=this.containers.get(t);this.instance.pinnedSource!==s.source?this.instance.pinSource(s.source):this.instance.unpinAll()},{listenerSetter:s}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:s,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const s=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!s);const i=e.source===t;e.setPinned(i)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=["video","presentation"],i=s.some(t=>!!e[t]);let n=this.participantsElements.get(t);(i||n)&&(n||this.participantsElements.set(t,n=new Map),s.forEach(s=>{let i=n.get(s);const a=e[s];if(!!a!=!!i){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,s);if(!t)return;const{video:a,source:o}=t;i=new Ur(this.appPeersManager,this.instance,o),this.containers.set(i.container,i),this.setElementDisplay(i,this.instance.pinnedSource),n.set(s,i),i.setParticipant(e,s,a),this.container.prepend(i.container)}else n.delete(s),i.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(i.container),i.destroy());this._onLengthChange()}else i&&i.updateParticipant(e)}))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.containers.forEach(e=>{e.destroy()})}}class Hr{constructor(e){this.onOpenProfileClick=()=>{const e=yt.b.getPopups(il)[0];e&&e.hide(),a.default.dispatchEvent("history_focus",{peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.appGroupCallsManager.editParticipant(this.instance.id,this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>{Ln({peerId:this.targetPeerId,title:new Tt.a({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Tt.a({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then(()=>{this.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)},Fe.a)}}];const{listenerSetter:t}=e;this.appChatsManager=e.appChatsManager,this.appPeersManager=e.appPeersManager,this.appGroupCallsManager=e.appGroupCallsManager,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=Ie(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Object(ee.a)(e.onContextElement,e=>{const t=Object(Pe.a)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==s&&s.append(this.element);const i=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=this.instance.getParticipantByPeerId(i),this.participant.pFlags.self||(this.canManageCall=this.appChatsManager.hasRights(this.chatId,"manage_call"),this.buttons.forEach(e=>{e.element.classList.toggle("hide",!e.verify(i))}),Object(c.a)(e),Object(ee.e)(e.touches?e.touches[0]:e,this.element,"right"),Object(ee.d)(this.element))},t),t.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=this.appPeersManager.getPeerId(t.peer);this.targetPeerId===e&&Object(ee.c)()}});let s=document.body;Object(ke.a)(document.body,()=>{const e=Object(ke.d)();s=e?yt.b.getPopups(il)[0].getContainer():document.body,e||Object(ee.c)()},t)}}class zr{constructor(e){Object(w.a)(this,e);const t=new P.b(void 0);t.container.classList.add("group-call-participants-scrollable");const s=this.container=document.createElement("div");s.classList.add("group-call-participants");const i=this.sortedList=new Rr(this.instance),{instance:n,listenerSetter:o}=this;this.contextMenu=new Hr(Object.assign(Object.assign({},e),{onContextElement:i.list,listenerSetter:o,instance:n})),this.groupCallParticipantsVideo=new Nr(Object.assign(Object.assign({},e),{appendTo:t.container,displayPinned:!1})),t.append(i.list),s.append(t.container),e.appendTo.append(s),o.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)});new Mt({scrollable:t,getPromise:()=>this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants:e,isEnd:t})=>(e.forEach(e=>{this.updateParticipant(e)}),t))});this.setInstance(n)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=this.sortedList.has(t);e.pFlags.left?s&&this.sortedList.delete(t):s?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class Vr{constructor(e){this.appendTo=e,this.descriptionIntl=new k.default.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let s,i;t===Mr.a.CONNECTING?s="VoiceChat.Status.Connecting":(s="VoiceChat.Status.Members",i=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:s,args:i}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class Kr{constructor(e){this.appendTo=e,this.peerTitle=new Tt.a({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?m(s,X.b.wrapEmojiText(i.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==s&&s.append(t.element))}}var Gr=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}));function Wr(e,t,s){const i=e+"-button",n=document.createElement("div");n.classList.add(i,"call-button","rp-overflow"),s.icon&&n.classList.add("tgico-"+s.icon),s.noRipple||Object(te.ripple)(n),s.isDanger&&n.classList.add(i+"-red"),s.isConfirm&&n.classList.add(i+"-green"),s.callback&&Object(l.b)(n,s.callback,{listenerSetter:t});let a=n;if(s.text){const e=document.createElement("div");e.classList.add(i+"-container","call-button-container");const t="string"==typeof s.text?Object(k.i18n)(s.text):s.text;t.classList.add(i+"-text","call-button-text"),e.append(n,t),a=e}return a}class qr extends j.a{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},Object(w.a)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add("movable-element"),this.addResizeHandlers(),this.setSwipeHandler(),b.b.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove("movable-element"),this.handlers&&this.handlers.forEach(e=>{e.remove()})}destroy(){b.b.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map(e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add("movable-element-resize-handler","movable-element-resize-handler-side-"+e),this.element.append(t),t})}setSwipeHandler(){let e,t,s,i,n;const a=this.swipeHandler=new es({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,i=Math.abs(a)*(e?1:-1),o=n.includes("e")?kt.a.width-t:s+t;this.width=Math.min(o,s+i)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,s=Math.abs(o)*(t?1:-1),a=n.includes("s")?kt.a.height-e:i+e;this.height=Math.min(a,i+s)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+s-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+i-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const s=Object(Pe.a)(t,"movable-element-resize-handler");return s?(n=s.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,s=this.width,i=this.height}})}setPositionToCenter(){this.top=kt.a.height/2-this.height/2,this.left=kt.a.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=Object(Se.a)(this.width,this.minWidth,kt.a.width),this.height=Object(Se.a)(this.height,this.minHeight,kt.a.height)}fixPosition(){this.top=Object(Se.a)(this.top,0,kt.a.height-this.height),this.left=Object(Se.a)(this.left,0,kt.a.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:s,height:i}=this;return{top:e,left:t,width:s,height:i}}set state(e){const{top:t,left:s,width:i,height:n}=e;this.top=t,this.left=s,this.width=i,this.height=n,this.onResize()}}var $r,Qr,Yr,Xr=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)},Jr=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s};class Zr{constructor(e){$r.set(this,void 0),Object(w.a)(this,e),this.toggleMovable(!he.IS_TOUCH_SUPPORTED),this.listenerSetter.add(b.b)("changeScreen",(e,t)=>{t!==b.a.mobile&&e!==b.a.mobile||this.toggleMovable(!he.IS_TOUCH_SUPPORTED)})}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return Xr(this,$r,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=Jr(this,$r,new qr(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),Jr(this,$r,void 0,"f")}}}function el(e,t,s){return t.forEach(t=>{t.classList.toggle(e,s)}),()=>el(e,t,!s)}function tl(e){const t=Qr;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}$r=new WeakMap,function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(Qr||(Qr={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(Yr||(Yr={}));let sl={width:420,height:640};class il extends yt.b{constructor(e){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(ke.e)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=el.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally(()=>{e()})},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally(()=>{e()})},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{const e=e=>{this.instance.hangUp(e)};this.appChatsManager.hasRights(this.instance.chatId,"manage_call")?new St("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=Object(ke.d)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(I.a.checkAnimations(e),a.default.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=Object(ke.d)(),s=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,i=(t||!!(s&&s.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;i&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach(e=>{e.style.opacity="0"}),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",i),this.btnInvite.classList.toggle("hide",i),this.btnShowColumn.classList.toggle("hide",!i),a&&a.forEach(e=>{e.style.opacity=""})},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},Object(w.a)(this,e),this.videosCount=0,this.container.classList.add("group-call","night");const t=this.instance=this.appGroupCallsManager.groupCall,{listenerSetter:s}=this;if(!ae.IS_APPLE_MOBILE){const e=this.btnFullScreen=U("fullscreen"),t=this.btnFullScreen2=U("fullscreen group-call-cfs"),i=this.btnExitFullScreen=U("smallscreen");Object(l.b)(e,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(t,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(i,()=>{Object(ke.b)()},{listenerSetter:s}),Object(ke.a)(this.container,this.onFullScreenChange,s)}this.btnInvite=U("adduser");const i=this.btnShowColumn=U("rightpanel group-call-only-big");Object(l.b)(i,this.toggleRightColumn,{listenerSetter:s});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),n.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const r=this.header.cloneNode(!1),c=n.cloneNode(!1),d=this.title.cloneNode(!1);c.append(d);const h=U("rightpanel");r.append(...[h,c,this.btnFullScreen2].filter(Boolean)),Object(l.b)(h,this.toggleRightColumn,{listenerSetter:s}),this.body.prepend(r);const p=new P.b(void 0);p.container.classList.add("group-call-big-video-container"),this.container.append(p.container),this.groupCallTitle=new Kr(this.title),this.groupCallDescription=new Vr(o),this.groupCallBodyHeaderDescription=new Vr(d),this.constructButtons(),this.groupCallParticipantsVideo=new Nr(Object.assign({appendTo:p.container,instance:t,listenerSetter:s,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()}},e)),this.groupCallParticipants=new zr(Object.assign({appendTo:this.body,instance:t,listenerSetter:s},e)),this.movablePanel=new Zr({listenerSetter:s,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!(Object(Pe.a)(t,"chatlist")||Object(Pe.a)(t,"group-call-button")||Object(Pe.a)(t,"btn-icon")||Object(Pe.a)(t,"group-call-participants-video-container")||Object(ke.d)())}},onResize:()=>this.toggleBigLayout(),previousState:sl}),s.add(t)("state",()=>{this.updateInstance()}),s.add(a.default)("group_call_update",e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()}),s.add(t)("pinned",()=>{this.setHasPinned()}),s.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",()=>{const{movablePanel:e}=this;sl=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()}),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add("group-call-buttons");const t=Wr.bind(null,"group-call",this.listenerSetter),s=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),i=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});i.classList.toggle("hide",!Gr);const n=t({noRipple:!0,callback:Object(Ms.a)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Fr;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!Gr);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(s,i,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===Mr.a.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(ke.b)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const s=function(e,t){const s=Yr;return t.pFlags.can_self_unmute?t.pFlags.muted?s.MUTED:s.UNMUTED:s.HAND}(0,e);this.container.dataset.micState=s===Yr.HAND?"hand":s===Yr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(s)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var nl,al=s(186);!function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(nl||(nl={}));var ol=nl;class rl{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let s;if(this.state=t,t===ol.CONNECTED){s=document.createElement("span"),s.classList.add("call-description-duration");const t=()=>{s.innerText=(""+e.duration).toHHMMSS(!0)};this.interval=window.setInterval(t,1e3),t()}else{let i;switch(t){case ol.PENDING:i=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case ol.REQUESTING:i="Call.StatusRequesting";break;case ol.EXCHANGING_KEYS:i="VoipExchangingKeys";break;case ol.CLOSED:i=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:i="Call.StatusConnecting"}s=Object(k.i18n)(i),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===ol.CONNECTED),Object(T.a)(this.container,s),this.container.parentElement||this.appendTo.append(this.container)}}class ll extends _r{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const cl={width:400,height:580};let dl=Object.assign({},cl);class hl extends yt.b{constructor(e){super("popup-call",void 0,{withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(ke.e)(this.container)},this.onFullScreenChange=()=>{const e=Object(ke.d)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(I.a.checkAnimations(e),a.default.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},Object(w.a)(this,e),this.videoContainers={};const{container:t,listenerSetter:s,instance:i}=this;t.classList.add("call","night");const n=document.createElement("div");n.classList.add("call-avatar");const o=this.peerId=this.instance.interlocutorUserId.toPeerId(),r=new hc;r.isBig=!0,r.setAttribute("peer",""+o),r.classList.add("avatar-full"),n.append(r);const c=new Tt.a({peerId:o}).element;c.classList.add("call-title");const d=document.createElement("div");d.classList.add("call-subtitle");this.description=new rl(d);const h=this.emojisSubtitle=document.createElement("div");h.classList.add("call-emojis"),t.append(n,c,d),ae.IS_MOBILE?this.header.append(h):(this.btnFullScreen=U("fullscreen"),this.btnExitFullScreen=U("smallscreen hide"),Object(l.b)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(this.btnExitFullScreen,()=>Object(ke.b)(),{listenerSetter:s}),Object(ke.a)(this.container,this.onFullScreenChange,s),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(h)),this.partyStates=document.createElement("div"),this.partyStates.classList.add("call-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add("call-party-state");const p=Object(k.i18n)("VoipUserMicrophoneIsOff",[new Tt.a({peerId:o,onlyFirstName:!0,limitSymbols:18}).element]);p.classList.add("call-party-state-text");const u=new ll(!1,!0);u.setState(!1,!1),this.partyMutedState.append(u.container,p),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=Wr.bind(null,"call",this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),s.add(i)("state",()=>{this.updateInstance()}),s.add(i)("mediaState",()=>{this.updateInstance()}),this.movablePanel=new Zr({listenerSetter:s,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!(Object(Pe.a)(t,"call-button")||Object(Pe.a)(t,"btn-icon")||Object(ke.d)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?dl:Object.assign({},cl)});const g=this.movablePanel.movable;g&&this.listenerSetter.add(g)("resize",()=>{this.resizeVideoContainers()});const m=this.controlsHover=new Te;m.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),m.showControls(!1),this.addEventListener("close",()=>{const{movablePanel:e}=this;dl=e.state,this.microphoneIcon.destroy(),e.destroy()}),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-first");const t=el.bind(null,"btn-disabled"),s=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([s,i],!0);this.instance.toggleVideoSharing().finally(e)}}),i=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([s,i],!0);this.instance.toggleScreenSharing().finally(e)}});Gr||(i.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new k.default.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new ll(!0,!0);n.firstElementChild.append(a.container),e.append(s,i,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-second"),this.declineI18nElement=new k.default.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),s=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,s),this.container.append(e)}createVideoContainer(e){const t=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),Object(l.b)(t,()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find(e=>!e.classList.contains("small"));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()});const s=Br(e);return s.classList.add("call-video-blur"),t.append(s,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===ol.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(ke.b)(),this.btnVideo.classList.add("disabled"),void this.hide();const s=!e.isOutgoing&&t===ol.PENDING;this.declineI18nElement.compareAndUpdate({key:t===ol.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!s),this.btnAccept.classList.toggle("hide-me",!s),this.container.classList.toggle("two-button-rows",s);const i=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",i)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!i,!i,n),a||n(),this.muteI18nElement.compareAndUpdate({key:i?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const l=e.getMediaState("output");Object(cs.a)(this.partyMutedState,"is-visible",!!(null==l?void 0:l.muted),300);const c=this.videoContainers,d=Object.assign({},c);["input","output"].forEach(t=>{const s=e.getMediaState(t),i=e.getVideoElement(t),n=!!(i&&i.videoWidth&&i.videoHeight);!i||n||i.dataset.hasPromise||(i.dataset.hasPromise="1",Object(pe.e)(i).then(()=>{delete i.dataset.hasPromise,this.updateInstance()}));const a=!!i&&n&&!(!s||"active"!==s.videoState&&"active"!==s.screencastState);let o=c[t];a&&i&&!o&&(o=c[t]=this.createVideoContainer(i),this.container.append(o)),!a&&o&&(o.remove(),delete c[t])});{const e=c.input,t=c.output;Object.keys(d).length!==Object.keys(c).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(c).length),!this.emojisSubtitle.textContent&&t{this.emojisSubtitle.innerHTML=X.b.wrapEmojiText(e.join(""))}),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach(e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),s=this.movablePanel.state,i=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:i,r=1/3*(Object(ke.d)()?65535:a?s.height:s.width),l=a?t.videoWidth/t.videoHeight:1,c=a?1:t.videoHeight/t.videoWidth;e.style.width=r*l+"px",e.style.height=r*c+"px",e.style.maxWidth=o*l+"px",e.style.maxHeight=o*c+"px"}else e.style.cssText=""})}setDescription(){this.description.update(this.instance)}}var pl=s(187),ul=s(167);function gl(e){const t=Object(ul.a)(e,e.media[0]),s={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},i=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=s["video"===n&&s.video?"screencast":n]={},o=Object(ul.a)(e,t);a.ssrc=i(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map(e=>({semantics:e.semantics,ssrcs:e.sources.map(i)})));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach(e=>{r.push({id:+e.key,uri:e.value})});const l=new Map,c=e=>{let t=l.get(e);return t||l.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach(e=>{const t=+e.key,s=c(t),i=e.value.split("/"),[n,a,o]=i;s.name=n,s.clockrate=+a,s.channels=o?+o:0}),t.attributes.get("rtcp-fb").forEach(e=>{const t=+e.key;c(t).feedbackTypes=e.lines.map(e=>{const t=e.split(" "),[s,i]=t;return{type:s,subtype:i||""}})}),t.attributes.get("fmtp").forEach(e=>{const t=+e.key,s=c(t).parameters={},i=e.value.split(";");for(const e of i){const[t,i]=e.split("=");s[t]=i}}),a.payloadTypes=Array.from(l.values())}return s}var ml=s(166),bl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class vl extends pl.a{constructor(e){super(e)}negotiateInternal(){return bl(this,void 0,void 0,(function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let s;if(t.offerReceived){t.offerReceived=!1;const i=s=yield e.createAnswer();this.log("[sdp] local",i.type,i.sdp),yield e.setLocalDescription(i),this.log("[InitialSetup] send 2")}else{const i=s=yield e.createOffer();this.log("[sdp] local",i.sdp),yield e.setLocalDescription(i),t.offerSent=!0,this.log("[InitialSetup] send 0")}const i=gl(Object(ml.b)(s.sdp));t.sendCallSignalingData(i)}))}}var fl=s(192),yl=s(164),wl=s(149),Sl=s(135);var Cl=s(154);var Ll="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function Il(e){return Ll.digest("SHA-256",function(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}(e)).then(e=>new Uint8Array(e))}var Ml=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class El{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return Il(Object(Cl.a)(...e))}encryptPrepared(e){return Ml(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},s=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),i=this.p2pKey,n=yield this.concatSHA256([i.subarray(s+88,s+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(i,a,s),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,s=new ArrayBuffer(4);new DataView(s).setUint32(0,t>>>0,!1);const i=new Uint8Array([...new Uint8Array(s),...e]);return this.encryptPrepared(i)}prepareAesKeyIv(e,t,s){return Ml(this,void 0,void 0,(function*(){const[i,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(s,s+36)]),this.concatSHA256([e.subarray(40+s,40+s+36),t.subarray(0,16)])]);return{key:new Uint8Array([...i.subarray(0,8),...n.subarray(8,24),...i.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...i.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,s,i=!0){return Ml(this,void 0,void 0,(function*(){const t=yield Ll.importKey("raw",s.key,{name:"AES-CTR"},!1,[i?"encrypt":"decrypt"]),n=yield Ll[i?"encrypt":"decrypt"]({name:"AES-CTR",counter:s.iv,length:8*s.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,s){let i=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:s}=this,i=(t?8:0)+("Signaling"===s?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,l=yield this.prepareAesKeyIv(n,a,i),c=yield this.aesProcessCtr(o,r,l,!1),d=yield this.concatSHA256([n.subarray(88+i,88+i+32),c]);if(this.constTimeIsDifferent(d.subarray(8),a,16))return;const h=new DataView(c.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),c.slice(4))}))}}var Pl=s(183);class Tl{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new Pl.a;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r.add(`a=fingerprint:${t} ${s}`,"a=setup:"+i)}),s&&i&&r.add("a=ice-ufrag:"+s,"a=ice-pwd:"+i),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",_l(c)),i&&r.add(`a=msid:${l} audio${i}`),r.add("a=rtcp-mux",Fl(a),Dl(s,i,n,l));break;case"video":r.add("m=video 61986 UDP/TLS/RTP/SAVPF "+a.map(e=>e.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",_l(c)),i&&r.add(`a=msid:${l} video${i}`),r.add("a=rtcp-mux","a=rtcp-rsize",Fl(a),Dl(s,i,n,l))}}return r.add(jl(2)),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new Pl.a;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r.add(`a=fingerprint:${t} ${s}`,"a=setup:"+i)}),s&&i&&r.add("a=ice-ufrag:"+s,"a=ice-pwd:"+i),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",_l(c)),i&&r.add(`a=msid:${l} audio${i}`),r.add("a=rtcp-mux",Fl(a),Dl(s,i,n,l));break;case"video":r.add("m=video 61986 UDP/TLS/RTP/SAVPF "+a.map(e=>e.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",_l(c)),i&&r.add(`a=msid:${l} video${i}`),r.add("a=rtcp-mux","a=rtcp-rsize",Fl(a),Dl(s,i,n,l))}}return r.add(jl(2)),r.finalize()}}class kl{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=_l(c),r+="\na=rtcp-mux",r+=Fl(a),r+=Dl(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=_l(c),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Fl(a),r+=Dl(s,i,n,l)}}return r+=jl(2),r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=_l(h),r+="\na=rtcp-mux",r+=Fl(c),r+=Dl(s,n,a,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${c.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=_l(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Fl(c),r+=Dl(s,n,a,l)}}return r+=jl(2),r+="\n",r}}class xl{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=_l(c),i&&(r+=`\na=msid:${l} audio${i}`),r+="\na=rtcp-mux",r+=Fl(a),r+=Dl(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=_l(c),i&&(r+=`\na=msid:${l} video${i}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Fl(a),r+=Dl(s,i,n,l)}}return r+=jl(2),r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=_l(c),i&&(r+=`\na=msid:${l} audio${i}`),r+="\na=rtcp-mux",r+=Fl(a),r+=Dl(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=_l(c),i&&(r+=`\na=msid:${l} video${i}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Fl(a),r+=Dl(s,i,n,l)}}return r+=jl(2),r+="\n",r}}function Al(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function Ol(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function _l(e){let t=[];for(let s=0;s{const{type:s,subtype:i}=e;t.push(`a=rtcp-fb:${n} ${[s,i].join(" ")}`)}),c){const e=[];Object.getOwnPropertyNames(c).forEach(t=>{e.push(`${t}=${c[t]}`)}),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function Dl(e,t,s,i){let n=[];return s&&s.length>0?s.forEach(t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach(t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${i} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)}))}):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${i} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}function jl(e){return"m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"}class Rl{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:s,sdpMid:i,foundation:n,component:a,protocol:o,priority:r,address:l,type:c,relAddress:d,generation:h,tcpType:p,networkId:u,networkCost:g,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:s,sdpMid:i};throw"no sdpString"}static generateOffer(e){return Al()?kl.generateOffer(e):Ol()?xl.generateOffer(e):Tl.generateOffer(e)}static generateAnswer(e){return Al()?kl.generateAnswer(e):Ol()?xl.generateAnswer(e):Tl.generateAnswer(e)}}var Bl=s(150),Ul=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Nl extends fl.a{constructor(e){super(),this.log=Object(Y.b)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),Object(w.a)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",e=>{this.log("state",ol[e]),e===ol.CLOSED&&this.cleanup()});const t=this.streamManager=new Bl.a(yl.b);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let s={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const i=this;s=new Proxy(s,{set:function(e,t,n){return e[t]=n,i.setMediaState(s),i.sendMediaState(),!0}}),this.mediaStates={input:s},this.sendMediaState=bt(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?ol.CLOSED:"connected"===e||ae.IS_SAFARI&&"completed"===e?ol.CONNECTED:ol.CONNECTING}return ol.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(ol.CLOSED-e+1);return t+=2147483647e3-(e===ol.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const s=this.description.findEntry(e=>e.type===t);if(!s)return;return this.elements.get(""+s.recvEntry.source)}}startScreenSharingInternal(){return Ul(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return Ul(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return Ul(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return Ul(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:s}=this,i=t.inputStream.getVideoTracks()[0];i&&(Object(wl.a)(i),t.appendToConference(s))}))}toggleVideoSharing(){return Ul(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===ol.CLOSING||e===ol.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=rn.a.setTimeout(()=>{this.hangUpTimeout=void 0,this.hangUp(t)},e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return Ul(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(ol.EXCHANGING_KEYS);const s=this.call;this.requestInputSource(!0,!!s.pFlags.video,!1);const i=s.g_a_hash;this.appCallsManager.generateDh().then(e=>(this.dh={g_a_hash:i,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.apiManager.invokeApi("phone.acceptCall",{peer:this.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b}))).then(e=>{this.appCallsManager.savePhonePhoneCall(e)})}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:s}=this,i=function(e){const t=[];return e.connections.forEach(e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:s,ipv6:i,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(s&&r.push(`turn:${s}:${n}`),i&&r.push(`turn:[${i}]:${n}`)):e.pFlags.stun&&(s&&r.push(`stun:${s}:${n}`),i&&r.push(`stun:[${i}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}}),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",i),!i)return;const n=this.connectionInstance=new vl({call:this,streamManager:s,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(i);a.addEventListener("iceconnectionstatechange",()=>{const e=this.connectionState;void 0===this.connectedAt&&e===ol.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)}),a.addEventListener("negotiationneeded",()=>{n.negotiate()}),a.addEventListener("icecandidate",e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)}),a.addEventListener("track",e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)});n.createDescription();this.encryptor=new El(e,t),this.decryptor=new El(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",e=>{this.applyDataChannelData(JSON.parse(e.data))}),e.addEventListener("open",()=>{this.sendMediaState()})}applyDataChannelData(e){switch(e["@type"]){case"MediaState":e.type="output",this.log("got output media state",e),this.setMediaState(e);break;default:this.log.error("unknown data channel data:",e)}}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return Ul(this,void 0,void 0,(function*(){const t=JSON.stringify(e),s=(new TextEncoder).encode(t),{bytes:i}=yield this.encryptor.encryptRawPacket(s);this.log("sendCallSignalingData",this.id,t),yield this.apiManager.invokeApi("phone.sendSignalingData",{peer:this.appCallsManager.getCallInput(this.id),data:i})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:s}=e;if(0!==s)return;const i=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[s,i,n,a,o,r,...l]=e.split(" "),c={sdpString:t,foundation:s,component:i,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map(e=>Object(se.a)(e))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return Ul(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter(e=>"recvonly"===e.direction).forEach(e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"});const s=this.description;let i=s.entries.map(e=>e.mid);const n={type:"offer",sdp:s.generateSdp({bundle:i,entries:s.entries.filter(e=>i.includes(e.mid)),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=gl(Object(ml.b)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",()=>{this.stopVideoSharing()},{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e);this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then(()=>{this.setMuted(),this.onMutedChange()})}hangUp(e,t){return Ul(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(ol.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const s=this.mediaStates[e];t="active"===s.videoState||"active"===s.screencastState||t}yield this.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map(e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes}));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach(e=>{const t=e.payloadTypes,s=t.findIndex(e=>"VP8"===e.name),i=t[s],n=t.findIndex(e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===i.id});e.payloadTypes=[t[s],t[n]]})}applyCallSignalingData(e){return Ul(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:s}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const i=e=>e.map(e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map(e=>+e)}));[Object(Sl.c)("audio",+e.audio.ssrc),e.video?Object(Sl.c)("video",i(e.video.ssrcGroups)):void 0,e.screencast?Object(Sl.c)("screencast",i(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach(e=>{let t=s.getEntryBySource(e.source);if(t)return;const i=s.findFreeSendRecvEntry(e.type,!1);t=new Sl.a(i.mid,e.type),t.setDirection("sendrecv"),i.recvEntry=t,s.setEntrySource(t,e.sourceGroups||e.source)}),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;let a=s.entries.map(e=>e.mid);const o={type:n?"answer":"offer",sdp:s.generateSdp({bundle:a,entries:s.entries.filter(e=>a.includes(e.mid)),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=Rl.generateCandidate(t);e.sdpMLineIndex=0;const s=new RTCIceCandidate(e);this.candidates.push(s)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return Ul(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map(e=>this.addIceCandidate(t,e));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return Ul(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return Ul(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const s of t){const t=yield e.decryptRawPacket(s);if(!t)continue;const i=(new TextDecoder).decode(t);try{const e=JSON.parse(i);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",i),this.hangUp("phoneCallDiscardReasonDisconnect")}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e.data),this.processDecryptQueue()}}class Hl{constructor(e,t,s,i,n){this.appGroupCallsManager=e,this.appPeersManager=t,this.appChatsManager=s,this.appAvatarsManager=i,this.appCallsManager=n,this.onState=()=>{this.updateInstance(this.instance)};const o=this.listenerSetter=new R.a;o.add(a.default)("call_instance",({instance:e})=>{this.instance||this.updateInstance(e)}),o.add(a.default)("call_accepting",e=>{this.instance!==e&&this.updateInstance(e)}),o.add(a.default)("group_call_instance",e=>{this.updateInstance(e)}),o.add(a.default)("group_call_update",e=>{const t=this.appGroupCallsManager.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)}),o.add(a.default)("group_call_amplitude",({amplitudes:e,type:t})=>{const{weave:s}=this;if(!e.length||!s)return;let i=0;for(let t=0;ti?n:i}s.setAmplitude(i)})}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new R.a,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof al.a?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof al.a)));const s=this.instance.isMuted;let i=e instanceof al.a?e.state:function(e,t){switch(e){case ol.CLOSING:case ol.CLOSED:return Mr.a.CLOSED;case ol.CONNECTED:return t?Mr.a.MUTED:Mr.a.UNMUTED;default:return Mr.a.CONNECTING}}(e.connectionState,s);const{weave:n}=this;n.componentDidMount();const a=i===Mr.a.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),Object(cs.a)(document.body,"is-calling",!a,250,a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0)),a||(n.setCurrentState(i,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!s))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof al.a)return this.groupCallTitle.update(e);Object(T.a)(this.center,new Tt.a({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const s=document.createElement("div");s.classList.add("topbar-call-left");const i=this.groupCallMicrophoneIconMini=new ll,n=U();n.append(i.container),s.append(n);const a=Object(Ms.a)(()=>{this.instance.toggleMuted()},600,!0);Object(l.b)(n,e=>{Object(c.a)(e),a()},{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new Kr(o),this.groupCallDescription=new Vr(s),this.callDescription=new rl(s);const r=document.createElement("div");r.classList.add("topbar-call-right");const d=U("endcall_filled");r.append(d),Object(l.b)(d,e=>{Object(c.a)(e);const{instance:t}=this;t&&(t instanceof al.a?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))},{listenerSetter:e}),Object(l.b)(t,()=>{if(this.instance instanceof al.a){if(yt.b.getPopups(il).length)return;new il({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()}else if(this.instance instanceof Nl){if(yt.b.getPopups(hl).find(e=>e.getCallInstance()===this.instance))return;new hl({appCallsManager:this.appCallsManager,appAvatarsManager:this.appAvatarsManager,appPeersManager:this.appPeersManager,instance:this.instance}).show()}},{listenerSetter:e}),t.append(s,o,r);const h=this.weave=new Tr,p=h.render("topbar-call-weave");t.prepend(p),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var zl=s(180),Vl=s(116),Kl=s(118),Gl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Wl=new class{constructor(){this.log=Object(Y.b)("CALLS"),this.tempId=0,this.calls=new Map,this.instances=new Map,this.sortedInstances=[],Wa&&(a.default.addMultipleEventsListeners({updatePhoneCall:e=>Gl(this,void 0,void 0,(function*(){var t;const s=this.saveCall(e.phone_call);let i=this.instances.get(s.id);switch(s._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=s.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:s.admin_id}),i.overrideConnectionState(ol.PENDING),i.setPhoneCall(s),i.setHangUpTimeout(45e3,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const e=i.dh.g_a=s.g_a_or_b,t=i.dh,n=yield vt.a.invokeCrypto("sha256",e);if(!Object(Vl.a)(t.g_a_hash,n)){this.log.error("Incorrect g_a_hash",t.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.computeKey(e,t.b,t.p);if(s.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",s.key_fingerprint,o);break}i.encryptionKey=a,i.joinCall();break}}})),updatePhoneCallSignalingData:e=>{const t=this.instances.get(e.phone_call_id);(null==t?void 0:t.id)===e.phone_call_id&&t.onUpdatePhoneCallSignalingData(e)}}),this.audioAsset=new zl.a(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,s]of this.instances)if(s.interlocutorUserId===e)return s}computeKey(e,t,s){return Gl(this,void 0,void 0,(function*(){return vt.a.invokeCrypto("compute-dh-key",e,t,s)}))}saveCall(e){const t="phoneCallDiscarded"===e._,s=this.calls.get(e.id);return s?(Object(Kl.a)(s,e),t&&this.calls.delete(e.id),e=s):t||this.calls.set(e.id,e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}createCallInstance(e){const t=new Nl(Object.assign({appCallsManager:this,apiManager:vt.a,apiUpdatesManager:bi.a},e));return t.addEventListener("state",e=>{const s=this.currentCall;e===ol.CLOSED?(this.instances.delete(t.id),Object(V.a)(this.sortedInstances,t)):Object(Ks.a)(this.sortedInstances,t,"sortIndex"),e===ol.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const i=void 0!==t.connectedAt;e===ol.EXCHANGING_KEYS||e===ol.CONNECTING&&i?t.setHangUpTimeout(45e3,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),s!==t&&s||(e===ol.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!i?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===ol.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===ol.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===ol.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())}),t.addEventListener("id",(e,s)=>{void 0!==s&&this.instances.delete(s);const i=!!this.currentCall;this.instances.set(e,t),void 0===s&&a.default.dispatchEvent("call_instance",{instance:t,hasCurrent:i})}),t}savePhonePhoneCall(e){return E.a.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return vt.a.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then(e=>Gl(this,void 0,void 0,(function*(){return vt.a.invokeCrypto("generate-dh",e)})))}startCallInternal(e,t){this.log("p2pStartCallInternal",e,t);const s=n.default.getCachedFullUser(e);if(!s)return;const{video_calls_available:i}=s.pFlags,a=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});a.requestInputSource(!0,!(!t||!i),!1),a.overrideConnectionState(ol.REQUESTING),a.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:Be.c,date:Object(cr.a)(!0),id:--this.tempId,participant_id:e,protocol:a.protocol,pFlags:{video:t||void 0}}),this.generateDh().then(s=>(a.dh=s,vt.a.invokeApi("phone.requestCall",{user_id:E.a.getUserInput(e),protocol:a.protocol,video:t&&i,random_id:Object(dt.a)(32),g_a_hash:a.dh.g_a_hash}))).then(e=>{const t=this.savePhonePhoneCall(e);a.overrideConnectionState(ol.PENDING),a.setPhoneCall(t),a.setHangUpTimeout(45e3,"phoneCallDiscardReasonHangup")})}discardCall(e,t,s,i){return Gl(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield vt.a.invokeApi("phone.discardCall",{video:i,peer:this.getCallInput(e),duration:t,reason:{_:s},connection_id:"0"});bi.a.processUpdateMessage(n)}))}};le.a&&(le.a.appCallsManager=Wl);var ql=Wl,$l=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Ql="chat",Yl=he.IS_TOUCH_SUPPORTED?"touchstart":"mousemove";const Xl=new class{constructor(){this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.onHashChange=()=>{const e=location.hash,t=e.split("?"),s=this.parseUriParams(e,t);if(this.log("hashchange",e,t[0],s),s.tgaddr){D.a.replaceState();const{onclick:e}=X.b.wrapUrl(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else switch(t[0]){case"#/im":{const e=s.p;let t=void 0!==s.post?v.a.generateMessageId(+s.post):void 0;switch(e[0]){case"@":this.openUsername({userName:e,lastMsgId:t});break;default:this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",a.default.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!a.default.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",a.default.settings.animationsEnabled),this.chatsSelectTabDebounced=bt(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),vt.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.default.settings.animationsEnabled?250:0,!1,!0),oe.a.setLoop(a.default.settings.stickers.loop),I.a.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();k.default.setTimeFormat(a.default.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>{const s=Po();if(this.canDrag()||s){if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&Object(c.a)(e)}Object(pe.d)(e).then(e=>{if(e.length){if(s)return void s.addFiles(e);const i=this.chat.input;i.willAttachType=t||(g.has(e[0].type)?"media":"document"),new To(this.chat,e,i.willAttachType)}})}},bi.a.attach(),Gt.a.start(),this.log=Object(Y.b)("IM",Y.a.Log|Y.a.Warn|Y.a.Debug|Y.a.Error),this.backgroundPromises={},M.STATE_INIT.settings.themes.forEach(e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg";this.backgroundPromises[e.background.slug]=Promise.resolve(t)}}),this.selectTab(0),window.addEventListener("blur",()=>{I.a.checkAnimations(!0),this.offline=a.default.idle.isIDLE=!0,this.updateStatus(),clearInterval(this.updateStatusInterval),a.default.dispatchEvent("idle",a.default.idle.isIDLE),window.addEventListener("focus",()=>{this.offline=a.default.idle.isIDLE=!1,this.updateStatus(),this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),I.a.checkAnimations(!1),a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0})}),window.addEventListener(Yl,()=>{this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),this.updateStatus(),this.offline=a.default.idle.isIDLE=!1,a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0,passive:!0}),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(b.b.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),D.a.onHashChange=this.onHashChange,this.setSettings(),a.default.addEventListener("settings_updated",this.setSettings),Object(Ns.a)(()=>{I.a.setOnlyOnePlayableGroup("lock"),I.a.checkAnimations(!0)},()=>{I.a.setOnlyOnePlayableGroup(""),I.a.checkAnimations(!1)}),this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&rs.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)});const e=bt(()=>{this.setBackground(this.lastBackgroundUrl,!1)},200,!1,!0);b.b.addEventListener("resize",()=>{e()}),a.default.addEventListener("history_focus",e=>{let{peerId:t,threadId:s,mid:i,startParam:n}=e;s&&(s=v.a.generateMessageId(s)),i&&(i=v.a.generateMessageId(i)),this.setInnerPeer({peerId:t,lastMsgId:i,type:s?"discussion":void 0,threadId:s,startParam:n})}),a.default.addEventListener("peer_changing",e=>{this.saveChatPosition(e)}),a.default.addEventListener("theme_change",()=>{this.applyCurrentTheme()}),a.default.addEventListener("choosing_sticker",e=>{this.setChoosingStickerTyping(!e)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{var s;const n=this.chat;if(!n||n.peerId!==e||a.default.overlaysActive||b.b.activeScreen===b.a.mobile&&1!==this.tabId)return;const o=t.find(e=>"sendMessageEmojiInteraction"===e.action._);if("sendMessageEmojiInteraction"===(null===(s=null==o?void 0:o.action)||void 0===s?void 0:s._)){const t=o.action,s=n.bubbles.bubbles[v.a.generateMessageId(o.action.msg_id)];if(s&&s.classList.contains("emoji-big")&&s.classList.contains("sticker")&&qa(s,n.bubbles.scrollable.container)){const n=s.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach(e=>{setTimeout(()=>{Object(l.d)(n)},1e3*e.t)}),i.a.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}),a.default.addEventListener("instance_deactivated",()=>{const e=new yt.b("popup-instance-deactivated",void 0,{overlayClosable:!0}),t=document.createElement("div");t.classList.add("instance-deactivated-container"),e.container.replaceWith(t);const s=document.createElement("div");s.classList.add("header"),s.append(Object(k.i18n)("Deactivated.Title"));const i=document.createElement("div");i.classList.add("subtitle"),i.append(Object(k.i18n)("Deactivated.Subtitle")),t.append(s,i),document.body.classList.add("deactivated"),e.addEventListener("close",()=>{document.body.classList.add("deactivated-backwards"),Cr.a.activateInstance(),setTimeout(()=>{document.body.classList.remove("deactivated","deactivated-backwards")},333)}),e.show()}),a.default.addEventListener("chat_changing",({to:e})=>{this.toggleChatGradientAnimation(e)}),ua.a.get("chatPositions").then(e=>{ua.a.setToCache("chatPositions",e||{})}),(Wa||lr)&&(this.topbarCall=new Hl(Ir.a,o.a,G.a,d.a,ql)),Wa&&a.default.addEventListener("call_instance",({instance:e})=>{const t=new hl({appCallsManager:ql,appAvatarsManager:d.a,appPeersManager:o.a,instance:e});e.addEventListener("acceptCallOverride",()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then(()=>(a.default.dispatchEvent("call_accepting",e),!0)).catch(()=>!1)),t.addEventListener("close",()=>{const t=ql.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")},{once:!0}),t.show()}),Cr.a.activateInstance();const t=()=>{Lr.default.setAuthorized(!0)};setInterval(t,ne.a),t(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const s=t.href,i=t.cloneNode(!0);i.className="anchor-url",i.innerText=s,i.removeAttribute("onclick"),new St("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[i],buttons:[{langKey:"Open",callback:()=>{i.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:s}=e;i.a.sendText(this.chat.peerId,"/"+t+(s?"@"+s:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:$a.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:$a.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),lr&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>$l(this,void 0,void 0,(function*(){let s;s="c"===e[0]?{_:$a.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:$a.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(s)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;"telegrampassport"===e.domain||(t=this.makeLink($a.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach(e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.JOIN_CHAT,e);this.processInternalLink(t)}})}),this.onHashChange(),this.attachKeydownListener()}get myId(){return a.default.myId}get chat(){return this.chats[this.chats.length-1]}toggleChatGradientAnimation(e){this.chats.forEach(t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(a.default.settings.animationsEnabled&&t===e)})}appendEmojiAnimationContainer(e){const t=e===b.a.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",t=>{var s;const n=t.key;if(a.default.isOverlayActive||e.has(n))return;const o=t.target,r=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===o.tagName){if(!t.altKey||"ArrowUp"!==n&&"ArrowDown"!==n){if("ArrowUp"===n){if(r.input.editMsgId||!r.input.isInputEmpty())return;{const e=i.a.getHistoryStorage(r.peerId,r.threadId).history.slice;if(e.isEnd(oa.a.Bottom)&&e.length){let s;for(const t of e){const e=r.getMessage(t);if((this.myId===r.peerId?e.fromId===this.myId:e.pFlags.out)&&i.a.canEditMessage(r.getMessage(t),"text")){s=t;break}}s&&(r.input.initMessageEditing(s),Object(c.a)(t))}}}else if("ArrowDown"===n)return}else{const e=i.a.dialogsStorage.getFolderDialogs(a.default.filterId,!0);let t;if(a.default.peerId){const s=e.findIndex(e=>e.peerId===a.default.peerId);if(-1!==s){t=e["ArrowUp"===n?s-1:s+1]}}else"ArrowDown"===n&&(t=e[0]);t&&this.setPeer({peerId:t.peerId})}if((null===(s=null==r?void 0:r.input)||void 0===s?void 0:s.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==o.tagName&&!o.hasAttribute("contenteditable")&&!he.IS_TOUCH_SUPPORTED&&(!b.b.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),Object(Io.a)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}})}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return $l(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case $a.MESSAGE:{const t=e.post?v.a.generateMessageId(+e.post):void 0,s=e.comment?v.a.generateMessageId(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:s,startParam:e.start});break}case $a.PRIVATE_POST:{const t=e.channel.toChatId(),s=t.toPeerId(!0);if(G.a.getChat(t).deleted)try{yield G.a.resolveChannel(t)}catch(e){throw mt({langPackKey:"LinkNotFound"}),e}const i=v.a.generateMessageId(+e.post),n=e.thread?v.a.generateMessageId(+e.thread):void 0;n?this.openThread(s,i,n):this.setInnerPeer({peerId:s,lastMsgId:i,threadId:n});break}case $a.STICKER_SET:new an({id:e.set}).show();break;case $a.JOIN_CHAT:vt.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&G.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ya(e.invite,t).show():this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})},e=>{"INVITE_HASH_EXPIRED"===e.type&>(Object(k.i18n)("InviteExpired"))});break;case $a.VOICE_CHAT:lr&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;default:this.log.warn("Not supported internal link:",e)}}))}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{Object(c.a)(null);const s=t.href;let i,n;e.noPathnameParams||(i=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(s));const a=e.callback({pathnameParams:i,uriParams:n},t);return void 0===a&&a}}parseUriParams(e,t=e.split("?")){const s={};return t[1]?(t[1].split("&").forEach(e=>{s[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])}),s):s}openUsername(e){const{userName:t,lastMsgId:s,threadId:i,commentId:n,startParam:a}=e;return E.a.resolveUsername(t).then(e=>{const t="user"===e._,o=e.id.toPeerId(!t);return i?this.openThread(o,s,i):n?this.openComment(o,s,n):this.setInnerPeer({peerId:o,lastMsgId:s,startParam:a})},e=>{"USERNAME_NOT_OCCUPIED"===e.type?mt({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&mt({langPackKey:"Alert.UserDoesntExists"})})}openThread(e,t,s){return i.a.wrapSingleMessage(e,s).then(()=>{const n=i.a.getMessageByPeer(e,s);return"messageEmpty"===n._?t=void 0:i.a.generateThreadServiceStartMessage(n),this.setInnerPeer({peerId:e,lastMsgId:t,threadId:s,type:"discussion"})})}openComment(e,t,s){return i.a.getDiscussionMessage(e,t).then(e=>this.openThread(e.peerId,s,e.mid))}callUser(e,t){return $l(this,void 0,void 0,(function*(){if(ql.getCallByUserId(e))return;(yield n.default.getProfile(e)).pFlags.phone_calls_private?Ln({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[new Tt.a({peerId:e.toPeerId()}).element],button:{langKey:"OK",isCancel:!0}}):(yield this.discardCurrentCall(e.toPeerId()),ql.startCallInternal(e,"video"===t))}))}discardCurrentCall(e,t,s){return Ir.a.groupCall&&Ir.a.groupCall!==t?this.discardGroupCallConfirmation(e):ql.currentCall&&ql.currentCall!==s?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return $l(this,void 0,void 0,(function*(){const t=ql.currentCall;t&&(yield Ln({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[new Tt.a({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new Tt.a({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return $l(this,void 0,void 0,(function*(){const t=Ir.a.groupCall;t&&(yield Ln({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Tt.a({peerId:t.chatId.toPeerId(!0)}).element,new Tt.a({peerId:e}).element],button:{langKey:"OK"}}),Ir.a.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return $l(this,void 0,void 0,(function*(){const s=e.toChatId(),i=G.a.hasRights(s,"manage_call");if(t){if("groupCallDiscarded"===(yield Ir.a.getGroupCallFull(t))._){if(!i)return void mt({langPackKey:"VoiceChat.Chat.Ended"});yield Ln({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}}yield this.discardCurrentCall(e),(()=>{$l(this,void 0,void 0,(function*(){const e=yield n.default.getChatFull(s);let t;if(e.call)t=Ir.a.saveGroupCall(e.call,s);else{if(!i)return;t=yield Ir.a.createGroupCall(s)}Ir.a.joinGroupCall(s,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=a.default.getTheme();if(t.background.slug){const s=M.AppStateManager.STATE_INIT.settings.themes.find(e=>e.name===t.name);return this.getBackground(t.background.slug).then(t=>this.setBackground(t,e),()=>(t.background=Object(ue.a)(s.background),this.setBackground("",!0)))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=ce.a.cacheStorage.getFile("backgrounds/"+e).then(e=>URL.createObjectURL(e))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const s=this.chats.map(t=>t.setBackground(e));return s[s.length-1].then(()=>{t&&a.default.dispatchEvent("background_change")})}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,s=t.scrollable.scrollTop,i=e.peerId+(e.threadId?"_"+e.threadId:""),n=ua.a.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!Object.keys(t.bubbles).length)delete n[i],this.log("deleted chat position");else{const e={mids:Object(di.a)(t.bubbles,"desc"),top:s};n[i]=e,this.log("saved chat position:",e)}ua.a.set({chatPositions:n},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),s=ua.a.getFromCache("chatPositions");return s&&s[t]}applyHighlightningColor(){let e;const t=a.default.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!he.IS_TOUCH_SUPPORTED&&e&&(a.default.themeColor=function(e){return Xi(e).slice(0,-2)}(e))}applyCurrentTheme(e,t,s){return this.applyHighlightningColor(),a.default.setTheme(),t&&(this.backgroundPromises[e]=Promise.resolve(t)),this.setCurrentBackground(void 0===s?!!e:s)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Sr([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.default.settings.animationsEnabled&&!1!==t&&Object(Ns.b)(Object(ca.a)(400),400);const s=Object(zs.a)(this.prevTab);Object(zs.a)(e)>s&&D.a.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),Object(ii.a)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),he.IS_TOUCH_SUPPORTED||this.attachDragAndDropListeners(),this.markupTooltip=new vr(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>$l(this,void 0,void 0,(function*(){if(l===s)return;const c=r.dataTransfer.types,d=c.contains?c.contains("Files"):c.indexOf("Files")>=0,h=Po();if(!d||!this.canDrag()&&!h)return void(n=0);const p=h?o:a,u=h?t:e;if(l&&!u.length){const e=yield Object(pe.d)(r,!0),t=d&&!e.length,s=e.filter(e=>g.has(e)).length;this.log("drag files",e),h?(h.appendDrops(p),(e.length||t)&&u.push(new wr(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),Xl.log("drop",e),Xl.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new wr(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),Xl.log("drop",e),Xl.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new wr(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),Xl.log("drop",e),Xl.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}Object(cs.a)(p,"is-visible",l,200,()=>{l||(u.forEach(e=>{e.destroy()}),u.length=0)}),l?u.forEach(e=>{e.setPath()}):n=0,document.body.classList.toggle("is-dragging",l),s=l}));let n=0;document.body.addEventListener("dragenter",e=>{n++}),document.body.addEventListener("dragover",e=>{i(e,!0),Object(c.a)(e)}),document.body.addEventListener("dragleave",e=>{n--,0===n&&i(e,!1)});const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||a.default.isOverlayActive||!e.canSend("send_media"))}selectTab(e,t){!1===t&&Sr([qn.sidebarEl,this.columnEl,rs.sidebarEl]),document.body.classList.toggle("is-left-column-shown",0===e);const s=this.tabId;this.log("selectTab",e,s);let i=a.default.settings.animationsEnabled?Object(je.a)():Promise.resolve();if(-1!==s&&s!==e&&a.default.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(ca.a)(e),Object(Ns.b)(i,e)}return this.tabId=e,Object(ii.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!D.a.findItemByType("im"))&&D.a.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}}),a.default.dispatchEvent("im_tab_change",e),i}updateStatus(){return this.myId?(E.a.setUserStatus(this.myId,this.offline),vt.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new mr(this,G.a,L.a,_a,i.a,o.a,r.a,n.default,ys.a,E.a,br.a,it.a,vt.a,zi.a,nt.a,ua.a,Gt.a,va,v.a,Ir.a,Nt.a);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,s,i){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&a.default.dispatchEvent("peer_changing",this.chat),i||(i=this.chats.splice(e,this.chats.length-e)),a.default.dispatchEvent("chat_changing",{from:n,to:this.chat});for(let e=0;e1&&i.slice(0,-1).forEach(e=>{e.container.remove()}),this.chatsSelectTab(this.chat.container,s),t){a.default.dispatchEvent("peer_changed",this.chat.peerId);const e=rs.getTab(pr);e&&e.close();rs.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(rs.sharedMediaTab.loadSidebarMedia(!0),rs.sharedMediaTab.fillProfileElements())}i.forEach(e=>{e.beforeDestroy()}),setTimeout(()=>{i.forEach(e=>{e.destroy()})},350)}setPeer(e={},t){var s;this.init&&(this.init(),this.init=null),null!==(s=e.peerId)&&void 0!==s||(e.peerId=Be.c);const{peerId:i,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(i){if(o>0&&a.peerId&&a.peerId!==i){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===i)return void this.spliceChats(0,!0,!0,t);{const s=this.setPeer(e);return this.spliceChats(0,!1,!1,t),s}}}else{if(o>0)return void this.spliceChats(o,void 0,t);if(b.b.activeScreen===b.a.medium)return void this.selectTab(+!this.tabId,t)}if(i===a.peerId&&b.b.activeScreen<=b.a.medium&&document.body.classList.contains("is-left-column-shown"))return this.selectTab(1,t),!1;if(i||b.b.activeScreen!==b.a.mobile){const s=a.setPeer(i,n,e.startParam),o=(null==s?void 0:s.cached)?s.promise:Promise.resolve();i&&Promise.all([o,a.setBackgroundPromise]).then(()=>{setTimeout(()=>{setTimeout(()=>{this.chatsSelectTab(this.chat.container)},0),this.selectTab(1,t)},0)})}return i?void 0:(this.selectTab(0,t),!1)}setInnerPeer(e){var t;const{peerId:s}=e;if(s===Be.c||!s)return;const i=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex(e=>e.peerId===s&&e.type===i);if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const o=this.chat;let r=o;return o.inited&&(r=this.createNewChat()),i&&(r.setType(i),e.threadId&&(r.threadId=e.threadId)),a.default.dispatchEvent("chat_changing",{from:o,to:r}),this.setPeer(e)}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let s="peer-typing";switch(t.classList.add(s),t.dataset.action=e._,e._){case"sendMessageTypingAction":s+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=s+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":s+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":s+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":s+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=s+"-eye",t.append(e)}}return t.classList.add(s),t}getPeerTyping(e,t){if(!E.a.isBot(e)){const s=n.default.getPeerTypings(e);if(!s||!s.length)return;const i=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=e.isUser()?a.private:s.length>1?a.multi:a.chat;let r=i.action;if(s.length>1){const e={};s.forEach(t=>{const s=t.action._;void 0===e[s]&&(e[s]=0),++e[s]}),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let c,d=t.firstElementChild;if(d?d.dataset.action!==r._&&d.replaceWith(this.getTypingElement(r)):(d=this.getTypingElement(r),t.prepend(d)),e.isAnyChat()&&(c=[new Tt.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]),"sendMessageEmojiInteractionSeen"===r._){c?c.pop():c=[];const e=Object(De.a)(X.b.wrapEmojiText(r.emoticon));c.push(e)}const h=Object(k.i18n)(l,c);return h.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(h):t.append(h),t}}getPeerStatus(e,t){var s;return $l(this,void 0,void 0,(function*(){let i;if(e){if(e.isAnyChat()){let t=this.getPeerTyping(e);if(t)return t;const s=e.toChatId(),a=yield n.default.getChatFull(s);this.chat.log("chatInfo res:",a);const o=a.participants_count||a.participants&&a.participants.participants&&a.participants.participants.length||1;if(i=n.default.getChatMembersString(s),o<2)return i;const r=yield n.default.getOnlines(s);if(r>1){const e=document.createElement("span");e.append(...Object(k.join)([i,Object(k.i18n)("OnlineCount",[Object(Qa.a)(r)])],!1)),i=e}return i}{const n=E.a.getUser(e);if(a.default.myId===e&&!t)return;if(n){if(i=E.a.getUserStatusString(n.id),!E.a.isBot(e)){let t=this.getPeerTyping(e);if(t||"userStatusOnline"!==(null===(s=n.status)||void 0===s?void 0:s._)||(t=document.createElement("span"),t.classList.add("online"),t.append(i)),t)return t}return i}}}}))}setPeerStatus(e,t,s,i,n,a){s&&(t.innerHTML=i?"‎":"");const o=t.querySelector(".peer-typing-container");o&&this.getPeerTyping(e,o)||this.getPeerStatus(e,a).then(e=>{n()&&Object(T.a)(t,e||(i?"‎":""))})}setChoosingStickerTyping(e){i.a.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}};le.a&&(le.a.appImManager=Xl);var Jl=Xl;var Zl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ec extends j.a{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if(Object(c.a)(e),he.IS_TOUCH_SUPPORTED)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout(()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0},3e3));const s=this.isZooming();let i=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];s&&n.push("media-viewer-movers"),n.find(e=>{try{if(i=Object(Pe.a)(t,e),i)return!0}catch(e){return!1}}),i&&(s||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(a.default.overlaysActive>1)return;const t=e.key;let s=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):s=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),s&&Object(c.a)(e)},this.onKeyUp=e=>{a.default.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(a.default.overlaysActive>1||Object(Pe.a)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&(Object(c.a)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.log=Object(Y.b)("AMV"),this.preloader=new ye.a,this.preloaderStreamable=new ye.a({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new Z.a,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const s=document.createElement("div");s.classList.add("media-viewer");const i=this.topbar=document.createElement("div");i.classList.add("media-viewer-topbar","media-viewer-appear");const n=document.createElement("div");n.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=U("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const o=document.createElement("div");this.author.avatarEl=new hc,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const r=document.createElement("div");r.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach(e=>{const t=U(e,{noRipple:!0});this.buttons[e]=t,r.append(t)}),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=U("zoomout",{noRipple:!0}),Object(l.b)(this.zoomElements.btnOut,()=>this.changeZoom(!1)),this.zoomElements.btnIn=U("zoomin",{noRipple:!0}),Object(l.b)(this.zoomElements.btnIn,()=>this.changeZoom(!0)),this.zoomElements.rangeSelector=new Ce({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),s.append(this.content.main),this.overlaysDiv.append(s),n.append(this.buttons["mobile-close"],this.author.container),i.append(n,r),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){if(Object(l.b)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach(e=>{Object(l.b)(e,this.close.bind(this))}),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach(([e,t])=>{t.addEventListener("click",t=>{Object(c.a)(t),this.setMoverPromise||this.listLoader.go(e)})}),Object(l.b)(this.buttons.zoom,()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)}),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},he.IS_TOUCH_SUPPORTED){new es({element:this.wholeDiv,onSwipe:(e,t)=>{if(Object(ke.d)())return;if(Math.abs(e)/kt.a.width>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/kt.a.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Pe.a)(e.target,"media-viewer-caption")})}}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const s=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(s),this.zoomElements.rangeSelector.setProgress(s),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const s=-1;this.zoomSwipeHandler=new es({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(i,n)=>{[i,n]=[i*s,n*s],this.zoomSwipeX+=i-e,this.zoomSwipeY+=n-t,[e,t]=[i,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(s)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=Ee({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&Object(c.a)(e),this.setMoverAnimationPromise)return Promise.reject();D.a.removeByType("media"),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then(({onAnimationEnd:e})=>e);return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer=void 0,this.zoomSwipeHandler&&(this.zoomSwipeHandler.removeListeners(),this.zoomSwipeHandler=void 0),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0}),s.finally(()=>{this.wholeDiv.remove(),a.default.isOverlayActive=!1,I.a.checkAnimations(!1)}),s}setMoverToTarget(e,t=!1,s=0){return Zl(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const i=this.content.mover;t||(i.innerHTML="");const n=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(i);const o=0!==s,r=a.default.settings.animationsEnabled?o?350:200:0;let l,c;e&&(e instanceof hc||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Pe.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Pe.a)(e,"profile-avatars-container"),c=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==c.left&&(e=l=c=void 0))),e||(e=this.content.media),c||(l=e.parentElement,c=e.getBoundingClientRect());let d=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const s=qa(l,Object(Pe.a)(l,"scrollable"),!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(d=!0):(l=(e=this.content.media).parentElement,c=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let p,u,g,m="";if(o?(p=1===s?kt.a.width:-h.width,u=h.top):(p=c.left,u=c.top),m+=`translate3d(${p}px,${u}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(i.firstElementChild&&i.firstElementChild.classList.contains("media-viewer-aspecter")){g=i.firstElementChild;const e=g.querySelector(".ckin__player");if(e){const t=e.firstElementChild;g.append(t),e.remove()}g.style.cssText||(i.classList.remove("active"),this.setFullAspect(g,h,c),i.offsetLeft,i.classList.add("active"))}else g=document.createElement("div"),g.classList.add("media-viewer-aspecter"),i.prepend(g);g.style.cssText=`width: ${c.width}px; height: ${c.height}px; transform: scale3d(${h.width/c.width}, ${h.height/c.height}, 1);`}i.style.width=h.width+"px",i.style.height=h.height+"px";const b=c.width/h.width,v=c.height/h.height;o||(m+=`scale3d(${b},${v},1) `);let f=window.getComputedStyle(l).getPropertyValue("border-radius");const y=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(f);if(f=y.map(e=>parseInt(e)/b+"px").join(" "),o||(i.style.borderRadius=f),t&&1!==n){const e=kt.a.width/2-c.width/2,t=kt.a.height/2-c.height/2,s=c.left-e,i=c.top-t;this.moversContainer.style.transform=`matrix(${b}, 0, 0, ${v}, ${s}, ${i})`}else i.style.transform=m;let w;d&&(i.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=Object(ie.a)(),L={onAnimationEnd:C},I=setTimeout(()=>{C.isFulfilled||C.isRejected||C.resolve()},1e3);if(C.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(I)}),t)return e instanceof SVGSVGElement&&(w=i.querySelector("path"),w&&this.sizeTailPath(w,h,b,r,!1,S,f)),e.classList.contains("media-viewer-media")&&i.classList.add("hiding"),this.wholeDiv.classList.add("backwards"),setTimeout(()=>{this.wholeDiv.classList.remove("active")},0),setTimeout(()=>{i.style.borderRadius=f,i.firstElementChild&&(i.firstElementChild.style.borderRadius=f)},r/2),setTimeout(()=>{i.innerHTML="",i.classList.remove("moving","active","hiding"),i.style.cssText="display: none;",C.resolve()},r),i.classList.remove("opening"),L;{let t,s;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const n=Array.from(e.querySelectorAll("img")).pop();n&&(t=new Image,s=n.src,i.append(t))}else if(e instanceof HTMLImageElement)t=new Image,s=e.src;else if(e instanceof HTMLVideoElement)t=document.createElement("video"),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,s=t+"-mv",{width:n,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+n),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${n} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,s)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,s));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,(e,t,s,i,o)=>`translate(${t=2!==(t=+t)?n-2/b:2/b}, ${a}) scale(${+i/b}, ${+o/v})`),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const s=f.split(" ").map(e=>parseInt(e));e=S?yr(0,0,n-9/b,a,...s):yr(9/b,0,n-9/b,a,...s),w.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+h.width),c.setAttributeNS(null,"height",""+h.height),i.prepend(o)}g&&(g.style.borderRadius=f,t&&g.append(t)),t=i.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),g||(t.style.width=h.width+"px",t.style.height=h.height+"px"),s&&(yield Object(vs.b)(t,s))),i.style.display="",Object(je.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(je.a)(),i.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,d&&(i.style.opacity=""),g&&this.setFullAspect(g,h,c),setTimeout(()=>{i.style.borderRadius="",i.firstElementChild&&(i.firstElementChild.style.borderRadius="")},0),i.dataset.timeout=""+setTimeout(()=>{i.classList.remove("moving","opening"),g&&(i.querySelector("video"),i.classList.remove("active"),g.style.cssText="",i.offsetLeft),i.classList.add("center","no-transition"),i.classList.add("active"),delete i.dataset.timeout,C.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),L}))}setFullAspect(e,t,s){const i=t.width/t.height;let{width:n,height:a}=s;i>0?n=a*i:a=n*i,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,s,i,n,a,o){const r=Date.now(),{width:l,height:c}=t;i/=2;const d=o.split(" ").map(e=>parseInt(e)),h=()=>{const t=Date.now()-r;let o=i?t/i:1;o>1&&(o=1),n&&(o=1-o);const p=d.map(e=>e*o);let u;u=a?yr(0,0,l-9/s*o,c,...p):yr(9/s*o,0,l,c,...p),e.setAttributeNS(null,"d",u),t{const a=t?-i.width:s;return e.replace(n,a+"px")});e.style.transform=n,setTimeout(()=>{e.remove()},350)}setNewMover(){const e=document.createElement("div");if(e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover){this.content.mover.parentElement.append(e)}else this.moversContainer.append(e);return this.content.mover=e}updateMediaSource(e,t,s){const i=e.tagName.toLowerCase()===s?e:e.querySelector(s);if(i&&!Object(Pe.a)(e,"document")){if(Object(Pe.a)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===s)return void(t.classList.contains("manual")&&t.click());t.remove()}}Object(vs.a)(i,t),i.classList.contains("thumbnail")&&i.parentElement.classList.contains("media-container-aspecter")&&i.classList.remove("thumbnail")}}setAuthorInfo(e,t){Object(T.a)(this.author.date,Object(ne.d)(t));const s=e.isPeerId();let i;s?i=new Tt.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=X.b.wrapEmojiText(e),i.classList.add("peer-title")),Object(T.a)(this.author.nameEl,i);let n=this.author.avatarEl;this.author.avatarEl=n.cloneNode(),s?this.author.avatarEl.removeAttribute("peer-title"):this.author.avatarEl.setAttribute("peer-title",""+e),this.author.avatarEl.setAttribute("peer",""+(e||Be.c)),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,o=!1,l=[],d=[],h){return Zl(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const p="document"===e._,u=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(l,d,o),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout(()=>{this.listLoader.load(!0)},0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,m=!n||n===g;m&&(n=g),this.target={element:n};const v=++this.tempId;g.firstElementChild&&(g.innerHTML="");if(0!==i)this.moveTheMover(this.content.mover,1===i),this.setNewMover();else{a.default.isOverlayActive=!0,window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),he.IS_TOUCH_SUPPORTED||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0});const e=document.getElementById("main-columns");this.pageEl.insertBefore(this.wholeDiv,e),this.wholeDiv.offsetLeft,this.wholeDiv.classList.add("active"),I.a.checkAnimations(!0),ae.IS_MOBILE_SAFARI||D.a.pushItem({type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}})}const f=this.content.mover,y=kt.a.width;let w=0;const S=kt.a.height;S<1e6&&!b.b.isMobile&&(w=120);const C=S-120-w;let M=Promise.resolve();const E=r.a.setAttachmentSize(e,g,y,C,!b.b.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(m){const t=ce.a.getCacheContext(e,E.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(M=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),g.append(s))}const P=!(!p||!e.supportsStreaming),T=P?this.preloaderStreamable:this.preloader;let k;if(u){const t=h&&"gif"!==e.type,s=document.createElement("video"),a=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:i})=>{const a=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,o=f.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",()=>{this.tempId!==v&&s.pause()}),s.addEventListener("error",()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),T&&T.detach()},{once:!0}),this.addEventListener("setMoverAfter",()=>{s.src="",s.load()},{once:!0}),ae.IS_SAFARI&&(s.autoplay=!0),"gif"===e.type?(s.muted=!0,s.autoplay=!0,s.loop=!0):e.duration<60&&(s.loop=!0),a.append(s);const r=new Promise(e=>{s.addEventListener("canplay",e,{once:!0})}),l=()=>{"gif"!==e.type&&(s.dataset.ckin="default",s.dataset.overlay="1",Promise.all([r,i]).then(()=>{if(this.tempId!==v)return;(this.videoPlayer=new Oe({video:s,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)}})).addEventListener("toggleControls",e=>{this.wholeDiv.classList.toggle("has-video-controls",e)}),this.addEventListener("setMoverBefore",()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.removeListeners(),this.videoPlayer=void 0},{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1)}))};if(P){i.then(()=>{s.readyState{s.addEventListener("canplay",()=>{T.detach(),s.parentElement.classList.remove("is-buffering")},{once:!0})};s.addEventListener("waiting",()=>{const t=s.networkState===s.NETWORK_LOADING,i=s.readyState{Object(c.a)(e)}),e()}this.lazyLoadQueue.unshift({load:()=>{const o=ce.a.getCacheContext(e),r=P?Promise.resolve():L.a.downloadDoc(e);return P||i.then(()=>{o.url||T.attach(f,!0,r)}),Promise.all([r,i]).then(()=>{if(this.tempId!==v)return void this.log.warn("media viewer changed video");const e=o.url;if(n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):Object(vs.a)(s,e),t){const e=fe.setSingleMedia(s,h);this.addEventListener("setMoverBefore",()=>{e()},{once:!0})}this.updateMediaSource(n,e,"video"),l()}),r}})});k=M.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=ce.a.getCacheContext(e,E.type),i=p?L.a.downloadDoc(e):r.a.preloadPhoto(e,E);return t.then(()=>{s.url||this.preloader.attachPromise(i)}),Promise.all([t,i]).then(()=>{var e;if(this.tempId!==v)return void this.log.warn("media viewer changed photo");const t=s.url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(f,t,"img"),b.b.isMobile){const e=f.querySelectorAll("img");e&&e.length&&e.forEach(e=>{e.classList.remove("thumbnail")})}}else{const s=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,i="IMG"===(null===(e=s.firstElementChild)||void 0===e?void 0:e.tagName)?s.firstElementChild:null;if(!i||i.src!==t){let e=new Image;e.classList.add("thumbnail"),Object(vs.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(je.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(f),this.preloader.setManual()}),i}})});k=M.then(t)}return this.setMoverPromise=k.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}var tc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class sc extends ec{constructor(){let e;super(new C({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||sc.isMediaCompatibleForDocumentViewer(a)))return{element:null,mid:s,peerId:n}}}),["delete","forward"]),this.onPrevClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,-1)},this.onNextClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,1)},this.onDeleteClick=()=>{const e=this.target;new ei(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new Zs({[e.peerId]:[e.mid]},()=>this.close())},this.onAuthorClick=e=>{const{mid:t,peerId:s}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const i=this.searchContext.threadId,n=this.getMessageByPeer(s,t);this.close(e).then(()=>{if(b.b.isMobile){const e=rs.getTab(as);e&&e.close()}Jl.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:i?"discussion":void 0,threadId:i})})}},this.onDownloadClick=()=>{const{peerId:e,mid:t}=this.target,s=this.getMessageByPeer(e,t);if(s.media.photo)r.a.savePhotoFile(s.media.photo,Jl.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&L.a.saveDocFile(e,Jl.chat.bubbles.lazyLoadQueue.queueId)}},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout(()=>{e=void 0,this.content.caption.classList.remove("is-focused")},800)};this.content.caption.addEventListener("touchstart",()=>{b.b.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))});new P.b(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),Object(l.b)(this.buttons.delete,this.onDeleteClick);const s=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(s),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),Object(l.b)(this.buttons.forward,this.onForwardClick),Object(l.b)(this.author.container,this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const s=t.target.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return Object(c.a)(t),this.close().then(()=>{Object(l.c)(this.content.caption,e,{capture:!0}),t.target.click()}),!1}};Object(l.b)(this.content.caption,e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?i.a.getScheduledMessageByPeer(e,t):i.a.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let s="";t&&(s=X.b.wrapRichText(t,{entities:e.totalEntities})),m(this.content.caption.firstElementChild,s),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,s=0,n=!1,a=[],o=[]){const r=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return tc(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const l=e.mid,c=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,d=i.a.getMediaFromMessage(e),h="messageService"===e._||!i.a.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach(e=>{e.classList.toggle("hide",h)}),this.wholeDiv.classList.toggle("no-forwards",h);const p=h;[this.buttons.download,this.btnMenuDownload.element].forEach(e=>{e.classList.toggle("hide",p)});const u=i.a.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach(e=>{e.classList.toggle("hide",!u)}),this.setCaption(e);const g=r._openMedia.call(this,d,e.date,c,s,t,n,a,o,e);return this.target.mid=l,this.target.peerId=e.peerId,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||g.has(e.mime_type)}}class ic extends S{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var i;if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const n=(null==e?void 0:e.photoId)||(null===(i=this.current)||void 0===i?void 0:i.photoId);return r.a.getUserPhotos(this.peerId,n,s).then(e=>{const t=e.photos.map(e=>({element:null,photoId:e}));return{count:e.count,items:t}})}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var nc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ac extends ec{constructor(e){super(new ic({peerId:e}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{r.a.savePhotoFile(r.a.getPhoto(this.target.photoId),Jl.chat.bubbles.lazyLoadQueue.queueId)},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,s=0,i,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return nc(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=r.a.getPhoto(e),l=a._openMedia.call(this,o,o.date,this.peerId,s,t,!1,i,n);return this.target.photoId=o.id,l}))}}var oc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const rc=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[peer="'+e+'"]')).forEach(e=>{e.update()})};function lc(e,t,s,a,o,l){return oc(this,void 0,void 0,(function*(){let c=yield n.default.getFullPhoto(t);if(!s()||!c)return;const d=()=>Array.from(e.querySelectorAll("img")).find(e=>!e.classList.contains("emoji"))?e:null;if(t.isAnyChat()){const e=!!a,n="inputMessagesFilterChatPhotos";if(!a&&(a=yield i.a.getSearch({peerId:t,inputFilter:{_:n},maxId:0,limit:1}).then(e=>e.history[0]),!s()))return;if(a){a.action.photo.id!==c.id&&(e||(a=i.a.generateFakeAvatarMessage(t,c)));const s=e=>e.map(e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId}));return void(new sc).setSearchContext({peerId:t,inputFilter:{_:n}}).openMedia(a,d(),void 0,void 0,o?s(o):void 0,l?s(l):void 0)}}if(c){!Object(da.a)(a)&&a&&(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new ac(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.default.addEventListener("avatar_update",rc),a.default.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||rc(e)});const cc=new Map,dc=new Set;class hc extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}connectedCallback(){if(this.isDialog="1"===this.getAttribute("dialog"),""===this.getAttribute("clickable")){this.setAttribute("clickable","set");let e=!1;Object(l.b)(this,t=>oc(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield lc(this,this.peerId,()=>this.peerId===s),e=!1})))}}disconnectedCallback(){const e=cc.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||cc.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}static get observedAttributes(){return["peer","dialog","peer-title"]}attributeChangedCallback(e,t,s){if("peer"===e){const e=(s||"").toPeerId()||Be.c;if(this.peerId===e)return;this.peerId=o.a.getPeerMigratedTo(e)||e;const i=(t||"").toPeerId()||Be.c;if(i){const e=cc.get(i);e&&(e.delete(this),e.size||cc.delete(i))}this.update()}else"peer-title"===e?this.peerTitle=s:"dialog"===e&&(this.isDialog="1"===s)}r(e=!1){const t=d.a.putPhoto(this,this.peerId,this.isDialog,this.peerTitle,e,this.isBig),s=t?t.loadPromise:Promise.resolve();return this.loadPromises&&(t&&t.cached&&this.loadPromises.push(s),s.finally(()=>{this.loadPromises=void 0})),t}update(){if(this.lazyLoadQueue){if(!dc.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=cc.get(this.peerId);return e||(e=new Set,cc.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(dc.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}dc.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=cc.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);cc.delete(this.peerId);for(let t=0,s=e.length;t{let e=i.a.getDialogOnly(this.selectedId);e&&i.a.editPeerFolders([e.peerId],+!e.folder_id)},this.onPinClick=()=>{i.a.toggleDialogPin(this.selectedId,this.filterId).catch(e=>{"PINNED_DIALOGS_TOO_MUCH"===e.type&&(this.filterId>=1?mt({langPackKey:"PinFolderLimitReached"}):new St("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new yn(qn).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[Object(k.i18n)("Chats",[a.default.config.pinned_dialogs_count_max])]}).show())})},this.onUnmuteClick=()=>{i.a.togglePeerMute(this.selectedId,!1)},this.onMuteClick=()=>{new dr(this.selectedId)},this.onUnreadClick=()=>{const e=i.a.getDialogOnly(this.selectedId);e&&(e.unread_count?(i.a.readHistory(this.selectedId,e.top_message),i.a.markDialogUnread(this.selectedId,!0)):i.a.markDialogUnread(this.selectedId))},this.onDeleteClick=()=>{new Ut(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(It.a)(e.target,"LI")}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.filterId=Pc.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=i.a.getDialogOnly(this.selectedId),this.buttons.forEach(e=>{const t=e.verify();e.element.classList.toggle("hide",!t)}),this.buttons[this.buttons.length-1].element.lastChild.replaceWith(Object(k.i18n)(o.a.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),Object(ee.e)(e,this.element),Object(ee.d)(this.element,()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0})}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>!i.a.isDialogUnread(this.dialog)},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>i.a.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>{var e;return!(this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>{var e;return this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>this.selectedId!==a.default.myId&&!Gt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.default.myId&&Gt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==a.default.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==a.default.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Ie(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var uc,gc;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(uc||(uc={}));class mc{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{Nn.a.get("dc").then(e=>{e||(e=Un.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.default.connectionStatus["NET-"+e],s=t&&t.status===uc.Connected;this.connecting&&s&&bi.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===uc.TimedOut,this.connecting=!s,this.retryAt=t&&t.retryAt,le.b&&this.log("connecting",this.connecting),this.setState()})},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,Object(T.a)(this.statusEl,Object(k.i18n)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{const e=mc.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>vt.a.forceReconnect());this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,s=()=>{const s=Date.now();e.innerText=""+Math.round((t-s)/1e3),s>t&&clearInterval(i)},i=setInterval(s,1e3);s();const n=this.getA("ConnectionStatus.Reconnect",()=>vt.a.forceReconnectTimeout());this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");le.b&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame(()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout);this.setStateTimeout=window.setTimeout(()=>{Object(cs.a)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,le.b&&this.log("setState: isShown:",this.connecting||this.updating)},e)})},this.log=Object(Y.b)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=Object(B.a)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new ye.a({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),e.prepend(this.statusContainer),a.default.addEventListener("connection_status_change",e=>{console.log(e),this.setConnectionStatus()}),a.default.addEventListener("state_synchronizing",e=>{e||(this.updating=!0,le.b&&this.log("updating",this.updating),this.setState())}),a.default.addEventListener("state_synchronized",e=>{le.b&&this.log("state_synchronized",e),e||(this.updating=!1,le.b&&this.log("updating",this.updating),this.setState())}),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,mc.CHANGE_STATE_DELAY+1e3)}getA(e,t){const s=document.createElement("a");return s.classList.add("force-reconnect"),s.append(Object(k.i18n)(e)),Object(l.b)(s,e=>{Object(c.a)(e),t()}),s}}function bc(e,t,s,i,n,a,o,r){if("number"==typeof a)a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]||e[t]}e.beginPath(),e.moveTo(t+a.tl,s),e.lineTo(t+i-a.tr,s),e.quadraticCurveTo(t+i,s,t+i,s+a.tr),e.lineTo(t+i,s+n-a.br),e.quadraticCurveTo(t+i,s+n,t+i-a.br,s+n),e.lineTo(t+a.bl,s+n),e.quadraticCurveTo(t,s+n,t,s+n-a.bl),e.lineTo(t,s+a.tl),e.quadraticCurveTo(t,s,t+a.tl,s),e.closePath(),o&&e.fill(),r&&e.stroke()}mc.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(gc||(gc={}));const vc=window.devicePixelRatio,fc=20*vc,yc=2.5*vc,wc=2*vc,Sc=1*vc;function Cc(e=!1){const t=document.createElement("canvas");t.width=t.height=fc;const s=t.getContext("2d"),i=(fc-(3*wc+2*yc))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Date.now(),r=(l=(o-n)%1e3,c=0,d=1e3,-1/2*(Math.cos(Math.PI*l/d)-1)+c);var l,c,d;s.clearRect(0,0,fc,fc),s.fillStyle=e&&!b.b.isMobile?kr.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=r>=.5?e%2?2-2*r:2*(r-.5):e%2?2*r:1-2*r;let n=4+8*t;n*=vc;bc(s,i+e*wc+e*yc,(fc-n)/2,wc,n,Sc,!0)}return!0};return{canvas:t,startAnimation:()=>{Object(Ne.a)(o),o()},setActive:t=>{e=t,o()}}}var Lc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ic extends Gs{constructor(e,t,s){super({getIndex:e=>i.a.getDialogOnly(e.id)[this.indexKey],onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Vs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=Ec.addListDialog({dialog:e.id,loadPromises:s,isBatch:t});return e.dom=i,(null==s?void 0:s.length)&&(e.loadPromises=s,Promise.all(s).finally(()=>{delete e.loadPromises})),e},updateElementWith:je.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class Mc{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=Object(Y.b)("DIALOGS",Y.a.Log|Y.a.Error|Y.a.Warn|Y.a.Debug),this.contextMenu=new pc,this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>{this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()},this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,s=e.parentElement.parentElement,i=e.parentElement.nextElementSibling,n=!!i.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;s.classList.add("with-contacts");const a=new zn({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),E.a.getContactsPeerIds(void 0,void 0,"online").then(e=>{let t=!1;const s=()=>{t&&a.container.classList.toggle("hide",!i.list.childElementCount),this.updateContactsLength(!0)},i=new qs({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=kt.a.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach(e=>{i.add(e)}),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),s=i.has(e);!s&&t?i.add(e):s&&!t&&i.delete(e)};const n=i.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,s()}),i.append(a.container)},this.verifyPeerIdForContacts=e=>e.isContact()&&!i.a.getDialogOnly(e),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout(()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&Object(je.c)(()=>{const e=performance.now(),t=this.scroll.scrollTop,s=this.chatList.firstElementChild,i=this.scroll.container.getBoundingClientRect(),n=s.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)}),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-h,this.log("slice time",performance.now()-e)})},200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>this.scroll.loadedAll[e]?(this.loadContacts&&this.loadContacts(),Promise.resolve()):this.loadDialogsPromise?this.loadDialogsPromise:(this.log("onChatsScroll",e),this.loadDialogs(e)),this.chatsPreloader=Object(ee.f)(null,!0),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=bt(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),he.IS_TOUCH_SUPPORTED&&Ys({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.allChatsIntlElement=new k.default.IntlElement({key:"FilterAllChatsShort"}),this.setFilterId(0),this.addFilter({id:this.filterId,title:"",titleEl:this.allChatsIntlElement.element,orderIndex:0}),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],a.default.addEventListener("state_cleared",()=>{M.default.getState().then(e=>{this.loadedDialogsAtLeastOnce=!1,E.a.clear(),G.a.clear();const t=i.a.filtersStorage.filters;for(const e in t)a.default.dispatchEvent("updateDialogFilter",{_:"updateDialogFilter",id:+e});i.a.clear(),this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)})});const t=new P.a(this.folders.menuScrollContainer);e.prepend(this.folders.menuScrollContainer);const s=Object(J.a)(this.folders.menu,this.folders.container,(e,t)=>{e=+t.dataset.filterId||0,ae.IS_MOBILE_SAFARI||(e?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},D.a.unshiftItem(this.filtersNavigationItem)):this.filtersNavigationItem&&(D.a.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),this.filterId!==e&&(this.sortedLists[e].clear(),this.setFilterId(e),this.onTabChange())},()=>{for(const e in this.sortedLists)+e!==this.filterId&&this.sortedLists[e].clear()},void 0,t);this.folders.menu.firstElementChild.click(),i.a.construct(),M.default.getState().then(e=>this.onStateLoaded(e)),b.b.addEventListener("resize",()=>{this.changeFiltersAllChatsKey()}),new mc(this.chatsContainer),this.chatsContainer.append(e),setTimeout(()=>{oe.a.loadLottieWorkers()},200)}get chatList(){return this.sortedList.list}setFilterId(e){this.filterId=e,this.indexKey=i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(this.filterId):"index",a.default.filterId=e}setOnlineStatus(e,t){const s=e.classList.contains("is-online");!s&&t&&e.classList.add("is-online"),Object(cs.a)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove("is-online")},t&&!s?2:0)}initListeners(){a.default.addEventListener("user_update",e=>{var t;const s=e.toPeerId(),i=this.getDialogDom(s);if(i&&!E.a.isBot(e)&&s!==a.default.myId){const s="userStatusOnline"===(null===(t=E.a.getUser(e).status)||void 0===t?void 0:t._);this.setOnlineStatus(i.avatarEl,s)}}),a.default.addEventListener("chat_update",e=>{const t=e.toPeerId(!0),s=i.a.getDialogOnly(t);s&&this.processDialogForCallStatus(s)}),a.default.addEventListener("folder_unread",e=>{this.setFilterUnreadCount(e.id)}),a.default.addEventListener("contacts_update",e=>{this.processContact&&this.processContact(e.toPeerId())}),a.default.addEventListener("dialog_flush",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setLastMessage(t,void 0,void 0,void 0,void 0,void 0,!0),this.validateDialogForFilter(t),this.setFiltersUnreadCount())}),a.default.addEventListener("dialogs_multiupdate",e=>{for(const t in e){const s=e[t];this.updateDialog(s),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(s)}}),a.default.addEventListener("dialog_drop",({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)}),a.default.addEventListener("dialog_unread",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setUnreadMessages(t),this.validateDialogForFilter(t))}),a.default.addEventListener("dialog_notify_settings",e=>{this.validateDialogForFilter(e),this.setUnreadMessages(e),this.setFiltersUnreadCount()}),a.default.addEventListener("dialog_draft",({dialog:e,drop:t,peerId:s})=>{t?this.sortedList.delete(s):this.updateDialog(e),this.processContact&&this.processContact(s)}),a.default.addEventListener("peer_changed",e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] li[data-peer-id="${e}"]`)).forEach(e=>{this.setDialogActive(e,!0)})}),a.default.addEventListener("filter_update",e=>{if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=i.a.dialogsStorage.getCachedDialogs(!0);this.validateListForFilter();for(let t=0,s=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange())}),a.default.addEventListener("filter_order",e=>{const t=this.folders.menu;e.forEach(e=>{const s=i.a.filtersStorage.getFilter(e),n=this.filtersRendered[e];this.sortedLists[e].indexKey=i.a.dialogsStorage.getDialogIndexKey(e),Vs(n.menu,t,s.orderIndex),Vs(n.container,this.folders.container,s.orderIndex)}),this.indexKey=i.a.dialogsStorage.getDialogIndexKey(this.filterId)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{const s=i.a.getDialogOnly(e);s&&(t.length?this.setTyping(s):this.unsetTyping(s))})}setDialogActive(e,t){const s=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return Lc(this,void 0,void 0,(function*(){if(e.notifySettings)for(const t in e.notifySettings)Object(Is.a)(t),Gt.a.savePeerSettings({key:t,settings:e.notifySettings[t]});Gt.a.getNotifyPeerTypeSettings(),this.initedListeners||(this.initListeners(),this.initedListeners=!0);const t=i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.addFilter(t)});return e.filters&&Object.keys(e.filters).length&&(yield t,this.showFiltersPromise&&(yield this.showFiltersPromise)),M.default.storagesResults.dialogs.length&&zi.a.addMissedDialogs(),this.onChatsScroll().then(()=>{i.a.fillConversations()})}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),s=this.getOffsetIndex("bottom");if(!t.index&&!s.index)return!0;const i=e[this.indexKey];return(!t.index||i<=t.index)&&(!s.index||i>=s.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessage(e,void 0,t,void 0,void 0,void 0,!0),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;const s=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!s)return;const n=i.a.dialogsStorage.getFolder(e),a=0===e||!!n.dialogs.find(e=>(e.unread_count||e.pFlags.unread_mark)&&!Gt.a.isPeerLocalMuted(e.peerId,!0));s.classList.toggle("badge-gray",!a);const o=n.unreadDialogsCount;s.innerText=o?""+o:""}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}validateListForFilter(){const e=i.a.filtersStorage.getFilter(this.filterId)||null;this.sortedList.getAll().forEach(t=>{const s=i.a.getDialogOnly(t.id);this.testDialogForFilter(s,e)||this.deleteDialog(t.id)})}validateDialogForFilter(e,t){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e,t)||this.deleteDialog(e.peerId))}testDialogForFilter(e,t=i.a.filtersStorage.getFilter(this.filterId)){return!(!e||t&&!i.a.filtersStorage.testDialogForFilter(e,t)||!t&&this.filterId!==e.folder_id)}generateScrollable(e,t){const s=new P.b(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+t,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new Ic(e,i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(t):"index",this.onListLengthChange);return this.scrollables[t]=s,this.sortedLists[t]=n,s}addFilter(e){if(this.filtersRendered[e.id])return;const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("span");i.classList.add("text-super"),e.titleEl?i.append(e.titleEl):i.innerHTML=X.a.wrapEmojiText(e.title);const n=document.createElement("div");n.classList.add("badge","badge-20","badge-primary");const a=document.createElement("i");s.append(i,n,a),Object(te.ripple)(t),t.append(s);Vs(t,this.folders.menu,e.orderIndex);const o=this.createChatList(),r=this.generateScrollable(o,e.id);r.container.classList.add("tabs-tab","chatlist-parts");const l=document.createElement("div");l.classList.add("chatlist-top");const c=document.createElement("div");c.classList.add("chatlist-bottom"),l.append(o),r.container.append(l,c);const d=r.container;Vs(r.container,this.folders.container,e.orderIndex),this.setListClickListener(o,null,!0),this.filtersRendered[e.id]={menu:t,container:d,unread:n,title:i},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise(e=>{window.setTimeout(()=>{const t=Object.keys(this.filtersRendered).length>1,s=!this.folders.menuScrollContainer.classList.contains("hide");t!==s&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!s&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0,e()},0)})),this.showFiltersPromise}loadDialogs(e){if(this.loadDialogsPromise)return this.loadDialogsPromise;const t=new Promise(s=>Lc(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=kt.a.height/72*1.25|0,l=0;const{index:c}=this.getOffsetIndex(e);if(c)if("top"===e){const e=i.a.dialogsStorage.getFolderDialogs(a,!0),t=e.findIndex(e=>e[o]<=c),s=Math.max(0,t-r);r=t-s,l=e[s][o]+1}else l=c;try{const s=i.a.getConversations("",l,r,a,!0);if(!s.cached&&!n.childElementCount){n.parentElement.append(this.chatsPreloader)}const c=yield s.promise;if(this.loadDialogsPromise!==t)return;if("bottom"===e?c.isEnd&&(this.scroll.loadedAll[e]=!0):c.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,c.dialogs.length){const t="top"===e?c.dialogs.slice().reverse():c.dialogs,s=[],n=[],a=e=>{n.push(e)};t.forEach(e=>{if(!i.a.getDialogOnly(e.peerId))return;const t=this.sortedList.add(e.peerId,!0,a,!1);t.loadPromises&&s.push(...t.loadPromises)}),yield Promise.all(s).finally(),n.forEach(e=>e())}else this.onListLengthChange();const d=c.dialogs["top"===e?0:c.dialogs.length-1];d&&(this.offsets[e]=d[o]),this.log.debug("getDialogs "+r+" dialogs by offset:",l,c,n.childElementCount),setTimeout(()=>{this.scroll.onScroll()},0)}catch(e){this.log.error(e)}this.chatsPreloader.parentElement&&this.chatsPreloader.remove(),s()}))).finally(()=>{this.loadDialogsPromise=void 0});return this.loadDialogsPromise=t}generateEmptyPlaceholder(e){const t="empty-placeholder",s=document.createElement("div");s.classList.add(t,t+"-"+e.classNameType);const i=document.createElement("div");i.classList.add(t+"-header"),Object(k._i18n)(i,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&Object(k._i18n)(n,e.subtitle,e.subtitleArgs),s.append(i,n),{container:s,header:i,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let s=Array.from(t.children).find(e=>e.matches(".empty-placeholder"));const n=this.scroll.loadedAll.bottom&&!e.childElementCount;if(n&&s)return;if(!n)return void(s&&(t.classList.remove("with-placeholder"),s.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),s=a.container,s.prepend(function({emoji:e,width:t,height:s}){const i=document.createElement("div"),n=ys.a.getAnimatedEmojiSticker(e);return n?Fs({doc:n,div:i,loop:!1,play:!0,width:t,height:s,emoji:e}).then(()=>{}):i.classList.add("media-sticker-wrapper"),{container:i}}({emoji:"📂",width:128,height:128}).container);const e=Object(B.a)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});Object(l.b)(e,()=>{new vn(qn).open(i.a.filtersStorage.getFilter(this.filterId))}),s.append(e)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),s=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new k.default.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),Object(vs.b)(e,"assets/img/EmptyChats.svg"),Object(je.d)()]).then(([e])=>{s.classList.add("visible"),t.classList.toggle("has-contacts",!!e)}),s.prepend(e)}t.append(s),t.classList.add("with-placeholder"),t.dataset.placeholderType=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise:this.updateContactsLengthPromise=E.a.getContacts().then(t=>{const s=this.emptyDialogsPlaceholderSubtitle;if(s){let e,i;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",i=[Object(k.i18n)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",i=[]),s.compareAndUpdate({key:e,args:i})}if(e){this.chatList.parentElement.classList.toggle("has-contacts",!!t.length)}return this.updateContactsLengthPromise=void 0,t.length})}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,s=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),s.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){const e=this.chatList,t=this.getDialogFromElement(e.firstElementChild),s=this.getDialogFromElement(e.lastElementChild),i=this.indexKey;this.offsets.top=t[i],this.offsets.bottom=s[i]}getDialogFromElement(e){return i.a.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,s=!1,n=!1,a=!1){let o;const r=(a?Jl.setInnerPeer:Jl.setPeer).bind(Jl);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(It.a)(s,"LI");if(i){if(n){const e=o===i;o&&!e&&o.classList.remove("active"),i&&(i.classList.add("active"),o=i,this.lastActiveElements.add(i))}if(i){t&&t();const e=i.dataset.peerId.toPeerId(),s=+i.dataset.mid||void 0;r({peerId:e,lastMsgId:s})}else r()}},{capture:!0}),le.b&&e.addEventListener("dblclick",e=>{const t=Object(It.a)(e.target,"LI");if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",i.a.getDialogByPeerId(e))}}),s&&Object(ee.a)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessage(e,t,s,n,l,c=!1,d=!1){if(!s&&!(s=this.getDialogDom(e.peerId)))return;let h;if(t||(e.draft&&"draftMessage"===e.draft._&&(h=e.draft),t=i.a.getMessageByPeer(e.peerId,e.top_message)),"messageEmpty"===t._)return s.lastMessageSpan.innerHTML="",s.lastTimeSpan.innerHTML="",delete s.listEl.dataset.mid,void(d&&this.setUnreadMessages(e,s,c));const p=e.peerId,u=t&&i.a.isRestricted(t);{let e;if(!t.deleted&&!h&&!u){const s=i.a.getMediaFromMessage(t);if(s&&("photo"===s._||["video","gif"].includes(s.type))){const i=r.a.choosePhotoSize(s,20,20);if("photoSizeEmpty"!==i._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),As({photo:s,message:t,container:e,withoutPreloader:!0,size:i,loadPromises:l}),"video"===s.type)){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}const c=!!e&&!!(null==t?void 0:t.message);let d;if(d=n&&t.message?i.a.wrapMessageForReply(t,void 0,void 0,!1,n,c):h?i.a.wrapMessageForReply(h):t.deleted?document.createDocumentFragment():i.a.wrapMessageForReply(t,void 0,void 0,!1,void 0,c),e&&d.prepend(e),Object(T.a)(s.lastMessageSpan,d),h){const e=document.createElement("b");e.classList.add("danger"),e.append(Object(k.i18n)("Draft"),": "),s.lastMessageSpan.prepend(e)}else if(p.isAnyChat()&&p!==t.fromId&&!t.action){const e=o.a.getPeer(t.fromId);if(e&&e.id){const i=document.createElement("b");e.id===a.default.myId?i.append(Object(k.i18n)("FromYou")):i.append(new Tt.a({peerId:t.fromId,onlyFirstName:!0}).element),i.append(": "),s.lastMessageSpan.prepend(i)}}}if(!t.deleted||h){const e=h?Math.max(h.date,t.date||0):t.date;Object(T.a)(s.lastTimeSpan,Object(ne.c)(new Date(1e3*e)))}else s.lastTimeSpan.textContent="";null!==d&&(d?this.setUnreadMessages(e,s,c):s.listEl.dataset.mid=t.mid)}setUnreadMessages(e,t=this.getDialogDom(e.peerId),s=!1){var n;if(!t)return;if(!s){const s=Gt.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(cs.a)(t.listEl,"is-muted",s,200)}let o;if("draftMessage"!==(null===(n=e.draft)||void 0===n?void 0:n._)){const t=i.a.getMessageByPeer(e.peerId,e.top_message);!t.deleted&&t.pFlags.out&&t.peerId!==a.default.myId&&(o=t)}!function(e,t,s){let i;if((null==t?void 0:t.pFlags.out)&&(i=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!i)return void(e.textContent="");const n="tgico-"+i,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,o);const r=i.a.filtersStorage.getFilter(this.filterId);let l;l=r?-1!==r.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const c=i.a.isDialogUnread(e),d=l||c,h=Object(ws.a)(t.unreadBadge);d&&!h&&t.subtitleEl.append(t.unreadBadge);const p=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),u=t.mentionsBadge&&Object(ws.a)(t.mentionsBadge);p&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling)));const g=s?0:200;if(Object(cs.a)(t.unreadBadge,"is-visible",d,g,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(cs.a)(t.mentionsBadge,"is-visible",p,g,p?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},u?0:2),!d)return;l?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let m=!0,b=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",b=!0):c?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",m=!1),t.unreadBadge.classList.toggle("unread",m),t.unreadBadge.classList.toggle("mention",b)}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){if("object"!=typeof e){const t=i.a.getDialogOnly(e);if(!t){const t=e||Be.c;return{peerId:t,peer:o.a.getOutputPeer(t),pFlags:{}}}return t}return e}setCallStatus(e,t){let{callIcon:s,listEl:i}=e;if(!s&&t){const{canvas:t,startAnimation:n}=e.callIcon=s=Cc(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&Object(cs.a)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){const t=this.getDialog(e.dialog);e.autonomous=!1;const s=this.addDialogNew(e);if(s){const{peerId:i}=t;Gt.a.isPeerLocalMuted(i,!0)&&s.dom.listEl.classList.add("is-muted"),i.isUser()||this.processDialogForCallStatus(t,s.dom),this.setLastMessage(t,void 0,s.dom,void 0,e.loadPromises,e.isBatch,!0)}return s}processDialogForCallStatus(e,t){if(!lr)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const s=G.a.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!s.pFlags.call_active||!s.pFlags.call_not_empty))}addDialogAndSetLastMessage(e){const{peerId:t,message:s,query:n}=e,a=Ec.addDialogNew(Object.assign(Object.assign(Object.assign({},e),i.a.getMessageSenderPeerIdOrName(s)),{dialog:this.getDialog(t)}));return this.setLastMessage(a.dialog,s,a.dom,n),s.peerId!==t&&(a.dom.listEl.dataset.peerId=""+s.peerId),a}addDialogNew(e){return this.addDialog(e.dialog,e.container,e.drawStatus,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName)}addDialog(e,t,s=!0,i=!0,n=!1,r=!0,l=!0,c=54,d=!!t,h,p,u){var g,m,b;const v=this.getDialog(e),f=v.peerId,y=new hc;if(y.loadPromises=p,y.lazyLoadQueue=h,y.setAttribute("dialog",r?"1":"0"),void 0!==u&&y.setAttribute("peer-title",u),y.setAttribute("peer",""+f),y.classList.add("dialog-avatar","avatar-"+c),s&&f!==a.default.myId&&f.isUser()){"userStatusOnline"===(null===(g=E.a.getUser(f).status)||void 0===g?void 0:g._)&&this.setOnlineStatus(y,!0)}const w=document.createElement("div");w.classList.add("user-caption");const S=document.createElement("span");S.classList.add("user-title");const C=new Tt.a({peerId:f,fromName:u,dialog:r,onlyFirstName:n,plainText:!1});S.append(C.element),S.classList.add("tgico");const L=o.a.getPeer(f);(null===(m=null==L?void 0:L.pFlags)||void 0===m?void 0:m.verified)&&S.append(Yt());const I=document.createElement("span");I.classList.add("user-last-message"),I.setAttribute("dir","auto");const M=document.createElement("li");M.classList.add("chatlist-chat"),i&&Object(te.ripple)(M),M.append(y,w),M.dataset.peerId=""+f;const P=document.createElement("span");P.classList.add("message-status","sending-status");const T=document.createElement("span");T.classList.add("message-time");const k=document.createElement("div");k.className="dialog-subtitle-badge badge badge-24";const x=document.createElement("p");x.classList.add("dialog-title");const A=document.createElement("span");A.classList.add("dialog-title-details"),A.append(P,T),x.append(S,A);const O=document.createElement("p");O.classList.add("dialog-subtitle"),O.append(I),w.append(x,O);const _={avatarEl:y,captionDiv:w,titleSpan:C.element,titleSpanContainer:S,statusSpan:P,lastTimeSpan:T,unreadBadge:k,lastMessageSpan:I,containerEl:M,listEl:M,subtitleEl:O};if(t){t[l?"append":"prepend"](M)}return d||(M.dialogDom=_,(null===(b=Jl.chat)||void 0===b?void 0:b.peerId)===f&&this.setDialogActive(M,!0)),{dom:_,dialog:v}}setTyping(e){const t=this.getDialogDom(e.peerId);if(!t)return;const s=t.lastMessageSpan.querySelector(".peer-typing-container"),i=Jl.getPeerTyping(e.peerId,s);!s&&i&&(Object(T.a)(t.lastMessageSpan,i),t.lastMessageSpan.classList.add("user-typing"))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessage(e,null,t,void 0,void 0,void 0,null))}}const Ec=new Mc;le.a.appDialogsManager=Ec;var Pc=t.default=Ec},194:function(e,t,s){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(i,n,function(t){return e[t]}.bind(null,n));return i},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";(function(t){var s=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return s&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],s=0;s{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,s)=>{var i=s=>{switch(s.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=s.data.samplePosition,e(s.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,s)=>{var i=s=>{"flushed"===s.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var s=i=>{"done"===i.data.message&&(e.removeEventListener("message",s),t())};e.addEventListener("message",s),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,s){return e.set(s,t),t+s.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,s(1))},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s}])},88:function(e,t,s){"use strict";var i=s(30),n=s(32);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(e=>e)}updateSettings(e={}){return this.getState().then(t=>{let s,i;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};s=e.currentPassword?n.a.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=t.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,i=e.newPassword?n.a.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([s,i]).then(e=>(a.password=e[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=e[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(e,t,s={}){return n.a.invokeCrypto("computeSRP",e,t,!1).then(e=>n.a.invokeApi("auth.checkPassword",{password:e},s).then(e=>("auth.authorization"===e._&&n.a.setUser(e.user),e)))}confirmPasswordEmail(e){return n.a.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};i.a.passwordManager=a,t.a=a}}]); +//# sourceMappingURL=18.29da8a83178db260ea59.chunk.js.map \ No newline at end of file diff --git a/public/18.29da8a83178db260ea59.chunk.js.map b/public/18.29da8a83178db260ea59.chunk.js.map new file mode 100644 index 00000000..21d52c81 --- /dev/null +++ b/public/18.29da8a83178db260ea59.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/helpers/bytes/bufferConcats.ts","webpack:///./src/environment/mediaMimeTypesSupport.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/helpers/filterChatPhotosMessages.ts","webpack:///./src/helpers/listLoader.ts","webpack:///./src/helpers/searchListLoader.ts","webpack:///./src/components/appSearch.ts","webpack:///./src/components/inputSearch.ts","webpack:///./src/components/buttonIcon.ts","webpack:///./src/components/sliderTab.ts","webpack:///./src/components/slider.ts","webpack:///./src/components/avatarEdit.ts","webpack:///./src/components/buttonCorner.ts","webpack:///./src/components/sidebarLeft/tabs/newGroup.ts","webpack:///./src/components/appMediaPlaybackController.ts","webpack:///./src/helpers/dom/attachGrabListeners.ts","webpack:///./src/components/rangeSelector.ts","webpack:///./src/components/buttonMenu.ts","webpack:///./src/components/buttonMenuToggle.ts","webpack:///./src/helpers/dom/controlsHover.ts","webpack:///./src/lib/mediaPlayer.ts","webpack:///./src/helpers/schedulers/throttleWithRaf.ts","webpack:///./src/helpers/schedulers/throttleWith.ts","webpack:///./src/helpers/formatBytes.ts","webpack:///./src/components/audio.ts","webpack:///./src/components/divAndCaption.ts","webpack:///./src/components/chat/replyContainer.ts","webpack:///./src/helpers/array/accumulate.ts","webpack:///./src/components/groupedLayout.ts","webpack:///./src/components/editPeer.ts","webpack:///./src/components/radioForm.ts","webpack:///./src/components/row.ts","webpack:///./src/helpers/clipboard.ts","webpack:///./src/components/radioField.ts","webpack:///./src/components/toast.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/components/usernameInputField.ts","webpack:///./src/components/popups/peer.ts","webpack:///./src/components/sidebarRight/tabs/chatType.ts","webpack:///./src/helpers/scrollableLoader.ts","webpack:///./src/components/appSelectPeers.ts","webpack:///./src/components/popups/pickUser.ts","webpack:///./src/components/sidebarRight/tabs/userPermissions.ts","webpack:///./src/components/sidebarRight/tabs/groupPermissions.ts","webpack:///./src/components/popups/deleteDialog.ts","webpack:///./src/components/sidebarRight/tabs/chatReactions.ts","webpack:///./src/components/sidebarRight/tabs/editChat.ts","webpack:///./src/components/sidebarRight/tabs/editContact.ts","webpack:///./src/components/sidebarLeft/tabs/addMembers.ts","webpack:///./src/environment/parallaxSupport.ts","webpack:///./src/components/generateVerifiedIcon.ts","webpack:///./src/components/swipeHandler.ts","webpack:///./src/components/peerProfileAvatars.ts","webpack:///./src/components/peerProfile.ts","webpack:///./src/components/sidebarRight/tabs/sharedMedia.ts","webpack:///./src/components/sidebarRight/index.ts","webpack:///./src/components/sidebarRight/tabs/pollResults.ts","webpack:///./src/components/poll.ts","webpack:///./src/components/wrappers.ts","webpack:///./src/helpers/dom/positionElementByIndex.ts","webpack:///./src/helpers/sortedList.ts","webpack:///./src/components/sortedUserList.ts","webpack:///./src/helpers/dom/handleHorizontalSwipe.ts","webpack:///./src/helpers/dom/handleTabSwipe.ts","webpack:///./src/components/popups/forward.ts","webpack:///./src/components/popups/deleteMessages.ts","webpack:///./src/components/popups/sendNow.ts","webpack:///./src/helpers/dom/cancelSelection.ts","webpack:///./src/components/chat/selection.ts","webpack:///./src/helpers/dom/getSelectedText.ts","webpack:///./src/components/appSearchSuper..ts","webpack:///./src/helpers/dom/lockTouchScroll.ts","webpack:///./src/lib/appManagers/appPrivacyManager.ts","webpack:///./src/components/privacySection.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack:///./src/helpers/dom/anchorCopy.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack:///./src/helpers/dom/canFocus.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/email.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/index.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack:///./src/components/sidebarLeft/tabs/activeSessions.ts","webpack:///./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack:///./src/helpers/string/convertKeyToInputKey.ts","webpack:///./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack:///./src/helpers/averageColor.ts","webpack:///./src/helpers/color.ts","webpack:///./src/helpers/highlightningColor.ts","webpack:///./src/components/chat/gradientRenderer.ts","webpack:///./src/components/colorPicker.ts","webpack:///./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack:///./src/components/sidebarLeft/tabs/background.ts","webpack:///./src/components/popups/stickers.ts","webpack:///./src/helpers/eachMinute.ts","webpack:///./src/helpers/eachTimeout.ts","webpack:///./src/environment/geolocationSupport.ts","webpack:///./src/components/sidebarLeft/tabs/quickReaction.ts","webpack:///./src/components/sidebarLeft/tabs/generalSettings.ts","webpack:///./src/components/sidebarLeft/tabs/editProfile.ts","webpack:///./src/components/sidebarLeft/tabs/includedChats.ts","webpack:///./src/components/sidebarLeft/tabs/editFolder.ts","webpack:///./src/components/sidebarLeft/tabs/chatFolders.ts","webpack:///./src/components/sidebarLeft/tabs/notifications.ts","webpack:///./src/components/sidebarLeft/tabs/language.ts","webpack:///./src/components/confirmationPopup.ts","webpack:///./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack:///./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack:///./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack:///./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack:///./src/components/sidebarLeft/tabs/settings.ts","webpack:///./src/components/sidebarLeft/tabs/newChannel.ts","webpack:///./src/components/popups/createContact.ts","webpack:///./src/components/sidebarLeft/tabs/contacts.ts","webpack:///./src/components/sidebarLeft/tabs/archivedTab.ts","webpack:///./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack:///./src/helpers/number/formatNumber.ts","webpack:///./src/components/sidebarLeft/index.ts","webpack:///./src/components/chat/bubbleGroups.ts","webpack:///./src/components/popups/datePicker.ts","webpack:///./src/components/stickyIntersector.ts","webpack:///./src/components/stackedAvatars.ts","webpack:///./src/components/chat/reaction.ts","webpack:///./src/components/chat/reactions.ts","webpack:///./src/components/chat/replies.ts","webpack:///./src/components/chat/messageRender.ts","webpack:///./src/helpers/dom/getElementByPoint.ts","webpack:///./src/helpers/dom/reflowScrollableElement.ts","webpack:///./src/lib/appManagers/appEmojiManager.ts","webpack:///./src/components/emoticonsDropdown/tabs/emoji.ts","webpack:///./src/components/gifsMasonry.ts","webpack:///./src/components/emoticonsDropdown/tabs/gifs.ts","webpack:///./src/components/emoticonsDropdown/tabs/stickers.ts","webpack:///./src/lib/appManagers/appInlineBotsManager.ts","webpack:///./src/components/sidebarRight/tabs/gifs.ts","webpack:///./src/components/sidebarRight/tabs/stickers.ts","webpack:///./src/helpers/dropdownHover.ts","webpack:///./src/components/emoticonsDropdown/index.ts","webpack:///./src/environment/webrtcSupport.ts","webpack:///./src/environment/callSupport.ts","webpack:///./src/helpers/dom/getVisibleRect.ts","webpack:///./src/lib/appManagers/internalLink.ts","webpack:///./src/components/popups/joinChatInvite.ts","webpack:///./src/helpers/scrollSaver.ts","webpack:///./src/components/chat/bubbles.ts","webpack:///./src/lib/mtproto/constants.ts","webpack:///./src/components/popups/unpinMessage.ts","webpack:///./src/helpers/dom/isSelectionEmpty.ts","webpack:///./src/components/popups/reportMessagesConfirm.ts","webpack:///./src/components/popups/reportMessages.ts","webpack:///./src/components/popups/sponsored.ts","webpack:///./src/components/popups/reactedList.ts","webpack:///./src/components/chat/reactionsMenu.ts","webpack:///./src/components/chat/contextMenu.ts","webpack:///./src/components/chat/sendContextMenu.ts","webpack:///./src/components/popups/createPoll.ts","webpack:///./src/helpers/getGifDuration.ts","webpack:///./src/components/popups/newMedia.ts","webpack:///./src/helpers/dom/attachListNavigation.ts","webpack:///./src/components/chat/autocompleteHelper.ts","webpack:///./src/components/chat/stickersHelper.ts","webpack:///./src/components/popups/schedule.ts","webpack:///./src/helpers/dom/getRichValueWithCaret.ts","webpack:///./src/components/chat/emojiHelper.ts","webpack:///./src/components/chat/autocompletePeerHelper.ts","webpack:///./src/components/chat/commandsHelper.ts","webpack:///./src/components/chat/autocompleteHelperController.ts","webpack:///./src/components/chat/mentionsHelper.ts","webpack:///./src/components/chat/replyKeyboard.ts","webpack:///./src/components/chat/inlineHelper.ts","webpack:///./src/components/chat/botCommands.ts","webpack:///./src/components/chat/input.ts","webpack:///./src/helpers/dom/setCaretAt.ts","webpack:///./src/components/chat/pinnedContainer.ts","webpack:///./src/components/chat/audio.ts","webpack:///./src/components/chat/pinnedMessageBorder.ts","webpack:///./src/components/chat/pinnedMessage.ts","webpack:///./src/helpers/dom/handleScrollSideEvent.ts","webpack:///./src/environment/groupCallSupport.ts","webpack:///./src/components/popups/mute.ts","webpack:///./src/components/chat/topbar.ts","webpack:///./src/components/sidebarRight/tabs/search.ts","webpack:///./src/components/chat/search.ts","webpack:///./src/components/chat/patternRenderer.ts","webpack:///./src/components/chat/chat.ts","webpack:///./src/helpers/autoDownload.ts","webpack:///./src/components/chat/markupTooltip.ts","webpack:///./src/helpers/dom/getSelectedNodes.ts","webpack:///./src/helpers/generatePathData.ts","webpack:///./src/components/chat/dragAndDrop.ts","webpack:///./src/helpers/dom/disableTransition.ts","webpack:///./src/components/lineBlobDrawable.ts","webpack:///./src/components/topbarWeave.ts","webpack:///./src/helpers/dom/customProperties.ts","webpack:///./src/lib/rlottie/rlottieIcon.ts","webpack:///./src/components/superIcon.ts","webpack:///./src/components/groupCall/microphoneIcon.ts","webpack:///./src/components/groupCall/participantMutedIcon.ts","webpack:///./src/components/groupCall/index.ts","webpack:///./src/components/groupCall/participantStatus.ts","webpack:///./src/components/groupCall/participantsList.ts","webpack:///./src/components/call/videoCanvasBlur.ts","webpack:///./src/components/groupCall/participantVideo.ts","webpack:///./src/components/groupCall/participantVideos.ts","webpack:///./src/components/groupCall/participants.ts","webpack:///./src/components/groupCall/description.ts","webpack:///./src/components/groupCall/title.ts","webpack:///./src/environment/screenSharingSupport.ts","webpack:///./src/components/call/button.ts","webpack:///./src/components/movableElement.ts","webpack:///./src/helpers/movablePanel.ts","webpack:///./src/helpers/toggleClassName.ts","webpack:///./src/lib/calls/callState.ts","webpack:///./src/components/call/description.ts","webpack:///./src/components/groupCall/microphoneIconMini.ts","webpack:///./src/components/call/index.ts","webpack:///./src/lib/calls/helpers/parseSignalingData.ts","webpack:///./src/lib/calls/callConnectionInstance.ts","webpack:///./src/lib/crypto/subtle.ts","webpack:///./src/lib/crypto/utils/sha256.ts","webpack:///./src/helpers/bytes/convertToUint8Array.ts","webpack:///./src/lib/calls/p2P/p2PEncryptor.ts","webpack:///./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack:///./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack:///./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack:///./src/lib/calls/p2P/p2PSdpBuilder.js","webpack:///./src/lib/calls/callInstance.ts","webpack:///./src/lib/calls/p2P/getCallProtocol.ts","webpack:///./src/lib/calls/p2P/getRtcConfiguration.ts","webpack:///./src/components/topbarCall.ts","webpack:///./src/lib/appManagers/appCallsManager.ts","webpack:///./src/lib/appManagers/appImManager.ts","webpack:///./src/components/appMediaViewerBase.ts","webpack:///./src/helpers/fillPropertyValue.ts","webpack:///./src/components/appMediaViewer.ts","webpack:///./src/helpers/avatarListLoader.ts","webpack:///./src/components/appMediaViewerAvatar.ts","webpack:///./src/components/avatar.ts","webpack:///./src/components/dialogsContextMenu.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/components/sendingStatus.ts","webpack:///./src/components/connectionStatus.ts","webpack:///./src/helpers/roundRect.ts","webpack:///./src/components/groupCallActiveIcon.ts","webpack:///./src/helpers/easing/easeInOutSine.ts","webpack:///./src/lib/appManagers/appDialogsManager.ts","webpack:///./public/recorder.min.js","webpack:///./src/lib/mtproto/passwordManager.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","bytesCmp","bytes1","bytes2","len","length","i","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","TrackingMonkey","inputField","max","playAnimation","value","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","CodeInputField","lastLength","setLabel","replace","slice","setValueSilently","onFill","bufferConcats","args","reduce","acc","v","byteLength","tmp","Uint8Array","forEach","b","set","ArrayBuffer","concat","Set","setInnerHTML","elem","html","innerHTML","filterChatPhotosMessages","forEachReverse","history","message","idx","arr","action","photo","splice","undefined","count","previous","next","reverse","loadCount","loadWhenLeft","loadedAllUp","loadedAllDown","safeAssign","loadedAll","current","loadPromiseUp","loadPromiseDown","dispatchJump","items","item","pop","push","shift","unshift","load","onJump","older","resolve","anchor","promise","loadMore","result","bind","processed","processItem","onLoadedMore","backLimit","maxId","mid","incrementMessageId","getSearch","searchContext","peerId","limit","inputFilter","_","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","has","filter","onEmptied","onHistoryMultiappend","obj","folderId","mids","sorted","Array","from","sort","a","targets","map","Boolean","onMessageSent","rootScope","storage","isScheduled","getScheduledMessagesStorage","getMessagesStorage","filterMessagesByInputFilter","context","useSearch","reset","removeEventListener","clearable","className","clickable","autonomous","onFound","list","createChatList","nameEl","setListClickListener","childElementCount","setActive","clear","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","window","setTimeout","focus","res","searchGroup","fromId","addDialogAndSetLastMessage","drawStatus","avatarSize","meAsSaved","err","console","error","replaceContent","catch","placeholder","prevValue","timeout","onInput","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","icon","slider","destroyable","_constructor","header","closeBtn","noRipple","title","content","addTab","listenerSetter","closeTab","init","selectTab","tabs","delete","removeAll","key","eventListener","dispatchEvent","cleanup","onCloseAfterTimeout","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","findItemByType","navigationType","back","id","animate","isNavigation","closingId","onCloseTab","tab","_selectTab","Map","tabsContainer","sidebarEl","querySelector","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","pushItem","onPop","canAnimate","indexOfAndSplice","tabConstructor","preserveTab","removeTabFromHistory","find","t","getTab","removeByType","onClose","open","getContext","clearRect","uploadAvatar","isGeoChat","setTitle","avatarEdit","_upload","section","inputWrapper","groupNameInputField","label","maxLength","groupLocationInputField","canBeEdited","valueCheck","contains","userLocationCoords","userLocationAddress","nextBtn","createChannel","about","geo_point","address","megagroup","chatId","inputFile","editPhoto","peerIds","inviteToChannel","disabled","createChat","toUserId","chatsSection","nameArgs","new","format","startLocating","userId","dom","addDialogNew","dialog","rippleEnabled","lastMessageSpan","getUserStatusString","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","SHOULD_USE_SAFARI_FIX","userAgent","match","appMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","_volume","_muted","_playbackRate","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","seekOffset","seekForward","duration","seekTo","seekTime","onMediaDocumentLoad","doc","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","appDownloadManager","getCacheContext","src","url","playbackRate","onPlay","target","getMessageByMedia","verify","element","listLoader","jumpLength","findIndex","go","setTargets","setMedia","getPlayingDetails","onPause","onEnded","isTrusted","paused","clean","s","playingMediaType","playItem","getMedia","resolveWaitingForLoadMedia","lockedSwitchers","cssText","body","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","volume","muted","autoload","pFlags","is_scheduled","getMediaFromMessage","media_unread","myId","readMessages","once","deferred","w","waitingStorage","downloadDoc","safariBuffering","artwork","isVoice","artist","thumbs","bytes","sizes","h","preloadPhoto","setNewMediadata","peerPhoto","getPeerPhoto","loadAvatar","cached","getPeerTitle","attribute","attributes","file_name","performer","metadata","MediaMetadata","getScheduledMessageByPeer","getMessageByPeer","willBePlayedMedia","deepEqual","copy","prev","addMedia","setSearchContext","mediaType","getPlaybackMediaTypeFromMessage","wasPlaying","willBePlayed","toggleSwitchers","enabled","attachGrabListeners","onStart","onMove","onEnd","onMouseMove","event","x","pageX","y","pageY","onMouseUp","onMouseDown","button","onTouchMove","preventDefault","touches","clientX","clientY","isTouch","onTouchEnd","onTouchStart","passive","mousedown","events","withTransition","useTransform","vertical","scrub","rect","getBoundingClientRect","seek","setFilled","onScrub","filled","step","setProgress","stepStr","index","indexOf","decimals","_removeListeners","percents","clamp","transform","rectMax","offsetAxisValue","bottom","left","toFixed","ButtonMenuItem","text","onClick","checkboxField","noCheckboxClickListener","ripple","textElement","textArgs","regularText","keepOpen","cancelEvent","checked","buttons","ButtonMenuToggleHandler","openedMenu","asDiv","btnMenu","hideControls","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","canHideControls","showControls","toggleControls","show","ignoreClickClassName","findUpClassName","relatedTarget","showOnLeaveToClassName","visible","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","removeListeners","filledLoad","setSeekMax","setListeners","setHandlers","scrubTime","isSafariBuffering","buf","buffered","numRanges","nearestStart","end","start","onMuteClick","setVolume","iconIndex","ICONS","btn","onPlaybackRackMenuToggle","wrapper","setup","playbackRateButton","parentNode","appendChild","skin","stylePlayer","setBtnMenuToggle","controls","progress","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","fullScreenButton","timeElapsed","String","toHHMMSS","volumeSelector","leftControls","togglePlay","overlaysActive","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","onFullScreen","setPlaybackRateIcon","rate","PLAYBACK_RATES_ICONS","player","webkitEnterFullscreen","enterFullscreen","isFull","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","formatBytes","dm","floor","log","parseFloat","pow","wrapVoiceMessage","audioEl","out","waveform","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","mediaSizes","isMobile","minW","maxW","createElementNS","setAttributeNS","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","totalLength","attr","findMediaTargets","isBubbles","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","dataset","toPeerId","HTMLElement","withTime","voiceAsMusic","showSender","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","firstElementChild","downloadDiv","onTypeLoad","descriptionEl","parts","audioPerformer","htmlToSpan","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","audioTitle","fileName","wrapSentTime","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","hadSearchContext","imgs","wrapped","wrapPhoto","boxWidth","boxHeight","loadPromises","withoutPreloader","lazyLoadQueue","images","thumb","full","img","attach","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","reject","playListener","download","setDownloadFunction","capture","isConnected","customElements","define","DivAndCaption","fill","border","subtitle","wrapReplyDivAndCaption","subtitleEl","mediaEl","limitSymbols","wrapEmojiText","isRound","mediaChildren","children","middleware","textContent","wrapMessageForReply","webpage","chat","bubbles","getMiddleware","wrapSticker","div","group","CHAT_ANIMATION_GROUP","choosePhotoSize","noBlur","child","isMediaSet","accumulate","initialValue","RectPart","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","ratio","cropRatios","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","doNotEditAvatar","unlockOnSuccess","RadioForm","radios","form","freezed","radioField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","titleRightSecondary","titleRightEl","navigationTab","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","top","position","select","execCommand","removeChild","fallbackCopyTextToClipboard","alignRight","stateKey","appStateManager","getState","state","getDeepProperty","setByKey","main","langKey","Event","toastEl","toast","toastNew","langPackKey","debounce","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","checkUsernameDebounced","checkUsername","getValue","originalValue","setState","Neutral","isUsernameValid","setError","invalidText","head","username","checkUsernamePromise","invokeApi","channel","getChannelInput","toChatId","available","Valid","availableText","takenText","isValidToChange","overlayClosable","avatarEl","noTitle","titleLangArgs","fragment","createDocumentFragment","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","callback","original","nextElementSibling","isBroadcast","random","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","getChatInviteLink","caption","noDelimiter","changed","linkInputField","applyBtn","migrateChat","channelId","updateUsername","close","setOriginalValue","toggleDisability","toggleNoForwards","onChatUpdate","noforwards","loading","loaded","getPromise","checkForTriggers","chatsContainer","selected","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","includes","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","splitUp","notRendered","filterPeerTypeBy","isPeerId","getPeer","deleted","method","innerContainer","topContainer","selectedContainer","selectedScrollable","li","click","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","testSelfSearch","dialogs","archived","pageCount","windowSize","tempId","getTempId","getConversations","newOffsetIndex","findAndSplice","d","chatRightsAction","filterByRights","renderSaved","isEnd","getMoreDialogs","contacts","getMoreContacts","isUser","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","results","filterUnique","channelParticipants","getChannelParticipants","q","participants","participant","getParticipantPeerId","promises","getMoreChannelParticipants","isNonContactUser","containerEl","isAnyChat","getChatMembersString","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","settings","animationsEnabled","values","forceDirection","Static","closable","getSelected","onSelect","hide","peerTypes","destroyListener","rights","takeOut","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","combineParticipantBannedRights","restrictionText","info","mainFlag","restriction","until_date","flag","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","setSubtitle","bannedRights","cantWhat","getPeerId","peer","listEl","update","needAdd","new_participant","view_messages","user_id","prev_participant","exceptionsCount","setLength","loader","setLoader","isChannel","migrateFrom","migrateTo","onScroll","getDialogType","peerTitleElement","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","deleteChannel","isDanger","availableReactions","getActiveAvailableReactions","getChatFull","originalReactions","available_reactions","enabledReactions","toggleSection","toggleCheckboxField","toggleRow","reactionsSection","checkboxFields","availableReaction","reaction","saveReactionsDebounced","wrapStickerToRow","static_icon","every","saveReactions","newReactions","getCachedFullChat","setChatAvailableReactions","chatUpdateListeners","addChatUpdateListener","canChangeType","canChangePermissions","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","reactionsRow","setReactionsLength","availableReactionsLength","getAvailableReactions","inactive","reactions","permissionsRow","setPermissionsLength","editTitle","editAbout","race","removeAttribute","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","_init","isNew","isContact","nameInputField","lastNameInputField","user","getUser","setDraftValue","first_name","last_name","notificationsCheckboxField","togglePeerMute","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","phone","formatUserPhone","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","addInitial","generateVerifiedIcon","use","use2","getEvent","attachGlobalListenerTo","RESET_GLOBAL","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","setProperty","onFirstSwipe","onSwipeResult","onSwipe","photoId","avatar","BASE_CLASS","getPhoto","Image","draggable","loadCallback","putAvatar","avatars","intersectionObserver","observe","loadCallbacks","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","freeze","clickX","prevTargets","nextTargets","openAvatarViewer","toRight","right","distance","offsetLeft","cancelNextClick","lastDiffX","minX","swipeHandler","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","ceil","IntersectionObserver","entries","entry","isIntersecting","loadNearestToTarget","getUserPhotos","photos","Number","MAX_SAFE_INTEGER","m","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","unobserve","setText","isDialog","setPeerStatus","needClear","bio","tagName","getProfileByPeerId","notifications","setMoreDetails","fillUsername","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","setMoreDetailsTimeout","canBeDetailed","oldAvatars","setPeer","getPeerUsername","fillNotifications","verified","cleaned","cleanupHTML","fillRows","override","isRestricted","callbackify","peerFull","wrapRichText","exportedInvite","historiesStorage","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","deleteDeletedMessages","mediaTabs","onChangeTab","mediaTab","btnAddMembers","showConfirmation","onError","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","loadMutex","peerChanged","setQuery","historyStorage","fillProfileElements","single","justLoad","getElementById","isColumnProportionSet","to","medium","mobile","toggleSidebar","setColumnProportion","sharedMediaTab","proportion","scrollWidth","previousElementSibling","documentElement","enable","active","willChange","animationPromise","appSidebarRight","resultsDiv","poll","getPoll","quiz","rQuestion","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","showMore","lastElementChild","next_offset","down","lineTotalLength","minIndex","minRemainder","k","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","prevQuizHint","hideQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","setMaxLength","resizePolls","onHide","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","getTotalLength","pollId","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","strokeWidth","radius","circumference","PI","period","closeTime","serverTimeOffset","quizInterval","time","Date","now","timeLeft","color","stroke","strokeDashoffset","strokeDasharray","clearInterval","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","isTabExists","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","solution","solution_entities","toggleHint","textEl","entities","bubblesContainer","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","initQuizHint","timeEl","setResults","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","cb","getPercentValue","iterate","fullTime","votersCount","multiplier","roundVideoCircumference","wrapVideo","withTail","isOut","noInfo","onlyPreview","noPlayButton","autoDownloadSize","noAutoDownload","isAlbumItem","canAutoplay","autoPlay","gifs","videos","spanTime","spanPlay","needPlayButton","mime_type","photoRes","divRound","halfSize","ctx","globalVideo","setPeerPromise","isInDOM","onPaused","onFrame","drawImage","detached","foreignObject","getAttributeNS","gotThumb","getThumb","poster","aspecter","isUpload","downloaded","attachMethod","renderDeferred","detach","isFulfilled","animationIntersector","addAnimation","loadPhotoThumbFunc","loadFunc","setManual","queueId","renderImageFromUrl","render","wrapDocument","audioElement","extSplitted","split","ext","isArray","toLowerCase","docDiv","icoDiv","descriptionParts","nameDiv","_downloadDiv","save","canOpenAfter","downloading","saveDocFile","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","canAttachPreloader","renderPromise","sequentialDom","mutateElement","mutate","wrapStickerAnimation","side","skipRatio","animationDiv","stickerPromise","withThumb","assumeType","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","stableOffsetX","setPosition","emojiAnimationContainer","onlyThumb","emoji","needUpscale","static","asStatic","stickerType","sticker","loadLottieWorkers","toneIndex","isAnimated","isThumbNeededForType","haveThumbCached","stickerCachedThumbs","afterRender","getPathFromPhotoPathSize","stickerThumbConverted","getPreviewURLFromThumb","webpWorkerController","convert","getThumbURL","blob","loadAnimationWorker","animationData","saveLottiePreview","data","sendInteractionThrottled","preloadAnimatedEmojiStickerAnimation","getAnimation","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","bubble","throttle","firstTime","setTyping","msg_id","getServerMessageId","emoticon","interaction","JSON","stringify","isSavingLottiePreview","devicePixelRatio","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","animated","lottieLoader","URL","createObjectURL","getStickerSet","stickerSet","documents","previousMedia","createMedia","_size","wrapReply","replyContainer","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","groupId","attachmentDiv","getMidsByAlbum","getMessage","album","positionElementByIndex","pos","prevPos","whichChild","updateElementWith","updateListWith","onSort","canUpdate","_updateList","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","insertInDescendSortedArray","getUserStatusForSort","onListLengthChange","status","willChangeLength","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","peerIdMids","overrideOnSelect","setInnerPeer","initMessagesForward","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","canRevoke","sendScheduledMessages","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","selectedMids","doNotAnimate","onCancelSelection","toggleSelection","listenElement","selectedText","toString","createRange","verifyTouchLongPress","getElementFromTarget","getElementsBetween","last","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","toggleByMid","canceledSelection","verifyMouseMoveTarget","removeManual","documentListenerOptions","hasCheckbox","getCheckboxInputFromElement","isElementShouldBeSelected","appendCheckbox","forceSelection","cantForward","cantDelete","cantSend","appMessagesManager","getMessageFromStorage","canForward","canDeleteMessage","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","updateContainer","toggleElementCheckbox","unselect","config","forwarded_count_max","toggleMid","updateElementSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","keys","fromPeerId","isPrivate","transitionElement","opacity","recording","canSelectBubble","isGroupedBubbleSelected","getMidsByMid","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","isGrouped","groupedCheckboxInput","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","onContextMenu","cancelBubble","withSelection","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","span","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","horizontalMenu","tabContent","skipScroll","newMediaTab","fromMediaTab","offsetTop","scrollHeight","rect2","onMediaClick","targetClassName","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","lock","unlockAndRefresh","setLastMessage","elemsToAppend","entity","totalEntities","display_url","sliced","matchUrl","same","hostname","hash","rDescription","previewDiv","getAbbreviation","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","wrapPlainText","sharedMediaDiv","processCallback","processEmptyFilter","processPhotoVideoFilter","processDocumentFilter","processUrlFilter","monthContainer","getMonthContainerByTimestamp","afterPerforming","inputMessagesFilterEmpty","showMembersCount","participants_count","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","formatPhoneNumber","formatted","arg","globalContacts","intlElement","IntlElement","isShort","minDate","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","onlyFirstName","renderParticipants","membersList","LOAD_COUNT","loadMembers","loadChats","logStr","used","slicedLength","ids","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","toLoad","loadType","timestamp","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","IntlDateElement","haveTimestamps","getObjectKeysAndSort","goFirst","revokeObjectURL","newInputFilter","maxDate","PrivacyType","appPrivacyManager","privacy","addMultipleEventsListeners","updatePrivacy","rules","inputKey","privacyRules","saveApiUsers","users","saveApiChats","chats","apiUpdatesManager","processLocalUpdate","convertInputKeyToKey","inputRule","rule","assign","privacyKey","types","allowPeers","disallowPeers","onRadioChange","captions","captionElement","radioSection","exceptions","Everybody","Nobody","radioRows","Contacts","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","getPrivacy","getPrivacyRulesDetails","setRadio","chatKey","usersKey","splitted","getUserInput","setPrivacy","captionEl","mePath","anchorCopy","phoneSection","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","canFocus","isFirstInput","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","resendPasswordEmail","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","onSkipClick","saveHint","monkey","verifyInput","has_password","labelText","getStateInterval","_state","check","auth","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","Session","app_name","app_version","ip","country","date_active","date_created","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","otherSection","onTerminateClick","menuElement","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","clearAllDrafts","auths","averageColorFromCanvas","pixel","pixels","getImageData","pixelsLength","outPixel","Uint8ClampedArray","rgbaToHsla","g","l","hslaToRgba","hue2rgb","hexaToRgba","hexa","parseInt","hexToRgb","hex","rgbaToHexa","rgba","hslaStringToHexa","hsla","alpha","val","endsWith","hslaStringToRgba","highlightningColor","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","onWheel","_animatingToNextPosition","_scrollDelta","deltaY","_onWheelRAF","drawOnWheel","changeTail","curPos","curPosition","_phase","_tail","drawGradient","drawNextPositionAnimated","frames","_frames","drawImageData","leftLength","_incrementalCurve","positions","phase","curveMax","curve","getPositions","distances","nextPos","tail","getNextPositions","_hctx","createImageData","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","getGradientImageData","colors","getAttribute","_canvas","fillStyle","fillRect","tails","nextPhaseOnIdx","inc","curves","_addedScrollListener","scrollAnimate","createCanvas","gradientRenderer","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","hexaToHsla","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","rgbaArray","hsl","getCurrentColor","maxX","maxY","posX","posY","lightnessX","lightnessY","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","pushToState","applyCurrentTheme","onColorChange","applyColor","getTheme","gridSection","grid","backgroundColor","isColored","uploadTempId","clicked","wallpapersByElement","elementsByKey","onUploadClick","file","access_hash","dc_id","file_reference","saveDoc","wallpaper","upload","addNotifyListener","_wallpaper","newDoc","newCacheContext","setBackgroundDocument","getWallpaperKey","addWallPaper","onResetClick","defaultTheme","themes","blurCheckboxField","blur","onGridClick","saveToCache","cacheStorage","_tempId","onReady","getPixelPromise","imageUrl","naturalWidth","naturalHeight","averageColor","create","getColorsFromWallpaper","getWallpaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","invokeApiHashable","accountWallpapers","wallpapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","stickerSetInput","onStickersClick","fileId","sendMessageWithDocument","h6","setOnlyOnePlayableGroup","stickersDiv","stickersFooter","loadStickerSet","installed_date","toggleStickerSet","esgSticker","eachMinute","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","getQuickReaction","quickReaction","setDefaultReaction","minValue","writeValue","valueDiv","valueContainer","range","messagesTextSize","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","str","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","renderQuickReaction","loopCheckboxField","stickerSets","stickersContent","renderStickerSet","getAllStickers","allStickers","sets","firstNameInputField","bioInputField","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","getSelf","userFull","getProfile","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","hasOwnProperty","originalFilter","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","loadAnimationPromise","wrapDraftText","ul","renderMore","_length","onEditOpen","exclude_peers","onCreateOpen","filtersRendered","dialogFilter","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","onFiltersContainerUpdate","renderFolder","getSuggestedFilters","order","suggestedFilters","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","invokeApiCacheable","lang_pack","languages","language","lang_code","native_name","getLangPack","getCacheLangPack","langPack","confirmationPopup","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","debouncedSave","sizeMax","autoDownloadNew","file_size_max","MAX","upTo","compareAndUpdate","AUTO_DOWNLOAD_FOR_KEYS","private","autoCheckboxField","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","openTab","onDisabledChange","gifsCheckboxField","videosCheckboxField","peerKeys","enabledKeys","isAll","logOut","edit","changeAvatarBtn","updateChangeAvatarBtn","buttonsDiv","devicesRow","languageRow","buttonsSection","overwrite","getAuthorizationsPromise","getAuthorizations","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","withConfirm","btnConfirm","importContact","telInputField","lockWithPromise","validate","country_code","inputSearch","openContacts","sortedUserList","createList","renderPage","sortedLists","chatList","generateScrollable","scrollables","wasFilterId","setFilterId","onTabChange","isLocationWatched","errorCategory","retryBtn","locatedPeers","dialogSize","parseDistance","peopleSection","sortedList","btnMakeVisible","makeButton","btnMakeInvisible","btnCreateGroup","startWatching","stopWatching","distanceUnit","latestLocationSaved","accuracy","getLocated","updates","orderedPeers","groupsCounter","usersCounter","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","lat1","long1","lat2","long2","asin","formatNumber","fakeGradientDelimiter","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","filteredButtons","openUsername","userName","sessionStorage","kz_version","isMainDomain","toolsBtn","btnMenuFooter","rel","stopPropagation","suffix","versionFull","newBtnMenu","updateBtn","reload","initSearch","archivedCount","unreadDialogsCount","requestPeer","checkUpdateInterval","cache","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","peopleContainer","hideNewBtnMenuTimeout","onFocus","clearRecentSearchBtn","releaseSinglePeer","detailsMap","newGroupDiff","updateGroup","viaBotId","fwdFromId","removeBubble","insertObject","foundBubble","foundAtIndex","foundMidOnSameTimestamp","_timestamp","_mid","bubbleGroup","insertIndex","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","setMonth","getMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","setFullYear","getDate","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","getMinutes","getHours","popupCenterer","timeOptions","sendDate","dateOptions","day","weekday","firstDate","weekStartDate","getDay","renderElement","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","handler","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","sentinel","headerSentinel","addSentinel","disconnect","avatarContainer","AVATAR_CLASS_NAME","CLASS_NAME","_reactionCount","reactionCount","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","center_icon","wrapPromise","wrapStickerPromise","displayOn","recentReactions","stackedAvatars","peer_id","isChosen","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","REACTIONS_ELEMENTS","onConnectCallback","reactionElement","isPlaceholder","disconnectedCallback","connectedCallback","changedResults","hasReactions","availableReactionsResult","isReactionActive","some","totalReactions","can_see_list","reactionElementIdx","recent_reactions","setCanRenderAvatars","renderCounter","renderAvatars","setIsChosen","handleChangedResults","childNodes","timeSpan","fireAroundAnimation","updated","postKey","replies","leftPart","recent_repliers","isUnread","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","setTime","chatType","editedSpan","sponsoredSpan","reactionsElement","reactionsMessage","isSponsored","sponsored","isMessage","views","postAuthor","post_author","fwd_from","postViewsSpan","channelViews","edit_date","edit_hide","pinned","getGroupsFirstMessage","inner","clonedArgs","_reactionsElement","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","reply_to_mid","replyToPeerId","reply_to","reply_to_peer_id","appPeersManager","originalPeerTitle","originalMessage","wrapSingleMessage","needUpdate","replyMid","getElementByPoint","verticalSide","horizontalSide","elementFromPoint","reflowScrollableElement","EMOJI_LANG_PACK","keywords","version","langCode","langPackCode","keywordLangPacks","indexedLangPacks","getKeywordsPromises","storageKey","stateStorage","pack","isObject","validateInitObject","from_version","keywordsDifference","packKeywords","keyword","emoticons","getEmojiKeywords","lastRequestedLangCode","getRecentEmojis","indexObject","emojis","indexEmojis","search","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","fixEmoji","appEmojiManager","loadedURLs","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","getEmojiFromElement","nodeType","nodeValue","closeScrollTop","onContentClick","onEmojiSelected","divs","Emoji","category","titleDiv","itemsDiv","unified","menu","emojiScroll","hasRecent","activeId","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","observeStickyHeaderChanges","scrollPromise","processInvisibleDiv","intersector","isVisible","getAnimations","checkAnimation","processVisibleDiv","gifWidth","gifHeight","willUseWidth","calcImageInBox","gifsContainer","masonry","EMOTICONSSTICKERGROUP","addLazyLoadQueueRepeat","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","recentStickers","queueCategoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","stickers","categoryPush","menuWrapper","menuScroll","getRecentStickers","pushRecentSticker","inlineResults","setHash","geo","accuracy_radius","botId","getGeoInput","stopTime","noErrorBox","botResults","queryId","query_id","savePhoto","generateQId","resultId","topPeers","botPeerId","topPeer","rating","setKeyValueToStorage","startParam","startBot","bot_inline_placeholder","peerData","setDraft","callbackAnswer","noLinks","noLinebreaks","queryAndResultIds","inlineResult","pushPopularBot","queryID","resultID","send_message","reply_markup","replyMarkup","sendText","inputMedia","sendMessage","getMediaInput","geoPoint","provider","venue_id","venue_type","phone_number","vcard","percent","sendOther","appInlineBotsManager","nextOffset","onGifsClick","gifsDiv","checkAnimations","newSearch","gifBotPeerId","resolveUsername","getInlineResults","setsDiv","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","renderSet","covered","searchStickerSets","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","dispatchResultableEvent","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","chatInput","savedRange","getGoodRange","lockIntersectionGroup","unlockIntersectionGroup","unlock","refresh","emojiTab","stickersTab","gifsTab","0","1","2","messageInput","HIDE_EMOJI_TAB","INIT_TAB_ID","getVisible","clearVisible","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","overflow","horizontal","visualViewport","windowWidth","innerWidth","windowHeight","innerHeight","INTERNAL_LINK_TYPE","chatInvite","request_needed","processUpdateMessage","putPhoto","peopleCount","numberThousandSplitter","previousScrollHeight","previousScrollHeightMinusTop","useReflow","newScrollTop","lastScrollPosition","IGNORE_ACTIONS","SERVICE_AS_REGULAR","TEST_SCROLL","appStickersManager","appUsersManager","appPhotosManager","appProfileManager","appDraftsManager","appMessagesIdsManager","appChatsManager","appReactionsManager","unreadOut","skippedMids","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","loadedTopTimes","loadedBottomTimes","messagesQueuePromise","messagesQueue","messagesQueueOnRender","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","chatInner","onDatePick","contactDiv","appImManager","callDiv","callUser","spoiler","showDuration","useRafs","spoilerTimeout","getReactionCount","bubbleMid","reply_to_top_id","lastMsgId","saved_from_msg_id","openThread","filterMessages","getDiscussionMessage","channel_id","via","peerIdStr","savedFrom","messageId","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","getMidsByMessage","isReplyClick","replyToMid","reply_to_msg_id","distanceToEnd","getDistanceToEnd","lastScrollDirection","topbar","pinnedMessage","setCorrectIndex","setStickyDateManually","requestHistory","setMessageId","setScroll","bubbleGroups","changeBubbleMid","setBubblePosition","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","reactionsElements","changeMessage","repliesElement","grouped_id","newPoll","safeRenderMessage","scrollToBubbleIfLast","getGroupedBubble","updatePosition","saveOnUpdateScroll","deleteEmptyDateGroups","getBubbleByMessage","appendReactionsElementToBubble","deletedMids","renderedId","renderMaxId","groupedMessagesStorage","replyAfter","shouldReply","canSend","_target","initMessageReply","highlightBubble","renderNewMessagesByIds","toNextPosition","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","isScrolledDown","setMessagesQueuePromise","performHistoryResult","postViewsElements","different","postViews","unreadedObserver","onUnreadedInViewport","viewsObserver","sendViewCountersDebounced","sponsoredMessage","random_id","apiManager","invokeApiSingle","incrementMessageViews","wasHeight","offsetHeight","resizing","skip","scrolled","part","rAF","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","onUpdateScrollSaver","restore","timestamps","lastVisible","dateMessage","visibleRect","previousStickyDate","needReflow","readUnreaded","readPromise","idle","focusPromise","bubblesMaxId","getHistoryStorage","readContents","isMentionUnread","readHistory","bad","grouped","getHistoryTopPromise","getHistoryBottomPromise","getHistory","setLoaded","onScrolledTop","loadMoreHistory","readMaxId","readOutboxMaxId","msgId","permanent","emptyPlaceholderMid","deleteSelectedMids","replyTo","getLastBubble","setPaddingTo","isPaddingNeeded","clientHeight","paddingTop","scrollToBubbleEnd","lastDateGroup","getLastDateGroup","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","margin","axis","getNormalSize","scrollToBubble","lastElem","lastTime","firstTimestamp","datasetKey","today","bubbleContent","serviceMsg","bubblesToo","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","samePeer","topMessage","pinnedMessages","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","getDialogOnly","unread_count","foundSlice","findSliceOffset","Bottom","isJump","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","getBubbleByPoint","oldChatInner","lockGroup","unlockGroup","fromUp","mountedByLastMsgId","findNextMountedBubbleByMsgId","afterSetPromise","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","onScrolledAllDown","unread_mark","markDialogUnread","canWrite","queue","setUnreadDelimiter","local","getDateContainerByMessage","addBubble","additionalCallback","multipleRender","albumMustBeRenderedFull","our","contentWrapper","wasClassNames","classNames","transitionDelay","originalMid","unread","chat_id","wrapMessageActionTextNew","renderMessagesQueue","is_single","messageMessage","messageMedia","getAlbumText","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","big","forward","containerDiv","rowDiv","buttonEl","same_peer","checkSwitchReturn","switchInlineQuery","column","callbackButtonClick","messageWithReplies","getMessageWithReplies","withReplies","fwdFrom","nameContainer","canHideNameIfMedia","processingWebPage","previewResizer","preview","quote","mediaSize","quoteTextDiv","site_name","strong","textDiv","isSquare","emojiSticker","animatedSticker","staticSticker","newNameContainer","wrapGroupedDocuments","lastContainer","formatCallDuration","reason","contact","texts","wrapPoll","needName","titleVia","isForwardFromChannel","from_id","isHidden","from_name","getPeerColorById","goto","generateTail","documentContainer","documentMessageDiv","renderMessage","isBackLimit","scrollSaver","needReflowScroll","processLocalMessageRender","firstSlice","lastSlice","Top","getScheduledMessages","additionMsgIds","isAdditionRender","animateAsLadder","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","delay","lastMsDelay","topRes","middleRes","bottomRes","delays","listElements","getRestrictionReasonText","getGreetingSticker","renderEmptyPlaceholder","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","addOffset","service","generateLocalMessageId","getOutputPeer","saveMessages","checkPlaceholders","cacheSeconds","sponsoredMessages","generateLocalFirstMessage","bot_info","checkIfEmptyPlaceholderNeeded","getRenderedLength","realLoadCount","Both","resultPromise","isFirstMessageRender","processResult","historyResult","serviceStartMessageId","threadsServiceMessagesIdsStorage","sup","processPromise","waitPromise","times","safeCount","mustBeCount","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","reportMessages","STICKER_EMOJI","preloadStickerPromise","preloadAnimatedEmojiSticker","buttonsEl","marginTop","canViewReadParticipants","canViewMessageReadParticipants","newMessage","btnClose","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","animationGroup","setOverrideIdleGroup","renderReaction","setVisible","scaleContainer","appearWrapper","selectWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","appPollsManager","appDocsManager","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","noForwards","viewerPeerId","canOpenReactedList","initResult","destroy","menuPadding","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","reactionsMenu","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","hasTarget","isGoodType","setButtons","filterButtons","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","MAX_AVATARS","PADDING_PER_AVATAR","visibility","paddingRight","reactionsCount","fakeElem","readParticipants","totalSize","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","weakMap","questionInputField","sendSilent","setPeerId","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","HTMLInputElement","getRichValue","question","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","getMessageSendingParams","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","placeCaretAtEnd","attachFile","willAttach","shouldCompress","params","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","caption_length_max","wasInputValue","messageInputField","attachFiles","groupCheckboxField","mediaCheckboxField","toPush","_file","lastModified","isMedia","sendingParams","sendAlbum","replyToMsgId","startsWith","source","objectURL","videoWidth","videoHeight","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onload","isPhoto","isAudio","finish","onerror","mimeType","foundPhotos","foundVideos","foundFiles","n","firstType","appendGroupCheckboxField","appendMediaCheckboxField","albumContainer","appendMediaToContainer","onRender","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","hidden","onVisible","listType","navigationItem","noBlurOnPop","removeItem","attachNavigation","controller","addHelper","fromController","skipAnimation","hideOtherHelpers","onChangeScreen","getStickersByEmoticon","ready","getMinDate","getMaxDate","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","node","alt","getRichElementValue","caretPos","substr","combineSameEntities","firstChar","getBothEmojiKeywords","searchEmojis","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","ignoreCase","commands","botInfo","botCommand","command","found","getReadyToSend","helpers","toggleListNavigation","preserveHelper","insertAtCaret","topMsgId","trimmed","getMentions","onBodyTouchStart","btnHover","attachButtonListener","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","sendInlineResult","_checkQuery","gifsMasonry","isGallery","gallery","noCommands","separator","dcId","readBlobAsDataURL","dataURL","switch_pm","btnSwitchToPM","switchToPM","checkQuery","appWebPagesManager","serverTimeManager","appNotificationsManager","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","setKeepAlive","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","shiftKey","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","webPage","saveWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","getEmojiEntityFromEmoji","onBtnSendClick","forwarding","releaseMediaPlayback","setSingleMedia","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","onGoDownClick","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","sendAsContainer","sendAsCloseBtn","sendAsButtons","previousAvatar","onSendAsMenuToggle","sendAsAvatar","sendAsBtnMenu","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","setUserId","attachMenuButtons","fileInput","accept","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","updateSendAs","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","decode","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","pinnedControlBtn","originalChat","pinnedMessageContainer","neededFakeContainer","getNeededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","isStartButtonNeeded","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","rMessage","setInputValue","inputFake","updateOffset","hasBotCommands","getUserFullResult","updateBotCommands","sendAsPeerId","updatingSendAsPromise","updateMessageInput","currentPeerId","channelFull","default_send_as","updateSendAsAvatar","updateMessageInputPlaceholder","executeButtonsUpdate","sendAsPeerIds","updateSendAsButtons","send_as","getChannelFull","getDefaultSendAs","updateSendAsResult","getSendAs","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","ctrlKey","metaKey","setStart","collapse","addRange","readAllHistory","commandsMap","bold","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","previousSibling","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","suggest","checkEmoticon","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","unicode","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","hideCaptionCheckboxField","replyFragment","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","usingFullAlbum","albumMids","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","floating","divAndCaption","CLASSNAME_BASE","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","onPlaybackRateChange","fasterEl","toggleEl","onStop","onMediaPlay","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","path","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","animateFirst","currentIndex","clearRow","DURATION","reflow","clearRows","previousIndex","fromTop","ignorePrevious","setNewRow","previousRow","AnimatedCounter","previousNumber","animatedSuper","decimal","previousDecimalNumber","getRow","EMPTY_INDEX","previousByDecimal","decimalNumber","getDecimal","hideLeft","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","locked","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","debug","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","lastY","isDown","handleScrollSideEvent","refreshPosition","setScrollDownListener","handleFollowingPinnedMessage","isLast","setCount","writeTo","writeMediaTo","mutePeer","tsNow","ONE_HOUR","radioForm","appGroupCallsManager","verifyButtons","isMenuOpen","btnMore","menuButtons","getDeleteButtonText","buttonsToVerify","verifyVideoChatButton","currentGroupCall","groupCall","getChatTyped","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","onResize","resize","setUtilsRAF","chatUtils","chatAudio","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","followPinnedMessage","getSearchContext","activeScreen","onBtnBackClick","isFirstChat","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","attachClickEvent","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","wasPeerId","newPinnedMessage","appSearch","beginSearch","btnPickDate","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","canvases","instance","INSTANCES","createCanvasPattern","fillCanvas","createCanvasPatternPromise","crossOrigin","createPatternFrom","createPattern","exportCanvasPatternToImagePromise","toBlob","newUrl","objectUrl","setCanvasDimensions","backgroundEl","Log","Warn","Debug","backgroundTempId","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","patternCanvas","isDarkPattern","getInstance","_gradientRenderer","renderToCanvas","exportCanvasPatternToImage","setBackgroundPromise","contextMenu","constructUtils","constructPeerHelpers","constructPinnedHelpers","constructDiscussionHelpers","constructScheduledHelpers","setReactionsHoverListeners","cleanupBackground","searchTab","setAutoDownloadMedia","setLoadMutex","loadSidebarMedia","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","setPrefix","wasAlreadyUsed","addedListener","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","nodes","getSelectedNodes","currentMarkups","closest","activeButtons","getActiveMarkupButton","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","containerRect","isFirstShow","setMouseUpEvent","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","amplitude","speedScale","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","stateId","createGradient","shader","getGradientFromType","x0","y0","createLinearGradient","MUTED_BY_ADMIN","addColorStop","UNMUTED","MUTED","CONNECTING","dt","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","raf","draw","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","matchMedia","setAmplitude","setCanvasSize","computedStyle","getProperty","getComputedStyle","getPropertyValue","playPart","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","startFrame","endFrame","frameCount","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","getItem","invoke","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","withIcons","icons","iconClassName","element2","actionClassName","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","mutedState","callVideoCanvasBlur","renderFrame","peerTitle","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","displayPinned","shouldDisplay","shouldDisplayElement","isPinned","setPinned","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","setParticipant","_onLengthChange","onOpenProfileClick","popup","getPopups","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getParticipantByPeerId","getContainer","groupCallParticipantsVideo","getGroupCallParticipants","descriptionIntl","mediaDevices","_className","buttonDiv","isConfirm","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","handlers","resizeHandlerClassName","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setCursor","toggleMovable","movable","movableOptions","setPositionToCenter","destroyElements","toggleClassName","raise_hand_rating","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","onFullScreenChange","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","setThemeColor","movablePanel","isBig","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","CLOSED","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CALL_STATE","interval","connectionState","CONNECTED","PENDING","REQUESTING","EXCHANGING_KEYS","connectedAt","INIT_STATE","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","createVideoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","parseSignalingData","sdp","parseMediaSectionInfo","fingerprints","fingerprint","ufrag","pwd","screencast","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","sources","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","connection","call","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","sha256","digest","TextEncoder","encode","convertToUint8Array","p2pKey","seqMap","msgKeyLarge","concatSHA256","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","seq","setUint32","encryptPrepared","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","importKey","msgKeyEquals","encryptedDataSize","decryptionBuffer","constTimeIsDifferent","getUint32","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","addDataChannel","finalize","dir","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","sdpString","sdpMLineIndex","sdpMid","foundation","component","protocol","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","streamManager","canCreateConferenceEntry","lowBattery","videoRotation","Proxy","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","iceConnectionState","findEntry","recvEntry","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startScreenSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","appendToConference","startVideoSharingInternal","isSharingVideoType","audioTrack","getAudioTracks","CLOSING","clearHangUpTimeout","hangUpTimeout","phoneCall","canAccept","isClosing","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","encryptionKey","configuration","iceServers","connections","ipv6","port","password","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","bindPrefix","createPeerConnection","negotiate","sendIceCandidate","onTrack","createDescription","encryptor","decryptor","appendStreamToConference","createDataChannel","processDecryptQueue","dataChannelEntry","createEntry","sendEntry","dataChannel","negotiated","applyDataChannelData","parse","sendDataChannelData","encryptRawPacket","iceCandidate","parsed","p2pParseCandidate","key_fingerprint","computeKey","joinCall","emojisFingerprint","getEmojisFingerprintPromise","invokeCrypto","codePoints","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","unlockStreamManager","stream","onInputStream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","closeConnectionAndStream","hasVideo","discardCall","_codec","setData","transport","performCodec","vp8PayloadType","rtxIdx","apt","filterNotVP8","setDataToDescription","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","createDataChannelEntry","tryToReleaseCandidates","doTheMagic","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","decryptRawPacket","TextDecoder","signalingData","applyCallSignalingData","appAvatarsManager","onState","amplitudes","weave","currentDescription","instanceListenerSetter","isChangingInstance","clearCurrentInstance","callDescription","convertCallStateToGroupState","componentDidMount","componentWillUnmount","groupCallMicrophoneIconMini","throttledMuteClick","getCallInstance","weaveContainer","calls","instances","sortedInstances","updatePhoneCall","saveCall","phone_call","confirmCall","createCallInstance","admin_id","setPhoneCall","setHangUpTimeout","g_a_or_b","updatePhoneCallSignalingData","phone_call_id","onUpdatePhoneCallSignalingData","audioAsset","callId","isDiscarded","oldCall","safeReplaceObject","getCall","currentCall","hasConnected","playSound","stopSound","playSoundIfDifferent","hasCurrent","random_length","dhConfig","isVideo","fullInfo","participant_id","connection_id","FOCUS_EVENT_NAME","columnEl","offline","updateStatusInterval","onHashChange","parseUriParams","tgaddr","replaceState","onclick","wrapUrl","postId","post","setSettings","chatsSelectTabDebounced","setLoop","setTimeFormat","timeFormat","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","canDrag","DragEvent","_types","dataTransfer","addFiles","backgroundPromises","isIDLE","updateStatus","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","resizeBackgroundDebounced","setBackground","lastBackgroundUrl","saveChatPosition","choosing","setChoosingStickerTyping","typings","typing","singleInstance","activateInstance","setToCache","topbarCall","discardCurrentCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","makeLink","VOICE_CHAT","PRIVATE_POST","thread","comment","MESSAGE","domain","attachKeydownListener","activatingChat","screen","IGNORE_KEYS","isOverlayActive","goodMid","nextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","saveApiChat","noPathnameParams","pathname","noUriParams","openComment","generateThreadServiceStartMessage","getCallByUserId","phone_calls_private","startCallInternal","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","getGroupCallFull","saveGroupCall","createGroupCall","broadcastEvent","STATE_INIT","getBackground","getFile","chatBubbles","chatPositions","getFromCache","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","setCurrentBackground","prevTab","prevIdx","attachDragAndDropListeners","handleSelection","drops","mediaDrops","mount","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","appendDrops","drop","setPath","transitionTime","setUserStatus","fromIndex","justReturn","spliced","chatFrom","beforeDestroy","chatIndex","spliceChats","existingIndex","oldChat","setType","dot","eye","getPeerTypings","langPackKeys","multi","mapa","typingElement","getTypingElement","descriptionElement","ignoreSelf","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","topButtons","author","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","ctrlKeyDown","changeZoom","onKeyUp","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","onlyMobile","authorRight","zoom","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","lockControls","zoomSwipeHandler","lastDiffY","addProgress","btnMenuToggle","setMoverToTarget","appMediaViewer","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","toLeft","windowW","newTransform","p1","newMover","oldAvatar","replaceChild","setAuthorInfo","isDocument","useContainerAsTarget","moveTheMover","mainColumns","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","rollback","updateMediaSource","cancellablePromise","attachPromise","haveImage","captionTimeout","isForDocument","onAuthorClick","savePhotoFile","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","onCaptionClick","cantForwardMessage","cantDownloadMessage","setCaption","_openMedia","onAvatarUpdate","removeFromAvatarsCache","getFullPhoto","getTarget","hadMessage","isAvatarCached","believeMe","addedToQueue","oldValue","newPeerId","getPeerMigratedTo","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","ConnectionStatus","SENDING_STATUS","hadConnect","connecting","timedOut","updating","setConnectionStatus","baseDcId","setFirstConnectionTimeout","connectionStatus","online","Connected","forceGetDifference","TimedOut","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","forceReconnect","timerSpan","forceReconnectTimeout","setStateTimeout","statusContainer","constructContainer","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","RADIUS","groupCallActiveIcon","START_X","startTime","wasMounted","itemProgress","startAnimation","indexKey","appDialogsManager","addListDialog","isBatch","folders","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","onChatsRegularScroll","sliceTimeout","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","allChatsIntlElement","addFilter","onStateLoaded","foldersScrollable","filtersNavigationItem","unshiftItem","changeFiltersAllChatsKey","getDialogIndexKey","hasClassName","getDialogDom","setOnlineStatus","processDialogForCallStatus","setFilterUnreadCount","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessages","setDialogActive","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","savePeerSettings","getNotifyPeerTypeSettings","initListeners","renderFiltersPromise","showFiltersPromise","storagesResults","addMissedDialogs","fillConversations","migratedTo","testDialogForFilter","topOffset","getOffsetIndex","bottomOffset","isDialogMustBeInViewport","unreadSpan","getFolder","foundUnmuted","getAll","sortedDialogList","clientWidth","wasShowing","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","callbacks","cccc","offsetDialog","classNameType","subtitleArgs","placeholderContainer","generateEmptyPlaceholder","wrapLocalSticker","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","lastMessage","highlightWord","setUnread","draftMessage","lastTimeSpan","playIcon","withoutMediaType","sender","senderBold","setStatusMessage","disableAnimationIfRippleFound","setSendingStatus","statusSpan","hasUnreadBadge","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","transitionDuration","isMention","originalDialog","getDialog","setCallStatus","call_not_empty","getMessageSenderPeerIdOrName","addDialog","fromName","_dialog","captionDiv","titleSpanContainer","titleP","rightSpan","oldTypingElement","newTypingElement","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","default","prototype","AudioContext","webkitAudioContext","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","getUserMedia","WebAssembly","clearStream","getTracks","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","gain","setTargetAtTime","onstart","destroyWorker","Function","currentHashPromise","newHashPromise","new_settings","newAlgo","new_algo","salt1","randomize","hashes","new_password_hash","inputCheckPassword","setUser"],"mappings":"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","file":"18.29da8a83178db260ea59.chunk.js","sourcesContent":["/*\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// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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 InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\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 InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\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 setInnerHTML(elem: Element, html: string) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\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 { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport forEachReverse from \"./array/forEachReverse\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\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 forEachReverse from \"./array/forEachReverse\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.loadedAllUp = this.loadedAllDown = loadedAll;\n this.loadPromiseUp = this.loadPromiseDown = null;\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n this.previous.push(this.current, ...items);\n } else {\n items = this.previous.splice(this.previous.length + length, -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n this.next.unshift(...items, this.current);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older && this.loadedAllDown) return Promise.resolve();\n else if(!older && this.loadedAllUp) return Promise.resolve();\n\n if(older && this.loadPromiseDown) return this.loadPromiseDown;\n else if(!older && this.loadPromiseUp) return this.loadPromiseUp;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n const promise = this.loadMore(anchor, older, this.loadCount).then(result => {\n if((older && this.loadPromiseDown !== promise) || (!older && this.loadPromiseUp !== promise)) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n if(older) this.loadedAllDown = true;\n else this.loadedAllUp = true;\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n\n if(older) {\n if(this.reverse) this.previous.unshift(processed);\n else this.next.push(processed);\n } else {\n if(this.reverse) this.next.push(processed);\n else this.previous.unshift(processed);\n }\n });\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\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 { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport appMessagesIdsManager from \"../lib/appManagers/appMessagesIdsManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport forEachReverse from \"./array/forEachReverse\";\nimport filterChatPhotosMessages from \"./filterChatPhotosMessages\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n constructor(options: Omit, 'loadMore'> & {onEmptied?: () => void} = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = this.current?.mid;\n\n if(anchor) maxId = anchor.mid;\n if(!older) maxId = appMessagesIdsManager.incrementMessageId(maxId, 1);\n\n return appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then(value => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: (message) => {\n const filtered = this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n }\n\n protected filterMids(mids: number[]) {\n const storage = this.searchContext.isScheduled ? \n appMessagesManager.getScheduledMessagesStorage(this.searchContext.peerId) : \n appMessagesManager.getMessagesStorage(this.searchContext.peerId);\n const filtered = appMessagesManager.filterMessagesByInputFilter(this.searchContext.inputFilter._, mids, storage, mids.length) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = (obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = this.filterMids(sorted);\n const targets = filtered.map(message => this.processItem(message)).filter(Boolean);\n if(targets.length) {\n this.next.push(...targets);\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(!this.searchContext.useSearch) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\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 appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(public name: LangPackKey | boolean, public type: string, private clearable = true, className?: string, clickable = true, public autonomous = true, public onFound?: () => void) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then(res => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n drawStatus: false,\r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch(err => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\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\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\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 Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\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 \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTab;\r\n}\r\n\r\nexport interface SliderSuperTabEventableConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n this.slider.addTab(this);\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\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 { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type']\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach(el => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find(t => t instanceof tabConstructor) as SliderSuperTab;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\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 { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport type { InputFile } from \"../layer\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n attachClickEvent(this.container, () => {\r\n new PopupAvatar().open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\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 Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\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 appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n if(this.isGeoChat){\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n appChatsManager.createChannel({\r\n title, \r\n about: '', \r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords, \r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length){\r\n appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChat(title, this.peerIds.map(peerId => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n }\r\n });\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n this.peerIds.forEach(userId => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: userId,\r\n container: this.list,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(userId));\r\n });\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private startLocating(){\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = \"https://nominatim.openstreetmap.org/reverse\";\r\n uri += \"?lat=\"+location.coords.latitude;\r\n uri += \"&lon=\"+location.coords.longitude;\r\n uri += \"&format=json\";\r\n uri += \"&addressdetails=1\";\r\n uri += \"&accept-language=en\";\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\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 rootScope from \"../lib/rootScope\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { DocumentAttribute, Message, PhotoSize } from \"../layer\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport { onMediaLoad } from \"../helpers/files\";\r\nimport copy from \"../helpers/object/copy\";\r\nimport deepEqual from \"../helpers/object/deepEqual\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\r\n\r\nclass AppMediaPlaybackController {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n private playingMediaType: PlaybackMediaType;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n \r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n private _volume = 1;\r\n private _muted = false;\r\n private _playbackRate = 1;\r\n private lockedSwitchers: boolean;\r\n private playbackRates: Record = {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n };\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.play,\r\n pause: this.pause,\r\n stop: this.stop,\r\n seekbackward: this.seekBackward,\r\n seekforward: this.seekForward,\r\n seekto: this.seekTo,\r\n previoustrack: this.previous,\r\n nexttrack: this.next\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (doc) => {\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const\r\n ];\r\n keys.forEach(key => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia) {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\r\n this.playbackRates[this.playingMediaType] = value as number;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n const {volume, muted, playbackRate} = this;\r\n rootScope.dispatchEvent('media_playback_params', {\r\n volume, muted, playbackRate\r\n });\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(doc.supportsStreaming || cacheContext.url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDocsManager.downloadDoc(doc);\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = (media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n\r\n if(this.playingMedia === media) {\r\n media.playbackRate = this.playbackRate;\r\n }\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appPhotosManager.preloadPhoto(doc, size);\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n const result = appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n if(result.cached) {\r\n const url = await result.loadPromise;\r\n artwork.push({\r\n src: url,\r\n sizes: '160x160',\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n result.loadPromise.then((url) => {\r\n if(this.playingMedia !== playingMedia || !url) {\r\n return;\r\n }\r\n \r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n\r\n title = appPeersManager.getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute && attribute.title || doc.file_name;\r\n artist = attribute && attribute.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach(size => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n const message = details.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\r\n return message;\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n if(!this.listLoader.current || !verify(this.listLoader.current)) {\r\n let idx = this.listLoader.previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(this.listLoader.previous.length - idx);\r\n } else {\r\n idx = this.listLoader.next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.listLoader.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n\r\n this.setMedia(media, message);\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n if(this.playingMedia !== media) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('media_play', this.getPlayingDetails());\r\n }, 0);\r\n };\r\n\r\n public getPlayingDetails() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) {\r\n return;\r\n }\r\n\r\n const message = this.getMessageByMedia(playingMedia);\r\n return {\r\n doc: appMessagesManager.getMediaFromMessage(message),\r\n message,\r\n media: playingMedia\r\n };\r\n }\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n rootScope.dispatchEvent('media_pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n if(!this.next()) {\r\n this.stop();\r\n rootScope.dispatchEvent('media_stop');\r\n }\r\n };\r\n\r\n public toggle(play?: boolean) {\r\n if(!this.playingMedia) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = this.playingMedia.paused;\r\n }\r\n\r\n if(this.playingMedia.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n this.playingMedia.play();\r\n } else {\r\n this.playingMedia.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = () => {\r\n const media = this.playingMedia;\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n \r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public next = () => {\r\n return !this.lockedSwitchers && this.listLoader.go(1);\r\n };\r\n\r\n public previous = () => {\r\n const media = this.playingMedia;\r\n if(media && (media.currentTime > 5 || !this.listLoader.previous.length)) {\r\n media.currentTime = 0;\r\n this.toggle(true);\r\n return;\r\n }\r\n\r\n return !this.lockedSwitchers && this.listLoader.go(-1);\r\n };\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n if(!this.listLoader) {\r\n this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n rootScope.dispatchEvent('media_stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n this.listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n this.listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n this.listLoader.reverse = reverse;\r\n }\r\n\r\n this.listLoader.setSearchContext(this.searchContext);\r\n this.listLoader.current = current;\r\n\r\n this.listLoader.load(true);\r\n this.listLoader.load(false);\r\n }\r\n\r\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n let mediaType: PlaybackMediaType = 'audio';\r\n if(doc?.type) {\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n mediaType = 'voice';\r\n } else if(doc.type === 'video') {\r\n mediaType = 'video';\r\n }\r\n }\r\n\r\n return mediaType;\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\r\n\r\n this._playbackRate = this.playbackRates[mediaType];\r\n\r\n this.playingMedia = media;\r\n this.playingMediaType = mediaType;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return () => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n if(media && this.playingMedia === media) {\r\n this.stop();\r\n }\r\n\r\n if(wasPlaying) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\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 GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\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 attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport { ripple } from \"./ripple\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n textArgs?: FormatterArguments,\n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) textElement.innerHTML = options.regularText;\n }\n \n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach(b => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\nimport { closeBtnMenu, openBtnMenu } from \"./misc\";\r\n\r\nconst ButtonMenuToggle = (\r\n options: Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n listenerSetter: ListenerSetter, \r\n asDiv: boolean,\r\n container: HTMLElement\r\n }> = {}, \r\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', \r\n buttons: ButtonMenuItemOptions[], \r\n onOpen?: (e: Event) => void,\r\n onClose?: () => void\r\n) => {\r\n options.asDiv = true;\r\n const button = options.container ?? ButtonIcon('more', options);\r\n button.classList.add('btn-menu-toggle');\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options, onClose);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void, options?: AttachClickOptions, onClose?: () => void) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n closeBtnMenu();\r\n } else {\r\n onOpen && onOpen(e);\r\n openBtnMenu(openedMenu, onClose);\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport EventListenerBase from \"../eventListenerBase\";\nimport ListenerSetter from \"../listenerSetter\";\nimport safeAssign from \"../object/safeAssign\";\nimport findUpClassName from \"./findUpClassName\";\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n \n public setup(options: {\n element: HTMLElement, \n listenerSetter: ListenerSetter, \n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n \n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n \n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n \n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n \n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\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 appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport RangeSelector from \"../components/rangeSelector\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\n\nexport class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n\nexport class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01, \n min: 0, \n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n //console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n },\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(rootScope)('media_playback_params', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n private setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach(icon => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle}: {\n video: HTMLVideoElement, \n play?: boolean, \n streamable?: boolean, \n duration?: number,\n onPlaybackRackMenuToggle?: (open: boolean) => void\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper, \n listenerSetter: this.listenerSetter, \n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n \n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n \n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = String(video.duration | 0).toHHMMSS();\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('click', () => {\n this.togglePlay();\n });\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n \n /* player.addEventListener('click', (e) => {\n if(e.target !== player) {\n return;\n }\n\n this.togglePlay();\n }); */\n \n /* video.addEventListener('play', () => {\n }); */\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n listenerSetter.add(fullScreenButton)('click', () => {\n this.toggleFullScreen();\n });\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = String(video.currentTime | 0).toHHMMSS();\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(rootScope)('media_playback_params', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.innerHTML = String(Math.round(video.duration || initDuration)).toHHMMSS();\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS();\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return { \n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x', \n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(\n this.playbackRateButton, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined, \n undefined, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n );\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n \n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n \n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n \n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n \n cancelFullScreen();\n }\n }\n \n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public removeListeners() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = undefined;\n }\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\nimport { fastRaf } from \"../schedulers\";\nimport throttleWith from \"./throttleWith\";\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\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 { i18n, LangPackKey } from \"../lib/langPack\";\n\nexport default function formatBytes(bytes: number, decimals = 2) {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return i18n(sizes[i], [parseFloat((bytes / Math.pow(k, i)).toFixed(dm))]);\n}\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 appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport { MediaProgressLine } from \"../lib/mediaPlayer\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport './middleEllipsis';\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport htmlToSpan from \"../helpers/dom/htmlToSpan\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport formatBytes from \"../helpers/formatBytes\";\nimport { animateSingle } from \"../helpers/animation\";\nimport clamp from \"../helpers/number/clamp\";\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach(mid => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach(elem => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; //mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; //mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nfunction wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n \n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n \n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nfunction wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(appMessagesManager.wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n if(isVoice) {\n middleEllipsisEl.append(appMessagesManager.wrapSenderToPeer(message));\n } else {\n middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(appMessagesManager.wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map(s => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map(element => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public render() {\n this.classList.add('audio');\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(this.message);\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploading = isOutgoing && this.preloader;\n\n const durationStr = String(doc.duration | 0).toHHMMSS();\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploading) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = isVoice ? wrapVoiceMessage(this) : wrapAudio(this);\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => String(audio.currentTime | 0).toHHMMSS() + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID, \n inputFilter: {_: 'inputMessagesFilterEmpty'}, \n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLImageElement[] = [];\n const wrapped = wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach(img => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDocsManager.downloadDoc(doc);\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n \n //setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n //}, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploading) {\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\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 class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\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 replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: appPhotosManager.choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = RichTextProcessor.wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach(child => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, (title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport accumulate from \"../helpers/array/accumulate\";\r\nimport clamp from \"../helpers/number/clamp\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find(r => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map(size => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map(ratio => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map(ratio => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\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 { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.setAttribute('peer', '' + this.peerId);\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach(inputField => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach(inputField => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach(inputField => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\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 RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach(r => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\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 CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport { ripple } from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public titleRight: HTMLElement;\r\n public subtitle: HTMLElement;\r\n public media: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string | HTMLElement,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n titleRightSecondary: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n havePadding = true;\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n \r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n havePadding = true;\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n const titleRight = options.titleRight || options.titleRightSecondary;\r\n if(titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n if(typeof(options.title) === 'string') {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(options.title);\r\n }\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(titleRight) {\r\n const titleRightEl = this.titleRight = document.createElement('div');\r\n titleRightEl.classList.add('row-title', 'row-title-right');\r\n\r\n if(options.titleRightSecondary) {\r\n titleRightEl.classList.add('row-title-right-secondary');\r\n }\r\n\r\n if(typeof(titleRight) === 'string') {\r\n titleRightEl.innerHTML = titleRight;\r\n } else {\r\n titleRightEl.append(titleRight);\r\n }\r\n\r\n c.append(titleRightEl);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n public createMedia(size?: 'small') {\r\n this.container.classList.add('row-with-padding');\r\n \r\n const media = this.media = document.createElement('div');\r\n media.classList.add('row-media');\r\n\r\n if(size) {\r\n media.classList.add('row-media-' + size);\r\n }\r\n\r\n this.container.append(media);\r\n\r\n return media;\r\n }\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);\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// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\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 getDeepProperty from \"../helpers/object/getDeepProperty\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string,\r\n alignRight?: boolean\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n\r\n if(options.alignRight) {\r\n label.classList.add('radio-field-right');\r\n }\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\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 replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey\r\n}>) {\r\n toast(i18n(options.langPackKey));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n) {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n return (...args: Parameters): typeof waitingPromise => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\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 ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(options: UsernameInputField['options']) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!RichTextProcessor.isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = apiManager.invokeApi('channels.checkUsername', {\r\n channel: appChatsManager.getChannelInput(this.options.peerId.toChatId()),\r\n username\r\n });\r\n } else {\r\n this.checkUsernamePromise = apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n this.checkUsernamePromise.then(available => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && RichTextProcessor.isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\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 AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n let avatarEl = new AvatarElement();\n avatarEl.setAttribute('dialog', '1');\n avatarEl.setAttribute('peer', '' + options.peerId);\n avatarEl.classList.add('avatar-32');\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) p.innerHTML = options.description;\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach(o => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach(button => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach(o => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\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 { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n appProfileManager.getChatInviteLink(this.chatId, true).then(link => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n });\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n appChatsManager.migrateChat(this.chatId).then(channelId => {\r\n return appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\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 Scrollable from \"../components/scrollable\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then(done => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\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 appChatsManager, { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport PeerTitle from \"./peerTitle\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport appPeersManager, { IsPeerType } from \"../lib/appManagers/appPeersManager\";\nimport { generateDelimiter, SettingSection } from \"./sidebarLeft\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterUnique from \"../helpers/array/filterUnique\";\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../helpers/object/safeAssign\";\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n \n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n \n constructor(options: {\n appendTo: AppSelectPeers['appendTo'], \n onChange?: AppSelectPeers['onChange'], \n peerType?: AppSelectPeers['peerType'], \n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void, \n renderResultsFunc?: AppSelectPeers['renderResultsFunc'], \n chatRightsAction?: AppSelectPeers['chatRightsAction'], \n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = (peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter(peerId => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = peerIds.filter(peerId => {\n if(peerId.isPeerId()) {\n const peer = appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId));\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n //target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private renderSaved() {\n if(!this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || appUsersManager.testSelfSearch(this.query))) {\n this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true).promise;\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = dialogs[dialogs.length - 1].index || 0;\n\n dialogs = dialogs.slice();\n dialogs.findAndSplice(d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = dialogs.filter(d => this.filterByRights(d.peerId));\n }\n\n this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map(dialog => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private filterByRights(peerId: PeerId) {\n return (\n peerId.isUser() && \n (this.chatRightsAction !== 'send_messages' || appUsersManager.canSendToUser(peerId))\n ) || appChatsManager.hasRights(peerId.toChatId(), this.chatRightsAction);\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = resultPeerIds.filter(peerId => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter(peerId => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map(participant => {\n return appChatsManager.getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = peerIds.filter(peerId => {\n return appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(peerId => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.scrollable,\n drawStatus: false,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = appProfileManager.getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = appUsersManager.getUserStatusString(peerId);\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-32');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center'\n });\n }\n \n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n //const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach(value => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center', \n forceDirection: FocusDirection.Static\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\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 { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n dialog: this.userId.toPeerId(false),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(this.userId));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n });\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\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 { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }) {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? appChatsManager.combineParticipantBannedRights(options.chatId, options.participant.banned_rights) : defaultBannedRights;\n \n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: appChatsManager.hasRights(options.chatId, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n if((\n options.participant && \n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n (chat as Chat.channel).username &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n \n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter(i => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach(info => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach(flag => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n });\n\n this.eventListener.addEventListener('destroy', () => {\n appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = new AppUserPermissionsTab(this.slider);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, 'LI');\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = (li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = (appChatsManager.getChat(this.chatId) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach(info => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map(t => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: appPeersManager.getPeerId(participant.peer),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n if(needAdd) {\n if(!li) {\n add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n } else {\n setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n }\n\n if(update.prev_participant?._ !== 'channelParticipantBanned') {\n ++exceptionsCount;\n }\n } else {\n if(li) {\n li.remove();\n }\n\n if(update.prev_participant?._ === 'channelParticipantBanned') {\n --exceptionsCount;\n }\n }\n\n setLength();\n });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then(res => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\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 appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appPeersManager, { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n peerId: PeerId, \n // actionType: 'leave' | 'delete', \n peerType: PeerType = appPeersManager.getDialogType(peerId), \n onSelect?: (promise: Promise) => void\n ) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n appChatsManager.deleteChannel\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\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 debounce from \"../../../helpers/schedulers/debounce\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\nimport CheckboxField from \"../../checkboxField\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await appReactionsManager.getActiveAvailableReactions();\n const chatFull = await appProfileManager.getChatFull(this.chatId);\n let originalReactions = chatFull.available_reactions ?? [];\n const enabledReactions = new Set(originalReactions);\n\n const toggleSection = new SettingSection({\n caption: appChatsManager.isBroadcast(this.chatId) ? 'EnableReactionsChannelInfo' : 'EnableReactionsGroupInfo'\n });\n\n const toggleCheckboxField = new CheckboxField({toggle: true, checked: !!enabledReactions.size});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions'\n });\n\n toggleSection.content.append(toggleRow.container);\n\n const reactionsSection = new SettingSection({\n name: 'AvailableReactions'\n });\n\n const checkboxFields = availableReactions.map(availableReaction => {\n const checkboxField = new CheckboxField({\n toggle: true, \n checked: enabledReactions.has(availableReaction.reaction)\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n enabledReactions.add(availableReaction.reaction);\n\n if(!toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(true);\n }\n } else {\n enabledReactions.delete(availableReaction.reaction);\n\n if(!enabledReactions.size && toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(false);\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n this.listenerSetter.add(toggleRow.checkboxField.input)('change', () => {\n if(!toggleCheckboxField.checked) {\n checkboxFields.forEach(checkboxField => checkboxField.checked = false);\n saveReactionsDebounced();\n } else if(checkboxFields.every(checkboxField => !checkboxField.checked)) {\n checkboxFields.forEach(checkboxField => checkboxField.checked = true);\n saveReactionsDebounced();\n }\n });\n\n const saveReactions = () => {\n const newReactions = Array.from(enabledReactions);\n if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n return;\n }\n\n const chatFull = appProfileManager.getCachedFullChat(this.chatId);\n if(chatFull) {\n chatFull.available_reactions = newReactions;\n }\n \n appChatsManager.setChatAvailableReactions(this.chatId, newReactions);\n originalReactions = newReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', saveReactions, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\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 { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\r\nimport AppChatReactionsTab from \"./chatReactions\";\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n private tempId: number;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n this.tempId ??= 0;\r\n const tempId = ++this.tempId;\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n let chatFull = await appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(this.chatId);\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach(callback => callback());\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_full_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatFull = appProfileManager.getCachedFullChat(chatId) || chatFull;\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n const canChangeType = appChatsManager.hasRights(this.chatId, 'change_type');\r\n const canChangePermissions = appChatsManager.hasRights(this.chatId, 'change_permissions');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n \r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n \r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n \r\n if(canChangeType) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = new AppChatTypeTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(canChangeType || canChangePermissions) {\r\n const reactionsRow = new Row({\r\n titleLangKey: 'Reactions',\r\n icon: 'reactions',\r\n clickable: () => {\r\n const tab = new AppChatReactionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open().then(() => {\r\n if(this.tempId !== tempId) {\r\n return;\r\n }\r\n \r\n this.listenerSetter.add(tab.eventListener)('destroy', setReactionsLength);\r\n });\r\n }\r\n });\r\n\r\n const availableReactions = await appReactionsManager.getAvailableReactions();\r\n const availableReactionsLength = availableReactions.filter(availableReaction => !availableReaction.pFlags.inactive).length;\r\n const setReactionsLength = () => {\r\n const reactions = chatFull.available_reactions ?? [];\r\n reactionsRow.subtitle.innerHTML = reactions.length + '/' + availableReactionsLength;\r\n };\r\n\r\n setReactionsLength();\r\n\r\n section.content.append(reactionsRow.container);\r\n }\r\n\r\n if(canChangePermissions && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = new AppGroupPermissionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = () => {\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +appChatsManager.hasRights(this.chatId, f, chat.default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && canChangeType) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\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 { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !appUsersManager.isContact(this.peerId.toUserId());\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n appMessagesManager.togglePeerMute(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', (update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = appPeersManager.getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !appNotificationsManager.isMuted(update.notify_settings);\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !appNotificationsManager.isPeerLocalMuted(this.peerId, false);\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n appUsersManager.addContact(this.peerId, this.nameInputField.value, this.lastNameInputField.value, appUsersManager.getUser(this.peerId).phone)\r\n .finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\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 { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map(sel => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\nrootScope.addEventListener('context_menu_toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = (_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !this.verifyTouchTarget(_e)) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\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 IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\nimport appMessagesManager, { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { openAvatarViewer } from \"./avatar\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(public scrollable: Scrollable) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) \n || (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n \n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, lastIndex = 0, minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars, \n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n //console.log(xDiff, yDiff);\n return false;\n }, \n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n }, \n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n \n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n \n //console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = (anchor || listLoader.current) as any;\n return appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then(value => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(Promise.resolve(appProfileManager.getChatFull(peerId.toChatId())));\n }\n \n promises.push(appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then((result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = value.history.findAndSplice(m => {\n return ((m as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = (photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container');\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = () => {\n if(photo) {\n const res = wrapPhoto({\n container: avatar,\n photo,\n size: appPhotosManager.choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach(img => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n appAvatarsManager.putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.avatars.append(avatar);\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach(target => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n }\n}\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 IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport callbackify from \"../helpers/callbackify\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Chat, ChatFull, User } from \"../layer\";\nimport appChatsManager, { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport I18n from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport PeerTitle from \"./peerTitle\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\n\nlet setText = (text: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = text || '';\n row.container.style.display = text ? '' : 'none';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n \n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(\n public scrollable: Scrollable, \n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.setAttribute('dialog', '' + +this.isDialog);\n this.avatar.setAttribute('clickable', '');\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n Promise.resolve(appProfileManager.getProfileByPeerId(this.peerId)).then(full => {\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n });\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n const peer: Channel | User.user = appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: () => {\n const peer: User = appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n copyTextToClipboard(this.link.title.textContent);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then(chatFull => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n toast(I18n.format('LinkCopied', true));\n // });\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n \n //let checked = this.notificationsCheckbox.checked;\n appMessagesManager.togglePeerMute(this.peerId);\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('peer_title_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.fillUsername();\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n // const photo = appPeersManager.getPeerPhoto(peerId);\n // if(!photo && this.avatars) {\n this.setAvatar();\n // }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n public setPeerStatus = (needClear = false) => {\n const peerId = this.peerId;\n if(!peerId || (rootScope.myId === peerId && this.isDialog)) return;\n\n appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, true, () => peerId === this.peerId, !this.isDialog);\n };\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach(row => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n public setAvatar() {\n if(this.canBeDetailed()) {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable);\n this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar.setAttribute('peer', '' + this.peerId);\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n private fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const username = appPeersManager.getPeerUsername(peerId);\n setText(username, this.username);\n }\n }\n\n private fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const user = appUsersManager.getUser(peerId);\n setText(user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined, this.phone);\n }\n }\n\n private fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n notificationsRow.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n });\n }\n }\n\n private fillRows() {\n const peerId = this.peerId;\n\n this.fillUsername();\n this.fillUserPhone();\n this.fillNotifications();\n this.setMoreDetails();\n\n replaceContent(this.name, new PeerTitle({\n peerId,\n dialog: this.isDialog,\n }).element);\n\n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n this.name.append(generateVerifiedIcon());\n }\n\n this.setPeerStatus(true);\n }\n\n public fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n this.cleanupHTML();\n this.setAvatar();\n this.fillRows();\n }\n\n public setMoreDetails(override?: true) {\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId || appPeersManager.isRestricted(peerId) || !this.canBeDetailed()) {\n return;\n }\n\n callbackify(appProfileManager.getProfileByPeerId(peerId, override), (peerFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId || appPeersManager.isRestricted(peerId)) {\n //this.log.warn('peer changed');\n return;\n }\n \n //this.log('chatInfo res 2:', chatFull);\n \n // if(peerFull.about) {\n setText(peerFull.about ? RichTextProcessor.wrapRichText(peerFull.about) : undefined, this.bio);\n // }\n\n if(!peerId.isUser()) {\n const chat: Chat.channel = appChatsManager.getChat(peerId.toChatId());\n if(chat.username) {\n setText('https://t.me/' + chat.username, this.link);\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite) {\n setText(exportedInvite.link, this.link);\n }\n }\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n setText(location.address, this.location);\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n });\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n}\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 appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n } = {};\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n const isSharedMedia = top <= HEADER_HEIGHT;\n animatedCloseIcon.classList.toggle('state-back', isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = new AppEditChatTab(this.slider);\n } else {\n tab = new AppEditContactTab(this.slider);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n rootScope.addEventListener('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n rootScope.addEventListener('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n }\n });\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', () => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map(peerId => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = new AppAddMembersTab(this.slider);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const filtered = this.searchSuper.filterMessagesByType(mids.map(mid => appMessagesManager.getMessageByPeer(peerId, mid)), inputFilter);\n if(filtered.length) {\n const history = this.historiesStorage[peerId][inputFilter];\n if(history) {\n history.unshift(...filtered.map(message => ({mid: message.mid, peerId: message.peerId})));\n }\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = this.historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex(m => m.mid === mid);\n if(idx !== -1) {\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`div[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n \n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n this.searchSuper.usedFromHistory[inputFilter]--;\n }\n }\n\n break;\n }\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n \n this.editBtn.classList.add('hide');\n\n this.searchSuper.cleanupHTML(true);\n\n this.container.classList.toggle('can-add-members', this.searchSuper.canViewMembers() && appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {})\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n\n this.cleanupHTML();\n\n this.profile.fillProfileElements();\n\n this.toggleEditBtn();\n }\n\n private toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad = false) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppSharedMediaTab = AppSharedMediaTab);\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 appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n public sharedMediaTab: AppSharedMediaTab;\r\n private isColumnProportionSet = false;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n\r\n this.sharedMediaTab = new AppSharedMediaTab(this);\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n /* public selectTab(id: number) {\r\n const res = super.selectTab(id);\r\n\r\n if(id !== -1) {\r\n this.toggleSidebar(true);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));\r\n\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n //this.selectTab(this.sharedMediaTab);\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\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 { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport appPollsManager from \"../../../lib/appManagers/appPollsManager\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { ripple } from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public open(message: any) {\r\n const ret = super.open();\r\n const poll = appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n title.innerHTML = poll.poll.rQuestion;\r\n\r\n const percents = poll.results.results.map(v => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n answerTitle.innerHTML = RichTextProcessor.wrapEmojiText(answer.text);\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n appPollsManager.getVotes(message, answer.option, offset, limit).then(votesList => {\r\n votesList.votes.forEach(vote => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: vote.user_id.toPeerId(false),\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then(votes => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\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 mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport appPollsManager from \"../lib/appManagers/appPollsManager\";\r\nimport serverTimeManager from \"../lib/mtproto/serverTimeManager\";\r\nimport { RichTextProcessor } from \"../lib/richtextprocessor\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { ripple } from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Poll, PollResults } from \"../layer\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nrootScope.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n textEl.innerHTML = RichTextProcessor.wrapRichText(solution, {entities: solution_entities});\r\n appImManager.chat.bubbles.bubblesContainer.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: any;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n constructor() {\r\n super();\r\n // элемент создан\r\n }\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n const pollId = this.message.media.poll.id;\r\n const {poll, results} = appPollsManager.getPoll(pollId);\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - serverTimeManager.serverTimeOffset) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = String(timeLeft).toHHMMSS();\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n new AppPollResultsTab(appSidebarRight).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter(el => el.classList.contains('is-chosing')).map(el => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach(el => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find(r => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach(target => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach(target => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map(v => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n let html = '';\r\n /**\r\n * MACOS, ANDROID - без реверса\r\n * WINDOWS DESKTOP - реверс\r\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\r\n */\r\n (results.recent_voters || [])/* .slice().reverse() */.forEach((userId, idx) => {\r\n const style = idx === 0 ? '' : `style=\"transform: translateX(-${idx * 3}px);\"`;\r\n html += ``;\r\n });\r\n this.avatarsDiv.innerHTML = html;\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach(svg => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map(p => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map(p => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach(svg => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\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 Chat from './chat/chat';\r\nimport { getEmojiToneIndex } from '../vendor/emoji';\r\nimport { deferredPromise } from '../helpers/cancellablePromise';\r\nimport { formatFullSentTime } from '../helpers/date';\r\nimport mediaSizes, { ScreenSize } from '../helpers/mediaSizes';\r\nimport { IS_SAFARI } from '../environment/userAgent';\r\nimport { Message, PhotoSize, StickerSet } from '../layer';\r\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport appMessagesManager from '../lib/appManagers/appMessagesManager';\r\nimport appPhotosManager, { MyPhoto } from '../lib/appManagers/appPhotosManager';\r\nimport LottieLoader from '../lib/rlottie/lottieLoader';\r\nimport webpWorkerController from '../lib/webp/webpWorkerController';\r\nimport animationIntersector from './animationIntersector';\r\nimport appMediaPlaybackController, { MediaSearchContext } from './appMediaPlaybackController';\r\nimport AudioElement, { findMediaTargets } from './audio';\r\nimport ReplyContainer from './chat/replyContainer';\r\nimport { Layouter, RectPart } from './groupedLayout';\r\nimport LazyLoadQueue from './lazyLoadQueue';\r\nimport PollElement from './poll';\r\nimport ProgressivePreloader from './preloader';\r\nimport './middleEllipsis';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { onMediaLoad } from '../helpers/files';\r\nimport { animateSingle } from '../helpers/animation';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport { fastRaf } from '../helpers/schedulers';\r\nimport appDownloadManager, { DownloadBlob, ThumbCache } from '../lib/appManagers/appDownloadManager';\r\nimport appStickersManager from '../lib/appManagers/appStickersManager';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent, simulateClickEvent } from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport { clearBadCharsAndTrim } from '../helpers/cleanSearchText';\r\nimport blur from '../helpers/blur';\r\nimport IS_WEBP_SUPPORTED from '../environment/webpSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\r\nimport { MiddleEllipsisElement } from './middleEllipsis';\r\nimport { joinElementsWith } from '../lib/langPack';\r\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\r\nimport { NULL_PEER_ID } from '../lib/mtproto/mtproto_config';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\r\nimport assumeType from '../helpers/assumeType';\r\nimport appMessagesIdsManager from '../lib/appManagers/appMessagesIdsManager';\r\nimport throttle from '../helpers/schedulers/throttle';\r\nimport { SendMessageEmojiInteractionData } from '../types';\r\nimport IS_VIBRATE_SUPPORTED from '../environment/vibrateSupport';\r\nimport Row from './row';\r\nimport { ChatAutoDownloadSettings } from '../helpers/autoDownload';\r\nimport formatBytes from '../helpers/formatBytes';\r\n\r\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\r\n\r\nlet roundVideoCircumference = 0;\r\nmediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\r\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\r\n const width = mediaSizes.active.round.width;\r\n const halfSize = width / 2;\r\n const radius = halfSize - 7;\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n elements.forEach(element => {\r\n element.setAttributeNS(null, 'width', '' + width);\r\n element.setAttributeNS(null, 'height', '' + width);\r\n\r\n const circle = element.firstElementChild as SVGCircleElement;\r\n circle.setAttributeNS(null, 'cx', '' + halfSize);\r\n circle.setAttributeNS(null, 'cy', '' + halfSize);\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n });\r\n }\r\n});\r\n\r\nexport function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, size, searchContext, autoDownload}: {\r\n doc: MyDocument, \r\n container?: HTMLElement, \r\n message?: Message.message, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n noInfo?: true,\r\n noPlayButton?: boolean,\r\n group?: string,\r\n onlyPreview?: boolean,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n autoDownload?: ChatAutoDownloadSettings,\r\n size?: PhotoSize,\r\n searchContext?: MediaSearchContext,\r\n}) {\r\n const autoDownloadSize = autoDownload?.video;\r\n let noAutoDownload = autoDownloadSize === 0;\r\n const isAlbumItem = !(boxWidth && boxHeight);\r\n const canAutoplay = /* doc.sticker || */(\r\n (\r\n doc.type !== 'video' || (\r\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && \r\n !isAlbumItem\r\n )\r\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\r\n );\r\n let spanTime: HTMLElement, spanPlay: HTMLElement;\r\n\r\n if(!noInfo) {\r\n spanTime = document.createElement('span');\r\n spanTime.classList.add('video-time');\r\n container.append(spanTime);\r\n \r\n let needPlayButton = false;\r\n if(doc.type !== 'gif') {\r\n spanTime.innerText = (doc.duration + '').toHHMMSS(false);\r\n\r\n if(!noPlayButton && doc.type !== 'round') {\r\n if(canAutoplay && !noAutoDownload) {\r\n spanTime.classList.add('tgico', 'can-autoplay');\r\n } else {\r\n needPlayButton = true;\r\n }\r\n }\r\n } else {\r\n spanTime.innerText = 'GIF';\r\n\r\n if(!canAutoplay && !noPlayButton) {\r\n needPlayButton = true;\r\n noAutoDownload = undefined;\r\n }\r\n }\r\n\r\n if(needPlayButton) {\r\n spanPlay = document.createElement('span');\r\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\r\n container.append(spanPlay);\r\n }\r\n }\r\n\r\n let res: {\r\n thumb?: typeof photoRes,\r\n loadPromise: Promise\r\n } = {} as any;\r\n\r\n if(doc.mime_type === 'image/gif') {\r\n const photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader,\r\n loadPromises,\r\n autoDownloadSize,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\r\n if(video.parentElement) {\r\n video.remove();\r\n } */\r\n\r\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\r\n\r\n const video = document.createElement('video');\r\n video.classList.add('media-video');\r\n video.setAttribute('playsinline', 'true');\r\n video.muted = true;\r\n if(doc.type === 'round') {\r\n const divRound = document.createElement('div');\r\n divRound.classList.add('media-round', 'z-depth-1');\r\n divRound.dataset.mid = '' + message.mid;\r\n divRound.dataset.peerId = '' + message.peerId;\r\n (divRound as any).message = message;\r\n\r\n const size = mediaSizes.active.round;\r\n const halfSize = size.width / 2;\r\n const strokeWidth = 3.5;\r\n const radius = halfSize - (strokeWidth * 2);\r\n divRound.innerHTML = `\r\n \r\n `;\r\n\r\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\r\n if(!roundVideoCircumference) {\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n }\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n \r\n spanTime.classList.add('tgico');\r\n\r\n const isUnread = message.pFlags.media_unread;\r\n if(isUnread) {\r\n divRound.classList.add('is-unread');\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\r\n\r\n divRound.prepend(canvas, spanTime);\r\n divRound.append(video);\r\n container.append(divRound);\r\n\r\n const ctx = canvas.getContext('2d');\r\n /* ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\r\n ctx.clip(); */\r\n\r\n const onLoad = () => {\r\n const message: Message.message = (divRound as any).message;\r\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\r\n const clear = () => {\r\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\r\n if(isInDOM(globalVideo)) {\r\n return;\r\n }\r\n \r\n globalVideo.removeEventListener('play', onPlay);\r\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.removeEventListener('pause', onPaused);\r\n globalVideo.removeEventListener('ended', onEnded);\r\n });\r\n };\r\n \r\n const onFrame = () => {\r\n ctx.drawImage(globalVideo, 0, 0);\r\n \r\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + offset;\r\n \r\n return !globalVideo.paused;\r\n };\r\n\r\n const onTimeUpdate = () => {\r\n if(!globalVideo.duration) {\r\n return;\r\n }\r\n \r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n\r\n if(globalVideo.paused) {\r\n onFrame();\r\n }\r\n \r\n spanTime.innerText = (globalVideo.duration - globalVideo.currentTime + '').toHHMMSS(false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n \r\n const onPlay = () => {\r\n video.classList.add('hide');\r\n divRound.classList.remove('is-paused');\r\n animateSingle(onFrame, canvas);\r\n \r\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\r\n preloader.onClick();\r\n }\r\n };\r\n \r\n const onPaused = () => {\r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n \r\n divRound.classList.add('is-paused');\r\n };\r\n \r\n const onEnded = () => {\r\n video.classList.remove('hide');\r\n divRound.classList.add('is-paused');\r\n \r\n video.currentTime = 0;\r\n spanTime.innerText = ('' + globalVideo.duration).toHHMMSS(false);\r\n \r\n if(globalVideo.currentTime) {\r\n globalVideo.currentTime = 0;\r\n }\r\n };\r\n \r\n globalVideo.addEventListener('play', onPlay);\r\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.addEventListener('pause', onPaused);\r\n globalVideo.addEventListener('ended', onEnded);\r\n \r\n attachClickEvent(canvas, (e) => {\r\n cancelEvent(e);\r\n \r\n // ! костыль\r\n if(preloader && !preloader.detached) {\r\n preloader.onClick();\r\n }\r\n \r\n // ! can't use it here. on Safari iOS video won't start.\r\n /* if(globalVideo.readyState < 2) {\r\n return;\r\n } */\r\n \r\n if(globalVideo.paused) {\r\n const hadSearchContext = !!searchContext;\r\n if(appMediaPlaybackController.setSearchContext(searchContext || {\r\n peerId: NULL_PEER_ID, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n useSearch: false\r\n })) {\r\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound/* , searchContext.useSearch */);\r\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\r\n }\r\n \r\n globalVideo.play();\r\n } else {\r\n globalVideo.pause();\r\n }\r\n });\r\n \r\n if(globalVideo.paused) {\r\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\r\n onFrame();\r\n onTimeUpdate();\r\n video.classList.add('hide');\r\n } else {\r\n onPaused();\r\n }\r\n } else {\r\n onPlay();\r\n }\r\n };\r\n\r\n if(message.pFlags.is_outgoing) {\r\n (divRound as any).onLoad = onLoad;\r\n divRound.dataset.isOutgoing = '1';\r\n } else {\r\n onLoad();\r\n }\r\n } else {\r\n video.autoplay = true; // для safari\r\n }\r\n\r\n let photoRes: ReturnType;\r\n if(message) {\r\n photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n autoDownloadSize: autoDownload?.photo,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n\r\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n if(withTail) {\r\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\r\n video.width = +foreignObject.getAttributeNS(null, 'width');\r\n video.height = +foreignObject.getAttributeNS(null, 'height');\r\n foreignObject.append(video);\r\n }\r\n } else { // * gifs masonry\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n if(gotThumb) {\r\n gotThumb.promise.then(() => {\r\n video.poster = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n if(!video.parentElement && container) {\r\n (photoRes?.aspecter || container).append(video);\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const isUpload = !!(message?.media as any)?.preloader;\r\n if(isUpload) { // means upload\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n preloader.attach(container, false);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n } else if(doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n cancelable: false,\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const renderDeferred = deferredPromise();\r\n video.addEventListener('error', (e) => {\r\n if(video.error.code !== 4) {\r\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\r\n }\r\n \r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n if(!renderDeferred.isFulfilled) {\r\n renderDeferred.resolve();\r\n }\r\n }, {once: true});\r\n\r\n onMediaLoad(video).then(() => {\r\n if(group) {\r\n animationIntersector.addAnimation(video, group);\r\n }\r\n\r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n renderDeferred.resolve();\r\n });\r\n\r\n if(doc.type === 'video') {\r\n video.addEventListener('timeupdate', () => {\r\n spanTime.innerText = (video.duration - video.currentTime + '').toHHMMSS(false);\r\n });\r\n\r\n if(spanPlay) {\r\n video.addEventListener('timeupdate', () => {\r\n spanPlay.remove();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n video.muted = true;\r\n video.loop = true;\r\n //video.play();\r\n video.autoplay = true;\r\n\r\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\r\n const load = () => {\r\n if(preloader && noAutoDownload && !withoutPreloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n let loadPromise: Promise = Promise.resolve();\r\n if((preloader && !isUpload) || withoutPreloader) {\r\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n const promise = loadPromise = appDocsManager.downloadDoc(doc, lazyLoadQueue?.queueId, noAutoDownload);\r\n if(preloader) {\r\n preloader.attach(container, false, promise);\r\n }\r\n } else if(doc.supportsStreaming) {\r\n if(noAutoDownload) {\r\n loadPromise = Promise.reject();\r\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\r\n preloader.attach(container, false, null);\r\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\r\n preloader.detach();\r\n }, {once: true});\r\n }\r\n }\r\n }\r\n\r\n if(!noAutoDownload && loadPhotoThumbFunc) {\r\n loadPhotoThumbFunc();\r\n loadPhotoThumbFunc = null;\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n loadPromise.then(() => {\r\n if(middleware && !middleware()) {\r\n renderDeferred.resolve();\r\n return;\r\n }\r\n\r\n if(doc.type === 'round') {\r\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\r\n }\r\n\r\n renderImageFromUrl(video, cacheContext.url);\r\n }, () => {});\r\n\r\n return {download: loadPromise, render: renderDeferred};\r\n };\r\n\r\n if(preloader && !isUpload) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n\r\n /* if(doc.size >= 20e6 && !doc.downloaded) {\r\n let downloadDiv = document.createElement('div');\r\n downloadDiv.classList.add('download');\r\n\r\n let span = document.createElement('span');\r\n span.classList.add('btn-circle', 'tgico-download');\r\n downloadDiv.append(span);\r\n\r\n downloadDiv.addEventListener('click', () => {\r\n downloadDiv.remove();\r\n loadVideo();\r\n });\r\n\r\n container.prepend(downloadDiv);\r\n\r\n return;\r\n } */\r\n\r\n if(doc.type === 'gif' && !canAutoplay) {\r\n attachClickEvent(container, (e) => {\r\n cancelEvent(e);\r\n spanPlay.remove();\r\n load();\r\n }, {capture: true, once: true});\r\n } else {\r\n res.loadPromise = !lazyLoadQueue ? load().render : (lazyLoadQueue.push({div: container, load: () => load().render}), Promise.resolve());\r\n }\r\n\r\n return res;\r\n}\r\n\r\nrootScope.addEventListener('download_start', (docId) => {\r\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n if(element.querySelector('.preloader-container.manual')) {\r\n simulateClickEvent(element);\r\n }\r\n });\r\n});\r\n\r\nexport function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue}: {\r\n message: any, \r\n withTime?: boolean,\r\n fontWeight?: number,\r\n voiceAsMusic?: boolean,\r\n showSender?: boolean,\r\n searchContext?: MediaSearchContext,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n lazyLoadQueue?: LazyLoadQueue\r\n}): HTMLElement {\r\n if(!fontWeight) fontWeight = 500;\r\n const noAutoDownload = autoDownloadSize === 0;\r\n\r\n const doc = (message.media.document || message.media.webpage.document) as MyDocument;\r\n const uploading = message.pFlags.is_outgoing && message.media?.preloader;\r\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\r\n const audioElement = new AudioElement();\r\n audioElement.withTime = withTime;\r\n audioElement.message = message;\r\n audioElement.noAutoDownload = noAutoDownload;\r\n audioElement.lazyLoadQueue = lazyLoadQueue;\r\n audioElement.loadPromises = loadPromises;\r\n \r\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\r\n if(searchContext) audioElement.searchContext = searchContext;\r\n if(showSender) audioElement.showSender = showSender;\r\n if(uploading) audioElement.preloader = message.media.preloader;\r\n\r\n audioElement.dataset.fontWeight = '' + fontWeight;\r\n audioElement.render();\r\n return audioElement;\r\n }\r\n\r\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\r\n let ext = '';\r\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \r\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \r\n 'file';\r\n\r\n let docDiv = document.createElement('div');\r\n docDiv.classList.add('document', `ext-${ext}`);\r\n docDiv.dataset.docId = '' + doc.id;\r\n\r\n const icoDiv = document.createElement('div');\r\n icoDiv.classList.add('document-ico');\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\r\n docDiv.classList.add('document-with-thumb');\r\n\r\n let imgs: HTMLImageElement[] = [];\r\n if(message.pFlags.is_outgoing) {\r\n icoDiv.innerHTML = ``;\r\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\r\n } else {\r\n const wrapped = wrapPhoto({\r\n photo: doc, \r\n message: null, \r\n container: icoDiv, \r\n boxWidth: 54, \r\n boxHeight: 54,\r\n loadPromises,\r\n withoutPreloader: true,\r\n lazyLoadQueue,\r\n size: appPhotosManager.choosePhotoSize(doc, 54, 54, true)\r\n });\r\n icoDiv.style.width = icoDiv.style.height = '';\r\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\r\n if(wrapped.images.full) imgs.push(wrapped.images.full);\r\n }\r\n\r\n imgs.forEach(img => img.classList.add('document-thumb'));\r\n } else {\r\n icoDiv.innerText = ext;\r\n }\r\n\r\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\r\n let fileName = doc.fileName || 'Unknown.file';\r\n const descriptionEl = document.createElement('div');\r\n descriptionEl.classList.add('document-description');\r\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\r\n \r\n if(withTime) {\r\n descriptionParts.push(formatFullSentTime(message.date));\r\n }\r\n\r\n if(showSender) {\r\n descriptionParts.push(appMessagesManager.wrapSenderToPeer(message));\r\n }\r\n\r\n docDiv.innerHTML = `\r\n ${cacheContext.downloaded && !uploading ? '' : `
`}\r\n
\r\n
\r\n `;\r\n\r\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\r\n const middleEllipsisEl = new MiddleEllipsisElement();\r\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\r\n middleEllipsisEl.innerHTML = fileName;\r\n\r\n nameDiv.append(middleEllipsisEl);\r\n\r\n if(showSender) {\r\n nameDiv.append(appMessagesManager.wrapSentTime(message));\r\n }\r\n\r\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\r\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\r\n\r\n docDiv.prepend(icoDiv);\r\n\r\n if(!uploading && message.pFlags.is_outgoing) {\r\n return docDiv;\r\n }\r\n\r\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\r\n const onLoad = () => {\r\n if(downloadDiv) {\r\n downloadDiv.classList.add('downloaded');\r\n const _downloadDiv = downloadDiv;\r\n setTimeout(() => {\r\n _downloadDiv.remove();\r\n }, 200);\r\n downloadDiv = null;\r\n }\r\n\r\n if(preloader) {\r\n preloader = null;\r\n }\r\n };\r\n\r\n const load = (e?: Event) => {\r\n const save = !e || e.isTrusted;\r\n const doc = appDocsManager.getDoc(docDiv.dataset.docId);\r\n let download: DownloadBlob;\r\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\r\n if(!save) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else if(doc.type === 'pdf') {\r\n const canOpenAfter = appDocsManager.downloading.has(doc.id) || cacheContext.downloaded;\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n if(canOpenAfter) {\r\n download.then(() => {\r\n setTimeout(() => { // wait for preloader animation end\r\n const url = appDownloadManager.getCacheContext(doc).url;\r\n window.open(url);\r\n }, rootScope.settings.animationsEnabled ? 250 : 0);\r\n });\r\n }\r\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else {\r\n download = appDocsManager.saveDocFile(doc, queueId);\r\n }\r\n\r\n if(downloadDiv) {\r\n download.then(onLoad);\r\n preloader.attach(downloadDiv, true, download);\r\n }\r\n\r\n return {download};\r\n };\r\n\r\n if(appDocsManager.downloading.has(doc.id)) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = new ProgressivePreloader();\r\n preloader.attach(downloadDiv, false, appDocsManager.downloading.get(doc.id));\r\n } else if(!cacheContext.downloaded || uploading) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = message.media.preloader as ProgressivePreloader;\r\n\r\n if(!preloader) {\r\n preloader = new ProgressivePreloader();\r\n\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(downloadDiv);\r\n preloader.setDownloadFunction(load);\r\n\r\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\r\n simulateClickEvent(preloader.preloader);\r\n }\r\n } else {\r\n preloader.attach(downloadDiv);\r\n message.media.promise.then(onLoad);\r\n }\r\n }\r\n\r\n attachClickEvent(docDiv, (e) => {\r\n if(preloader) {\r\n preloader.onClick(e);\r\n } else {\r\n load(e);\r\n }\r\n });\r\n\r\n return docDiv;\r\n}\r\n\r\n/* function wrapMediaWithTail(photo: MyPhoto | MyDocument, message: {mid: number, message: string}, container: HTMLElement, boxWidth: number, boxHeight: number, isOut: boolean) {\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');\r\n \r\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", 'foreignObject');\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, true);\r\n if(gotThumb) {\r\n foreignObject.append(gotThumb.image);\r\n }\r\n appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight);\r\n \r\n const width = +foreignObject.getAttributeNS(null, 'width');\r\n const height = +foreignObject.getAttributeNS(null, 'height');\r\n\r\n svg.setAttributeNS(null, 'width', '' + width);\r\n svg.setAttributeNS(null, 'height', '' + height);\r\n\r\n svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\r\n svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n\r\n const clipId = 'clip' + message.mid + '_' + nextRandomInt(9999);\r\n svg.dataset.clipId = clipId;\r\n \r\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", 'defs');\r\n let clipPathHTML: string = '';\r\n \r\n if(message.message) {\r\n //clipPathHTML += ``;\r\n } else {\r\n if(isOut) {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n } else {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n }\r\n }\r\n\r\n defs.innerHTML = `${clipPathHTML}`;\r\n \r\n container.style.width = parseInt(container.style.width) - 9 + 'px';\r\n container.classList.add('with-tail');\r\n\r\n svg.append(defs, foreignObject);\r\n container.append(svg);\r\n\r\n let img = foreignObject.firstElementChild as HTMLImageElement;\r\n if(!img) {\r\n foreignObject.append(img = new Image());\r\n }\r\n\r\n return img;\r\n} */\r\n\r\nexport function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter}: {\r\n photo: MyPhoto | MyDocument, \r\n message?: any, \r\n container: HTMLElement, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n middleware?: () => boolean, \r\n size?: PhotoSize,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n noBlur?: boolean,\r\n noThumb?: boolean,\r\n noFadeIn?: boolean,\r\n blurAfter?: boolean,\r\n}) {\r\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\r\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\r\n appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: Promise.resolve(),\r\n full: Promise.resolve()\r\n },\r\n images: {\r\n thumb: null,\r\n full: null\r\n },\r\n preloader: null,\r\n aspecter: null\r\n };\r\n }\r\n\r\n let noAutoDownload = autoDownloadSize === 0;\r\n\r\n if(!size) {\r\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\r\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\r\n }\r\n\r\n container.classList.add('media-container');\r\n let aspecter = container;\r\n\r\n let isFit = true;\r\n let loadThumbPromise: Promise = Promise.resolve();\r\n let thumbImage: HTMLImageElement;\r\n let image: HTMLImageElement;\r\n let cacheContext: ThumbCache;\r\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\r\n // if(withTail) {\r\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\r\n // } else {\r\n image = new Image();\r\n\r\n if(boxWidth && boxHeight && !size) { // !album\r\n const set = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\r\n _: 'photoSize',\r\n w: photo.w,\r\n h: photo.h,\r\n size: photo.size,\r\n type: 'full'\r\n } : undefined);\r\n size = set.photoSize;\r\n isFit = set.isFit;\r\n cacheContext = appDownloadManager.getCacheContext(photo, size.type);\r\n\r\n if(!isFit) {\r\n aspecter = document.createElement('div');\r\n aspecter.classList.add('media-container-aspecter');\r\n aspecter.style.width = set.size.width + 'px';\r\n aspecter.style.height = set.size.height + 'px';\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\r\n if(gotThumb) {\r\n loadThumbPromise = gotThumb.loadPromise;\r\n const thumbImage = gotThumb.image; // local scope\r\n thumbImage.classList.add('media-photo');\r\n container.append(thumbImage);\r\n } else {\r\n const res = wrapPhoto({\r\n container,\r\n message,\r\n photo,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n size,\r\n lazyLoadQueue,\r\n isOut,\r\n loadPromises,\r\n middleware,\r\n withoutPreloader,\r\n withTail,\r\n autoDownloadSize,\r\n noBlur,\r\n noThumb: true,\r\n blurAfter: true\r\n //noFadeIn: true\r\n });\r\n const thumbImage = res.images.full;\r\n thumbImage.classList.add('media-photo', 'thumbnail');\r\n //container.append(thumbImage);\r\n }\r\n\r\n container.classList.add('media-container-fitted');\r\n container.append(aspecter);\r\n }\r\n } else {\r\n if(!size) {\r\n size = appPhotosManager.choosePhotoSize(photo, boxWidth, boxHeight, true);\r\n }\r\n \r\n cacheContext = appDownloadManager.getCacheContext(photo, size?.type);\r\n }\r\n\r\n if(!noThumb) {\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\r\n if(gotThumb) {\r\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\r\n thumbImage = gotThumb.image;\r\n thumbImage.classList.add('media-photo');\r\n aspecter.append(thumbImage);\r\n }\r\n }\r\n // }\r\n\r\n image.classList.add('media-photo');\r\n \r\n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\r\n\r\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\r\n\r\n let preloader: ProgressivePreloader;\r\n if(message?.media?.preloader && !withoutPreloader) { // means upload\r\n preloader = message.media.preloader;\r\n preloader.attach(container);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const getDownloadPromise = () => {\r\n const promise = isGif && !size ? \r\n appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \r\n appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\r\n\r\n return promise;\r\n };\r\n\r\n const renderOnLoad = (url: string) => {\r\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\r\n };\r\n\r\n const onLoad = (): Promise => {\r\n if(middleware && !middleware()) return Promise.resolve();\r\n\r\n if(blurAfter) {\r\n return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\r\n });\r\n }\r\n\r\n return renderOnLoad(cacheContext.url);\r\n };\r\n\r\n let loadPromise: Promise;\r\n const canAttachPreloader = (\r\n (size as PhotoSize.photoSize).w >= 150 && \r\n (size as PhotoSize.photoSize).h >= 150\r\n ) || noAutoDownload;\r\n const load = () => {\r\n if(noAutoDownload && !withoutPreloader && preloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n const promise = getDownloadPromise();\r\n\r\n if(preloader && \r\n !cacheContext.downloaded && \r\n !withoutPreloader && \r\n canAttachPreloader\r\n ) {\r\n preloader.attach(container, false, promise);\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n const renderPromise = promise.then(onLoad);\r\n renderPromise.catch(() => {});\r\n return {download: promise, render: renderPromise};\r\n };\r\n\r\n if(preloader) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n \r\n if(cacheContext.downloaded) {\r\n loadThumbPromise = loadPromise = load().render;\r\n } else {\r\n if(!lazyLoadQueue) loadPromise = load().render;\r\n /* else if(noAutoDownload) {\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(container);\r\n } */ else lazyLoadQueue.push({div: container, load: () => load().download});\r\n }\r\n\r\n if(loadPromises && loadThumbPromise) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: loadThumbPromise,\r\n full: loadPromise || Promise.resolve()\r\n },\r\n images: {\r\n thumb: thumbImage,\r\n full: image\r\n },\r\n preloader,\r\n aspecter\r\n };\r\n}\r\n\r\nexport function renderImageWithFadeIn(container: HTMLElement, \r\n image: HTMLImageElement, \r\n url: string, \r\n needFadeIn: boolean, \r\n aspecter = container,\r\n thumbImage?: HTMLImageElement\r\n) {\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve) => {\r\n /* if(photo._ === 'document') {\r\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n return resolve();\r\n } */\r\n\r\n renderImageFromUrl(image, url, () => {\r\n sequentialDom.mutateElement(container, () => {\r\n aspecter.append(image);\r\n\r\n fastRaf(() => {\r\n resolve();\r\n });\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n image.classList.remove('fade-in');\r\n \r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n });\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n });\r\n}\r\n\r\n// export function renderImageWithFadeIn(container: HTMLElement, \r\n// image: HTMLImageElement, \r\n// url: string, \r\n// needFadeIn: boolean, \r\n// aspecter = container,\r\n// thumbImage?: HTMLImageElement\r\n// ) {\r\n// if(needFadeIn) {\r\n// // image.classList.add('fade-in-new', 'not-yet');\r\n// image.classList.add('fade-in');\r\n// }\r\n\r\n// return new Promise((resolve) => {\r\n// /* if(photo._ === 'document') {\r\n// console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n// return resolve();\r\n// } */\r\n\r\n// renderImageFromUrl(image, url, () => {\r\n// sequentialDom.mutateElement(container, () => {\r\n// aspecter.append(image);\r\n// // (needFadeIn ? getHeavyAnimationPromise() : Promise.resolve()).then(() => {\r\n\r\n// // fastRaf(() => {\r\n// resolve();\r\n// // });\r\n\r\n// if(needFadeIn) {\r\n// fastRaf(() => {\r\n// /* if(!image.isConnected) {\r\n// alert('aaaa');\r\n// } */\r\n// // fastRaf(() => {\r\n// image.classList.remove('not-yet');\r\n// // });\r\n// });\r\n\r\n// image.addEventListener('transitionend', () => {\r\n// sequentialDom.mutate(() => {\r\n// image.classList.remove('fade-in-new');\r\n \r\n// if(thumbImage) {\r\n// thumbImage.remove();\r\n// }\r\n// });\r\n// }, {once: true});\r\n// }\r\n// // });\r\n// });\r\n// });\r\n// });\r\n// }\r\n\r\nexport function wrapStickerAnimation({\r\n size,\r\n doc,\r\n middleware,\r\n target,\r\n side,\r\n skipRatio,\r\n play\r\n}: {\r\n size: number,\r\n doc: MyDocument,\r\n middleware?: () => boolean,\r\n target: HTMLElement,\r\n side: 'left' | 'center' | 'right',\r\n skipRatio?: number,\r\n play: boolean\r\n}) {\r\n const animationDiv = document.createElement('div');\r\n animationDiv.classList.add('emoji-animation');\r\n\r\n // const size = 280;\r\n animationDiv.style.width = size + 'px';\r\n animationDiv.style.height = size + 'px';\r\n\r\n const stickerPromise = wrapSticker({\r\n div: animationDiv,\r\n doc,\r\n middleware,\r\n withThumb: false,\r\n needFadeIn: false,\r\n loop: false,\r\n width: size,\r\n height: size,\r\n play,\r\n group: 'none',\r\n skipRatio\r\n }).then(animation => {\r\n assumeType(animation);\r\n animation.addEventListener('enterFrame', (frameNo) => {\r\n if(frameNo === animation.maxFrame) {\r\n animation.remove();\r\n animationDiv.remove();\r\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\r\n }\r\n });\r\n\r\n if(IS_VIBRATE_SUPPORTED) {\r\n animation.addEventListener('firstFrame', () => {\r\n navigator.vibrate(100);\r\n }, {once: true});\r\n }\r\n\r\n return animation;\r\n });\r\n\r\n const generateRandomSigned = (max: number) => {\r\n const r = Math.random() * max * 2;\r\n return r > max ? -r % max : r;\r\n };\r\n\r\n const randomOffsetX = generateRandomSigned(16);\r\n const randomOffsetY = generateRandomSigned(4);\r\n const stableOffsetX = size / 8 * (side === 'right' ? 1 : -1);\r\n const setPosition = () => {\r\n if(!isInDOM(target)) {\r\n return;\r\n }\r\n \r\n const rect = target.getBoundingClientRect();\r\n /* const boxWidth = Math.max(rect.width, rect.height);\r\n const boxHeight = Math.max(rect.width, rect.height);\r\n const x = rect.left + ((boxWidth - size) / 2);\r\n const y = rect.top + ((boxHeight - size) / 2); */\r\n\r\n const rectX = side === 'right' ? rect.right : rect.left;\r\n\r\n const addOffsetX = side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0) + stableOffsetX + randomOffsetX;\r\n const x = rectX + addOffsetX;\r\n // const y = rect.bottom - size + size / 4;\r\n const y = rect.top + ((rect.height - size) / 2) + (side === 'center' ? 0 : randomOffsetY);\r\n // animationDiv.style.transform = `translate(${x}px, ${y}px)`;\r\n animationDiv.style.top = y + 'px';\r\n animationDiv.style.left = x + 'px';\r\n };\r\n\r\n const onScroll = throttleWithRaf(setPosition);\r\n\r\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\r\n\r\n setPosition();\r\n\r\n appImManager.emojiAnimationContainer.append(animationDiv);\r\n\r\n return {animationDiv, stickerPromise};\r\n}\r\n\r\nexport function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic}: {\r\n doc: MyDocument, \r\n div: HTMLElement, \r\n middleware?: () => boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n group?: string, \r\n play?: boolean, \r\n onlyThumb?: boolean,\r\n emoji?: string,\r\n width?: number,\r\n height?: number,\r\n withThumb?: boolean,\r\n loop?: boolean,\r\n loadPromises?: Promise[],\r\n needFadeIn?: boolean,\r\n needUpscale?: boolean,\r\n skipRatio?: number,\r\n static?: boolean\r\n}): Promise {\r\n const stickerType = doc.sticker;\r\n if(stickerType === 1) {\r\n asStatic = true;\r\n }\r\n\r\n if(!width) {\r\n width = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(!height) {\r\n height = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(stickerType === 2) {\r\n //LottieLoader.loadLottie();\r\n LottieLoader.loadLottieWorkers();\r\n }\r\n \r\n if(!stickerType) {\r\n console.error('wrong doc for wrapSticker!', doc);\r\n throw new Error('wrong doc for wrapSticker!');\r\n }\r\n\r\n div.dataset.docId = '' + doc.id;\r\n div.classList.add('media-sticker-wrapper');\r\n\r\n /* if(stickerType === 3) {\r\n const videoRes = wrapVideo({\r\n doc,\r\n boxWidth: width,\r\n boxHeight: height,\r\n container: div,\r\n group,\r\n lazyLoadQueue,\r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n noPlayButton: true,\r\n noInfo: true\r\n });\r\n\r\n if(videoRes.thumb) {\r\n if(videoRes.thumb.images.thumb) {\r\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\r\n }\r\n\r\n if(videoRes.thumb.images.full) {\r\n videoRes.thumb.images.full.classList.add('media-sticker');\r\n }\r\n }\r\n\r\n return videoRes.loadPromise;\r\n } */\r\n \r\n //console.log('wrap sticker', doc, div, onlyThumb);\r\n\r\n let cacheContext: ThumbCache;\r\n if(asStatic && stickerType !== 1) {\r\n const thumb = appPhotosManager.choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\r\n cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\r\n } else {\r\n cacheContext = appDownloadManager.getCacheContext(doc);\r\n }\r\n\r\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\r\n const downloaded = cacheContext.downloaded && !needFadeIn;\r\n\r\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\r\n const isThumbNeededForType = isAnimated;\r\n \r\n let loadThumbPromise = deferredPromise();\r\n let haveThumbCached = false;\r\n if((\r\n doc.thumbs?.length || \r\n doc.stickerCachedThumbs\r\n ) && \r\n !div.firstElementChild && (\r\n !downloaded || \r\n isThumbNeededForType || \r\n onlyThumb\r\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\r\n ) {\r\n let thumb = doc.stickerCachedThumbs && doc.stickerCachedThumbs[toneIndex] || doc.thumbs[0];\r\n \r\n //console.log('wrap sticker', thumb, div);\r\n\r\n let thumbImage: HTMLImageElement;\r\n const afterRender = () => {\r\n if(!div.childElementCount) {\r\n thumbImage.classList.add('media-sticker', 'thumbnail');\r\n \r\n sequentialDom.mutateElement(div, () => {\r\n div.append(thumbImage);\r\n loadThumbPromise.resolve();\r\n });\r\n }\r\n };\r\n\r\n if('url' in thumb) {\r\n thumbImage = new Image();\r\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\r\n haveThumbCached = true;\r\n } else if('bytes' in thumb) {\r\n if(thumb._ === 'photoPathSize') {\r\n if(thumb.bytes.length) {\r\n const d = appPhotosManager.getPathFromPhotoPathSize(thumb);\r\n div.innerHTML = `\r\n \r\n `;\r\n } else {\r\n thumb = doc.thumbs.find(t => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\r\n }\r\n } \r\n \r\n if(thumb && thumb._ !== 'photoPathSize' && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n haveThumbCached = true;\r\n } else {\r\n webpWorkerController.convert('' + doc.id, (thumb as PhotoSize.photoStrippedSize).bytes as Uint8Array).then(bytes => {\r\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\r\n doc.pFlags.stickerThumbConverted = true;\r\n \r\n if(middleware && !middleware()) return;\r\n \r\n if(!div.childElementCount) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n }\r\n }).catch(() => {});\r\n }\r\n }\r\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\r\n thumbImage = new Image();\r\n\r\n const load = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n\r\n const r = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\r\n };\r\n \r\n if(cacheContext.url) {\r\n r();\r\n return Promise.resolve();\r\n } else {\r\n return appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\r\n }\r\n };\r\n \r\n if(lazyLoadQueue && onlyThumb) {\r\n lazyLoadQueue.push({div, load});\r\n return Promise.resolve();\r\n } else {\r\n load();\r\n\r\n if((thumb as any).url) {\r\n haveThumbCached = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(loadPromises && haveThumbCached) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n if(onlyThumb) { // for sticker panel\r\n return Promise.resolve();\r\n }\r\n \r\n const load = async() => {\r\n if(middleware && !middleware()) return;\r\n\r\n if(stickerType === 2 && !asStatic) {\r\n /* if(doc.id === '1860749763008266301') {\r\n console.log('loaded sticker:', doc, div);\r\n } */\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 500));\r\n //return;\r\n\r\n //console.time('download sticker' + doc.id);\r\n\r\n //appDocsManager.downloadDocNew(doc.id).promise.then(res => res.json()).then(async(json) => {\r\n //fetch(doc.url).then(res => res.json()).then(async(json) => {\r\n return await appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId)\r\n .then(async(blob) => {\r\n //console.timeEnd('download sticker' + doc.id);\r\n //console.log('loaded sticker:', doc, div/* , blob */);\r\n if(middleware && !middleware()) {\r\n throw new Error('wrapSticker 2 middleware');\r\n }\r\n\r\n let animation = await LottieLoader.loadAnimationWorker({\r\n container: div,\r\n loop: loop && !emoji,\r\n autoplay: play,\r\n animationData: blob,\r\n width,\r\n height,\r\n name: 'doc' + doc.id,\r\n needUpscale,\r\n skipRatio,\r\n toneIndex\r\n }, group, middleware);\r\n\r\n //const deferred = deferredPromise();\r\n \r\n animation.addEventListener('firstFrame', () => {\r\n const element = div.firstElementChild;\r\n if(needFadeIn !== false) {\r\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\r\n }\r\n\r\n const cb = () => {\r\n if(element && element !== animation.canvas) {\r\n element.remove();\r\n }\r\n };\r\n\r\n if(!needFadeIn) {\r\n if(element) {\r\n sequentialDom.mutate(cb);\r\n }\r\n } else {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.add('fade-in');\r\n if(element) {\r\n element.classList.add('fade-out');\r\n }\r\n \r\n animation.canvas.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.remove('fade-in');\r\n cb();\r\n });\r\n }, {once: true});\r\n });\r\n }\r\n\r\n if(withThumb !== false) {\r\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\r\n }\r\n\r\n //deferred.resolve();\r\n }, {once: true});\r\n \r\n if(emoji) {\r\n const data: SendMessageEmojiInteractionData = {\r\n a: [],\r\n v: 1\r\n };\r\n\r\n let sendInteractionThrottled: () => void;\r\n\r\n appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\r\n\r\n attachClickEvent(div, async(e) => {\r\n cancelEvent(e);\r\n const animation = LottieLoader.getAnimation(div);\r\n \r\n if(animation.paused) {\r\n const doc = appStickersManager.getAnimatedEmojiSoundDocument(emoji);\r\n if(doc) {\r\n const audio = document.createElement('audio');\r\n audio.style.display = 'none';\r\n div.parentElement.append(audio);\r\n\r\n try {\r\n await appDocsManager.downloadDoc(doc);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n audio.src = cacheContext.url;\r\n audio.play();\r\n await onMediaLoad(audio, undefined, true);\r\n \r\n audio.addEventListener('ended', () => {\r\n audio.src = '';\r\n audio.remove();\r\n }, {once: true});\r\n } catch(err) {\r\n \r\n }\r\n }\r\n\r\n animation.autoplay = true;\r\n animation.restart();\r\n }\r\n\r\n const peerId = appImManager.chat.peerId;\r\n if(!peerId.isUser()) {\r\n return;\r\n }\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji, true);\r\n if(!doc) {\r\n return;\r\n }\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n const isOut = bubble.classList.contains('is-out');\r\n\r\n const {animationDiv} = wrapStickerAnimation({\r\n doc,\r\n middleware,\r\n side: isOut ? 'right' : 'left',\r\n size: 280,\r\n target: div,\r\n play: true\r\n });\r\n\r\n if(bubble) {\r\n if(isOut) {\r\n animationDiv.classList.add('is-out');\r\n } else {\r\n animationDiv.classList.add('is-in');\r\n }\r\n }\r\n\r\n if(!sendInteractionThrottled) {\r\n sendInteractionThrottled = throttle(() => {\r\n const length = data.a.length;\r\n if(!length) {\r\n return;\r\n }\r\n \r\n const firstTime = data.a[0].t;\r\n \r\n data.a.forEach((a) => {\r\n a.t = (a.t - firstTime) / 1000;\r\n });\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n appMessagesManager.setTyping(appImManager.chat.peerId, {\r\n _: 'sendMessageEmojiInteraction',\r\n msg_id: appMessagesIdsManager.getServerMessageId(+bubble.dataset.mid),\r\n emoticon: emoji,\r\n interaction: {\r\n _: 'dataJSON',\r\n data: JSON.stringify(data)\r\n }\r\n }, true);\r\n \r\n data.a.length = 0;\r\n }, 1000, false);\r\n }\r\n\r\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\r\n if(e.isTrusted) {\r\n data.a.push({\r\n i: 1,\r\n t: Date.now()\r\n });\r\n \r\n sendInteractionThrottled();\r\n }\r\n });\r\n }\r\n\r\n return animation;\r\n\r\n //return deferred;\r\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\r\n });\r\n\r\n //console.timeEnd('render sticker' + doc.id);\r\n } else if(asStatic || stickerType === 3) {\r\n let media: HTMLElement;\r\n if(asStatic) {\r\n media = new Image();\r\n } else {\r\n media = document.createElement('video');\r\n media.setAttribute('playsinline', 'true');\r\n (media as HTMLVideoElement).muted = true;\r\n\r\n if(play) {\r\n (media as HTMLVideoElement).autoplay = true;\r\n (media as HTMLVideoElement).loop = true;\r\n }\r\n }\r\n\r\n const thumbImage = div.firstElementChild !== media && div.firstElementChild;\r\n if(needFadeIn !== false) {\r\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage : (!thumbImage || thumbImage.tagName === 'svg'))) && rootScope.settings.animationsEnabled;\r\n }\r\n\r\n media.classList.add('media-sticker');\r\n\r\n if(needFadeIn) {\r\n media.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const r = () => {\r\n if(middleware && !middleware()) return resolve();\r\n \r\n const onLoad = () => {\r\n sequentialDom.mutateElement(div, () => {\r\n div.append(media);\r\n if(thumbImage) {\r\n thumbImage.classList.add('fade-out');\r\n }\r\n\r\n if(stickerType === 3 && !appDocsManager.isSavingLottiePreview(doc, toneIndex)) {\r\n // const perf = performance.now();\r\n assumeType(media);\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width * window.devicePixelRatio;\r\n canvas.height = height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(media, 0, 0, canvas.width, canvas.height);\r\n appDocsManager.saveLottiePreview(doc, canvas, toneIndex);\r\n // console.log('perf', performance.now() - perf);\r\n }\r\n\r\n if(stickerType === 3 && group) {\r\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\r\n }\r\n\r\n resolve();\r\n\r\n if(needFadeIn) {\r\n media.addEventListener('animationend', () => {\r\n media.classList.remove('fade-in');\r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n };\r\n\r\n if(asStatic) {\r\n renderImageFromUrl(media, cacheContext.url, onLoad);\r\n } else {\r\n (media as HTMLVideoElement).src = cacheContext.url;\r\n onMediaLoad(media as HTMLVideoElement).then(onLoad);\r\n }\r\n };\r\n\r\n if(cacheContext.url) r();\r\n else {\r\n let promise: Promise;\r\n if(stickerType === 2 && asStatic) {\r\n const thumb = appPhotosManager.choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\r\n promise = appDocsManager.getThumbURL(doc, thumb).promise\r\n } else {\r\n promise = appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId);\r\n }\r\n \r\n promise.then(r, resolve);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || isAnimated) ? \r\n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \r\n load();\r\n\r\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\r\n loadThumbPromise = loadPromise as any;\r\n if(loadPromises) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n }\r\n\r\n return loadPromise;\r\n}\r\n\r\nexport async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height}: {\r\n set: StickerSet.stickerSet,\r\n lazyLoadQueue: LazyLoadQueue,\r\n container: HTMLElement,\r\n group: string,\r\n autoplay: boolean,\r\n width: number,\r\n height: number\r\n}) {\r\n if(set.thumbs?.length) {\r\n container.classList.add('media-sticker-wrapper');\r\n lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n const downloadOptions = appStickersManager.getStickerSetThumbDownloadOptions(set);\r\n const promise = appDownloadManager.download(downloadOptions);\r\n\r\n if(set.pFlags.animated && !set.pFlags.videos) {\r\n return promise\r\n .then((blob) => {\r\n lottieLoader.loadAnimationWorker({\r\n container,\r\n loop: true,\r\n autoplay,\r\n animationData: blob,\r\n width,\r\n height,\r\n needUpscale: true,\r\n name: 'setThumb' + set.id\r\n }, group);\r\n });\r\n } else {\r\n let media: HTMLElement;\r\n if(set.pFlags.videos) {\r\n media = document.createElement('video');\r\n media.setAttribute('playsinline', 'true');\r\n (media as HTMLVideoElement).autoplay = true;\r\n (media as HTMLVideoElement).muted = true;\r\n (media as HTMLVideoElement).loop = true;\r\n } else {\r\n media = new Image();\r\n }\r\n\r\n media.classList.add('media-sticker');\r\n \r\n return promise.then(blob => {\r\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\r\n container.append(media);\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n const stickerSet = await promise;\r\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\r\n wrapSticker({\r\n doc: stickerSet.documents[0],\r\n div: container, \r\n group: group,\r\n lazyLoadQueue\r\n }); // kostil\r\n }\r\n}\r\n\r\nexport function wrapStickerToRow({doc, row, size}: {\r\n doc: MyDocument,\r\n row: Row,\r\n size?: 'small' | 'large',\r\n}) {\r\n const previousMedia = row.media;\r\n const media = row.createMedia('small');\r\n\r\n if(previousMedia) {\r\n media.classList.add('hide');\r\n }\r\n\r\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\r\n\r\n const _size = size === 'small' ? 32 : 48;\r\n const result = wrapSticker({\r\n div: media,\r\n doc: doc,\r\n width: _size,\r\n height: _size,\r\n loadPromises\r\n });\r\n\r\n loadPromises && Promise.all(loadPromises).then(() => {\r\n media.classList.remove('hide');\r\n previousMedia.remove();\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport function wrapLocalSticker({emoji, width, height}: {\r\n doc?: MyDocument,\r\n url?: string,\r\n emoji?: string,\r\n width: number,\r\n height: number,\r\n}) {\r\n const container = document.createElement('div');\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: container,\r\n loop: false,\r\n play: true,\r\n width,\r\n height,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n return {container};\r\n}\r\n\r\nexport function wrapReply(title: Parameters[0], subtitle: Parameters[1], message?: any) {\r\n const replyContainer = new ReplyContainer('reply');\r\n replyContainer.fill(title, subtitle, message);\r\n /////////console.log('wrapReply', title, subtitle, media);\r\n return replyContainer.container;\r\n}\r\n\r\nexport function prepareAlbum(options: {\r\n container: HTMLElement,\r\n items: {w: number, h: number}[],\r\n maxWidth: number,\r\n minWidth: number,\r\n spacing: number,\r\n maxHeight?: number,\r\n forMedia?: true\r\n}) {\r\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\r\n const layout = layouter.layout();\r\n\r\n const widthItem = layout.find(item => item.sides & RectPart.Right);\r\n const width = widthItem.geometry.width + widthItem.geometry.x;\r\n\r\n const heightItem = layout.find(item => item.sides & RectPart.Bottom);\r\n const height = heightItem.geometry.height + heightItem.geometry.y;\r\n\r\n const container = options.container;\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n const children = container.children;\r\n\r\n layout.forEach(({geometry, sides}, idx) => {\r\n let div: HTMLElement;\r\n div = children[idx] as HTMLElement;\r\n if(!div) {\r\n div = document.createElement('div');\r\n container.append(div);\r\n }\r\n\r\n div.classList.add('album-item', 'grouped-item');\r\n\r\n div.style.width = (geometry.width / width * 100) + '%';\r\n div.style.height = (geometry.height / height * 100) + '%';\r\n div.style.top = (geometry.y / height * 100) + '%';\r\n div.style.left = (geometry.x / width * 100) + '%';\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Top) {\r\n div.style.borderTopLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\r\n div.style.borderBottomLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Top) {\r\n div.style.borderTopRightRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\r\n div.style.borderBottomRightRadius = 'inherit';\r\n }\r\n\r\n if(options.forMedia) {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n div.append(mediaDiv);\r\n }\r\n\r\n // @ts-ignore\r\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\r\n });\r\n\r\n /* if(options.forMedia) {\r\n layout.forEach((_, i) => {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n options.container.children[i].append(mediaDiv);\r\n });\r\n } */\r\n}\r\n\r\nexport function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload}: {\r\n groupId: string, \r\n attachmentDiv: HTMLElement,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n uploading?: boolean,\r\n isOut: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n autoDownload?: ChatAutoDownloadSettings,\r\n}) {\r\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\r\n\r\n // !lowest msgID will be the FIRST in album\r\n const storage = appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of storage) {\r\n const m = chat.getMessage(mid);\r\n const media = m.media.photo || m.media.document;\r\n\r\n const size: any = media._ === 'photo' ? appPhotosManager.choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\r\n items.push({size, media, message: m});\r\n }\r\n\r\n /* // * pending\r\n if(storage[0] < 0) {\r\n items.reverse();\r\n } */\r\n\r\n prepareAlbum({\r\n container: attachmentDiv,\r\n items: items.map(i => ({w: i.size.w, h: i.size.h})),\r\n maxWidth: mediaSizes.active.album.width,\r\n minWidth: 100,\r\n spacing: 2,\r\n forMedia: true\r\n });\r\n\r\n items.forEach((item, idx) => {\r\n const {size, media, message} = item;\r\n\r\n const div = attachmentDiv.children[idx] as HTMLElement;\r\n div.dataset.mid = '' + message.mid;\r\n div.dataset.peerId = '' + message.peerId;\r\n const mediaDiv = div.firstElementChild as HTMLElement;\r\n const isPhoto = media._ === 'photo';\r\n if(isPhoto) {\r\n wrapPhoto({\r\n photo: media,\r\n message,\r\n container: mediaDiv,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n size,\r\n loadPromises,\r\n autoDownloadSize: autoDownload.photo\r\n });\r\n } else {\r\n wrapVideo({\r\n doc: message.media.document,\r\n container: mediaDiv,\r\n message,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n autoDownload\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch}: {\r\n albumMustBeRenderedFull: boolean,\r\n message: any,\r\n messageDiv: HTMLElement,\r\n bubble: HTMLElement,\r\n uploading?: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n searchContext?: MediaSearchContext,\r\n useSearch?: boolean,\r\n}) {\r\n let nameContainer: HTMLElement;\r\n const mids = albumMustBeRenderedFull ? chat.getMidsByMid(message.mid) : [message.mid];\r\n /* if(isPending) {\r\n mids.reverse();\r\n } */\r\n\r\n mids.forEach((mid, idx) => {\r\n const message = chat.getMessage(mid);\r\n const div = wrapDocument({\r\n message,\r\n loadPromises,\r\n autoDownloadSize,\r\n lazyLoadQueue,\r\n searchContext\r\n });\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('document-container');\r\n container.dataset.mid = '' + mid;\r\n container.dataset.peerId = '' + message.peerId;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.classList.add('document-wrapper');\r\n \r\n if(message.message) {\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('document-message');\r\n\r\n const richText = RichTextProcessor.wrapRichText(message.message, {\r\n entities: message.totalEntities\r\n });\r\n\r\n messageDiv.innerHTML = richText;\r\n wrapper.append(messageDiv);\r\n }\r\n\r\n if(mids.length > 1) {\r\n const selection = document.createElement('div');\r\n selection.classList.add('document-selection');\r\n container.append(selection);\r\n \r\n container.classList.add('grouped-item');\r\n\r\n if(idx === 0) {\r\n nameContainer = wrapper;\r\n }\r\n }\r\n\r\n wrapper.append(div);\r\n container.append(wrapper);\r\n messageDiv.append(container);\r\n });\r\n\r\n if(mids.length > 1) {\r\n bubble.classList.add('is-multiple-documents', 'is-grouped');\r\n }\r\n\r\n return nameContainer;\r\n}\r\n\r\nexport function wrapPoll(message: any) {\r\n const elem = new PollElement();\r\n elem.message = message;\r\n elem.setAttribute('peer-id', '' + message.peerId);\r\n elem.setAttribute('poll-id', message.media.poll.id);\r\n elem.setAttribute('message-id', '' + message.mid);\r\n elem.render();\r\n return elem;\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 whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\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 insertInDescendSortedArray from \"./array/insertInDescendSortedArray\";\nimport { getMiddleware } from \"./middleware\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach(element => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(id: SortedElementId, batch = false, updateElementWith?: SortedList['updateElementWith'], updateBatch = batch) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public update(id: SortedElementId, batch = false, element = this.get(id), updateElementWith?: SortedList['updateElementWith']) {\n if(!element) {\n return;\n }\n\n element.index = this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\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 { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\nimport appDialogsManager, { AppDialogsManager, DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\nimport safeAssign from \"../helpers/object/safeAssign\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> = {}) {\n super({\n getIndex: options.getIndex || ((element) => appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || ((element) => {\n const status = appUsersManager.getUserStatusString(element.id);\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\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 SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport { cancelEvent } from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\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 { cancelContextMenuOpening } from \"../../components/misc\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\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 appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\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 appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\n\nexport default class PopupDeleteMessages {\n constructor(peerId: PeerId, mids: number[], type: ChatType, onConfirm?: () => void) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = appChatsManager.getChat(peerId.toChatId());\n\n const hasRights = appChatsManager.hasRights(peerId.toChatId(), 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = hasRights ? mids.slice() : mids.filter(mid => {\n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\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 appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { PopupButton } from \".\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n let title: string, description: string, buttons: PopupButton[] = [];\n\n title = `Send Message${mids.length > 1 ? 's' : ''} Now`;\n description = mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?';\n\n const callback = () => {\n onConfirm && onConfirm();\n appMessagesManager.sendScheduledMessages(peerId, mids);\n };\n\n buttons.push({\n langKey: 'Send',\n callback\n });\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n title,\n description,\n buttons\n });\n\n popup.show();\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\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachContextMenuListener } from \"../misc\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n//const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected appMessagesManager: AppMessagesManager;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n\n constructor(options: {\n appMessagesManager: AppMessagesManager,\n listenElement: HTMLElement,\n listenerSetter: ListenerSetter,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(this.listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n this.listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, this.listenerSetter);\n\n return;\n }\n\n const getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n this.listenerSetter.add(this.listenElement)('mousedown', (e) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n \n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(!seenSet.has(mid)) {\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach(element => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n });\n }\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storage = this.isScheduled ? this.appMessagesManager.getScheduledMessagesStorage(peerId) : this.appMessagesManager.getMessagesStorage(peerId);\n for(const mid of mids) {\n const message = this.appMessagesManager.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.appMessagesManager.canForward(message);\n }\n \n if(!cantDelete) {\n cantDelete = !this.appMessagesManager.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = (doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n if(diff < 0) {\n toast(I18n.format('Chat.Selection.LimitToast', true));\n return false;\n /* const it = this.selectedMids.values();\n do {\n const mid = it.next().value;\n const mounted = this.appImManager.getMountedBubble(mid);\n if(mounted) {\n this.toggleByBubble(mounted.bubble);\n } else {\n const mids = this.appMessagesManager.getMidsByMid(mid);\n for(const mid of mids) {\n this.selectedMids.delete(mid);\n }\n }\n } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach(mid => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: searchSuper.container,\n listenerSetter: new ListenerSetter(),\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach(element => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', () => this.cancelSelection(), {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n rootScope.dispatchEvent('history_focus', {\n peerId,\n mid\n });\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(private chat: Chat, private bubbles: ChatBubbles, private input: ChatInput, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: bubbles.bubblesContainer,\n listenerSetter: bubbles.listenerSetter,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach(item => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement) => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.bubbles.peerId);\n if(set) {\n const mids = this.chat.getMidsByMid(mid);\n mids.forEach(mid => set.delete(mid));\n }\n }\n\n this.bubbles.getBubbleGroupedItems(bubble).forEach(this.toggleByElement);\n return;\n }\n\n if(!this.toggleMid(this.bubbles.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(mid);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.bubbles.peerId, mid));\n };\n\n protected toggleByMid = (peerId: PeerId, mid: number) => {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(+element.dataset.mid));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected isGroupedMidsSelected(mid: number) {\n const mids = this.chat.getMidsByMid(mid);\n const selectedMids = mids.filter(mid => this.isMidSelected(this.bubbles.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && \n !bubble.classList.contains('is-outgoing') && \n !bubble.classList.contains('bubble-first') && \n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = this.chat.input.center(animate);\n\n SetTransition(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n this.selectionLeft = \n this.selectionRight = \n null;\n this.selectedText = undefined;\n }\n \n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n });\n\n //const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n \n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = () => {\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n //this.toggleByBubble(mounted.message.grouped_id ? mounted.bubble.querySelector(`.grouped-item[data-mid=\"${mid}\"]`) : mounted.bubble);\n this.toggleByElement(mounted.bubble);\n }\n /* const bubble = this.appImManager.bubbles[mid];\n if(bubble) {\n this.toggleByBubble(bubble);\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\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\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 appChatsManager from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport { logger } from \"../lib/logger\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { attachContextMenuListener, openBtnMenu, positionMenu, putPreloader } from \"./misc\";\nimport { ripple } from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants, Message, MessageMedia, Photo, WebPage } from \"../layer\";\nimport SortedUserList from \"./sortedUserList\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appSidebarRight from \"./sidebarRight\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport cleanSearchText from \"../helpers/cleanSearchText\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport handleTabSwipe from \"../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../helpers/windowSize\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupForward from \"./popups/forward\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport Row from \"./row\";\nimport htmlToDocumentFragment from \"../helpers/dom/htmlToDocumentFragment\";\nimport { SearchSelection } from \"./chat/selection\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, simulateClickEvent } from \"../helpers/dom/clickEvent\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport AppMediaViewer from \"./appMediaViewer\";\nimport lockTouchScroll from \"../helpers/dom/lockTouchScroll\";\nimport copy from \"../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../helpers/object/getObjectKeysAndSort\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport escapeRegExp from \"../helpers/string/escapeRegExp\";\nimport limitSymbols from \"../helpers/string/limitSymbols\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n this.buttons.forEach(button => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n });\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: () => appMessagesManager.canForward(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => appMessagesManager.canDeleteMessage(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n rootScope.dispatchEvent('history_focus', {\n peerId: this.peerId,\n mid: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message, \n middleware: () => boolean, \n promises: Promise[], \n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n \n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n public urlsToRevoke: string[] = [];\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n \n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, appMessagesManager);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && !this.loaded[this.mediaTab.inputFilter]/* && false */) {\n //this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n //this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n return;\n }\n \n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n \n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = (className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map(el => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map(k => +k).sort((a, b) => a - b);\n const idx = targets.findIndex(item => item.mid === mid && item.peerId === peerId);\n \n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n if(type === 'inputMessagesFilterEmpty') return messages;\n\n if(type !== 'inputMessagesFilterUrl') {\n messages = messages.filter(message => !!message.media);\n }\n\n /* if(!this.peerId) {\n messages = messages.filter(message => {\n if(message.peerId === rootScope.myId) {\n return true;\n }\n\n const dialog = appMessagesManager.getDialogByPeerId(message.fromId)[0];\n return dialog && dialog.folder_id === 0;\n });\n } */\n\n let filtered: any[] = [];\n\n switch(type) {\n case 'inputMessagesFilterPhotoVideo': {\n for(let message of messages) {\n let media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n if(!media) {\n //this.log('no media!', message);\n continue;\n }\n \n if(media._ === 'document' && media.type !== 'video'/* && media.type !== 'gif' */) {\n //this.log('broken video', media);\n continue;\n }\n\n filtered.push(message);\n }\n \n break;\n }\n\n case 'inputMessagesFilterDocument': {\n for(let message of messages) {\n if(!message.media.document || ['voice', 'audio', 'gif', 'sticker', 'round'].includes(message.media.document.type)) {\n continue;\n }\n \n filtered.push(message);\n }\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n //this.log('inputMessagesFilterUrl', messages);\n for(let message of messages) {\n //if((message.media.webpage && message.media.webpage._ !== 'webPageEmpty')) {\n filtered.push(message);\n //}\n }\n \n break;\n }\n\n case 'inputMessagesFilterMusic': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'audio') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterVoice': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'voice') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterRoundVoice': {\n for(let message of messages) {\n if(!message.media.document || !(['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n default:\n break;\n }\n\n return filtered;\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: message.peerId, \n container: searchGroup.list, \n drawStatus: false,\n avatarSize: 54\n });\n\n appDialogsManager.setLastMessage(dialog, message, dom, this.searchContext.query);\n }\n\n private processPhotoVideoFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: ReturnType;\n const size = appPhotosManager.choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n }).thumb;\n } else {\n wrapped = wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach(image => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n elemsToAppend.push({element: div, message});\n }\n\n private processDocumentFilter({message, elemsToAppend, inputFilter}: ProcessSearchSuperResult) {\n const document = appMessagesManager.getMediaFromMessage(message);\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n const div = wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n elemsToAppend.push({element: div, message});\n }\n\n private processUrlFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n let webpage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage;\n\n if(!webpage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = RichTextProcessor.matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n //display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webpage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webpage.description = message.message;\n webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\n }\n }\n\n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: appPhotosManager.choosePhotoSize(webpage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\n const aFragment = htmlToDocumentFragment(RichTextProcessor.wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', appMessagesManager.wrapSenderToPeer(message));\n }\n \n if(!title) {\n //title = new URL(webpage.url).hostname;\n title = RichTextProcessor.wrapPlainText(webpage.display_url.split('/', 1)[0]);\n }\n\n const row = new Row({\n title,\n titleRight: appMessagesManager.wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n elemsToAppend.push({element: row.container, message});\n }\n }\n \n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n \n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n for(const message of messages) {\n try {\n options.message = message;\n processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n }\n }\n \n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach(details => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach(child => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.forEach((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const peer = appPeersManager.getPeer(peerId);\n \n //////////this.log('contacts peer', peer);\n \n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId, \n container: group.list, \n drawStatus: false,\n avatarSize: 48,\n autonomous: group.autonomous\n });\n \n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(appProfileManager.getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n \n appMessagesManager.getConversations(query, 0, 20, 0).promise\n .then(onLoad)\n .then(value => {\n if(value) {\n setResults(value.dialogs.map(d => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return appStateManager.getState().then(state => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(peerId => {\n let {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.searchGroups.recent.list,\n drawStatus: false,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(peerId.isUser() ? appUsersManager.getUserStatusString(peerId) : appProfileManager.getChatMembersString(peerId.toChatId()));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n appUsersManager.getTopPeers('correspondents').then(peers => {\n if(!middleware()) return;\n\n const idx = peers.findIndex(peer => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n dialog: peer.id, \n container: this.searchGroups.people.list, \n drawStatus: false,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({lazyLoadQueue: this.lazyLoadQueue, rippleEnabled: false});\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, 'LI');\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n participants.forEach(participant => {\n const peerId = appChatsManager.getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n return;\n }\n\n const user = appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n return;\n }\n\n this.membersList.add(peerId);\n });\n };\n\n if(appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then(participants => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = Promise.resolve(appProfileManager.getChatFull(id)).then(chatFull => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const logStr = 'load [' + type + ']: ';\n\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n //this.log(logStr + 'will render from cache', used, history, ids, loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n messages.push(...this.filterMessagesByType(ids.map(m => appMessagesManager.getMessageByPeer(m.peerId, m.mid)), type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n\n return Promise.resolve();\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n \n //this.log(logStr + 'search house of glass pre', type, maxId);\n \n //let loadCount = history.length ? 50 : 15;\n return this.loadPromises[type] = appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ?? (this.nextRates[type] = 0)\n }).then(value => {\n history.push(...value.history.map(m => ({mid: m.mid, peerId: m.peerId})));\n \n this.log(logStr + 'search house of glass', type, value);\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return Promise.resolve();\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n (this.loadPromises[type] || Promise.resolve()).then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch(err => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n }\n \n public async load(single = false, justLoad = false) {\n // if(testScroll/* || 1 === 1 */) {\n // return;\n // }\n\n //return;\n \n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n if(this.hideEmptyTabs) {\n const mediaTabs = this.mediaTabs.filter(mediaTab => mediaTab.inputFilter !== 'inputMessagesFilterEmpty')\n const filters = mediaTabs.map(mediaTab => ({_: mediaTab.inputFilter}));\n\n const counters = await appMessagesManager.getSearchCounters(peerId, filters);\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach(mediaTab => {\n const counter = counters.find(c => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count && firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n if(counter.count) ++count;\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n const canViewMembers = this.canViewMembers();\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter(t => t !== this.mediaTab);\n toLoad = toLoad.filter(mediaTab => {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n });\n\n if(peerId.isUser()) {\n toLoad.findAndSplice(mediaTab => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map(mediaTab => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware)\n });\n\n return Promise.all(promises).catch(err => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return this.searchContext.peerId.isAnyChat() && !appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()) && appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants');\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach(mediaTab => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach(mediaTab => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach(url => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\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 { cancelEvent } from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\n\r\nexport enum PrivacyType {\r\n Everybody = 2,\r\n Contacts = 1,\r\n Nobody = 0\r\n}\r\n\r\nexport class AppPrivacyManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map(inputRule => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacyRulesDetails(rules: PrivacyRule[]) {\r\n const types: PrivacyType[] = [];\r\n\r\n type peers = {users: UserId[], chats: ChatId[]};\r\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\r\n rules.forEach(rule => {\r\n switch(rule._) {\r\n case 'privacyValueAllowAll':\r\n types.push(2);\r\n break;\r\n case 'privacyValueDisallowAll':\r\n types.push(0);\r\n break;\r\n case 'privacyValueAllowContacts': \r\n types.push(1);\r\n break;\r\n /* case 'privacyValueDisallowContacts':\r\n types.push('Except My Contacts');\r\n break; */\r\n case 'privacyValueAllowChatParticipants':\r\n allowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueAllowUsers':\r\n allowPeers.users.push(...rule.users);\r\n break;\r\n case 'privacyValueDisallowChatParticipants':\r\n disallowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueDisallowUsers':\r\n disallowPeers.users.push(...rule.users);\r\n break;\r\n }\r\n });\r\n\r\n return {type: types[0], disallowPeers, allowPeers};\r\n }\r\n}\r\n\r\nconst appPrivacyManager = new AppPrivacyManager();\r\nMOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;\r\nexport default appPrivacyManager;\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 replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../lib/appManagers/appPrivacyManager\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey]\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter(r => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n new AppAddMembersTab(options.tab.slider).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = appPrivacyManager.getPrivacy(options.inputKey).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach(k => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map(id => id.toPeerId()));\r\n arr.push(...from.chats.map(id => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', () => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>).forEach(([k, chatKey, usersKey], idx) => {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({_: usersKey, users: splitted.users.map(id => appUsersManager.getUserInput(id))});\r\n }\r\n }\r\n });\r\n }\r\n \r\n appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else if(caption instanceof HTMLElement) {\r\n replaceContent(captionElement, caption);\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach(peerId => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\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 { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection, { PrivacySectionStr } from \"../../../privacySection\";\r\nimport { i18n, LangPackKey } from \"../../../../lib/langPack\";\r\nimport anchorCopy from \"../../../../helpers/dom/anchorCopy\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const captionEl = document.createElement('div');\r\n captionEl.append(\r\n i18n('PrivacyPhoneInfo'), \r\n document.createElement('br'), \r\n document.createElement('br'), \r\n i18n('PrivacyPhoneInfo4'),\r\n document.createElement('br'),\r\n anchorCopy({\r\n mePath: '+380509144504'\r\n })\r\n );\r\n\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [captionEl, captionEl, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n }\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\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 { toastNew } from \"../../components/toast\";\nimport { copyTextToClipboard } from \"../clipboard\";\nimport { cancelEvent } from \"./cancelEvent\";\nimport { attachClickEvent } from \"./clickEvent\";\n\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n if(options.mePath) {\n const href = 'https://t.me/' + options.mePath;\n anchor.href = anchor.innerText = href;\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(anchor.href);\n toastNew({langPackKey: 'LinkCopied'});\n });\n\n return anchor;\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 { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: true,\r\n play: true,\r\n width: 160,\r\n height: 160\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\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_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n passwordManager.confirmPasswordEmail('' + code)\r\n .then(value => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch(err => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n passwordManager.cancelPasswordEmail().then(value => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n passwordManager.resendPasswordEmail().then(value => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = RichTextProcessor.matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationHintTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\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 AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return passwordManager.getState().then(_state => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n passwordInputField.label.innerHTML = RichTextProcessor.wrapEmojiText(this.state.hint);\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n passwordManager.check(passwordInputField.value, this.state).then(auth => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = new AppTwoStepVerificationTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\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 { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport { toast } from \"../../toast\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = authorizations.findAndSplice(auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n apiManager.invokeApi('auth.resetAuthorizations').then(value => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n \r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach(auth => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then(value => {\r\n if(value) {\r\n target.remove();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\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 { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n {\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n this.scrollable.append(list);\r\n\r\n const add = (peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, 'LI');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then(res => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\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 { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../../../lib/appManagers/appPrivacyManager\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport passwordManager from \"../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport appDraftsManager from \"../../../lib/appManagers/appDraftsManager\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppBlockedUsersTab(this.slider);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = new AppTwoStepVerificationTab(this.slider);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.updateActiveSessions();\r\n }, {once: true});\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice(p => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n appUsersManager.getBlocked().then(res => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n passwordManager.getState().then(state => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyPhoneNumberTab(this.slider).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyLastSeenTab(this.slider).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyProfilePhotoTab(this.slider).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyCallsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyForwardMessagesTab(this.slider).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyAddToGroupsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n appPrivacyManager.getPrivacy(key).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(\r\n numberVisibilityRow.container, \r\n lastSeenTimeRow.container, \r\n photoVisibilityRow.container, \r\n callRow.container, \r\n linkAccountRow.container, \r\n groupChatsAddRow.container\r\n );\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(apiManager.invokeApi('account.getContentSettings').then(settings => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then(drafts => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n apiManager.invokeApi('account.getAuthorizations').then(auths => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\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 renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\r\n const context = canvas.getContext('2d');\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n return outPixel;\r\n}\r\n\r\nexport function averageColor(imageUrl: string) {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n resolve(averageColorFromCanvas(canvas));\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 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, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let 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","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\nimport { hexToRgb } from \"../../helpers/color\";\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n /* private readonly _curve = [ \n 0, 25, 50, 75, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, \n 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1830, 1860, 1890, 1920, \n 1950, 1980, 2010, 2040, 2070, 2100, 2130, 2160, 2190, 2220, 2250, 2280, 2310, \n 2340, 2370, 2400, 2430, 2460, 2490, 2520, 2550, 2580, 2610, 2630, 2640, 2650, \n 2660, 2670, 2680, 2690, 2700\n ]; */\n private readonly _curve = [\n 0 , 0.25 , 0.50 , 0.75 , 1 , 1.5 , 2 , 2.5 , 3 , 3.5 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ,\n 13 , 14 , 15 , 16 , 17 , 18 , 18.3 , 18.6 , 18.9 , 19.2 , 19.5 , 19.8 , 20.1 , 20.4 , 20.7 ,\n 21.0 , 21.3 , 21.6 , 21.9 , 22.2 , 22.5 , 22.8 , 23.1 , 23.4 , 23.7 , 24.0 , 24.3 , 24.6 ,\n 24.9 , 25.2 , 25.5 , 25.8 , 26.1 , 26.3 , 26.4 , 26.5 , 26.6 , 26.7 , 26.8 , 26.9 , 27 ,\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n { x: 0.80, y: 0.10 },\n { x: 0.60, y: 0.20 },\n { x: 0.35, y: 0.25 },\n { x: 0.25, y: 0.60 },\n { x: 0.20, y: 0.90 },\n { x: 0.40, y: 0.80 },\n { x: 0.65, y: 0.75 },\n { x: 0.75, y: 0.40 }\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n while(shift > 0) {\n positions.push(positions.shift());\n --shift;\n }\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n \n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax,\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n \n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n \n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private drawOnWheel = () => {\n let diff = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n diff = diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n if(diff) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = () => {\n const frames = this._frames;\n const id = frames.shift();\n if(id) {\n this.drawImageData(id);\n }\n \n const leftLength = frames.length;\n if(!leftLength) {\n this._animatingToNextPosition = undefined;\n }\n\n return !!leftLength;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map(color => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d');\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d');\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n \n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition() {\n if(this._colors.length < 2) {\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n \n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n \n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n \n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animate(this.drawNextPositionAnimated);\n }\n\n public scrollAnimate(start?: boolean) {\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","import { ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla } from \"../helpers/color\";\r\nimport attachGrabListeners from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\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 { SettingSection } from \"..\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStateManager, { Theme } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach(color => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n \r\n background.id = '2';\r\n background.intensity = 0;\r\n background.slug = '';\r\n background.color = hex.toLowerCase();\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n const color = (background.color || '').split(',')[0];\r\n const isColored = !!color && !background.slug;\r\n \r\n // * set active if type is color\r\n if(isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(color || '#cccccc');\r\n \r\n if(!isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\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 { generateSection } from \"..\";\r\nimport { averageColor, averageColorFromCanvas } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { requestFile } from \"../../../helpers/files\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport ChatBackgroundGradientRenderer from \"../../chat/gradientRenderer\";\r\nimport { AccountWallPapers, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager, { DownloadBlob } from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appPhotosManager from \"../../../lib/appManagers/appPhotosManager\";\r\nimport appStateManager, { Theme, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\n\r\nlet uploadTempId = 0;\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private theme: Theme;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n private wallpapersByElement: Map = new Map();\r\n private elementsByKey: Map = new Map();\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n new AppBackgroundColorTab(this.slider).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', () => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n const wallpaper = this.wallpapersByElement.get(active);\r\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\r\n return;\r\n }\r\n \r\n this.setBackgroundDocument(wallpaper);\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\r\n const wallpapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallpapers.forEach((wallpaper) => {\r\n this.addWallPaper(wallpaper);\r\n });\r\n\r\n //console.log(accountWallpapers);\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(file => {\r\n const id = 'wallpaper-upload-' + ++uploadTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: 'full',\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = appDocsManager.saveDoc(document);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = URL.createObjectURL(file);\r\n\r\n let wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n const upload = appDownloadManager.upload(file, file.name);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = upload.addNotifyListener;\r\n deferred.cancel = upload.cancel;\r\n\r\n upload.then(inputFile => {\r\n apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n }\r\n }).then(_wallpaper => {\r\n const newDoc = (_wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const newCacheContext = appDownloadManager.getCacheContext(newDoc);\r\n Object.assign(newCacheContext, cacheContext);\r\n\r\n wallpaper = _wallpaper as WallPaper.wallPaper;\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n this.setBackgroundDocument(wallpaper).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n }, deferred.reject);\r\n\r\n const key = this.getWallpaperKey(wallpaper);\r\n deferred.then(() => {\r\n this.clicked.delete(key);\r\n }, (err) => {\r\n container.remove();\r\n //console.error('i saw the body drop', err);\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallpaper, false);\r\n this.clicked.add(key);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find(t => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private getColorsFromWallpaper(wallpaper: WallPaper) {\r\n return wallpaper.settings ? [\r\n wallpaper.settings.background_color,\r\n wallpaper.settings.second_background_color,\r\n wallpaper.settings.third_background_color,\r\n wallpaper.settings.fourth_background_color\r\n ].filter(Boolean).map(color => '#' + color.toString(16)).join(',') : '';\r\n }\r\n\r\n private getWallpaperKey(wallpaper: WallPaper) {\r\n return '' + wallpaper.id;\r\n }\r\n\r\n private getWallpaperKeyFromTheme(theme: Theme) {\r\n return '' + theme.background.id;\r\n }\r\n\r\n private addWallPaper(wallpaper: WallPaper, append = true) {\r\n const colors = this.getColorsFromWallpaper(wallpaper);\r\n const hasFile = wallpaper._ === 'wallPaper';\r\n if((hasFile && wallpaper.pFlags.pattern && !colors)/* || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\r\n return;\r\n }\r\n\r\n const isDark = !!wallpaper.pFlags.dark;\r\n\r\n const doc: MyDocument = hasFile ? (wallpaper.document = appDocsManager.saveDoc(wallpaper.document)) : undefined;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n container.dataset.id = '' + wallpaper.id;\r\n\r\n const key = this.getWallpaperKey(wallpaper);\r\n this.wallpapersByElement.set(container, wallpaper);\r\n this.elementsByKey.set(key, container);\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n let wrapped: ReturnType, size: PhotoSize;\r\n if(hasFile) {\r\n size = appPhotosManager.choosePhotoSize(doc, 200, 200);\r\n wrapped = wrapPhoto({\r\n photo: doc,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: size,\r\n noFadeIn: wallpaper.pFlags.pattern\r\n });\r\n\r\n (wrapped.loadPromises.thumb || wrapped.loadPromises.full).then(() => {\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n\r\n if(wallpaper.pFlags.pattern) {\r\n media.classList.add('is-pattern');\r\n \r\n if(isDark) {\r\n wrapped.images.full.style.display = 'none';\r\n if(wrapped.images.thumb) {\r\n wrapped.images.thumb.style.display = 'none';\r\n }\r\n } else if(wallpaper.settings?.intensity) {\r\n wrapped.images.full.style.opacity = '' + Math.abs(wallpaper.settings.intensity) / 100;\r\n }\r\n }\r\n } else {\r\n container.append(media);\r\n }\r\n\r\n if(wallpaper.settings && wallpaper.settings.background_color !== undefined) {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\r\n canvas.classList.add('background-colors-canvas');\r\n \r\n if(isDark && hasFile) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n wrapped.loadPromises.full.then(() => {\r\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\r\n canvas.style.opacity = '' + Math.abs(wallpaper.settings.intensity) / 100;\r\n media.append(canvas);\r\n });\r\n } else {\r\n media.append(canvas);\r\n }\r\n }\r\n\r\n if(this.getWallpaperKeyFromTheme(this.theme) === key) {\r\n container.classList.add('active');\r\n }\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const wallpaper = this.wallpapersByElement.get(target);\r\n if(wallpaper._ === 'wallPaperNoFile') {\r\n this.setBackgroundDocument(wallpaper);\r\n return;\r\n }\r\n \r\n const key = this.getWallpaperKey(wallpaper);\r\n if(this.clicked.has(key)) return;\r\n this.clicked.add(key);\r\n \r\n const doc = wallpaper.document as MyDocument;\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const load = () => {\r\n const promise = this.setBackgroundDocument(wallpaper);\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then(response => {\r\n appDownloadManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (wallpaper: WallPaper) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const doc = (wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const deferred = deferredPromise();\r\n let download: Promise | DownloadBlob;\r\n if(doc) {\r\n download = appDocsManager.downloadDoc(doc, appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0);\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n } else {\r\n download = Promise.resolve();\r\n }\r\n\r\n download.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url?: string) => {\r\n //const perf = performance.now();\r\n let getPixelPromise: Promise;\r\n if(url && !this.theme.background.color) {\r\n getPixelPromise = averageColor(url);\r\n } else {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(this.getColorsFromWallpaper(wallpaper));\r\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\r\n }\r\n\r\n getPixelPromise.then((pixel) => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n \r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n // const hsla = 'rgba(0, 0, 0, 0.3)';\r\n //console.log(doc, hsla, performance.now() - perf);\r\n\r\n const slug = (wallpaper as WallPaper.wallPaper).slug ?? '';\r\n background.id = wallpaper.id;\r\n background.intensity = wallpaper.settings?.intensity ?? 0;\r\n background.color = this.getColorsFromWallpaper(wallpaper);\r\n background.slug = slug;\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n if(slug) {\r\n this.saveToCache(slug, url);\r\n }\r\n\r\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\r\n });\r\n };\r\n\r\n if(!doc) {\r\n onReady();\r\n return;\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const target = this.elementsByKey.get(this.getWallpaperKeyFromTheme(this.theme));\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\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 PopupElement from \".\";\r\nimport appStickersManager, { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../misc\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { toastNew } from \"../toast\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return appStickersManager.getStickerSet(this.stickerSetInput).then(set => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n this.h6.innerHTML = RichTextProcessor.wrapEmojiText(set.set.title);\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\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 eachTimeout from \"./eachTimeout\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\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 ctx from \"../environment/ctx\";\nimport noop from \"./noop\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\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 { SettingSection } from \"..\";\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\nimport RadioField from \"../../radioField\";\nimport Row, { RadioFormFromRows } from \"../../row\";\nimport SliderSuperTab from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n appReactionsManager.getQuickReaction(),\n appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter(reaction => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction === quickReaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n appReactionsManager.setDefaultReaction(value);\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\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 { generateSection, SettingSection } from \"..\";\r\nimport RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport appStateManager, { State } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { wrapStickerSetThumb, wrapStickerToRow } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport IS_GEOLOCATION_SUPPORTED from \"../../../environment/geolocationSupport\";\r\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\r\nimport AppQuickReactionTab from \"./quickReaction\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n public valueContainer: HTMLElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(\r\n name: LangPackKey, \r\n step: number, \r\n initialValue: number, \r\n minValue: number, \r\n maxValue: number,\r\n writeValue = true\r\n ) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = this.valueContainer = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n\r\n if(writeValue) {\r\n valueDiv.innerHTML = '' + initialValue;\r\n }\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step, \r\n min: minValue, \r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n if(writeValue) {\r\n //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n new AppBackgroundTab(this.slider).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers', \r\n name, \r\n value: 'kilometers', \r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles', \r\n stateKey\r\n })\r\n });\r\n \r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'], \r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey, \r\n name, \r\n value: format, \r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString(\"en-us-u-hc-\" + format, {\r\n hour: '2-digit', \r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map(row => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\r\n\r\n const reactionsRow = new Row({\r\n titleLangKey: 'DoubleTapSetting',\r\n havePadding: true,\r\n clickable: () => {\r\n new AppQuickReactionTab(this.slider).open();\r\n }\r\n });\r\n\r\n const renderQuickReaction = () => {\r\n Promise.resolve(appReactionsManager.getQuickReaction()).then(reaction => {\r\n wrapStickerToRow({\r\n row: reactionsRow,\r\n doc: reaction.static_icon,\r\n size: 'small'\r\n });\r\n });\r\n };\r\n\r\n renderQuickReaction();\r\n\r\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const stickersContent = section.generateContentElement();\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n stickersContent[method](row.container);\r\n };\r\n\r\n appStickersManager.getAllStickers().then(allStickers => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n section.content.append(reactionsRow.container, suggestCheckboxField.label, loopCheckboxField.label);\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\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 appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { generateSection, SettingSection } from \"..\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: 70\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n });\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = appUsersManager.getSelf();\r\n\r\n const userFull = await appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\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 { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = peerIds.map(peerId => appPeersManager.getInputPeerById(peerId));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter(peerId => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.dialogsByFilters.set(filter, new Set(appMessagesManager.dialogsStorage.getFolderDialogs(filter.id).map(d => d.peerId)));\r\n }\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await appUsersManager.getContacts();\r\n peerIds.forEach(peerId => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: this.selector.scrollable,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n span.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach(el => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n /////////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container, \r\n onChange: this.onSelectChange, \r\n peerType: ['dialogs'], \r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats'\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\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 appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport InputField from \"../../inputField\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, i18n_, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport deepEqual from \"../../../helpers/object/deepEqual\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n appMessagesManager.filtersStorage.updateDialogFilter(this.filter, true).then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach(o => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = appMessagesManager.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = appMessagesManager.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch(err => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = RichTextProcessor.wrapDraftText(filter.title);\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(key => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList();\r\n\r\n const peers = filter[key].slice();\r\n\r\n const renderMore = (_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: ul,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach(el => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') this.onEditOpen();\r\n else this.onCreateOpen();\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 { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private renderFolder(dialogFilter: DialogFilterSuggested | DialogFilter | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: DialogFilter | MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach(key => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n for(const dialog of folder) {\r\n if(appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, () => {\r\n new AppEditFolderTab(this.slider).open(appMessagesManager.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, () => {\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n new AppEditFolderTab(this.slider).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return apiManager.invokeApi('messages.getSuggestedDialogFilters').then(suggestedFilters => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach(el => el.remove());\r\n\r\n suggestedFilters.forEach(filter => {\r\n const div = this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n appMessagesManager.filtersStorage.createDialogFilter(f, true).then(bool => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n });\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 { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport appStateManager from \"../../../lib/appManagers/appStateManager\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = () => {\r\n const muted = appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === appNotificationsManager.isMuted(notifySettings) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? 0x7FFFFFFF : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n appNotificationsManager.getContactSignUpNotification().then(enabled => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\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 { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then(langPack => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\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 { addCancelButton } from \"./popups\";\nimport PopupPeer, { PopupPeerOptions } from \"./popups/peer\";\n\n// type PopupConfirmationOptions = Pick;\ntype PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\n };\n\n const buttons = addCancelButton([button]);\n const cancelButton = buttons.find(button => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes = checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\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 { SettingSection } from \"../..\";\nimport { LangPackKey } from \"../../../../lib/langPack\";\nimport CheckboxField from \"../../../checkboxField\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts', \n name: 'contacts',\n stateKey: key + 'contacts',\n withRipple: true\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats', \n name: 'private',\n stateKey: key + 'private',\n withRipple: true\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats', \n name: 'groups',\n stateKey: key + 'groups',\n withRipple: true\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels', \n name: 'channels',\n stateKey: key + 'channels',\n withRipple: true\n });\n\n section.content.append(\n contactsCheckboxField.label, \n privateCheckboxField.label, \n groupsCheckboxField.label, \n channelsCheckboxField.label\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle');\n this.scrollable.append(section.container);\n }\n}\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 formatBytes from \"../../../../helpers/formatBytes\";\nimport debounce from \"../../../../helpers/schedulers/debounce\";\nimport appStateManager from \"../../../../lib/appManagers/appStateManager\";\nimport I18n from \"../../../../lib/langPack\";\nimport rootScope from \"../../../../lib/rootScope\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { RangeSettingSelector } from \"../generalSettings\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle');\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle');\n this.scrollable.append(section.container);\n }\n}\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 { SettingSection } from \"..\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport formatBytes from \"../../../helpers/formatBytes\";\nimport copy from \"../../../helpers/object/copy\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport appStateManager, { AutoDownloadPeerTypeSettings, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\nimport { FormatterArguments, i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport Button from \"../../button\";\nimport CheckboxField from \"../../checkboxField\";\nimport confirmationPopup from \"../../confirmationPopup\";\nimport Row from \"../../row\";\nimport { SliderSuperTabEventable, SliderSuperTabEventableConstructable } from \"../../sliderTab\";\nimport AppAutoDownloadFileTab from \"./autoDownload/file\";\nimport AppAutoDownloadPhotoTab from \"./autoDownload/photo\";\nimport AppAutoDownloadVideoTab from \"./autoDownload/video\";\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n protected async init() {\n this.header.classList.add('with-border');\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await appStateManager.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia', \n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n withRipple: true\n });\n\n const onChange = () => {\n toggleDisability([resetButton], \n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) && \n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo, /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = new tabConstructor(this.slider, true);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n \n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n }\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n }\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n }\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n rootScope.settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n rootScope.settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('settings_updated', {key: 'settings', value: rootScope.settings});\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach(row => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n \n appStateManager.pushToState('settings', settings);\n rootScope.dispatchEvent('settings_updated', {key: 'settings', value: settings});\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoCheckboxField.label,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n \n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n const gifsCheckboxField = new CheckboxField({\n text: 'AutoplayGIF', \n name: 'gifs', \n stateKey: 'settings.autoPlay.gifs',\n withRipple: true\n });\n const videosCheckboxField = new CheckboxField({\n text: 'AutoplayVideo', \n name: 'videos', \n stateKey: 'settings.autoPlay.videos',\n withRipple: true\n });\n\n section.content.append(gifsCheckboxField.label, videosCheckboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey, args: FormatterArguments = [];\n \n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map(key => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n \n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map(key => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n \n replaceContent(row.subtitle, i18n(key, args));\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 { SliderSuperTab } from \"../../slider\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport Button from \"../../button\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport AppGeneralSettingsTab from \"./generalSettings\";\r\nimport AppEditProfileTab from \"./editProfile\";\r\nimport AppChatFoldersTab from \"./chatFolders\";\r\nimport AppNotificationsTab from \"./notifications\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport AppDataAndStorageTab from \"./dataAndStorage\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport PeerProfile from \"../../peerProfile\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SliderSuperTabConstructable } from \"../../sliderTab\";\r\nimport PopupAvatar from \"../../popups/avatar\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { AccountAuthorizations, Authorization } from \"../../../layer\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n storage: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n } = {} as any;\r\n private profile: PeerProfile;\r\n\r\n private languageRow: Row;\r\n private devicesRow: Row;\r\n\r\n private authorizations: Authorization.authorization[];\r\n private getAuthorizationsPromise: Promise;\r\n\r\n protected init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.buttons.edit = ButtonIcon('edit');\r\n\r\n this.header.append(this.buttons.edit, btnMenu);\r\n\r\n this.profile = new PeerProfile(this.scrollable, this.listenerSetter, false);\r\n this.profile.init();\r\n this.profile.setPeer(rootScope.myId);\r\n this.profile.fillProfileElements();\r\n\r\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\r\n changeAvatarBtn.addEventListener('click', () => {\r\n const canvas = document.createElement('canvas');\r\n new PopupAvatar().open(canvas, (upload) => {\r\n upload().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n });\r\n });\r\n });\r\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\r\n \r\n const updateChangeAvatarBtn = () => {\r\n const user = appUsersManager.getSelf();\r\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\r\n };\r\n \r\n updateChangeAvatarBtn();\r\n this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\r\n if(rootScope.myId === peerId) {\r\n updateChangeAvatarBtn();\r\n }\r\n });\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n \r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n \r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const b: [string, LangPackKey, SliderSuperTabConstructable][] = [\r\n ['unmute', 'AccountSettings.Notifications', AppNotificationsTab],\r\n ['data', 'DataSettings', AppDataAndStorageTab],\r\n ['lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab],\r\n ['settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab],\r\n ['folder', 'AccountSettings.Filters', AppChatFoldersTab],\r\n ];\r\n\r\n const rows = b.map(([icon, langPackKey, tabConstructor]) => {\r\n return new Row({\r\n titleLangKey: langPackKey,\r\n icon,\r\n clickable: () => {\r\n new tabConstructor(this.slider, true).open();\r\n }\r\n });\r\n });\r\n\r\n rows.push(\r\n this.devicesRow = new Row({\r\n titleLangKey: 'Devices',\r\n titleRightSecondary: ' ',\r\n icon: 'activesessions',\r\n clickable: async() => {\r\n if(!this.authorizations) {\r\n await this.updateActiveSessions();\r\n }\r\n\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.authorizations = undefined;\r\n this.updateActiveSessions(true);\r\n }, {once: true});\r\n tab.open();\r\n }\r\n }),\r\n\r\n this.languageRow = new Row({\r\n titleLangKey: 'AccountSettings.Language',\r\n titleRightSecondary: i18n('LanguageName'),\r\n icon: 'language',\r\n clickable: () => {\r\n new AppLanguageTab(this.slider).open();\r\n }\r\n })\r\n );\r\n\r\n buttonsDiv.append(...rows.map(row => row.container));\r\n\r\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\r\n // profileSection.content.append(this.profile.element);\r\n\r\n const buttonsSection = new SettingSection();\r\n buttonsSection.content.append(buttonsDiv);\r\n\r\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\r\n\r\n /* rootScope.$on('user_auth', (e) => {\r\n this.fillElements();\r\n }); */\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = new AppEditProfileTab(this.slider);\r\n tab.open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n private getAuthorizations(overwrite?: boolean) {\r\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\r\n\r\n const promise = this.getAuthorizationsPromise = apiManager.invokeApi('account.getAuthorizations')\r\n .finally(() => {\r\n if(this.getAuthorizationsPromise === promise) {\r\n this.getAuthorizationsPromise = undefined;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public updateActiveSessions(overwrite?: boolean) {\r\n return this.getAuthorizations(overwrite).then(auths => {\r\n this.authorizations = auths.authorizations;\r\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\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 appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length && \r\n !this.channelNameInputField.input.classList.contains('error') && \r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChannel({\r\n title, \r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n new AppAddMembersTab(this.slider).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\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 InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = RichTextProcessor.getAbbreviation(name);\n editPeer.avatarElem.setAttribute('peer-title', name);\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\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 { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n new PopupCreateContact();\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n const isContact = appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList();\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach(el => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n appUsersManager.getContactsPeerIds(query, undefined, 'online').then(contacts => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\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 appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId = 1;\n private wasFilterId: number;\n\n init() {\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, AppArchivedTab.filterId).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.wasFilterId = appDialogsManager.filterId;\n appDialogsManager.setFilterId(AppArchivedTab.filterId);\n appDialogsManager.onTabChange();\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterId(this.wasFilterId);\n appDialogsManager.onTabChange();\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\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 { SliderSuperTab } from \"../../slider\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport AppNewGroupTab from \"./newGroup\";\r\nimport { toast } from \"../../toast\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport type { LazyLoadQueueIntersector } from \"../../lazyLoadQueue\";\r\nimport { i18n, join, _i18n } from \"../../../lib/langPack\";\r\nimport rootScope from '../../../lib/rootScope';\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport SortedUserList from \"../../sortedUserList\";\r\nimport { PeerLocated, Update, Updates } from \"../../../layer\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport { SettingChatListSection } from \"..\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueueIntersector;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n protected init() {\r\n this.container.classList.add('people-nearby-container');\r\n this.setTitle('PeopleNearby');\r\n\r\n this.errorCategory = document.createElement('div');\r\n this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n const emoji = '🧭';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n stickerContainer.classList.add('sticker-container');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 86,\r\n height: 86,\r\n emoji,\r\n needUpscale: true\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n this.locatedPeers = new Map();\r\n\r\n const m = () => {\r\n const sortedUserList = new SortedUserList({\r\n avatarSize: 42, \r\n createChatListOptions: {\r\n dialogSize: 48,\r\n new: true\r\n },\r\n autonomous: false,\r\n onUpdate: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n const elements: HTMLElement[] = [\r\n this.parseDistance(peer.distance)\r\n ];\r\n\r\n if(!element.id.isUser()) {\r\n elements.push(appProfileManager.getChatMembersString(element.id.toChatId()));\r\n }\r\n\r\n element.dom.lastMessageSpan.textContent = '';\r\n element.dom.lastMessageSpan.append(...join(elements, false));\r\n },\r\n getIndex: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n return 0x7FFFFFFF - peer.distance;\r\n }\r\n });\r\n\r\n appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n \r\n return sortedUserList;\r\n };\r\n \r\n const peopleSection = this.peopleSection = new SettingChatListSection({\r\n name: 'PeopleNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const chatsSection = this.chatsSection = new SettingChatListSection({\r\n name: 'ChatsNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const btnMakeVisible = peopleSection.makeButton({\r\n text: 'MakeMyselfVisible',\r\n icon: 'location'\r\n });\r\n\r\n const btnMakeInvisible = peopleSection.makeButton({\r\n text: 'StopShowingMe',\r\n icon: 'location'\r\n });\r\n\r\n const btnCreateGroup = chatsSection.makeButton({\r\n text: 'NearbyCreateGroup',\r\n icon: 'newgroup'\r\n });\r\n\r\n attachClickEvent(btnMakeVisible, () => {\r\n confirmationPopup({\r\n titleLangKey: 'MakeMyselfVisibleTitle',\r\n descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n button: {\r\n langKey: 'OK'\r\n }\r\n }).then(() => {\r\n this.startWatching();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnMakeInvisible, () => {\r\n this.stopWatching();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnCreateGroup, () => {\r\n new AppNewGroupTab(this.slider).open([], true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n btnMakeVisible.classList.add('primary');\r\n btnMakeInvisible.classList.add('danger');\r\n btnCreateGroup.classList.add('primary');\r\n\r\n this.content.append(this.retryBtn);\r\n this.scrollable.append(\r\n stickerContainer,\r\n caption,\r\n peopleSection.container,\r\n chatsSection.container,\r\n this.errorCategory\r\n );\r\n }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach(peer => {\r\n const peerId = appPeersManager.getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = \"No groups or channels found around you.\";\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = \"Location permission denied. Click below to retry.\";\r\n } else {\r\n this.errorCategory.innerHTML = \"An error has occurred. Please retry later clicking the button below.\";\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p)\r\n * (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\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 appImManager from \"../../lib/appManagers/appImManager\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport { FormatterArguments, i18n, i18n_, LangPackKey } from \"../../lib/langPack\";\nimport AppPeopleNearbyTab from \"./tabs/peopleNearby\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { attachClickEvent, CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport { closeBtnMenu } from \"../misc\";\nimport ButtonIcon from \"../buttonIcon\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport IS_GEOLOCATION_SUPPORTED from \"../../environment/geolocationSupport\";\nimport type SortedUserList from \"../sortedUserList\";\nimport Button, { ButtonOptions } from \"../button\";\nimport noop from \"../../helpers/noop\";\nimport { ripple } from \"../ripple\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n //private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n \n public archivedCount: HTMLSpanElement;\n\n private newBtnMenu: HTMLElement;\n\n //private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n new AppAddMembersTab(this).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n new AppNewGroupTab(this).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n new AppContactsTab(this).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: ButtonMenuItemOptions & {verify?: () => boolean} = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n new AppArchivedTab(this).open();\n },\n verify: () => {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: rootScope.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', () => {\n rootScope.settings.theme = themeCheckboxField.input.checked ? 'night' : 'day';\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(rootScope.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n new AppPeopleNearbyTab(this).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n new AppSettingsTab(this).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n appImManager.openUsername({\n userName: 'TelegramTips'\n });\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, (e) => {\n filteredButtons.forEach(button => {\n if(button.verify) {\n button.element.classList.toggle('hide', !button.verify());\n }\n });\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n new AppNewChannelTab(this).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n // this.updateBtn.classList.add('btn-update');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\n\n attachClickEvent(this.updateBtn, () => {\n location.reload();\n });\n \n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n appUsersManager.getTopPeers('correspondents');\n\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n appStateManager.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-30');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach(el => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then(dialogs => dialogs.map(d => d.peerId)),\n appMessagesManager.getConversations(value).promise.then(({dialogs}) => dialogs.map(d => d.peerId)),\n appUsersManager.getContactsPeerIds(value, true)\n ]).then(results => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach(peerId => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach(dateData => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, 'LI') as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n \n appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n appStateManager.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType('global-search')) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: 'global-search'\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n appStateManager.getState().then(state => {\n this.searchGroups.recent.clear();\n \n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n appStateManager.releaseSinglePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n appStateManager.pushToState('recentSearch', recentSearch);\n });\n });\n });\n }\n}\n\nexport type SettingSectionOptions = {\n name?: LangPackKey, \n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n if(options.caption) {\n const caption = this.caption = this.generateContentElement();\n caption.classList.add(className + '-caption');\n container.append(caption);\n\n if(options.caption !== true) {\n i18n_({element: caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\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 rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\ntype Group = {bubble: HTMLElement, mid: number, timestamp: number}[];\r\ntype BubbleGroup = {timestamp: number, fromId: PeerId, mid: number, group: Group};\r\nexport default class BubbleGroups {\r\n private bubbles: Array = []; // map to group\r\n private detailsMap: Map = new Map();\r\n private groups: Array = [];\r\n //updateRAFs: Map = new Map();\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeBubble(bubble: HTMLElement) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n if(details.group.length) {\r\n details.group.findAndSplice(d => d.bubble === bubble);\r\n if(!details.group.length) {\r\n indexOfAndSplice(this.groups, details.group);\r\n } else {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n this.detailsMap.delete(bubble);\r\n }\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n details.mid = mid;\r\n }\r\n }\r\n \r\n addBubble(bubble: HTMLElement, message: MyMessage, reverse: boolean) {\r\n //return;\r\n\r\n const timestamp = message.date;\r\n const mid = message.mid;\r\n let fromId = message.viaBotId || message.fromId;\r\n let group: Group;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as any).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n \r\n // try to find added\r\n this.removeBubble(bubble);\r\n \r\n const insertObject = {bubble, mid, timestamp};\r\n if(this.bubbles.length) {\r\n let foundBubble: BubbleGroup;\r\n let foundAtIndex = -1;\r\n for(let i = 0; i < this.bubbles.length; ++i) {\r\n const bubble = this.bubbles[i];\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n const good = bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n\r\n if(good) {\r\n foundAtIndex = i;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n break;\r\n }\r\n } else {\r\n foundAtIndex = -1;\r\n }\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n if(mid > bubble.mid) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(foundAtIndex !== -1) {\r\n foundBubble = this.bubbles[foundAtIndex];\r\n }\r\n /* const foundBubble = this.bubbles.find(bubble => {\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n return bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n }); */\r\n\r\n if(!foundBubble) this.groups.push(group = [insertObject]);\r\n else {\r\n group = foundBubble.group;\r\n \r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < group.length; ++i) {\r\n const _timestamp = group[i].timestamp;\r\n const _mid = group[i].mid;\r\n\r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n group.splice(i, 0, insertObject);\r\n }\r\n } else {\r\n this.groups.push(group = [insertObject]);\r\n }\r\n\r\n //console.log('[BUBBLE]: addBubble', bubble, message.mid, fromId, reverse, group);\r\n\r\n const bubbleGroup = {timestamp, fromId, mid: message.mid, group};\r\n let insertIndex = 0;\r\n for(; insertIndex < this.bubbles.length; ++insertIndex) {\r\n if(this.bubbles[insertIndex].mid < mid) {\r\n break;\r\n }\r\n }\r\n \r\n this.bubbles.splice(insertIndex, 0, {timestamp, fromId, mid: message.mid, group});\r\n this.updateGroup(group);\r\n\r\n this.detailsMap.set(bubble, bubbleGroup);\r\n }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach(object => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n updateGroup(group: Group) {\r\n /* if(this.updateRAFs.has(group)) {\r\n window.cancelAnimationFrame(this.updateRAFs.get(group));\r\n this.updateRAFs.delete(group);\r\n } */\r\n \r\n //this.updateRAFs.set(group, window.requestAnimationFrame(() => {\r\n //this.updateRAFs.delete(group);\r\n \r\n if(!group.length) {\r\n return;\r\n }\r\n \r\n const first = group[0].bubble;\r\n\r\n //console.log('[BUBBLE]: updateGroup', group, first);\r\n \r\n if(group.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n const length = group.length - 1;\r\n for(let i = 1; i < length; ++i) {\r\n const bubble = group[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = group[group.length - 1].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n //}));\r\n }\r\n\r\n updateGroupByMessageId(mid: number) {\r\n const details = this.bubbles.find(g => g.mid === mid);\r\n if(details) {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n cleanup() {\r\n this.bubbles = [];\r\n this.groups = [];\r\n this.detailsMap.clear();\r\n /* for(let value of this.updateRAFs.values()) {\r\n window.cancelAnimationFrame(value);\r\n }\r\n this.updateRAFs.clear(); */\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 PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\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 class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n let entry = entries.filter(entry => entry.boundingClientRect.top < 0).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n let container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\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 AvatarElement from \"./avatar\";\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueueIntersector;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: LazyLoadQueueIntersector,\n avatarSize: number\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.setAttribute('dialog', '0');\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\n avatarElem.loadPromises = loadPromises;\n }\n \n avatarElem.setAttribute('peer', '' + peerId);\n \n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach(el => el.remove());\n }\n}\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 callbackify from \"../../helpers/callbackify\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { MessagePeerReaction, ReactionCount } from \"../../layer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport SetTransition from \"../singleTransition\";\nimport StackedAvatars from \"../stackedAvatars\";\nimport { wrapSticker, wrapStickerAnimation } from \"../wrappers\";\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: ReturnType;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n \n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n \n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const availableReaction = appReactionsManager.getReaction(reactionCount.reaction);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc: availableReaction.center_icon ?? availableReaction.static_icon,\n width: size,\n height: size,\n static: true\n }).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n });\n }\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map(reaction => appPeersManager.getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = !!this.reactionCount.pFlags.chosen) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition(this, 'is-chosen', isChosen, this.isConnected ? 300 : 0);\n }\n }\n\n public fireAroundAnimation() {\n callbackify(appReactionsManager.getReaction(this.reactionCount.reaction), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false\n }) as Promise,\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false\n }).stickerPromise\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n fastRaf(() => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n });\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(remove, 1e3);\n });\n } else {\n remove();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\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 forEachReverse from \"../../helpers/array/forEachReverse\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport { Message, ReactionCount } from \"../../layer\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport ReactionElement, { ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT } from \"./reaction\";\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n }\n \n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(message: Message.message, type: ReactionLayoutType, isPlaceholder?: boolean) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.isPlaceholder);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n availableReactionsResult instanceof Promise ? \n reactions.results : \n reactions.results.filter(reactionCount => {\n return appReactionsManager.isReactionActive(reactionCount.reaction);\n })\n ) : [];\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some(reactionCount => reactionCount.reaction === reaction);\n if(!found) {\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && !!reactions.pFlags.can_see_list && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n const reactionElementIdx = this.sorted.findIndex(reactionElement => reactionElement.reactionCount.reaction === reactionCount.reaction);\n let reactionElement = reactionElementIdx !== -1 && this.sorted[reactionElementIdx];\n if(!reactionElement) {\n reactionElement = new ReactionElement();\n reactionElement.init(this.type);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n \n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter(reaction => reaction.reaction === reactionCount.reaction) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== rootScope.peerId) return;\n\n changedResults.forEach(reactionCount => {\n const reactionElement = this.sorted.find(reactionElement => reactionElement.reactionCount.reaction === reactionCount.reaction);\n if(reactionElement) {\n reactionElement.fireAroundAnimation();\n }\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\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 { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\r\nimport { Message } from \"../../layer\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport I18n from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (message) => {\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach(element => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n public stackedAvatars: StackedAvatars;\r\n public text: I18n.IntlElement;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!this.stackedAvatars) {\r\n this.stackedAvatars = new StackedAvatars({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n avatarSize: 30\r\n });\r\n\r\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\r\n }\r\n\r\n leftPart = this.stackedAvatars.container;\r\n\r\n this.stackedAvatars.render(replies.recent_repliers.map(peer => appPeersManager.getPeerId(peer)), this.loadPromises);\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.prepend(leftPart);\r\n }\r\n \r\n if(!this.text) {\r\n this.text = new I18n.IntlElement();\r\n }\r\n\r\n const text = this.text;\r\n if(replies) {\r\n if(replies.replies) {\r\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\r\n } else {\r\n text.compareAndUpdate({key: 'LeaveAComment'});\r\n }\r\n } else {\r\n text.compareAndUpdate({key: 'ViewInChat'});\r\n }\r\n\r\n if(replies) {\r\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n }/* else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n } */\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text.element);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\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 { formatTime, getFullDate } from \"../../helpers/date\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { Message } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat, { ChatType } from \"./chat\";\nimport ReactionsElement from \"./reactions\";\nimport RepliesElement from \"./replies\";\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType, \n message: Message.message | Message.messageService,\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n \n let editedSpan: HTMLElement, sponsoredSpan: HTMLElement, reactionsElement: ReactionsElement, reactionsMessage: Message.message;\n \n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n let hasReactions: boolean;\n \n let time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n \n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n \n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n \n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + NBSP;\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n \n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n if(message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n hasReactions = true;\n\n reactionsMessage = appMessagesManager.getGroupsFirstMessage(message);\n\n reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'inline', true);\n reactionsElement.render();\n args.unshift(reactionsElement);\n }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n \n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n if(reactionsElement) {\n const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n _reactionsElement.init(reactionsMessage, 'inline');\n _reactionsElement.render();\n }\n clonedArgs = clonedArgs.map(a => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueueIntersector\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = ({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? chat.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = chat.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n // need to download separately\n if(originalMessage._ === 'messageEmpty') {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n chat.appMessagesManager.wrapSingleMessage(replyToPeerId, message.reply_to_mid);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n originalPeerTitle = new PeerTitle({\n peerId: originalMessage.fromId || originalMessage.fwdFromId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const wrapped = wrapReply(originalPeerTitle, undefined, originalMessage);\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(wrapped);\n } else {\n bubbleContainer.append(wrapped);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\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 reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\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 App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport isObject from \"../../helpers/object/isObject\";\nimport validateInitObject from \"../../helpers/object/validateInitObject\";\nimport I18n from \"../langPack\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport appStateManager from \"./appStateManager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then(popEmojis => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then(recentEmojis => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n public indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = appStateManager.getState().then(state => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = RichTextProcessor.fixEmoji(emoji);\n this.getRecentEmojis().then(recent => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n appStateManager.pushToState('recentEmoji', recent);\n rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n\nconst appEmojiManager = new AppEmojiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appEmojiManager = appEmojiManager);\nexport default appEmojiManager;\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 emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport appEmojiManager from \"../../../lib/appManagers/appEmojiManager\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport Config from \"../../../lib/config\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../misc\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: string;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = RichTextProcessor.wrapSingleEmoji(emoji);\n } else {\n emoji = RichTextProcessor.fixEmoji(emoji);\n kek = RichTextProcessor.wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.innerHTML = kek;\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild && !IS_EMOJI_SUPPORTED) {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Config.Emoji) {\n const details = Config.Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach(c => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach(unified => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n appEmojiManager.getRecentEmojis().then(recent => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map(category => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = RichTextProcessor.fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\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 appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport { LazyLoadQueueRepeat2 } from \"./lazyLoadQueue\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n\r\n constructor(private element: HTMLElement, private group: string, private scrollable: Scrollable, attach = true) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter(p => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const promise = this.scrollPromise.then(() => {\r\n const res = wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n\r\n const willBeAPoster = !!gotThumb;\r\n let img: HTMLImageElement;\r\n if(willBeAPoster) {\r\n img = new Image();\r\n img.classList.add('media-poster');\r\n\r\n if(!gotThumb.cacheContext.url) {\r\n gotThumb.promise.then(() => {\r\n img.src = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n const afterRender = () => {\r\n if(img) {\r\n div.append(img);\r\n div.style.opacity = '';\r\n }\r\n };\r\n\r\n (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\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 emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appDocsManager, {MyDocument} from \"../../../lib/appManagers/appDocsManager\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n apiManager.invokeApi('messages.getSavedGifs', {hash: '0'}).then((res) => {\r\n //console.log('getSavedGifs res:', res);\r\n\r\n if(res._ === 'messages.savedGifs') {\r\n res.gifs.forEach((doc, idx) => {\r\n res.gifs[idx] = doc = appDocsManager.saveDoc(doc);\r\n //if(doc._ === 'documentEmpty') return;\r\n masonry.add(doc as MyDocument);\r\n });\r\n }\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\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 emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue, { LazyLoadQueueRepeat } from \"../../lazyLoadQueue\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(private regularLazyLoadQueue: LazyLoadQueue, private group: string) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.animated) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.animated,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach(player => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n });\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n titleDiv.innerHTML = categoryTitle;\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then(documents => {\r\n documents.forEach(doc => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, RichTextProcessor.wrapEmojiText(set.title), promise.then(stickerSet => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n appStickersManager.getRecentStickers().then(stickers => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter(p => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter(p => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach(el => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\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\nimport { toast } from \"../../components/toast\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\r\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\r\nimport appUsersManager, { MyTopPeer } from \"./appUsersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport rootScope from \"../rootScope\";\r\nimport appDraftsManager from \"./appDraftsManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\n\r\nexport class AppInlineBotsManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return apiManagerProxy.invokeApi('messages.getInlineBotResults', {\r\n bot: appUsersManager.getUserInput(botId),\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then(botResults => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach(result => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[this.generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n public generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\r\n return queryId + '_' + resultId;\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex(topPeer => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n rootScope.dispatchEvent('history_focus', {peerId: botId.toPeerId()});\r\n return appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n rootScope.dispatchEvent('history_focus', {peerId, threadId});\r\n appDraftsManager.setDraft(peerId, threadId, '@' + appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return apiManagerProxy.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n msg_id: appMessagesIdsManager.getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(RichTextProcessor.wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = appDocsManager.getMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = appPhotosManager.getMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n\r\nconst appInlineBotsManager = new AppInlineBotsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appInlineBotsManager = appInlineBotsManager);\r\nexport default appInlineBotsManager;\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 { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appInlineBotsManager, { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\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 { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n appStickersManager.toggleStickerSet(full.set).then(changed => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `\r\n
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n appStickersManager.getStickerSet(set).then(set => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach(animation => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return appStickersManager.getFeaturedStickers().then(coveredSets => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex(covered => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return appStickersManager.searchStickerSets(query, false).then(coveredSets => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\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 { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue, { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport { pause } from \"../../helpers/schedulers/pause\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.emojiTab = new EmojiTab();\n this.stickersTab = new StickersTab();\n this.gifsTab = new GifsTab();\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n new AppStickersTab(appSidebarRight).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n new AppGifsTab(appSidebarRight).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n rootScope.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\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 getVisibleRect(element: HTMLElement, overflowElement: HTMLElement, lookForSticky?: boolean, rect = element.getBoundingClientRect()) {\r\n const overflowRect = overflowElement.getBoundingClientRect();\r\n\r\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowLeft\r\n || rect.left >= overflowRight) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\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\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat\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 PopupElement, { addCancelButton } from \".\";\r\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\r\nimport { ChatInvite, Updates } from \"../../layer\";\r\nimport apiUpdatesManager from \"../../lib/appManagers/apiUpdatesManager\";\r\nimport appAvatarsManager from \"../../lib/appManagers/appAvatarsManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { i18n, _i18n } from \"../../lib/langPack\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { toastNew } from \"../toast\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(hash: string, chatInvite: ChatInvite.chatInvite) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n const peerId = chat.id.toPeerId(true);\r\n rootScope.dispatchEvent('history_focus', {peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.header.remove();\r\n\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-100');\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n appAvatarsManager.putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(chatInvite.title);\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n }\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 Scrollable from \"../components/scrollable\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport reflowScrollableElement from \"./dom/reflowScrollableElement\";\n\nexport default class ScrollSaver {\n private previousScrollHeight: number;\n private previousScrollHeightMinusTop: number/* , previousScrollHeight: number */;\n\n /**\n * \n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable, \n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public save() {\n const {scrollTop, scrollHeight} = this.container;\n\n //previousScrollHeight = scrollHeight;\n //previousScrollHeight = scrollHeight + padding;\n this.previousScrollHeight = scrollHeight;\n this.previousScrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n //this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n\n /* if(DEBUG) {\n this.log('performHistoryResult: messagesQueueOnRender, scrollTop:', scrollTop, scrollHeight, previousScrollHeightMinusTop);\n } */\n }\n\n public restore(useReflow?: boolean) {\n const {container, previousScrollHeightMinusTop, scrollable} = this;\n if(previousScrollHeightMinusTop !== undefined) {\n const scrollHeight = container.scrollHeight;\n if(scrollHeight === this.previousScrollHeight) {\n return;\n }\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n \n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop', \n previousScrollHeightMinusTop, scrollHeight, \n newScrollTop, container.container.clientHeight); */\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n \n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n // touchSupport for safari iOS\n //isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n container.scrollTop = newScrollTop;\n //container.scrollTop = scrollHeight;\n //isTouchSupported && isApple && (container.container.style.overflow = '');\n\n scrollable.lastScrollPosition = newScrollTop;\n // scrollable.lastScrollDirection = 0;\n\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(container);\n }\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\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 type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport type { AppMessagesManager, HistoryResult, HistoryStorage, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\r\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\r\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { ripple } from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { ChatInvite, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, WebPage } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport { deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport serverTimeManager from \"../../lib/mtproto/serverTimeManager\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport { cancelContextMenuOpening } from \"../misc\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport Button from \"../button\";\r\nimport { CallType } from \"../../lib/calls/types\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport PopupJoinChatInvite from \"../popups/joinChatInvite\";\r\nimport { InternalLink, INTERNAL_LINK_TYPE } from \"../../lib/appManagers/internalLink\";\r\nimport ReactionsElement, { REACTIONS_ELEMENTS } from \"./reactions\";\r\nimport type ReactionElement from \"./reaction\";\r\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport { pause } from \"../../helpers/schedulers/pause\";\r\nimport ScrollSaver from \"../../helpers/scrollSaver\";\r\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\r\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nconst SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\n\r\nexport default class ChatBubbles {\r\n public bubblesContainer: HTMLDivElement;\r\n private chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n public peerId: PeerId;\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLElement, \r\n firstTimestamp: number, \r\n container: HTMLElement,\r\n timeout?: number \r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreadedObserver: IntersectionObserver;\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n \r\n private loadedTopTimes = 0;\r\n private loadedBottomTimes = 0;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: {message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]}[] = [];\r\n private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n private historyStorage: HistoryStorage;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderMid: number;\r\n\r\n private viewsObserver: IntersectionObserver;\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n \r\n private hoverBubble: HTMLElement;\r\n private hoverReaction: HTMLElement;\r\n\r\n private onUpdateScrollSaver: ScrollSaver;\r\n\r\n // private reactions: Map;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appStickersManager: AppStickersManager, \r\n private appUsersManager: AppUsersManager, \r\n private appInlineBotsManager: AppInlineBotsManager, \r\n private appPhotosManager: AppPhotosManager, \r\n private appPeersManager: AppPeersManager,\r\n private appProfileManager: AppProfileManager,\r\n private appDraftsManager: AppDraftsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appChatsManager: AppChatsManager,\r\n private appReactionsManager: AppReactionsManager\r\n ) {\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.bubblesContainer = document.createElement('div');\r\n this.bubblesContainer.classList.add('bubbles', 'scrolled-down');\r\n\r\n this.chatInner = document.createElement('div');\r\n this.chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n this.bubblesContainer.append(this.scrollable.container);\r\n\r\n // * constructor end\r\n\r\n this.log = this.chat.log;\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // this.reactions = new Map();\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', ({storage, peerId, mid}) => {\r\n if(this.chat.getMessagesStorage() === storage) {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = this.chat.getMessage(mid);\r\n \r\n if(+bubble.dataset.timestamp >= (message.date + serverTimeManager.serverTimeOffset - 1)) {\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n this.setBubblePosition(bubble, message, false);\r\n //this.log('history_update', this.bubbles[mid], mid, message);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n //this.renderMessage(message, false, false, bubble);\r\n }\r\n });\r\n\r\n //this.listenerSetter.add(rootScope)('')\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map(m => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', (e) => {\r\n const {storage, tempId, tempMessage, mid} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.getMessagesStorage() !== storage) {\r\n return;\r\n }\r\n \r\n //this.log('message_sent', e);\r\n\r\n const mounted = this.getMountedBubble(tempId, tempMessage) || this.getMountedBubble(mid);\r\n if(mounted) {\r\n const message = this.chat.getMessage(mid);\r\n const bubble = mounted.bubble;\r\n //this.bubbles[mid] = bubble;\r\n \r\n /////this.log('message_sent', bubble);\r\n\r\n const reactionsElements = Array.from(bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\r\n if(reactionsElements.length) {\r\n reactionsElements.forEach(reactionsElement => {\r\n reactionsElement.changeMessage(message as Message.message);\r\n });\r\n }\r\n\r\n if(message.replies) {\r\n const repliesElement = bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && message.media.document.thumbs?.length) {\r\n div.replaceWith(wrapDocument({message}));\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(message.grouped_id) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n if(message.media?.poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n const newPoll = message.media.poll;\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', newPoll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = message.media.document.id;\r\n }\r\n }\r\n }\r\n\r\n /* bubble.classList.remove('is-sending');\r\n bubble.classList.add('is-sent');\r\n bubble.dataset.mid = '' + mid;\r\n\r\n this.bubbleGroups.removeBubble(bubble, tempId); */\r\n\r\n if(message.media?.webpage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, false, bubble, false);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n this.renderMessage(mounted.message, true, false, mounted.bubble, false); */\r\n }\r\n \r\n //delete this.bubbles[tempId];\r\n } else {\r\n this.log.warn('message_sent there is no bubble', e);\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n if(bubbles[tempId]) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n delete bubbles[tempId];\r\n\r\n //getHeavyAnimationPromise().then(() => {\r\n fastRaf(() => {\r\n if(bubble.classList.contains('is-outgoing')) {\r\n bubble.classList.remove('is-sending', 'is-outgoing');\r\n bubble.classList.add(this.peerId === rootScope.myId && this.chat.type !== 'scheduled' ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n //});\r\n\r\n bubble.dataset.mid = '' + mid;\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n //this.log('scheduled timing:', timestamp, maxTimestamp);\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storage, peerId, mid}) => {\r\n // fastRaf(() => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n const message = this.chat.getMessage(mid);\r\n const mounted = message.grouped_id ? this.getGroupedBubble(message.grouped_id) : this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n\r\n const updatePosition = this.chat.type === 'scheduled';\r\n \r\n this.saveOnUpdateScroll();\r\n this.safeRenderMessage(mounted.message, true, false, mounted.bubble, updatePosition);\r\n\r\n if(updatePosition) {\r\n (this.messagesQueuePromise || Promise.resolve()).then(() => {\r\n this.deleteEmptyDateGroups();\r\n });\r\n }\r\n // });\r\n });\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.listenerSetter.add(rootScope)('missed_reactions_element', ({message, changedResults}) => {\r\n if(this.peerId !== message.peerId || !message.reactions || !message.reactions.results.length) {\r\n return;\r\n }\r\n \r\n const bubble = this.getBubbleByMessage(message);\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n if(message.grouped_id) {\r\n const grouped = this.getGroupedBubble(message.grouped_id);\r\n message = grouped.message;\r\n }\r\n\r\n this.appendReactionsElementToBubble(bubble, message, changedResults);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_reactions', ({message, changedResults}) => {\r\n if(this.peerId !== message.peerId) {\r\n return;\r\n }\r\n\r\n const bubble = this.getBubbleByMessage(message);\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n this.saveOnUpdateScroll();\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n const set = REACTIONS_ELEMENTS.get(key);\r\n if(set) {\r\n for(const element of set) {\r\n element.update(message, changedResults);\r\n }\r\n } else {\r\n rootScope.dispatchEvent('missed_reactions_element', {message, changedResults});\r\n }\r\n });\r\n }\r\n\r\n /* this.listenerSetter.add(rootScope)('message_reactions', ({peerId, mid}) => {\r\n if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n const reactionsElement = this.reactions.get(mid);\r\n if(!reactionsElement) {\r\n return;\r\n }\r\n\r\n \r\n }); */\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, groupId, deletedMids}) => {\r\n //fastRaf(() => { // ! can't use delayed smth here, need original bubble to be edited\r\n if(peerId !== this.peerId) return;\r\n const mids = this.appMessagesManager.getMidsByAlbum(groupId);\r\n const renderedId = mids.concat(deletedMids).find(mid => this.bubbles[mid]);\r\n if(!renderedId) return;\r\n\r\n const renderMaxId = getObjectKeysAndSort(this.appMessagesManager.groupedMessagesStorage[groupId], 'asc').pop();\r\n\r\n this.safeRenderMessage(this.chat.getMessage(renderMaxId), true, false, this.bubbles[renderedId], false);\r\n //});\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_downloaded', ({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n getHeavyAnimationPromise().then(() => {\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach(mid => {\r\n /* const promise = (this.scrollable.scrollLocked && this.scrollable.scrollLockedPromise) || Promise.resolve();\r\n promise.then(() => {\r\n \r\n }); */\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n const {mid, replyMid} = this.needUpdate.splice(idx, 1)[0];\r\n \r\n //this.log('messages_downloaded', mid, replyMid, i, this.needUpdate, this.needUpdate.length, mids, this.bubbles[mid]);\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const message = this.chat.getMessage(mid);\r\n \r\n const repliedMessage = this.appMessagesManager.getMessageByPeer(obj.replyToPeerId, replyMid);\r\n if(repliedMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: this.bubblesContainer,\r\n verifyTouchTarget: (e) => {\r\n if(this.chat.selection.isSelecting || !this.chat.canSend()) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n\r\n attachClickEvent(this.bubblesContainer, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE && this.chat.type !== 'pinned') {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n if(this.chat.selection.isSelecting || \r\n !this.chat.canSend()) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n if(false) this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n dateMessage.div.classList.toggle('is-sticky', stuck);\r\n break;\r\n }\r\n }\r\n });\r\n\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', ({storage, mid}) => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n const gradientRenderer = this.chat.gradientRenderer;\r\n if(gradientRenderer) {\r\n gradientRenderer.toNextPosition();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n this.updateUnreadByDialog();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n this.finishPeerChange();\r\n this.chat.input.finishPeerChange();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', (e) => {\r\n if(e.key === 'settings.emoji.big') {\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(!isScrolledDown) {\r\n this.setMessagesQueuePromise();\r\n }\r\n \r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n mids.forEach(mid => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n const message = this.chat.getMessage(mid);\r\n this.safeRenderMessage(message, undefined, false, bubble);\r\n // this.bubbleGroups.addBubble(bubble, message, false);\r\n }\r\n });\r\n\r\n if(isScrolledDown) {\r\n this.scrollable.scrollTop = 99999;\r\n } else {\r\n this.performHistoryResult([], true, false, undefined);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_views', ({peerId, views, mid}) => {\r\n if(this.peerId !== peerId) return;\r\n\r\n fastRaf(() => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(postViewsElements.length) {\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach(postViews => {\r\n if(different || postViews.innerHTML !== str) {\r\n this.saveOnUpdateScroll();\r\n different = true;\r\n postViews.innerHTML = str;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n this.unreadedObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n });\r\n\r\n this.viewsObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.viewsObserver.unobserve(entry.target);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.chat.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId()),\r\n random_id: sponsoredMessage.random_id\r\n });\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n\r\n if('ResizeObserver' in window) {\r\n let wasHeight = this.scrollable.container.offsetHeight;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n\r\n const onResizeEnd = () => {\r\n const height = this.scrollable.container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.scrollTop += Math.round(part);\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n //this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries = (entries: any) => {\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n \r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n \r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n //if(isSafari) { // * fix opening keyboard while ESG is active \r\n part = -realDiff;\r\n //}\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.scrollTop = needScrollTop;\r\n }\r\n \r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n // @ts-ignore\r\n const resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(this.bubblesContainer);\r\n }\r\n }\r\n\r\n private saveOnUpdateScroll() {\r\n if(!this.onUpdateScrollSaver) {\r\n this.onUpdateScrollSaver = new ScrollSaver(this.scrollable, true);\r\n setTimeout(() => {\r\n this.onUpdateScrollSaver.restore();\r\n this.onUpdateScrollSaver = undefined;\r\n }, 0);\r\n\r\n this.onUpdateScrollSaver.save();\r\n }\r\n }\r\n\r\n private onBubblesMouseMove = (e: MouseEvent) => {\r\n const content = findUpClassName(e.target, 'bubble-content');\r\n if(content && !this.chat.selection.isSelecting) {\r\n const bubble = findUpClassName(content, 'bubble');\r\n if(!this.chat.selection.canSelectBubble(bubble)) {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n let {hoverBubble, hoverReaction} = this;\r\n if(bubble === hoverBubble) {\r\n return;\r\n }\r\n\r\n this.unhoverPrevious();\r\n\r\n hoverBubble = this.hoverBubble = bubble;\r\n hoverReaction = this.hoverReaction;\r\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\r\n if(!hoverReaction) {\r\n hoverReaction = this.hoverReaction = document.createElement('div');\r\n hoverReaction.classList.add('bubble-hover-reaction');\r\n\r\n const stickerWrapper = document.createElement('div');\r\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\r\n hoverReaction.append(stickerWrapper);\r\n\r\n content.append(hoverReaction);\r\n\r\n let message: Message.message = this.chat.getMessage(+bubble.dataset.mid);\r\n message = this.appMessagesManager.getGroupsFirstMessage(message);\r\n\r\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\r\n Promise.all([\r\n this.appReactionsManager.getAvailableReactionsByMessage(message),\r\n pause(400)\r\n ]).then(([availableReactions]) => {\r\n const availableReaction = availableReactions[0];\r\n if(!availableReaction) {\r\n hoverReaction.remove();\r\n return;\r\n }\r\n\r\n wrapSticker({\r\n div: stickerWrapper,\r\n doc: availableReaction.select_animation,\r\n width: 18,\r\n height: 18,\r\n needUpscale: true,\r\n middleware,\r\n group: CHAT_ANIMATION_GROUP,\r\n withThumb: false,\r\n needFadeIn: false\r\n }).then(player => {\r\n assumeType(player);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n player.addEventListener('firstFrame', () => {\r\n if(!middleware()) {\r\n // debugger;\r\n return;\r\n }\r\n\r\n hoverReaction.dataset.loaded = '1';\r\n this.setHoverVisible(hoverReaction, true);\r\n }, {once: true});\r\n\r\n attachClickEvent(hoverReaction, (e) => {\r\n cancelEvent(e); // cancel triggering selection\r\n\r\n this.appReactionsManager.sendReaction(message, availableReaction.reaction);\r\n this.unhoverPrevious();\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n } else if(hoverReaction.dataset.loaded) {\r\n this.setHoverVisible(hoverReaction, true);\r\n }\r\n } else {\r\n this.unhoverPrevious();\r\n }\r\n };\r\n\r\n public setReactionsHoverListeners() {\r\n this.listenerSetter.add(rootScope)('context_menu_toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(rootScope)('overlay_toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.bubblesContainer)('mousemove', this.onBubblesMouseMove);\r\n }\r\n\r\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\r\n SetTransition(hoverReaction, 'is-visible', visible, 200, visible ? undefined : () => {\r\n hoverReaction.remove();\r\n }, 2);\r\n }\r\n\r\n private unhoverPrevious = () => {\r\n const {hoverBubble, hoverReaction} = this;\r\n if(hoverBubble) {\r\n this.setHoverVisible(hoverReaction, false);\r\n this.hoverBubble = undefined;\r\n this.hoverReaction = undefined;\r\n }\r\n };\r\n\r\n public setStickyDateManually() {\r\n const timestamps = Object.keys(this.dateMessages).map(k => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.unreadedObserver.unobserve(target);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = rootScope.idle.focusPromise.then(() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map(i => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max(this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).maxId || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = this.chat.getMessage(mid);\r\n if(this.appMessagesManager.isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = () => {\r\n this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = (e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble) return;\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n new PopupDatePicker(new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const spoiler: HTMLElement = findUpClassName(target, 'spoiler');\r\n if(spoiler) {\r\n const messageDiv = findUpClassName(spoiler, 'message');\r\n\r\n const className = 'is-spoiler-visible';\r\n const isVisible = messageDiv.classList.contains(className);\r\n if(!isVisible) {\r\n cancelEvent(e);\r\n }\r\n\r\n const duration = 400 / 2;\r\n const showDuration = 5000;\r\n const useRafs = !isVisible ? 2 : 0;\r\n if(useRafs) {\r\n messageDiv.classList.add('will-change');\r\n }\r\n\r\n const spoilerTimeout = messageDiv.dataset.spoilerTimeout;\r\n if(spoilerTimeout !== null) {\r\n clearTimeout(+spoilerTimeout);\r\n delete messageDiv.dataset.spoilerTimeout;\r\n }\r\n\r\n SetTransition(messageDiv, className, true, duration, () => {\r\n messageDiv.dataset.spoilerTimeout = '' + window.setTimeout(() => {\r\n SetTransition(messageDiv, className, false, duration, () => {\r\n messageDiv.classList.remove('will-change');\r\n delete messageDiv.dataset.spoilerTimeout;\r\n });\r\n }, showDuration);\r\n }, useRafs);\r\n\r\n return;\r\n }\r\n\r\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\r\n if(reactionElement) {\r\n cancelEvent(e);\r\n if(reactionElement.classList.contains('is-inactive')) {\r\n return;\r\n }\r\n\r\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\r\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\r\n\r\n const message = reactionsElement.getMessage();\r\n this.appReactionsManager.sendReaction(message, reactionCount.reaction);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message = this.appMessagesManager.filterMessages(this.chat.getMessage(bubbleMid), message => !!(message as Message.message).replies)[0] as Message.message;\r\n const replies = message.replies;\r\n if(replies) {\r\n this.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then(message => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion', \r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer');\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n\r\n const doc = message.media?.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\r\n if(preloader) {\r\n simulateClickEvent(preloader);\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : Object.keys(this.bubbles).map(k => +k).filter(id => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find(e => e.element === this.bubbles[id])) return false;\r\n\r\n const message = this.chat.getMessage(id);\r\n const media = this.appMessagesManager.getMediaFromMessage(message);\r\n \r\n return media && f(media);\r\n }).sort((a, b) => a - b);\r\n\r\n ids.forEach(id => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex(t => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: this.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId, \r\n lastMsgId: replyToMid, \r\n type: this.chat.type, \r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public onGoDownClick() {\r\n if(this.replyFollowHistory.length) {\r\n forEachReverse(this.replyFollowHistory, (mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else {\r\n const message = this.chat.getMessage(mid);\r\n if(!message.deleted) {\r\n bad = false;\r\n }\r\n }\r\n \r\n if(bad) {\r\n this.replyFollowHistory.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n } else {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n }\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public getGroupedBubble(groupId: string) {\r\n const group = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n for(const [mid] of group) {\r\n if(this.bubbles[mid]) {\r\n const maxId = Math.max(...group.keys()); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: +mid,\r\n message: this.chat.getMessage(maxId) as Message.message\r\n };\r\n }\r\n }\r\n }\r\n\r\n public getBubbleByMessage(message: Message.message | Message.messageService) {\r\n if(!(message as Message.message).grouped_id) return this.bubbles[message.mid];\r\n const grouped = this.getGroupedBubble((message as Message.message).grouped_id);\r\n return grouped?.bubble;\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public getMountedBubble(mid: number, message = this.chat.getMessage(mid)) {\r\n if(message.grouped_id && this.appMessagesManager.getMidsByAlbum(message.grouped_id).length > 1) {\r\n const a = this.getGroupedBubble(message.grouped_id);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid, message};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number) {\r\n return this.bubbles[getObjectKeysAndSort(this.bubbles).find(id => {\r\n if(id < mid) return false;\r\n return !!this.bubbles[id]?.parentElement;\r\n })];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(!this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n const history = Object.keys(this.bubbles).map(id => +id).sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* if(history.length === 75) {\r\n this.log('load more', this.scrollable.scrollHeight, this.scrollable.scrollTop, this.scrollable);\r\n return;\r\n } */\r\n /* false && */this.getHistory(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n \r\n // if scroll down after search\r\n if(history.indexOf(historyStorage.maxId) !== -1) {\r\n this.setLoaded('bottom', true);\r\n return;\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* false && */this.getHistory(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = () => {\r\n //return;\r\n \r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.isHeavyAnimationInProgress && this.scrolledDown) return;\r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n const distanceToEnd = this.scrollable.getDistanceToEnd();\r\n if(!IS_TOUCH_SUPPORTED && this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n \r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }\r\n \r\n if(distanceToEnd < 300 && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.bubblesContainer.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.bubblesContainer.classList.contains('scrolled-down')) {\r\n this.bubblesContainer.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection);\r\n }\r\n\r\n this.setStickyDateManually();\r\n };\r\n\r\n public setScroll() {\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public updateUnreadByDialog() {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n if(bubble.classList.contains('is-outgoing')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\r\n bubble.classList.add('is-read');\r\n }\r\n \r\n this.unreadOut.delete(msgId);\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true) {\r\n let deleted = false;\r\n mids.forEach(mid => {\r\n if(!(mid in this.bubbles)) return;\r\n \r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n const bubble = this.bubbles[mid];\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeBubble(bubble);\r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.unobserve(bubble);\r\n this.unreaded.delete(bubble);\r\n }\r\n if(this.viewsObserver) {\r\n this.viewsObserver.unobserve(bubble);\r\n this.viewsMids.delete(mid);\r\n }\r\n //this.unreaded.findAndSplice(mid => mid === id);\r\n bubble.remove();\r\n //bubble.remove();\r\n\r\n if(this.emptyPlaceholderMid === mid) {\r\n this.emptyPlaceholderMid = undefined;\r\n }\r\n\r\n // this.reactions.delete(mid);\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n this.onScroll();\r\n }\r\n \r\n public renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(() => {\r\n if(!middleware()) return;\r\n this.renderNewMessagesByIds(mids);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = mids.filter(mid => {\r\n const message = this.chat.getMessage(mid);\r\n const replyTo = message.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter(mid => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble || \r\n this.scrollingToBubble === this.getLastBubble() || \r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.scrollTop = scrollHeight;\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n const promise = this.performHistoryResult(mids, false, true);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n promise.then(() => { // it will be called only once even if was set multiple times (that won't happen)\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n });\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n }\r\n\r\n public getLastBubble() {\r\n const lastDateGroup = this.getLastDateGroup();\r\n if(lastDateGroup) {\r\n return lastDateGroup.lastElementChild as HTMLElement;\r\n }\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end' && whichChild(bubble) === (this.stickyIntersector ? 2 : 1)/* && this.chat.setPeerPromise */) {\r\n const dateGroup = bubble.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n let margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n return this.scrollable.scrollIntoViewNew({\r\n element, \r\n position, \r\n margin, \r\n forceDirection, \r\n forceDuration, \r\n axis: 'y', \r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.bubblesContainer.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering\r\n });\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n private getLastDateGroup() {\r\n let lastTime = 0, lastElem: HTMLElement;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n if(dateMessage.firstTimestamp > lastTime) {\r\n lastElem = dateMessage.container;\r\n lastTime = dateMessage.firstTimestamp;\r\n }\r\n }\r\n\r\n return lastElem;\r\n }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n public getDateContainerByMessage(message: any, reverse: boolean) {\r\n const date = new Date(message.date * 1000);\r\n date.setHours(0, 0, 0);\r\n const dateTimestamp = date.getTime();\r\n if(!this.dateMessages[dateTimestamp]) {\r\n let dateElement: HTMLElement;\r\n \r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n \r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && message.date === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n \r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n ////////this.log('need to render date message', dateTimestamp, str);\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.unreadedObserver && this.unreadedObserver.disconnect();\r\n this.viewsObserver && this.viewsObserver.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.unreadedObserver && delete this.unreadedObserver;\r\n this.viewsObserver && delete this.viewsObserver;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.disconnect();\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n }\r\n\r\n if(this.viewsObserver) {\r\n this.viewsObserver.disconnect();\r\n this.viewsMids.clear();\r\n }\r\n \r\n this.loadedTopTimes = this.loadedBottomTimes = 0;\r\n \r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.emptyPlaceholderMid = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n // this.reactions.clear();\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n }\r\n\r\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string): {cached?: boolean, promise: Chat['setPeerPromise']} {\r\n //console.time('appImManager setPeer');\r\n //console.time('appImManager setPeer pre promise');\r\n ////console.time('appImManager: pre render start');\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.peerId = peerId;\r\n return null;\r\n }\r\n\r\n const samePeer = this.peerId === peerId;\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled' || this.chat.isRestricted) {\r\n lastMsgId = 0;\r\n }\r\n\r\n const historyStorage = this.historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n let topMessage = chatType === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : this.historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let followingUnread: boolean;\r\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId);\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\r\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\r\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\r\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\r\n }\r\n\r\n followingUnread = !isTarget;\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n //lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\r\n\r\n const {scrollable} = this;\r\n \r\n if(samePeer) {\r\n const mounted = this.getMountedBubble(lastMsgId);\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n scrollable.scrollTop = scrollable.scrollHeight;\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.chat.apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.peerId = peerId;\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: this.appPeersManager.isAnyGroup(peerId) || this.appUsersManager.isBot(peerId)\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('setPeer peerId:', peerId, this.historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\r\n\r\n /* this.setPeerPromise = null;\r\n this.preloader.detach();\r\n return true; */\r\n\r\n //////appSidebarRight.toggleSidebar(true);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map(mid => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n let result: ReturnType;\r\n if(!savedPosition) {\r\n result = this.getHistory(lastMsgId, true, isJump, additionMsgId);\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult(savedPosition.mids, true, false, undefined);\r\n }) as any,\r\n cached: true\r\n };\r\n }\r\n\r\n const {promise, cached} = result;\r\n\r\n // clear \r\n if(!cached) {\r\n if(!samePeer) {\r\n scrollable.container.textContent = '';\r\n //oldChatInner.remove();\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam);\r\n this.preloader.attach(this.bubblesContainer);\r\n }\r\n }\r\n\r\n //console.timeEnd('appImManager setPeer pre promise');\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n \r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = promise.then(() => {\r\n ////this.log('setPeer removing preloader');\r\n\r\n if(cached) {\r\n if(!samePeer) {\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam); // * костыль\r\n }\r\n } else {\r\n this.preloader.detach();\r\n }\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollPosition = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = savedPosition.top;\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if((topMessage && isJump) || isTarget) {\r\n const fromUp = maxBubbleId > 0 && (maxBubbleId < lastMsgId || lastMsgId < 0);\r\n if(!fromUp && samePeer) {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = 99999;\r\n } else if(fromUp/* && (samePeer || forwardingUnread) */) {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = 0;\r\n }\r\n\r\n const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n \r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n this.scrollToBubble(bubble, followingUnread ? 'start' : 'center', !samePeer ? FocusDirection.Static : undefined);\r\n if(!followingUnread) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n } else {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = 99999;\r\n }\r\n\r\n this.onScroll();\r\n\r\n const middleware = this.getMiddleware();\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n const needReactionsInterval = this.appPeersManager.isChannel(peerId);\r\n if(needReactionsInterval) {\r\n const middleware = this.getMiddleware();\r\n const fetchReactions = () => {\r\n if(!middleware()) return;\r\n\r\n const mids: number[] = [];\r\n for(const mid in this.bubbles) {\r\n let message: MyMessage = this.chat.getMessage(+mid);\r\n if(message._ !== 'message') {\r\n continue;\r\n }\r\n\r\n message = this.appMessagesManager.getGroupsFirstMessage(message);\r\n mids.push(message.mid);\r\n }\r\n\r\n const promise = mids.length ? this.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\r\n promise.then(() => {\r\n setTimeout(fetchReactions, 10e3);\r\n });\r\n };\r\n\r\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\r\n fetchReactions();\r\n });\r\n }\r\n\r\n const needFetchInterval = this.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n // warning\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n this.setLoaded('bottom', true);\r\n }\r\n } else {\r\n afterSetPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n scrollable.checkForTriggers();\r\n\r\n if(needFetchInterval) {\r\n const f = () => {\r\n this.fetchNewPromise = new Promise((resolve) => {\r\n if(!middleware() || !this.appMessagesManager.isFetchIntervalNeeded(peerId)) {\r\n resolve();\r\n return;\r\n }\r\n \r\n this.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((historyStorage) => {\r\n if(!middleware() || !historyStorage) {\r\n resolve();\r\n return;\r\n }\r\n \r\n const slice = historyStorage.history.slice;\r\n const isBottomEnd = slice.isEnd(SliceEnd.Bottom);\r\n if(scrollable.loadedAll.bottom && scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n });\r\n }\r\n \r\n this.log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(dialog?.pFlags.unread_mark) {\r\n this.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n\r\n /* if(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\r\n return new Promise((resolve) => fastRaf(resolve));\r\n } */\r\n //console.timeEnd('appImManager setPeer');\r\n }).catch(err => {\r\n this.log.error('getHistory promise error:', err);\r\n this.preloader.detach();\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n public onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const storage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n this.appMessagesManager.readHistory(this.peerId, storage.maxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public finishPeerChange() {\r\n const isChannel = this.appPeersManager.isChannel(this.peerId);\r\n const canWrite = this.chat.canSend();\r\n \r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.bubblesContainer.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', this.chat.isAnyGroup());\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n }\r\n\r\n public renderMessagesQueue(message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]) {\r\n /* let dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(reverse) dateMessage.container.insertBefore(bubble, dateMessage.div.nextSibling);\r\n else dateMessage.container.append(bubble);\r\n return; */\r\n\r\n /* if(DEBUG && message.mid === 4314759167) {\r\n this.log('renderMessagesQueue', message, bubble, reverse, promises);\r\n } */\r\n\r\n this.messagesQueue.push({message, bubble, reverse, promises});\r\n\r\n return this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(this.messagesQueuePromise || !this.messagesQueue.length) return Promise.resolve();\r\n\r\n return this.messagesQueuePromise = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n const queue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const promises = queue.reduce((acc, {promises}) => (acc.push(...promises), acc), []);\r\n\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n this.log('promises to call', promises, queue, this.isHeavyAnimationInProgress);\r\n const middleware = this.getMiddleware();\r\n Promise.all(promises).then(() => {\r\n if(!middleware()) {\r\n throw 'setMessagesQueuePromise: peer changed!';\r\n }\r\n\r\n if(this.messagesQueueOnRender) {\r\n this.messagesQueueOnRender();\r\n }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n queue.forEach(({message, bubble, reverse}) => {\r\n this.setBubblePosition(bubble, message, reverse);\r\n });\r\n\r\n //setTimeout(() => {\r\n resolve();\r\n //}, 500);\r\n this.messagesQueuePromise = null;\r\n\r\n if(this.messagesQueue.length) {\r\n this.setMessagesQueuePromise();\r\n }\r\n\r\n this.setUnreadDelimiter(); // не нашёл места лучше\r\n // this.setStickyDateManually();\r\n }).catch(reject);\r\n }, 0);\r\n });\r\n\r\n //this.messagesQueuePromise.catch(() => {});\r\n }\r\n\r\n public setBubblePosition(bubble: HTMLElement, message: Message.message | Message.messageService, reverse: boolean) {\r\n if(message.pFlags.local) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n\r\n const dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(this.chat.type === 'scheduled' || this.chat.type === 'pinned'/* || true */) { // ! TEMP COMMENTED\r\n const offset = this.stickyIntersector ? 2 : 1;\r\n let children = Array.from(dateMessage.container.children).slice(offset) as HTMLElement[];\r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < children.length; ++i) {\r\n const t = children[i];\r\n const timestamp = +t.dataset.timestamp;\r\n if(message.date < timestamp) {\r\n break;\r\n } else if(message.date === timestamp) {\r\n foundMidOnSameTimestamp = +t.dataset.mid;\r\n }\r\n \r\n if(foundMidOnSameTimestamp && message.mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n \r\n // * 1 for date, 1 for date sentinel\r\n let index = offset + i;\r\n /* if(bubble.parentElement) { // * if already mounted\r\n const currentIndex = whichChild(bubble);\r\n if(index > currentIndex) {\r\n index -= 1; // * minus for already mounted\r\n }\r\n } */\r\n \r\n positionElementByIndex(bubble, dateMessage.container, index);\r\n } else {\r\n if(reverse) {\r\n dateMessage.container.insertBefore(bubble, dateMessage.container.children[this.stickyIntersector ? 1 : 0].nextSibling);\r\n } else {\r\n dateMessage.container.append(bubble);\r\n }\r\n }\r\n\r\n if(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._))) {\r\n this.bubbleGroups.addBubble(bubble, message, reverse);\r\n } else {\r\n bubble.classList.add('is-group-first', 'is-group-last');\r\n }\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n \r\n // reverse means top\r\n private renderMessage(message: Message.message | Message.messageService, reverse = false, multipleRender = false, bubble: HTMLElement = null, updatePosition = true) {\r\n /* if(DEBUG) {\r\n this.log.debug('message to render:', message);\r\n } */\r\n if(!bubble && this.bubbles[message.mid]) {\r\n return;\r\n }\r\n\r\n const isMessage = message._ === 'message';\r\n const groupId = isMessage && message.grouped_id;\r\n\r\n //return;\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(message.deleted) return;\r\n else if(groupId && albumMustBeRenderedFull) { // will render only last album's message\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n const maxId = Math.max(...storage.keys());\r\n if(message.mid < maxId) {\r\n return;\r\n }\r\n }\r\n \r\n const peerId = this.peerId;\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = message.fromId === rootScope.myId || (message.pFlags.out && this.appPeersManager.isMegagroup(peerId));\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n //messageDiv.innerText = message.message;\r\n\r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n // bubble\r\n if(!bubble) {\r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble = document.createElement('div');\r\n bubble.classList.add('bubble');\r\n contentWrapper.appendChild(bubbleContainer);\r\n bubble.appendChild(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.unreadedObserver) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n this.appMessagesManager.isMentionUnread(message) || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid);\r\n if(isUnread) {\r\n this.unreadedObserver.observe(bubble); \r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n } else {\r\n const save = ['is-highlighted', 'is-group-first', 'is-group-last'];\r\n const wasClassNames = bubble.className.split(' ');\r\n const classNames = ['bubble'].concat(save.filter(c => wasClassNames.includes(c)));\r\n bubble.className = classNames.join(' ');\r\n\r\n contentWrapper = bubble.lastElementChild as HTMLElement;\r\n if(!contentWrapper.classList.contains('bubble-content-wrapper')) {\r\n contentWrapper = bubble.querySelector('.bubble-content-wrapper');\r\n }\r\n \r\n bubbleContainer = contentWrapper.firstElementChild as HTMLDivElement;\r\n bubbleContainer.innerHTML = '';\r\n bubbleContainer.style.cssText = '';\r\n contentWrapper.innerHTML = '';\r\n contentWrapper.appendChild(bubbleContainer);\r\n //bubbleContainer.style.marginBottom = '';\r\n const transitionDelay = contentWrapper.style.transitionDelay;\r\n contentWrapper.style.cssText = '';\r\n contentWrapper.style.transitionDelay = transitionDelay;\r\n\r\n if(bubble === this.firstUnreadBubble) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n // * Нужно очистить прошлую информацию, полезно если удалить последний элемент из альбома в ПОСЛЕДНЕМ БАББЛЕ ГРУППЫ (видно по аватару)\r\n const originalMid = +bubble.dataset.mid;\r\n const sameMid = +message.mid === originalMid;\r\n /* if(updatePosition) {\r\n bubble.remove(); // * for positionElementByIndex\r\n } */\r\n\r\n if(!sameMid) {\r\n delete this.bubbles[originalMid];\r\n this.skippedMids.delete(originalMid);\r\n }\r\n\r\n //bubble.innerHTML = '';\r\n }\r\n\r\n // ! reset due to album edit or delete item\r\n this.bubbles[+message.mid] = bubble;\r\n bubble.dataset.mid = '' + message.mid;\r\n bubble.dataset.peerId = '' + message.peerId;\r\n bubble.dataset.timestamp = '' + message.date;\r\n\r\n const loadPromises: Promise[] = [];\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n this.skippedMids.add(+message.mid);\r\n return bubble;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n s.append(i18n('ChatMigration.From', [new PeerTitle({peerId: action.chat_id.toPeerId(true)}).element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n s.append(i18n('ChatMigration.To', [new PeerTitle({peerId: action.channel_id.toPeerId(true)}).element]));\r\n } else {\r\n s.append(this.appMessagesManager.wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document && \r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupId && albumMustBeRenderedFull) {\r\n const t = this.appMessagesManager.getAlbumText(groupId);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n \r\n /* let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = this.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n attachmentDiv.innerHTML = richText;\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n\r\n const timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type, \r\n message\r\n });\r\n messageDiv.append(timeSpan);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n bubble.classList.add('channel-post');\r\n\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n if(!message.pFlags.is_outgoing && this.viewsObserver) {\r\n this.viewsObserver.observe(bubble);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = RichTextProcessor.wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = RichTextProcessor.wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.appInlineBotsManager.checkSwitchReturn(botId).then(peerId => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then(peerId => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button);\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n if(isOutgoing) {\r\n bubble.classList.add('is-outgoing');\r\n }\r\n\r\n const messageWithReplies = isMessage && this.appMessagesManager.getMessageWithReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = our && (!fwdFrom || this.peerId !== rootScope.myId);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n \r\n let processingWebPage = false;\r\n \r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n ////////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n \r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n \r\n break;\r\n }\r\n \r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo, \r\n message,\r\n container: attachmentDiv,\r\n withTail, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webpage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webpage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webpage.photo as any;\r\n if(photo || webpage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n \r\n const doc = webpage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message: message as Message.message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n //}\r\n } else {\r\n const docDiv = wrapDocument({\r\n message,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webpage.site_name) {\r\n const html = RichTextProcessor.wrapRichText(webpage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, RichTextProcessor.wrapEmojiText(webpage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, webpage.rTitle);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n this.appPhotosManager.setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n }\r\n \r\n box.append(quote);\r\n \r\n //bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n \r\n //this.log('night running', bubble.scrollHeight);\r\n \r\n break;\r\n }\r\n \r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n this.appPhotosManager.setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\r\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc, \r\n container: attachmentDiv, \r\n message: message as Message.message, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n\r\n const newNameContainer = wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n lastContainer && lastContainer.append(timeSpan);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ? \r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') : \r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const texts = [];\r\n if(contact.first_name) texts.push(RichTextProcessor.wrapEmojiText(contact.first_name));\r\n if(contact.last_name) texts.push(RichTextProcessor.wrapEmojiText(contact.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.setAttribute('peer', '' + contact.user_id.toPeerId());\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.appPeersManager.isAnyGroup(peerId)) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n \r\n let isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + this.appUsersManager.getUser(message.viaBotId).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(fwdFrom.from_name);\r\n title.classList.add('peer-title');\r\n //title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n \r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n \r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n if(!our) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n\r\n const needAvatar = this.chat.isAnyGroup() && !isOut;\r\n if(needAvatar) {\r\n let avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.classList.add('user-avatar', 'avatar-40');\r\n avatarElem.loadPromises = loadPromises;\r\n\r\n if(!fwdFromId && fwdFrom && fwdFrom.from_name) {\r\n avatarElem.setAttribute('peer-title', /* '🔥 FF 🔥' */fwdFrom.from_name);\r\n }\r\n\r\n avatarElem.setAttribute('peer', '' + (((fwdFrom && (this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID));\r\n //avatarElem.update();\r\n \r\n //this.log('exec loadDialogPhoto', message);\r\n\r\n contentWrapper.append(avatarElem);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n }\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n this.appendReactionsElementToBubble(bubble, message);\r\n }\r\n\r\n /* if(isMessage) {\r\n const reactionHover = document.createElement('div');\r\n reactionHover.classList.add('bubble-reaction-hover');\r\n contentWrapper.append(reactionHover);\r\n } */\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n private appendReactionsElementToBubble(bubble: HTMLElement, message: Message.message, changedResults?: ReactionCount[]) {\r\n if(this.peerId.isUser()) {\r\n return;\r\n }\r\n\r\n const reactionsMessage = this.appMessagesManager.getGroupsFirstMessage(message);\r\n if(!reactionsMessage.reactions || !reactionsMessage.reactions.results.length) {\r\n return;\r\n }\r\n\r\n // message = this.appMessagesManager.getMessageWithReactions(message);\r\n\r\n const reactionsElement = new ReactionsElement();\r\n reactionsElement.init(reactionsMessage, 'block');\r\n reactionsElement.render(changedResults);\r\n\r\n if(bubble.classList.contains('is-message-empty')) {\r\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\r\n } else {\r\n const messageDiv = bubble.querySelector('.message');\r\n if(bubble.classList.contains('is-multiple-documents')) {\r\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\r\n let documentMessageDiv = documentContainer.querySelector('.document-message');\r\n\r\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\r\n if(!timeSpan) {\r\n timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message\r\n });\r\n }\r\n \r\n reactionsElement.append(timeSpan);\r\n\r\n if(!documentMessageDiv) {\r\n documentMessageDiv = document.createElement('div');\r\n documentMessageDiv.classList.add('document-message');\r\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\r\n }\r\n\r\n documentMessageDiv.append(reactionsElement);\r\n } else {\r\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\r\n reactionsElement.append(timeSpan);\r\n \r\n messageDiv.append(reactionsElement);\r\n }\r\n }\r\n }\r\n\r\n private safeRenderMessage(message: any, reverse?: boolean, multipleRender?: boolean, bubble?: HTMLElement, updatePosition?: boolean) {\r\n try {\r\n return this.renderMessage(message, reverse, multipleRender, bubble, updatePosition);\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n }\r\n\r\n public async performHistoryResult(history: (Message.message | Message.messageService | number)[], reverse: boolean, isBackLimit: boolean, additionMsgId?: number) {\r\n // commented bot getProfile in getHistory!\r\n // if(!history/* .filter((id: number) => id > 0) */.length) {\r\n // if(!isBackLimit) {\r\n // this.scrollable.loadedAll.top = true;\r\n\r\n // /* if(this.chat.type === 'discussion') {\r\n // const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n // if(serviceStartMessageId) history.push(serviceStartMessageId);\r\n // history.push(this.chat.threadId);\r\n // } */\r\n // } else {\r\n // this.scrollable.loadedAll.bottom = true;\r\n // }\r\n // }\r\n\r\n history = history.slice(); // need\r\n\r\n if(additionMsgId) {\r\n history.unshift(additionMsgId);\r\n }\r\n\r\n /* if(testScroll && additionMsgID) {\r\n for(let i = 0; i < 3; ++i) {\r\n let _history = history.slice();\r\n setTimeout(() => {\r\n this.performHistoryResult(_history, reverse, isBackLimit, 0, resetPromises);\r\n }, 0);\r\n }\r\n } */\r\n\r\n //console.time('appImManager render history');\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 1e3));\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will render some messages:', history.length, this.isHeavyAnimationInProgress, this.messagesQueuePromise);\r\n } */\r\n\r\n let scrollSaver: ScrollSaver;\r\n this.messagesQueueOnRender = () => {\r\n scrollSaver = new ScrollSaver(this.scrollable, reverse);\r\n scrollSaver.save();\r\n };\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (mid: typeof history[0]) => {\r\n const message: Message.message | Message.messageService = typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n if(message.pFlags.local) {\r\n this.processLocalMessageRender(message);\r\n } else {\r\n this.safeRenderMessage(message, reverse, true);\r\n }\r\n };\r\n\r\n const length = history.length;\r\n if(reverse) for(let i = 0; i < length; ++i) cb(history[i]);\r\n else for(let i = length - 1; i >= 0; --i) cb(history[i]);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n this.setLoaded('bottom', true, false);\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n this.setLoaded('top', true, false);\r\n }\r\n } else {\r\n this.setLoaded('top', true);\r\n this.setLoaded('bottom', true);\r\n }\r\n\r\n await this.messagesQueuePromise;//.then(() => new Promise(resolve => setTimeout(resolve, 100)))\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore(history.length === 1 && !reverse ? false : true);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then(history => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n const promise = this.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n })\r\n .then(value => ({history: value.history.map(m => m.mid)}));\r\n\r\n return promise;\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {history: mids.slice().reverse()};\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter(mid => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex(mid => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex(mid => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n this.log('getHistory: targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)), \r\n bottomIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n if(!this.bubbles[mid] || this.skippedMids.has(mid)) {\r\n this.log.warn('animateAsLadder: no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n const contentWrapper = this.bubbles[mid].lastElementChild as HTMLElement;\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n \r\n contentWrapper.classList.add('zoom-fade');\r\n contentWrapper.style.transitionDelay = lastMsDelay + 'ms';\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n \r\n //this.log('supa', bubble);\r\n\r\n setBubbles.push(contentWrapper);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n // fastRaf(() => {\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.classList.remove('zoom-fade');\r\n });\r\n });\r\n // });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.style.transitionDelay = '';\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n if(!IS_SAFARI) {\r\n this.needReflowScroll = true;\r\n }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private renderEmptyPlaceholder(type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted', bubble: HTMLElement, message: any, elements: (Node | string)[]) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n else if(type === 'restricted') {\r\n title = document.createElement('span');\r\n title.innerText = this.appPeersManager.getRestrictionReasonText(this.peerId);\r\n }\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n this.messagesQueue.findAndSplice(q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n const loadPromise = this.appStickersManager.getGreetingSticker().then(doc => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n this.renderMessagesQueue(message, bubble, false, [loadPromise]);\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map(elem => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private processLocalMessageRender(message: Message.message | Message.messageService) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const bubble = this.safeRenderMessage(message, undefined, undefined, undefined, isSponsored);\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.appPeersManager.isBot(this.peerId);\r\n if(this.chat.isRestricted) {\r\n this.renderEmptyPlaceholder('restricted', bubble, message, elements);\r\n } else if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = this.appPeersManager.getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = this.appMessagesIdsManager.generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param || this.appUsersManager.isBot(peerId.toUserId())) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = this.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite).show();\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n \r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.viewsObserver.observe(button); \r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n } else if(this.appPeersManager.isAnyGroup(this.peerId) && this.appPeersManager.getPeer(this.peerId).pFlags.creator) {\r\n this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.appPeersManager.isUser(this.peerId) && !isBot && this.chat.canSend() && this.chat.type === 'chat') {\r\n this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n /* for(let i = 1; i < elements.length; i += 2) {\r\n elements.splice(i, 0, '\\n');\r\n } */\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const method: 'append' | 'prepend' = isSponsored ? 'append' : 'prepend';\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.onAnimateLadder = () => {\r\n this.chatInner[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else {\r\n this.chatInner[method](bubble);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderMid = message.mid;\r\n // }\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n let offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = this.appMessagesIdsManager.generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(this.appMessagesIdsManager.generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): GenerateLocalMessageType {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n const message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: this.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n this.appMessagesManager.saveMessages([message], {storage: new Map()});\r\n message.mid = mid;\r\n return message;\r\n }\r\n\r\n private setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n /* if(!checkPlaceholders) {\r\n return;\r\n } */\r\n\r\n if(side === 'bottom' && this.appPeersManager.isBroadcast(this.peerId) && !this.chat.isRestricted/* && false */) {\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n \r\n const promise = this.getSponsoredMessagePromise = this.chat.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId())\r\n }, {cacheSeconds: 300}).then(sponsoredMessages => {\r\n if(!middleware()) return;\r\n\r\n /* forEachReverse(sponsoredMessages.messages, (message, idx, arr) => {\r\n if(message.chat_invite || message.chat_invite_hash) {\r\n arr.splice(idx, 1);\r\n }\r\n }); */\r\n\r\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\r\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\r\n \r\n const sponsoredMessage = sponsoredMessages.messages.shift();\r\n if(!sponsoredMessage) {\r\n return;\r\n }\r\n\r\n sponsoredMessages.messages.push(sponsoredMessage);\r\n const message = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n \r\n return Promise.all([\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(() => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n const promise = this.performHistoryResult([message], false, true);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n if(side === 'top' && value && this.appPeersManager.isBot(this.peerId) && !this.chat.isRestricted) {\r\n this.log('inject bot description');\r\n\r\n const middleware = this.getMiddleware();\r\n return Promise.resolve(this.appProfileManager.getProfile(this.peerId.toUserId())).then(userFull => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n this.checkIfEmptyPlaceholderNeeded();\r\n return;\r\n }\r\n\r\n const message = this.generateLocalFirstMessage(false, message => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n this.processLocalMessageRender(message);\r\n });\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n public checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderMid === undefined && \r\n (\r\n this.chat.isRestricted || \r\n !this.appMessagesManager.getHistoryStorage(this.peerId).count || \r\n (\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = this.generateLocalFirstMessage(true);\r\n this.processLocalMessageRender(message);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public getHistory(maxId = 0, reverse = false, isBackLimit = false, additionMsgId = 0, justLoad = false): {cached: boolean, promise: Promise} {\r\n const peerId = this.peerId;\r\n\r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 48/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(true)};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = this.chat.getMessage(additionMsgIds[i]);\r\n if(message.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: ReturnType | {history: number[]} = this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: Promise;\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result instanceof Promise && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && result instanceof Promise;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && result instanceof Promise) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result as Promise;\r\n result = {history: additionMsgIds};\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: typeof result) => {\r\n if('offsetIdOffset' in historyResult && historyResult.history.isEnd(SliceEnd.Top)) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n //this.log('discussion got history', loadCount, backLimit, historyResult, isTopEnd);\r\n const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n historyResult.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse());\r\n }\r\n\r\n await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (result: HistoryResult) => {\r\n /* if(maxId && result.history?.length) {\r\n if(this.bubbles[maxId]) {\r\n result.history.findAndSplice(mid => mid === maxId); \r\n }\r\n } */\r\n\r\n ////console.timeEnd('render history total');\r\n \r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(result);\r\n }).then(() => {\r\n return this.performHistoryResult(result.history || [], reverse, isBackLimit, !isAdditionRender && additionMsgId);\r\n });\r\n };\r\n\r\n const processPromise = (result: Promise) => {\r\n const promise = result.then((result) => {\r\n //this.log('getHistory not cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n\r\n if(reverse ? this.getHistoryTopPromise !== promise : this.getHistoryBottomPromise !== promise) {\r\n this.log.warn('getHistory: peer changed');\r\n ////console.timeEnd('render history total');\r\n return Promise.reject();\r\n }\r\n\r\n if(justLoad) {\r\n this.scrollable.onScroll(); // нужно делать из-за ранней прогрузки\r\n return true;\r\n }\r\n //console.timeEnd('appImManager call getHistory');\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(result instanceof Promise) {\r\n cached = false;\r\n promise = processPromise(result);\r\n } else if(justLoad) {\r\n return null;\r\n } else {\r\n cached = true;\r\n //this.log('getHistory cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n promise = sup(result as HistoryResult);\r\n //return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise);\r\n //return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('ship went past rocks of magnets');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n });\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n /* false && */!isFirstMessageRender && promise.then(() => {\r\n if(reverse) {\r\n this.loadedTopTimes++;\r\n this.loadedBottomTimes = Math.max(0, --this.loadedBottomTimes);\r\n } else {\r\n this.loadedBottomTimes++;\r\n this.loadedTopTimes = Math.max(0, --this.loadedTopTimes);\r\n }\r\n\r\n let ids: number[];\r\n if((reverse && this.loadedTopTimes > 2) || (!reverse && this.loadedBottomTimes > 2)) {\r\n ids = getObjectKeysAndSort(this.bubbles);\r\n }\r\n\r\n //let removeCount = loadCount / 2;\r\n const safeCount = realLoadCount * 2; // cause i've been runningrunningrunning all day\r\n //this.log('getHistory: slice loadedTimes:', reverse, pageCount, this.loadedTopTimes, this.loadedBottomTimes, ids?.length, safeCount);\r\n if(ids && ids.length > safeCount) {\r\n if(reverse) {\r\n //ids = ids.slice(-removeCount);\r\n //ids = ids.slice(removeCount * 2);\r\n ids = ids.slice(safeCount);\r\n this.setLoaded('bottom', false);\r\n\r\n //this.log('getHistory: slice bottom messages:', ids.length, loadCount);\r\n //this.getHistoryBottomPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n } else {\r\n //ids = ids.slice(0, removeCount);\r\n //ids = ids.slice(0, ids.length - (removeCount * 2));\r\n ids = ids.slice(0, ids.length - safeCount);\r\n this.setLoaded('top', false);\r\n\r\n //this.log('getHistory: slice up messages:', ids.length, loadCount);\r\n //this.getHistoryTopPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n }\r\n\r\n //this.log('getHistory: will slice ids:', ids, reverse);\r\n\r\n this.deleteMessagesByIds(ids, false);\r\n }\r\n });\r\n\r\n promise.then(() => {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n });\r\n\r\n return {cached, promise};\r\n }\r\n\r\n public setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n let readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter(mid => !this.bubbles[mid].classList.contains('is-out'))\r\n .map(i => +i)\r\n .sort((a, b) => a - b)\r\n .find(i => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyStorage.maxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = 1 + +!!this.stickyIntersector;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\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 appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(peerId: PeerId, mid: number, unpin?: true, onConfirm?: () => void) {\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const canUnpin = appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + (appMessagesManager.pinnedMessages[peerId]?.count || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\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\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\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 { ReportReason } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport { wrapSticker } from \"../wrappers\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then(bool => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const doc = appStickersManager.getAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n const size = 100;\n wrapSticker({\n doc,\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n loop: false,\n play: true\n }).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { ReportReason } from \"../../layer\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach(b => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = appStickersManager.preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\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 I18n, { i18n } from \"../../lib/langPack\";\nimport Scrollable from \"../scrollable\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }]\n });\n\n const scrollable = new Scrollable(undefined);\n scrollable.onAdditionalScroll = () => {\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\n };\n\n this.description.replaceWith(scrollable.container);\n\n scrollable.container.append(this.description);\n scrollable.container.classList.add('scrolled-top');\n\n this.show();\n }\n}\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport PopupElement from \".\";\nimport { Message } from \"../../layer\";\nimport { generateDelimiter, SettingSection } from \"../sidebarLeft\";\nimport ReactionsElement from \"../chat/reactions\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport Scrollable from \"../scrollable\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport appDialogsManager from \"../../lib/appManagers/appDialogsManager\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport { wrapSticker } from \"../wrappers\";\nimport ReactionElement from \"../chat/reaction\";\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private appMessagesManager: AppMessagesManager, \n private message: Message.message\n ) {\n super('popup-reacted-list', /* [{\n langKey: 'Close',\n isCancel: true\n }] */null, {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const message = this.appMessagesManager.getGroupsFirstMessage(this.message);\n\n const canViewReadParticipants = this.appMessagesManager.canViewMessageReadParticipants(message);\n\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map(reactionCount => {\n return {\n ...reactionCount,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block');\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n \n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n \n newMessage.reactions.results.forEach(reactionCount => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = reactionCount.reaction !== 'checks';\n const skipReactionsList = reactionCount.reaction === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction)) {\n reactionCount.reaction = undefined;\n }\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n result.combined.forEach(({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 54,\n rippleEnabled: false,\n meAsSaved: false,\n drawStatus: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n const availableReaction = appReactionsManager.getReactionCached(reaction);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24\n });\n \n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, appUsersManager.getUserStatusString(peerId.toUserId()));\n });\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n \n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n });\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block');\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport noop from \"../../helpers/noop\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { Message, AvailableReaction } from \"../../layer\";\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport Scrollable, { ScrollableBase, ScrollableX } from \"../scrollable\";\nimport { wrapSticker } from \"../wrappers\";\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 28;\nconst PADDING = 4;\nconst REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: string\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n private container: HTMLElement;\n private reactionsMap: Map;\n private scrollable: ScrollableBase;\n private animationGroup: string;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private appReactionsManager: AppReactionsManager,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n ['big'].forEach(type => {\n const bubble = document.createElement('div');\n bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n reactionsContainer.append(bubble);\n });\n\n this.reactionsMap = new Map();\n this.animationGroup = 'CHAT-MENU-REACTIONS-' + Date.now();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach(reaction => {\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(rootScope.settings.animationsEnabled) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: reaction.reaction\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!rootScope.settings.animationsEnabled) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(player => {\n assumeType(player);\n \n players.appear = player;\n \n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n \n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n \n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(player => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n \n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n \n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\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 type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, MenuPositionPadding, openBtnMenu, positionMenu } from \"../misc\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport PopupSponsored from \"../popups/sponsored\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport { IS_APPLE } from \"../../environment/userAgent\";\r\nimport PopupReactedList from \"../popups/reactedList\";\r\nimport { ChatReactionsMenu } from \"./reactionsMenu\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private isSponsored: boolean;\r\n private isOverBubble: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n private reactionsMenu: ChatReactionsMenu;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private viewerPeerId: PeerId;\r\n private middleware: ReturnType;\r\n private canOpenReactedList: boolean;\r\n\r\n constructor(\r\n private attachTo: HTMLElement, \r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appPeersManager: AppPeersManager, \r\n private appPollsManager: AppPollsManager,\r\n private appDocsManager: AppDocsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appReactionsManager: AppReactionsManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.middleware = getMiddleware();\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(attachTo, (e) => {\r\n if(chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n const className = (e.target as HTMLElement).className;\r\n if(!className || !className.includes) return;\r\n\r\n chat.log('touchend', e);\r\n\r\n const good = ['bubble', 'bubble-content-wrapper', 'bubble-content', 'message', 'time', 'inner'].find(c => className.match(new RegExp(c + '($|\\\\s)')));\r\n if(good) {\r\n cancelEvent(e);\r\n //onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n this.onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.chat.bubbles.listenerSetter});\r\n } else attachContextMenuListener(attachTo, this.onContextMenu, this.chat.bubbles.listenerSetter);\r\n }\r\n\r\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n let element = this.element;\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(element && element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n\r\n const isSponsored = this.isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n //this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' || \r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(this.chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find(mid => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n this.isOverBubble = !!contentWrapper;\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = this.chat.getMessage(this.mid);\r\n this.noForwards = !isSponsored && !this.appMessagesManager.canForward(this.message);\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n\r\n const initResult = this.init();\r\n element = initResult.element;\r\n const {cleanup, destroy, menuPadding} = initResult;\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\r\n openBtnMenu(element, () => {\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n cleanup();\r\n\r\n setTimeout(() => {\r\n destroy();\r\n }, 300);\r\n });\r\n };\r\n\r\n public cleanup() {\r\n this.listenerSetter.removeAll();\r\n this.reactionsMenu && this.reactionsMenu.cleanup();\r\n this.middleware.clean();\r\n }\r\n\r\n public destroy() {\r\n this.cleanup();\r\n }\r\n\r\n private filterButtons(buttons: ChatContextMenu['buttons']) {\r\n if(this.isSponsored) {\r\n return buttons.filter(button => {\r\n return button.isSponsored;\r\n });\r\n } else {\r\n return buttons.filter(button => {\r\n let good: boolean;\r\n\r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(this.chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ? \r\n button.verify() : \r\n button.notDirect && button.verify() && button.notDirect();\r\n }\r\n\r\n return good;\r\n });\r\n }\r\n }\r\n\r\n private setButtons() {\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: () => this.chat.canSend() && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: () => this.appMessagesManager.canEditMessage(this.message, 'text') && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n if(!!this.appMessagesManager.getMessageByPeer(peerId, mid).message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: () => this.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: () => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n this.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: () => (this.message as Message.message).pFlags.pinned && this.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n this.appDocsManager.saveDocFile((this.message as any).media.document);\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll;\r\n return this.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || !this.message.pFlags.out) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: () => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && this.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n onClick: () => {\r\n if(this.viewerPeerId) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: this.viewerPeerId\r\n });\r\n } else if(this.canOpenReactedList) {\r\n new PopupReactedList(this.appMessagesManager, this.message as Message.message);\r\n } else {\r\n return false;\r\n }\r\n },\r\n verify: () => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || this.appMessagesManager.canViewMessageReadParticipants(this.message)),\r\n notDirect: () => true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n }\r\n\r\n private init() {\r\n this.cleanup();\r\n this.setButtons();\r\n \r\n const filteredButtons = this.filterButtons(this.buttons);\r\n const element = this.element = ButtonMenu(filteredButtons, this.listenerSetter);\r\n element.id = 'bubble-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n const viewsButton = filteredButtons.find(button => !button.icon);\r\n if(viewsButton) {\r\n const reactions = (this.message as Message.message).reactions;\r\n const recentReactions = reactions?.recent_reactions;\r\n const isViewingReactions = !!recentReactions?.length;\r\n const participantsCount = this.appMessagesManager.canViewMessageReadParticipants(this.message) ? (this.appPeersManager.getPeer(this.peerId) as MTChat.chat).participants_count : undefined;\r\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\r\n\r\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\r\n const i18nElem = new I18n.IntlElement({\r\n key: isViewingReactions ? (\r\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\r\n ) : 'NobodyViewed',\r\n args: isViewingReactions ? (\r\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\r\n ) : undefined,\r\n element: viewsButton.textElement\r\n });\r\n\r\n let fakeText: HTMLElement;\r\n if(isViewingReactions) {\r\n if(participantsCount === undefined) {\r\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\r\n } else {\r\n fakeText = i18n(\r\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n [recentReactions.length, participantsCount]\r\n );\r\n }\r\n } else {\r\n fakeText = i18n('Loading');\r\n }\r\n\r\n fakeText.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeText);\r\n\r\n const MAX_AVATARS = 3;\r\n const PADDING_PER_AVATAR = .875;\r\n i18nElem.element.style.visibility = 'hidden';\r\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\r\n const middleware = this.middleware.get();\r\n this.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(fakeText) {\r\n fakeText.remove();\r\n }\r\n\r\n const reactions = result.combined;\r\n const reactedLength = participantsCount === undefined ? \r\n result.reactionsCount : \r\n (\r\n isViewingReactions ? \r\n reactions.filter(reaction => reaction.reaction).length : \r\n reactions.length\r\n );\r\n\r\n let fakeElem: HTMLElement;\r\n if(reactions.length === 1) {\r\n fakeElem = new PeerTitle({\r\n peerId: reactions[0].peerId,\r\n onlyFirstName: true,\r\n dialog: false,\r\n }).element;\r\n\r\n if(!isViewingReactions || result.readParticipants.length <= 1) {\r\n this.viewerPeerId = reactions[0].peerId;\r\n }\r\n } else if(isViewingReactions) {\r\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\r\n fakeElem = i18n(\r\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n isFull ? [reactedLength] : [reactedLength, reactions.length]\r\n );\r\n } else {\r\n if(!reactions.length) {\r\n i18nElem.element.style.visibility = '';\r\n } else {\r\n fakeElem = i18n('MessageSeen', [reactions.length]);\r\n }\r\n }\r\n\r\n if(fakeElem) {\r\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\r\n fakeElem.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeElem);\r\n }\r\n\r\n if(reactions.length) {\r\n const avatars = new StackedAvatars({avatarSize: 24});\r\n avatars.render(recentReactions ? recentReactions.map(r => this.appPeersManager.getPeerId(r.peer_id)) : reactions.map(reaction => reaction.peerId));\r\n viewsButton.element.append(avatars.container);\r\n\r\n // if(reactions.length > 1) {\r\n // if(isViewingReactions) {\r\n this.canOpenReactedList = true;\r\n // }\r\n }\r\n });\r\n }\r\n\r\n let menuPadding: MenuPositionPadding;\r\n let reactionsMenu: ChatReactionsMenu;\r\n if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n const position: 'horizontal' | 'vertical' = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.appReactionsManager, position, this.middleware);\r\n reactionsMenu.init(this.appMessagesManager.getGroupsFirstMessage(this.message));\r\n element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 42;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n if(position === 'vertical') {\r\n menuPadding = {\r\n top: 24,\r\n // bottom: 36, // positionMenu will detect it itself somehow\r\n left: totalSize\r\n };\r\n } else {\r\n menuPadding = {\r\n top: totalSize,\r\n right: 36,\r\n left: 24\r\n };\r\n }\r\n }\r\n\r\n this.chat.container.append(element);\r\n\r\n return {\r\n element, \r\n cleanup: () => {\r\n this.cleanup();\r\n reactionsMenu && reactionsMenu.cleanup();\r\n },\r\n destroy: () => {\r\n element.remove();\r\n },\r\n menuPadding\r\n };\r\n }\r\n\r\n private onSendScheduledClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = () => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const str = mids.reduce((acc, mid) => {\r\n const message = this.chat.getMessage(mid);\r\n return acc + (message?.message ? message.message + '\\n' : '');\r\n }, '').trim();\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = () => {\r\n let threadMessage: Message.message;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = this.appMessagesManager.getMessageByPeer(this.peerId, this.chat.threadId);\r\n }\r\n\r\n const username = this.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : this.peerId);\r\n const msgId = this.appMessagesIdsManager.getServerMessageId(this.mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? this.appMessagesIdsManager.getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + this.peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + this.appMessagesIdsManager.getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [this.peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid), this.chat.type);\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 { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu } from \"../misc\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\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 Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!this.chat.appPeersManager.isBroadcast(this.chat.peerId)) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map(el => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach(el => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach(el => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter(v => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find(a => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = this.chat.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n ...this.chat.getMessageSendingParams()\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption', \r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId, \r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '', \r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n \r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement, \r\n position: 'center'\r\n });\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then(response => response.arrayBuffer())\n .then(arrayBuffer => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\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 Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { prepareAlbum, wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo, onMediaLoad } from \"../../helpers/files\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport rootScope from \"../../lib/rootScope\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: rootScope.config.caption_length_max\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find(file => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter(file => {\n const found = this.files.find(_file => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > rootScope.config.caption_length_max) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach(d => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.chat.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.chat.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map(d => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private attachMedia(file: File, params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = document.createElement('video');\n const source = document.createElement('source');\n source.src = params.objectURL = URL.createObjectURL(file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n video.setAttribute('playsinline', 'true');\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n return createPosterFromVideo(video).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n });\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then(duration => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = URL.createObjectURL(file);\n }\n\n return promise;\n }\n\n private attachDocument(file: File, params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio) {\n params.objectURL = URL.createObjectURL(file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n fileName: file.name ? RichTextProcessor.wrapEmojiText(file.name) : '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n cacheContext.url = params.objectURL;\n cacheContext.downloaded = file.size;\n\n const docDiv = wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(file, params, itemDiv) : this.attachDocument(file, params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach(file => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter(n => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach(p => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map(s => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map(o => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\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 fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport { cancelEvent } from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string[]\r\n}) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS)); \r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable, \r\n element: target as HTMLElement, \r\n position: 'center', \r\n forceDuration: 100, \r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\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 attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n hiding: () => void\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller?: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller && this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list, \r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\r\n if(this.init) {\r\n return;\r\n }\r\n \r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller && this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController && this.controller) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n const useRafs = this.controller || hide ? 0 : 2;\r\n\r\n if(hide) {\r\n this.dispatchEvent('hiding');\r\n }\r\n\r\n SetTransition(\r\n this.container, \r\n 'is-visible', \r\n !hide, \r\n rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0, \r\n () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n }, \r\n useRafs\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 mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n appStickersManager.preloadAnimatedEmojiSticker(emoticon);\r\n appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach(sticker => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP);\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\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\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\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 ChatInput from \"./input\";\r\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private appEmojiManager: AppEmojiManager) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach(emoji => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.appEmojiManager.getBothEmojiKeywords().then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = this.appEmojiManager.searchEmojis(q);\r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\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 RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n protected className: string, \r\n onSelect: (target: Element) => boolean | void\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach(d => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n if(!doNotShow) {\r\n this.toggle(!data.length);\r\n }\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n \r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + options.peerId);\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n name.innerHTML = RichTextProcessor.wrapEmojiText(options.name);\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n description.innerHTML = RichTextProcessor.wrapEmojiText(options.description);\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\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 ChatInput from \"./input\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { BotInfo, ChatFull, UserFull } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\n\nexport function processPeerFullForCommands(full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex; \n \n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n \n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach(botInfo => {\n botInfo.commands.forEach((botCommand, idx) => {\n const c = '/' + botCommand.command;\n commands.set(botCommand.command, {\n peerId: botInfo.user_id.toPeerId(false), \n command: botCommand.command, \n name: c, \n description: botCommand.description,\n index: idx\n });\n\n if(index) {\n index.indexObject(botCommand.command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map(command => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n \n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId) {\n if(!this.appUsersManager.isBot(peerId)) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n Promise.resolve(this.appProfileManager.getProfileByPeerId(peerId)).then(full => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\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 { getMiddleware } from \"../../helpers/middleware\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach(helper => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\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 ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId());\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n this.render(peerIds.map(peerId => {\n const user = this.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n }).filter(Boolean));\n });\n\n return true;\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 type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { KeyboardButton, ReplyMarkup } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ListenerSetter, { Listener } from \"../../helpers/listenerSetter\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport confirmationPopup from \"../confirmationPopup\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private appMessagesManager: AppMessagesManager;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n appMessagesManager: AppMessagesManager,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', () => {\r\n this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public checkForceReply() {\r\n const replyMarkup = this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private getReplyMarkup(): ReplyMarkup {\r\n return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public render(replyMarkup: ReplyMarkup.replyKeyboardMarkup = this.getReplyMarkup() as any) {\r\n this.element.innerHTML = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n btn.innerHTML = RichTextProcessor.wrapEmojiText(button.text);\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) {\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\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 { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { renderImageWithFadeIn, wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport GifsMasonry from \"../gifsMasonry\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = this.appInlineBotsManager.generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n ...this.chat.getMessageSendingParams(),\r\n clearDraft: true,\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then(botResults => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n preview.innerHTML = RichTextProcessor.wrapEmojiText([...item.title.trim()][0]);\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = RichTextProcessor.wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n });\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then(blob => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then(dataURL => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n btnSwitchToPM.insertAdjacentHTML('beforeend', RichTextProcessor.wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP);\r\n }\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 { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type ChatInput from \"./input\";\nimport callbackify from \"../../helpers/callbackify\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport { processPeerFullForCommands } from \"./commandsHelper\";\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n private chatInput: ChatInput,\n private appProfileManager: AppProfileManager\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(full);\n \n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n \n // this.container.style.top = \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 type { AppNotificationsManager } from '../../lib/appManagers/appNotificationsManager';\r\nimport type { AppChatsManager } from '../../lib/appManagers/appChatsManager';\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from '../../lib/appManagers/appPeersManager';\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { AppDraftsManager, MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type { AppEmojiManager } from '../../lib/appManagers/appEmojiManager';\r\nimport type { ServerTimeManager } from '../../lib/mtproto/serverTimeManager';\r\nimport type { AppUsersManager } from '../../lib/appManagers/appUsersManager';\r\nimport type { AppInlineBotsManager } from '../../lib/appManagers/appInlineBotsManager';\r\nimport type { AppMessagesIdsManager } from '../../lib/appManagers/appMessagesIdsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message, ChatFull, UserFull } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport { tsNow } from '../../helpers/date';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport { emojiFromCodePoints } from '../../vendor/emoji';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { openBtnMenu, putPreloader } from '../misc';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { BOT_START_PARAM, NULL_PEER_ID } from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport AvatarElement from '../avatar';\r\nimport type { AppProfileManager } from '../../lib/appManagers/appProfileManager';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ChatBotCommands from './botCommands';\r\nimport copy from '../../helpers/object/copy';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\nconst SEND_AS_ANIMATION_DURATION = 300;\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n private sendAsAvatar: AvatarElement;\r\n private sendAsContainer: HTMLElement;\r\n private sendAsCloseBtn: HTMLElement;\r\n private sendAsBtnMenu: HTMLElement;\r\n private sendAsPeerIds: PeerId[];\r\n public sendAsPeerId: PeerId;\r\n private updatingSendAsPromise: Promise;\r\n\r\n private botCommandsToggle: HTMLElement;\r\n private botCommands: ChatBotCommands;\r\n private botCommandsIcon: HTMLDivElement;\r\n private hasBotCommands: number;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appMessagesIdsManager: AppMessagesIdsManager, \r\n private appDocsManager: AppDocsManager, \r\n private appChatsManager: AppChatsManager, \r\n private appPeersManager: AppPeersManager, \r\n private appWebPagesManager: AppWebPagesManager, \r\n private appImManager: AppImManager, \r\n private appDraftsManager: AppDraftsManager, \r\n private serverTimeManager: ServerTimeManager, \r\n private appNotificationsManager: AppNotificationsManager,\r\n private appEmojiManager: AppEmojiManager,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager,\r\n private appProfileManager: AppProfileManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input');\r\n this.chatInput.style.display = 'none';\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach(group => {\r\n const container = RadioForm(group.elements.map(e => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.sendAsContainer = document.createElement('div');\r\n this.sendAsContainer.classList.add('new-message-send-as-container');\r\n\r\n this.sendAsCloseBtn = document.createElement('div');\r\n this.sendAsCloseBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\r\n\r\n const sendAsButtons: ButtonMenuItemOptions[] = [{\r\n text: 'SendMessageAsTitle',\r\n onClick: undefined\r\n }];\r\n\r\n let previousAvatar: HTMLElement;\r\n const onSendAsMenuToggle = (visible: boolean) => {\r\n if(visible) {\r\n previousAvatar = this.sendAsAvatar;\r\n }\r\n\r\n const isChanged = this.sendAsAvatar !== previousAvatar;\r\n const useRafs = !visible && isChanged ? 2 : 0;\r\n\r\n SetTransition(this.sendAsCloseBtn, 'is-visible', visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n if(!isChanged) {\r\n SetTransition(previousAvatar, 'is-visible', !visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n }\r\n };\r\n\r\n ButtonMenuToggle({\r\n noRipple: true, \r\n listenerSetter: this.listenerSetter, \r\n container: this.sendAsContainer\r\n }, 'top-right', sendAsButtons, () => {\r\n onSendAsMenuToggle(true);\r\n }, () => {\r\n onSendAsMenuToggle(false);\r\n });\r\n\r\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\r\n this.sendAsBtnMenu = this.sendAsContainer.firstElementChild as any;\r\n this.sendAsBtnMenu.classList.add('scrollable', 'scrollable-y');\r\n this.sendAsContainer.append(this.sendAsCloseBtn);\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n this.appMessagesManager.goToNextMention(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(value => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n appMessagesManager: this.appMessagesManager,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n\r\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.appProfileManager);\r\n this.botCommandsToggle = document.createElement('div');\r\n this.botCommandsToggle.classList.add('new-message-bot-commands');\r\n\r\n const scaler = document.createElement('div');\r\n scaler.classList.add('new-message-bot-commands-icon-scale');\r\n\r\n const icon = this.botCommandsIcon = document.createElement('div');\r\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\r\n scaler.append(icon);\r\n this.botCommandsToggle.append(scaler);\r\n\r\n attachClickEvent(this.botCommandsToggle, (e) => {\r\n cancelEvent(e);\r\n const isShown = icon.classList.contains('state-back');\r\n if(isShown) {\r\n this.botCommands.toggle(true);\r\n icon.classList.remove('state-back');\r\n } else {\r\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\r\n icon.classList.add('state-back');\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.botCommands.addEventListener('visible', () => {\r\n icon.classList.add('state-back');\r\n });\r\n\r\n this.botCommands.addEventListener('hiding', () => {\r\n icon.classList.remove('state-back');\r\n });\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n new PopupCreatePoll(this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n //this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.sendAsContainer, this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.appEmojiManager);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.appUsersManager, this.appInlineBotsManager);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.sendAsContainer) {\r\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\r\n if(peerId.isChannel() && this.chat.peerId === peerId) {\r\n this.updateSendAs();\r\n }\r\n });\r\n }\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.chat.peerId]) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n new PopupNewMedia(this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then(result => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public center(animate = false) {\r\n const neededFakeContainer = this.getNeededFakeContainer();\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n \r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n //scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform, \r\n borderRadius, \r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer && \r\n neededFakeContainer.classList.contains('chat-input-control') && \r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom, \r\n widthTo\r\n };\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public getNeededFakeContainer() {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(this.startParam !== undefined || \r\n !this.chat.canSend() || \r\n this.chat.type === 'pinned' || \r\n this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = (callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && this.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n \r\n const dialog = this.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true) + this.serverTimeManager.serverTimeOffset,\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.style.display = 'none';\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = this.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n if(this.messageInputField.value === draft.rMessage && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(draft.rMessage, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n public finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, sendAsContainer, botCommandsToggle} = this;\r\n chatInput.style.display = '';\r\n \r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', this.appPeersManager.canPinMessage(peerId));\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.appMessagesManager.getScheduledMessages(peerId).then(mids => {\r\n if(!middleware()) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(this.newMessageWrapper) {\r\n this.updateOffset(null, false, true);\r\n }\r\n\r\n if(botCommandsToggle) {\r\n this.hasBotCommands = undefined;\r\n this.botCommands.toggle(true, undefined, true);\r\n this.updateBotCommandsToggle(true);\r\n botCommandsToggle.remove();\r\n if(this.appPeersManager.isBot(peerId)) {\r\n const userId = peerId.toUserId();\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const getUserFullResult = this.appProfileManager.getProfile(userId);\r\n callbackify(getUserFullResult, (userFull) => {\r\n if(!middleware()) return;\r\n this.updateBotCommands(userFull, !(getUserFullResult instanceof Promise));\r\n });\r\n }\r\n }\r\n\r\n if(sendAsContainer) {\r\n if(this.sendAsAvatar) {\r\n this.sendAsAvatar.remove();\r\n this.sendAsAvatar = undefined;\r\n }\r\n \r\n sendAsContainer.remove();\r\n this.sendAsPeerId = undefined;\r\n this.updatingSendAsPromise = undefined;\r\n\r\n this.updateSendAs(true);\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n \r\n if(this.messageInput) {\r\n this.updateMessageInput();\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(this.appPeersManager.canPinMessage(this.chat.peerId) ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n\r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n \r\n this.startParam = startParam;\r\n\r\n this.center(false);\r\n }\r\n\r\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\r\n if(type) {\r\n this.newMessageWrapper.dataset.offset = type;\r\n } else {\r\n delete this.newMessageWrapper.dataset.offset;\r\n }\r\n\r\n SetTransition(this.newMessageWrapper, 'has-offset', forwards, skipAnimation ? 0 : 300, undefined, useRafs);\r\n }\r\n\r\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\r\n this.hasBotCommands = userFull.bot_info && userFull.bot_info.commands.length;\r\n this.updateBotCommandsToggle(skipAnimation);\r\n }\r\n\r\n private updateBotCommandsToggle(skipAnimation?: boolean) {\r\n const {botCommandsToggle, hasBotCommands} = this;\r\n\r\n const show = hasBotCommands && this.isInputEmpty();\r\n if(!hasBotCommands) {\r\n botCommandsToggle.remove();\r\n }\r\n \r\n const forwards = show;\r\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\r\n\r\n if(!botCommandsToggle.parentElement) {\r\n this.newMessageWrapper.prepend(botCommandsToggle);\r\n }\r\n\r\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\r\n }\r\n\r\n private updateSendAsButtons(peerIds: PeerId[]) {\r\n const buttons: ButtonMenuItemOptions[] = peerIds.map((sendAsPeerId, idx) => {\r\n const textElement = document.createElement('div');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('btn-menu-item-subtitle');\r\n if(sendAsPeerId.isUser()) {\r\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\r\n } else if(sendAsPeerId === this.chat.peerId) {\r\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\r\n } else {\r\n subtitle.append(this.appProfileManager.getChatMembersString(sendAsPeerId.toChatId()));\r\n }\r\n\r\n textElement.append(\r\n new PeerTitle({peerId: sendAsPeerId}).element,\r\n subtitle\r\n );\r\n\r\n return {\r\n onClick: idx ? () => {\r\n const currentPeerId = this.chat.peerId;\r\n if(currentPeerId.isChannel()) {\r\n const channelFull = this.appProfileManager.getCachedFullChat(currentPeerId.toChatId()) as ChatFull.channelFull;\r\n if(channelFull) {\r\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\r\n this.sendAsPeerId = sendAsPeerId;\r\n this.updateSendAsAvatar(sendAsPeerId);\r\n this.updateMessageInputPlaceholder();\r\n\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const executeButtonsUpdate = () => {\r\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\r\n const peerIds = this.sendAsPeerIds.slice();\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateSendAsButtons(peerIds);\r\n };\r\n \r\n if(rootScope.settings.animationsEnabled) {\r\n setTimeout(executeButtonsUpdate, 250);\r\n } else {\r\n executeButtonsUpdate();\r\n }\r\n }\r\n }\r\n\r\n // return;\r\n apiManager.invokeApi('messages.saveDefaultSendAs', {\r\n peer: this.appPeersManager.getInputPeerById(currentPeerId),\r\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\r\n });\r\n } : undefined,\r\n textElement\r\n };\r\n });\r\n\r\n const btnMenu = ButtonMenu(buttons/* , this.listenerSetter */);\r\n buttons.forEach((button, idx) => {\r\n const peerId = peerIds[idx];\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-32', 'btn-menu-item-icon');\r\n avatar.setAttribute('peer', '' + peerId);\r\n\r\n if(!idx) {\r\n avatar.classList.add('active');\r\n }\r\n \r\n button.element.prepend(avatar);\r\n });\r\n\r\n Array.from(this.sendAsBtnMenu.children).slice(1).forEach(node => node.remove());\r\n this.sendAsBtnMenu.append(...Array.from(btnMenu.children));\r\n }\r\n\r\n private updateSendAsAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n const previousAvatar = this.sendAsAvatar;\r\n if(previousAvatar) {\r\n if(+previousAvatar.getAttribute('peer') === sendAsPeerId) {\r\n return;\r\n }\r\n }\r\n \r\n if(!previousAvatar) {\r\n skipAnimation = true;\r\n }\r\n \r\n let useRafs = skipAnimation ? 0 : 2;\r\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\r\n const avatar = this.sendAsAvatar = new AvatarElement();\r\n avatar.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + sendAsPeerId);\r\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\r\n\r\n SetTransition(avatar, 'is-visible', true, duration, undefined, useRafs); \r\n if(previousAvatar) {\r\n SetTransition(previousAvatar, 'is-visible', false, duration, () => {\r\n previousAvatar.remove();\r\n }, useRafs);\r\n }\r\n \r\n this.sendAsContainer.append(avatar);\r\n }\r\n\r\n private getDefaultSendAs() {\r\n // return rootScope.myId;\r\n return callbackify(this.appProfileManager.getChannelFull(this.chat.peerId.toChatId()), (channelFull) => {\r\n return channelFull.default_send_as ? this.appPeersManager.getPeerId(channelFull.default_send_as) : undefined;\r\n });\r\n }\r\n\r\n private updateSendAs(skipAnimation?: boolean) {\r\n const peerId = this.chat.peerId;\r\n if(!peerId.isChannel() || this.updatingSendAsPromise) {\r\n return;\r\n }\r\n\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return !this.updatingSendAsPromise || this.updatingSendAsPromise === updatingSendAsPromise;\r\n });\r\n\r\n const {sendAsContainer} = this;\r\n const chatId = peerId.toChatId();\r\n const result = this.getDefaultSendAs();\r\n // const result = Promise.resolve(this.getDefaultSendAs());\r\n\r\n if(result instanceof Promise) {\r\n skipAnimation = undefined;\r\n }\r\n\r\n const updateSendAsResult = callbackify(result, (sendAsPeerId) => {\r\n if(!middleware() || sendAsPeerId === undefined) return;\r\n \r\n this.sendAsPeerId = sendAsPeerId;\r\n this.updateSendAsAvatar(sendAsPeerId, skipAnimation);\r\n this.updateMessageInputPlaceholder();\r\n\r\n this.appChatsManager.getSendAs(chatId).then(peers => {\r\n if(!middleware()) return;\r\n\r\n const peerIds = peers.map((peer) => this.appPeersManager.getPeerId(peer));\r\n this.sendAsPeerIds = peerIds.slice();\r\n\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateSendAsButtons(peerIds);\r\n });\r\n\r\n let useRafs = 0;\r\n if(!sendAsContainer.parentElement) {\r\n this.newMessageWrapper.prepend(sendAsContainer);\r\n useRafs = 2;\r\n }\r\n\r\n this.updateOffset('as', true, skipAnimation, useRafs);\r\n\r\n this.updatingSendAsPromise = undefined;\r\n });\r\n\r\n const updatingSendAsPromise = this.updatingSendAsPromise = Promise.resolve(updateSendAsResult);\r\n return updatingSendAsPromise;\r\n }\r\n\r\n private updateMessageInputPlaceholder() {\r\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\r\n if(i) {\r\n const {peerId, threadId} = this.chat;\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(this.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if((this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) || \r\n this.appMessagesManager.isAnonymousSending(peerId)) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n }\r\n\r\n public updateMessageInput() {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const canWrite = this.chat.canSend();\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canWrite;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canWrite);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n this.updateMessageInputPlaceholder();\r\n\r\n const visible = this.attachMenuButtons.filter(button => {\r\n const good = button.verify(peerId, threadId);\r\n button.element.classList.toggle('hide', !good);\r\n return good;\r\n });\r\n\r\n if(!canWrite) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, 'monospace'),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, 'spoiler')\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //const differentParents = !!nodes.find(node => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace' || type === 'spoiler') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(document.execCommand('fontName', false, 'Roboto'));\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = RichTextProcessor.parseEntities(value);\r\n const value = RichTextProcessor.parseMarkdown(richValue, markdownEntities, true);\r\n const entities = RichTextProcessor.mergeEntities(markdownEntities, RichTextProcessor.parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter(e => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.appWebPagesManager.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n },\r\n }).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n //console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n \r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n const isEmpty = !richValue.trim();\r\n if(isEmpty) {\r\n if(this.lastTimeType) {\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n\r\n if(this.botCommands) {\r\n this.botCommands.toggle(true);\r\n }\r\n }\r\n\r\n if(this.botCommands) {\r\n this.updateBotCommandsToggle();\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = RichTextProcessor.parseEntities(fullValue);\r\n RichTextProcessor.mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach(entity => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n RichTextProcessor.mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = RichTextProcessor.wrapDraftText(newValue, {entities});\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, RichTextProcessor.wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, RichTextProcessor.getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = RichTextProcessor.parseMarkdown(value, entities, true);\r\n entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? this.appMessagesIdsManager.getServerMessageId(this.chat.threadId) : undefined;\r\n if(this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend('send_media')) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach(value => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = ('' + (diff / 1000)).toHHMMSS() + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = RichTextProcessor.parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(copy(this.forwarding), () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach(i => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = RichTextProcessor.parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter(entity => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach(entity => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {peerId} = chat;\r\n const {noWebPage} = this;\r\n const sendingParams = this.chat.getMessageSendingParams();\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n ...sendingParams,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n ...sendingParams,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = this.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend(flag)) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n ...this.chat.getMessageSendingParams(),\r\n isMedia: true, \r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public initMessageEditing(mid: number) {\r\n const message: Message.message = this.chat.getMessage(mid);\r\n\r\n let input = RichTextProcessor.wrapDraftText(message.message, {entities: message.totalEntities});\r\n const f = () => {\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = () => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map(fromPeerId => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n fromPeerIds.forEach(fromPeerId => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n mids.forEach(mid => {\r\n const message: Message.message = this.appMessagesManager.getMessageByPeer(fromPeerId, mid);\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n length += mids.length;\r\n });\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map(smth => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = this.appMessagesManager.getMessageByPeer(fromPeerId, mids[0]);\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = this.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find(mid => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message: Message = this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(message._ === 'messageEmpty') { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(message._ === 'messageEmpty') {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const newReply = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(newReply);\r\n } else {\r\n replyParent.insertBefore(newReply, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n newReply.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return newReply;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\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\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { ripple } from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Message } from \"../../layer\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n \r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n \r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n \r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then(needClose => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n \r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n \r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n \r\n // const active = classNames.filter(className => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n \r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n \r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { MediaProgressLine, VolumeSelector } from \"../../lib/mediaPlayer\";\nimport ButtonIcon from \"../buttonIcon\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport { Message } from \"../../layer\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(rootScope)('media_play', this.onMediaPlay);\n this.topbar.listenerSetter.add(rootScope)('media_pause', this.onPause);\n this.topbar.listenerSetter.add(rootScope)('media_stop', this.onStop);\n this.topbar.listenerSetter.add(rootScope)('media_playback_params', ({playbackRate}) => {\n this.onPlaybackRateChange(playbackRate);\n });\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackRateChange(appMediaPlaybackController.playbackRate);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackRateChange = (playbackRate: number) => {\n this.fasterEl.classList.toggle('active', playbackRate > 1);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n \n private onMediaPlay = ({doc, message, media}: {\n doc: MyDocument,\n message: Message.message,\n media: HTMLMediaElement\n }) => {\n let title: string | HTMLElement, subtitle: string | HTMLElement | DocumentFragment;\n if(doc.type === 'voice' || doc.type === 'round') {\n title = new PeerTitle({peerId: message.fromId}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n this.fasterEl.classList.remove('hide');\n } else {\n title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || i18n('AudioUnknownArtist');\n this.fasterEl.classList.add('hide');\n }\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n \r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);//this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n //this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map(n => +n);\r\n const byDecimal = Array.from('' + number).map(n => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n //const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n //decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n //this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n public static LOAD_COUNT = 50;\r\n public static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n public pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n public pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n public wasPinnedIndex = 0;\r\n public wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n public waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n public mids: number[] = [];\r\n public offsetIndex = 0;\r\n\r\n public loading = false;\r\n public loadedBottom = false;\r\n public loadedTop = false;\r\n\r\n public animatedSubtitle: AnimatedSuper;\r\n public animatedMedia: AnimatedSuper;\r\n public animatedCounter: AnimatedCounter;\r\n\r\n public listenerSetter: ListenerSetter;\r\n public scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n public getCurrentIndexPromise: Promise = null;\r\n public btnOpen: HTMLButtonElement;\r\n \r\n public setPinnedMessage: () => void;\r\n\r\n private isStatic = false;\r\n\r\n private debug = false;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private appMessagesManager: AppMessagesManager, private appPeersManager: AppPeersManager) {\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(appPeersManager.canPinMessage(this.topbar.peerId)) {\r\n new PopupPinMessage(this.topbar.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.topbar.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n //return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.chat.log('[PM]: setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.chat.log('[PM]: testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex(_mid => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.chat.log('[PM]: testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find(_mid => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n let gotRest = false;\r\n const promises = [\r\n this.appMessagesManager.getSearch({\r\n peerId: this.topbar.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then(r => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(p => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex(message => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map(message => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n this.debug && this.chat.log('[PM]: getCurrentIndex result:', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.chat.log.error('[PM]: getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.chat.log.error('[PM]: handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = this.chat.getMessage(mid);\r\n if(message && !message.deleted) {\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.chat.log('[PM]: setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: message.message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\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 ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\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 tsNow from \"../../helpers/tsNow\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport { MUTE_UNTIL } from \"../../lib/mtproto/mtproto_config\";\nimport RadioField from \"../radioField\";\nimport Row, { RadioFormFromRows } from \"../row\";\nimport { SettingSection } from \"../sidebarLeft\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n appMessagesManager.mutePeer(peerId, time === -1 ? MUTE_UNTIL : tsNow(true) + time);\n }\n }],\n body: true\n });\n\n const ONE_HOUR = 3600;\n const times: {time: number, langKey: LangPackKey}[] = [{\n time: ONE_HOUR, \n langKey: 'ChatList.Mute.1Hour'\n }, {\n time: ONE_HOUR * 4, \n langKey: 'ChatList.Mute.4Hours'\n }, {\n time: ONE_HOUR * 8, \n langKey: 'ChatList.Mute.8Hours'\n }, {\n time: ONE_HOUR * 24, \n langKey: 'ChatList.Mute.1Day'\n }, {\n time: ONE_HOUR * 24 * 3,\n langKey: 'ChatList.Mute.3Days'\n }, {\n time: -1,\n langKey: 'ChatList.Mute.Forever'\n }];\n \n const name = 'mute-time';\n const rows = times.map((time) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: time.langKey, \n name, \n value: '' + time.time\n })\n });\n\n return row;\n });\n\n let time: number;\n const radioForm = RadioFormFromRows(rows, (value) => {\n time = +value;\n });\n\n rows[rows.length - 1].radioField.checked = true;\n\n const section = new SettingSection({noShadow: true, noDelimiter: true});\n section.content.append(radioForm);\n this.body.append(section.container);\n\n this.show();\n }\n}\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 { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppGroupCallsManager, MyGroupCall } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull, Chat as MTChat, GroupCall } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport generateVerifiedIcon from \"../generateVerifiedIcon\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport { CallType } from \"../../lib/calls/types\";\nimport PopupMute from \"../popups/mute\";\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n public peerId: PeerId;\n private wasPeerId: PeerId;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private appMessagesManager: AppMessagesManager, \n private appPeersManager: AppPeersManager, \n private appChatsManager: AppChatsManager, \n private appNotificationsManager: AppNotificationsManager,\n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager,\n private appGroupCallsManager: AppGroupCallsManager\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.appMessagesManager);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null, \n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null, \n this.btnJoin, \n this.btnPinned, \n this.btnCall, \n this.btnGroupCall, \n this.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n \n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n //if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n //}\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n //const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: () => boolean) {\n if(!element) {\n return;\n }\n \n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const verifyButtons = (buttons: ButtonToVerify[]) => {\n buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify());\n });\n };\n\n if(isMenuOpen) {\n verifyButtons(this.menuButtons);\n\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(this.appPeersManager.getDeleteButtonText(this.peerId)));\n }\n\n verifyButtons(this.buttonsToVerify);\n };\n\n private verifyVideoChatButton = (type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = this.appGroupCallsManager.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if((this.peerId.isBroadcast() && type === 'group') || \n (this.peerId.isAnyGroup() && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = this.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || this.appChatsManager.hasRights(chatId, 'manage_call');\n };\n\n private verifyCallButton = (type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = this.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.appMessagesManager.togglePeerMute(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.appProfileManager.getChannelFull(this.peerId.toChatId())).then(channelFull => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: () => {\n const chatFull = this.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n appStateManager.getState().then(state => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = (bubble) => {\n appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!Object.keys(this.chat.bubbles.bubbles).length\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = new AppEditContactTab(this.appSidebarRight);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: () => this.peerId.isUser() && !this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: () => rootScope.myId !== this.peerId && this.peerId.isUser() && this.appPeersManager.isContact(this.peerId) && !!this.appUsersManager.getUser(this.peerId.toUserId()).phone\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.appUsersManager.toggleBlock(this.peerId, true).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: () => {\n if(!this.peerId.isUser()) return false;\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.appUsersManager.toggleBlock(this.peerId, false).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: () => {\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: () => this.chat.type === 'chat' && !!this.appMessagesManager.getDialogOnly(this.peerId)\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n public constructPeerHelpers() {\n this.avatarElement = new AvatarElement();\n this.avatarElement.setAttribute('dialog', '1');\n //this.avatarElement.setAttribute('clickable', '');\n this.avatarElement.classList.add('avatar-42', 'person-avatar');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = this.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId, \n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, \n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n //this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n if(this.chatAudio) {\n this.chatAudio.destroy();\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public setPeer(peerId: PeerId) {\n this.wasPeerId = this.peerId;\n this.peerId = peerId;\n\n this.container.style.display = peerId ? '' : 'none';\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n const peerId = this.peerId;\n\n if(this.avatarElement) {\n this.avatarElement.setAttribute('peer', '' + peerId);\n this.avatarElement.update();\n }\n\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(this.appPeersManager.isAnyChat(peerId)) {\n const chatId = peerId.toChatId();\n replaceContent(this.btnJoin, i18n(this.appChatsManager.isBroadcast(chatId) ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !this.appChatsManager.getChat(chatId)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n const middleware = this.chat.bubbles.getMiddleware();\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.wasPeerId !== undefined) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n \n if(!isTarget) {\n this.pinnedMessage.setCorrectIndex(0);\n }\n });\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n fastRaf(() => {\n this.setTitle();\n this.setPeerStatus(true);\n this.setMutedState();\n });\n }\n\n public setTitle(count?: number) {\n let titleEl: HTMLElement;\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.appMessagesManager.getSearchCounters(this.peerId, [{_: 'inputMessagesFilterPinned'}], false).then(result => {\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(this.peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.appMessagesManager.getHistory(this.peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(() => {\n const count = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).count;\n if(count === null) {\n setTimeout(() => {\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n titleEl = new PeerTitle({\n peerId: this.peerId,\n dialog: true,\n }).element;\n }\n \n replaceContent(this.title, titleEl);\n\n if(this.chat.type === 'chat') {\n const peer = this.appPeersManager.getPeer(this.peerId);\n if(peer?.pFlags?.verified) {\n this.title.append(generateVerifiedIcon());\n }\n }\n }\n\n public setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(this.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.divAndCaption.container.classList.contains('is-floating');\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatus = (needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n this.chat.appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, false, () => peerId === this.peerId);\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 appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n new PopupDatePicker(new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\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 ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport { ripple } from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n \r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n \r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.bubblesContainer.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n \r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n \r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n new PopupDatePicker(new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, 'LI');\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.bubblesContainer.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\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 { IS_SAFARI } from \"../../environment/userAgent\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n private createCanvasPatternPromise: Promise;\n private exportCanvasPatternToImagePromise: Promise;\n // private img: HTMLImageElement;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n return this.createCanvasPattern(canvas).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = new Promise((resolve) => {\n const img = document.createElement('img');\n img.crossOrigin = 'anonymous';\n renderImageFromUrlPromise(img, this.options.url, false).then(() => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n \n // this.img = img;\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n resolve();\n });\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n }\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n context.fillStyle = this.pattern;\n context.fillRect(0, 0, canvas.width, canvas.height);\n // context.drawImage(this.img, 0, 0, canvas.width, canvas.height);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n canvas.width = this.options.width * window.devicePixelRatio;\n canvas.height = this.options.height * window.devicePixelRatio * 1.5;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n}\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 { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, ChatRights } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppDocsManager } from \"../../lib/appManagers/appDocsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\nimport type { ApiManagerProxy } from \"../../lib/mtproto/mtprotoworker\";\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\nimport type { ServerTimeManager } from \"../../lib/mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\nimport type stateStorage from '../../lib/stateStorage';\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport getAutoDownloadSettingsByPeerId, { ChatAutoDownloadSettings } from \"../../helpers/autoDownload\";\nimport ChatBackgroundGradientRenderer from \"./gradientRenderer\";\nimport ChatBackgroundPatternRenderer from \"./patternRenderer\";\nimport { pause } from \"../../helpers/schedulers/pause\";\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n \n constructor(\n public appImManager: AppImManager, \n public appChatsManager: AppChatsManager, \n public appDocsManager: AppDocsManager, \n public appInlineBotsManager: AppInlineBotsManager, \n public appMessagesManager: AppMessagesManager, \n public appPeersManager: AppPeersManager, \n public appPhotosManager: AppPhotosManager, \n public appProfileManager: AppProfileManager, \n public appStickersManager: AppStickersManager, \n public appUsersManager: AppUsersManager, \n public appWebPagesManager: AppWebPagesManager, \n public appPollsManager: AppPollsManager, \n public apiManager: ApiManagerProxy, \n public appDraftsManager: AppDraftsManager, \n public serverTimeManager: ServerTimeManager, \n public storage: typeof stateStorage, \n public appNotificationsManager: AppNotificationsManager,\n public appEmojiManager: AppEmojiManager,\n public appMessagesIdsManager: AppMessagesIdsManager,\n public appGroupCallsManager: AppGroupCallsManager,\n public appReactionsManager: AppReactionsManager\n ) {\n super();\n\n this.type = 'chat';\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n //this.log.error('Chat construction');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = rootScope.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground && \n document.documentElement.style.cursor === 'grabbing' && \n this.gradientRenderer && \n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer = \n this.patternRenderer = \n this.gradientCanvas = \n this.patternCanvas = \n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n \n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + Math.abs(intensity));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [gradientCanvas, isDarkPattern ? undefined : patternCanvas].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition(item, 'is-visible', true, !skipAnimation ? 200 : 0, prev ? () => {\n if(previousPatternRenderer) {\n previousPatternRenderer.cleanup(previousPatternCanvas);\n }\n\n if(previousGradientRenderer) {\n previousGradientRenderer.cleanup();\n }\n\n prev.remove();\n } : null, 2);\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n let promise: Promise;\n if(isDarkPattern) {\n promise = patternRenderer.exportCanvasPatternToImage(patternCanvas).then(url => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n \n gradientCanvas.style.webkitMaskImage = `url(${url})`;\n });\n } else {\n promise = Promise.resolve();\n }\n \n promise.then(cb);\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n\n if(this.type === 'scheduled') {\n this.getMessagesStorage = () => this.appMessagesManager.getScheduledMessagesStorage(this.peerId);\n //this.getMessage = (mid) => this.appMessagesManager.getMessageFromStorage(this.appMessagesManager.getScheduledMessagesStorage(this.peerId), mid);\n }\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.appMessagesManager, this.appPeersManager, this.appChatsManager, this.appNotificationsManager, this.appProfileManager, this.appUsersManager, this.appGroupCallsManager);\n this.bubbles = new ChatBubbles(this, this.appMessagesManager, this.appStickersManager, this.appUsersManager, this.appInlineBotsManager, this.appPhotosManager, this.appPeersManager, this.appProfileManager, this.appDraftsManager, this.appMessagesIdsManager, this.appChatsManager, this.appReactionsManager);\n this.input = new ChatInput(this, this.appMessagesManager, this.appMessagesIdsManager, this.appDocsManager, this.appChatsManager, this.appPeersManager, this.appWebPagesManager, this.appImManager, this.appDraftsManager, this.serverTimeManager, this.appNotificationsManager, this.appEmojiManager, this.appUsersManager, this.appInlineBotsManager, this.appProfileManager);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.appMessagesManager);\n this.contextMenu = new ChatContextMenu(this.bubbles.bubblesContainer, this, this.appMessagesManager, this.appPeersManager, this.appPollsManager, this.appDocsManager, this.appMessagesIdsManager, this.appReactionsManager);\n\n if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n if(this.type !== 'scheduled' && !IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.bubblesContainer, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.selection.cleanup();\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n rootScope.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n } else if(this.setPeerPromise) {\n return;\n }\n\n //console.time('appImManager setPeer');\n //console.time('appImManager setPeer pre promise');\n ////console.time('appImManager: pre render start');\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.topbar.setPeer(peerId);\n this.bubbles.setPeer(peerId);\n rootScope.dispatchEvent('peer_changed', peerId);\n\n return;\n }\n\n // set new\n if(!samePeer) {\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n this.noForwards = this.appPeersManager.noForwards(peerId);\n this.isRestricted = this.appPeersManager.isRestricted(peerId);\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n appSidebarRight.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n this.setAutoDownloadMedia();\n }\n\n this.peerChanged = samePeer;\n\n if(startParam === undefined && this.isStartButtonNeeded()) {\n startParam = BOT_START_PARAM;\n }\n\n const result = this.bubbles.setPeer(peerId, lastMsgId, startParam);\n if(!result) {\n return;\n }\n\n const {promise} = result;\n\n //console.timeEnd('appImManager setPeer pre promise');\n \n const setPeerPromise = this.setPeerPromise = promise.finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n if(!samePeer) {\n appSidebarRight.sharedMediaTab.setLoadMutex(this.setPeerPromise);\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n }\n /* this.setPeerPromise.then(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n\n return result;\n }\n\n public setAutoDownloadMedia() {\n this.autoDownload = getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n let peerId = this.peerId;\n this.peerChanged = true;\n\n this.cleanup(false);\n\n this.topbar.setPeer(peerId);\n this.topbar.finishPeerChange(isTarget, isJump, lastMsgId);\n this.bubbles.finishPeerChange();\n this.input.finishPeerChange(startParam);\n\n appSidebarRight.sharedMediaTab.fillProfileElements();\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n rootScope.dispatchEvent('peer_changed', peerId);\n this.wasAlreadyUsed = true;\n }\n\n public getMessagesStorage() {\n return this.appMessagesManager.getMessagesStorage(this.peerId);\n }\n\n public getMessage(mid: number) {\n return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(), mid);\n //return this.appMessagesManager.getMessageByPeer(this.peerId, mid);\n }\n\n public getMidsByMid(mid: number) {\n return this.appMessagesManager.getMidsByMessage(this.getMessage(mid));\n }\n\n public isAnyGroup() {\n return this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || this.appPeersManager.isAnyGroup(this.peerId);\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = new AppPrivateSearchTab(appSidebarRight);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return this.appPeersManager.isBot(this.peerId) && \n !this.appMessagesManager.getDialogOnly(this.peerId) && \n !this.appMessagesManager.getHistoryStorage(this.peerId).history.length;\n }\n\n public getMessageSendingParams() {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n sendSilent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n}\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 { State } from \"../lib/appManagers/appStateManager\";\nimport rootScope from \"../lib/rootScope\";\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default function getAutoDownloadSettingsByPeerId(peerId: PeerId): ChatAutoDownloadSettings {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(peerId.isContact()) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(peerId.isBroadcast()) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n \n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\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 type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport clamp from \"../../helpers/number/clamp\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach(c => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !RichTextProcessor.matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach(node => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\r\n\r\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\r\n \r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n \r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n \r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n \r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n \r\n this.setTooltipPosition();\r\n \r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n \r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n //this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e?: Event) => {\r\n //this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n e && cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n //this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n //this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n const messageInput = this.appImManager.chat.input.messageInput;\r\n if(document.activeElement !== messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else if(this.container && this.container.classList.contains('is-visible')) {\r\n this.setTooltipPosition();\r\n } else if(messageInput.matches(':active')) {\r\n this.setMouseUpEvent();\r\n } else {\r\n this.show();\r\n }\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 getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter(node => !!node);\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// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\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 generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\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 { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach(el => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach(el => el.classList.remove('no-transition'));\r\n });\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n \n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n \n this.N = n;\n this.radius = new Array(n + 1);\n \n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n \n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n \n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n \n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n \n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n \n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n \n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n \n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n \n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n \n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n \n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n \n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n \n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n \n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n \n return gradient;\n }\n \n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n \n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n \n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n \n private mounted: boolean;\n private media: MediaQueryList;\n \n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n \n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n \n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n \n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)],\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n \n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n \n this.setSize();\n this.forceUpdate();\n \n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n \n this.draw();\n }\n \n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n \n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n \n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n \n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n \n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n \n this.forceUpdate();\n this.invokeDraw();\n }\n \n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n \n public handleBlur = () => {\n this.focused = false;\n }\n \n private invokeDraw = () => {\n if(this.raf) return;\n \n this.draw();\n }\n \n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n \n // console.log('[top] draw', [focused, resizing, this.mounted]);\n \n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n \n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n \n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n \n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n \n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n \n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n \n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n \n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n \n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n \n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n \n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n \n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n \n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n \n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n \n if(currentState?.stateId === stateId) {\n return;\n }\n \n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n \n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n \n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\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 rootScope from \"../../lib/rootScope\";\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(let i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\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 noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport rootScope from \"../rootScope\";\nimport lottieLoader, { LottieAssetName } from \"./lottieLoader\";\nimport type RLottiePlayer from \"./rlottiePlayer\";\nimport { RLottieColor } from \"./rlottiePlayer\";\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n \n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map(options => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then(player => {\n return lottieLoader.waitForFirstFrame(player);\n }).then(player => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find(part => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n \n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame, \n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n \n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\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 noop from \"../helpers/noop\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport { LottieAssetName } from \"../lib/rlottie/lottieLoader\";\nimport RLottieIcon, { RLottieIconItemPartOptions, RLottieIconItemPart } from \"../lib/rlottie/rlottieIcon\";\nimport { RLottieColor } from \"../lib/rlottie/rlottiePlayer\";\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map(item => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n \n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n \n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach(item => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\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 { RLottieIconItemPartOptions } from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_MICROPHONE_BUTTON_STATE } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\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 RLottieIcon from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, \n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\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 PopupElement from \"../popups\";\nimport { hexToRgb } from \"../../helpers/color\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport customProperties from \"../../helpers/dom/customProperties\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport { RLottieColor } from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIcon from \"./microphoneIcon\";\nimport GroupCallParticipantsElement from \"./participants\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\nimport PopupPeer from \"../popups/peer\";\nimport GroupCallDescriptionElement from \"./description\";\nimport GroupCallTitleElement from \"./title\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport Scrollable from \"../scrollable\";\nimport { MovableState } from \"../movableElement\";\nimport animationIntersector from \"../animationIntersector\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport makeButton from \"../call/button\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let color: RLottieColor, colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n color = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private appChatsManager: AppChatsManager;\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor(options: {\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n }) {\n super('popup-group-call', undefined, {\n body: true,\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = this.appGroupCallsManager.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n \n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n \n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n \n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n ...options\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n ...options\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') || \n findUpClassName(target, 'group-call-button') || \n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n \n private onLeaveClick = () => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(this.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true,\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach(element => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach(element => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\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 replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { GROUP_CALL_PARTICIPANT_MUTED_STATE } from \".\";\nimport { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter(type => !!participant[type]).map(type => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, RichTextProcessor.wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n \n replaceContent(this.container, span);\n }\n}\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 positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } from \"../../lib/appManagers/appDialogsManager\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport type GroupCallInstance from \"../../lib/calls/groupCallInstance\";\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n participant: GroupCallParticipant,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 54;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: (element) => element.participant.date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: (element) => {\n const {participant} = element;\n\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const participant = instance.participants.get(base.id);\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n \n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n\n (base as SortedParticipant).dom = dom;\n (base as SortedParticipant).participant = participant;\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\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 { animate } from \"../../helpers/animation\";\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\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 { GroupCallParticipant } from \"../../layer\";\nimport type { GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport { i18n } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport callVideoCanvasBlur from \"../call/videoCanvasBlur\";\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private appPeersManager: AppPeersManager, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n \n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n \n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n \n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n \n this.container.append(this.header);\n // }\n \n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: this.appPeersManager.getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n \n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { AppGroupCallsManager, GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport GroupCallParticipantVideoElement, { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange']\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n \n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return; \n }\n \n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some(type => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach(type => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.appPeersManager, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n \n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n \n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public setInstance(instance: GroupCallInstance) {\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\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 PopupGroupCall from \".\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, isFullScreen } from \"../../helpers/dom/fullScreen\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport { attachContextMenuListener, closeBtnMenu, openBtnMenu, positionMenu } from \"../misc\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport Scrollable from \"../scrollable\";\nimport GroupCallParticipantsList from \"./participantsList\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean})[];\n private element: HTMLDivElement;\n private appChatsManager: AppChatsManager;\n private appPeersManager: AppPeersManager;\n private appGroupCallsManager: AppGroupCallsManager;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n appChatsManager: AppChatsManager,\n appPeersManager: AppPeersManager,\n appGroupCallsManager: AppGroupCallsManager,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: () => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: this.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.appChatsManager = options.appChatsManager;\n this.appPeersManager = options.appPeersManager;\n this.appGroupCallsManager = options.appGroupCallsManager;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n \n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, (e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = this.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n this.buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify(peerId));\n });\n \n cancelEvent(e);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n closeBtnMenu();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? (PopupElement.getPopups(PopupGroupCall) as PopupGroupCall[])[0].getContainer(): document.body;\n\n if(!isFull) {\n closeBtnMenu();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n rootScope.dispatchEvent('history_focus', {\n peerId: this.targetPeerId\n });\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.appGroupCallsManager.editParticipant(this.instance.id, this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private appChatsManager: AppChatsManager;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n \n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach(participant => {\n this.updateParticipant(participant);\n });\n \n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n \n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\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 { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport I18n, { LangPackKey, FormatterArguments } from \"../../lib/langPack\";\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\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 setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, RichTextProcessor.wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n } \n }\n}\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport { ripple } from \"../ripple\";\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\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 findUpClassName from \"../helpers/dom/findUpClassName\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport clamp from \"../helpers/number/clamp\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport windowSize from \"../helpers/windowSize\";\nimport SwipeHandler from \"./swipeHandler\";\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n \n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n \n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach(handler => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map(side => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\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 MovableElement, { MovableElementOptions, MovableState } from \"../components/movableElement\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport ListenerSetter from \"./listenerSetter\";\nimport mediaSizes, { ScreenSize } from \"./mediaSizes\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n \n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n \n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\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\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\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\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\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 replaceContent from \"../../helpers/dom/replaceContent\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = ('' + instance.duration).toHHMMSS(true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\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 { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\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 IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport { IS_MOBILE } from \"../../environment/userAgent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport { onMediaLoad } from \"../../helpers/files\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\nimport type { AppAvatarsManager } from \"../../lib/appManagers/appAvatarsManager\";\nimport type { AppCallsManager } from \"../../lib/appManagers/appCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport CallInstance from \"../../lib/calls/callInstance\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport AvatarElement from \"../avatar\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIconMini from \"../groupCall/microphoneIconMini\";\nimport { MovableState } from \"../movableElement\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport SetTransition from \"../singleTransition\";\nimport makeButton from \"./button\";\nimport CallDescriptionElement from \"./description\";\nimport callVideoCanvasBlur from \"./videoCanvasBlur\";\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private instance: CallInstance;\n private appCallsManager: AppCallsManager;\n private appAvatarsManager: AppAvatarsManager;\n private appPeersManager: AppPeersManager;\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n \n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(options: {\n appCallsManager: AppCallsManager,\n appAvatarsManager: AppAvatarsManager,\n appPeersManager: AppPeersManager,\n instance: CallInstance\n }) {\n super('popup-call', undefined, {\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videoContainers = {};\n\n const {container, listenerSetter, instance} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.isBig = true;\n avatar.setAttribute('peer', '' + peerId);\n avatar.classList.add('avatar-full');\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n \n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container, \n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') || \n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n \n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n \n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true,\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find(container => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition(this.partyMutedState, 'is-visible', !!outputState?.muted, 300);\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach(type => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then(emojis => {\n this.emojisSubtitle.innerHTML = RichTextProcessor.wrapEmojiText(emojis.join(''));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach(container => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n \n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\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 SDP from \"../sdp\";\nimport { CallSignalingData, P2PVideoCodec } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n \n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n fingerprints: [info.fingerprint],\n ufrag: info.ufrag,\n pwd: info.pwd,\n audio: undefined,\n video: undefined,\n screencast: undefined\n };\n \n const convertNumber = (number: number) => '' + number;\n \n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n \n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n \n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map(sourceGroup => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n \n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n \n const payloadTypesMap: Map = new Map();\n \n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n \n return payloadType;\n };\n \n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n \n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n \n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n \n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n \n return data;\n}\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 CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport CallInstance from \"./callInstance\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport { parseSdp } from \"./sdp/utils\";\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n \n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n \n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n \n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, //this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n \n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n \n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n \n return result;\n }\n \n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n \n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n \n return this.encryptPrepared(result);\n }\n \n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n \n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n \n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n \n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n \n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n \n return !msgKeyEquals;\n }\n \n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n \n const {isOutgoing, type} = this;\n \n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n \n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n \n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n \n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n \n return decryptionBuffer.slice(4);\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0', \n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`, \n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2', \n 'a=extmap-allow-mixed', \n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux', \n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0',\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\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 ctx from \"../../environment/ctx\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport { GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update } from \"../../layer\";\nimport { emojiFromCodePoints } from \"../../vendor/emoji\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { AppCallsManager, CallId } from \"../appManagers/appCallsManager\";\nimport { logger } from \"../logger\";\nimport type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport CallConnectionInstance from \"./callConnectionInstance\";\nimport CallInstanceBase from \"./callInstanceBase\";\nimport CALL_STATE from \"./callState\";\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"./constants\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription, { ConferenceEntry, generateSsrc } from \"./localConferenceDescription\";\nimport getCallProtocol from \"./p2P/getCallProtocol\";\nimport getRtcConfiguration from \"./p2P/getRtcConfiguration\";\nimport P2PEncryptor from \"./p2P/p2PEncryptor\";\nimport { p2pParseCandidate, P2PSdpBuilder } from \"./p2P/p2PSdpBuilder\";\nimport { parseSdp } from \"./sdp/utils\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec } from \"./types\";\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n \n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private appCallsManager: AppCallsManager;\n private apiManager: ApiManagerProxy;\n private apiUpdatesManager: ApiUpdatesManager;\n \n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n \n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n appCallsManager: CallInstance['appCallsManager'],\n apiManager: CallInstance['apiManager'],\n apiUpdatesManager: CallInstance['apiUpdatesManager'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n \n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n type: 'input',\n lowBattery: false,\n muted: true,\n screencastState: 'inactive',\n videoRotation: 0,\n videoState: 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find(entry => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n \n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.appCallsManager.generateDh().then(dh => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p,\n };\n\n return this.apiManager.invokeApi('phone.acceptCall', {\n peer: this.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(phonePhoneCall => {\n this.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n \n const {isOutgoing, encryptionKey, streamManager} = this;\n \n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection'),\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n \n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n \n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n \n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry; \n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n \n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n \n this.log('sendCallSignalingData', this.id, json);\n await this.apiManager.invokeApi('phone.sendSignalingData', {\n peer: this.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n \n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n \n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates', \n candidates: [parsed]\n });\n }\n\n public async confirmCall() {\n const {appCallsManager, apiManager, protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n \n const phonePhoneCall = await apiManager.invokeApi('phone.confirmCall', {\n peer: appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n \n this.encryptionKey = key;\n appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = this.apiManager.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then(codePoints => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map(codePoints => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter(transceiver => transceiver.direction === 'recvonly').forEach(transceiver => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n let bundle = description.entries.map(entry => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter(entry => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n \n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n \n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n \n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map(payloadType => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n \n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n \n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n pwd: data.pwd,\n ufrag: data.ufrag,\n fingerprints: data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach(codec => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex(payloadType => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex(payloadType => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n \n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map(ssrcGroup => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map(source => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n \n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n let bundle = description.entries.map(entry => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter(entry => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n \n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n \n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map(candidate => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n \n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n \n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n \n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(update: Update.updatePhoneCallSignalingData) {\n this.decryptQueue.push(update.data);\n this.processDecryptQueue();\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCallProtocol } from \"../../../layer\";\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCall } from \"../../../layer\";\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n \n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n \n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport type { AppGroupCallsManager } from \"../lib/appManagers/appGroupCallsManager\";\nimport GROUP_CALL_STATE from \"../lib/calls/groupCallState\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonIcon from \"./buttonIcon\";\nimport TopbarWeave from \"./topbarWeave\";\nimport SetTransition from \"./singleTransition\";\nimport PopupGroupCall from \"./groupCall\";\nimport type { AppPeersManager } from \"../lib/appManagers/appPeersManager\";\nimport type { AppChatsManager } from \"../lib/appManagers/appChatsManager\";\nimport GroupCallDescriptionElement from \"./groupCall/description\";\nimport GroupCallTitleElement from \"./groupCall/title\";\nimport PopupElement from \"./popups\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport GroupCallInstance from \"../lib/calls/groupCallInstance\";\nimport CALL_STATE from \"../lib/calls/callState\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport CallDescriptionElement from \"./call/description\";\nimport PopupCall from \"./call\";\nimport type { AppAvatarsManager } from \"../lib/appManagers/appAvatarsManager\";\nimport GroupCallMicrophoneIconMini from \"./groupCall/microphoneIconMini\";\nimport CallInstance from \"../lib/calls/callInstance\";\nimport type { AppCallsManager } from \"../lib/appManagers/appCallsManager\";\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n \n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n \n constructor(\n private appGroupCallsManager: AppGroupCallsManager,\n private appPeersManager: AppPeersManager,\n private appChatsManager: AppChatsManager,\n private appAvatarsManager: AppAvatarsManager,\n private appCallsManager: AppCallsManager\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(rootScope)('call_instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('call_accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_instance', (instance) => {\n this.updateInstance(instance);\n });\n \n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = this.appGroupCallsManager.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n \n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n \n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n let state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n \n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\n }\n \n if(isClosed) {\n return;\n }\n \n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n \n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n \n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n \n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n \n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n \n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n \n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n \n const end = ButtonIcon('endcall_filled');\n right.append(end);\n \n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n \n new PopupGroupCall({\n appGroupCallsManager: this.appGroupCallsManager,\n appPeersManager: this.appPeersManager,\n appChatsManager: this.appChatsManager\n }).show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall) as PopupCall[];\n if(popups.find(popup => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall({\n appCallsManager: this.appCallsManager,\n appAvatarsManager: this.appAvatarsManager,\n appPeersManager: this.appPeersManager,\n instance: this.instance\n }).show();\n }\n }, {listenerSetter});\n \n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n \n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall } from \"../../layer\";\nimport CallInstance from \"../calls/callInstance\";\nimport CALL_STATE from \"../calls/callState\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appProfileManager from \"./appProfileManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport type CallAudioAssetName = \"call_busy.mp3\" | \"call_connect.mp3\" | \"call_end.mp3\" | \"call_incoming.mp3\" | \"call_outgoing.mp3\" | \"voip_failed.mp3\" | \"voip_connecting.mp3\";\n\nexport class AppCallsManager {\n private log: ReturnType;\n private calls: Map;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n private audioAsset: AudioAssetPlayer;\n \n constructor() {\n this.log = logger('CALLS');\n \n this.tempId = 0;\n this.calls = new Map();\n this.instances = new Map();\n this.sortedInstances = [];\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n \n rootScope.addMultipleEventsListeners({\n updatePhoneCall: async(update) => {\n const call = this.saveCall(update.phone_call);\n\n let instance = this.instances.get(call.id);\n \n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n instance.confirmCall();\n }\n\n break;\n }\n \n case 'phoneCallRequested': {\n if(!instance) {\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n \n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n \n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManager.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint);\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n },\n \n updatePhoneCallSignalingData: (update) => {\n const instance = this.instances.get(update.phone_call_id);\n if(instance?.id !== update.phone_call_id) {\n return;\n }\n \n instance.onUpdatePhoneCallSignalingData(update);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\n ]);\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n public async computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return apiManager.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n \n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n \n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n return call;\n }\n \n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n \n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n \n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n appCallsManager: this,\n apiManager,\n apiUpdatesManager,\n ...options,\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n rootScope.dispatchEvent('call_instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then(async(dhConfig) => {\n return apiManager.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n \n public startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n \n const fullInfo = appProfileManager.getCachedFullUser(userId);\n if(!fullInfo) return;\n \n const {video_calls_available} = fullInfo.pFlags;\n \n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.generateDh().then(dh => {\n call.dh = dh;\n\n return apiManager.invokeApi('phone.requestCall', {\n user_id: appUsersManager.getUserInput(userId),\n protocol: call.protocol,\n video: isVideo && video_calls_available,\n random_id: nextRandomUint(32),\n g_a_hash: call.dh.g_a_hash\n });\n }).then(result => {\n const phoneCall = this.savePhonePhoneCall(result);\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n\nconst appCallsManager = new AppCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appCallsManager = appCallsManager);\nexport default appCallsManager;\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\n//import apiManager from '../mtproto/apiManager';\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport apiUpdatesManager from './apiUpdatesManager';\nimport appUsersManager from \"./appUsersManager\";\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport appChatsManager from './appChatsManager';\nimport appDocsManager from './appDocsManager';\nimport appInlineBotsManager from './appInlineBotsManager';\nimport appMessagesManager from './appMessagesManager';\nimport appPeersManager from './appPeersManager';\nimport appPhotosManager from './appPhotosManager';\nimport appProfileManager from './appProfileManager';\nimport appStickersManager from './appStickersManager';\nimport appWebPagesManager from './appWebPagesManager';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport { IS_TOUCH_SUPPORTED } from '../../environment/touchSupport';\nimport appPollsManager from './appPollsManager';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport appDraftsManager from './appDraftsManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport stateStorage from '../stateStorage';\nimport appDownloadManager from './appDownloadManager';\nimport { AppStateManager, STATE_INIT } from './appStateManager';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport appNotificationsManager from './appNotificationsManager';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatInvite, Dialog, Message, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport { getFilesFromEvent } from '../../helpers/files';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport { SliceEnd } from '../../helpers/slicedArray';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport appEmojiManager from './appEmojiManager';\nimport PopupElement from '../../components/popups';\nimport singleInstance from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport { pause } from '../../helpers/schedulers/pause';\nimport appMessagesIdsManager from './appMessagesIdsManager';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport RichTextProcessor from '../richtextprocessor';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport appGroupCallsManager, { GroupCallId, MyGroupCall } from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport appAvatarsManager from './appAvatarsManager';\nimport appCallsManager from './appCallsManager';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport { CallType } from '../calls/types';\nimport { Modify, SendMessageEmojiInteractionData } from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport { simulateClickEvent } from '../../helpers/dom/clickEvent';\nimport appReactionsManager from './appReactionsManager';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\n\n//console.log('appImManager included33!');\n\nappSidebarLeft; // just to include\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId?: PeerId, \n lastMsgId?: number, \n threadId?: number,\n startParam?: string\n};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n \n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n constructor() {\n apiUpdatesManager.attach();\n appNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach(theme => {\n if(theme.background.slug) {\n const url = /* window.location.origin + window.location.pathname + */'assets/img/' + theme.background.slug + '.svg';\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\n \n window.addEventListener('blur', () => {\n animationIntersector.checkAnimations(true);\n \n this.offline = rootScope.idle.isIDLE = true;\n this.updateStatus();\n clearInterval(this.updateStatusInterval);\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n \n window.addEventListener('focus', () => {\n this.offline = rootScope.idle.isIDLE = false;\n this.updateStatus();\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n \n // в обратном порядке\n animationIntersector.checkAnimations(false);\n\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n this.updateStatus();\n\n this.offline = rootScope.idle.isIDLE = false;\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true, passive: true});\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n // setTimeout(() => {\n this.applyCurrentTheme();\n // }, 0);\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) \n && document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n const resizeBackgroundDebounced = debounce(() => {\n this.setBackground(this.lastBackgroundUrl, false);\n }, 200, false, true);\n mediaSizes.addEventListener('resize', () => {\n resizeBackgroundDebounced();\n });\n\n rootScope.addEventListener('history_focus', (e) => {\n let {peerId, threadId, mid, startParam} = e;\n if(threadId) threadId = appMessagesIdsManager.generateMessageId(threadId);\n if(mid) mid = appMessagesIdsManager.generateMessageId(mid); // because mid can come from notification, i.e. server message id\n \n this.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId,\n startParam\n });\n });\n\n rootScope.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat || \n chat.peerId !== peerId || \n rootScope.overlaysActive || (\n mediaSizes.activeScreen === ScreenSize.mobile && \n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find(typing => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[appMessagesIdsManager.generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && bubble.classList.contains('sticker') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach(a => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n \n appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n rootScope.addEventListener('instance_deactivated', () => {\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n('Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n('Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n popup.addEventListener('close', () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n });\n\n popup.show();\n });\n\n // remove scroll listener when setting chat to tray\n rootScope.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', c || {});\n });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(appGroupCallsManager, appPeersManager, appChatsManager, appAvatarsManager, appCallsManager);\n }\n\n if(IS_CALL_SUPPORTED) {\n rootScope.addEventListener('call_instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n \n const popup = new PopupCall({\n appCallsManager,\n appAvatarsManager,\n appPeersManager,\n instance\n });\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n rootScope.dispatchEvent('call_accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = appCallsManager.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n }\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then(peerId => {\n appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n this.addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n if(pathnameParams[0] === 'c') {\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach(name => {\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange();\n this.attachKeydownListener();\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach(chat => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(rootScope.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(rootScope.filterId, true);\n let nextDialog: Dialog.dialog;\n if(!rootScope.peerId) {\n if(key === 'ArrowDown') {\n nextDialog = folder[0];\n }\n } else {\n const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);\n if(idx !== -1) {\n const nextIndex = key === 'ArrowUp' ? idx - 1 : idx + 1;\n nextDialog = folder[nextIndex];\n }\n }\n \n if(nextDialog) {\n this.setPeer({peerId: nextDialog.peerId});\n }\n } else if(key === 'ArrowUp') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMid: number;\n for(const mid of slice) {\n const message = chat.getMessage(mid);\n const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;\n\n if(good) {\n if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {\n goodMid = mid;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n \n if(goodMid) {\n chat.input.initMessageEditing(goodMid);\n cancelEvent(e); // * prevent from scrolling\n }\n }\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? appMessagesIdsManager.generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? appMessagesIdsManager.generateMessageId(+link.comment) : undefined;\n\n this.openUsername({\n userName: link.domain, \n lastMsgId: postId, \n commentId,\n startParam: link.start\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = appMessagesIdsManager.generateMessageId(+link.post);\n const threadId = link.thread ? appMessagesIdsManager.generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n apiManager.invokeApi('messages.checkChatInvite', {\n hash: link.invite\n }).then(chatInvite => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite).show();\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n \n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach(item => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = () => {\n const hash = location.hash;\n const splitted = hash.split('?');\n\n const params = this.parseUriParams(hash, splitted);\n\n this.log('hashchange', hash, splitted[0], params);\n\n if(params.tgaddr) {\n appNavigationController.replaceState();\n const {onclick} = RichTextProcessor.wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? appMessagesIdsManager.generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p, \n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(), \n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(options: {\n userName: string, \n lastMsgId?: number, \n threadId?: number, \n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return appUsersManager.resolveUsername(userName).then(peer => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n \n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return appMessagesManager.wrapSingleMessage(peerId, threadId).then(() => {\n const message: Message = appMessagesManager.getMessageByPeer(peerId, threadId);\n if(message._ === 'messageEmpty') {\n lastMsgId = undefined;\n } else {\n appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return appMessagesManager.getDiscussionMessage(peerId, msgId).then(message => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = appCallsManager.getCallByUserId(userId);\n if(call) {\n return;\n }\n \n const userFull = await appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n appCallsManager.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(appGroupCallsManager.groupCall && appGroupCallsManager.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(appCallsManager.currentCall && appCallsManager.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = appCallsManager.currentCall;\n if(currentCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = appGroupCallsManager.groupCall;\n if(currentGroupCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appGroupCallsManager.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n \n call = await appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = appGroupCallsManager.saveGroupCall(chatFull.call, chatId);\n }\n \n appGroupCallsManager.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false) {\n const theme = rootScope.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = AppStateManager.STATE_INIT.settings.themes.find(t => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setBackground('', true);\n });\n // }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = appDownloadManager.cacheStorage.getFile('backgrounds/' + slug).then(blob => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map(chat => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n //const bubble = chat.bubbles.getBubbleByPoint('top');\n //if(bubble) {\n //const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const top = chatBubbles.scrollable.scrollTop;\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && Object.keys(chatBubbles.bubbles).length) {\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc'),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = rootScope.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n rootScope.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n this.applyHighlightningColor();\n\n rootScope.setTheme();\n\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом \n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) { \n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat', \n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!isFiles || (!this.canDrag() && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const types: string[] = await getFilesFromEvent(e, true);\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter(t => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach(drop => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach(drop => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || rootScope.isOverlayActive || !chat.canSend('send_media'));\n }\n\n private onDocumentPaste = (e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!this.canDrag() && !newMediaPopup) return;\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n getFilesFromEvent(e).then((files: File[]) => {\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n new PopupNewMedia(this.chat, files, chatInput.willAttachType);\n }\n });\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n rootScope.dispatchEvent('im_tab_change', id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n if(!this.myId) return Promise.resolve();\n \n appUsersManager.setUserStatus(this.myId, this.offline);\n return apiManager.invokeApiSingle('account.updateStatus', {offline: this.offline});\n }\n\n private createNewChat() {\n const chat = new Chat(this, \n appChatsManager, \n appDocsManager, \n appInlineBotsManager, \n appMessagesManager, \n appPeersManager, \n appPhotosManager, \n appProfileManager, \n appStickersManager, \n appUsersManager, \n appWebPagesManager, \n appPollsManager, \n apiManager, \n appDraftsManager, \n serverTimeManager, \n stateStorage, \n appNotificationsManager, \n appEmojiManager,\n appMessagesIdsManager,\n appGroupCallsManager,\n appReactionsManager\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n rootScope.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n rootScope.dispatchEvent('chat_changing', {from: chatFrom, to: this.chat});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach(chat => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(this.chat.container, animate);\n\n if(justReturn) {\n rootScope.dispatchEvent('peer_changed', this.chat.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n \n const isSet = appSidebarRight.sharedMediaTab.setPeer(this.chat.peerId, this.chat.threadId);\n if(isSet) {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n appSidebarRight.sharedMediaTab.fillProfileElements();\n }\n \n /* setTimeout(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n }\n\n spliced.forEach(chat => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach(chat => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public setPeer(options: ChatSetPeerOptions = {}, animate?: boolean): boolean {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && chat.peerId !== peerId) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = chat.setPeer(peerId, lastMsgId, options.startParam);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n //window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex(chat => chat.peerId === peerId && chat.type === type);\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\n }\n\n rootScope.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n //this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId, \n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n //default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n if(!appUsersManager.isBot(peerId)) {\n const typings = appProfileManager.getPeerTypings(peerId);\n if(!typings || !typings.length) {\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = peerId.isUser() ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach(typing => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n return;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n let args: any[];\n if(peerId.isAnyChat()) {\n args = [\n new PeerTitle({peerId: typing.userId.toPeerId(false), onlyFirstName: true}).element,\n typings.length - 1\n ];\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(RichTextProcessor.wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n return container;\n }\n }\n\n public async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean) {\n let subtitle: HTMLElement;\n if(!peerId) return;\n\n if(peerId.isAnyChat()) { // not human\n let span = this.getPeerTyping(peerId);\n if(span) {\n return span;\n }\n\n const chatId = peerId.toChatId();\n const chatInfo = await appProfileManager.getChatFull(chatId) as any;\n this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = chatInfo.participants_count || (chatInfo.participants && chatInfo.participants.participants && chatInfo.participants.participants.length) || 1;\n //if(participants_count) {\n subtitle = appProfileManager.getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n } else { // user\n const user = appUsersManager.getUser(peerId);\n \n if(rootScope.myId === peerId && !ignoreSelf) {\n return;\n } else if(user) {\n subtitle = appUsersManager.getUserStatusString(user.id);\n\n if(!appUsersManager.isBot(peerId)) {\n let span = this.getPeerTyping(peerId);\n if(!span && user.status?._ === 'userStatusOnline') {\n span = document.createElement('span');\n span.classList.add('online');\n span.append(subtitle);\n }\n\n if(span) {\n return span;\n }\n }\n \n return subtitle;\n }\n }\n }\n\n public setPeerStatus(peerId: PeerId, element: HTMLElement, needClear: boolean, useWhitespace: boolean, middleware: () => boolean, ignoreSelf?: boolean) {\n if(needClear) {\n element.innerHTML = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n }\n\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && this.getPeerTyping(peerId, typingContainer)) {\n return;\n }\n\n this.getPeerStatus(peerId, ignoreSelf).then((subtitle) => {\n if(!middleware()) {\n return;\n }\n\n replaceContent(element, subtitle || (useWhitespace ? '‎' : ''));\n });\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\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 { deferredPromise } from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport { LazyLoadQueueBase } from \"./lazyLoadQueue\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach(name => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP, \n min: ZOOM_MIN_VALUE, \n max: ZOOM_MAX_VALUE, \n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n \n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach(el => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv, \n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n //console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n //console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n appNavigationController.removeByType('media');\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as any).cleanup && (this.listLoader as any).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n (window as any).appMediaViewer = undefined;\n\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n this.zoomSwipeHandler = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n\n promise.finally(() => {\n this.wholeDiv.remove();\n rootScope.isOverlayActive = false;\n animationIntersector.checkAnimations(false);\n });\n\n return promise;\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find(s => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(rootScope.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n \n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n \n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map(r => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n //let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = document.createElement('video');\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map(v => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map(v => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map(v => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n\n const isPeerId = fromId.isPeerId();\n let title: HTMLElement;\n if(isPeerId) {\n title = new PeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n } else {\n title = document.createElement('span');\n title.innerHTML = RichTextProcessor.wrapEmojiText(fromId);\n title.classList.add('peer-title');\n }\n\n replaceContent(this.author.nameEl, title);\n\n let oldAvatar = this.author.avatarEl;\n this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n if(!isPeerId) {\n this.author.avatarEl.setAttribute('peer-title', '' + fromId);\n } else {\n this.author.avatarEl.removeAttribute('peer-title');\n }\n\n this.author.avatarEl.setAttribute('peer', '' + (fromId || NULL_PEER_ID));\n\n oldAvatar.parentElement.replaceChild(this.author.avatarEl, oldAvatar);\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n //if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n //if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n \n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n \n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n rootScope.isOverlayActive = true;\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n const mainColumns = document.getElementById('main-columns');\n this.pageEl.insertBefore(this.wholeDiv, mainColumns);\n void this.wholeDiv.offsetLeft; // reflow\n this.wholeDiv.classList.add('active');\n animationIntersector.checkAnimations(true);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n });\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n //const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n let img: HTMLImageElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */document.createElement('video');\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n \n // if(!video.parentElement) {\n div.append(video);\n // }\n \n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n \n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n \n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video, \n play, \n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.removeListeners();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = () => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const cacheContext = appDownloadManager.getCacheContext(media);\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDocsManager.downloadDoc(media);\n \n if(!supportsStreaming) {\n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = cacheContext.url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n const rollback = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n rollback();\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = () => {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n const cancellablePromise = isDocument ? appDocsManager.downloadDoc(media) : appPhotosManager.preloadPhoto(media, size);\n \n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach(img => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch(err => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\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\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\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 MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = appMessagesManager.getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n detachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\n }\n };\n\n attachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = (e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId\n });\n });\n }\n };\n\n onDownloadClick = () => {\n const {peerId, mid} = this.target;\n const message = this.getMessageByPeer(peerId, mid);\n if(message.media.photo) {\n appPhotosManager.savePhotoFile(message.media.photo, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n } else {\n let document: MyDocument = null;\n\n if(message.media.webpage) document = message.media.webpage.document;\n else document = message.media.document;\n\n if(document) {\n //console.log('will save document:', document);\n appDocsManager.saveDocFile(document, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n }\n }\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html = '';\n if(caption) {\n html = RichTextProcessor.wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const cantForwardMessage = message._ === 'messageService' || !appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach(button => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n \n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach(button => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach(button => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\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 { Photo } from \"../layer\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId || this.current?.photoId;\n return appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then(value => {\n const items = value.photos.map(photoId => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\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 AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = () => {\n appPhotosManager.savePhotoFile(appPhotosManager.getPhoto(this.target.photoId), appImManager.chat.bubbles.lazyLoadQueue.queueId);\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\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 appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport isObject from \"../helpers/object/isObject\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n appAvatarsManager.removeFromAvatarsCache(peerId);\r\n (Array.from(document.querySelectorAll('avatar-element[peer=\"' + peerId + '\"]')) as AvatarElement[]).forEach(elem => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n if(!appAvatarsManager.isAvatarCached(peerId)) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find(img => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then(value => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(photo.id, getTarget(), undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n private peerId: PeerId;\r\n private isDialog: boolean;\r\n private peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n public isBig: boolean;\r\n private addedToQueue = false;\r\n\r\n connectedCallback() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n this.isDialog = this.getAttribute('dialog') === '1';\r\n if(this.getAttribute('clickable') === '') {\r\n this.setAttribute('clickable', 'set');\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n //console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n static get observedAttributes(): string[] {\r\n return ['peer', 'dialog', 'peer-title'/* массив имён атрибутов для отслеживания их изменений */];\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n //console.log('avatar changed attribute:', name, oldValue, newValue);\r\n // вызывается при изменении одного из перечисленных выше атрибутов\r\n if(name === 'peer') {\r\n const newPeerId = (newValue || '').toPeerId() || NULL_PEER_ID;\r\n if(this.peerId === newPeerId) {\r\n return;\r\n }\r\n \r\n this.peerId = appPeersManager.getPeerMigratedTo(newPeerId) || newPeerId;\r\n\r\n const wasPeerId = (oldValue || '').toPeerId() || NULL_PEER_ID;\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n this.update();\r\n } else if(name === 'peer-title') {\r\n this.peerTitle = newValue;\r\n } else if(name === 'dialog') {\r\n this.isDialog = newValue === '1';\r\n }\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const res = appAvatarsManager.putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb, this.isBig);\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n if(this.loadPromises) {\r\n if(res && res.cached) {\r\n this.loadPromises.push(promise);\r\n }\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.r(true);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return;\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const res = this.r();\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\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 appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, {Dialog} from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { positionMenu, openBtnMenu } from \"./misc\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\nimport PopupMute from \"./popups/mute\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: () => !appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && !appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = () => {\n let dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(err => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n new AppChatFoldersTab(appSidebarLeft).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [rootScope.config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n appMessagesManager.togglePeerMute(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n new PopupMute(this.selectedId);\n };\n\n private onUnreadClick = () => {\n const dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n appMessagesManager.readHistory(this.selectedId, dialog.top_message);\n appMessagesManager.markDialogUnread(this.selectedId, true);\n } else {\n appMessagesManager.markDialogUnread(this.selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, 'LI');\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.filterId = appDialogsManager.filterId;\n\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = appMessagesManager.getDialogOnly(this.selectedId);\n\n this.buttons.forEach(button => {\n const good = button.verify();\n\n button.element.classList.toggle('hide', !good);\n });\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\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\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\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 { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\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 App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport apiUpdatesManager from \"../lib/appManagers/apiUpdatesManager\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n sessionStorage.get('dc').then(baseDcId => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = rootScope.connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n attachClickEvent(a, (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => apiManager.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => apiManager.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","export default function roundRect(\n ctx: CanvasRenderingContext2D, \n x: number, \n y: number, \n width: number, \n height: number, \n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number, \n fill?: boolean, \n stroke?: boolean\n) {\n if(typeof(radius) === 'number') {\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\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 { animate } from \"../helpers/animation\";\nimport customProperties from \"../helpers/dom/customProperties\";\nimport easeInOutSine from \"../helpers/easing/easeInOutSine\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport roundRect from \"../helpers/roundRect\";\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n \n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n \n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n \n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n \n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n \n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n \n height *= DPR;\n const y = (SIZE - height) / 2;\n \n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine (t: number, b: number, c: number, d: number) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n}\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 DialogsStorage from \"../storages/dialogs\";\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from \"../storages/filters\";\nimport type { LazyLoadQueueIntersector } from \"../../components/lazyLoadQueue\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport { attachContextMenuListener, putPreloader } from \"../../components/misc\";\nimport { ripple } from \"../../components/ripple\";\n//import Scrollable from \"../../components/scrollable\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appPeersManager from './appPeersManager';\nimport appImManager from \"./appImManager\";\nimport appMessagesManager, { Dialog, MyMessage } from \"./appMessagesManager\";\nimport appStateManager, { State } from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../rlottie/lottieLoader\";\nimport { wrapLocalSticker, wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport appChatsManager from \"./appChatsManager\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport generateVerifiedIcon from \"../../components/generateVerifiedIcon\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport groupCallActiveIcon from \"../../components/groupCallActiveIcon\";\nimport { Chat, NotifyPeer } from \"../../layer\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport appNavigationController, { NavigationItem } from \"../../components/appNavigationController\";\nimport assumeType from \"../../helpers/assumeType\";\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLLIElement,\n subtitleEl: HTMLElement\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => appMessagesManager.getDialogOnly(element.id)[this.indexKey],\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({dialog: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n private chatsPreloader: HTMLElement;\n\n private loadDialogsPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu = new DialogsContextMenu();\n\n public sortedList: SortedDialogList;\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n constructor() {\n this.chatsPreloader = putPreloader(null, true);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n this.setFilterId(0);\n this.addFilter({\n id: this.filterId,\n title: '',\n titleEl: this.allChatsIntlElement.element,\n orderIndex: 0\n });\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n appStateManager.getState().then((state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n appUsersManager.clear();\n appChatsManager.clear();\n \n const filtersStorage = appMessagesManager.filtersStorage;\n const filters = filtersStorage.filters;\n for(const filterId in filters) { // delete filters\n rootScope.dispatchEvent('updateDialogFilter', {\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n\n appMessagesManager.clear();\n\n /* const clearPromises: Promise[] = [];\n for(const name in appStateManager.storagesResults) {\n const results = appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(!IS_MOBILE_SAFARI) {\n if(id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n \n appNavigationController.unshiftItem(this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n this.setFilterId(id);\n this.onTabChange();\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n appMessagesManager.construct();\n appStateManager.getState().then((state) => {\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number) {\n this.filterId = filterId;\n this.indexKey = appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId) : 'index';\n rootScope.filterId = filterId;\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', (userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && !appUsersManager.isBot(userId) && peerId !== rootScope.myId) {\n const user = appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n /* rootScope.$on('dialog_top', (e) => {\n const dialog = e;\n\n this.setLastMessage(dialog);\n this.setDialogPosition(dialog);\n\n this.setFiltersUnreadCount();\n }); */\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setLastMessage(dialog, undefined, undefined, undefined, undefined, undefined, true);\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n }\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setUnreadMessages(dialog);\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.validateDialogForFilter(dialog);\n this.setUnreadMessages(dialog); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] li[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach(element => {\n this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', (filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = appMessagesManager.dialogsStorage.getCachedDialogs(true);\n this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n elements.title.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n });\n\n rootScope.addEventListener('filter_order', (order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n order.forEach((filterId) => {\n const filter = appMessagesManager.filtersStorage.getFilter(filterId);\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(filterId);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType>(key);\n appNotificationsManager.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n\n appNotificationsManager.getNotifyPeerTypeSettings();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n \n const renderFiltersPromise = appMessagesManager.filtersStorage.getDialogFilters().then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(state.filters && Object.keys(state.filters).length) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(appStateManager.storagesResults.dialogs.length) {\n appDraftsManager.addMissedDialogs();\n }\n\n return this.onChatsScroll().then(() => {\n appMessagesManager.fillConversations();\n });\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = dialog[this.indexKey];\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessage(dialog, undefined, dom, undefined, undefined, undefined, true);\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n this.onChatsScroll();\n };\n\n private setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const folder = appMessagesManager.dialogsStorage.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find(dialog => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n \n const sum = folder.unreadDialogsCount;\n unreadSpan.innerText = sum ? '' + sum : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private validateListForFilter() {\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId) || null;\n this.sortedList.getAll().forEach((element) => {\n const dialog = appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog, filter?: MyDialogFilter) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog, filter = appMessagesManager.filtersStorage.getFilter(this.filterId)) {\n if(!dialog || \n (filter && !appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) || \n (!filter && this.filterId !== dialog.folder_id)) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filterId: number) {\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n list, \n appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(filterId) : 'index',\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick & Partial<{titleEl: HTMLElement}>) {\n if(this.filtersRendered[filter.id]) return;\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.titleEl) titleSpan.append(filter.titleEl);\n else titleSpan.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter.id);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n \n if(this.loadDialogsPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n\n const promise = new Promise(async(resolve) => {\n const {chatList, filterId, indexKey} = this;\n\n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = appMessagesManager.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex(dialog => dialog[indexKey] <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = storage[needIndex][indexKey] + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n try {\n //console.time('getDialogs time');\n \n const getConversationsResult = appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(!getConversationsResult.cached && !chatList.childElementCount) {\n const container = chatList.parentElement;\n container.append(this.chatsPreloader);\n }\n \n const result = await getConversationsResult.promise;\n \n if(this.loadDialogsPromise !== promise) {\n return;\n }\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n const isBuggedDialog = !appMessagesManager.getDialogOnly(dialog.peerId);\n if(isBuggedDialog) {\n return;\n }\n\n const element = this.sortedList.add(dialog.peerId, true, cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n await Promise.all(loadPromises).finally();\n\n callbacks.forEach(callback => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = offsetDialog[indexKey];\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(this.chatsPreloader.parentElement) {\n this.chatsPreloader.remove();\n }\n \n resolve();\n }).finally(() => {\n this.loadDialogsPromise = undefined;\n });\n\n return this.loadDialogsPromise = promise;\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find(el => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n \n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n placeholderContainer.prepend(wrapLocalSticker({\n emoji: '📂',\n width: 128,\n height: 128\n }).container)\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, () => {\n new AppEditFolderTab(appSidebarLeft).open(appMessagesManager.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\n return this.updateContactsLengthPromise = appUsersManager.getContacts().then(users => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n \n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n \n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then(contacts => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false, \n onListLengthChange\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = (peerId: PeerId) => {\n return peerId.isContact() && !appMessagesManager.getDialogOnly(peerId);\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach(el => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach(el => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private setOffsets() {\n const chatList = this.chatList;\n const firstDialog = this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = firstDialog[indexKey];\n this.offsets.bottom = lastDialog[indexKey];\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n\n return Promise.resolve();\n } else if(this.loadDialogsPromise) return this.loadDialogsPromise;\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n //cancelEvent(e);\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, 'LI');\n\n if(!elem) {\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* , \n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessage(\n dialog: Dialog, \n lastMessage?: any, \n dom?: DialogDom, \n highlightWord?: string, \n loadPromises?: Promise[],\n isBatch = false,\n setUnread = false\n ) {\n ///////console.log('setlastMessage:', lastMessage);\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n //this.log.error('no dom for dialog:', dialog, lastMessage, dom, highlightWord);\n return;\n }\n }\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft && dialog.draft._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n \n lastMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n if(lastMessage._ === 'messageEmpty'/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.innerHTML = '';\n dom.lastTimeSpan.innerHTML = '';\n delete dom.listEl.dataset.mid;\n\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n }\n\n return;\n }\n\n const peerId = dialog.peerId;\n const isRestricted = lastMessage && appMessagesManager.isRestricted(lastMessage);\n //let peerId = appMessagesManager.getMessagePeer(lastMessage);\n\n //console.log('setting last message:', lastMessage);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n\n let mediaContainer: HTMLElement;\n if(!lastMessage.deleted && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = appMessagesManager.getMediaFromMessage(lastMessage);\n if(media && (media._ === 'photo' || (['video', 'gif'] as MyDocument['type'][]).includes(media.type))) {\n const size = appPhotosManager.choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n \n wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size,\n loadPromises\n });\n\n if((media as MyDocument).type === 'video') {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n const withoutMediaType = !!mediaContainer && !!lastMessage?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && lastMessage.message) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType);\n } else if(draftMessage) {\n fragment = appMessagesManager.wrapMessageForReply(draftMessage);\n } else if(!lastMessage.deleted) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType);\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(mediaContainer) {\n fragment.prepend(mediaContainer);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n \n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n dom.lastMessageSpan.prepend(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !lastMessage.action) {\n const sender = appPeersManager.getPeer(lastMessage.fromId);\n if(sender && sender.id) {\n const senderBold = document.createElement('b');\n\n if(sender.id === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n senderBold.append(new PeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n }).element);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n } //////// else console.log('no sender', lastMessage, peerId);\n }\n }\n\n if(!lastMessage.deleted || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null) {\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n } else { // means search\n dom.listEl.dataset.mid = lastMessage.mid;\n }\n }\n }\n\n private setUnreadMessages(dialog: Dialog, dom = this.getDialogDom(dialog.peerId), isBatch = false) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n if(!isBatch) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, 200);\n }\n }\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!lastMessage.deleted && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = appMessagesManager.isDialogUnread(dialog);\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private getDialog(dialog: Dialog | PeerId): Dialog {\n if(typeof(dialog) !== 'object') {\n const originalDialog = appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n const dialog = this.getDialog(options.dialog);\n\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = dialog;\n const isMuted = appNotificationsManager.isPeerLocalMuted(peerId, true);\n if(isMuted) {\n ret.dom.listEl.classList.add('is-muted');\n }\n\n if(!peerId.isUser()) {\n this.processDialogForCallStatus(dialog, ret.dom);\n }\n\n this.setLastMessage(dialog, undefined, ret.dom, undefined, options.loadPromises, options.isBatch, true);\n }\n\n return ret;\n }\n\n private processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage, \n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = appDialogsManager.addDialogNew({\n ...options,\n ...appMessagesManager.getMessageSenderPeerIdOrName(message),\n dialog: this.getDialog(peerId),\n });\n\n this.setLastMessage(ret.dialog, message, ret.dom, query);\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n dialog: Parameters[0],\n container?: Parameters[1],\n drawStatus?: boolean,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n }) {\n return this.addDialog(options.dialog, options.container, options.drawStatus, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName);\n }\n\n public addDialog(\n _dialog: Parameters[0], \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n drawStatus = true, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n ) {\n const dialog = this.getDialog(_dialog);\n const peerId = dialog.peerId;\n\n const avatarEl = new AvatarElement();\n avatarEl.loadPromises = loadPromises;\n avatarEl.lazyLoadQueue = lazyLoadQueue;\n avatarEl.setAttribute('dialog', meAsSaved ? '1' : '0');\n if(fromName !== undefined) avatarEl.setAttribute('peer-title', fromName);\n avatarEl.setAttribute('peer', '' + peerId);\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n\n if(drawStatus && peerId !== rootScope.myId && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(avatarEl, true);\n }\n }\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n titleSpanContainer.append(generateVerifiedIcon());\n }\n //}\n \n const span = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n\n const li = document.createElement('li');\n li.classList.add('chatlist-chat');\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom, dialog};\n }\n\n public setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessage(dialog, null, dom, undefined, undefined, undefined, null);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/*\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 { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/19.4321e94dcc79f8936402.chunk.js b/public/19.4321e94dcc79f8936402.chunk.js new file mode 100644 index 00000000..0b1ffe9b --- /dev/null +++ b/public/19.4321e94dcc79f8936402.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[19],{107:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var s=i(5),n=i(36);class a extends n.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(s.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},117:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(51);class n{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},23:function(t,e,i){"use strict";i.r(e);var s=i(35),n=i(38),a=i(17),r=i(88),o=i(69),c=i(34),l=i(107),d=i(117),u=i(31),p=i(16),h=i(98),m=i(5),w=i(29),b=i(99),g=i(33),v=i(55);let y;const k=new o.a("page-password",!0,()=>{const t=new h.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(c.a)("btn-primary btn-color-primary"),a=new p.default.IntlElement({key:"Login.Next"});e.append(a.element);const o=new l.a({label:"LoginPassword",name:"password"});let k;y=o.input,t.inputWrapper.append(o.container,e);let P,f=()=>(k||(k=window.setInterval(f,1e4)),r.a.getState().then(t=>{P=t,P.hint?Object(g.a)(o.label,Object(b.a)(u.b.wrapEmojiText(P.hint))):o.setLabel()}));const L=t=>{if(t&&Object(m.a)(t),!y.value.length)return void y.classList.add("error");const n=Object(v.a)([y,e],!0);let c=y.value;a.update({key:"PleaseWait"});const l=Object(s.f)(e);o.setValueSilently(""+Math.random()),o.setValueSilently(c),r.a.check(c,P).then(t=>{switch(t._){case"auth.authorization":clearInterval(k),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),S&&S.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),l.remove()}}).catch(t=>{n(),o.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),y.select(),l.remove(),f()})};Object(w.b)(e,L),y.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return L()}));const E=n.b.isMobile?100:166,S=new d.a(o,E);return t.imageDiv.append(S.container),Promise.all([S.load(),f()])},null,()=>{y.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=k},88:function(t,e,i){"use strict";var s=i(30),n=i(32);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,s;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?n.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=e.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,s=t.newPassword?n.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,s]).then(t=>(a.password=t[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=t[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return n.a.invokeCrypto("computeSRP",t,e,!1).then(t=>n.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&n.a.setUser(t.user),t)))}confirmPasswordEmail(t){return n.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};s.a.passwordManager=a,e.a=a},98:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(16);class n{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(s.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(s.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},99:function(t,e,i){"use strict";function s(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return s}))}}]); +//# sourceMappingURL=19.4321e94dcc79f8936402.chunk.js.map \ No newline at end of file diff --git a/public/19.4321e94dcc79f8936402.chunk.js.map b/public/19.4321e94dcc79f8936402.chunk.js.map new file mode 100644 index 00000000..a4dc1aa4 --- /dev/null +++ b/public/19.4321e94dcc79f8936402.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","element","label","getStateInterval","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","passwordManager","invokeApi","result","settings","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","LoginPage","body","querySelector","title","subtitle","htmlToSpan","html","span","innerHTML"],"mappings":"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","file":"19.4321e94dcc79f8936402.chunk.js","sourcesContent":["/*\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// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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 { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\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 { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/2.3d6b202e8d6ff37ebd0b.chunk.js b/public/2.3d6b202e8d6ff37ebd0b.chunk.js new file mode 100644 index 00000000..0dacb6d1 --- /dev/null +++ b/public/2.3d6b202e8d6ff37ebd0b.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[2,24],{105:function(t,e,s){"use strict";function i(t,e,s){return ts?s:t}s.d(e,"a",(function(){return i}))},113:function(t,e,s){"use strict";function i(t,e){const s=e.split(".");let i=t;return s.forEach(t=>{t&&(i=i[t])}),i}s.d(e,"a",(function(){return i}))},114:function(t,e,s){"use strict";s.d(e,"c",(function(){return a})),s.d(e,"b",(function(){return o})),s.d(e,"a",(function(){return h}));var i=s(45),n=s(52);const r=new Map;function a(t){const e=function(t){return r.get(t)}(t);e&&(e.isCancelled=!0,e.deferred.resolve())}function o(t,e,s){return s||(s=function(t){a(t);const e={isCancelled:!1,deferred:Object(n.a)()};return r.set(t,e),e.deferred.then(()=>{r.delete(t)}),e}(e)),Object(i.b)(()=>{s.isCancelled||(t()?o(t,e,s):s.deferred.resolve())}),s.deferred}function h(t){Object(i.b)(()=>{t()&&h(t)})}},129:function(t,e,s){"use strict";s.d(e,"a",(function(){return c}));var i=s(142),n=s(15),r=s(45),a=s(86),o=s(96),h=s(91);function c(t,e,s,c,l=250,d){const u=Object(i.a)(e,t||"tabs"===e.dataset.animation?"tabs":"navigation",l,c);if(t){const i=new Proxy(u,{apply:(e,s,i)=>{const n=+i[0],r=void 0===i[1]||i[1],a=t.querySelector(`[data-tab="${n}"]`)||t.children[n];c(a,n,r)}}),c=(i,o,h=!0)=>{const c=e.children[o];if(s){const t=s(o,c,h);if(void 0!==t&&!t)return}d&&d.scrollIntoViewNew({element:i.parentElement.children[o],position:"center",forceDirection:h?void 0:a.a.Static,forceDuration:l,axis:"x"}),n.default.settings.animationsEnabled||(h=!1);const f=u.prevId();if(i.classList.contains("active")||o===f)return!1;const g=t.querySelector(p.toLowerCase()+".active");Object(r.b)(()=>{g&&g.classList.remove("active")}),m&&-1!==f&&h&&Object(r.b)(()=>{const t=i.querySelector("i"),e=i.parentElement.children[f].querySelector("i");e.classList.remove("animate"),t.classList.remove("animate");const s=e.parentElement.parentElement.offsetLeft-t.parentElement.parentElement.offsetLeft,n=e.clientWidth/t.clientWidth;t.style.transform=`translate3d(${s}px, 0, 0) scale3d(${n}, 1, 1)`,requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})}),Object(r.b)(()=>{i.classList.add("active")}),u(o,h)},m=!t.classList.contains("no-stripe"),p=t.firstElementChild.tagName;return t.addEventListener("click",(function(e){let s,i=e.target;if(i=Object(o.a)(i,t),!i)return!1;if(i.dataset.tab){if(s=+i.dataset.tab,-1===s)return!1}else s=Object(h.a)(i);c(i,s)})),i}return u}},139:function(t,e,s){"use strict";s.d(e,"a",(function(){return r}));var i=s(53),n=s(84);function r(t,e,s,a){for(const o in t)typeof e[o]!=typeof t[o]?(e[o]=Object(i.a)(t[o]),s&&s(a||o)):Object(n.a)(t[o])&&r(t[o],e[o],s,a||o)}},142:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(15),n=s(52),r=s(82),a=s(91),o=s(5);function h(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",t.style.filter="",()=>{e.style.transform=e.style.filter=""}}function c(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.transform=`translate3d(${-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",()=>{e.style.transform=""}}const l=(t,e,s,i,n=!0)=>{let r=null;switch(e){case"tabs":r=c;break;case"navigation":r=h}return t.dataset.animation=e,d(t,r,s,i,n)},d=(t,e,s,h,c=!0,l=!1,d=!0)=>{const u=new Map;let m,p=null;if(d){const s=e?"transitionend":"animationend",i=e=>{if(Object(o.a)(e),e.target.parentElement!==t)return;const n=u.get(e.target);n&&n(),e.target===p&&(!m&&c||(m&&(m.resolve(),m=void 0),h&&h(f.prevId()),t.classList.remove("animating","backwards","disable-hover"),l&&(t.removeEventListener(s,i),p=m=void 0,u.clear())))};t.addEventListener(s,i)}function f(o,l=!0,g){g&&(p=g),o instanceof HTMLElement&&(o=Object(a.a)(o));const v=f.prevId();if(o===v)return!1;const y=t.children[o];if(i.default.settings.animationsEnabled&&-1!==v||(l=!1),!d){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!l){if(p)p.classList.remove("active","to","from");else if(y){const t=u.get(y);t&&t()}return y&&(y.classList.remove("to","from"),y.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),p=y,void(h&&h(o))}d||(t.dataset.timeout=""+window.setTimeout(()=>{y.classList.remove("to"),p&&p.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout},s)),p&&(p.classList.remove("to"),p.classList.add("from")),t.classList.add("animating");const b=v{y.classList.remove("to"),u.delete(y)}),p){const t=p,e=()=>{t.classList.remove("active","from"),w&&w(),u.delete(t)};if(y)u.set(t,e);else{const i=window.setTimeout(e,s);u.set(t,()=>{clearTimeout(i),u.delete(t)})}c&&(m||(m=Object(n.a)()),Object(r.b)(m,2*s))}p=y}return f.prevId=()=>p?Object(a.a)(p):-1,f}},17:function(t,e,s){"use strict";s.r(e),s.d(e,"STATE_INIT",(function(){return L})),s.d(e,"AppStateManager",(function(){return I}));var i=s(43),n=s(50),r=s(15),a=s(89),o=s(41),h=s(7),c=s(30),l=s(103),d=s(0),u=s(138),m=s(74),p=s(66);function f(t,e){t=t.split(" ",1)[0],e=e.split(" ",1)[0];const s=t.split("."),i=e.split(".");for(let t=0;tn)return 1;if(e{this.requestPeerSingle(r.default.myId,"self")})}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(t=>{const e=Object.keys(this.storages),s=e.map(t=>this.storages[t].getAll()),i=F.map(t=>a.a.get(t)).concat(m.a.get("user_auth"),m.a.get("state_id")).concat(a.a.get("user_auth")).concat(s);Promise.all(i).then(s=>b(this,void 0,void 0,(function*(){let i=this.state={};for(let t=0,e=F.length;ta.a.get(t)));t.push("user_auth"),e.push("number"==typeof n||"string"==typeof n?{dcID:e[0]||h.a.baseDcId,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n);let s={};t.forEach((t,i)=>{s[t]=e[i]}),yield m.a.set(s)}n&&(i.authState={_:"authStateSignedIn"},r.default.dispatchEvent("user_auth","number"==typeof n||"string"==typeof n?{dcID:0,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n));for(let t=0,i=e.length;t{t.set(s,Object(g.a)(i[s]))}),i=this.state=Object(g.a)(L),t.forEach((t,e)=>{i[e]=t});for(const t in this.storagesResults)this.storagesResults[t].length=0;this.storage.set(i)}yield m.a.set({state_id:i.stateId})}const d=Date.now();if(i.stateCreatedTime+864e5{t.forEach(t=>{this.pushToState(t,Object(g.a)(L[t]));const e=this.storagesResults[t];e&&e.length&&(e.length=0)})})(E)}if(!i.settings.hasOwnProperty("theme")&&i.settings.hasOwnProperty("nightTheme")&&(i.settings.theme=i.settings.nightTheme?"night":"day",this.pushToState("settings",i.settings)),!i.settings.hasOwnProperty("themes")&&i.settings.background){i.settings.themes=Object(g.a)(L.settings.themes);const t=i.settings.themes.find(t=>t.name===i.settings.theme);t&&(t.background=i.settings.background,this.pushToState("settings",i.settings))}const u=i.settings.autoDownload;if(void 0!==(null==u?void 0:u.private)){const t=["contacts","private","groups","channels"];["photo","video","file"].forEach(e=>{const s=u[e]={};t.forEach(t=>{s[t]=u[t]})}),t.forEach(t=>{delete u[t]}),this.pushToState("settings",i.settings)}if(Object(y.a)(L,i,t=>{this.pushToState(t,i[t])}),i.version!==w||i.build!==k){if(-1===f(i.version,"0.8.7")){this.state.allDialogsLoaded=Object(g.a)(L.allDialogsLoaded),this.state.filters=Object(g.a)(L.filters);const t=this.storagesResults.dialogs;(null==t?void 0:t.length)&&(t.length=0)}if(-1===f(i.version,"1.3.0")){let t=!1;i.settings.themes.forEach((e,s,i)=>{if("day"===e.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===e.background.slug&&"image"===e.background.type||"night"===e.name&&"#0f0f0f"===e.background.color&&"color"===e.background.type){const n=L.settings.themes.find(t=>t.name===e.name);n&&(i[s]=Object(g.a)(n),t=!0)}}),t&&this.pushToState("settings",i.settings)}0!==f(i.version,w)&&(this.newVersion=w),this.pushToState("version",w),this.pushToState("build",k)}r.default.settings=i.settings,c.b&&this.log("state res",i,Object(g.a)(i)),console.timeEnd("load state"),t(i)}))).catch(t)})),this.loaded}getState(){return void 0===this.state?this.loadSavedState():Promise.resolve(this.state)}setByKey(t,e){!function(t,e,s){const i=e.split(".");Object(v.a)(t,i.slice(0,-1).join("."))[i.pop()]=s}(this.state,t,e),r.default.dispatchEvent("settings_updated",{key:t,value:e});const s=t.split(".")[0];this.pushToState(s,this.state[s])}pushToState(t,e,s=!0){s&&(this.state[t]=e),this.setKeyValueToStorage(t,e)}setKeyValueToStorage(t,e=this.state[t]){this.storage.set({[t]:e})}requestPeer(t,e,s){let i=this.neededPeers.get(t);i&&i.has(e)||(i||(i=new Set,this.neededPeers.set(t,i)),i.add(e),this.dispatchEvent("peerNeeded",t),void 0!==s&&this.keepPeerSingle(t,e))}requestPeerSingle(t,e,s=t){return this.requestPeer(t,e+"_"+s,1)}releaseSinglePeer(t,e){return this.keepPeerSingle(i.c,e+"_"+t)}isPeerNeeded(t){return this.neededPeers.has(t)}keepPeerSingle(t,e){const s=this.singlePeerMap.get(e);if(s&&s!==t&&this.neededPeers.has(s)){const t=this.neededPeers.get(s);t.delete(e),t.size||(this.neededPeers.delete(s),this.dispatchEvent("peerUnneeded",s))}t?this.singlePeerMap.set(e,t):this.singlePeerMap.delete(e)}}I.STATE_INIT=L;const S=new I;c.a.appStateManager=S;e.default=S},189:function(t,e,s){"use strict";s.d(e,"a",(function(){return u}));var i=s(0);let n;if(i.IS_SAFARI)try{n=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(t){n=!1}else n=!0;var r=n,a=s(50),o=s(38),h=s(105),c=s(51),l=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const d=new class{constructor(){this.cache=new Map}getCache(t){let e=this.cache.get(t);return e||this.cache.set(t,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(t){const e=this.cache.get(t);e&&!--e.counter&&this.cache.delete(t)}getCacheCounter(t){const e=this.cache.get(t);return null==e?void 0:e.counter}generateName(t,e,s,i,n){return[t,e,s,i?"colored":"",n||""].filter(Boolean).join("-")}};class u extends a.a{constructor({el:t,worker:e,options:s}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.reqId=++u.reqId,this.el=t,this.worker=e;for(let t in s)this.hasOwnProperty(t)&&(this[t]=s[t]);let n;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=s.initFrame,this.color=s.color,this.inverseColor=s.inverseColor,this.name=s.name,this.skipFirstFrameRendering=s.skipFirstFrameRendering,this.toneIndex=s.toneIndex,void 0!==s.skipRatio?n=s.skipRatio:(i.IS_ANDROID||i.IS_APPLE_MOBILE||i.IS_APPLE&&!i.IS_SAFARI)&&this.width<100&&this.height<100&&!s.needUpscale&&(n=.5),this.skipDelta=void 0!==n?1/n|0:1;const a=Object(h.a)(window.devicePixelRatio,1,2);a>1&&(s.needUpscale?(this.width=Math.round(this.width*a),this.height=Math.round(this.height*a)):a>1&&(this.width>100&&this.height>100?i.IS_APPLE||!o.b.isMobile?(this.width=Math.round(this.width*a),this.height=Math.round(this.height*a)):a>2.5&&(this.width=Math.round(this.width*(a-1.5)),this.height=Math.round(this.height*(a-1.5))):(this.width=Math.round(this.width*Math.max(1.5,a-1.5)),this.height=Math.round(this.height*Math.max(1.5,a-1.5))))),s.noCache||(i.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),r&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=d.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=d.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&d.getCacheCounter(this.cacheName)>1||this.frames.clear())}sendQuery(t,...e){this.worker.sendQuery(t,this.reqId,...e)}loadFromData(t){this.sendQuery("loadFromData",t,this.width,this.height,this.toneIndex)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(t=!0){this.paused||(this.paused=!0,t&&clearTimeout(this.rafId))}resetCurrentFrame(){var t;return this.curFrame=null!==(t=this.initFrame)&&void 0!==t?t:1===this.direction?this.minFrame:this.maxFrame}stop(t=!0){this.pause();const e=this.resetCurrentFrame();t&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(t){this.speed!==t&&(this.speed=t,this.paused||this.setMainLoop())}setDirection(t){this.direction!==t&&(this.direction=t,this.paused||this.setMainLoop())}remove(){c.a.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&d.releaseCache(this.cacheName),this.cleanup()}applyColor(t){const[e,s,i]=this.color;for(let n=0,r=t.length;n{this.renderFrame2(t,e)},this.frInterval>-s?-s%this.frInterval:this.frInterval)}this.renderFrame2(t,e)}requestFrame(t){const e=this.frames.get(t);e?this.renderFrame(e,t):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",t,this.clamped))}onLap(){return!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:t,maxFrame:e}=this,s=this.curFrame+t>e?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=t;return this.requestFrame(s),!(s+t>e)||this.onLap()}mainLoopBackwards(){const{skipDelta:t,minFrame:e}=this,s=this.curFrame-te?1:-1,callback:i})}playToFrame(t){this.pause();const{frame:e,speed:s,callback:i,direction:n}=t;this.setDirection(void 0===n?this.curFrame>e?-1:1:n),void 0!==s&&this.setSpeed(s);const r=[this.curFrame,e];-1===this.direction&&r.reverse(),this.loop=!1,this.setMinMax(r[0],r[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i&&(this.playToFrameOnFrameCallback=t=>{t===e&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(t,e){this.color=t,e&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(t){this.inverseColor=t}setMinMax(t=0,e=this.frameCount-1){this.minFrame=t,this.maxFrame=e}onLoad(t,e){return l(this,void 0,void 0,(function*(){this.frameCount=t,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=Object(h.a)(this.initFrame,this.minFrame,this.maxFrame));const s=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const t=60/e;this.skipDelta=this.skipDelta/t|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(s),this.dispatchEvent("ready"),this.addEventListener("enterFrame",()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const t=Date.now();this.frThen=t+this.frInterval;this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()},{once:!0})}))}}u.reqId=0},45:function(t,e,s){"use strict";let i;function n(t){i?i.push(t):(i=[t],requestAnimationFrame(()=>{const t=i;i=void 0,t.forEach(t=>t())}))}s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return h})),s.d(e,"d",(function(){return c})),s.d(e,"a",(function(){return l}));let r,a,o=!1;function h(t){r?o?t():r.push(t):(r=[t],requestAnimationFrame(()=>{o=!0;for(let t=0;t{a=void 0}),a)}function l(){return new Promise(t=>{n(()=>{n(t)})})}},51:function(t,e,s){"use strict";function i(){return new Worker(s.p+"rlottie.worker.086dfed03cbca80766c6.bundle.worker.js")}var n=s(62),r=s(30),a=s(80),o=s(41),h=s(32),c=s(189),l=s(0),d=s(50);class u extends d.a{constructor(t){super(),this.worker=t,this.worker.onerror=t=>{try{this.dispatchEvent("workerError",t),this.cleanup(),this.terminate()}catch(t){}},this.worker.onmessage=t=>{this.dispatchEvent(t.data.queryMethodListener,...t.data.queryMethodArguments)}}postMessage(t){this.worker.postMessage(t)}terminate(){this.worker.terminate()}sendQuery(t,...e){if(l.IS_SAFARI)this.worker.postMessage({queryMethod:t,queryMethodArguments:e});else{const s=[];e.forEach(t=>{t instanceof ArrayBuffer&&s.push(t),"object"==typeof t&&t.buffer instanceof ArrayBuffer&&s.push(t.buffer)}),this.worker.postMessage({queryMethod:t,queryMethodArguments:e},s)}}}var m=s(93),p=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const f=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=Object(o.b)("LOTTIE",o.a.Error),this.onPlayerLoaded=(t,e,s)=>{const i=this.players[t];i?(this.log.debug("onPlayerLoaded"),i.onLoad(e,s)):this.log.warn("onPlayerLoaded on destroyed player:",t,e)},this.onFrame=(t,e,s)=>{const i=this.players[t];i?(void 0!==i.clamped&&(i.clamped=s),i.renderFrame(s,e)):this.log.warn("onFrame on destroyed player:",t,e)},this.onPlayerError=(t,e)=>{const s=this.players[t];if(s){n.a.getAnimations(s.el).forEach(t=>{n.a.checkAnimation(t,!0,!0)})}}}getAnimation(t){for(const e in this.players)if(this.players[e].el===t)return this.players[e];return null}setLoop(t){for(const e in this.players){const s=this.players[e];s.loop=t,s.autoplay=s._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise((t,e)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),r.addEventListener("frame",this.onFrame),r.addEventListener("loaded",this.onPlayerLoaded),r.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),t(),this.loaded=!0)},{once:!0}),r.addEventListener("workerError",t=>{e("rlottie load error: "+t.message),this.loaded=!1},{once:!0})}})}loadAnimationAsAsset(t,e){return t.name=e,this.loadAnimationFromURL(t,"assets/tgs/"+e+".json")}loadAnimationFromURL(t,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then(t=>t.headers&&"application/octet-stream"!==t.headers.get("content-type")?t.blob():t.arrayBuffer().then(t=>h.a.invokeCrypto("gzipUncompress",t)).then(t=>Object(m.a)([t],""))).then(s=>{const i=Object.assign(t,{animationData:s,needUpscale:!0});return i.name||(i.name=e),this.loadAnimationWorker(i)})):this.loadPromise}waitForFirstFrame(t){return Promise.race([new Promise(e=>{t.addEventListener("firstFrame",e,{once:!0})}),Object(a.a)(2500)]).then(()=>t)}loadAnimationWorker(t,e=t.group||"",s){return p(this,void 0,void 0,(function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),s&&!s())throw new Error("middleware");if(t.width&&t.height||(t.width=parseInt(t.container.style.width),t.height=parseInt(t.container.style.height)),!t.width||!t.height)throw new Error("No size for sticker!");t.group=e;const i=this.initPlayer(t.container,t);return"none"!==e&&n.a.addAnimation(i,e),i}))}onDestroy(t){delete this.players[t]}destroyWorkers(){this.workers.forEach((t,e)=>{t.terminate(),this.log("worker #"+e+" terminated")}),this.log("workers destroyed"),this.workers.length=0}initPlayer(t,e){const s=new c.a({el:t,worker:this.workers[this.curWorkerNum++],options:e});return this.players[s.reqId]=s,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),s.loadFromData(e.animationData),s}};r.a.lottieLoader=f;e.a=f},59:function(t,e,s){"use strict";function i(t,e){const s=t.indexOf(e),i=-1!==s&&t.splice(s,1);return i&&i[0]}s.d(e,"a",(function(){return i}))},62:function(t,e,s){"use strict";var i=s(15),n=s(0),r=s(30),a=s(90),o=s(189),h=s(59),c=s(67);const l=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver(t=>{for(const e of t){const t=e.target;for(const s in this.byGroups){if(this.intersectionLockedGroups[s])continue;const i=this.byGroups[s].find(e=>e.el===t);if(i){e.isIntersecting?(this.visible.add(i),this.checkAnimation(i,!1)):(this.visible.delete(i),this.checkAnimation(i,!0),i.animation instanceof o.a&&i.animation.clearCache());break}}}}),this.overrideIdleGroups=new Set,i.default.addEventListener("media_play",({doc:t})=>{"round"===t.type&&(this.videosLocked=!0,this.checkAnimations())}),i.default.addEventListener("media_pause",()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})}setOverrideIdleGroup(t,e){e?this.overrideIdleGroups.add(t):this.overrideIdleGroups.delete(t)}getAnimations(t){const e=[];for(const s in this.byGroups)for(const i of this.byGroups[s])i.el===t&&e.push(i);return e}removeAnimation(t){const{el:e,animation:s}=t;s.remove(),s instanceof HTMLVideoElement&&n.IS_SAFARI&&setTimeout(()=>{s.src="",s.load()},1e3);const i=this.byGroups[t.group];i&&(Object(h.a)(i,t),i.length||delete this.byGroups[t.group]),this.observer.unobserve(e),this.visible.delete(t)}addAnimation(t,e=""){var s;const n={el:t instanceof o.a?t.el:t,animation:t,group:e};t instanceof o.a&&!i.default.settings.stickers.loop&&t.loop&&(t.loop=i.default.settings.stickers.loop),(null!==(s=this.byGroups[e])&&void 0!==s?s:this.byGroups[e]=[]).push(n),this.observer.observe(n.el)}checkAnimations(t,e,s=!1){if(void 0!==e&&!this.byGroups[e])return;const i=void 0!==e?[e]:Object.keys(this.byGroups);for(const e of i){const i=this.byGroups[e];Object(c.a)(i,e=>{this.checkAnimation(e,t,s)})}}checkAnimation(t,e=!1,s=!1){const{el:n,animation:r,group:o}=t;s||!Object(a.a)(n)&&!this.lockedGroups[o]?this.removeAnimation(t):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==o||r instanceof HTMLVideoElement&&this.videosLocked?r.paused||r.pause():!(r.paused&&this.visible.has(t)&&r.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==o||i.default.idle.isIDLE&&!this.overrideIdleGroups.has(t.group)||r.play()}setOnlyOnePlayableGroup(t){this.onlyOnePlayableGroup=t}lockGroup(t){this.lockedGroups[t]=!0}unlockGroup(t){delete this.lockedGroups[t],this.checkAnimations(void 0,t)}refreshGroup(t){const e=this.byGroups[t];e&&e.length&&(e.forEach(t=>{this.observer.unobserve(t.el)}),window.requestAnimationFrame(()=>{e.forEach(t=>{this.observer.observe(t.el)})}))}lockIntersectionGroup(t){this.intersectionLockedGroups[t]=!0}unlockIntersectionGroup(t){delete this.intersectionLockedGroups[t],this.refreshGroup(t)}};r.a&&(r.a.animationIntersector=l),e.a=l},67:function(t,e,s){"use strict";function i(t,e){for(let s=t.length-1;s>=0;--s)e(t[s],s,t)}s.d(e,"a",(function(){return i}))},69:function(t,e,s){"use strict";s.d(e,"a",(function(){return d}));var i=s(51),n=s(129),r=s(30),a=s(86),o=s(91);const h=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=Object(n.a)(null,this.scrollableDiv.querySelector(".tabs-container"),null,()=>{var t;(null===(t=this.page)||void 0===t?void 0:t.onShown)&&this.page.onShown()})}setPage(t){if(t.isAuthPage){this.pagesDiv.style.display="";let e=Object(o.a)(t.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&i.a.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&Object(a.b)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",t.pageEl.style.display="",this.pageId=-1;this.page=t}};r.a.pagesManager=h;var c=h,l=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};class d{constructor(t,e,s,i,n){this.isAuthPage=e,this.onFirstMount=s,this.onMount=i,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+t)}mount(...t){return l(this,void 0,void 0,(function*(){if(this.onMount&&this.onMount(...t),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...t);e instanceof Promise&&(yield e)}catch(t){console.error("PAGE MOUNT ERROR:",t)}this.installed=!0}c.setPage(this)}))}}},82:function(t,e,s){"use strict";s.d(e,"b",(function(){return d})),s.d(e,"d",(function(){return m})),s.d(e,"c",(function(){return p}));var i=s(52),n=s(15),r=s(30),a=s(80);let o=!1,h=Object(i.a)(),c=0;h.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function d(t,e){o||(h=Object(i.a)(),n.default.dispatchEvent("event-heavy-animation-start"),o=!0,r.b&&l("start")),++c,r.b&&l("attach promise, length:",c,e);const s=[void 0!==e?Object(a.a)(e):void 0,t.finally(()=>{})].filter(Boolean),d=performance.now(),m=h;return Promise.race(s).then(()=>{h!==m||h.isFulfilled||(--c,r.b&&l("promise end, length:",c,performance.now()-d),c<=0&&u())}),h}function u(){h.isFulfilled||(o=!1,c=0,n.default.dispatchEvent("event-heavy-animation-end"),h.resolve(),r.b&&l("end"))}function m(){u()}function p(){return h}e.a=function(t,e,s){o&&t();const i=s?s.add(n.default):n.default.addEventListener.bind(n.default),r=s?s.removeManual.bind(s,n.default):n.default.removeEventListener.bind(n.default);return i("event-heavy-animation-start",t),i("event-heavy-animation-end",e),()=>{r("event-heavy-animation-end",e),r("event-heavy-animation-start",t)}}},86:function(t,e,s){"use strict";s.d(e,"a",(function(){return h})),s.d(e,"b",(function(){return c}));var i=s(82),n=s(45),r=s(114),a=s(15),o=s(90);var h;function c(t){if(void 0===t.margin&&(t.margin=0),void 0===t.maxDistance&&(t.maxDistance=1500),void 0===t.axis&&(t.axis="y"),a.default.settings.animationsEnabled||(t.forceDirection=h.Static),t.forceDirection===h.Static)return t.forceDuration=0,l(t);const e=new Promise(e=>{Object(n.b)(()=>{l(t).then(e)})});return"y"===t.axis?Object(i.b)(e):e}function l(t){const{element:e,container:s,getNormalSize:i,axis:n,margin:a,position:h,forceDirection:c,maxDistance:m,forceDuration:p}=t;if(!Object(o.a)(e))return Object(r.c)(s),Promise.resolve();const f="y"===n?"top":"left",g="y"===n?"bottom":"right",v="y"===n?"height":"width",y="y"===n?"scrollHeight":"scrollWidth",b="y"===n?"scrollTop":"scrollLeft",w=e.getBoundingClientRect(),k=s.getBoundingClientRect?s.getBoundingClientRect():document.body.getBoundingClientRect(),L=w[f]-k[f],F=e[y],E=i?i({rect:k}):k[v];let I=s[b];const S=s[y];let P;switch(h){case"start":P=L-a;break;case"end":P=w[g]-k[g]+a;break;case"nearest":case"center":if(Fm?(I=s.scrollTop+=P-m,P=m):P<-m&&(I=s.scrollTop+=P+m,P=-m)),P<0){const t=-I;P=Math.max(P,t)}else if(P>0){const t=S-(I+E);P=Math.min(P,t)}const O=s[b]+P,M=Math.abs(P),D=null!=p?p:250+M/1500*350,A=Date.now(),T=M<500?u:d,j=()=>{const t=D?Math.min((Date.now()-A)/D,1):1,e=P*(1-T(t));return s[b]=Math.round(O-e),t<1};return D&&P?Object(r.b)(j,s):(Object(r.c)(s),j(),Promise.resolve())}function d(t){return 1-Math.pow(1-t,5)}function u(t){return 1-Math.pow(1-t,3.5)}!function(t){t[t.Up=0]="Up",t[t.Down=1]="Down",t[t.Static=2]="Static"}(h||(h={}))},90:function(t,e,s){"use strict";function i(t){return null==t?void 0:t.isConnected}s.d(e,"a",(function(){return i}))},91:function(t,e,s){"use strict";function i(t){if(!t.parentNode)return-1;let e=0;for(;null!==(t=t.previousElementSibling);)++e;return e}s.d(e,"a",(function(){return i}))},96:function(t,e,s){"use strict";function i(t,e){if(t.parentElement===e)return t;for(;t.parentElement;)if((t=t.parentElement).parentElement===e)return t;return null}s.d(e,"a",(function(){return i}))}}]); +//# sourceMappingURL=2.3d6b202e8d6ff37ebd0b.chunk.js.map \ No newline at end of file diff --git a/public/2.3d6b202e8d6ff37ebd0b.chunk.js.map b/public/2.3d6b202e8d6ff37ebd0b.chunk.js.map new file mode 100644 index 00000000..af2604a6 --- /dev/null +++ b/public/2.3d6b202e8d6ff37ebd0b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/number/clamp.ts","webpack:///./src/helpers/object/getDeepProperty.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/object/validateInitObject.ts","webpack:///./src/components/transition.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/getTimeFormat.ts","webpack:///./src/helpers/object/setDeepProperty.ts","webpack:///./src/environment/canUseTransferables.ts","webpack:///./src/lib/rlottie/rlottiePlayer.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/rlottie/queryableWorker.ts","webpack:///./src/lib/rlottie/lottieLoader.ts","webpack:///./src/helpers/array/indexOfAndSplice.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/array/forEachReverse.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/dom/whichChild.ts","webpack:///./src/helpers/dom/findUpAsChild.ts"],"names":["clamp","v","min","max","getDeepProperty","object","key","splitted","split","o","forEach","instances","Map","cancelAnimationByKey","instance","get","getAnimationInstance","isCancelled","deferred","resolve","animateSingle","tick","set","then","delete","createAnimationInstance","animate","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","target","that","args","id","undefined","el","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","element","parentElement","position","forceDirection","Static","forceDuration","axis","settings","animationsEnabled","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","validateInitObject","initObject","currentObject","onReplace","previousKey","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","_from","compareVersion","v1","v2","s1","s2","i","length","STATE_VERSION","version","BUILD","build","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","authState","_","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","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","theme","notifications","sound","timeFormat","toLocaleString","match","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","ALL_KEYS","Object","keys","REFRESH_KEYS","super","log","logger","neededPeers","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","this","loadSavedState","rootScope","requestPeerSingle","myId","loaded","console","time","Promise","storagesKeys","storagesPromises","map","getAll","promises","concat","sessionStorage","all","arr","state","value","pushToState","copy","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","date","toPeerId","obj","idx","dispatchEvent","preserve","state_id","s","r","hasOwnProperty","nightTheme","find","t","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","missingKey","result","migrated","newTheme","newVersion","timeEnd","catch","slice","join","pop","setDeepProperty","first","direct","setKeyValueToStorage","peerId","limit","has","Set","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","size","appStateManager","CAN_USE_TRANSFERABLES","navigator","userAgent","err","cache","frames","counter","height","toneIndex","Boolean","worker","options","reqId","paused","direction","speed","autoplay","group","cachingDelta","skipRatio","_loop","_autoplay","initFrame","inverseColor","skipFirstFrameRendering","needUpscale","skipDelta","pixelRatio","devicePixelRatio","Math","round","mediaSizes","isMobile","noCache","Infinity","canvas","document","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","cacheName","generateName","getCache","getCacheCounter","methodName","sendQuery","data","setMainLoop","clearPendingRAF","rafId","curFrame","minFrame","maxFrame","renderFirstFrame","pause","resetCurrentFrame","requestFrame","stop","play","lottieLoader","onDestroy","releaseCache","cleanup","frame","g","b","frameNo","applyColor","applyInversing","putImageData","error","frInterval","delta","frThen","renderFrame2","renderFrame","onLap","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","setDirection","setSpeed","bounds","setMinMax","playToFrameOnFrameCallback","renderIfPaused","frameCount","diff","parentNode","appendChild","fastRafCallbacks","fastRaf","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","Worker_fn","Worker","onerror","terminate","onmessage","event","queryMethodListener","queryMethodArguments","message","postMessage","queryMethod","transfer","arg","ArrayBuffer","buffer","isWebAssemblySupported","loadPromise","reject","workersLimit","players","workers","curWorkerNum","Error","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","params","loadAnimationFromURL","url","loadLottieWorkers","fetch","res","headers","blob","arrayBuffer","invokeCrypto","blobConstruct","newParams","assign","animationData","loadAnimationWorker","race","middleware","parseInt","container","initPlayer","addAnimation","loadFromData","indexOfAndSplice","array","item","indexOf","spliced","visible","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","entry","p","isIntersecting","clearCache","overrideIdleGroups","doc","checkAnimations","override","found","HTMLVideoElement","src","load","unobserve","observe","blurred","destroy","animations","removeAnimation","idle","isIDLE","refreshGroup","forEachReverse","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","fastSmoothScroll","className","onFirstMount","onMount","installed","body","setPage","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promise","finally","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","FocusDirection","margin","maxDistance","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","containerRect","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","abs","scrollTop","remainingPath","absPath","duration","startAt","transition","shortTransition","longTransition","currentPath","isInDOM","isConnected","elem","previousElementSibling","findUpAsChild","parent"],"mappings":"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","file":"2.3d6b202e8d6ff37ebd0b.chunk.js","sourcesContent":["export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach(key => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\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\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\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 { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement, \r\n content: HTMLElement, \r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, \r\n onTransitionEnd?: () => void, \r\n transitionTime = 250, \r\n scrollableX?: ScrollableX\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\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 rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\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 { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { AutoDownloadSettings, Chat, NotifyPeer, PeerNotifySettings } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\nimport getTimeFormat from '../../helpers/getTimeFormat';\nimport copy from '../../helpers/object/copy';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport validateInitObject from '../../helpers/object/validateInitObject';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string, \n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n }\n }, {\n name: 'night',\n background: {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\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);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const, \n 'private' as const, \n 'groups' as const, \n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach(mediaType => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach(peerType => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach(peerType => {\n delete autoDownloadSettings[peerType];\n });\n\n this.pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find(newTheme => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n this.pushToState('settings', state.settings);\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","import getDeepProperty from \"./getDeepProperty\";\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\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 CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport clamp from \"../../helpers/number/clamp\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: Blob, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n \n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.cleanup();\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\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\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(requestAnimationFrame);\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","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.086dfed03cbca80766c6.bundle.worker.js\");\n}\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 { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(typeof(arg) === 'object' && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as Transferable[]);\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 RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { pause } from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then(res => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data)).then(arr => blobConstruct([arr], ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(blob => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', middleware?: () => boolean): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n \r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\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 rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport forEachReverse from \"../helpers/array/forEachReverse\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private overrideIdleGroups: Set;\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n return;\r\n }\r\n \r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (player) => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!rootScope.idle.isIDLE || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;\r\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\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 Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\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 pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\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\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\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// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(options).then(resolve);\r\n });\r\n });\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\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\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\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 whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\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 findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/20.e93df534d41d9a216086.chunk.js b/public/20.e93df534d41d9a216086.chunk.js new file mode 100644 index 00000000..7cd18695 --- /dev/null +++ b/public/20.e93df534d41d9a216086.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[20],{106:function(e,t,n){"use strict";n.d(t,"a",(function(){return f}));var a=n(5),r=n(29),i=n(9),o=n(16),s=n(32),c=n(15),l=n(34),d=n(35);let u,g=!1;function f(e){g||(u||(u=s.a.getConfig().then(e=>e.suggested_lang_code!==o.default.lastRequestedLangCode?Promise.all([e,o.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const s=[];n.forEach(e=>{const t=o.default.strings.get(e.key);t&&(s.push(t),o.default.strings.set(e.key,e))});const u=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(i.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),s.forEach(e=>{o.default.strings.set(e.key,e)}),Object(r.b)(u,e=>{Object(a.a)(e),g=!0,u.disabled=!0,Object(d.f)(u),o.default.getLangPack(t.suggested_lang_code)})})}},115:function(e,t,n){"use strict";function a(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return a}))},116:function(e,t,n){"use strict";function a(e,t){const n=e.length;if(n!==t.length)return!1;for(let a=0;ay(void 0,void 0,void 0,(function*(){const e=w.pageEl.querySelector(".auth-image");let t=Object(u.f)(e,!0);const r=document.createElement("div");r.classList.add("input-wrapper");const l=Object(s.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});r.append(l),Object(g.a)(r);const b=e.parentElement,O=document.createElement("h4");Object(c._i18n)(O,"Login.QR.Title");const _=document.createElement("ol");_.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(c.i18n)(e)),_.append(t)}),b.append(O,_,r),l.addEventListener("click",()=>{Promise.all([n.e(6),n.e(25)]).then(n.bind(null,21)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(11).then(n.t.bind(null,199,7))]))[0].default;let L=!1;d.default.addEventListener("user_auth",()=>{L=!0,v=null},{once:!0});let k,S={ignoreErrors:!0};const P=r=>y(void 0,void 0,void 0,(function*(){try{let s=yield a.a.invokeApi("auth.exportLoginToken",{api_id:o.a.id,api_hash:o.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===s._&&(S.dcId||(S.dcId=s.dc_id,a.a.setBaseDcId(s.dc_id)),s=yield a.a.invokeApi("auth.importLoginToken",{token:s.token},S)),"auth.loginTokenSuccess"===s._){const e=s.authorization;return a.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!k||!Object(m.a)(k,s.token)){k=s.token;let n=function(e){let t,n="";for(let a=e.length,r=0,i=0;i>>t&24),2!==t&&a-i!=1||(n+=String.fromCharCode(h(r>>>18&63),h(r>>>12&63),h(r>>>6&63),h(63&r)),r=0);return n.replace(/A(?=A$|$)/g,"=")}(s.token),a="tg://login?token="+Object(p.a)(n,!0);const r=window.getComputedStyle(document.documentElement),i=r.getPropertyValue("--surface-color").trim(),o=r.getPropertyValue("--primary-text-color").trim(),c=r.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${c}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new E({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:a,image:l,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(f.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(r){let e=Date.now()/1e3,t=s.expires-e-i.a.serverTimeOffset;yield Object(f.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(16).then(n.bind(null,23)).then(e=>e.default.mount()),L=!0,v=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>y(void 0,void 0,void 0,(function*(){for(L=!1;;){if(L)break;if(yield P(!0))break}}))}));const w=new r.a("page-signQR",!0,()=>v,()=>{v||(v=b()),v.then(e=>{e()}),l.default.pushToState("authState",{_:"authStateSignQr"})});t.default=w},78:function(e,t,n){"use strict";var a=n(30),r=n(74),i=n(32);const o=new class{constructor(){this.serverTimeOffset=0,r.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),i.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};a.a&&(a.a.serverTimeManager=o),t.a=o}}]); +//# sourceMappingURL=20.e93df534d41d9a216086.chunk.js.map \ No newline at end of file diff --git a/public/20.e93df534d41d9a216086.chunk.js.map b/public/20.e93df534d41d9a216086.chunk.js.map new file mode 100644 index 00000000..afb9a3e1 --- /dev/null +++ b/public/20.e93df534d41d9a216086.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/helpers/bytes/bytesToBase64.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","fixBase64String","str","toUrl","replace","bytesCmp","bytes1","bytes2","len","length","i","uint6ToBase64","nUint6","onFirstMount","imageDiv","pageEl","querySelector","preloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","resolve","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","serverTimeManager","serverTimeOffset","err","console","warn","handled","error","func","appStateManager","pushToState","this","to","addTaskListener","task","payload"],"mappings":"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","file":"20.e93df534d41d9a216086.chunk.js","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 apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = 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;\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 btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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","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","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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 type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\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 appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\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\nlet 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 let 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 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 apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await 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 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 let encoded = bytesToBase64(loginToken.token);\r\n let 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((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;\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((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 let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\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 console.warn('pageSignQR: 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>;\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 appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\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 { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/21.1bcdd871c6dfb97ca84a.chunk.js b/public/21.1bcdd871c6dfb97ca84a.chunk.js new file mode 100644 index 00000000..96002666 --- /dev/null +++ b/public/21.1bcdd871c6dfb97ca84a.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[21],{15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return r}));var i=s(43),n=s(50),o=s(30);class r extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof i.c?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new r;o.a.rootScope=c,t.default=c},30:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));const i=s(75).a.debug,n="undefined"!=typeof window?window:self;t.b=i},43:function(e,t,s){"use strict";s.d(t,"c",(function(){return i})),s.d(t,"d",(function(){return n})),s.d(t,"e",(function(){return o})),s.d(t,"b",(function(){return r})),s.d(t,"a",(function(){return c}));const i=0,n=1271266957,o=777e3,r=2147483647,c=""},50:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var i,n;(null!==(i=this.listeners[e])&&void 0!==i?i:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=s)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const i=t&&[],n=this.listeners[e];if(n){n.slice().forEach(t=>{var o;if(-1===n.findIndex(e=>e.callback===t.callback))return;let r;try{r=t.callback(...s)}catch(e){console.error(e)}i&&i.push(r),(null===(o=t.options)||void 0===o?void 0:o.once)&&this.removeEventListener(e,t.callback)})}return i}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},75:function(e,t,s){"use strict";const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};i.http=location.search.indexOf("http=1")>0,i.http&&(i.transport="https"),t.a=i}}]); +//# sourceMappingURL=21.1bcdd871c6dfb97ca84a.chunk.js.map \ No newline at end of file diff --git a/public/21.1bcdd871c6dfb97ca84a.chunk.js.map b/public/21.1bcdd871c6dfb97ca84a.chunk.js.map new file mode 100644 index 00000000..865c4732 --- /dev/null +++ b/public/21.1bcdd871c6dfb97ca84a.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lib/rootScope.ts","webpack:///./src/config/debug.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/config/modes.ts"],"names":["RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","name","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","DEBUG","debug","MOUNT_CLASS_TO","self","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","EventListenerBase","reuseResults","_constructor","listeners","listenerResults","callback","options","push","hasOwnProperty","once","pop","obj","i","findAndSplice","l","collectResults","args","arr","slice","forEach","listener","findIndex","result","console","error","removeEventListener","_dispatchEvent","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","transport"],"mappings":"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","file":"21.1bcdd871c6dfb97ca84a.chunk.js","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 type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_reactions': {message: Message.message, changedResults: ReactionCount[]},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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\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\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\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\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/22.fa44c64744b789124685.chunk.js b/public/22.fa44c64744b789124685.chunk.js new file mode 100644 index 00000000..ad8ecd2d --- /dev/null +++ b/public/22.fa44c64744b789124685.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[22],{154:function(t,n,r){"use strict";function e(...t){const n=t.reduce((t,n)=>t+(n.byteLength||n.length),0),r=new Uint8Array(n);let e=0;return t.forEach(t=>{r.set(t instanceof ArrayBuffer?new Uint8Array(t):t,e),e+=t.byteLength||t.length}),r}r.d(n,"a",(function(){return e}))},155:function(t,n,r){"use strict";function e(t){const n=t.length,r=new Uint8Array(Math.ceil(n/2));let e=0;n%2&&(r[e++]=parseInt(t.charAt(0),16));for(let o=e;oPromise.resolve(t()).then(n);return this.then(t=>n(()=>t),t=>n(()=>Promise.reject(t)))},Promise.prototype.safeFinally=function(t){return this.catch(()=>{}).finally(t)}}}]); +//# sourceMappingURL=22.fa44c64744b789124685.chunk.js.map \ No newline at end of file diff --git a/public/22.fa44c64744b789124685.chunk.js.map b/public/22.fa44c64744b789124685.chunk.js.map new file mode 100644 index 00000000..e6380d53 --- /dev/null +++ b/public/22.fa44c64744b789124685.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/bytes/bufferConcats.ts","webpack:///./src/helpers/bytes/bytesFromHex.ts","webpack:///./src/helpers/bytes/bytesToHex.ts","webpack:///./src/lib/polyfill.ts"],"names":["bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","bytesFromHex","hexString","len","bytes","Math","ceil","start","parseInt","charAt","i","substr","bytesToHex","arr","Array","toString","join","Object","defineProperty","prototype","get","this","str","enumerable","configurable","randomize","crypto","Error","getRandomValues","concat","toJSON","findAndSplice","verify","index","findIndex","splice","undefined","String","toHHMMSS","leadZero","sec_num","hours","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","result","reason","reject","safeFinally","catch"],"mappings":"uFAAe,SAASA,KAAiBC,GACvC,MAAMC,EAASD,EAAKE,OAAO,CAACC,EAAKC,IAAMD,GAAQC,EAAkBC,YAAeD,EAAiBH,QAAS,GAEpGK,EAAM,IAAIC,WAAWN,GAE3B,IAAIO,EAAa,EAMjB,OALAR,EAAKS,QAAQC,IACXJ,EAAIK,IAAID,aAAaE,YAAc,IAAIL,WAAWG,GAAKA,EAAGF,GAC1DA,GAAeE,EAAkBL,YAAeK,EAAiBT,SAG5DK,EAXT,mC,iCCAe,SAASO,EAAaC,GACnC,MAAMC,EAAMD,EAAUb,OAChBe,EAAQ,IAAIT,WAAWU,KAAKC,KAAKH,EAAM,IAC7C,IAAII,EAAQ,EAETJ,EAAM,IACPC,EAAMG,KAAWC,SAASN,EAAUO,OAAO,GAAI,KAGjD,IAAI,IAAIC,EAAIH,EAAOG,EAAIP,EAAKO,GAAK,EAC/BN,EAAMG,KAAWC,SAASN,EAAUS,OAAOD,EAAG,GAAI,IAGpD,OAAON,EAbT,mC,iCCAe,SAASQ,EAAWR,GACjC,MAAMf,EAASe,EAAMf,OACfwB,EAAgB,IAAIC,MAAMzB,GAChC,IAAI,IAAIqB,EAAI,EAAGA,EAAIrB,IAAUqB,EAC3BG,EAAIH,IAAMN,EAAMM,GAAK,GAAK,IAAM,KAAON,EAAMM,IAAM,GAAGK,SAAS,IAEjE,OAAOF,EAAIG,KAAK,IANlB,mC,gCCAA,sCAUAC,OAAOC,eAAevB,WAAWwB,UAAW,MAAO,CACjDC,IAAK,WACH,OAAO,YAAWC,OAGpBtB,IAAK,SAASuB,GACZD,KAAKtB,IAAI,YAAauB,KAExBC,YAAY,EACZC,cAAc,IAGhB7B,WAAWwB,UAAUM,UAAY,WAC/B,IAAGC,UAAU,oBAAqBA,QAGhC,MAAM,IAAIC,MAAM,oBAGlB,OALED,OAAOE,gBAAgBP,MAKlBA,MAGT1B,WAAWwB,UAAUU,OAAS,YAAYzC,GACxC,OAAO,YAAciC,QAASjC,IAOhCO,WAAWwB,UAAUW,OAAS,WAC5B,MAAO,IAAIT,OAIbP,MAAMK,UAAUY,cAAgB,SAAYC,GAC1C,IAAIC,EAAQZ,KAAKa,UAAUF,GAC3B,OAAkB,IAAXC,EAAeZ,KAAKc,OAAOF,EAAO,GAAG,QAAKG,GAGnDC,OAAOlB,UAAUmB,SAAW,SAASC,GAAW,GAC9C,MAAMC,EAAUhC,SAASa,KAAO,GAAI,IAC9BoB,EAAQpC,KAAKqC,MAAMF,EAAU,MACnC,IAAIG,EAAetC,KAAKqC,OAAOF,EAAmB,KAARC,GAAiB,IACvDG,EAAeJ,EAAmB,KAARC,EAA2B,GAAVE,EAK/C,OAHGF,IAAOF,GAAW,GAClBI,EAAU,KAAIA,EAAUJ,EAAW,IAAMI,EAAUA,GACnDC,EAAU,KAAIA,EAAU,IAAMA,IACzBH,EAAqCA,EAAQ,IAAM,IAAME,EAAU,IAAMC,GAYnFC,QAAQ1B,UAAU2B,QAAUD,QAAQ1B,UAAU2B,SAAW,SAA8BC,GACrF,MAAMC,EAAaC,GAAwBJ,QAAQK,QAAQH,KAAMI,KAAKF,GACtE,OAAO5B,KAAK8B,KACVC,GAAUJ,EAAU,IAAMI,GAC1BC,GAAUL,EAAU,IAAMH,QAAQS,OAAOD,MAI7CR,QAAQ1B,UAAUoC,YAAc,SAA8BR,GAC5D,OAAO1B,KAAKmC,MAAM,QAAUV,QAAQC","file":"22.fa44c64744b789124685.chunk.js","sourcesContent":["export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\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 bufferConcats from \"../helpers/bytes/bufferConcats\";\nimport bytesFromHex from \"../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../helpers/bytes/bytesToHex\";\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n};\n\n/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n }\n}.finally; */\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/23.1965eeacf2722eb2a737.chunk.js b/public/23.1965eeacf2722eb2a737.chunk.js new file mode 100644 index 00000000..97c23d56 --- /dev/null +++ b/public/23.1965eeacf2722eb2a737.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[23],{130:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(51);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},131:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(36);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},22:function(e,t,n){"use strict";n.r(t);var i=n(38),a=n(17),s=n(32),o=n(69),l=n(21),r=n(130),h=n(131),u=n(16),d=n(66),c=n(33),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{r(i.next(e))}catch(e){s(e)}}function l(e){try{r(i.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,l)}r((i=i.apply(e,t||[])).next())}))};let m,y=null,b=null,v=null;const E=new o.a("page-authCode",!0,()=>{const e=y.type.length,t=new h.a({label:"Code",name:Object(d.b)(),length:e,onFill:e=>{o(e)}});m=t.input,E.pageEl.querySelector(".input-wrapper").append(t.container);E.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return l.default.mount()}));const a=()=>{setTimeout(()=>{_.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:y.phone_number,phone_code_hash:y.phone_code_hash,phone_code:e};s.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":s.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(7),n.e(26)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:y.phone_number,phone_code_hash:y.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(19).then(n.bind(null,23))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(c.a)(t.label,Object(u.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(c.a)(t.label,Object(u.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},b=E.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,_=new r.a(t,v);return b.append(_.container),_.load()},e=>{if(y=e,b){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else b=E.pageEl.getElementsByClassName("phone")[0],v=E.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(b.innerText=y.phone_number,y.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[y.type._]}Object(c.a)(v,Object(u.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=E}}]); +//# sourceMappingURL=23.1965eeacf2722eb2a737.chunk.js.map \ No newline at end of file diff --git a/public/23.1965eeacf2722eb2a737.chunk.js.map b/public/23.1965eeacf2722eb2a737.chunk.js.map new file mode 100644 index 00000000..4e597f93 --- /dev/null +++ b/public/23.1965eeacf2722eb2a737.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/pages/pageAuthCode.ts"],"names":["TrackingMonkey","inputField","size","max","needFrame","this","container","document","createElement","classList","add","input","addEventListener","playAnimation","e","value","length","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","loadPromise","Promise","all","loadAnimationAsAsset","loop","autoplay","width","height","then","waitForFirstFrame","_animation","currentFrame","pause","remove","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","mount","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","invokeApi","ignoreErrors","response","_","setUser","user","m","default","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","pushToState","sentCode","focus"],"mappings":"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","file":"23.1965eeacf2722eb2a737.chunk.js","sourcesContent":["/*\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 InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\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 InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\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 mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/24.4b9f00474f1f2b0d38ce.chunk.js b/public/24.4b9f00474f1f2b0d38ce.chunk.js new file mode 100644 index 00000000..372ad719 --- /dev/null +++ b/public/24.4b9f00474f1f2b0d38ce.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[24],{113:function(e,t,s){"use strict";function a(e,t){const s=t.split(".");let a=e;return s.forEach(e=>{e&&(a=a[e])}),a}s.d(t,"a",(function(){return a}))},139:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var a=s(53),i=s(84);function n(e,t,s,o){for(const r in e)typeof t[r]!=typeof e[r]?(t[r]=Object(a.a)(e[r]),s&&s(o||r)):Object(i.a)(e[r])&&n(e[r],t[r],s,o||r)}},17:function(e,t,s){"use strict";s.r(t),s.d(t,"STATE_INIT",(function(){return _})),s.d(t,"AppStateManager",(function(){return k}));var a=s(43),i=s(50),n=s(15),o=s(89),r=s(41),h=s(7),d=s(30),l=s(103),c=s(0),u=s(138),g=s(74),p=s(66);function f(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const s=e.split("."),a=t.split(".");for(let e=0;ei)return 1;if(t{this.requestPeerSingle(n.default.myId,"self")})}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(e=>{const t=Object.keys(this.storages),s=t.map(e=>this.storages[e].getAll()),a=w.map(e=>o.a.get(e)).concat(g.a.get("user_auth"),g.a.get("state_id")).concat(o.a.get("user_auth")).concat(s);Promise.all(a).then(s=>v(this,void 0,void 0,(function*(){let a=this.state={};for(let e=0,t=w.length;eo.a.get(e)));e.push("user_auth"),t.push("number"==typeof i||"string"==typeof i?{dcID:t[0]||h.a.baseDcId,date:Date.now()/1e3|0,id:i.toPeerId(!1)}:i);let s={};e.forEach((e,a)=>{s[e]=t[a]}),yield g.a.set(s)}i&&(a.authState={_:"authStateSignedIn"},n.default.dispatchEvent("user_auth","number"==typeof i||"string"==typeof i?{dcID:0,date:Date.now()/1e3|0,id:i.toPeerId(!1)}:i));for(let e=0,a=t.length;e{e.set(s,Object(m.a)(a[s]))}),a=this.state=Object(m.a)(_),e.forEach((e,t)=>{a[t]=e});for(const e in this.storagesResults)this.storagesResults[e].length=0;this.storage.set(a)}yield g.a.set({state_id:a.stateId})}const c=Date.now();if(a.stateCreatedTime+864e5{e.forEach(e=>{this.pushToState(e,Object(m.a)(_[e]));const t=this.storagesResults[e];t&&t.length&&(t.length=0)})})(T)}if(!a.settings.hasOwnProperty("theme")&&a.settings.hasOwnProperty("nightTheme")&&(a.settings.theme=a.settings.nightTheme?"night":"day",this.pushToState("settings",a.settings)),!a.settings.hasOwnProperty("themes")&&a.settings.background){a.settings.themes=Object(m.a)(_.settings.themes);const e=a.settings.themes.find(e=>e.name===a.settings.theme);e&&(e.background=a.settings.background,this.pushToState("settings",a.settings))}const u=a.settings.autoDownload;if(void 0!==(null==u?void 0:u.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach(t=>{const s=u[t]={};e.forEach(e=>{s[e]=u[e]})}),e.forEach(e=>{delete u[e]}),this.pushToState("settings",a.settings)}if(Object(S.a)(_,a,e=>{this.pushToState(e,a[e])}),a.version!==y||a.build!==P){if(-1===f(a.version,"0.8.7")){this.state.allDialogsLoaded=Object(m.a)(_.allDialogsLoaded),this.state.filters=Object(m.a)(_.filters);const e=this.storagesResults.dialogs;(null==e?void 0:e.length)&&(e.length=0)}if(-1===f(a.version,"1.3.0")){let e=!1;a.settings.themes.forEach((t,s,a)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=_.settings.themes.find(e=>e.name===t.name);i&&(a[s]=Object(m.a)(i),e=!0)}}),e&&this.pushToState("settings",a.settings)}0!==f(a.version,y)&&(this.newVersion=y),this.pushToState("version",y),this.pushToState("build",P)}n.default.settings=a.settings,d.b&&this.log("state res",a,Object(m.a)(a)),console.timeEnd("load state"),e(a)}))).catch(e)})),this.loaded}getState(){return void 0===this.state?this.loadSavedState():Promise.resolve(this.state)}setByKey(e,t){!function(e,t,s){const a=t.split(".");Object(b.a)(e,a.slice(0,-1).join("."))[a.pop()]=s}(this.state,e,t),n.default.dispatchEvent("settings_updated",{key:e,value:t});const s=e.split(".")[0];this.pushToState(s,this.state[s])}pushToState(e,t,s=!0){s&&(this.state[e]=t),this.setKeyValueToStorage(e,t)}setKeyValueToStorage(e,t=this.state[e]){this.storage.set({[e]:t})}requestPeer(e,t,s){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e),void 0!==s&&this.keepPeerSingle(e,t))}requestPeerSingle(e,t,s=e){return this.requestPeer(e,t+"_"+s,1)}releaseSinglePeer(e,t){return this.keepPeerSingle(a.c,t+"_"+e)}isPeerNeeded(e){return this.neededPeers.has(e)}keepPeerSingle(e,t){const s=this.singlePeerMap.get(t);if(s&&s!==e&&this.neededPeers.has(s)){const e=this.neededPeers.get(s);e.delete(t),e.size||(this.neededPeers.delete(s),this.dispatchEvent("peerUnneeded",s))}e?this.singlePeerMap.set(t,e):this.singlePeerMap.delete(t)}}k.STATE_INIT=_;const O=new k;d.a.appStateManager=O;t.default=O}}]); +//# sourceMappingURL=24.4b9f00474f1f2b0d38ce.chunk.js.map \ No newline at end of file diff --git a/public/24.4b9f00474f1f2b0d38ce.chunk.js.map b/public/24.4b9f00474f1f2b0d38ce.chunk.js.map new file mode 100644 index 00000000..ec1c20a6 --- /dev/null +++ b/public/24.4b9f00474f1f2b0d38ce.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/object/getDeepProperty.ts","webpack:///./src/helpers/object/validateInitObject.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/getTimeFormat.ts","webpack:///./src/helpers/object/setDeepProperty.ts"],"names":["getDeepProperty","object","key","splitted","split","o","forEach","validateInitObject","initObject","currentObject","onReplace","previousKey","compareVersion","v1","v2","s1","s2","i","length","STATE_VERSION","version","BUILD","build","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","authState","_","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","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","ALL_KEYS","Object","keys","REFRESH_KEYS","super","log","logger","neededPeers","Map","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","this","loadSavedState","rootScope","addEventListener","requestPeerSingle","myId","loaded","console","time","Promise","resolve","storagesKeys","storagesPromises","map","getAll","promises","get","concat","sessionStorage","all","then","arr","state","value","undefined","pushToState","copy","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","date","toPeerId","obj","idx","set","dispatchEvent","preserve","state_id","s","r","hasOwnProperty","nightTheme","find","t","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","missingKey","result","migrated","type","newTheme","newVersion","timeEnd","catch","slice","join","pop","setDeepProperty","first","direct","setKeyValueToStorage","peerId","limit","has","Set","add","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","delete","size","appStateManager"],"mappings":"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","file":"24.4b9f00474f1f2b0d38ce.chunk.js","sourcesContent":["export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach(key => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\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 { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { AutoDownloadSettings, Chat, NotifyPeer, PeerNotifySettings } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\nimport getTimeFormat from '../../helpers/getTimeFormat';\nimport copy from '../../helpers/object/copy';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport validateInitObject from '../../helpers/object/validateInitObject';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string, \n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n }\n }, {\n name: 'night',\n background: {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\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);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const, \n 'private' as const, \n 'groups' as const, \n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach(mediaType => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach(peerType => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach(peerType => {\n delete autoDownloadSettings[peerType];\n });\n\n this.pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find(newTheme => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n this.pushToState('settings', state.settings);\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","import getDeepProperty from \"./getDeepProperty\";\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/25.dcbbd29bad085f151e64.chunk.js b/public/25.dcbbd29bad085f151e64.chunk.js new file mode 100644 index 00000000..793c7be3 --- /dev/null +++ b/public/25.dcbbd29bad085f151e64.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[25],{21:function(e,t,n){"use strict";n.r(t);var a=n(35),o=n(44),c=n(17),i=n(32),s=n(31),r=n(69),l=n(36),d=n(46),u=n(34),p=n(86),h=n(1),f=n(7),g=n(16),m=n(51),b=n(18),v=n(61),y=n(6),L=n(66),E=n(103),_=n(112),O=n(20),j=n(106),w=n(5),k=n(29),S=n(33),x=n(55),T=n(74),C=n(87),N=n(95),P=n(81),I=n(89),M=n(15),A=n(121),D=n(10),B=function(e,t,n,a){return new(n||(n=Promise))((function(o,c){function i(e){try{r(a.next(e))}catch(e){c(e)}}function s(e){try{r(a.throw(e))}catch(e){c(e)}}function r(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,s)}r((a=a.apply(e,t||[])).next())}))};let H,R=null;const U=new r.a("page-sign",!0,()=>{const e=()=>{t=g.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),M.default.addEventListener("language_change",()=>{e()});const r=new Map;let b,W;const X=document.createElement("div");X.classList.add("input-wrapper");const q=new l.b({label:"Login.CountrySelectorLabel",name:Object(L.b)()});q.container.classList.add("input-select");const z=q.input,F=document.createElement("div");F.classList.add("select-wrapper","z-depth-3","hide");const J=document.createElement("span");J.classList.add("arrow","arrow-down"),q.container.append(J);const K=document.createElement("ul");F.appendChild(K);new o.b(F);let V=()=>{V=null,t.forEach(e=>{const t=Object(N.c)(e.iso2),n=[];e.country_codes.forEach(a=>{const o=document.createElement("li");let c=s.a.wrapEmojiText(t);if(D.a){const e=document.createElement("span");e.innerHTML=c,o.append(e)}else o.innerHTML=c;const i=Object(g.i18n)(e.default_name);i.dataset.defaultName=e.default_name,o.append(i);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+a.country_code,o.appendChild(r),n.push(o),K.append(o)}),r.set(e.iso2,n)}),K.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");Q(t)}),q.container.appendChild(F)};const Q=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,o=a.replace(/\D/g,"");Object(S.a)(z,Object(g.i18n)(n)),Object(P.a)(z,"input"),b=t.find(e=>e.default_name===n),W=b.country_codes.find(e=>e.country_code===o),ee.value=ee.lastValue=a,Z(),setTimeout(()=>{te.focus(),Object(C.a)(te,!0)},0)};let $;V(),z.addEventListener("focus",(function(e){V?V():t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout($),$=void 0,F.classList.remove("hide"),F.offsetWidth,F.classList.add("active"),q.select(),Object(p.b)({container:U.pageEl.parentElement.parentElement,element:z,position:"start",margin:4}),setTimeout(()=>{G||(document.addEventListener("mousedown",Y,{capture:!0}),G=!0)},0)}));let G=!1;const Y=e=>{Object(y.a)(e.target,"input-select")||e.target!==z&&(Z(),document.removeEventListener("mousedown",Y,{capture:!0}),G=!1)},Z=()=>{void 0===$&&(F.classList.remove("active"),$=window.setTimeout(()=>{F.classList.add("hide"),$=void 0},200))};z.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=q.value.toLowerCase(),o=[];t.forEach(e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach(e=>{const n=e.split(" ").filter(e=>/\w/.test(e)).map(e=>e[0]).join("");n.length>1&&t.push(n)});let n=!!t.filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(a));r.get(e.iso2).forEach(e=>e.style.display=n?"":"none"),n&&o.push(e)}),0===o.length?t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}):1===o.length&&"Enter"===n&&Q(r.get(o[0].iso2)[0])}),J.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),z.matches(":focus")?z.blur():z.focus()}));const ee=new A.a({onInput:e=>{m.a.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===q.value||b&&t&&n&&(b===t||W.country_code===n.country_code)||(Object(S.a)(z,t?Object(g.i18n)(t.default_name):a),b=t,W=n),t||ee.value.length-1>1?R.style.visibility="":R.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!R.style.visibility&&"Enter"===e.key)return ae()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;c.default.pushToState("keepSigned",e),E.a.toggleStorage(e),_.a.toggleStorage(e),i.a.toggleStorage(e),T.a.toggleStorage(e)}),c.default.getState().then(e=>{c.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),R=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),R.style.visibility="hidden";const ae=e=>{e&&Object(w.a)(e);const t=Object(x.a)([R,H],!0);Object(S.a)(R,Object(g.i18n)("PleaseWait")),Object(a.f)(R);let o=ee.value;i.a.invokeApi("auth.sendCode",{phone_number:o,api_id:f.a.id,api_hash:f.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(23).then(n.bind(null,22)).then(t=>t.default.mount(Object.assign(e,{phone_number:o})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(S.a)(ee.label,Object(g.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(S.a)(R,Object(g.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),R.innerText=e.type}})};Object(k.b)(R,ae),H=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});H.addEventListener("click",()=>{O.default.mount()}),X.append(q.container,ee.container,ne.label,R,H);const oe=document.createElement("h4");oe.classList.add("text-center"),Object(g._i18n)(oe,"Login.Title");const ce=document.createElement("div");ce.classList.add("subtitle","text-center"),Object(g._i18n)(ce,"Login.StartText"),U.pageEl.querySelector(".container").append(oe,ce,X);h.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(j.a)(X),i.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=I.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.default.getLangPack(n.lang_code).then(()=>{Object(P.a)(te,"input")});const a=new Set([1,2,3,4,5]),o=[e.this_dc];let c;return e.nearest_dc!==e.this_dc&&(c=i.a.getNetworker(e.nearest_dc).then(()=>{o.push(e.nearest_dc)})),(c||Promise.resolve()).then(()=>{o.forEach(e=>{a.delete(e)});const e=[...a],t=()=>B(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield T.a.get(a))return t();setTimeout(()=>{i.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{q.value.length||ee.value.length||Q(r.get(e.country)[0])})},()=>{R&&(Object(S.a)(R,Object(g.i18n)("Login.Next")),Object(b.ripple)(R,void 0,void 0,!0),R.removeAttribute("disabled")),H&&H.removeAttribute("disabled"),c.default.pushToState("authState",{_:"authStateSignIn"})});t.default=U},92:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(16);const o=new Map;let c=0;const i=(e,t,n="")=>{n=t.country_code+n,c=Math.max(c,n.length),o.set(n,{country:e,code:t})};function s(e){e=e||"",o.size||a.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{i(e,t,n)}):i(e,t)})});let t,n=e.replace(/\D/g,""),s=n.slice(0,c);for(let e=s.length-1;e>=0&&(t=o.get(s.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const r=t.country,l=t.code.patterns||[],d=n.slice(t.code.country_code.length);let u="",p=0,h="";for(let e=l.length-1;e>=0;--e){u=l[e];const t=u.replace(/ /g,"");let n=0;for(let e=0,a=Math.min(d.length,t.length);ep&&(p=n,h=u)}u=h||u,u=u.replace(/\d/g,"X"),u=t.code.country_code+" "+u,u.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let f=u&&u.length>n.length?u.slice(n.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:n,country:r,code:t.code,leftPattern:f}}}}]); +//# sourceMappingURL=25.dcbbd29bad085f151e64.chunk.js.map \ No newline at end of file diff --git a/public/25.dcbbd29bad085f151e64.chunk.js.map b/public/25.dcbbd29bad085f151e64.chunk.js.map new file mode 100644 index 00000000..2e307249 --- /dev/null +++ b/public/25.dcbbd29bad085f151e64.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/pages/pageSignIn.ts","webpack:///./src/helpers/formatPhoneNumber.ts"],"names":["btnQr","btnNext","page","setCountries","countries","countriesList","filter","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","addEventListener","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","document","createElement","classList","add","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","dataset","defaultName","span","innerText","country_code","push","set","e","button","target","selectCountryByTarget","childNodes","phoneCode","querySelector","replace","find","_countryCode","telInputField","value","lastValue","hidePicker","setTimeout","telEl","focus","hideTimeout","get","style","display","clearTimeout","undefined","remove","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","window","key","ctrlKey","_value","toLowerCase","matches","names","Boolean","abbr","split","word","test","map","join","length","good","str","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","loadLottieWorkers","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","then","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","prefixes","maxPrefixLength","setPrefix","prefix","Math","max","formatPhoneNumber","originalStr","size","prefixCountry","slice","i","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","symbol","idx"],"mappings":"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","file":"25.dcbbd29bad085f151e64.chunk.js","sourcesContent":["/*\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/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\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 findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\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 { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet 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 const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\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 let 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 replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\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 appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.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 let phone_number = telInputField.value;\r\n 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 let 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 let tryAgain = () => {\r\n 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 simulateEvent(telEl, 'input');\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;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(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 => {\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 apiManager.getNetworker(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 selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\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 appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\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 { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/26.d44ef4011bb3c3f8b0f7.chunk.js b/public/26.d44ef4011bb3c3f8b0f7.chunk.js new file mode 100644 index 00000000..053392f4 --- /dev/null +++ b/public/26.d44ef4011bb3c3f8b0f7.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[26],{25:function(e,t,a){"use strict";a.r(t);var n=a(34),i=a(36),s=a(35),r=a(136),c=a(17),l=a(16),u=a(32),o=a(31),p=a(98),d=a(69),m=a(8),h=a(33);let b=null;const v=new d.a("page-signUp",!0,()=>a.e(5).then(a.bind(null,60)).then(e=>{const t=new p.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const c=document.createElement("canvas");c.id="canvas-avatar",c.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(c,d);const v=e.default;let g;t.imageDiv.addEventListener("click",()=>{(new r.a).open(c,e=>{g=e})});const L=e=>{const a=f.value||"",n=w.value||"",i=a||n?(a+" "+n).trim():"";i?Object(h.a)(t.title,o.b.wrapEmojiText(i)):Object(h.a)(t.title,Object(l.i18n)("YourName"))};const f=new i.b({label:"FirstName",maxLength:70}),w=new i.b({label:"LastName",maxLength:64}),y=Object(n.a)("btn-primary btn-color-primary"),E=new l.default.IntlElement({key:"StartMessaging"});return y.append(E.element),t.inputWrapper.append(f.container,w.container,y),f.input.addEventListener("input",L),w.input.addEventListener("input",L),y.addEventListener("click",(function(e){if(f.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!f.value.length)return f.input.classList.add("error"),!1;this.disabled=!0;const t=f.value.trim(),n=w.value.trim(),i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=Object(s.f)(this);u.a.invokeApi("auth.signUp",i).then(e=>{switch(e._){case"auth.authorization":u.a.setUser(e.user),new Promise((e,t)=>{if(!g)return e();g().then(a=>{v.uploadProfilePhoto(a).then(e,t)},t)}).finally(()=>{a.e(4).then(a.bind(null,19)).then(e=>{e.default.mount()})});break;default:E.update({key:e._}),this.removeAttribute("disabled"),r.remove()}}).catch(e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})})})),Object(m.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{b=e,c.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=v},98:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(16);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(n.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); +//# sourceMappingURL=26.d44ef4011bb3c3f8b0f7.chunk.js.map \ No newline at end of file diff --git a/public/26.d44ef4011bb3c3f8b0f7.chunk.js.map b/public/26.d44ef4011bb3c3f8b0f7.chunk.js.map new file mode 100644 index 00000000..2902303b --- /dev/null +++ b/public/26.d44ef4011bb3c3f8b0f7.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/loginPage.ts"],"names":["authCode","page","then","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","classList","add","title","avatarPreview","document","createElement","id","addIco","append","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","contains","length","this","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","_","setUser","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode","pushToState","LoginPage","options","body","querySelector","subtitle"],"mappings":"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","file":"26.d44ef4011bb3c3f8b0f7.chunk.js","sourcesContent":["/*\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 { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/27.05d6a53c8e06b785e86e.chunk.js b/public/27.05d6a53c8e06b785e86e.chunk.js new file mode 100644 index 00000000..074c1942 --- /dev/null +++ b/public/27.05d6a53c8e06b785e86e.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[27],{197:function(X,e,o){"use strict";o.r(e);e.default={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); +//# sourceMappingURL=27.05d6a53c8e06b785e86e.chunk.js.map \ No newline at end of file diff --git a/public/27.05d6a53c8e06b785e86e.chunk.js.map b/public/27.05d6a53c8e06b785e86e.chunk.js.map new file mode 100644 index 00000000..7a202c36 --- /dev/null +++ b/public/27.05d6a53c8e06b785e86e.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/countries.ts"],"names":["_","countries","hash"],"mappings":"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","file":"27.05d6a53c8e06b785e86e.chunk.js","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 type { HelpCountriesList } from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"X XXXXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d'Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\"}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"country_code\":\"961\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"country_code\":\"60\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\",\"97 XXXX XXXXX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"country_code\":\"378\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"country_code\":\"685\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find(c => c.name === 'United States'),\n '44': Countries.find(c => c.name === 'United Kingdom'),\n '61': Countries.find(c => c.name === 'Australia'),\n '64': Countries.find(c => c.name === 'New Zealand'),\n '246': Countries.find(c => c.name === 'Diego Garcia'),\n '255': Countries.find(c => c.name === 'Tanzania'),\n '262': Countries.find(c => c.name === 'Reunion'),\n '500': Countries.find(c => c.name === 'Falkland Islands'),\n '590': Countries.find(c => c.name === 'Guadeloupe'),\n '672': Countries.find(c => c.name === 'Norfolk Island'),\n '1 268': Countries.find(c => c.name === 'Antigua & Barbuda'),\n}; */\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/272.eb4fc8aabeb8df00f2fb.chunk.js b/public/272.eb4fc8aabeb8df00f2fb.chunk.js deleted file mode 100644 index ab08d6d8..00000000 --- a/public/272.eb4fc8aabeb8df00f2fb.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[272],{6272:(e,t,c)=>{c.d(t,{u:()=>s});var o=c(4727);const n=new Map;let r=0;const l=(e,t,c="")=>{c=t.country_code+c,r=Math.max(r,c.length),n.set(c,{country:e,code:t})};function s(e){e=e||"",n.size||o.default.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((c=>{l(e,t,c)})):l(e,t)}))}));let t,c=e.replace(/\D/g,""),s=c.slice(0,r);for(let e=s.length-1;e>=0&&(t=n.get(s.slice(0,e+1)),!t);--e);if(!t)return{formatted:c,country:void 0,code:void 0,leftPattern:""};const a=t.country,h=t.code.patterns||[],i=c.slice(t.code.country_code.length);let d="",u=0,f="";for(let e=h.length-1;e>=0;--e){d=h[e];const t=d.replace(/ /g,"");let c=0;for(let e=0,o=Math.min(i.length,t.length);eu&&(u=c,f=d)}d=f||d,d=d.replace(/\d/g,"X"),d=t.code.country_code+" "+d,d.split("").forEach(((e,t)=>{" "===e&&" "!==c[t]&&c.length>t&&(c=c.slice(0,t)+" "+c.slice(t))}));let g=d&&d.length>c.length?d.slice(c.length):"";return g&&(g=g.replace(/X/g,"‒")),{formatted:c,country:a,code:t.code,leftPattern:g}}}}]); -//# sourceMappingURL=272.eb4fc8aabeb8df00f2fb.chunk.js.map \ No newline at end of file diff --git a/public/272.eb4fc8aabeb8df00f2fb.chunk.js.map b/public/272.eb4fc8aabeb8df00f2fb.chunk.js.map deleted file mode 100644 index 543d28f7..00000000 --- a/public/272.eb4fc8aabeb8df00f2fb.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"272.eb4fc8aabeb8df00f2fb.chunk.js","mappings":"0HAWA,MAAMA,EAAuC,IAAIC,IACjD,IAAIC,EAAkB,EACtB,MAAMC,EAAY,CAACC,EAAsBC,EAAuBC,EAAiB,MAC/EA,EAASD,EAAKE,aAAeD,EAI7BJ,EAAkBM,KAAKC,IAAIP,EAAiBI,EAAOI,QACnDV,EAASW,IAAIL,EAAQ,CAACF,QAAAA,EAASC,KAAAA,KAG1B,SAASO,EAAkBC,GAMhCA,EAAcA,GAAe,GAEzBb,EAASc,MACX,iCAA2BV,IACzBA,EAAQW,cAAcC,SAAQX,IACzBA,EAAKL,SACNK,EAAKL,SAASgB,SAAQV,IACpBH,EAAUC,EAASC,EAAMC,MAG3BH,EAAUC,EAASC,SAO3B,IAYIY,EAZAC,EAAML,EAAYM,QAAQ,MAAO,IACjCC,EAAYF,EAAIG,MAAM,EAAGnB,GAY7B,IAAI,IAAIoB,EAAIF,EAAUV,OAAS,EAAGY,GAAK,IACrCL,EAAgBjB,EAASuB,IAAIH,EAAUC,MAAM,EAAGC,EAAI,KACjDL,KAFuCK,GAO5C,IAAIL,EACF,MAAO,CACLO,UAAWN,EACXd,aAASqB,EACTpB,UAAMoB,EACNC,YAAa,IAKjB,MAAMtB,EAAUa,EAAcb,QAExBuB,EAAWV,EAAcZ,KAAKsB,UAAY,GAC1CC,EAAmBV,EAAIG,MAAMJ,EAAcZ,KAAKE,aAAaG,QACnE,IAAImB,EAAU,GAAIC,EAA4B,EAAGC,EAAqB,GACtE,IAAI,IAAIT,EAAIK,EAASjB,OAAS,EAAGY,GAAK,IAAKA,EAAG,CAC5CO,EAAUF,EAASL,GAEnB,MAAMU,EAAWH,EAAQV,QAAQ,KAAM,IACvC,IAAIc,EAAiB,EACrB,IAAI,IAAIC,EAAI,EAAGxB,EAASF,KAAK2B,IAAIP,EAAiBlB,OAAQsB,EAAStB,QAASwB,EAAIxB,IAAUwB,EAAG,CAC3F,GAAGN,EAAiBM,KAAOF,EAASE,IAAsB,MAAhBF,EAASE,GAE5C,CACLD,EAAiB,EACjB,QAHEA,EAOHA,EAAiBH,IAClBA,EAA4BG,EAC5BF,EAAqBF,GAIzBA,EAAUE,GAAsBF,EAChCA,EAAUA,EAAQV,QAAQ,MAAO,KAEjCU,EAAUZ,EAAcZ,KAAKE,aAAe,IAAMsB,EAElDA,EAAQO,MAAM,IAAIpB,SAAQ,CAACqB,EAAQC,KACnB,MAAXD,GAA+B,MAAbnB,EAAIoB,IAAgBpB,EAAIR,OAAS4B,IACpDpB,EAAMA,EAAIG,MAAM,EAAGiB,GAAO,IAAMpB,EAAIG,MAAMiB,OAQ9C,IAAIZ,EAAcG,GAAWA,EAAQnB,OAASQ,EAAIR,OAASmB,EAAQR,MAAMH,EAAIR,QAAU,GAQvF,OAPGgB,IAGDA,EAAcA,EAAYP,QAAQ,KAAM,MAInC,CAACK,UAAWN,EAAKd,QAAAA,EAASC,KAAMY,EAAcZ,KAAMqB,YAAAA","sources":["webpack://tweb/./src/helpers/formatPhoneNumber.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 { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n"],"names":["prefixes","Map","maxPrefixLength","setPrefix","country","code","prefix","country_code","Math","max","length","set","formatPhoneNumber","originalStr","size","country_codes","forEach","prefixCountry","str","replace","phoneCode","slice","i","get","formatted","undefined","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx"],"sourceRoot":""} \ No newline at end of file diff --git a/public/28.6667bb68e660e626d453.chunk.js b/public/28.6667bb68e660e626d453.chunk.js new file mode 100644 index 00000000..c7a751e4 --- /dev/null +++ b/public/28.6667bb68e660e626d453.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[28],{28:function(t,r,o){"use strict";o.r(r),String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(t){return(+this).toPeerId(t)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(t){return void 0===t?this:t?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0}}}]); +//# sourceMappingURL=28.6667bb68e660e626d453.chunk.js.map \ No newline at end of file diff --git a/public/28.6667bb68e660e626d453.chunk.js.map b/public/28.6667bb68e660e626d453.chunk.js.map new file mode 100644 index 00000000..9ddec298 --- /dev/null +++ b/public/28.6667bb68e660e626d453.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/peerIdPolyfill.ts"],"names":["String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","Math","abs","undefined"],"mappings":"sFAAA,OAMAA,OAAOC,UAAUC,SAAW,WAC1B,QAASC,MAAMD,YAGjBF,OAAOC,UAAUG,SAAW,WAC1B,QAASD,MAAMC,YAGjBJ,OAAOC,UAAUI,SAAW,SAASC,GACnC,QAASH,MAAME,SAASC,IAG1BN,OAAOC,UAAUM,SAAW,WAC1B,MAAO,SAASC,KAAKL,KAAKM,aAG5BC,OAAOT,UAAUC,SAAW,WAC1B,OAAOC,MAGTO,OAAOT,UAAUG,SAAW,WAC1B,OAAOO,KAAKC,IAAIT,OAGlBO,OAAOT,UAAUI,SAAW,SAASC,GACnC,YAAkBO,IAAXP,EAAuBH,KAAkBG,GAAUK,KAAKC,IAAIT,MAAkBA,MAGvFO,OAAOT,UAAUM,SAAW,WAC1B,OAAO","file":"28.6667bb68e660e626d453.chunk.js","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\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n }\n}\n\nexport {};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/29.87d0b9d91aaae6885e5b.chunk.js b/public/29.87d0b9d91aaae6885e5b.chunk.js new file mode 100644 index 00000000..c5d4a2a0 --- /dev/null +++ b/public/29.87d0b9d91aaae6885e5b.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[29],{198:function(e,a,s){"use strict";s.r(a);function c(e,a){switch(e){case 27764:if(a%10==1&&(a%100<11||a%100>19))return"one";if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return"few";break;case 27766:if(0==a)return"zero";if(a%10==1&&a%100!=11)return"one";break;case 25465:if(2==a)return"two";if(3==a)return"few";if(0==a)return"zero";if(1==a)return"one";if(6==a)return"many";break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return"many";break;case 7041896:if(0==a)return"zero";if(1==a)return"one";break;case 7563369:if(a>=2&&a<=10)return"few";if(a>=0&&a<=1)return"one";break;case 26725:if(2==a)return"two";if(1==a)return"one";if(0!=a&&a%10==0)return"many";break;case 25459:case 29547:if(1==a)return"one";if(a>=2&&a<=4)return"few";break;case 25202:if(0!=a&&a%1e6==0)return"many";if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return"one";if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return"two";if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return"few";break;case 29548:if(a%100==2)return"two";if(a%100==1)return"one";if(a%100>=3&&a%100<=4)return"few";break;case 7102823:if(0==a)return"zero";if(a>=0&&a<=2&&0!=a&&2!=a)return"one";break;case 28780:if(1==a)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return"many";break;case 26468:if(2==a||12==a)return"two";if(1==a||11==a)return"one";if(a>=3&&a<=10||a>=13&&a<=19)return"few";break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return"one";break;case 28011:if(a%10==1&&11!=a)return"one";break;case 28020:if(1==a)return"one";if(a%100>=11&&a%100<=19)return"many";if(0==a||a%100>=2&&a%100<=10)return"few";break;case 28015:case 29295:if(1==a)return"one";if(0==a||1!=a&&a%100>=1&&a%100<=19)return"few";break;case 26465:if(2==a)return"two";if(1==a)return"one";if(a>=3&&a<=6)return"few";if(a>=7&&a<=10)return"many";break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return"one";break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return"two";if(1==a)return"one";break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return"one";break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return"one";break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return"one";break;case 24946:if(2==a)return"two";if(1==a)return"one";if(0==a)return"zero";if(a%100>=3&&a%100<=10)return"few";if(a%100>=11&&a%100<=99)return"many"}return"other"}const r={PluralRules:class{constructor(e){this.select=c.bind(null,function(e){let a=0;for(let s=0;s 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set2\r\n case 0x6c76: // lv\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set3\r\n case 0x6379: // cy\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set5\r\n case 0x6b7368: // ksh\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set6\r\n case 0x736869: // shi\r\n if ((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if ((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set7\r\n case 0x6865: // he\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set9\r\n case 0x6272: // br\r\n if ((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if (((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if (((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if ((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set10\r\n case 0x736c: // sl\r\n if ((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if ((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set11\r\n case 0x6c6167: // lag\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set12\r\n case 0x706c: // pl\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set13\r\n case 0x6764: // gd\r\n if ((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if ((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set14\r\n case 0x6776: // gv\r\n if ((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set15\r\n case 0x6d6b: // mk\r\n if (((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set16\r\n case 0x6d74: // mt\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if ((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set18\r\n case 0x6761: // ga\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if ((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if (((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if ((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set22\r\n case 0x747a6d: // tzm\r\n if (((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set24\r\n case 0x6172: // ar\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if (((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n \r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/3.793e215e3d9630206e52.chunk.js b/public/3.793e215e3d9630206e52.chunk.js new file mode 100644 index 00000000..e2a2d0bf --- /dev/null +++ b/public/3.793e215e3d9630206e52.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[3],{120:function(t,e,n){"use strict";var i=n(45),s=n(52),o=n(30),a=n(90);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(t,e){let n=this.promises[t];return n||(this.scheduleFlush(),n=this.promises[t]=Object(s.a)()),void 0!==e&&n.then(()=>e()),n}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const n=Object(a.a)(t),i=n?this.mutate():Promise.resolve();return void 0!==e&&(n?e():i.then(()=>e())),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),e.a=r},170:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(0);function s(t){return i.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},18:function(t,e,n){"use strict";n.r(e),n.d(e,"ripple",(function(){return d}));var i=n(6),s=n(120),o=n(1),a=n(15),r=n(96);let c=0;function d(t,e=(()=>Promise.resolve()),n=null,d=!1,l=t){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;t.classList.contains("rp-square")&&u.classList.add("is-square"),t[d?"prepend":"append"](u);const m=(t,i)=>{const a=Date.now(),r=document.createElement("div"),d=c++,l=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let t=Date.now()-a;const e=()=>{s.a.mutate(()=>{r.remove()}),n&&n(d)};if(tr.classList.add("hiding"),Math.max(n-l/2,0)),setTimeout(e,n)}else r.classList.add("hiding"),setTimeout(e,l/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,v=!1},e&&e(d),window.requestAnimationFrame(()=>{const e=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=t-e.left,s=i-e.top,o=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(n-e.width/2)+e.width/2,2)),a=n-o/2,c=s-o/2;r.style.width=r.style.height=o+"px",r.style.left=a+"px",r.style.top=c+"px",u.append(r)})},p=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(i.a)(e.target,"c-ripple")!==u)&&(l===t||!Object(r.a)(e.target,l));let v=!1;if(o.IS_TOUCH_SUPPORTED){let t=()=>{h&&h()};l.addEventListener("touchstart",e=>{if(!a.default.settings.animationsEnabled)return;if(e.touches.length>1||v||p(e))return;v=!0;let{clientX:n,clientY:i}=e.touches[0];m(n,i),l.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",e=>{e.cancelBubble=!0,e.stopPropagation(),t(),l.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else l.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===l.dataset.ripple||p(t))return;if(v)return void(v=!1);let{clientX:e,clientY:n}=t;m(e,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},29:function(t,e,n){"use strict";n.d(e,"a",(function(){return o})),n.d(e,"b",(function(){return a})),n.d(e,"c",(function(){return r})),n.d(e,"d",(function(){return c}));var i=n(1),s=n(81);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(t,e,n={}){const i=n.listenerSetter?n.listenerSetter.add(t):t.addEventListener.bind(t);n.touchMouseDown=!0,i(o,e,n)}function r(t,e,n){t.removeEventListener(o,e,n)}function c(t){Object(s.a)(t,o)}},34:function(t,e,n){"use strict";var i=n(16),s=n(18);e.a=(t,e={})=>{const n=document.createElement(e.asDiv?"div":"button");return n.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),e.onlyMobile&&n.classList.add("only-handhelds"),e.disabled&&n.setAttribute("disabled","true"),e.text&&n.append(Object(i.i18n)(e.text)),n}},35:function(t,e,n){"use strict";n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return h})),n.d(e,"c",(function(){return v})),n.d(e,"d",(function(){return w})),n.d(e,"e",(function(){return E})),n.d(e,"b",(function(){return S})),n.d(e,"a",(function(){return I}));var i=n(30),s=n(5),o=n(29),a=n(38),r=n(1),c=n(0),d=n(15),l=n(70);function u(t,e=!1){const n='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=n,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",n),t.lastElementChild}function h(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,u(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}i.a.putPreloader=u;let m=t=>{let e=g.getBoundingClientRect(),{clientX:n,clientY:i}=t,s=n>=e.right?n-e.right:e.left-n,o=i>=e.bottom?i-e.bottom:e.top-i;(s>=100||o>=100)&&v()};const p=t=>{v()},v=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,d.default.dispatchEvent("context_menu_toggle",!1)),f&&(f(),f=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",m),window.removeEventListener("contextmenu",p)),document.removeEventListener(o.a,p),c.IS_MOBILE_SAFARI||l.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&v()});let g=null,f=null,b=null;function w(t,e){v(),c.IS_MOBILE_SAFARI||l.a.pushItem({type:"menu",onPop:t=>{v()}}),g=t,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(o.a,t=>{Object(s.a)(t),p()})),g.parentElement.insertBefore(b,g),f=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",m),window.addEventListener("contextmenu",p,{once:!0})),document.addEventListener(o.a,p),d.default.dispatchEvent("context_menu_toggle",!0)}function E({pageX:t,pageY:e},n,i,s){const o=Array.from(n.children).find(t=>t.classList.contains("btn-menu-item")&&!t.classList.contains("hide"))||n;let{scrollWidth:r}=o,{scrollHeight:c}=n;const d=document.body.getBoundingClientRect(),l=d.width,u=d.height;let h=8,m=8,p=8,v=8;s&&(s.top&&(h+=s.top),s.right&&(m+=s.right),s.bottom&&(p+=s.bottom),s.left&&(v+=s.left)),i=a.b.isMobile?"right":"left";let g="top";const f=u-c-p,b=l-r-m,w=v,E={x:{left:t,right:Math.min(b,t-r)},intermediateX:"right"===i?w:b,y:{top:e,bottom:e-c},intermediateY:f},L={left:E.x.left+r+m<=l,right:E.x.right>=v},y={top:E.y.top+c+p<=u,bottom:E.y.bottom-p>=p};{let t;t=L[i]?E.x[i]:(i="center",E.intermediateX),n.style.left=t+"px"}{let t;t=y[g]?E.y[g]:(g="center",E.intermediateY),n.style.top=t+"px"}return n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===g?g:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:r,height:c}}let L=!1,y=0;function S(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,L=!1},400),L=!0}function I(t,e,n){const i=n?n.add(t):t.addEventListener.bind(t),o=n?n.removeManual.bind(n,t):t.removeEventListener.bind(t);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{L?r():(e(o.touches[0]),r(),g&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{e(n),g&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},70:function(t,e,n){"use strict";var i=n(30),s=n(0),o=n(41),a=n(8),r=n(5),c=n(170),d=n(59);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!t,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(a.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const n=this.navigations[e];if(n.type===t)return{item:n,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return void this.backByItem(e.item,e.index)}history.back()}backByItem(t,e=this.navigations.indexOf(t)){this.manual=!0,this.navigations.splice(e,1),this.handleItem(t)}onItemAdded(t){this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushItem(t){this.navigations.push(t),this.onItemAdded(t)}unshiftItem(t){this.navigations.unshift(t),this.onItemAdded(t)}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){t&&Object(d.a)(this.navigations,t)}removeByType(t,e=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===t&&(this.navigations.splice(n,1),e))break}}};i.a.appNavigationController=l,e.a=l},81:function(t,e,n){"use strict";function i(t,e){const n=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(n)}n.d(e,"a",(function(){return i}))}}]); +//# sourceMappingURL=3.793e215e3d9630206e52.chunk.js.map \ No newline at end of file diff --git a/public/3.793e215e3d9630206e52.chunk.js.map b/public/3.793e215e3d9630206e52.chunk.js.map new file mode 100644 index 00000000..6917cc8a --- /dev/null +++ b/public/3.793e215e3d9630206e52.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/components/ripple.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts"],"names":["sequentialDom","promises","raf","bind","scheduled","kind","callback","promise","this","scheduleFlush","undefined","then","do","element","isConnected","mutate","Promise","resolve","read","write","isSwipingBackSafari","e","TouchEvent","touches","clientX","rippleClickId","ripple","elem","onEnd","prepend","attachListenerTo","querySelector","classList","add","r","document","createElement","handler","contains","drawRipple","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","settings","animationsEnabled","length","once","cancelBubble","stopPropagation","passive","button","dataset","CLICK_EVENT_NAME","attachClickEvent","options","listenerSetter","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","setAttribute","text","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","parentElement","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","type","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","additionalPadding","getScrollWidthFromElement","Array","from","children","find","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","paddingTop","paddingRight","paddingBottom","paddingLeft","isMobile","verticalSide","maxTop","maxLeft","minLeft","sides","min","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","appNavigationController","navigations","id","manual","log","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","state","pushState","item","pop","handleItem","key","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","noHistory","push","onItemAdded","unshift","origin","pathname","single","simulateEvent","name","event","Event","bubbles","cancelable"],"mappings":"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","file":"3.793e215e3d9630206e52.chunk.js","sourcesContent":["/*\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 { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\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 { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\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 findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\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 ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\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 { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nexport type MenuPositionPadding = {\r\n top?: number, \r\n right?: number, \r\n bottom?: number, \r\n left?: number\r\n};\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_BOTTOM = PADDING_TOP;\r\nconst PADDING_LEFT = 8;\r\nconst PADDING_RIGHT = PADDING_LEFT;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find(element => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\r\n\r\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\r\n let {scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\r\n if(additionalPadding) {\r\n if(additionalPadding.top) paddingTop += additionalPadding.top;\r\n if(additionalPadding.right) paddingRight += additionalPadding.right;\r\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\r\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\r\n }\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const maxTop = windowHeight - menuHeight - paddingBottom;\r\n const maxLeft = windowWidth - menuWidth - paddingRight;\r\n const minTop = paddingTop;\r\n const minLeft = paddingLeft;\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: Math.min(maxLeft, pageX - menuWidth)\r\n },\r\n intermediateX: side === 'right' ? minLeft : maxLeft,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\r\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\r\n intermediateY: maxTop,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\r\n right: sides.x.right >= paddingLeft\r\n },\r\n y: {\r\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\r\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n\r\n return {\r\n width: menuWidth,\r\n height: menuHeight\r\n };\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search' | 'filters',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/30.1eb7b53a0652ce7549e5.chunk.js b/public/30.1eb7b53a0652ce7549e5.chunk.js new file mode 100644 index 00000000..d335b169 --- /dev/null +++ b/public/30.1eb7b53a0652ce7549e5.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[30,4],{19:function(e,t,a){"use strict";a.r(t);var n=a(8),l=a(9),u=a(17),s=a(16),c=a(15);const d=new(a(69).a)("page-chats",!1,()=>(u.default.pushToState("authState",{_:"authStateSignedIn"}),c.default.dispatchEvent("im_mount"),s.default.requestedServerLanguage||s.default.getCacheLangPack().then(e=>{e.local&&s.default.getLangPack(e.lang_code)}),d.pageEl.style.display="",Object(n.a)(),Promise.all([Object(l.a)(),Promise.all([a.e(3),a.e(5),a.e(6),a.e(7),a.e(18)]).then(a.bind(null,185))]).then(()=>{setTimeout(()=>{document.getElementById("auth-pages").remove()},1e3)})));t.default=d}}]); +//# sourceMappingURL=30.1eb7b53a0652ce7549e5.chunk.js.map \ No newline at end of file diff --git a/public/30.1eb7b53a0652ce7549e5.chunk.js.map b/public/30.1eb7b53a0652ce7549e5.chunk.js.map new file mode 100644 index 00000000..aea58b8d --- /dev/null +++ b/public/30.1eb7b53a0652ce7549e5.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","dispatchEvent","requestedServerLanguage","getCacheLangPack","then","langPack","local","getLangPack","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"mappings":"wFAAA,iDA0DA,MAAMA,EAAO,IA1Db,MA0DiB,GAAK,cAAc,EA7CjB,KAEjB,UAAgBC,YAAY,YAAa,CAACC,EAAG,sBAI7C,UAAUC,cAAc,YAEpB,UAAKC,yBACP,UAAKC,mBAAmBC,KAAKC,IACxBA,EAASC,OACV,UAAKC,YAAYF,EAASG,aAKhCV,EAAKW,OAAOC,MAAMC,QAAU,GAiB5B,cAEOC,QAAQC,IAAI,CACjB,cACA,4EACCT,KAAK,KACNU,WAAW,KACTC,SAASC,eAAe,cAAcC,UACrC,SAKQ","file":"30.1eb7b53a0652ce7549e5.chunk.js","sourcesContent":["/*\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 blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n rootScope.dispatchEvent('im_mount');\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then(langPack => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n //alert('pageIm!');\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/301.9a1ccf812953c4fbc155.chunk.js b/public/301.9a1ccf812953c4fbc155.chunk.js deleted file mode 100644 index 501d5c4b..00000000 --- a/public/301.9a1ccf812953c4fbc155.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[301],{9301:(e,n,o)=>{o.r(n),o.d(n,{default:()=>i});const i={"Login.Title":"Sign in to Telegram","Login.CountrySelectorLabel":"Country","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Link Desktop Device**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); -//# sourceMappingURL=301.9a1ccf812953c4fbc155.chunk.js.map \ No newline at end of file diff --git a/public/301.9a1ccf812953c4fbc155.chunk.js.map b/public/301.9a1ccf812953c4fbc155.chunk.js.map deleted file mode 100644 index 03571614..00000000 --- a/public/301.9a1ccf812953c4fbc155.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"301.9a1ccf812953c4fbc155.chunk.js","mappings":"yHAAA,MAuCA,EAvCa,CACX,cAAe,sBACf,6BAA8B,UAC9B,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAGlB,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","sources":["webpack://tweb/./src/langSign.ts"],"sourcesContent":["const lang = {\r\n \"Login.Title\": \"Sign in to Telegram\",\r\n \"Login.CountrySelectorLabel\": \"Country\",\r\n \"Login.PhoneLabel\": \"Phone Number\",\r\n \"Login.PhoneLabelInvalid\": \"Phone Number Invalid\",\r\n \"Login.KeepSigned\": \"Keep me signed in\",\r\n \"Login.StartText\": \"Please confirm your country and\\nenter your phone number.\",\r\n \"Login.Code.SentSms\": \"We have sent you an SMS\\nwith the code.\",\r\n \"Login.Code.SentInApp\": \"We have sent you a message in Telegram\\nwith the code.\",\r\n \"Login.Code.SentCall\": \"We will call you and voice\\nthe code.\",\r\n \"Login.Code.SentUnknown\": \"Please check everything\\nfor a code (type: %s)\",\r\n \"Login.Password.Title\": \"Enter Your Password\",\r\n \"Login.Password.Subtitle\": \"Your account is protected with\\nan additional password\",\r\n \"Login.Register.Subtitle\": \"Enter your name and add\\na profile picture\",\r\n \"PleaseWait\": \"Please wait...\",\r\n\r\n // * android\r\n \"Code\": \"Code\",\r\n \"LoginPassword\": \"Password\",\r\n \"YourName\": \"Your Name\",\r\n \"FirstName\": \"First name (required)\",\r\n \"LastName\": \"Last name (optional)\",\r\n \"StartMessaging\": \"Start Messaging\",\r\n\r\n // * macos\r\n \"Contacts.PhoneNumber.Placeholder\": \"Phone Number\",\r\n \"Login.Next\": \"Next\",\r\n \"Login.ContinueOnLanguage\": \"Continue in English\",\r\n \"Login.QR.Title\": \"Log in to Telegram by QR Code\",\r\n \"Login.QR.Help1\": \"Open Telegram on your phone\",\r\n \"Login.QR.Help2\": \"Go to **Settings** > **Devices** > **Link Desktop Device**\",\r\n \"Login.QR.Help3\": \"Point your phone at this screen to confirm login\",\r\n \"Login.QR.Cancel\": \"Log in by phone Number\",\r\n \"Login.QR.Login\": \"Log in by QR Code\",\r\n \"PHONE_CODE_INVALID\": \"Invalid code\",\r\n \"PHONE_CODE_EXPIRED\": \"Code expired\",\r\n \"PASSWORD_HASH_INVALID\": \"Incorrect password\"\r\n};\r\n\r\nexport default lang;\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/31.3cf7864ede12445b3dd9.chunk.js b/public/31.3cf7864ede12445b3dd9.chunk.js new file mode 100644 index 00000000..650cfcac --- /dev/null +++ b/public/31.3cf7864ede12445b3dd9.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[31],{200:function(t,r,o){"use strict";o.r(r),o.d(r,"default",(function(){return f}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],e=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function f(t,r,o,f,n,s,u){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(u)&&(u=1),(u|=0)>3&&(u=3),u<1&&(u=1);const i=t.getImageData(r,o,f,n),c=i.data;let p,N,b,m,d,g,h,k,l,w,D,I,J=f-1,j=n-1,q=s+1,v=[],x=[],y=[],z=a[s],A=e[s],B=[],C=[];for(;u-- >0;){for(I=D=0,d=0;dJ?J:g)<<2),p+=c[h++],N+=c[h++],b+=c[h++];for(m=0;m0?h<<2:0),k=I+B[m],l=I+C[m],p+=c[k++]-c[l++],N+=c[k++]-c[l++],b+=c[k++]-c[l++],D++;I+=f<<2}for(m=0;mj?0:f,p+=v[w],N+=x[w],b+=y[w];for(D=m<<2,d=0;d>>A,c[D+1]=N*z>>>A,c[D+2]=b*z>>>A,0==m&&(B[d]=((h=d+q)0?h*f:0),k=m+B[d],l=m+C[d],p+=v[k]-v[l],N+=x[k]-x[l],b+=y[k]-y[l],D+=f<<2}}t.putImageData(i,r,o)}}}]); +//# sourceMappingURL=31.3cf7864ede12445b3dd9.chunk.js.map \ No newline at end of file diff --git a/public/77.d9ff12acb3c5a5858e31.chunk.js.map b/public/31.3cf7864ede12445b3dd9.chunk.js.map similarity index 66% rename from public/77.d9ff12acb3c5a5858e31.chunk.js.map rename to public/31.3cf7864ede12445b3dd9.chunk.js.map index 0416e7b3..bb4e0d9a 100644 --- a/public/77.d9ff12acb3c5a5858e31.chunk.js.map +++ b/public/31.3cf7864ede12445b3dd9.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"77.d9ff12acb3c5a5858e31.chunk.js","mappings":"wHAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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","sources":["webpack://tweb/./src/vendor/fastBlur.js"],"sourcesContent":["/*\r\nSuperfast Blur - a fast Box Blur For Canvas\r\n\r\nVersion: 0.5\r\nAuthor: Mario Klingemann\r\nContact: mario@quasimondo.com\r\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\r\nTwitter: @quasimondo\r\n\r\nIn case you find this class useful - especially in commercial projects -\r\nI am not totally unhappy for a small donation to my PayPal account\r\nmario@quasimondo.de\r\n\r\nOr support me on flattr:\r\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\r\n\r\nCopyright (c) 2011 Mario Klingemann\r\n\r\nPermission is hereby granted, free of charge, to any person\r\nobtaining a copy of this software and associated documentation\r\nfiles (the \"Software\"), to deal in the Software without\r\nrestriction, including without limitation the rights to use,\r\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following\r\nconditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n// eslint-disable-next-line max-len\r\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\r\n// eslint-disable-next-line max-len\r\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\r\n\r\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\r\n if (Number.isNaN(radius) || radius < 1) return;\r\n\r\n radius |= 0;\r\n\r\n if (Number.isNaN(iterations)) iterations = 1;\r\n iterations |= 0;\r\n if (iterations > 3) iterations = 3;\r\n if (iterations < 1) iterations = 1;\r\n\r\n const imageData = context.getImageData(top_x, top_y, width, height);\r\n\r\n const pixels = imageData.data;\r\n\r\n let rsum;\r\n let gsum;\r\n let bsum;\r\n let x;\r\n let y;\r\n let i;\r\n let p;\r\n let p1;\r\n let p2;\r\n let yp;\r\n let yi;\r\n let yw;\r\n let wm = width - 1;\r\n let hm = height - 1;\r\n let rad1 = radius + 1;\r\n\r\n let r = [];\r\n let g = [];\r\n let b = [];\r\n\r\n let mul_sum = mul_table[radius];\r\n let shg_sum = shg_table[radius];\r\n\r\n let vmin = [];\r\n let vmax = [];\r\n\r\n while (iterations-- > 0) {\r\n yw = yi = 0;\r\n\r\n for (y = 0; y < height; y++) {\r\n rsum = pixels[yw] * rad1;\r\n gsum = pixels[yw + 1] * rad1;\r\n bsum = pixels[yw + 2] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n p = yw + (((i > wm ? wm : i)) << 2);\r\n rsum += pixels[p++];\r\n gsum += pixels[p++];\r\n bsum += pixels[p++];\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n r[yi] = rsum;\r\n g[yi] = gsum;\r\n b[yi] = bsum;\r\n\r\n if (y == 0) {\r\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\r\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\r\n }\r\n\r\n p1 = yw + vmin[x];\r\n p2 = yw + vmax[x];\r\n\r\n rsum += pixels[p1++] - pixels[p2++];\r\n gsum += pixels[p1++] - pixels[p2++];\r\n bsum += pixels[p1++] - pixels[p2++];\r\n\r\n yi++;\r\n }\r\n yw += (width << 2);\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n yp = x;\r\n rsum = r[yp] * rad1;\r\n gsum = g[yp] * rad1;\r\n bsum = b[yp] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n yp += (i > hm ? 0 : width);\r\n rsum += r[yp];\r\n gsum += g[yp];\r\n bsum += b[yp];\r\n }\r\n\r\n yi = x << 2;\r\n for (y = 0; y < height; y++) {\r\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\r\n\r\n if (x == 0) {\r\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\r\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\r\n }\r\n\r\n p1 = x + vmin[y];\r\n p2 = x + vmax[y];\r\n\r\n rsum += r[p1] - r[p2];\r\n gsum += g[p1] - g[p2];\r\n bsum += b[p1] - b[p2];\r\n\r\n yi += width << 2;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, top_x, top_y);\r\n}\r\n"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/vendor/fastBlur.js"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"mappings":"uFAAA,+CAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAA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","file":"31.3cf7864ede12445b3dd9.chunk.js","sourcesContent":["/*\r\nSuperfast Blur - a fast Box Blur For Canvas\r\n\r\nVersion: 0.5\r\nAuthor: Mario Klingemann\r\nContact: mario@quasimondo.com\r\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\r\nTwitter: @quasimondo\r\n\r\nIn case you find this class useful - especially in commercial projects -\r\nI am not totally unhappy for a small donation to my PayPal account\r\nmario@quasimondo.de\r\n\r\nOr support me on flattr:\r\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\r\n\r\nCopyright (c) 2011 Mario Klingemann\r\n\r\nPermission is hereby granted, free of charge, to any person\r\nobtaining a copy of this software and associated documentation\r\nfiles (the \"Software\"), to deal in the Software without\r\nrestriction, including without limitation the rights to use,\r\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following\r\nconditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n// eslint-disable-next-line max-len\r\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\r\n// eslint-disable-next-line max-len\r\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\r\n\r\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\r\n if (Number.isNaN(radius) || radius < 1) return;\r\n\r\n radius |= 0;\r\n\r\n if (Number.isNaN(iterations)) iterations = 1;\r\n iterations |= 0;\r\n if (iterations > 3) iterations = 3;\r\n if (iterations < 1) iterations = 1;\r\n\r\n const imageData = context.getImageData(top_x, top_y, width, height);\r\n\r\n const pixels = imageData.data;\r\n\r\n let rsum;\r\n let gsum;\r\n let bsum;\r\n let x;\r\n let y;\r\n let i;\r\n let p;\r\n let p1;\r\n let p2;\r\n let yp;\r\n let yi;\r\n let yw;\r\n let wm = width - 1;\r\n let hm = height - 1;\r\n let rad1 = radius + 1;\r\n\r\n let r = [];\r\n let g = [];\r\n let b = [];\r\n\r\n let mul_sum = mul_table[radius];\r\n let shg_sum = shg_table[radius];\r\n\r\n let vmin = [];\r\n let vmax = [];\r\n\r\n while (iterations-- > 0) {\r\n yw = yi = 0;\r\n\r\n for (y = 0; y < height; y++) {\r\n rsum = pixels[yw] * rad1;\r\n gsum = pixels[yw + 1] * rad1;\r\n bsum = pixels[yw + 2] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n p = yw + (((i > wm ? wm : i)) << 2);\r\n rsum += pixels[p++];\r\n gsum += pixels[p++];\r\n bsum += pixels[p++];\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n r[yi] = rsum;\r\n g[yi] = gsum;\r\n b[yi] = bsum;\r\n\r\n if (y == 0) {\r\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\r\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\r\n }\r\n\r\n p1 = yw + vmin[x];\r\n p2 = yw + vmax[x];\r\n\r\n rsum += pixels[p1++] - pixels[p2++];\r\n gsum += pixels[p1++] - pixels[p2++];\r\n bsum += pixels[p1++] - pixels[p2++];\r\n\r\n yi++;\r\n }\r\n yw += (width << 2);\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n yp = x;\r\n rsum = r[yp] * rad1;\r\n gsum = g[yp] * rad1;\r\n bsum = b[yp] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n yp += (i > hm ? 0 : width);\r\n rsum += r[yp];\r\n gsum += g[yp];\r\n bsum += b[yp];\r\n }\r\n\r\n yi = x << 2;\r\n for (y = 0; y < height; y++) {\r\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\r\n\r\n if (x == 0) {\r\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\r\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\r\n }\r\n\r\n p1 = x + vmin[y];\r\n p2 = x + vmax[y];\r\n\r\n rsum += r[p1] - r[p2];\r\n gsum += g[p1] - g[p2];\r\n bsum += b[p1] - b[p2];\r\n\r\n yi += width << 2;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, top_x, top_y);\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/325.977514b16cbc045987c7.chunk.js b/public/325.977514b16cbc045987c7.chunk.js deleted file mode 100644 index 6a40463a..00000000 --- a/public/325.977514b16cbc045987c7.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[325,272],{9807:(e,t,s)=>{s.d(t,{Z:()=>l});var i=s(4687),n=s(1405),o=s(4727),r=s(9750);class l{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const s=this.input=document.createElement("input");let l;if(s.classList.add("checkbox-field-input"),s.type="checkbox",e.name&&(s.id="input-"+e.name),e.checked&&(s.checked=!0),e.stateKey&&i.default.getState().then((t=>{const n=(0,r.Z)(t,e.stateKey);let o;o=e.stateValues?1===e.stateValues.indexOf(n):n,this.setValueSilently(o),s.addEventListener("change",(()=>{let t;t=e.stateValues?e.stateValues[s.checked?1:0]:s.checked,i.default.setByKey(e.stateKey,t)}))})),e.text?(l=this.span=document.createElement("span"),l.classList.add("checkbox-caption"),(0,o._i18n)(l,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(s),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("checkbox-box-check"),s.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),s.append(i);const n=document.createElement("div");n.classList.add("checkbox-box-background");const o=document.createElement("div");o.classList.add("checkbox-box-border"),e.append(o,n,s),t.append(e)}l&&t.append(l),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,n.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},8805:(e,t,s)=>{s.d(t,{ZP:()=>a,v7:()=>h});var i=s(5432),n=s(5003),o=s(4789),r=s(8594),l=s(3910);class c{constructor(e,t="",s=document.createElement("div")){this.el=e,this.container=s,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),this.removeHeavyAnimationListener=(0,r.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.container.removeEventListener("scroll",this.onScroll,{capture:!0}),this.removeHeavyAnimationListener())}append(e){this.container.append(e)}scrollIntoViewNew(e){return(0,o.Z)(Object.assign(Object.assign({},e),{container:this.container}))}}class a extends c{constructor(e,t="",s=300,i){super(e,t),this.onScrollOffset=s,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,s=this.lastScrollPosition;this.onScrolledTop&&s<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-s<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class h extends c{constructor(e,t="",s=300,n=15,o=document.createElement("div")){if(super(e,t,o),this.onScrollOffset=s,this.splitCount=n,this.container=o,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,l.d)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},709:(e,t,s)=>{s.d(t,{Z:()=>l});var i=s(2398),n=s(6272),o=s(4762),r=s(503);class l extends r.Z{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let s;o.IS_APPLE?s=-.16*e:o.IS_ANDROID&&(s=0),t.style.setProperty("--letter-spacing",s+"px")}const s=this.setValueSilently.bind(this);this.setValueSilently=e=>{s(e),(0,i.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const s=this.value;let i;Math.abs(s.length-this.lastValue.length)>1&&!this.pasted&&o.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+s),this.pasted=!1,this.setLabel();let r,l,c,a="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=(0,n.u)(this.value),r=i.formatted,l=i.country,a=i.leftPattern,c=i.code,this.setValueSilently(this.lastValue=r?"+"+r:"")),t.dataset.leftPattern=a,e.onInput&&e.onInput(i)})),t.addEventListener("paste",(()=>{this.pasted=!0})),t.addEventListener("keypress",(e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1}))}}},3019:(e,t,s)=>{function i(e,t){return new Promise((s=>{const i=new FileReader;i.addEventListener("loadend",(e=>{s(e.target.result)})),i[t](e)}))}s.d(t,{Z:()=>i})},8150:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(3019);function n(e){return(0,i.Z)(e,"readAsArrayBuffer")}},7151:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(8150);function n(e){return(0,i.Z)(e).then((e=>new Uint8Array(e)))}},4668:(e,t,s)=>{function i(e,t){return e.closest(t)}s.d(t,{Z:()=>i})},2398:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(5432);function n(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var s=document.createRange();s.selectNodeContents(e),s.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(s)}else if(void 0!==document.body.createTextRange){var o=document.body.createTextRange();o.moveToElementText(e),o.collapse(!1),o.select()}}},1656:(e,t,s)=>{function i(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>i(e,!t)}s.d(t,{Z:()=>i})},6272:(e,t,s)=>{s.d(t,{u:()=>l});var i=s(4727);const n=new Map;let o=0;const r=(e,t,s="")=>{s=t.country_code+s,o=Math.max(o,s.length),n.set(s,{country:e,code:t})};function l(e){e=e||"",n.size||i.default.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((s=>{r(e,t,s)})):r(e,t)}))}));let t,s=e.replace(/\D/g,""),l=s.slice(0,o);for(let e=l.length-1;e>=0&&(t=n.get(l.slice(0,e+1)),!t);--e);if(!t)return{formatted:s,country:void 0,code:void 0,leftPattern:""};const c=t.country,a=t.code.patterns||[],h=s.slice(t.code.country_code.length);let d="",u=0,p="";for(let e=a.length-1;e>=0;--e){d=a[e];const t=d.replace(/ /g,"");let s=0;for(let e=0,i=Math.min(h.length,t.length);eu&&(u=s,p=d)}d=p||d,d=d.replace(/\d/g,"X"),d=t.code.country_code+" "+d,d.split("").forEach(((e,t)=>{" "===e&&" "!==s[t]&&s.length>t&&(s=s.slice(0,t)+" "+s.slice(t))}));let m=d&&d.length>s.length?d.slice(s.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:s,country:c,code:t.code,leftPattern:m}}},8576:(e,t,s)=>{s.d(t,{Z:()=>r});var i=s(1267),n=s(8975),o=s(2328);class r{constructor(e){this.dbName=e,this.useStorage=!0,i.Z.test&&(this.dbName+="_test"),r.STORAGES.length&&(this.useStorage=r.STORAGES[0].useStorage),this.openDatabase(),r.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation((t=>t.delete("/"+e)))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation((t=>t.match("/"+e)))}save(e,t){return this.timeoutOperation((s=>s.put("/"+e,t)))}getFile(e,t="blob"){return this.get(e).then((e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=(0,n.Z)(t));const s=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,s).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,s)=>{return i=this,n=void 0,r=function*(){let i=!1;const n=setTimeout((()=>{s(),i=!0}),15e3);try{const s=yield this.openDatabase();if(!s)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const n=yield e(s);if(i)return;t(n)}catch(e){s(e)}clearTimeout(n)},new((o=void 0)||(o=Promise))((function(e,t){function s(e){try{c(r.next(e))}catch(e){t(e)}}function l(e){try{c(r.throw(e))}catch(e){t(e)}}function c(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(s,l)}c((r=r.apply(i,n||[])).next())}));var i,n,o,r})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const s=o.Z.getFakeFileWriter(t,(t=>this.saveFile(e,t).catch((()=>t))));return Promise.resolve(s)}static toggleStorage(e){return Promise.all(this.STORAGES.map((t=>{if(t.useStorage=e,!e)return t.deleteAll()})))}}r.STORAGES=[]},2328:(e,t,s)=>{s.d(t,{Z:()=>o});var i=s(8975),n=s(7151);const o=new class{constructor(){this.blobSupported=!0;try{(0,i.Z)([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(0,n.Z)(t).then((t=>e.write(t))):e.write(t)}getFakeFileWriter(e,t){const s=[];return{write:e=>{return t=this,i=void 0,o=function*(){if(!this.blobSupported)throw!1;s.push(e)},new((n=void 0)||(n=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function l(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,l)}c((o=o.apply(t,i||[])).next())}));var t,i,n,o},truncate:()=>{s.length=0},finalize:(n=!0)=>{const o=(0,i.Z)(s,e);return n&&t&&t(o),o}}}}}}]); -//# sourceMappingURL=325.977514b16cbc045987c7.chunk.js.map \ No newline at end of file diff --git a/public/325.977514b16cbc045987c7.chunk.js.map b/public/325.977514b16cbc045987c7.chunk.js.map deleted file mode 100644 index 6e0b0d01..00000000 --- a/public/325.977514b16cbc045987c7.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"325.977514b16cbc045987c7.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/fileManager.ts"],"sourcesContent":["/*\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 appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\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 { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n private removeHeavyAnimationListener: () => void;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n\r\n this.removeHeavyAnimationListener();\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\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 placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\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\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \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 * 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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n"],"names":["CheckboxField","constructor","options","label","this","document","createElement","classList","add","restriction","round","disabled","toggleDisability","input","span","type","name","id","checked","stateKey","then","state","stateValue","stateValues","indexOf","setValueSilently","addEventListener","value","text","_i18n","textArgs","append","toggle","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withRipple","ripple","undefined","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","ScrollableBase","el","logPrefix","container","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","window","cancelAnimationFrame","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","forEach","c","setListeners","removeHeavyAnimationListener","passive","capture","removeListeners","removeEventListener","element","scrollIntoViewNew","Scrollable","onScrollOffset","withPaddingContainer","super","loadedAll","top","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","prepend","elements","padding","getDistanceToEnd","Math","offsetHeight","isScrolledDown","y","ScrollableX","splitCount","IS_TOUCH_SUPPORTED","scrollHorizontally","e","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","TelInputField","pasted","lastValue","telEl","HTMLInputElement","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","IS_APPLE","IS_ANDROID","style","setProperty","originalFunc","bind","remove","formattedPhoneNumber","abs","length","IS_APPLE_MOBILE","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","test","metaKey","ctrlKey","shiftKey","preventDefault","readBlobAs","blob","method","Promise","resolve","reader","FileReader","target","result","readBlobAsArrayBuffer","readBlobAsUint8Array","buffer","Uint8Array","findUpTag","tag","closest","placeCaretAtEnd","ignoreTouchCheck","activeElement","focus","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","setAttribute","removeAttribute","prefixes","Map","maxPrefixLength","setPrefix","prefix","country_code","max","set","formatPhoneNumber","originalStr","size","country_codes","prefixCountry","str","phoneCode","slice","i","get","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","push","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","match","save","response","put","getFile","fileName","saveFile","Blob","Response","headers","callback","reject","rejected","timeout","setTimeout","res","err","clearTimeout","getFileWriter","mimeType","fakeWriter","catch","static","enabled","all","map","storage","blobSupported","isAvailable","write","fileWriter","bytes","arr","getFakeFileWriter","saveFileCallback","blobParts","part","truncate","finalize","saveToStorage"],"sourceRoot":""} \ No newline at end of file diff --git a/public/339.de8e477f93d6d13a3a02.chunk.js b/public/339.de8e477f93d6d13a3a02.chunk.js deleted file mode 100644 index 1f8f1bf4..00000000 --- a/public/339.de8e477f93d6d13a3a02.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[339],{2582:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(4727);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,a)=>{a.r(t),a.d(t,{default:()=>g});var n=a(4494),i=a(503),s=a(6858),r=a(6765),l=a(4687),u=a(4727),c=a(9518),p=a(8598),o=a(2582),d=a(4874),m=a(8799),h=a(5565);let v=null;const g=new d.Z("page-signUp",!0,(()=>Promise.all([a.e(714),a.e(272)]).then(a.bind(a,8209)).then((e=>{const t=new o.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const l=document.createElement("canvas");l.id="canvas-avatar",l.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(l,d);const g=e.default;let b;t.imageDiv.addEventListener("click",(()=>{(new r.Z).open(l,(e=>{b=e}))}));const L=e=>{const a=w.value||"",n=y.value||"",i=a||n?(a+" "+n).trim():"";i?(0,h.Z)(t.title,p.Z.wrapEmojiText(i)):(0,h.Z)(t.title,(0,u.i18n)("YourName"))},w=new i.Z({label:"FirstName",maxLength:70}),y=new i.Z({label:"LastName",maxLength:64}),f=(0,n.Z)("btn-primary btn-color-primary"),E=new u.default.IntlElement({key:"StartMessaging"});return f.append(E.element),t.inputWrapper.append(w.container,y.container,f),w.input.addEventListener("input",L),y.input.addEventListener("input",L),f.addEventListener("click",(function(e){if(w.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const t=w.value.trim(),n=y.value.trim(),i={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=(0,s.y7)(this);c.Z.invokeApi("auth.signUp",i).then((e=>{"auth.authorization"===e._?(c.Z.setUser(e.user),new Promise(((e,t)=>{if(!b)return e();b().then((a=>{g.uploadProfilePhoto(a).then(e,t)}),t)})).finally((()=>{a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()}))}))):(E.update({key:e._}),this.removeAttribute("disabled"),r.remove())})).catch((e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})}))})),(0,m.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}))),(e=>{v=e,l.default.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); -//# sourceMappingURL=339.de8e477f93d6d13a3a02.chunk.js.map \ No newline at end of file diff --git a/public/339.de8e477f93d6d13a3a02.chunk.js.map b/public/339.de8e477f93d6d13a3a02.chunk.js.map deleted file mode 100644 index 777691ba..00000000 --- a/public/339.de8e477f93d6d13a3a02.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"339.de8e477f93d6d13a3a02.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","i18n","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","then","imported","page","classList","add","avatarPreview","id","addIco","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","response","_","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/392.a16c421c1f68b829c496.chunk.js b/public/392.a16c421c1f68b829c496.chunk.js deleted file mode 100644 index b92ab2fe..00000000 --- a/public/392.a16c421c1f68b829c496.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[392],{4489:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(503);class a extends i.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a}))}}},3083:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2897);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.Z.waitForFirstFrame(e)))),i.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),i.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>b});var i=n(4755),a=n(4687),s=n(9518),o=n(4874),l=n(810),h=n(3083),r=n(4489),d=n(4727),u=n(144),c=n(5565);let p,m=null,y=null,v=null;const E=new o.Z("page-authCode",!0,(()=>{const e=m.type.length,t=new r.Z({label:"Code",name:(0,u.a)(),length:e,onFill:e=>{o(e)}});p=t.input,E.pageEl.querySelector(".input-wrapper").append(t.container),E.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return l.default.mount()}));const a=()=>{setTimeout((()=>{b.remove()}),300)},o=e=>{p.setAttribute("disabled","true");const i={phone_number:m.phone_number,phone_code_hash:m.phone_code_hash,phone_code:e};s.Z.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":s.Z.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(339)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:m.phone_number,phone_code_hash:m.phone_code_hash})})),a()}})).catch((e=>{return i=void 0,a=void 0,o=function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{p.value=""}),300);break;case"PHONE_CODE_EXPIRED":p.classList.add("error"),(0,c.Z)(t.label,(0,d.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":p.classList.add("error"),(0,c.Z)(t.label,(0,d.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),p.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{h(o.next(e))}catch(e){t(e)}}function l(e){try{h(o.throw(e))}catch(e){t(e)}}function h(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(n,l)}h((o=o.apply(i,a||[])).next())}));var i,a,s,o}))},y=E.pageEl.querySelector(".auth-image"),v=i.ZP.isMobile?100:166,b=new h.Z(t,v);return y.append(b.container),b.load()}),(e=>{if(m=e,y){p.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),p.dispatchEvent(e)}else y=E.pageEl.getElementsByClassName("phone")[0],v=E.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(y.innerText=m.phone_number,m.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[m.type._]}(0,c.Z)(v,(0,d.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{p.focus()})),b=E}}]); -//# sourceMappingURL=392.a16c421c1f68b829c496.chunk.js.map \ No newline at end of file diff --git a/public/392.a16c421c1f68b829c496.chunk.js.map b/public/392.a16c421c1f68b829c496.chunk.js.map deleted file mode 100644 index 7e94f178..00000000 --- a/public/392.a16c421c1f68b829c496.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"392.a16c421c1f68b829c496.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/pages/pageAuthCode.ts"],"sourcesContent":["/*\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 InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\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 InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\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 mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","Promise","all","loop","autoplay","width","height","then","_animation","currentFrame","pause","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","i18n","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/4.2204f96c53d1827a35fa.chunk.js b/public/4.2204f96c53d1827a35fa.chunk.js new file mode 100644 index 00000000..ef9390ce --- /dev/null +++ b/public/4.2204f96c53d1827a35fa.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[4,30],{19:function(e,t,a){"use strict";a.r(t);var n=a(8),l=a(9),u=a(17),s=a(16),c=a(15);const d=new(a(69).a)("page-chats",!1,()=>(u.default.pushToState("authState",{_:"authStateSignedIn"}),c.default.dispatchEvent("im_mount"),s.default.requestedServerLanguage||s.default.getCacheLangPack().then(e=>{e.local&&s.default.getLangPack(e.lang_code)}),d.pageEl.style.display="",Object(n.a)(),Promise.all([Object(l.a)(),Promise.all([a.e(3),a.e(5),a.e(6),a.e(7),a.e(18)]).then(a.bind(null,185))]).then(()=>{setTimeout(()=>{document.getElementById("auth-pages").remove()},1e3)})));t.default=d}}]); +//# sourceMappingURL=4.2204f96c53d1827a35fa.chunk.js.map \ No newline at end of file diff --git a/public/4.2204f96c53d1827a35fa.chunk.js.map b/public/4.2204f96c53d1827a35fa.chunk.js.map new file mode 100644 index 00000000..03453781 --- /dev/null +++ b/public/4.2204f96c53d1827a35fa.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","dispatchEvent","requestedServerLanguage","getCacheLangPack","then","langPack","local","getLangPack","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"mappings":"wFAAA,iDA0DA,MAAMA,EAAO,IA1Db,MA0DiB,GAAK,cAAc,EA7CjB,KAEjB,UAAgBC,YAAY,YAAa,CAACC,EAAG,sBAI7C,UAAUC,cAAc,YAEpB,UAAKC,yBACP,UAAKC,mBAAmBC,KAAKC,IACxBA,EAASC,OACV,UAAKC,YAAYF,EAASG,aAKhCV,EAAKW,OAAOC,MAAMC,QAAU,GAiB5B,cAEOC,QAAQC,IAAI,CACjB,cACA,4EACCT,KAAK,KACNU,WAAW,KACTC,SAASC,eAAe,cAAcC,UACrC,SAKQ","file":"4.2204f96c53d1827a35fa.chunk.js","sourcesContent":["/*\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 blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n rootScope.dispatchEvent('im_mount');\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then(langPack => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n //alert('pageIm!');\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/405.7373165804a1f4a12f8a.chunk.js b/public/405.7373165804a1f4a12f8a.chunk.js deleted file mode 100644 index e37073b3..00000000 --- a/public/405.7373165804a1f4a12f8a.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[405,512],{1405:(e,t,s)=>{s.r(t),s.d(t,{ripple:()=>c});var i=s(8497),n=s(9674),r=s(5432),o=s(3512),l=s(5975);let a=0;function c(e,t=(()=>Promise.resolve()),s=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let h,u=document.createElement("div");u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const m=(e,i)=>{const o=Date.now(),l=document.createElement("div"),c=a++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{n.Z.mutate((()=>{l.remove()})),s&&s(c)};if(el.classList.add("hiding")),Math.max(s-d/2,0)),setTimeout(t,s)}else l.classList.add("hiding"),setTimeout(t,d/2);r.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,v=!1},t&&t(c),window.requestAnimationFrame((()=>{const t=u.getBoundingClientRect();l.classList.add("c-ripple__circle");const s=e-t.left,n=i-t.top,r=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-r/2,a=n-r/2;l.style.width=l.style.height=r+"px",l.style.left=o+"px",l.style.top=a+"px",u.append(l)}))},p=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,i.Z)(t.target,"c-ripple")!==u)&&(d===e||!(0,l.Z)(t.target,d));let v=!1;if(r.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};d.addEventListener("touchstart",(t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||v||p(t))return;v=!0;let{clientX:s,clientY:i}=t.touches[0];m(s,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else d.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||p(e))return;if(v)return void(v=!1);let{clientX:t,clientY:s}=e;m(t,s),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})}),{passive:!0})}},410:(e,t,s)=>{s.d(t,{GO:()=>n,ZP:()=>r});const i=s(1267).Z.debug,n="undefined"!=typeof window?window:self,r=i},1267:(e,t,s)=>{s.d(t,{Z:()=>n});const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};i.http=location.search.indexOf("http=1")>0,i.http&&(i.transport="https");const n=i},3725:(e,t,s)=>{s.d(t,{b:()=>n});var i=s(319);function n(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((s,i)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,i(...e))}}));return t.catch(i.Z).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})})),Object.assign(t,e),t}},5975:(e,t,s)=>{function i(e,t){if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}s.d(t,{Z:()=>i})},8487:(e,t,s)=>{function i(e){return null==e?void 0:e.isConnected}s.d(t,{Z:()=>i})},3241:(e,t,s)=>{s.d(t,{Z:()=>i});class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var i;(null!==(i=this.listeners[e])&&void 0!==i?i:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null==s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice((e=>e.callback===t))}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const i=t&&[],n=this.listeners[e];return n&&n.slice().forEach((t=>{var r;if(-1===n.findIndex((e=>e.callback===t.callback)))return;let o;try{o=t.callback(...s)}catch(e){console.error(e)}i&&i.push(o),(null===(r=t.options)||void 0===r?void 0:r.once)&&this.removeEventListener(e,t.callback)})),i}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},319:(e,t,s)=>{function i(){}s.d(t,{Z:()=>i})},3035:(e,t,s)=>{let i;function n(e){i?i.push(e):(i=[e],requestAnimationFrame((()=>{const e=i;i=void 0,e.forEach((e=>e()))})))}s.d(t,{AD:()=>c,T2:()=>n,TR:()=>a,d1:()=>d});let r,o,l=!1;function a(e){r?l?e():r.push(e):(r=[e],requestAnimationFrame((()=>{l=!0;for(let e=0;e{o=void 0})),o)}function d(){return new Promise((e=>{n((()=>{n(e)}))}))}},9674:(e,t,s)=>{s.d(t,{Z:()=>a});var i=s(3035),n=s(3725),r=s(410),o=s(8487);const l=new class{constructor(){this.promises={},this.raf=i.T2.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=(0,n.b)()),void 0!==t&&s.then((()=>t())),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=(0,o.Z)(e),i=s?this.mutate():Promise.resolve();return void 0!==t&&(s?t():i.then((()=>t()))),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};r.GO&&(r.GO.sequentialDom=l);const a=l},1507:(e,t,s)=>{s.d(t,{NM:()=>i,gZ:()=>l,hj:()=>n,rU:()=>o,yF:()=>r});const i=0,n=1271266957,r=777e3,o=2147483647,l=""},3512:(e,t,s)=>{s.r(t),s.d(t,{RootScope:()=>o,default:()=>a});var i=s(1507),n=s(3241),r=s(410);class o extends n.Z{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",(e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)})),this.addEventListener("user_auth",(({id:e})=>{this.myId="number"==typeof i.NM?+e:""+e})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.addEventListener("idle",(e=>{e?this.idle.focusPromise=new Promise((e=>{this.idle.focusResolve=e})):this.idle.focusResolve()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find((t=>t.name===e))}}const l=new o;r.GO.rootScope=l;const a=l}}]); -//# sourceMappingURL=405.7373165804a1f4a12f8a.chunk.js.map \ No newline at end of file diff --git a/public/405.7373165804a1f4a12f8a.chunk.js.map b/public/405.7373165804a1f4a12f8a.chunk.js.map deleted file mode 100644 index d412bc6a..00000000 --- a/public/405.7373165804a1f4a12f8a.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"405.7373165804a1f4a12f8a.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/rootScope.ts"],"sourcesContent":["/*\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 findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\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\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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 findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\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 * 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\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function noop() {}\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(requestAnimationFrame);\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\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\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\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\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\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 { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_reactions': {message: Message.message, changedResults: ReactionCount[]},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n"],"names":["rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","attachListenerTo","querySelector","classList","add","handler","r","document","createElement","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","remove","delay","Math","max","setTimeout","IS_TOUCH_SUPPORTED","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","DEBUG","MOUNT_CLASS_TO","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","forEach","addNotifyListener","push","deferred","reject","value","catch","finally","cancel","Object","assign","findUpAsChild","el","parent","parentElement","isInDOM","element","isConnected","EventListenerBase","constructor","reuseResults","this","_constructor","listenerResults","name","options","hasOwnProperty","pop","addMultipleEventsListeners","obj","i","findAndSplice","l","_dispatchEvent","collectResults","arr","slice","listener","findIndex","result","err","console","error","dispatchResultableEvent","dispatchEvent","cleanup","noop","fastRafCallbacks","fastRaf","currentCallbacks","undefined","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","then","doubleRaf","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","measure","mutate","mutateElement","read","write","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","peerId","body","toggle","id","myId","status","themeColorElem","_themeColorElem","head","setThemeColor","color","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","setTheme","addListener","colorScheme","documentElement","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope"],"sourceRoot":""} \ No newline at end of file diff --git a/public/436.fc57e380ea4d30dae9c8.chunk.js b/public/436.fc57e380ea4d30dae9c8.chunk.js deleted file mode 100644 index d8453c6c..00000000 --- a/public/436.fc57e380ea4d30dae9c8.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[436,781],{5436:(e,t,a)=>{a.r(t),a.d(t,{default:()=>c});var u=a(8799),n=a(4541),l=a(4687),s=a(4727),d=a(3512);const h=new(a(4874).Z)("page-chats",!1,(()=>(l.default.pushToState("authState",{_:"authStateSignedIn"}),d.default.dispatchEvent("im_mount"),s.default.requestedServerLanguage||s.default.getCacheLangPack().then((e=>{e.local&&s.default.getLangPack(e.lang_code)})),h.pageEl.style.display="",(0,u.Z)(),Promise.all([(0,n.Z)(),Promise.all([a.e(458),a.e(554),a.e(325),a.e(765),a.e(714),a.e(664)]).then(a.bind(a,2664))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),c=h}}]); -//# sourceMappingURL=436.fc57e380ea4d30dae9c8.chunk.js.map \ No newline at end of file diff --git a/public/436.fc57e380ea4d30dae9c8.chunk.js.map b/public/436.fc57e380ea4d30dae9c8.chunk.js.map deleted file mode 100644 index a674433f..00000000 --- a/public/436.fc57e380ea4d30dae9c8.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"436.fc57e380ea4d30dae9c8.chunk.js","mappings":"mLA0DA,MAAMA,EAAO,I,QAAI,GAAK,cAAc,GA7CjB,KAEjB,sBAA4B,YAAa,CAACC,EAAG,sBAI7C,wBAAwB,YAEpB,mCACF,6BAAwBC,MAAKC,IACxBA,EAASC,OACV,sBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAiB5B,SAEOC,QAAQC,IAAI,EACjB,SACA,4FACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\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 blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n rootScope.dispatchEvent('im_mount');\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then(langPack => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n //alert('pageIm!');\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/437.aa9fc330e4d4bcacc9e3.chunk.js b/public/437.aa9fc330e4d4bcacc9e3.chunk.js deleted file mode 100644 index 4e81d36d..00000000 --- a/public/437.aa9fc330e4d4bcacc9e3.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[437,442,774],{4425:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2897);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.d)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return t.innerHTML=e,t}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},634:(e,t,i)=>{i.d(t,{Z:()=>r});var s=i(410),n=i(9518);const a=new class{getState(){return n.Z.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let i,s;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};i=e.currentPassword?n.Z.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=t.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,s=e.newPassword?n.Z.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([i,s]).then((e=>(a.password=e[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=e[1],n.Z.invokeApi("account.updatePasswordSettings",a))))}))}check(e,t,i={}){return n.Z.invokeCrypto("computeSRP",e,t,!1).then((e=>n.Z.invokeApi("auth.checkPassword",{password:e},i).then((e=>("auth.authorization"===e._&&n.Z.setUser(e.user),e)))))}confirmPasswordEmail(e){return n.Z.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.Z.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.Z.invokeApi("account.cancelPasswordEmail")}};s.GO.passwordManager=a;const r=a},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(4727);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>k});var s=i(6858),n=i(4755),a=i(4687),r=i(634),o=i(4874),l=i(4494),d=i(6830),c=i(4425),p=i(8598),h=i(4727),u=i(2582),m=i(3910),w=i(2738),b=i(2614),g=i(5565),v=i(1656);let y;const k=new o.Z("page-password",!0,(()=>{const e=new u.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,l.Z)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});t.append(a.element);const o=new d.Z({label:"LoginPassword",name:"password"});let k;y=o.input,e.inputWrapper.append(o.container,t);let P,Z=()=>(k||(k=window.setInterval(Z,1e4)),r.Z.getState().then((e=>{P=e,P.hint?(0,g.Z)(o.label,(0,b.Z)(p.Z.wrapEmojiText(P.hint))):o.setLabel()})));const E=e=>{if(e&&(0,m.d)(e),!y.value.length)return void y.classList.add("error");const n=(0,v.Z)([y,t],!0);let l=y.value;a.update({key:"PleaseWait"});const d=(0,s.y7)(t);o.setValueSilently(""+Math.random()),o.setValueSilently(l),r.Z.check(l,P).then((e=>{"auth.authorization"===e._?(clearInterval(k),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),S&&S.remove()):(t.removeAttribute("disabled"),a.update({key:e._}),d.remove())})).catch((e=>{n(),o.input.classList.add("error"),e.type,a.update({key:"PASSWORD_HASH_INVALID"}),y.select(),d.remove(),Z()}))};(0,w.fc)(t,E),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const L=n.ZP.isMobile?100:166,S=new c.Z(o,L);return e.imageDiv.append(S.container),Promise.all([S.load(),Z()])}),null,(()=>{y.focus(),a.default.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=437.aa9fc330e4d4bcacc9e3.chunk.js.map \ No newline at end of file diff --git a/public/437.aa9fc330e4d4bcacc9e3.chunk.js.map b/public/437.aa9fc330e4d4bcacc9e3.chunk.js.map deleted file mode 100644 index b736a02a..00000000 --- a/public/437.aa9fc330e4d4bcacc9e3.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"437.aa9fc330e4d4bcacc9e3.chunk.js","mappings":"kIAUe,MAAMA,EAMnBC,YAAsBC,EAAkDC,GAAlD,KAAAD,mBAAAA,EAAkD,KAAAC,KAAAA,EAHjE,KAAAC,UAAY,EAIjBC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,yBAGxBC,OACL,OAAGN,KAAKO,YAAoBP,KAAKO,YAC1BP,KAAKO,YAAc,yBAAkC,CAC1DN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,KACbc,SAAS,GAER,4BAA4BC,MAAKC,IAElCd,KAAKe,UAAYD,EACjBd,KAAKe,UAAUC,iBAAiB,cAAcC,KAGX,IAA7BjB,KAAKe,UAAUG,WAAmBD,GAAgBjB,KAAKD,YAC1B,IAA9BC,KAAKe,UAAUG,WAAoBD,GAAgBjB,KAAKD,aACvDC,KAAKe,UAAUI,SAAS,GACxBnB,KAAKe,UAAUK,YAIrBpB,KAAKH,mBAAmBwB,4BAA8B,KACjDrB,KAAKH,mBAAmByB,iBACzBtB,KAAKe,UAAUQ,aAAa,GAC5BvB,KAAKe,UAAUS,SAAW,EAC1BxB,KAAKD,UAAY,GACjBC,KAAKe,UAAUU,SAEfzB,KAAKe,UAAUQ,cAAc,GAC7BvB,KAAKe,UAAUS,SAAW,GAC1BxB,KAAKD,UAAY,EACjBC,KAAKe,UAAUU,SAIZ,sBAA+BX,MAInCY,SACF1B,KAAKe,WACNf,KAAKe,UAAUW,Y,uDCtDN,MAAMC,UAA2B,IAK9C/B,YAAYgC,EAA6B,IACvCC,MAAM,OAAD,QACHC,WAAW,GACRF,IAPA,KAAAN,iBAAkB,EAyClB,KAAAS,kBAAqBC,KAC1B,OAAYA,GACZhC,KAAKsB,iBAAmBtB,KAAKsB,gBAE7BtB,KAAKiC,cAAc7B,UAAU8B,OAAO,aAAclC,KAAKsB,iBACtDtB,KAAKmC,MAA2BC,KAAOpC,KAAKsB,gBAAkB,OAAS,WACxEtB,KAAKqB,6BAA+BrB,KAAKqB,+BArCzC,MAAMc,EAAQnC,KAAKmC,MACnBA,EAAMC,KAAO,WACbD,EAAME,aAAa,WAAY,IAC/BF,EAAMG,KAAO,qBACbH,EAAMI,aAAe,MAUrB,MAAMC,EAAWtC,SAASC,cAAc,SACxCqC,EAASpC,UAAUC,IAAI,YACvBmC,EAASC,UAAY,EACrBD,EAASJ,KAAO,WAChBD,EAAMO,cAAcC,QAAQH,GAC5BL,EAAMO,cAAcE,aAAaJ,EAASK,YAAaV,EAAMW,aAE7D,MAAMb,EAAgBjC,KAAKiC,cAAgB/B,SAASC,cAAc,QAClE8B,EAAc7B,UAAUC,IAAI,iBAAkB,SAE9CL,KAAKC,UAAUG,UAAUC,IAAI,wBAC7BL,KAAKC,UAAU8C,OAAOd,GAEtBA,EAAcjB,iBAAiB,QAAShB,KAAK+B,mBAC7CE,EAAcjB,iBAAiB,WAAYhB,KAAK+B,sB,eC3CrC,SAASiB,EAAWC,GACjC,MAAMC,EAAOhD,SAASC,cAAc,QAEpC,OADA+C,EAAKC,UAAYF,EACVC,E,iCCHM,SAASE,EAAiBC,EAAyBC,GAOhE,OANGA,EACDD,EAASE,SAAQC,GAAMA,EAAGnB,aAAa,WAAY,UAEnDgB,EAASE,SAAQC,GAAMA,EAAGC,gBAAgB,cAGrC,IAAML,EAAiBC,GAAWC,G,wECmG3C,MAAMI,EAAkB,IAjGjB,MACEC,WACL,OAAO,cAAqB,uBAAuB9C,MAAM+C,GAChDA,IAIJC,eAAeC,EAKlB,IAIF,OAAO9D,KAAK2D,WAAW9C,MAAKkD,IAC1B,IAAIC,EACAC,EACJ,MAAMC,EAAwC,CAC5CC,SAAU,KACVC,aAAc,CACZC,EAAG,gCACHC,KAAMR,EAASQ,KACfC,MAAOT,EAASS,QAKlBP,EADCF,EAASU,gBACW,iBAAwB,aAAcV,EAASU,gBAAiBT,GAAO,GAEvEU,QAAQC,QAAQ,CACnCL,EAAG,4BAKP,MAAMM,EAAUZ,EAAMa,SAChBC,EAAQ,IAAIC,WAAWH,EAAQE,MAAME,OAAS,IAWpD,OAVAF,EAAMG,YACNH,EAAMI,IAAIN,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdZ,EADCH,EAASoB,YACO,iBAAwB,aAAcpB,EAASoB,YAAanB,GAAO,GAEnEU,QAAQC,QAAQ,IAAII,YAGhCL,QAAQU,IAAI,CAACnB,EAAoBC,IAAiBpD,MAAMuE,IAC7DlB,EAAOC,SAAWiB,EAAO,GACzBlB,EAAOE,aAAaQ,SAAWD,EAC/BT,EAAOE,aAAaiB,kBAAoBD,EAAO,GAExC,cAAqB,iCAAkClB,SAK7DoB,MAAMnB,EAAkBJ,EAAwBnC,EAAe,IACpE,OAAO,iBAAwB,aAAcuC,EAAUJ,GAAO,GAAOlD,MAAM0E,GAElE,cAAqB,qBAAsB,CAChDpB,SAAUoB,GACT3D,GAASf,MAAK2E,IACD,uBAAXA,EAAKnB,GACN,YAAmBmB,EAAKC,MAGnBD,OAKNE,qBAAqBC,GAC1B,OAAO,cAAqB,+BAAgC,CAACA,KAAAA,IAGxDC,sBACL,OAAO,cAAqB,+BAGvBC,sBACL,OAAO,cAAqB,iCAehC,qBAAiCnC,EACjC,W,8CC1Ge,MAAMoC,EAQnBlG,YAAYgC,GAMV5B,KAAK+F,QAAU7F,SAAS8F,KAAKC,cAAc,IAAMrE,EAAQsE,WAIzDlG,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUiG,UAAY,yBAE3BlG,KAAKmG,SAAWjG,SAASC,cAAc,OACvCH,KAAKmG,SAASD,UAAY,aAE1BlG,KAAKoG,MAAQlG,SAASC,cAAc,MACjCyB,EAAQyE,cACTrG,KAAKoG,MAAMrD,QAAO,IAAAuD,MAAK1E,EAAQyE,eAGjCrG,KAAKuG,SAAWrG,SAASC,cAAc,KACvCH,KAAKuG,SAASL,UAAY,WACvBtE,EAAQ4E,iBACTxG,KAAKuG,SAASxD,QAAO,IAAAuD,MAAK1E,EAAQ4E,kBAGpCxG,KAAKC,UAAU8C,OAAO/C,KAAKmG,SAAUnG,KAAKoG,MAAOpG,KAAKuG,UAEnD3E,EAAQ6E,mBACTzG,KAAK0G,aAAexG,SAASC,cAAc,OAC3CH,KAAK0G,aAAaR,UAAY,gBAC9BlG,KAAKC,UAAU8C,OAAO/C,KAAK0G,eAG7B1G,KAAK+F,QAAQhD,OAAO/C,KAAKC,c,gNC1B7B,IAAI0G,EAuHJ,MAQA,EARa,IAAI,IAAK,iBAAiB,GArHpB,KACjB,MAAMC,EAAO,IAAI,IAAU,CACzBV,UAAW,gBACXO,kBAAkB,EAClBJ,aAAc,uBACdG,gBAAiB,4BAGbK,GAAU,OAAO,iCACjBC,EAAc,IAAI,sBAAiB,CAACC,IAAK,eAE/CF,EAAQ9D,OAAO+D,EAAYf,SAE3B,MAAMlG,EAAqB,IAAI,IAAmB,CAChDmH,MAAO,gBACP1E,KAAM,aAOR,IAAI2E,EAJJN,EAAgB9G,EAAmBsC,MAEnCyE,EAAKF,aAAa3D,OAAOlD,EAAmBI,UAAW4G,GAIvD,IAiBI9C,EAjBAJ,EAAW,KAETsD,IACFA,EAAmBC,OAAOC,YAAYxD,EAAU,MAGlC,eAA2B9C,MAAKuG,IAC9CrD,EAAQqD,EAELrD,EAAMO,MACP,OAAezE,EAAmBmH,OAAO,OAAW,kBAAgCjD,EAAMO,QAE1FzE,EAAmBwH,eAOzB,MAAMC,EAAYtF,IAKhB,GAJGA,IACD,OAAYA,IAGV2E,EAAcY,MAAMxC,OAEtB,YADA4B,EAAcvG,UAAUC,IAAI,SAI9B,MAAM6B,GAAS,OAAiB,CAACyE,EAAeE,IAAU,GAC1D,IAAIU,EAAQZ,EAAcY,MAE1BT,EAAYU,OAAO,CAACT,IAAK,eACzB,MAAMU,GAAY,QAAaZ,GAE/BhH,EAAmB6H,iBAAiB,GAAKC,KAAKC,UAC9C/H,EAAmB6H,iBAAiBH,GAEpC,UAAsBA,EAAOxD,GAAOlD,MAAMgH,IAIjC,uBADAA,EAASxD,GAEZyD,cAAcb,GACd,8BAAmBpG,MAAKkH,IACtBA,EAAEC,QAAQC,WAETC,GAAQA,EAAOxG,WAGlBmF,EAAQpD,gBAAgB,YACxBqD,EAAYU,OAAO,CAACT,IAAKc,EAASxD,IAClCoD,EAAU/F,aAGbyG,OAAOC,IACRlG,IACArC,EAAmBsC,MAAM/B,UAAUC,IAAI,SAEhC+H,EAAIhG,KAGP0E,EAAYU,OAAO,CAACT,IAAK,0BACzBJ,EAAc0B,SAIlBZ,EAAU/F,SAEViC,SAIJ,QAAiBkD,EAASS,GAE1BX,EAAc3F,iBAAiB,YAAY,SAAegB,GAIxD,GAHAhC,KAAKI,UAAUsB,OAAO,SACtBoF,EAAYU,OAAO,CAACT,IAAK,eAEZ,UAAV/E,EAAE+E,IACH,OAAOO,OAIX,MAAMxH,EAAO,cAAsB,IAAM,IACnCoI,EAAS,IAAI,IAAerI,EAAoBC,GAEtD,OADA8G,EAAKT,SAASpD,OAAOmF,EAAOjI,WACrBwE,QAAQU,IAAI,CACjB+C,EAAO5H,OACPqD,QAIuD,MAAM,KAE7DgD,EAAc2B,QAGhB,sBAA4B,YAAa,CAACjE,EAAG","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","toggleDisability","elements","disable","forEach","el","removeAttribute","passwordManager","getState","result","updateSettings","settings","state","currentHashPromise","newHashPromise","params","password","new_settings","_","hint","email","currentPassword","Promise","resolve","newAlgo","new_algo","salt1","Uint8Array","length","randomize","set","newPassword","all","hashes","new_password_hash","check","inputCheckPassword","auth","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","i18n","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","window","setInterval","_state","setLabel","onSubmit","value","update","preloader","setValueSilently","Math","random","response","clearInterval","m","default","mount","monkey","catch","err","select","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/442.a506db9e5c6cfd0f89d7.chunk.js b/public/442.a506db9e5c6cfd0f89d7.chunk.js deleted file mode 100644 index 1da56755..00000000 --- a/public/442.a506db9e5c6cfd0f89d7.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[442,437,774],{4425:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2897);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.d)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return t.innerHTML=e,t}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},634:(e,t,i)=>{i.d(t,{Z:()=>r});var s=i(410),n=i(9518);const a=new class{getState(){return n.Z.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let i,s;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};i=e.currentPassword?n.Z.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=t.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,s=e.newPassword?n.Z.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([i,s]).then((e=>(a.password=e[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=e[1],n.Z.invokeApi("account.updatePasswordSettings",a))))}))}check(e,t,i={}){return n.Z.invokeCrypto("computeSRP",e,t,!1).then((e=>n.Z.invokeApi("auth.checkPassword",{password:e},i).then((e=>("auth.authorization"===e._&&n.Z.setUser(e.user),e)))))}confirmPasswordEmail(e){return n.Z.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.Z.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.Z.invokeApi("account.cancelPasswordEmail")}};s.GO.passwordManager=a;const r=a},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(4727);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>k});var s=i(6858),n=i(4755),a=i(4687),r=i(634),o=i(4874),l=i(4494),d=i(6830),c=i(4425),p=i(8598),h=i(4727),u=i(2582),m=i(3910),w=i(2738),b=i(2614),g=i(5565),v=i(1656);let y;const k=new o.Z("page-password",!0,(()=>{const e=new u.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,l.Z)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});t.append(a.element);const o=new d.Z({label:"LoginPassword",name:"password"});let k;y=o.input,e.inputWrapper.append(o.container,t);let P,Z=()=>(k||(k=window.setInterval(Z,1e4)),r.Z.getState().then((e=>{P=e,P.hint?(0,g.Z)(o.label,(0,b.Z)(p.Z.wrapEmojiText(P.hint))):o.setLabel()})));const E=e=>{if(e&&(0,m.d)(e),!y.value.length)return void y.classList.add("error");const n=(0,v.Z)([y,t],!0);let l=y.value;a.update({key:"PleaseWait"});const d=(0,s.y7)(t);o.setValueSilently(""+Math.random()),o.setValueSilently(l),r.Z.check(l,P).then((e=>{"auth.authorization"===e._?(clearInterval(k),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),S&&S.remove()):(t.removeAttribute("disabled"),a.update({key:e._}),d.remove())})).catch((e=>{n(),o.input.classList.add("error"),e.type,a.update({key:"PASSWORD_HASH_INVALID"}),y.select(),d.remove(),Z()}))};(0,w.fc)(t,E),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const L=n.ZP.isMobile?100:166,S=new c.Z(o,L);return e.imageDiv.append(S.container),Promise.all([S.load(),Z()])}),null,(()=>{y.focus(),a.default.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=442.a506db9e5c6cfd0f89d7.chunk.js.map \ No newline at end of file diff --git a/public/442.a506db9e5c6cfd0f89d7.chunk.js.map b/public/442.a506db9e5c6cfd0f89d7.chunk.js.map deleted file mode 100644 index 343b4e16..00000000 --- a/public/442.a506db9e5c6cfd0f89d7.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"442.a506db9e5c6cfd0f89d7.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","toggleDisability","elements","disable","forEach","el","removeAttribute","passwordManager","getState","result","updateSettings","settings","state","currentHashPromise","newHashPromise","params","password","new_settings","_","hint","email","currentPassword","Promise","resolve","newAlgo","new_algo","salt1","Uint8Array","length","randomize","set","newPassword","all","hashes","new_password_hash","check","inputCheckPassword","auth","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","i18n","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","window","setInterval","_state","setLabel","onSubmit","value","update","preloader","setValueSilently","Math","random","response","clearInterval","m","default","mount","monkey","catch","err","select","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/458.79a9471a7327d7c9cca1.chunk.js b/public/458.79a9471a7327d7c9cca1.chunk.js deleted file mode 100644 index 2cb91821..00000000 --- a/public/458.79a9471a7327d7c9cca1.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[458],{503:(t,e,i)=>{i.d(e,{I:()=>d,Z:()=>c});var n=i(6669),s=i(8763),a=i(3735),l=i(1293),o=i(4727),r=i(8598),h=i(9099);let u=()=>{document.addEventListener("paste",(t=>{if(!(0,s.Z)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),l=!0,o=(t.originalEvent||t).clipboardData.getData("text/html");if(o.trim()){o=o.replace(//,""),o=o.replace(//,"");const t=o.match(/([\s\S]*)<\/body>/);t&&(o=t[1].trim());let s=document.createElement("span");s.innerHTML=o;let h=s.firstChild;for(;h;){let t=h.nextSibling;3===h.nodeType&&(h.nodeValue.trim()||h.remove()),h=t}const u=(0,a.Z)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,l=!1;let t=r.Z.parseEntities(e);t=t.filter((t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),r.Z.mergeEntities(i,t)}}l&&(e=n,i=r.Z.parseEntities(e),i=i.filter((t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._))),e=r.Z.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)})),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));const c=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:r,canBeEdited:h=!0}=t;let d,c,p=t.label||t.labelText;if(r)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver((()=>{c&&c()}));d.addEventListener("input",(()=>{(0,l.Z)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())})),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&((0,o._i18n)(d,e,void 0,"placeholder"),this.inputFake&&(0,o._i18n)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;c=()=>{const s=d.classList.contains("error"),l=r?d.value.length:[...(0,a.Z)(d,!1).value].length,o=i-l,h=o<0;d.classList.toggle("error",h),h||o<=n?(this.setLabel(),t.append(` (${i-l})`),e||(e=!0)):(s&&!h||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",c)}this.input=d}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append((0,o.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=`${n}ms`,t&&(this.input.style.height=e?e+"px":"");const s="is-changing-height";(0,h.Z)(this.input,s,!0,n,(()=>{this.input.classList.remove(s)}))}get value(){return this.options.plainText?this.input.value:(0,a.Z)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),(0,n.Z)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,l.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=r.Z.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append((0,o.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},9099:(t,e,i)=>{i.d(e,{Z:()=>a});var n=i(3512);const s=(t,e,i,a,l,o)=>{const{timeout:r,raf:h}=t.dataset;if(void 0!==r&&clearTimeout(+r),void 0!==h&&(window.cancelAnimationFrame(+h),o||delete t.dataset.raf),o&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,s(t,e,i,a,l,o-1)})));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),l&&l()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)},a=s},8763:(t,e,i)=>{function n(t,e){return t.closest(`[${e}]`)}i.d(e,{Z:()=>n})},9041:(t,e,i)=>{i.d(e,{Z:()=>a,o:()=>n});const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,l,o,r,h={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(l===t?i.push(e.substr(0,o)+""+e.substr(o)):i.push(e),r&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:a.href,offset:h.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:h.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:h.offset,length:e.length}))}}return void(h.offset+=e.length)}if(1!==t.nodeType)return;const u=l===t,d=s.has(t.tagName);if(d&&i.length)e.push(i.join("")),i.splice(0,i.length),++h.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),h.offset+=e.length)}u&&!o&&i.push("");const c=t.matches('[style*="table-cell"], th, td'),p=null==r?void 0:r.length;let m=t.firstChild;for(;m;)a(m,e,i,l,o,r,h),m=m.nextSibling;if(u&&o&&i.push(""),c&&t.nextSibling&&(i.push(" "),++h.offset,void 0!==p))for(let t=p,e=r.length;t{i.d(e,{Z:()=>l});var n=i(410),s=i(8598),a=i(9041);function l(t,e=!0){const i=[],n=[],l=e?[]:void 0;(0,a.Z)(t,i,n,void 0,void 0,l),n.length&&i.push(n.join(""));let o=i.join("\n");return o=o.replace(/\u00A0/g," "),(null==l?void 0:l.length)&&(s.Z.combineSameEntities(l),s.Z.sortEntities(l)),{value:o,entities:l}}n.GO.getRichValue=l},1293:(t,e,i)=>{i.d(e,{Z:()=>s});var n=i(3735);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!(0,n.Z)(t,!1).value.trim():!t.value.trim()}},5565:(t,e,i)=>{function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,{Z:()=>n})}}]); -//# sourceMappingURL=458.79a9471a7327d7c9cca1.chunk.js.map \ No newline at end of file diff --git a/public/458.79a9471a7327d7c9cca1.chunk.js.map b/public/458.79a9471a7327d7c9cca1.chunk.js.map deleted file mode 100644 index 575365bf..00000000 --- a/public/458.79a9471a7327d7c9cca1.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"458.79a9471a7327d7c9cca1.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValue.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts"],"sourcesContent":["/*\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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 findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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 replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n"],"names":["init","document","addEventListener","e","findUpAttribute","target","text","entities","preventDefault","plainText","originalEvent","clipboardData","getData","usePlainText","html","trim","replace","match","span","createElement","innerHTML","curChild","firstChild","nextSibling","nodeType","nodeValue","remove","richValue","getRichValue","value","length","entities2","filter","_","window","execCommand","InputState","constructor","options","this","container","classList","add","required","validate","undefined","maxLength","showLengthOn","Math","min","round","placeholder","name","canBeEdited","input","processInput","label","labelText","firstElementChild","String","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","_i18n","border","append","setLabel","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","textContent","i18n","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","height","transitionDuration","log","abs","setValueSilently","fireFakeInput","isChanged","originalValue","isValid","isValidToChange","setDraftValue","silent","setOriginalValue","setState","state","Error","Valid","setError","SetTransition","element","forwards","duration","onTransitionEnd","useRafs","timeout","raf","dataset","clearTimeout","cancelAnimationFrame","requestAnimationFrame","afterTimeout","setTimeout","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","offset","push","substr","parentNode","parentElement","type","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","join","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","field","withEntities","hasAttribute","replaceContent","elem","lastChild","replaceWith"],"sourceRoot":""} \ No newline at end of file diff --git a/public/465.2835f5f68ad52a301caa.chunk.js b/public/465.2835f5f68ad52a301caa.chunk.js deleted file mode 100644 index b8240ff7..00000000 --- a/public/465.2835f5f68ad52a301caa.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[465],{9638:(e,t,n)=>{n.d(t,{Z:()=>p});var r=n(3910),i=n(2738),o=n(4541),a=n(4727),s=n(9518),d=n(3512),l=n(4494),c=n(6858);let u,g=!1;function p(e){g||(u||(u=s.Z.getConfig().then((e=>e.suggested_lang_code!==a.default.lastRequestedLangCode?Promise.all([e,a.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),a.default.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const s=[];n.forEach((e=>{const t=a.default.strings.get(e.key);t&&(s.push(t),a.default.strings.set(e.key,e))}));const u=(0,l.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),(0,o.Z)().then((()=>{window.requestAnimationFrame((()=>{e.append(u)}))})),d.default.addEventListener("language_change",(()=>{u.remove()}),{once:!0}),s.forEach((e=>{a.default.strings.set(e.key,e)})),(0,i.fc)(u,(e=>{(0,r.d)(e),g=!0,u.disabled=!0,(0,c.y7)(u),a.default.getLangPack(t.suggested_lang_code)}))}))}},4484:(e,t,n)=>{function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;rr})},8079:(e,t,n)=>{function r(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,{Z:()=>r})},8045:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(410),i=n(7487),o=n(9518);const a=new class{constructor(){this.serverTimeOffset=0,i.Z.get("server_time_offset").then((e=>{e&&(this.serverTimeOffset=e)})),o.Z.addTaskListener("applyServerTimeOffset",(e=>{this.serverTimeOffset=e.payload}))}};r.GO&&(r.GO.serverTimeManager=a);const s=a},4465:(e,t,n)=>{n.r(t),n.d(t,{default:()=>_});var r=n(9518),i=n(4874),o=n(8045),a=n(4159),s=n(4494),d=n(4727),l=n(4687),c=n(3512),u=n(6858),g=n(9638),p=n(5418),m=n(8079),f=n(4484);function h(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var y=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{d(r.next(e))}catch(e){o(e)}}function s(e){try{d(r.throw(e))}catch(e){o(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}d((r=r.apply(e,t||[])).next())}))};let v;const w=new i.Z("page-signQR",!0,(()=>v),(()=>{v||(v=y(void 0,void 0,void 0,(function*(){const e=w.pageEl.querySelector(".auth-image");let t=(0,u.y7)(e,!0);const i=document.createElement("div");i.classList.add("input-wrapper");const l=(0,s.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});i.append(l),(0,g.Z)(i);const _=e.parentElement,E=document.createElement("h4");(0,d._i18n)(E,"Login.QR.Title");const L=document.createElement("ol");L.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,d.i18n)(e)),L.append(t)})),_.append(E,L,i),l.addEventListener("click",(()=>{Promise.all([n.e(458),n.e(325),n.e(810)]).then(n.bind(n,810)).then((e=>e.default.mount())),S=!0}));const k=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let S=!1;c.default.addEventListener("user_auth",(()=>{S=!0,v=null}),{once:!0});let Z,P={ignoreErrors:!0};const O=i=>y(void 0,void 0,void 0,(function*(){try{let s=yield r.Z.invokeApi("auth.exportLoginToken",{api_id:a.Z.id,api_hash:a.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===s._&&(P.dcId||(P.dcId=s.dc_id,r.Z.setBaseDcId(s.dc_id)),s=yield r.Z.invokeApi("auth.importLoginToken",{token:s.token},P)),"auth.loginTokenSuccess"===s._){const e=s.authorization;return r.Z.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!Z||!(0,f.Z)(Z,s.token)){Z=s.token;let n=function(e){let t,n="";for(let r=e.length,i=0,o=0;o>>t&24),2!==t&&r-o!=1||(n+=String.fromCharCode(h(i>>>18&63),h(i>>>12&63),h(i>>>6&63),h(63&i)),i=0);return n.replace(/A(?=A$|$)/g,"=")}(s.token),r="tg://login?token="+(0,m.Z)(n,!0);const i=window.getComputedStyle(document.documentElement),o=i.getPropertyValue("--surface-color").trim(),a=i.getPropertyValue("--primary-text-color").trim(),d=i.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${d}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)}))})),c=new k({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:r,image:l,dotsOptions:{color:a,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:o},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,p.w)(1e3),new Promise((e=>{c._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield u.then((()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout((()=>{n.style.display=""}),150),setTimeout((()=>{n.style.animation=""}),500),t=void 0}else Array.from(e.children).slice(0,-1).forEach((e=>{e.remove()}))}))}if(i){let e=Date.now()/1e3,t=s.expires-e-o.Z.serverTimeOffset;yield(0,p.w)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,Promise.all([n.e(458),n.e(442)]).then(n.bind(n,9437)).then((e=>e.default.mount())),S=!0,v=null):(console.error("pageSignQR: default error:",e),S=!0),!0}return!1}));return()=>y(void 0,void 0,void 0,(function*(){for(S=!1;!S&&!(yield O(!0)););}))}))),v.then((e=>{e()})),l.default.pushToState("authState",{_:"authStateSignQr"})})),_=w}}]); -//# sourceMappingURL=465.2835f5f68ad52a301caa.chunk.js.map \ No newline at end of file diff --git a/public/465.2835f5f68ad52a301caa.chunk.js.map b/public/465.2835f5f68ad52a301caa.chunk.js.map deleted file mode 100644 index 5e98ca7d..00000000 --- a/public/465.2835f5f68ad52a301caa.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"465.2835f5f68ad52a301caa.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/mtproto/serverTimeManager.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.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 apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = 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;\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 btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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","/*\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 { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\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 type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\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 appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\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\nlet 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 let 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 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 apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await 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 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 let encoded = bytesToBase64(loginToken.token);\r\n let 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((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;\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((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 let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\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 console.warn('pageSignQR: 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>;\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 appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\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","bytesCmp","bytes1","bytes2","len","length","i","fixBase64String","str","toUrl","replace","serverTimeManager","constructor","this","serverTimeOffset","to","task","payload","uint6ToBase64","nUint6","imageDiv","pageEl","querySelector","preloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","_i18n","helpList","li","i18n","addEventListener","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","resolve","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","err","console","warn","handled","error","func","appStateManager"],"sourceRoot":""} \ No newline at end of file diff --git a/public/5.42c4ae7c503d2aa6aec3.chunk.js b/public/5.42c4ae7c503d2aa6aec3.chunk.js new file mode 100644 index 00000000..b0ac271d --- /dev/null +++ b/public/5.42c4ae7c503d2aa6aec3.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[5],Array(37).concat([function(e,t,s){"use strict";var i=s(30),a=s(171),n=s(59),r=s(52),o=s(145);function d(e){return e&&e.toLowerCase()||""}var c=s(58),l=s(92),h=s(84),u=s(118),p=s(128),g=s(16),f=s(32),m=s(43),v=s(78),_=s(31),y=s(15),I=s(132),S=s(64),P=s(47),M=s(40),b=s(17);const w=new class{constructor(){this.storage=b.default.storages.users,this.updateUsersStatuses=()=>{const e=Object(c.h)(!0);for(const t in this.users){const s=this.users[t];this.updateUserStatus(s,e)}},this.clear(!0),setInterval(this.updateUsersStatuses,6e4),y.default.addEventListener("state_synchronized",this.updateUsersStatuses),y.default.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,s=this.users[t];s&&(s.status=e.status,s.status&&("expires"in s.status&&(s.status.expires-=v.a.serverTimeOffset),"was_online"in s.status&&(s.status.was_online-=v.a.serverTimeOffset)),y.default.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(s))},updateUserPhoto:e=>{var t,s;const i=e.user_id,a=this.users[i];if(a){if((null===(t=a.photo)||void 0===t?void 0:t.photo_id)===(null===(s=e.photo)||void 0===s?void 0:s.photo_id))return;this.forceUserOnline(i,e.date),"userProfilePhotoEmpty"===e.photo._?delete a.photo:a.photo=Object(u.a)(a.photo,e.photo),this.setUserToStateIfNeeded(a),y.default.dispatchEvent("user_update",i),y.default.dispatchEvent("avatar_update",i.toPeerId())}else console.warn("No user by id:",i)},updateUserName:e=>{const t=e.user_id,s=this.users[t];s&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},s),{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),y.default.addEventListener("language_change",e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))}),b.default.getState().then(e=>{const t=b.default.storagesResults.users;if(t.length)for(let e=0,s=t.length;e{this.pushContact(e)}),s.length&&(this.contactsFillPromise=Object(r.a)(),this.contactsFillPromise.resolve(this.contactsList))),b.default.addEventListener("peerNeeded",e=>{if(!M.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})}),b.default.addEventListener("peerUnneeded",e=>{if(!M.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)})})}clear(e=!1){if(e)this.users={},this.usernames={};else{const e=b.default.storagesResults.users;for(const t in this.users){if(!t)continue;const s=t.toPeerId();if(!b.default.isPeerNeeded(s)){const s=this.users[t];s.username&&delete this.usernames[d(s.username)],e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.users[t]}}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1}onContactsModified(){const e=[...this.contactsList];b.default.pushToState("contactsList",e)}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=Object(r.a)();return f.a.invokeApi("contacts.getContacts").then(e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach(e=>{this.pushContact(e.user_id)}),this.onContactsModified(),this.contactsFillPromise=t),t.resolve(this.contactsList)},()=>{this.updatedContactsList=!1}),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){return"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase(),this.usernames[e]?Promise.resolve(this.users[this.usernames[e]]):f.a.invokeApi("contacts.resolveUsername",{username:e}).then(e=>(this.saveApiUsers(e.users),P.a.saveApiChats(e.chats),M.a.getPeer(M.a.getPeerId(e.peer))))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),b.default.requestPeerSingle(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),b.default.releaseSinglePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];if(!t)return"";return[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?g.default.format("SavedMessages",!0):"",t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" ")}getContacts(e,t=!1,s="name"){return this.fillContacts().promise.then(i=>{let a=[...i];if(e){const t=this.contactsIndex.search(e);a=[...a].filter(e=>t.has(e))}"name"===s?a.sort((e,t)=>{const s=(this.users[e]||{}).sortName||"",i=(this.users[t]||{}).sortName||"";return s.localeCompare(i)}):"online"===s&&a.sort((e,t)=>{const s=w.getUserStatusForSort(w.getUser(e).status);return w.getUserStatusForSort(w.getUser(t).status)-s});const r=y.default.myId.toUserId();return Object(n.a)(a,r),t&&this.testSelfSearch(e)&&a.unshift(r),a})}getContactsPeerIds(e,t,s){return this.getContacts(e,t,s).then(e=>e.map(e=>e.toPeerId(!1)))}toggleBlock(e,t){return f.a.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:M.a.getInputPeerById(e)}).then(s=>(s&&S.a.processLocalUpdate({_:"updatePeerBlocked",peer_id:M.a.getOutputPeer(e),blocked:t}),s))}testSelfSearch(e){const t=this.getSelf(),s=this.createSearchIndex();return s.indexObject(t.id,this.getUserSearchText(t.id)),s.search(e).has(t.id)}createSearchIndex(){return new I.a({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiUser(e,t)))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=d(t.username);delete this.usernames[e]}if(e.username){const t=d(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var s,i;if("userEmpty"===e._)return;const a=e.id,n=this.users[a];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;if(this.setUserNameToCache(e,n),n&&void 0!==n.initials&&void 0!==n.sortName&&n.first_name===e.first_name&&n.last_name===e.last_name)e.sortName=n.sortName,e.initials=n.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(o.b)(t,!1),e.initials=_.a.getAbbreviation(t)}e.status&&(e.status.expires&&(e.status.expires-=v.a.serverTimeOffset),e.status.was_online&&(e.status.was_online-=v.a.serverTimeOffset));let r=!1,d=!1;if(void 0===n)this.users[a]=e;else{e.first_name===n.first_name&&e.last_name===n.last_name&&e.username===n.username||(d=!0);(null===(s=n.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(r=!0);const t=!!n.pFlags.contact,o=!!e.pFlags.contact;Object(u.a)(n,e),y.default.dispatchEvent("user_update",a),t!==o&&this.onContactUpdated(a,o,t)}r&&y.default.dispatchEvent("avatar_update",e.id.toPeerId()),d&&y.default.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){b.default.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}formatUserPhone(e){return"+"+Object(l.a)(e).formatted}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return Object(h.a)(e)?e:this.users[e]||{id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(y.default.myId)}getUserStatusString(e){var t;let s,i;switch(e){case m.d:s="Peer.RepliesNotifications";break;case m.e:s="Peer.ServiceNotifications";break;default:{if(this.isBot(e)){s="Bot";break}const a=this.getUser(e);if(!a){s="";break}if(a.pFlags.support){s="SupportStatus";break}switch(null===(t=a.status)||void 0===t?void 0:t._){case"userStatusRecently":s="Lately";break;case"userStatusLastWeek":s="WithinAWeek";break;case"userStatusLastMonth":s="WithinAMonth";break;case"userStatusOffline":{const e=a.status.was_online,t=new Date,n=(t.getTime()/1e3|0)-e;if(n<60)s="Peer.Status.justNow";else if(n<3600){s="Peer.Status.minAgo";i=[n/60|0]}else if(n<86400&&t.getDate()===new Date(1e3*e).getDate()){s="LastSeen.HoursAgo";i=[n/3600|0]}else{s="Peer.Status.LastSeenAt";const{dateEl:t,timeEl:a}=Object(c.e)(e);i=[t,a]}break}case"userStatusOnline":s="Online";break;default:s="ALongTimeAgo"}break}}return Object(g.i18n)(s,i)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e.toPeerId()!==y.default.myId}hasUser(e,t){const s=this.users[e];return Object(h.a)(s)&&(t||!s.pFlags.min)}canSendToUser(e){const t=this.getUser(e);return!t.pFlags.deleted&&t.id.toPeerId()!==m.d}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=Object(c.h)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(S.a.updatesState.syncLoading)return;const i=this.getUser(e);i&&i.status&&"userStatusOnline"!==i.status._&&"userStatusEmpty"!==i.status._&&!i.pFlags.support&&!i.pFlags.deleted&&(i.status={_:"userStatusOnline",expires:s+60},y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(i))}importContact(e,t,s){return this.importContacts([{first_name:e,last_name:t,phones:[s]}]).then(e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]})}importContacts(e){const t=[];for(let s=0;s{this.saveApiUsers(e.users);return e.imported.map(e=>(this.onContactUpdated(e.user_id,!0),e.user_id))})}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=b.default.getState().then(t=>{const s=t.topPeersCache[e];return s&&s.cachedTime+864e5>Date.now()&&s.peers?s.peers:f.a.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then(s=>{let i=[];return"contacts.topPeers"===s._&&(this.saveApiUsers(s.users),P.a.saveApiChats(s.chats),s.categories.length&&(i=s.categories[0].peers.map(e=>{const t=M.a.getPeerId(e.peer);return b.default.requestPeer(t,"topPeer"),{id:t,rating:e.rating}}))),t.topPeersCache[e]={peers:i,cachedTime:Date.now()},b.default.pushToState("topPeersCache",t.topPeersCache),i})})}getBlocked(e=0,t=0){return f.a.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then(e=>{this.saveApiUsers(e.users),P.a.saveApiChats(e.chats);return{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map(e=>e.id.toPeerId()).concat(e.chats.map(e=>e.id.toPeerId(!0)))}})}getLocated(e,t,s,i=!1,a=0){const n={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:s};return f.a.invokeApi("contacts.getLocated",{geo_point:n,background:i}).then(e=>(S.a.processUpdateMessage(e),e))}searchContacts(e,t=20){const s=_.a.parseEntities(e);if(s.length&&s[0].length===e.trim().length&&"messageEntityUrl"===s[0]._)try{const t=new URL(_.a.wrapUrl(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return f.a.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then(e=>{this.saveApiUsers(e.users),P.a.saveApiChats(e.chats);return{my_results:Object(a.a)(e.my_results.map(e=>M.a.getPeerId(e))),results:e.results.map(e=>M.a.getPeerId(e))}})}onContactUpdated(e,t,s=this.isContact(e)){t!==s&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),y.default.dispatchEvent("contacts_update",e))}updateUsername(e){return f.a.invokeApi("account.updateUsername",{username:e}).then(e=>{this.saveApiUser(e)})}setUserStatus(e,t){if(this.isBot(e))return;const s=this.users[e];if(s){const i=t?{_:"userStatusOffline",was_online:Object(c.h)(!0)}:{_:"userStatusOnline",expires:Object(c.h)(!0)+50};s.status=i,y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s)}}addContact(e,t,s,i,a){return f.a.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:s,phone:i,add_phone_privacy_exception:a}).then(t=>{S.a.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)})}deleteContacts(e){return f.a.invokeApi("contacts.deleteContacts",{id:e.map(e=>this.getUserInput(e))}).then(t=>{S.a.processUpdateMessage(t,{override:!0}),e.forEach(e=>{this.onContactUpdated(e,!1)})})}isRestricted(e){const t=this.getUser(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&Object(p.c)(s))}};i.a.appUsersManager=w;t.a=w},,function(e,t,s){"use strict";var i=s(83),a=s(119),n=s(52),r=s(58),o=s(110),d=s(66),c=s(16),l=s(41),h=s(32),u=s(160),p=s(78),g=s(31),f=s(15),m=s(132),v=s(146),_=s(43),y=s(2),I=s(103),S=s(67),P=s(59),M=s(147),b=s(174),w=s(118);class C{constructor(e,t,s,i,a,n,r,o,d,c){this.appMessagesManager=e,this.appChatsManager=t,this.appPeersManager=s,this.appUsersManager=i,this.appDraftsManager=a,this.appNotificationsManager=n,this.appStateManager=r,this.apiUpdatesManager=o,this.serverTimeManager=d,this.appMessagesIdsManager=c,this.folders={},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach(e=>{var t;const{folder_id:s,peer:i}=e,a=this.appPeersManager.getPeerId(i),n=this.dropDialog(a)[0];n&&((null===(t=n.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(n,s),n.folder_id=s,this.generateIndexForDialog(n),this.pushDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(a,n)})},this.onUpdateDialogPinned=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(i);a&&(e.pFlags.pinned?a.pFlags.pinned=!0:this.handleDialogUnpinning(a,s),this.generateIndexForDialog(a)),this.appMessagesManager.scheduleHandleNewDialogs(i,a)},this.onUpdatePinnedDialogs=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=e=>{this.pinnedOrders[s].length=0,e.reverse(),e.forEach(e=>{a[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))});const t=this.getFolderDialogs(s,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;a[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},a={};e.order?i(e.order.map(e=>this.appPeersManager.getPeerId(e.peer))):h.a.invokeApi("messages.getPinnedDialogs",{folder_id:s}).then(e=>{this.applyDialogs(e),i(e.dialogs.map(e=>e.peerId))})},this.storage=this.appStateManager.storages.dialogs,this.dialogs=this.storage.getCache(),this.clear(!0),f.default.addEventListener("language_change",()=>{const e=i.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=s.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}});const l=e=>{const t=this.getCachedDialogs(!1);for(let s=0;s{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),s="index_"+e.orderIndex;for(let e=0;e{this.processDialogForFilters(e)}),f.default.addEventListener("chat_update",e=>{const t=this.appChatsManager.getChat(e),s=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(s)&&this.dropDialogOnDeletion(s)}),f.default.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),r.getState().then(e=>{this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]);const t=r.storagesResults.dialogs;t.length&&I.a.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{}})}setDialogsFromState(e){for(let t=0,s=e.length;tvoid 0===e.migratedTo):s.dialogs}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,s){var i;let a;if(this.appMessagesManager.filtersStorage.testDialogForFilter(e,s)){const t=s.pinnedPeerIds.indexOf(e.peerId);a=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(s.pinned_peers.length-1-t),!0):(null===(i=e.pFlags)||void 0===i?void 0:i.pinned)?this.generateIndexForDialog(e,!0):e.index}return e[t]=a}getDialog(e,t,s=!0){const i=[];void 0===t?i.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):i.push(this.getFolderDialogs(t,!1));for(let t of i){let i=0,a=0;for(let n=t.length;it.peerId===e.peerId),n=i[a],r=n&&n[s],o=this.setDialogIndexInFilter(e,s,t);r!==o&&((!r&&o||a&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==a&&i.splice(a,1),o&&Object(M.a)(i,e,s,-1))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],s=this.appMessagesManager.filtersStorage.filters;for(const i in s){const a=s[i];this.appMessagesManager.filtersStorage.testDialogForFilter(e,a)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(a.id,e))}return()=>t.forEach(e=>e())}prepareFolderUnreadCountModifyingByDialog(e,t,s){const i=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===s)return()=>{const s=this.appMessagesManager.getDialogUnreadCount(t),a=s-i,n=s&&!i||!s&&i?i?-1:1:0;this.modifyFolderUnreadCount(e,a,n)};this.modifyFolderUnreadCount(e,s?i:-i,i?s?1:-1:0)}modifyFolderUnreadCount(e,t,s){if(!t&&!s)return;const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t)),s&&(i.unreadDialogsCount=Math.max(0,i.unreadDialogsCount+s)),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=y.a.setTimeout(()=>{i.dispatchUnreadTimeout=void 0,f.default.dispatchEvent("folder_unread",i)},0))}generateIndexForDialog(e,t=!1,s){var i;let a,n=0;if(e.pFlags.pinned&&!t)n=this.generateDialogPinnedDate(e),a=!0;else{s||(s=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),n=s.date||n;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!n||e.date&&e.date>n)&&(n=e.date)}"draftMessage"===(null===(i=e.draft)||void 0===i?void 0:i._)&&e.draft.date>n&&(n=e.draft.date)}n||(n=Object(r.h)(!0));const o=this.generateDialogIndex(n,a);if(t)return o;e.index=o}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],s=t.indexOf(e.peerId);let i=s;return-1===s&&(i=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(i)}setDialogToState(e){const{peerId:t,pts:s}=e,i=this.appMessagesManager.getHistoryStorage(t),a=this.appMessagesManager.getMessagesStorage(t),n=i.history.slice;let r;for(let e=0,s=n.length;ee.peerId===n);if(-1!==o&&r.splice(o,1),this.dialogs[n]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(i){const e=this.dialogsOffsetDate[void 0];(!e||t{"dialogFolder"===t._&&e.dialogs.splice(s,1)}),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach(e=>{const s=this.appPeersManager.getPeerId(e.peer);let i=e.top_message;const a=this.appMessagesManager.pendingTopMsgs[s];a&&(!i||this.appMessagesManager.getMessageByPeer(s,a).date>this.appMessagesManager.getMessageByPeer(s,i).date)&&(e.top_message=i=a,this.appMessagesManager.getHistoryStorage(s).maxId=a),i||e.draft&&"draftMessage"===e.draft._?(this.saveDialog(e),t[s]=e):this.dropDialogWithEvent(s);const n=this.appMessagesManager.newUpdatesAfterReloadToHandle[s];if(void 0!==n){for(const e of n)n.delete(e),this.apiUpdatesManager.saveUpdate(e);n.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[s]}}),Object.keys(t).length&&f.default.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){return this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message).date||0}saveDialog(e,t,s,i){var a,n;void 0===t&&(t=null!==(a=e.folder_id)&&void 0!==a?a:0);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const o=this.appPeersManager.isChannel(r)?r.toChatId():_.c;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left||e.pFlags.kicked)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const c=this.getDialogOnly(r);let l,h;if(e.top_message){l=this.appMessagesIdsManager.generateMessageId(e.top_message);const t=(null==c?void 0:c.top_message)&&this.appMessagesManager.getMessageByPeer(r,c.top_message);(null===(n=null==t?void 0:t.pFlags)||void 0===n?void 0:n.is_outgoing)&&c.top_message>=l&&(l=c.top_message),h=this.appMessagesManager.getMessageByPeer(r,l)}else l=this.appMessagesManager.generateTempMessageId(r),h={_:"message",id:l,mid:l,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([h],{isOutgoing:!0});if((null==h?void 0:h.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,h),!o&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const s=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=s,this.appMessagesManager.migratedToFrom[s]=r,e.migratedTo=s}}if(e.top_message=l,e.read_inbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_inbox_max_id?c.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_outbox_max_id?c.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=c?c.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,h.pFlags.is_outgoing){const t=h.pFlags.out;l>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(h.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete h.pFlags.unread}const u=this.appMessagesManager.getHistoryStorage(r),p=u.history.slice;if(p.length){if(!p.isEnd(v.a.Bottom)){u.history.insertSlice([l]).setEnd(v.a.Bottom),u.count||(u.count=1),this.appMessagesManager.mergeReplyKeyboard(u,h)&&f.default.dispatchEvent("history_reply_markup",{peerId:r})}}else u.history.unshift(l),u.count||(u.count=1),this.appMessagesManager.mergeReplyKeyboard(u,h)&&f.default.dispatchEvent("history_reply_markup",{peerId:r});u.maxId=l,u.readMaxId=e.read_inbox_max_id,u.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),o&&e.pts&&this.apiUpdatesManager.addChannelState(o,e.pts),this.generateIndexForDialog(e),Object(b.a)(e,["index_0","index_1","index_2","index_3","index_4","index_5","index_6","index_7","index_8","index_9","index_10"]),c&&Object(w.a)(c,e),this.pushDialog(e,h.date,s,i)}getDialogIndexKey(e){return e>1?"index_"+this.appMessagesManager.filtersStorage.getFilter(e).orderIndex:"index"}getDialogs(e="",t,s=20,i=0,a=!1){const n={};if(i>1){const r=[],o=this.appUsersManager.fillContacts();o.cached||r.push(o.promise);const d=this.appMessagesManager.filtersStorage.reloadMissingPeerIds(i);if(d&&r.push(d),r.length)return n.cached=!1,n.promise=Promise.all(r).then(()=>this.getDialogs(e,t,s,i,a).promise),n}const r=i>1||this.getOffsetDate(i)?void 0:i;let o=this.getFolderDialogs(i,a);const d=this.getDialogIndexKey(i);if(e){if(!s||this.cachedResults.query!==e||this.cachedResults.folderId!==i){this.cachedResults.query=e,this.cachedResults.folderId=i;const t=this.dialogsIndex.search(e),s=[];for(const e in this.dialogs){const a=this.dialogs[e];t.has(a.peerId)&&a.folder_id===i&&s.push(a)}s.sort((e,t)=>t[d]-e[d]),this.cachedResults.dialogs=s,this.cachedResults.count=s.length}o=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(t>0)for(let e=o.length;co[c][d]);++c);const l=this.isDialogsLoaded(r),h=o.length>=c+s;if(e||l||h){const i=o.slice(c,c+s);return n.cached=!0,n.promise=Promise.resolve({dialogs:i,count:l?o.length:null,isTopEnd:o.length&&(i[0]&&i[0]===o[0]||o[0][d]=o.length}),n}return n.cached=!1,n.promise=this.appMessagesManager.getTopMessages(s,r).then(e=>{if(a&&(o=this.getFolderDialogs(i,a)),c=0,t>0)for(let e=o.length;co[c][d]);++c);const n=o.slice(c,c+s);return{dialogs:n,count:void 0===e.count?o.length:e.count,isTopEnd:o.length&&(n[0]&&n[0]===o[0]||o[0][d]{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=1,e.order.forEach((e,t)=>{const s=this.filters[e];delete s.orderIndex,this.setOrderIndex(s)}),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)},this.clear(!0),this.filters={},this.appStateManager.getState().then(e=>{Object(w.a)(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}),r.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=Object(k.a)(this.filters);this.getDialogFilters(!0).then(e=>{for(const s in t){const t=+s;e.find(e=>e.id===t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map(e=>e.id)})})},updateDialogFilterOrder:this.onUpdateDialogFilterOrder})}clear(e=!1){e?(this.filters={},this.reloadedPeerIds=new Set):(Object(w.a)(this.filters,{}),this.reloadedPeerIds.clear()),this.orderIndex=1}testDialogForFilter(e,t){const s=e.peerId;if(!this.appMessagesManager.getDialogOnly(s))return!1;if(t.excludePeerIds.includes(s))return!1;if(t.includePeerIds.includes(s))return!0;const i=t.pFlags;if(i.exclude_archived&&1===e.folder_id)return!1;if(i.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(i.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(s)&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(s)){if(i.broadcasts&&this.appPeersManager.isBroadcast(s))return!0;if(i.groups&&this.appPeersManager.isAnyGroup(s))return!0}else{const e=s.toUserId();if(this.appUsersManager.isBot(e))return!!i.bots;if(i.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(i.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}toggleDialogPin(e,t){const s=this.filters[t],i=s.pinnedPeerIds.indexOf(e),a=-1!==i;if(a&&(s.pinned_peers.splice(i,1),s.pinnedPeerIds.splice(i,1)),!a){if(s.pinned_peers.length>=this.rootScope.config.pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});s.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),s.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(s)}createDialogFilter(e,t){const s=Math.max(1,...Object.keys(this.filters).map(e=>+e));return(e=Object(k.a)(e)).id=s+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,s=!1){const i=t?0:1;return h.a.invokeApi("messages.updateDialogFilter",{flags:i,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then(i=>{if(i&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),s)){const t=[];for(const e in this.filters){const s=this.filters[e];++s.orderIndex,t.push(s)}e.orderIndex=1;const s=t.sort((e,t)=>e.orderIndex-t.orderIndex).map(e=>e.id);this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:s})}return i})}getOutputDialogFilter(e){const t=Object(k.a)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){Object(S.a)(e.includePeerIds,(t,s)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(s,1),e.includePeerIds.splice(s,1))})}reloadMissingPeerIds(e,t="pinned_peers"){const s=[],i=this.getFilter(e),a=i&&i[t];if(null==a?void 0:a.length){const e=a.filter((e,t)=>{const s=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(s)&&!this.appMessagesManager.getDialogOnly(s)});if(e.length){const t=e.map(e=>{const t=this.appPeersManager.getPeerId(e),s=this.appMessagesManager.reloadConversation(e);return s.then(()=>{this.reloadedPeerIds.add(t)}),s}),i=Promise.all(t);s.push(i)}}return s.length?Promise.all(s):void 0}getDialogFilters(e=!1){return E(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length&&!e)return t.map(e=>this.filters[e]).sort((e,t)=>e.orderIndex-t.orderIndex);const s=yield h.a.invokeApiSingle("messages.getDialogFilters");for(const t of s)this.saveDialogFilter(t,e);return s}))}saveDialogFilter(e,t=!0){A.forEach(([t,s])=>{e[s]=e[t].map(e=>this.appPeersManager.getPeerId(e))}),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const s=this.filters[e.id];s?Object.assign(s,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var T=s(64),U=s(47),F=s(68),O=s(73),x=s(40),j=s(56),L=s(148),R=s(17),B=s(37),N=s(178),H=s(134),G=s(122),z=s(60),q=s(30),W=s(109),V=s(49),$=s(161),K=s(99),Q=s(190),J=s(124),Y=s(24),X=s(111),Z=s(79),ee=s(100),te=s(179),se=s(191),ie=s(137),ae=s(104),ne=s(128),re=s(152),oe=s(85),de=s(184),ce=s(123);var le=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const he=new class{constructor(){this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new i.a(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=Object(l.b)("MESSAGES",l.a.Error|l.a.Debug|l.a.Log|l.a.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,f.default.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const s in t){const i=t[s];i?(this.dialogsStorage.pushDialog(i),x.a.isChannel(s.toPeerId())||(e=Math.max(e,i.top_message||0))):(this.reloadConversation(s.toPeerId()),delete t[s])}0!==e&&this.incrementMaxSeenId(e),f.default.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{window.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId();if(f.default.peerId===t&&!f.default.idle.isIDLE)continue;const s=this.notificationsToHandle[t];this.getNotifyPeerSettings(t).then(({muted:e,peerTypeNotifySettings:t})=>{const i=s.topMessage;!e&&i.pFlags.unread&&i.pFlags.unread&&this.notifyAboutMessage(i,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})})}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,s=this.pendingByRandomId[t];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s,o=ee.a.generateMessageId(e.id),d=this.getMessageFromStorage(r,o);d.deleted?this.pendingByMessageId[o]=t:([this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)}),this.finalizePendingMessageCallbacks(r,a,d))}},this.onUpdateNewMessage=e=>{var t;const s=e.message,i=this.getMessagePeer(s),a=this.getMessagesStorage(i),n=this.getDialogOnly(i),r="updateNewDiscussionMessage"===e._;this.saveMessages([s],{storage:new Map});const o=this.getThreadKey(s),d=o?+o.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[i]&&this.threadsStorage[i][d]){const e={_:"updateNewDiscussionMessage",message:s};this.onUpdateNewMessage(e)}if(!n&&!r){let s=!0;if(i.isAnyChat()&&(s=U.a.isInChat(i.toChatId())),s){const s=null!==(t=this.newUpdatesAfterReloadToHandle[i])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[i]=new Set;if(s.has(e))return void this.log.error("here we go again",i);e.ignoreExisting=!0,s.add(e),this.scheduleHandleNewDialogs(i)}return}this.saveMessages([s],{storage:a});const c=this.checkPendingMessage(s),l=this.getHistoryStorage(i,r?d:void 0);r||this.updateMessageRepliesIfNeeded(s);const h=e.ignoreExisting;if(!!l.history.findSlice(s.mid)){if(!h)return!1}else{const e=l.history.first;if(e.isEnd(v.a.Bottom)){let t=0;for(const i=e.length;te[t]);++t);e.splice(t,0,s.mid)}else l.history.unshift(s.mid);null!==l.count&&l.count++}this.mergeReplyKeyboard(l,s)&&f.default.dispatchEvent("history_reply_markup",{peerId:i});const u=s.fromId;if(u.isUser()&&!s.pFlags.out&&s.from_id){B.a.forceUserOnline(u,s.date);const e={_:"sendMessageCancelAction"};let t;t=i.isUser()?{_:"updateUserTyping",action:e,user_id:u}:x.a.isChannel(i)?{_:"updateChannelUserTyping",action:e,channel_id:i.toChatId(),from_id:x.a.getOutputPeer(u),top_msg_id:d?ee.a.getServerMessageId(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:i.toChatId(),from_id:x.a.getOutputPeer(u)},T.a.processLocalUpdate(t)}if(c||this.handleNewMessage(i,s.mid),r)return;const p=!s.pFlags.out&&s.pFlags.unread;if(n){if(p&&s.mid>n.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(n);++n.unread_count,s.pFlags.mentioned&&(++n.unread_mentions_count,this.modifyCachedMentions(i,s.mid,!0)),e()}s.mid>=n.top_message&&this.setDialogTopMessage(s,n)}if(p){const e=i;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:_.c}),t.fromId!==u&&(t.fromId=u,t.fwdCount=0),s.fwd_from&&++t.fwdCount,t.topMessage=s,this.notificationsHandlePromise||(this.notificationsHandlePromise=window.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{var t,s,i;const{peer:a,msg_id:n,reactions:r}=e,o=ee.a.generateMessageId(n),d=x.a.getPeerId(a),c=this.getMessageByPeer(d,o);if("message"!==c._)return;const l=null==r?void 0:r.recent_reactions;if((null==l?void 0:l.length)&&c.pFlags.out){const e=l[l.length-1],t=c.reactions,s=null==t?void 0:t.recent_reactions;x.a.getPeerId(e.peer_id)===f.default.myId||s&&!(s.length<=l.length)||s&&Object(oe.a)(e,s[s.length-1])||this.getNotifyPeerSettings(d).then(({muted:t,peerTypeNotifySettings:s})=>{!t&&s.show_previews&&this.notifyAboutMessage(c,{userReaction:e,peerTypeNotifySettings:s})})}const h=null!==(t=null==r?void 0:r.results)&&void 0!==t?t:[],u=null!==(i=null===(s=c.reactions)||void 0===s?void 0:s.results)&&void 0!==i?i:[],p=h.filter(e=>{const t=u.find(t=>t.reaction===e.reaction);return c.pFlags.out&&(!t||e.count>t.count)||e.pFlags.chosen&&(!t||!t.pFlags.chosen)});c.reactions=r,f.default.dispatchEvent("message_reactions",{message:c,changedResults:p}),e.local||this.setDialogToStateIfMessageIsTop(c)},this.onUpdateDialogUnreadMark=e=>{const t=x.a.getPeerId(e.peer.peer),s=this.getDialogOnly(t);if(s){const i=this.dialogsStorage.prepareDialogUnreadCountModifying(s);e.pFlags.unread?s.pFlags.unread_mark=!0:delete s.pFlags.unread_mark,i(),f.default.dispatchEvent("dialogs_multiupdate",{[t]:s}),this.dialogsStorage.setDialogToState(s)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=ee.a.generateMessageId(t.id),a=this.getMessagesStorage(s);if(!a.has(i))return;const n=this.getMessageFromStorage(a,i);this.saveMessages([t],{storage:a});const r=this.getMessageFromStorage(a,i);this.handleEditedMessage(n,r);const o=this.getDialogOnly(s),d=o&&o.top_message===i;if(t.clear_history)d&&f.default.dispatchEvent("dialog_flush",{peerId:s});else{if("message"===(null==n?void 0:n._)&&!Object(oe.a)(n.reactions,r.reactions)){const e=r.reactions;return r.reactions=n.reactions,void T.a.processLocalUpdate({_:"updateMessageReactions",peer:x.a.getOutputPeer(s),msg_id:t.id,reactions:e})}if(f.default.dispatchEvent("message_edit",{storage:a,peerId:s,mid:i}),d||t.grouped_id){const e={};e[s]=o,f.default.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}}},this.onUpdateReadHistory=e=>{const t=e.channel_id,s=ee.a.generateMessageId(e.max_id||e.read_max_id),i=ee.a.generateMessageId(e.top_msg_id),a=t?t.toPeerId(!0):x.a.getPeerId(e.peer),n="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getMessagesStorage(a),o=Object(re.a)(r,"desc"),d=this.getDialogOnly(a),c=e.still_unread_count;let l=0,h=0,u=!1;const p=this.getHistoryStorage(a,i);if(a.isUser()&&n&&B.a.forceUserOnline(a),i){const e=this.threadsToReplies[a+"_"+i];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}const g=!i&&d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);for(let e=0,t=o.length;es)continue;const p=r.get(t);if(p.pFlags.out===n){if(!p.pFlags.unread)break;if(i){const e=p.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==i)continue}p.pFlags.unread&&(delete p.pFlags.unread,u||(u=!0),p.pFlags.out||i||!d||(void 0===c&&(l=--d.unread_count),p.pFlags.mentioned&&(h=--d.unread_mentions_count,this.modifyCachedMentions(a,p.mid,!1))),W.a.cancel("msg"+t))}}if(n?p.readOutboxMaxId=s:p.readMaxId=s,!i&&d){if(n?d.read_outbox_max_id=s:d.read_inbox_max_id=s,!n){let e;void 0!==c?e=c:l<0||!this.getReadMaxIdIfUnread(a)?e=0:l&&d.top_message>s&&(e=l),void 0!==e&&(d.unread_count=e),(h<0||!d.unread_count)&&(d.unread_mentions_count=0)}g&&g(),this.dialogsStorage.processDialogForFilters(d),f.default.dispatchEvent("dialog_unread",{peerId:a}),this.dialogsStorage.setDialogToState(d)}if(u&&f.default.dispatchEvent("messages_read"),!i&&t){const e=a+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,s]=this.threadsToReplies[t].split("_");f.default.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+s))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,s=e.messages.map(e=>ee.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;for(let e=0,t=s.length;e{const t=e.channel_id.toPeerId(!0),s=this.getHistoryStorage(t).history.slice,i=ee.a.generateMessageId(e.available_min_id),a=s.filter(e=>e<=i);e.messages=a,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,s=e.messages.map(e=>ee.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;if(!i)return;h.a.clearCache("messages.getSearchCounters",e=>x.a.getPeerId(e.peer)===i);const a=new Set;for(const e of s){const t=this.getMessageByPeer(i,e),s=this.getThreadKey(t);s&&this.threadsStorage[i]&&this.threadsStorage[i][+s.split("_")[1]]&&a.add(s)}const n=this.handleDeletedMessages(i,this.getMessagesStorage(i),s),r=Array.from(a).map(e=>{const[t,s]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+s)}),o=this.getHistoryStorage(i);[o].concat(r).forEach(e=>{for(const t of n.msgs)e.history.delete(t);n.count&&e.count&&(e.count=Math.max(0,e.count-n.count))}),f.default.dispatchEvent("history_delete",{peerId:i,msgs:n.msgs});const d=this.getDialogOnly(i);if(d){const e=n.unreadMentions||n.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);if(n.unread&&(d.unread_count=Math.max(0,d.unread_count-n.unread)),n.unreadMentions&&(d.unread_mentions_count=d.unread_count?Math.max(0,d.unread_mentions_count-n.unreadMentions):0),e&&(t(),f.default.dispatchEvent("dialog_unread",{peerId:i})),n.msgs.has(d.top_message)){const e=o.history.first;if(e.isEnd(v.a.Bottom)&&e.length){const t=e[0],s=this.getMessageByPeer(i,t);this.setDialogTopMessage(s,d)}else this.reloadConversation(i)}}},this.onUpdateChannel=e=>{const t=e.channel_id,s=t.toPeerId(!0),i=U.a.getChat(t),a=U.a.isInChat(t);(!!i.username||!i.pFlags.left)!==(void 0!==this.historiesStorage[s])&&(delete this.historiesStorage[s],f.default.dispatchEvent("history_forbidden",s));!!this.getDialogOnly(s)!==a&&(a?this.reloadConversation(s):this.dialogsStorage.dropDialogOnDeletion(s)),f.default.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then(()=>{f.default.dispatchEvent("history_reload",t)})},this.onUpdateChannelMessageViews=e=>{const t=e.views,s=e.channel_id.toPeerId(!0),i=ee.a.generateMessageId(e.id),a=this.getMessageByPeer(s,i);!a.deleted&&void 0!==a.views&&a.views{const t=_.e,s=t,i=this.generateTempMessageId(s),a={_:"message",id:i,from_id:x.a.getOutputPeer(t),peer_id:x.a.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||Object(r.h)(!0))+p.a.serverTimeOffset,message:e.message,media:e.media,entities:e.entities};B.a.hasUser(t)||B.a.saveApiUsers([{_:"user",id:t,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([a],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=i,this.onUpdateNewMessage({_:"updateNewMessage",message:a,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,s=t?t.toPeerId(!0):x.a.getPeerId(e.peer),i=e.messages.map(e=>ee.a.generateMessageId(e)),a=this.getMessagesStorage(s),n=i.filter(e=>!a.has(e));(n.length?Promise.all(n.map(e=>this.wrapSingleMessage(s,e))):Promise.resolve()).finally(()=>{var t;const n=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(n)for(const e of i){a.get(e).pFlags.pinned=!0}else for(const e of i){delete a.get(e).pFlags.pinned}delete this.pinnedMessages[s],R.default.getState().then(e=>{delete e.hiddenPinnedMessages[s],f.default.dispatchEvent("peer_pinned_messages",{peerId:s,mids:i,pinned:n})})})},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:s}=e;if("notifyPeer"===t._){const e=x.a.getPeerId(t.peer),i=this.getDialogOnly(e);i&&(i.notify_settings=s,f.default.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=this.scheduledMessagesStorage[s];if(i){const e=ee.a.generateMessageId(t.id),a=this.getMessageFromStorage(i,e);this.saveMessages([t],{storage:i,isScheduled:!0});const n=this.getMessageFromStorage(i,e);if(a.deleted){this.checkPendingMessage(t)||f.default.dispatchEvent("scheduled_new",{peerId:s,mid:t.mid})}else this.handleEditedMessage(a,n),f.default.dispatchEvent("message_edit",{storage:i,peerId:s,mid:t.mid})}},this.onUpdateDeleteScheduledMessages=e=>{const t=x.a.getPeerId(e.peer),s=this.scheduledMessagesStorage[t];if(s){const i=e.messages.map(e=>ee.a.generateMessageId(e));this.handleDeletedMessages(t,s,i),f.default.dispatchEvent("scheduled_delete",{peerId:t,mids:i})}},this.clear(),f.default.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages}),f.default.addEventListener("notify_peer_type_settings",({key:e,settings:t})=>{let s;s="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>e.peerId.isBroadcast():e=>x.a.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(s).forEach(e=>{f.default.dispatchEvent("dialog_notify_settings",e)})}),f.default.addEventListener("webpage_updated",({id:e,msgs:t})=>{t.forEach(({peerId:t,mid:s,isScheduled:i})=>{const a=i?this.getScheduledMessagesStorage(t):this.getMessagesStorage(t),n=this.getMessageFromStorage(a,s);n&&(n.media={_:"messageMediaWebPage",webpage:N.a.getWebPage(e)},f.default.dispatchEvent("message_edit",{storage:a,peerId:t,mid:s}))})}),f.default.addEventListener("draft_updated",({peerId:e,threadId:t,draft:s})=>{if(t)return;const i=this.getDialogOnly(e);if(i){if(!t){i.draft=s;let t=!1;s||ee.a.getServerMessageId(i.top_message)?(this.dialogsStorage.generateIndexForDialog(i),this.dialogsStorage.pushDialog(i)):(this.dialogsStorage.dropDialog(e),t=!0),f.default.dispatchEvent("dialog_draft",{peerId:e,dialog:i,drop:t,draft:s,index:i.index})}}else this.reloadConversation(e)}),f.default.addEventListener("poll_update",({poll:e})=>{const t=L.a.pollToMessages[e.id];if(t)for(const e of t){const[t,s]=e.split("_"),i=this.getMessageByPeer(t.toPeerId(),+s);this.setDialogToStateIfMessageIsTop(i)}}),R.default.getState().then(e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)})}clear(){this.middleware?this.middleware.clean():this.middleware=Object(X.a)(),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(),this.filtersStorage&&this.filtersStorage.clear()}construct(){this.filtersStorage=new D(this,x.a,B.a,W.a,R.default,T.a,f.default),this.dialogsStorage=new C(this,U.a,x.a,B.a,H.a,W.a,R.default,T.a,p.a,ee.a)}getInputEntities(e){const t=Object(k.a)(e);return t.forEach(e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=B.a.getUserInput(e.user_id))}),t}invokeAfterMessageIsSent(e,t,s){var i,a;const r=null!==(i=this.tempFinalizeCallbacks[e])&&void 0!==i?i:this.tempFinalizeCallbacks[e]={},o=null!==(a=r[t])&&void 0!==a?a:r[t]={deferred:Object(n.a)()};return o.callback=s,o.deferred}editMessage(e,t,s={}){const{mid:i,peerId:a}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(i,"edit",e=>this.editMessage(e,t,s));let n=s.entities||[];t&&(t=g.a.parseMarkdown(t,n));const r=s.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return h.a.invokeApi("messages.editMessage",{peer:x.a.getInputPeerById(a),id:e.id,message:t,media:s.newMedia,entities:n.length?this.getInputEntities(n):void 0,no_webpage:s.noWebPage,schedule_date:r}).then(e=>{T.a.processUpdateMessage(e)},e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0})}sendText(e,t,s={}){if(!t.trim())return Promise.resolve();s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId);const i=f.default.config.message_length_max;if(t.length>i){const a=function e(t,s){if(t.length{let d=t.slice(a,o);const c=n++;if(d.length>s){e(d.slice(s),s).forEach(e=>{r[n++]=e}),d=d.slice(0,s)}a=o,i=0,r[c]=(r[c]||"")+d};let d=0;for(;;){let e=t.indexOf(" ",d);if(-1===e){d!==t.length-1&&o();break}e+=" ".length;const a=e-d;i+a>s&&o(i),d=e,i+=a}return r}(t,i);t=a[0],a.length>1&&delete s.webPage;for(let t=1;t{this.sendText(e,a[t],s)},t)}e=x.a.getPeerMigratedTo(e)||e;let a=s.entities||[];s.viaBotId||(t=g.a.parseMarkdown(t,a));let n=this.getInputEntities(a);n.length||(n=void 0);const r=this.generateOutgoingMessage(e,s);r.entities=a,r.message=t;const o=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0,d=x.a.isChannel(e);s.webPage&&(r.media={_:"messageMediaWebPage",webpage:s.webPage});const c=e=>{e?r.error=!0:delete r.error,f.default.dispatchEvent("messages_pending")};return r.send=()=>{c(!1);const i={};this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId);const a=s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0;let l;return l=s.viaBotId?h.a.invokeApiAfter("messages.sendInlineBotResult",{peer:x.a.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,send_as:a},i):h.a.invokeApiAfter("messages.sendMessage",{no_webpage:s.noWebPage,peer:x.a.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:n,clear_draft:s.clearDraft,schedule_date:s.scheduleDate||void 0,silent:s.silent,send_as:a},i),this.pendingAfterMsgs[e]=i,l.then(e=>{if("updateShortSentMessage"===e._){const t=r.promise;delete r.promise;const i=Object(k.a)(r);r.promise=t,i.date=e.date,i.id=e.id,i.media=e.media,i.entities=e.entities,this.wrapMessageEntities(i),e.pFlags.out&&(i.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:i.id},{_:s.scheduleDate?"updateNewScheduledMessage":d?"updateNewChannelMessage":"updateNewMessage",message:i,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)});T.a.processUpdateMessage(e),r.promise.resolve()},e=>{c(!0),r.promise.reject(e)}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(r,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),r.promise}sendFile(e,t,s={}){e=x.a.getPeerMigratedTo(e)||e;const i=this.generateOutgoingMessage(e,s),r=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0;let d,c;const l="mime_type"in t?t.mime_type:t.type,u=t instanceof File?t.name:"",p=!(t instanceof File||t instanceof Blob);let m=s.caption||"";this.log("sendFile",t,l);const v=s.entities||[];m&&(m=g.a.parseMarkdown(m,v));const _=[],y=te.a.has(l);let I,S,P;if(p)d="document",c="";else if(0===l.indexOf("audio/")||["video/ogg"].indexOf(l)>=0){d="audio",c="audio."+("ogg"===l.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",s.isVoiceMessage&&(d="voice",i.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:s.isVoiceMessage},waveform:s.waveform,duration:s.duration||0};_.push(e)}else if(s.isMedia)if(y){d="photo",c="photo."+l.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:s.width,h:s.height,type:"full",location:null,size:t.size};I={_:"photo",id:""+i.id,sizes:[e],w:s.width,h:s.height};const a=O.a.getCacheContext(I,e.type);a.downloaded=t.size,a.url=s.objectURL||"",I=j.a.savePhoto(I)}else if(se.a.has(l)){d="video",c="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:s.isRoundMessage,supports_streaming:!0},duration:s.duration,w:s.width,h:s.height};_.push(e),s.noSound&&t.size>10240&&t.size<10485760&&_.push({_:"documentAttributeAnimated"})}else d="document",c="document."+l.split("/")[1],P="sendMessageUploadDocumentAction";else d="document",c="document."+l.split("/")[1],P="sendMessageUploadDocumentAction";if(_.push({_:"documentAttributeFilename",file_name:u||c}),-1!==["document","video","audio","voice"].indexOf(d)&&!p){const e=[];S={_:"document",id:""+i.id,duration:s.duration,attributes:_,w:s.width,h:s.height,thumbs:e,mime_type:l,size:t.size};const a=O.a.getCacheContext(S);let n;if(a.downloaded=t.size,a.url=s.objectURL||"",y)_.push({_:"documentAttributeImageSize",w:s.width,h:s.height}),n={_:"photoSize",w:s.width,h:s.height,type:"full",size:t.size};else if("video"===d&&s.thumb){n={_:"photoSize",w:s.thumb.size.width,h:s.thumb.size.height,type:"local-thumb",size:s.thumb.blob.size};const e=O.a.getCacheContext(S,n.type);e.downloaded=n.size,e.url=s.thumb.url}n&&e.push(n),S=F.a.saveDoc(S)}this.log("sendFile",d,c,t.type,s);const M=p?void 0:new a.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),b=Object(n.a)();M&&(M.attachPromise(b),b.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",b.reject(e)},b.catch(t=>{"AbortError"!==t.name||k||(this.log("cancelling upload",w),this.cancelPendingMessage(i.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),(null==E?void 0:E.cancel)&&E.cancel())}));const w=p?void 0:{_:I?"messageMediaPhoto":"messageMediaDocument",pFlags:{},preloader:M,photo:I,document:S,promise:b};i.entities=v,i.message=m,i.media=p?{_:"messageMediaDocument",pFlags:{},document:t}:w;const C=e=>{e?i.error=!0:delete i.error,f.default.dispatchEvent("messages_pending")};let k=!1,E=null;return i.send=()=>{if(p){const{id:e,access_hash:s,file_reference:i}=t,a={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:s,file_reference:i}};b.resolve(a)}else if(t instanceof File||t instanceof Blob){const a=()=>{let a;return k&&!i.error||(k=!1,E=O.a.upload(t),b.notifyAll({done:0,total:t.size})),"video"===d&&s.objectURL&&(a=new Promise((e,t)=>{(s.thumb&&s.thumb.blob?Promise.resolve(s.thumb):Object(o.a)(s.objectURL)).then(s=>{s?O.a.upload(s.blob).then(e,t):e(null)},t)})),E&&E.then(e=>le(this,void 0,void 0,(function*(){let t;switch(delete i.media.preloader,e.name=c,k=!0,d){case"photo":t={_:"inputMediaUploadedPhoto",file:e};break;default:t={_:"inputMediaUploadedDocument",file:e,mime_type:l,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0},attributes:_}}if(a)try{const e=yield a;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(t)})),()=>{C(!0)}),E.addNotifyListener(t=>{const s=Math.max(1,Math.floor(100*t.done/t.total));P&&this.setTyping(e,{_:P,progress:0|s}),b.notifyAll(t)}),b};s.isGroupedItem?a():this.sendSmthLazyLoadQueue.push({load:a})}return b},this.beforeMessageSending(i,{isGroupedItem:s.isGroupedItem,isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),s.isGroupedItem||(b.then(t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),h.a.invokeApi("messages.sendMedia",{background:s.background,peer:x.a.getInputPeerById(e),media:t,message:m,random_id:i.random_id,reply_to_msg_id:r,schedule_date:s.scheduleDate,silent:s.silent,entities:v,clear_draft:s.clearDraft,send_as:s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0}).then(e=>{T.a.processUpdateMessage(e)},e=>{if("photo"===d&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,d="document",void i.send();throw C(!0),e}))),b.then(i.promise.resolve,i.promise.reject)),{message:i,promise:b}}sendAlbum(e,t,s={}){return le(this,void 0,void 0,(function*(){if(s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},s),s.sendFileDetails[0]));e=x.a.getPeerMigratedTo(e)||e;const i=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0;let a=s.caption||"",r=s.entities||[];a&&(a=g.a.parseMarkdown(a,r)),this.log("sendAlbum",t,s);const o=""+ ++this.groupedTempId,d=t.map((t,n)=>{const d=s.sendFileDetails[n],c=Object.assign({isGroupedItem:!0,isMedia:s.isMedia,scheduleDate:s.scheduleDate,silent:s.silent,replyToMsgId:i,threadId:s.threadId,sendAsPeerId:s.sendAsPeerId,groupId:o},d);return 0===n&&(c.caption=a,c.entities=r),this.sendFile(e,t,c).message});s.clearDraft&&setTimeout(()=>{H.a.clearDraft(e,s.threadId)},0);const c=(e,t)=>{t?e.error=!0:delete e.error,f.default.dispatchEvent("messages_pending")},l=x.a.getInputPeerById(e),u=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const a=Object(n.a)();return this.sendSmthLazyLoadQueue.push({load:()=>h.a.invokeApi("messages.sendMultiMedia",{peer:l,multi_media:t,reply_to_msg_id:i,schedule_date:s.scheduleDate,silent:s.silent,clear_draft:s.clearDraft,send_as:s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0}).then(e=>{T.a.processUpdateMessage(e),a.resolve()},e=>{d.forEach(e=>c(e,!0)),a.reject(e)})}),a},p=d.map(e=>e.send().then(e=>h.a.invokeApi("messages.uploadMedia",{peer:l,media:e})).then(t=>{let s;if("messageMediaPhoto"===t._){const e=j.a.savePhoto(t.photo);s=j.a.getMediaInput(e)}else if("messageMediaDocument"===t._){const e=F.a.saveDoc(t.document);s=F.a.getMediaInput(e)}const i={_:"inputSingleMedia",media:s,random_id:e.random_id,message:a,entities:r};return a&&(a="",r=[]),i}).catch(t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),c(e,!0),t}));return Promise.all(p).then(e=>u(e.filter(Boolean)))}))}sendContact(e,t){return this.sendOther(e,B.a.getContactMediaInput(t))}sendOther(e,t,s={}){var i;e=x.a.getPeerMigratedTo(e)||e;const a=this.generateOutgoingMessage(e,s),n=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+a.id;t.poll.id=e,L.a.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:s,results:i}=L.a.getPoll(e);r={_:"messageMediaPoll",poll:s,results:i};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:j.a.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:F.a.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(i=t.user_id)&&void 0!==i?i:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:s.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:s.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}a.media=r;return a.send=()=>{const i={};this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0;let o;return o=s.viaBotId?h.a.invokeApiAfter("messages.sendInlineBotResult",{peer:x.a.getInputPeerById(e),random_id:a.random_id,reply_to_msg_id:n||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent,send_as:r},i):h.a.invokeApiAfter("messages.sendMedia",{peer:x.a.getInputPeerById(e),media:t,random_id:a.random_id,reply_to_msg_id:n||void 0,message:"",clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent,send_as:r},i),this.pendingAfterMsgs[e]=i,o.then(e=>{e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)}),T.a.processUpdateMessage(e)},e=>{f.default.dispatchEvent("messages_pending")}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(a,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),a.promise}beforeMessageSending(e,t={}){const s=e.id,i=this.getMessagePeer(e),a=t.isScheduled?this.getScheduledMessagesStorage(i):this.getMessagesStorage(i);if(t.isScheduled)this.saveMessages([e],{storage:a,isScheduled:!0,isOutgoing:!0}),setTimeout(()=>{f.default.dispatchEvent("scheduled_new",{peerId:i,mid:s})},0);else{const n=[this.getHistoryStorage(i),t.threadId?this.getHistoryStorage(i,t.threadId):void 0];for(const e of n)e&&e.history.unshift(s);this.saveMessages([e],{storage:a,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout(()=>{f.default.dispatchEvent("history_append",{storage:a,peerId:i,mid:s})},0)}this.pendingByRandomId[e.random_id]={peerId:i,tempId:s,threadId:t.threadId,storage:a},!t.isGroupedItem&&e.send&&setTimeout(()=>{t.clearDraft&&H.a.clearDraft(i,t.threadId),e.send()},0)}generateOutgoingMessage(e,t){let s;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const i=x.a.isBroadcast(e);if(i){if(x.a.getPeer(e).pFlags.signatures){const e=B.a.getSelf();s=e.first_name+(e.last_name?" "+e.last_name:"")}}return{_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?x.a.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:x.a.getOutputPeer(e),post_author:s,pFlags:this.generateFlags(e),date:t.scheduleDate||Object(r.h)(!0)+p.a.serverTimeOffset,message:"",grouped_id:t.groupId,random_id:Object(d.b)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:i&&1,pending:!0,promise:void 0===t.groupId?Object(n.a)():void 0}}generateReplyHeader(e,t){const s={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&s.reply_to_msg_id!==t&&(s.reply_to_top_id=t),s}generateReplies(e){let t;if(x.a.isBroadcast(e)){const s=z.default.getCachedFullChat(e.toChatId());(null==s?void 0:s.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:s.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return e.isAnyChat()&&(e.isBroadcast()||this.isAnonymousSending(e))?void 0:x.a.getOutputPeer(B.a.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==B.a.getSelf().id&&(t.out=!0,x.a.isChannel(e)||B.a.isBot(e)||(t.unread=!0)),x.a.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const s=B.a.getSelf().id.toPeerId(),i=t.fromId;if(i===s&&t.peerId===s&&!t.fwd_from)return;const a={_:"messageFwdHeader",flags:0,date:t.date};let n=!1;if(t.fwd_from)a.from_id=t.fwd_from.from_id,a.from_name=t.fwd_from.from_name,a.post_author=t.fwd_from.post_author;else{if(a.post_author=t.post_author,i.isUser()){const e=z.default.getCachedFullUser(i.toUserId());(null==e?void 0:e.private_forward_name)&&(a.from_name=e.private_forward_name,n=!0)}n||(a.from_id=x.a.getOutputPeer(i))}return x.a.isBroadcast(t.peerId)&&(t.post_author&&(a.post_author=t.post_author),a.channel_post=t.id),e!==s||n||(a.saved_from_msg_id=t.id,a.saved_from_peer=x.a.getOutputPeer(t.peerId)),a}generateFakeAvatarMessage(e,t){const s=Number.MAX_SAFE_INTEGER,i={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:s,peer_id:x.a.getOutputPeer(e),mid:s,peerId:e,date:t.date,fromId:e};return this.getMessagesStorage(e).set(s,i),i}isAnonymousSending(e){var t,s;return e.isAnyChat()&&(null===(s=null===(t=x.a.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){if(t){t.top_message=e.mid;this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t)}}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:s,tempId:i,storage:a}=t,n=this.getHistoryStorage(s);return T.a.processLocalUpdate({_:"updateDeleteMessages",messages:[i],pts:void 0,pts_count:void 0}),n.history.delete(i),delete this.pendingByRandomId[e],a.delete(i),!0}return!1}fillConversations(){return le(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(void 0);){const t=yield this.getTopMessages(100,void 0);if(!e()||t.isEnd)break}}))}getConversations(e="",t,s,i=0,a){return this.dialogsStorage.getDialogs(e,t,s,i,a)}getReadMaxIdIfUnread(e,t){var s;const i=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),a=Math.max(null!==(s=t.readMaxId)&&void 0!==s?s:0,i.readMaxId);return!this.getMessageByPeer(e,i.maxId).pFlags.out&&a{if(!a()||"messages.dialogsNotModified"===r._)return null;q.b&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),s||void 0===t||this.dialogsStorage.resetPinnedOrder(t),s||Y.default.setAuthorized(!0),B.a.saveApiUsers(r.users),U.a.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!s,d=!1;const c={},l=void 0===t?0:t,h=void 0===t;Object(S.a)(r.dialogs,e=>{void 0===e.folder_id&&(e.folder_id=l),this.dialogsStorage.saveDialog(e,void 0,!0,h),o||x.a.isChannel(e.peerId||x.a.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(i&&e.index>i&&(this.scheduleHandleNewDialogs(e.peerId,e),d=!0),ee.a.getServerMessageId(e.read_inbox_max_id)||ee.a.getServerMessageId(e.read_outbox_max_id)||(c[e.peerId]=e,this.log.error("noIdsDialogs",e,n)))});const u=Object.keys(c);if(u.length){const e=u.map(e=>e.toPeerId()),t=e.map(e=>this.reloadConversation(e));Promise.all(t).then(()=>{f.default.dispatchEvent("dialogs_multiupdate",c);for(let t=0;t=p||!r.dialogs.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),d?this.scheduleHandleNewDialogs():f.default.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,y=100===e?_:_.slice(0,e);return{isEnd:v&&y[y.length-1]===_[_.length-1],count:p,dialogs:y}})}forwardMessages(e,t,s,i={}){e=x.a.getPeerMigratedTo(e)||e;for(let a=0,n=(s=s.slice().sort((e,t)=>e-t)).length;a{var n,r,o;const d=this.getMessageByPeer(t,s),c=this.generateOutgoingMessage(e,i),l=["entities","media"];i.dropAuthor||(c.fwd_from=this.generateForwardHeader(e,d),l.push("views","forwards"),(null===(n=c.fwd_from)||void 0===n?void 0:n.from_name)&&e===f.default.myId&&delete c.from_id),i.dropCaptions&&d.media||l.push("message"),l.forEach(e=>{c[e]=d[e]});const h=null===(r=c.media)||void 0===r?void 0:r.document;if(h){["round","voice"].includes(h.type)&&(c.pFlags.media_unread=!0)}if(d.grouped_id){(null!==(o=a[d.grouped_id])&&void 0!==o?o:a[d.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(c)}return c});for(const e in a){const t=a[e];t.messages.length>1&&t.messages.forEach(e=>{e.grouped_id=t.tempId})}n.forEach(e=>{this.beforeMessageSending(e,{isScheduled:!!i.scheduleDate||void 0})});const r={};this.pendingAfterMsgs[e]&&(r.afterMessageId=this.pendingAfterMsgs[e].messageId);const o=h.a.invokeApiAfter("messages.forwardMessages",{from_peer:x.a.getInputPeerById(t),id:s.map(e=>ee.a.getServerMessageId(e)),random_id:n.map(e=>e.random_id),to_peer:x.a.getInputPeerById(e),with_my_score:i.withMyScore,silent:i.silent,schedule_date:i.scheduleDate,drop_author:i.dropAuthor,drop_media_captions:i.dropCaptions,send_as:i.sendAsPeerId?x.a.getInputPeerById(i.sendAsPeerId):void 0},r).then(e=>{this.log("forwardMessages updates:",e),T.a.processUpdateMessage(e)}).finally(()=>{this.pendingAfterMsgs[e]===r&&delete this.pendingAfterMsgs[e]});return this.pendingAfterMsgs[e]=r,o}generateEmptyMessage(e){return{_:"messageEmpty",id:ee.a.getServerMessageId(e),mid:e,deleted:!0,pFlags:{}}}getMessageFromStorage(e,t){return e&&e.get(t)||this.generateEmptyMessage(t)}createMessageStorage(){return new Map}getMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage()}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(x.a.isChannel(t.toPeerId()))continue;const s=this.messagesStorageByPeerId[t].get(e);if(s)return s}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&x.a.getPeerId(e.peer_id)||_.c}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}reloadConversation(e){let t;if(void 0!==e){const s=x.a.getPeerId(e);let i=this.reloadConversationsPeers.get(s);if(i&&(t=i.promise),t)return t;t=Object(n.a)(),this.reloadConversationsPeers.set(s,i={inputDialogPeer:x.a.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise((e,t)=>{setTimeout(()=>{const s=[],i={};for(const[e,{inputDialogPeer:t,promise:a}]of this.reloadConversationsPeers)s.push(t),i[e]=a;this.reloadConversationsPeers.clear();const a=()=>{for(const e in i)i[e].resolve(void 0)};h.a.invokeApi("messages.getPeerDialogs",{peers:s}).then(t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach(e=>{const t=e.peerId;t&&(i[t].resolve(e),delete i[t])}),a(),e()},e=>{a(),t(e)}).finally(()=>{this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()})},0)})),t||this.reloadConversationsPromise}doFlushHistory(e,t,s){return h.a.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:s,peer:e,max_id:0}).then(i=>(T.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:i.pts,pts_count:i.pts_count}}),!i.offset||this.doFlushHistory(e,t,s)))}flushHistory(e,t,s){return le(this,void 0,void 0,(function*(){if(x.a.isChannel(e)){const t=this.getHistory(e,0,1),s=t instanceof Promise?yield t:t,i=e.toChatId(),a=s.history[0]||0;return h.a.invokeApiSingle("channels.deleteHistory",{channel:U.a.getChannelInput(i),max_id:ee.a.getServerMessageId(a)}).then(e=>(e&&T.a.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:i,available_min_id:a}),e))}return this.doFlushHistory(x.a.getInputPeerById(e),t,s).then(()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach(t=>{delete t[e]});const s=this.needSingleMessages.get(e);if(s&&s.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach(t=>{const s=t[e];s&&s.clear()}),t)f.default.dispatchEvent("dialog_flush",{peerId:e});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}})}))}onPeerDeleted(e){}hidePinnedMessages(e){return Promise.all([R.default.getState(),this.getPinnedMessage(e)]).then(([t,s])=>{t.hiddenPinnedMessages[e]=s.maxId,f.default.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:s.maxId})})}getPinnedMessage(e){var t;const s=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return s.promise?s.promise:s.maxId?Promise.resolve(s):s.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then(e=>{var t;return s.count=e.count,s.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,s}).finally(()=>{delete s.promise})}updatePinnedMessage(e,t,s,i,a){return h.a.invokeApi("messages.updatePinnedMessage",{peer:x.a.getInputPeerById(e),unpin:s,silent:i,pm_oneside:a,id:ee.a.getServerMessageId(t)}).then(e=>{T.a.processUpdateMessage(e)})}unpinAllMessages(e){return h.a.invokeApiSingle("messages.unpinAllMessages",{peer:x.a.getInputPeerById(e)}).then(t=>{if(T.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),!t.offset){return this.getMessagesStorage(e).forEach(e=>{e.pFlags.pinned&&delete e.pFlags.pinned}),f.default.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0}return this.unpinAllMessages(e)})}getAlbumText(e){const t=this.groupedMessagesStorage[e];let s,i,a,n=0;for(const[e,r]of t)if(r.message){if(++n>1)break;s=r.message,i=r.totalEntities,a=r.entities}return n>1&&(s=void 0,i=void 0,a=void 0),{message:s,entities:a,totalEntities:i}}getGroupsFirstMessage(e){if(!e.grouped_id)return e;const t=this.groupedMessagesStorage[e.grouped_id];let s=Number.MAX_SAFE_INTEGER;for(const[e,i]of t)i.midl[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=ee.a.generateMessageId(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=ee.a.generateMessageId(e.reply_to.reply_to_top_id))),d&&e.replies&&(e.replies.max_id&&(e.replies.max_id=ee.a.generateMessageId(e.replies.max_id)),e.replies.read_max_id&&(e.replies.read_max_id=ee.a.generateMessageId(e.replies.read_max_id)));const h=!!a;h||(e.date-=p.a.serverTimeOffset);const u=B.a.getSelf().id.toPeerId(),g=d&&e.fwd_from;if(e.peerId=a,e.fromId=a===u?g?g.from_id?x.a.getPeerId(g.from_id):_.c:u:e.pFlags.post||!e.from_id?a:x.a.getPeerId(e.from_id),g){g.saved_from_msg_id&&(g.saved_from_msg_id=ee.a.generateMessageId(g.saved_from_msg_id)),g.channel_post&&(g.channel_post=ee.a.generateMessageId(g.channel_post));const t=g.saved_from_peer||g.from_id,s=g.saved_from_msg_id||g.channel_post;if(t&&s){const i=x.a.getPeerId(t),a=ee.a.generateMessageId(s);e.savedFrom=i+"_"+a}e.fwdFromId=x.a.getPeerId(g.from_id),h||(g.date-=p.a.serverTimeOffset)}const f={type:"message",peerId:a,messageId:c};if(d&&e.media){let s=!1;switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?s=!0:e.media.photo=j.a.savePhoto(e.media.photo,f),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=L.a.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":if(e.media.ttl_seconds)s=!0;else{const t=e.media.document;e.media.document=F.a.saveDoc(t,f),e.media.document||"documentEmpty"===t._||(s=!0)}break;case"messageMediaWebPage":{const s=N.a.getMessageKeyForPendingWebPage(a,c,t.isScheduled);e.media.webpage=N.a.saveWebPage(e.media.webpage,s,f);break}case"messageMediaInvoice":s=!0,e.media={_:"messageMediaUnsupported"};break;case"messageMediaUnsupported":s=!0}s&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities)}if(!d&&e.action){const t=e.action;let s,n;const d=e.fromId===B.a.getSelf().id?"You":"";switch(t.photo&&(t.photo=j.a.savePhoto(t.photo,f)),t.document&&(t.document=F.a.saveDoc(t.photo,f)),t._){case"messageActionChatEditPhoto":(null===(i=t.photo)||void 0===i?void 0:i.video_sizes)?t._=o?"messageActionChannelEditVideo":"messageActionChatEditVideo":o&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;ie.a.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",o||(e+="_by"+d),t.type=e;break}case"messageActionChatEditTitle":o&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":o&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+d:"messageActionChatReturn"+d)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+d);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),n=a;break;case"messageActionChatMigrateTo":s=a,n=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&n&&!this.migratedFromTo[s]&&!this.migratedToFrom[n]&&this.migrateChecks(s,n)}d&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),n.set(c,e)}saveMessages(e,t={}){e.saved||(e.saved=!0,e.forEach(e=>{this.saveMessage(e,t)}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=g.a.fixEmoji(e.message,t);const s=g.a.parseEntities(e.message);e.totalEntities=g.a.mergeEntities(t,s)}wrapMessageForReply(e,t=e.message,s,i,a,n){const r=[];let o=!1;const d=(e,t)=>{if(e){if(void 0===t&&o)return;t=i?c.default.format(e,!0):Object(c.i18n)(e)}if(i)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}},l=this.isRestricted(e);let h=e.totalEntities;if(e.media&&!l){Object(Z.a)(e);let a=!0;if(e.grouped_id){if(s){const t=this.getMidsByMessage(e);if(s.length===t.length){for(const e of t)if(!s.includes(e)){a=!1;break}}else a=!1}if(a){const s=this.getAlbumText(e.grouped_id);t=s.message,h=s.totalEntities,n||(d("AttachAlbum"),o=!0)}}else a=!1;if(!a&&!n||!t){const s=e.media;switch(s._){case"messageMediaPhoto":d("AttachPhoto");break;case"messageMediaDice":d(void 0,i?s.emoticon:g.a.wrapEmojiText(s.emoticon));break;case"messageMediaVenue":t=s.title,d("AttachLocation");break;case"messageMediaGeo":d("AttachLocation");break;case"messageMediaGeoLive":d("AttachLiveLocation");break;case"messageMediaPoll":d(void 0,i?"📊 "+(s.poll.question||"poll"):s.poll.rReply);break;case"messageMediaContact":d("AttachContact");break;case"messageMediaGame":{const e="🎮 "+s.game.title;d(void 0,i?e:g.a.wrapEmojiText(e));break}case"messageMediaDocument":{const e=s.document;if("video"===e.type)d("AttachVideo");else if("voice"===e.type)d("AttachAudio");else if("gif"===e.type)d("AttachGif");else if("round"===e.type)d("AttachRound");else if("sticker"===e.type)e.stickerEmojiRaw&&d(void 0,(i?e.stickerEmojiRaw:e.stickerEmoji)+" "),d("AttachSticker"),t="";else if("audio"===e.type){const t=e.attributes.find(e=>"documentAttributeAudio"===e._&&(e.title||e.performer)),s="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);d(void 0,i?s:g.a.wrapEmojiText(s))}else d(void 0,i?e.file_name:g.a.wrapEmojiText(e.file_name));break}case"messageMediaUnsupported":d(c.UNSUPPORTED_LANG_PACK_KEY)}}const l=r.length;t&&l&&r.push(", ")}if(e.action){const t=this.wrapMessageActionTextNew(e,i);t&&d(void 0,t)}if(l&&(t=Object(ne.a)(e.restriction_reason).text,h=[]),t)if(t=Object(ce.a)(t,100),h||(h=[]),i)r.push(g.a.wrapPlainText(t,h));else{if(a){a=a.trim();let e,s=!1,i=new RegExp(Object(de.a)(a),"gi");for(;null!==(e=i.exec(t));)h.push({_:"messageEntityHighlight",length:a.length,offset:e.index}),s=!0;s&&g.a.sortEntities(h)}const e=g.a.wrapRichText(t,{noLinebreaks:!0,entities:h,noLinks:!0,noTextFormat:!0});r.push(Object($.a)(e))}if(i)return r.join("");{const e=document.createDocumentFragment();return e.append(...r),e}}wrapSenderToPeer(e){const t=document.createElement("span");t.classList.add("sender-title");const s=e.fromId===f.default.myId&&e.peerId!==f.default.myId;if(t.append(s?Object(c.i18n)("FromYou"):new V.a(Object.assign(Object.assign({},this.getMessageSenderPeerIdOrName(e)),{dialog:e.peerId===f.default.myId})).element),x.a.isAnyGroup(e.peerId)||s){const s=new V.a({peerId:e.peerId}).element;t.append(" ➝ ",s)}return t}getMessageSenderPeerIdOrName(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}wrapSentTime(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(Object(r.c)(new Date(1e3*e.date))),t}wrapJoinVoiceChatAnchor(e){const t=e.action,{onclick:s,url:i}=g.a.wrapUrl(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!s)return document.createElement("span");const a=document.createElement("a");return a.href=i,a.setAttribute("onclick",s+"(this)"),a}wrapMessageActionTextNewUnsafe(e,t){const s=t?void 0:document.createElement("span"),i="action"in e&&e.action;if(i.message){const e=i.message;return t?g.a.wrapPlainText(e):(s.innerHTML=g.a.wrapRichText(e,{noLinebreaks:!0}),s)}{let a,n,o=i._;const d=(e,t)=>t?x.a.getPeerTitle(e,t):new V.a({peerId:e}).element;switch(i._){case"messageActionPhoneCall":o+="."+i.type,n=[Object(Q.a)(i.duration,t)];break;case"messageActionGroupCall":o+="."+i.type,n=[],o.endsWith("You")||e.pFlags.post||n.push(d(e.fromId,t)),void 0!==i.duration?n.push(Object(Q.a)(i.duration,t)):n.push(this.wrapJoinVoiceChatAnchor(e));break;case"messageActionInviteToGroupCall":{const s=[e.fromId,i.users[0].toPeerId()];let r="Chat.Service.VoiceChatInvitation";const o=B.a.getSelf().id;s[0]===o?r+="ByYou":s[1]===o&&(r+="ForYou"),Object(P.a)(s,o),a=r,n=s.map(e=>d(e,t)),n.push(this.wrapJoinVoiceChatAnchor(e));break}case"messageActionGroupCallScheduled":{const s=new Date,o=new Date(1e3*i.schedule_date),l=(o.getTime()-s.getTime())/864e5,h=new Date(s);h.setDate(h.getDate()+1);const u=x.a.isBroadcast(e.peerId);a=u?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",n=[];const p=B.a.getSelf().id;e.fromId===p?a+="You":u||n.push(d(e.fromId,t));let g,f=[];l<1&&o.getDate()===s.getDate()?g="TodayAtFormattedWithToday":l<2&&o.getDate()===h.getDate()?g="Time.TomorrowAt":(g="formatDateAtTime",f.push(new c.default.IntlDateElement({date:o,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),f.push(Object(r.f)(o));const m=Object(c.i18n)(g,f);n.push(m);break}case"messageActionChatCreate":{const s=B.a.getSelf().id;e.fromId===s?o+="You":n=[d(e.fromId,t)];break}case"messageActionPinMessage":{const s=e.peerId,i=this.getMessageByPeer(s,e.reply_to_mid);if(n=[d(e.fromId,t)],i.deleted)a="ActionPinnedNoText",e.reply_to_mid&&this.fetchMessageReplyTo(e).then(t=>{t.deleted||e.deleted||(f.default.dispatchEvent("message_edit",{storage:this.getMessagesStorage(s),peerId:s,mid:e.mid}),this.isMessageIsTopMessage(e)&&f.default.dispatchEvent("dialogs_multiupdate",{[s]:this.getDialogOnly(s)}))});else{const e=document.createElement("i");e.dataset.savedFrom=i.peerId+"_"+i.mid,e.dir="auto",e.append(this.wrapMessageForReply(i,void 0,void 0,t)),n.push(e)}break}case"messageActionChatJoinedByRequest":{const s=x.a.isBroadcast(e.peerId);e.pFlags.out?a=s?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(a=s?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",n=[d(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":n=[d(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":n=[],"messageActionChatEditTitle"===i._&&n.push(d(e.fromId,t)),n.push(t?i.title:Object(K.a)(g.a.wrapEmojiText(i.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const s=i.users||[i.user_id];if(n=[d(e.fromId,t)],s.length>1){const e=Object(c.join)(s.map(e=>d(e.toPeerId(),t)),!1,t);if(t)n.push(...e);else{const t=document.createElement("span");t.append(...e),n.push(t)}}else n.push(d(s[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=g.a.wrapRichText(i.domain,{entities:[{_:"messageEntityUrl",length:i.domain.length,offset:0}]});n=[Object(K.a)(e)];break}default:a=c.langPack[o]||`[${i._}]`}return a||(a=c.langPack[o],void 0===a&&(a="["+o+"]")),t?c.default.format(a,!0,n):Object(c._i18n)(s,a,n)}}wrapMessageActionTextNew(e,t){try{return this.wrapMessageActionTextNewUnsafe(e,t)}catch(e){return this.log.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}}reportMessages(e,t,s,i){return h.a.invokeApiSingle("messages.report",{peer:x.a.getInputPeerById(e),id:t.map(e=>ee.a.getServerMessageId(e)),reason:{_:s},message:i})}startBot(e,t,s){const i=t?t.toPeerId(!0):e.toPeerId();if(s){const t=Object(d.b)();return h.a.invokeApi("messages.startBot",{bot:B.a.getUserInput(e),peer:x.a.getInputPeerById(i),random_id:t,start_param:s}).then(e=>{T.a.processUpdateMessage(e)})}if(t){let s;return s=U.a.isChannel(t)?U.a.inviteToChannel(t,[e]):U.a.addChatUser(t,e,0),s.catch(e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0}).then(()=>{const t=B.a.getUser(e);return this.sendText(i,"/start@"+t.username)})}return this.sendText(i,"/start")}editPeerFolders(e,t){h.a.invokeApi("folders.editPeerFolders",{folder_peers:e.map(e=>({_:"inputFolderPeer",peer:x.a.getInputPeerById(e),folder_id:t}))}).then(e=>{T.a.processUpdateMessage(e)})}toggleDialogPin(e,t){var s;if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!(null===(s=i.pFlags)||void 0===s?void 0:s.pinned)||void 0;if(a){const e=1===t?f.default.config.pinned_infolder_count_max:f.default.config.pinned_dialogs_count_max;if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return h.a.invokeApi("messages.toggleDialogPin",{peer:x.a.getInputDialogPeerById(e),pinned:a}).then(s=>{if(s){const s=a?{pinned:a}:{};T.a.saveUpdate({_:"updateDialogPinned",peer:x.a.getDialogPeer(e),folder_id:t,pFlags:s})}})}markDialogUnread(e,t){var s;const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!t&&!(null===(s=i.pFlags)||void 0===s?void 0:s.unread_mark)||void 0;return h.a.invokeApi("messages.markDialogUnread",{peer:x.a.getInputDialogPeerById(e),unread:a}).then(t=>{if(t){const t=a?{unread:a}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:x.a.getDialogPeer(e),pFlags:t})}})}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&U.a.hasChat(t.toChatId())){const s=U.a.getChat(e.toChatId());s&&s.migrated_to&&s.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,f.default.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){if(e.pFlags.is_outgoing)return!1;const s=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&s.push("messageMediaPoll"),!("message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===s.indexOf(e.media._)||e.fromId&&B.a.isBot(e.fromId))&&(!e.media||"messageMediaDocument"!==e.media._||!e.media.document.sticker&&"round"!==e.media.document.type)}canEditMessage(e,t="text"){var s;return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===B.a.getSelf().id||!(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date=t.mid)&&(!a.pFlags.selective&&(e.maxOutId&&t.midn.mid||t.pFlags.is_outgoing)&&t.message)return n.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return Object(Z.a)(t),!("messageActionChatDeleteUser"!==(null===(i=t.action)||void 0===i?void 0:i._)||!(n?t.action.user_id===n.fromId:B.a.isBot(t.action.user_id)))&&(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},!0)}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,s=!0){if(x.a.isRestricted(e))return Promise.resolve(t.map(e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})));return(s?h.a.invokeApiCacheable:h.a.invokeApi).bind(h.a)("messages.getSearchCounters",{peer:x.a.getInputPeerById(e),filters:t})}filterMessagesByInputFilter(e,t,s,i){const a=[];if(!t.length)return a;let n=!0;const r={},o=[],d=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,d.push("video");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,o.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,o.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,o.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,o.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:n=!1}if(!n)return a;for(let e=0,n=t.length;ee.includes(t._))||g.a.matchUrl(n.message))&&(c=!0)}}else r.avatar&&n.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(n.action._)&&(c=!0);if(c&&(a.push(n),a.length>=i))break}return a}getSearch({peerId:e,query:t,inputFilter:s,maxId:i,limit:a,nextRate:n,backLimit:r,threadId:o,folderId:d,minDate:c,maxDate:l}){if(x.a.isRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),s||(s={_:"inputMessagesFilterEmpty"}),void 0===a&&(a=20),n||(n=0),r||(r=0),c=c?c/1e3|0:0,l=l?l/1e3|0:0;let u=[];r&&(a+=r);let p;if(!e||r||i||t||1===a||o||(p=this.getHistoryStorage(e),u=this.filterMessagesByInputFilter(s._,p.history.slice,this.getMessagesStorage(e),a)),u.length){if(!(u.length{B.a.saveApiUsers(e.users),U.a.saveApiChats(e.chats),this.saveMessages(e.messages),q.b&&this.log("getSearch result:",s,e);const t=e.count||u.length+e.messages.length;return e.messages.forEach(e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=U.a.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}u.push(e)}),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:u}})}subscribeRepliesThread(e,t){const s=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===s)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const s=ee.a.getServerMessageId(Math.max(...this.getMidsByMessage(e))),i={_:"messageService",pFlags:{is_single:!0},id:ee.a.generateMessageId(s,!0),date:e.date,from_id:{_:"peerUser",user_id:_.c},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([i],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=i.mid}getDiscussionMessage(e,t){return h.a.invokeApiSingle("messages.getDiscussionMessage",{peer:x.a.getInputPeerById(e),msg_id:ee.a.getServerMessageId(t)}).then(s=>{var i;U.a.saveApiChats(s.chats),B.a.saveApiUsers(s.users),this.saveMessages(s.messages);const a=this.filterMessages(s.messages[0],e=>!!e.replies)[0],n=a.peerId+"_"+a.mid;this.generateThreadServiceStartMessage(a);const r=this.getHistoryStorage(a.peerId,a.mid);return s.max_id=r.maxId=ee.a.generateMessageId(s.max_id)||0,s.read_inbox_max_id=r.readMaxId=ee.a.generateMessageId(null!==(i=s.read_inbox_max_id)&&void 0!==i?i:a.mid),s.read_outbox_max_id=r.readOutboxMaxId=ee.a.generateMessageId(s.read_outbox_max_id)||0,this.threadsToReplies[n]=e+"_"+t,a})}handleNewMessage(e,t){void 0===this.newMessagesToHandle[e]&&(this.newMessagesToHandle[e]=new Set),this.newMessagesToHandle[e].add(t),this.newMessagesHandleTimeout||(this.newMessagesHandleTimeout=window.setTimeout(this.handleNewMessages,0))}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise(e=>{setTimeout(()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()},0)})}deleteMessages(e,t,s){var i,a;let n;const r=t.map(e=>ee.a.getServerMessageId(e));if(e.isAnyChat()&&x.a.isChannel(e)){const s=e.toChatId(),o=U.a.getChat(s);if(!o.pFlags.creator&&!(null===(a=null===(i=o.admin_rights)||void 0===i?void 0:i.pFlags)||void 0===a?void 0:a.delete_messages)&&!(t=t.filter(t=>!!this.getMessageByPeer(e,t).pFlags.out)).length)return;n=h.a.invokeApi("channels.deleteMessages",{channel:U.a.getChannelInput(s),id:r}).then(e=>{T.a.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:s,messages:t,pts:e.pts,pts_count:e.pts_count})})}else n=h.a.invokeApi("messages.deleteMessages",{revoke:s,id:r}).then(e=>{T.a.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})});return n}readHistory(e,t=0,s,i=!1){if(this.log("readHistory:",e,t,s),!this.getReadMaxIdIfUnread(e,s)&&!i)return this.log("readHistory: isn't unread"),Promise.resolve();const a=this.getHistoryStorage(e,s);if(a.triedToReadMaxId>=t)return Promise.resolve();let n;return s?(a.readPromise||(n=h.a.invokeApi("messages.readDiscussion",{peer:x.a.getInputPeerById(e),msg_id:ee.a.getServerMessageId(s),read_max_id:ee.a.getServerMessageId(t)})),T.a.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:s,read_max_id:t})):x.a.isChannel(e)?(a.readPromise||(n=h.a.invokeApi("channels.readHistory",{channel:U.a.getChannelInput(e.toChatId()),max_id:ee.a.getServerMessageId(t)})),T.a.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(a.readPromise||(n=h.a.invokeApi("messages.readHistory",{peer:x.a.getInputPeerById(e),max_id:ee.a.getServerMessageId(t)}).then(e=>{T.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),T.a.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:x.a.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),W.a.soundReset(x.a.getPeerString(e)),a.readPromise?a.readPromise:(a.triedToReadMaxId=t,n.finally(()=>{delete a.readPromise;const{readMaxId:i}=a;this.log("readHistory: promise finally",t,i),i>t&&this.readHistory(e,i,s,!0)}),a.readPromise=n)}readAllHistory(e,t,s=!1){const i=this.getHistoryStorage(e,t);i.maxId&&this.readHistory(e,i.maxId,t,s)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,s){const i=this.unreadMentions[e];i&&(s?i.first.isEnd(v.a.Top)&&i.insertSlice([t]):i.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const s=this.getDialogOnly(e);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const s=this.goToNextMentionPromises[e];if(s)return s;const i=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new v.b,a=i.length,n=i.first.isEnd(v.a.Top);if(!a&&n)return this.fixUnreadMentionsCountIfNeeded(e,i),Promise.resolve();let r=Promise.resolve();return!n&&a<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then(()=>{const t=i.last,s=t&&t[t.length-1];s?(i.delete(s),f.default.dispatchEvent("history_focus",{peerId:e,mid:s})):this.fixUnreadMentionsCountIfNeeded(e,i)}).finally(()=>{delete this.goToNextMentionPromises[e]})}loadNextMentions(e){const t=this.unreadMentions[e],s=t.first[0]||1;return this.getUnreadMentions(e,s,-50,50).then(e=>{this.mergeHistoryResult(t,e,1===s?0:s,50,-50)})}getUnreadMentions(e,t,s,i,a=0,n=0){return h.a.invokeApiSingle("messages.getUnreadMentions",{peer:x.a.getInputPeerById(e),offset_id:ee.a.getServerMessageId(t),add_offset:s,limit:i,max_id:ee.a.getServerMessageId(a),min_id:ee.a.getServerMessageId(n)}).then(e=>(Object(Z.a)(e),B.a.saveApiUsers(e.users),U.a.saveApiChats(e.chats),this.saveMessages(e.messages),e))}readMessages(e,t){if(!t.length)return Promise.resolve();let s,i;if(t=t.map(e=>ee.a.getServerMessageId(e)),e.isAnyChat()&&x.a.isChannel(e)){const a=e.toChatId();i={_:"updateChannelReadMessagesContents",channel_id:a,messages:t},s=h.a.invokeApi("channels.readMessageContents",{channel:U.a.getChannelInput(a),id:t})}else i={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},s=h.a.invokeApi("messages.readMessageContents",{id:t}).then(e=>{i.pts=e.pts,i.pts_count=e.pts_count,T.a.processLocalUpdate(i)});return T.a.processLocalUpdate(i),s}getHistoryStorage(e,t){var s,i;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(s=this.threadsStorage[e][t])&&void 0!==s?s:this.threadsStorage[e][t]={count:null,history:new v.b}):null!==(i=this.historiesStorage[e])&&void 0!==i?i:this.historiesStorage[e]={count:null,history:new v.b}}getNotifyPeerSettings(e){return Promise.all([W.a.getNotifyPeerTypeSettings(),W.a.getNotifySettings(x.a.getInputNotifyPeerById(e,!0))]).then(([t,s])=>({muted:W.a.isPeerLocalMuted(e,!0),peerTypeNotifySettings:s}))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let s="";if((null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())&&e.reply_to){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;s=e.peerId+"_"+t}return s}updateMessage(e,t,s){return this.wrapSingleMessage(e,t,!0).then(()=>{const i=this.getMessageByPeer(e,t);return s&&f.default.dispatchEvent(s,i),i})}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let s;if(t){const i=this.pendingByRandomId[t];(s=this.finalizePendingMessage(t,e))&&f.default.dispatchEvent("history_update",{storage:i.storage,peerId:e.peerId,mid:e.mid}),delete this.pendingByMessageId[e.mid]}return s}mutePeer(e,t){const s={_:"inputPeerNotifySettings"};return s.mute_until=t,W.a.updateNotifySettings({_:"inputNotifyPeer",peer:x.a.getInputPeerById(e)},s)}togglePeerMute(e,t){return void 0===t&&(t=!W.a.isPeerLocalMuted(e,!1)),this.mutePeer(e,t?_.b:0)}canSendToPeer(e,t,s="send_messages"){if(x.a.isRestricted(e))return!1;if(e.isAnyChat()){const i=U.a.getChat(e.toChatId());return U.a.hasRights(e.toChatId(),s,void 0,!!t)&&(!i.pFlags.left||!!t)}return B.a.canSendToUser(e)}finalizePendingMessage(e,t){const s=this.pendingByRandomId[e];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s;[this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)});const o=this.getMessageFromStorage(r,a);return o.deleted||(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),f.default.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,a,t),o}}finalizePendingMessageCallbacks(e,t,s){const i=this.tempFinalizeCallbacks[t];if(void 0!==i){for(const e in i){const{deferred:t,callback:a}=i[e];a(s).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(s.media){Object(Z.a)(s);const{photo:e,document:i}=s.media;if(e){const s=j.a.getPhoto(""+t);if(s){const t=e.sizes[e.sizes.length-1],i=O.a.getCacheContext(e,t.type),a=O.a.getCacheContext(s,"full");Object.assign(i,a);const n=e.sizes[e.sizes.length-1],r=j.a.getPhotoDownloadOptions(e,n),o=Object(G.a)(r.location);O.a.fakeDownload(o,a.url)}}else if(i){const e=F.a.getDoc(""+t);if(e&&e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type){const t=O.a.getCacheContext(i),s=O.a.getCacheContext(e);Object.assign(t,s);const a=F.a.getInputFileName(i);O.a.fakeDownload(a,s.url)}}else s.media.poll&&(delete L.a.polls[t],delete L.a.results[t])}const a=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(a,e),f.default.dispatchEvent("message_sent",{storage:e,tempId:t,tempMessage:a,mid:s.mid,message:s})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,R.default.pushToState("maxSeenMsgId",e),h.a.invokeApi("messages.receivedMessages",{max_id:ee.a.getServerMessageId(e)})}getMessageReactionsListAndReadParticipants(e,t,s,i,a,n){var r,o;const d={reactions:[],count:0,next_offset:void 0},c=this.canViewMessageReadParticipants(e);return c&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!c||s||a?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch(()=>[]),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!n?ae.a.getMessageReactionsList(e.peerId,e.mid,t,s,i).catch(e=>d):d]).then(([e,t])=>{const s=e.map(e=>e.toPeerId()),i=s.slice();Object(S.a)(i,(e,s,i)=>{t.reactions.some(t=>x.a.getPeerId(t.peer_id)===e)&&i.splice(s,1)});let a=t.reactions.map(e=>({peerId:x.a.getPeerId(e.peer_id),reaction:e.reaction}));return a=a.concat(i.map(e=>({peerId:e}))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:s,combined:a,nextOffset:t.next_offset}})}getMessageReadParticipants(e,t){return h.a.invokeApiSingle("messages.getMessageReadParticipants",{peer:x.a.getInputPeerById(e),msg_id:ee.a.getServerMessageId(t)}).then(e=>e.map(e=>e.toUserId()))}canViewMessageReadParticipants(e){if("message"!==e._||e.pFlags.is_outgoing||!e.pFlags.out||!x.a.isAnyGroup(e.peerId))return!1;return U.a.getChat(e.peerId.toChatId()).participants_countee.a.getServerMessageId(e)),increment:!0}).then(s=>{const i=new Array(t.length),a=e.toChatId();for(let e=0,n=t.length;e{f.default.dispatchEvent("history_focus",{peerId:s,mid:e.mid})},a.message=r,a.key="msg"+e.mid,a.tag=n,a.silent=!0;const o=x.a.getPeerPhoto(s);o?J.a.loadAvatar(s,o,"photo_small").loadPromise.then(s=>{(e.pFlags.unread||t.userReaction)&&(a.image=s,W.a.notify(a))}):W.a.notify(a)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage()}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return Promise.resolve([]);const t=this.getScheduledMessagesStorage(e);return t.size?Promise.resolve([...t.keys()]):h.a.invokeApiSingle("messages.getScheduledHistory",{peer:x.a.getInputPeerById(e),hash:""}).then(t=>{if("messages.messagesNotModified"!==t._){B.a.saveApiUsers(t.users),U.a.saveApiChats(t.chats);const s=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:s,isScheduled:!0}),[...s.keys()]}return[]})}sendScheduledMessages(e,t){return h.a.invokeApi("messages.sendScheduledMessages",{peer:x.a.getInputPeerById(e),id:t.map(e=>ee.a.getServerMessageId(e))}).then(e=>{T.a.processUpdateMessage(e)})}deleteScheduledMessages(e,t){return h.a.invokeApi("messages.deleteScheduledMessages",{peer:x.a.getInputPeerById(e),id:t.map(e=>ee.a.getServerMessageId(e))}).then(e=>{T.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===_.d||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!U.a.isInChat(e.toChatId())}isRestricted(e){return!(!e.restriction_reason||!Object(ne.c)(e.restriction_reason))}getNewHistory(e,t){var s;return le(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const i=this.getHistoryStorage(e,t),a=i.history.slice;if(!a.isEnd(v.a.Bottom))return;delete i.maxId,a.unsetEnd(v.a.Bottom);let n=this.getHistory(e,null!==(s=a[0])&&void 0!==s?s:1,0,50,t);n instanceof Promise&&(n=yield n);for(let t=0,s=n.history.length;t{const e=n.history.sliceMe(t,r,s);return{count:n.count,history:(null==e?void 0:e.slice)||n.history.constructSlice(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||n.count}}):{count:n.count,history:o.slice,offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,s){const{offset_id_offset:i,messages:a}=e,n=e.count||a.length,r=i||0,o=s<0?t+s:t;return{count:n,offsetIdOffset:r,isTopEnd:r>=n-o||ne.mid);if(s&&ee.a.getServerMessageId(s)&&!h.includes(s)&&dh[e]);++e);h.splice(e,0,s)}const u=e.insertSlice(h)||e.slice;return c&&u.setEnd(v.a.Top),l&&u.setEnd(v.a.Bottom),Object.assign({slice:u,mids:h,messages:n},r)}fillHistoryStorage(e,t,s,i,a,n){return this.requestHistory(e,t,s,i,void 0,n).then(n=>{const{count:r,isBottomEnd:o,slice:d,messages:c}=this.mergeHistoryResult(a.history,n,t,s,i);a.count=r;for(let t=0,s=c.length;t{q.b&&this.log("requestHistory result:",e,r,t,s,i),B.a.saveApiUsers(r.users),U.a.saveApiChats(r.chats),this.saveMessages(r.messages),x.a.isChannel(e)&&T.a.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,d=r.count;o&&r.messages[o-1].deleted&&(r.messages.splice(o-1,1),o--,d--);const c=this.getHistoryStorage(e,n),l=r.messages[o-1];if(o&&l.grouped_id){const t=c.history.findSlice(l.mid);if(t&&t.slice.length+r.messages.lengthr)}return r},t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=U.a.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},T.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t})}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise(e=>{setTimeout(()=>{const t=[];for(const[e,s]of this.needSingleMessages){const i=[...s.keys()],a=i.map(e=>({_:"inputMessageID",id:ee.a.getServerMessageId(e)}));let n;n=e.isAnyChat()&&x.a.isChannel(e)?h.a.invokeApiSingle("channels.getMessages",{channel:U.a.getChannelInput(e.toChatId()),id:a}):h.a.invokeApiSingle("messages.getMessages",{id:a});const r=n.then(e=>{Object(Z.a)(e),B.a.saveApiUsers(e.users),U.a.saveApiChats(e.chats),this.saveMessages(e.messages);for(let t=0;t{f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:i})});t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally(()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()})},0)})}wrapSingleMessage(e,t,s=!1){const i=this.getMessageByPeer(e,t);if(i.deleted||s){let s=this.needSingleMessages.get(e);s||this.needSingleMessages.set(e,s=new Map);let i=s.get(t);return i||(i=Object(n.a)(),s.set(t,i),this.fetchSingleMessages(),i)}return f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?x.a.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then(t=>(t.deleted&&delete e.reply_to_mid,t))}setTyping(e,t,s){var i;let a=this.typings[e];return f.default.myId&&e&&this.canSendToPeer(e)&&e!==f.default.myId&&(s||(null===(i=null==a?void 0:a.action)||void 0===i?void 0:i._)!==t._)?((null==a?void 0:a.timeout)&&clearTimeout(a.timeout),a=this.typings[e]={action:t},h.a.invokeApi("messages.setTyping",{peer:x.a.getInputPeerById(e),action:t}).finally(()=>{a===this.typings[e]&&(a.timeout=window.setTimeout(()=>{delete this.typings[e]},6e3))})):Promise.resolve(!1)}handleReleasingMessage(e,t){const s=e.media;if(s){const i=s.webpage||s,a=i.photo||i.document;if((null==a?void 0:a.file_reference)&&u.a.deleteContext(a.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in s&&s.webpage){const i=this.getScheduledMessagesStorage(e.peerId)===t,a=N.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,i);N.a.deleteWebPageFromPending(s.webpage,a)}s.poll&&L.a.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,s){const i={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const a of s){const s=this.getMessageFromStorage(t,a);if(s.deleted){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(s,t),this.updateMessageRepliesIfNeeded(s),s.pFlags.out||s.pFlags.is_outgoing||!s.pFlags.unread||(++i.unread,W.a.cancel("msg"+a),s.pFlags.mentioned&&(++i.unreadMentions,this.modifyCachedMentions(e,a,!1))),++i.count,i.msgs.add(a),s.deleted=!0;const n=s.grouped_id;if(n){const e=this.groupedMessagesStorage[n];e&&(e.delete(a),i.albums||(i.albums={}),(i.albums[n]||(i.albums[n]=new Set)).add(a),e.size||(delete i.albums,delete this.groupedMessagesStorage[n]))}t.delete(a);const r=this.newMessagesToHandle[e];r&&r.has(a)&&r.delete(a)}if(i.albums)for(const t in i.albums)f.default.dispatchEvent("album_edit",{peerId:e,groupId:t,deletedMids:[...i.albums[t]]});return i}handleEditedMessage(e,t){var s;if("message"===e._&&(null===(s=e.media)||void 0===s?void 0:s.webpage)){const t=N.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);N.a.deleteWebPageFromPending(e.media.webpage,t)}}getMediaFromMessage(e){return e.action?e.action.photo:e.media&&(e.media.photo||e.media.document||e.media.webpage&&(e.media.webpage.document||e.media.webpage.photo))}isMentionUnread(e){var t;const s=null===(t=e.media)||void 0===t?void 0:t.document;return e.pFlags.media_unread&&e.pFlags.mentioned&&(!s||!["voice","round"].includes(s.type))}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return!e.pFlags.noforwards&&!x.a.noForwards(e.peerId)}};q.a.appMessagesManager=he;t.a=he},function(e,t,s){"use strict";var i=s(30),a=s(31),n=s(15),r=s(47),o=s(37),d=s(16),c=s(43),l=s(128),h=s(84),u=s(123);const p=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],g=["red","green","yellow","blue","violet","pink","cyan","orange"],f=[0,7,4,1,6,3,5];["isChannel","isMegagroup","isAnyGroup","isBroadcast","isBot","isContact","isUser","isAnyChat"].forEach(e=>{const t=Array.isArray(e)?e[0]:e,s=Array.isArray(e)?e[1]:e;String.prototype[t]=function(){return m[s](this.toString())},Number.prototype[t]=function(){return m[s](this)}});const m=new class{canPinMessage(e){return e.isUser()||r.a.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){if(this.isRestricted(e))return;const t=e.isUser()?o.a.getUserPhoto(e.toUserId()):r.a.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:void 0}getPeerMigratedTo(e){if(e.isUser())return!1;const t=r.a.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&this.getPeerId(t.migrated_to)}getPeerTitle(e,t=!1,s=!1,i){e||(e=n.default.myId);let c="";if(e.isUser()){const t=o.a.getUser(e.toUserId());t.first_name&&(c+=t.first_name),!t.last_name||s&&c||(c+=" "+t.last_name),c=c?c.trim():t.pFlags.deleted?d.default.format("HiddenName",!0):t.username}else{c=r.a.getChat(e.toChatId()).title,s&&(c=c.split(" ")[0])}return void 0!==i&&(c=Object(u.a)(c,i,i)),t?c:a.a.wrapEmojiText(c)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return r.a.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?o.a.getUserString(e.toUserId()):r.a.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?o.a.getUser(e.toUserId()):r.a.getChat(e.toChatId())}getPeerId(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if(Object(h.a)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const s=e.channel_id||e.chat_id;return void 0!==s?s.toPeerId(!0):n.default.myId}if(!e)return c.c;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&r.a.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&r.a.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!r.a.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&o.a.isBot(e.toUserId())}isContact(e){return e.isUser()&&o.a.isContact(e.toUserId())}isUser(e){return+e>=0}isAnyChat(e){return!this.isUser(e)}isRestricted(e){return e.isUser()?o.a.isRestricted(e.toUserId()):r.a.isRestricted(e.toChatId())}getRestrictionReasonText(e){const t=this.getPeer(e),s=t.restriction_reason?Object(l.a)(t.restriction_reason):void 0;return s?s.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return r.a.getInputPeer(t)}const t=e.toUserId();return o.a.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:Object(h.a)(e)?e:this.getInputPeerById(e)}}getPeerColorById(e,t=!0){if(!e)return"";const s=f[Math.abs(+e)%7];return(t?g:p)[s]}getPeerSearchText(e){let t;if(this.isUser(e))t="%pu "+o.a.getUserSearchText(e.toUserId());else{t="%pg "+(r.a.getChat(e.toChatId()).title||"")}return t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===n.default.myId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return r.a.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return r.a.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;if(e.isUser())return!1;return!!(null===(t=r.a.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}};i.a.appPeersManager=m,t.a=m},,,,,,,function(e,t,s){"use strict";var i=s(30),a=s(53),n=s(85),r=s(84),o=s(118),d=s(32),c=s(31),l=s(15),h=s(64),u=s(40),p=s(17),g=s(37),f=s(128);const m=new class{constructor(){this.storage=p.default.storages.chats,this.onChatUpdated=(e,t)=>{var s;h.a.processUpdateMessage(t),(null===(s=null==t?void 0:t.updates)||void 0===s?void 0:s.length)&&this.isChannel(e)&&l.default.dispatchEvent("invalidate_participants",e)},this.clear(!0),l.default.addMultipleEventsListeners({updateChannelParticipant:e=>{d.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=u.a.getPeerId(e.peer).toChatId(),s=this.chats[t];s&&(s.default_banned_rights=e.default_banned_rights,l.default.dispatchEvent("chat_update",t))}}),p.default.getState().then(e=>{const t=p.default.storagesResults.chats;if(t.length)for(let e=0,s=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})}),p.default.addEventListener("peerUnneeded",e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())})})}clear(e=!1){if(e)this.chats={};else{const e=p.default.storagesResults.chats;for(const t in this.chats)t&&(p.default.isPeerNeeded(t.toPeerId(!0))||(e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.chats[t]))}}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiChat(e,t)))}saveApiChat(e,t){var s,i;if("chatEmpty"===e._)return;const a=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==a)return;e.initials=c.a.getAbbreviation(e.title),"channel"===e._&&void 0===e.participants_count&&void 0!==a&&a.participants_count&&(e.participants_count=a.participants_count);let n=!1,r=!1;if(void 0===a)this.chats[e.id]=e;else{(null===(s=a.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(n=!0),a.title!==e.title&&(r=!0),Object(o.a)(a,e),l.default.dispatchEvent("chat_update",e.id)}const d=e.id.toPeerId(!0);n&&l.default.dispatchEvent("avatar_update",d),r&&l.default.dispatchEvent("peer_title_edit",d),p.default.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}combineParticipantBannedRights(e,t){const s=this.getChat(e);if(s.default_banned_rights){t=Object(a.a)(t);const e=s.default_banned_rights.pFlags;for(let s in e)t.pFlags[s]=e[s]}return t}hasRights(e,t,s,i){const a=this.getChat(e);if("chatEmpty"===a._)return!1;if(a.pFlags.deactivated&&"view_messages"!==t)return!1;const n=void 0===s;if(a.pFlags.creator&&n)return!0;if("chatForbidden"===a._||"channelForbidden"===a._||a.pFlags.kicked||a.pFlags.left&&!a.pFlags.megagroup)return!1;if(!s&&!(s=a.admin_rights||a.banned_rights||a.default_banned_rights))return!1;let r={};switch(s&&(r=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!i&&a.pFlags.left)return!1;if("chatBannedRights"===s._&&r[t])return!1;if("channel"===a._&&!a.pFlags.megagroup&&!r.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!r[t];case"pin_messages":return"chatAdminRights"===s._?r[t]||!!r.post_messages:!r[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?r[t]:!r[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!r.ban_users;case"view_participants":return!("chat"!==a._&&a.pFlags.broadcast&&!a.pFlags.creator&&!a.admin_rights)}return!0}editChatDefaultBannedRights(e,t){const s=this.getChat(e);return s.default_banned_rights&&s.default_banned_rights.until_date===t.until_date&&Object(n.a)(s.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():d.a.invokeApi("messages.editChatDefaultBannedRights",{peer:u.a.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){const t=this.chats[e];return!(!t||"channel"!==t._||!t.pFlags.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const s=this.getChat(e);return("channelForbidden"===s._||"chatForbidden"===s._||"chatEmpty"===s._||s.pFlags.left||s.pFlags.kicked||s.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const s=this.chats[e];return Object(r.a)(s)&&(t||!s.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return d.a.invokeApi("channels.createChannel",e).then(e=>{h.a.processUpdateMessage(e);const t=e.chats[0].id;return l.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const s=this.getChannelInput(e),i=t.map(e=>g.a.getUserInput(e));return d.a.invokeApi("channels.inviteToChannel",{channel:s,users:i}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return d.a.invokeApi("messages.createChat",{users:t.map(e=>g.a.getUserInput(e)),title:e}).then(e=>{h.a.processUpdateMessage(e);const t=e.chats[0].id;return l.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}leaveChannel(e){return d.a.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return d.a.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,s=100){return d.a.invokeApi("messages.addChatUser",{chat_id:e,user_id:g.a.getUserInput(t),fwd_limit:s}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return d.a.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:g.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,g.a.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return d.a.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return d.a.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):d.a.invokeApi("messages.migrateChat",{chat_id:e}).then(t=>{this.onChatUpdated(e,t);return t.updates.find(e=>"updateChannel"===e._).channel_id})}updateUsername(e,t){return d.a.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then(s=>{if(s){this.getChat(e).username=t}return s})}editPhoto(e,t){const s={_:"inputChatUploadedPhoto",file:t};let i;return i=this.isChannel(e)?d.a.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:s}):d.a.invokeApi("messages.editChatPhoto",{chat_id:e,photo:s}),i.then(e=>{h.a.processUpdateMessage(e)})}editTitle(e,t){let s;return s=this.isChannel(e)?d.a.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):d.a.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),s.then(e=>{h.a.processUpdateMessage(e)})}editAbout(e,t){const s=e.toPeerId(!0);return d.a.invokeApi("messages.editChatAbout",{peer:u.a.getInputPeerById(s),about:t}).then(e=>(e&&l.default.dispatchEvent("peer_bio_edit",s),e))}getParticipantPeerId(e){return e.peer?u.a.getPeerId(e.peer):e.user_id.toPeerId()}editBanned(e,t,s){const i="object"!=typeof t?t:this.getParticipantPeerId(t);return d.a.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:u.a.getInputPeerById(i),banned_rights:s}).then(a=>{if(this.onChatUpdated(e,a),"object"==typeof t){const a=Date.now()/1e3|0;h.a.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:a,actor_id:void 0,qts:void 0,user_id:i,prev_participant:t,new_participant:Object.keys(s.pFlags).length?{_:"channelParticipantBanned",date:a,banned_rights:s,kicked_by:g.a.getSelf().id,peer:u.a.getOutputPeer(i),pFlags:{}}:void 0})}})}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return d.a.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then(e=>{this.saveApiChats(e.chats)})}togglePreHistoryHidden(e,t){return this.migrateChat(e).then(e=>d.a.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t})).then(e=>{h.a.processUpdateMessage(e)})}toggleSignatures(e,t){return d.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{h.a.processUpdateMessage(e)})}toggleNoForwards(e,t){return d.a.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(e=>{h.a.processUpdateMessage(e)})}setChatAvailableReactions(e,t){return d.a.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(e=>{h.a.processUpdateMessage(e)})}isRestricted(e){const t=this.getChat(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&Object(f.c)(s))}getSendAs(e){return d.a.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(g.a.saveApiUsers(e.users),m.saveApiChats(e.chats),e.peers)})}};i.a.appChatsManager=m,t.a=m},,function(e,t,s){"use strict";s.d(t,"a",(function(){return p}));var i=s(30),a=s(40),n=s(15),r=s(16),o=s(33),d=s(37),c=s(31),l=s(43),h=s(123);const u=new WeakMap;i.a.peerTitleWeakMap=u,n.default.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=u.get(e);t&&t.update()})});class p{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.update(e),u.set(this.element,this)}update(e){if(e)for(let t in e)this.element.dataset[t]=e[t]?""+("boolean"==typeof e[t]?+e[t]:e[t]):"0",this[t]=e[t];let t=this.fromName;if(void 0!==t)return void 0!==this.limitSymbols&&(t=Object(h.a)(t,this.limitSymbols,this.limitSymbols)),void(this.element.innerHTML=c.b.wrapEmojiText(t));void 0===this.peerId&&(this.peerId=l.c),this.peerId===n.default.myId&&this.dialog?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Saved":"SavedMessages")):this.peerId.isUser()&&d.a.getUser(this.peerId).pFlags.deleted?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Deleted":"HiddenName")):this.element.innerHTML=a.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols)}}},,,,,,,function(e,t,s){"use strict";var i=s(122),a=s(0),n=s(32),r=s(160),o=s(73),d=s(37),c=s(153),l=s(30),h=s(101),u=s(141),p=s(38),g=s(102),f=s(155),m=s(84),v=s(177);class _{constructor(){this.photos={}}savePhoto(e,t){var s;if("photoEmpty"===e._)return;const i=this.photos[e.id];if(e.file_reference&&(Object(v.a)("file_reference",i,e),r.a.saveContext(e.file_reference,t)),null===(s=e.sizes)||void 0===s?void 0:s.length){const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return i?Object.assign(i,e):this.photos[e.id]=e}choosePhotoSize(e,t=0,s=0,i=!1,a=!1){window.devicePixelRatio>1&&(t*=2,s*=2);let n={_:"photoSizeEmpty",type:""},r=e.sizes||e.thumbs;if(a&&r&&"document"===e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==r?void 0:r.length){for(let e=0,i=r.length;e=t||a.height>=s)break}i&&"photoSizeEmpty"===n._&&"photoStrippedSize"===r[0]._&&(n=r[0])}return n}getUserPhotos(e,t="0",s=20){const i=d.a.getUserInput(e);return n.a.invokeApiCacheable("photos.getUserPhotos",{user_id:i,offset:0,limit:s,max_id:t},{cacheSeconds:60}).then(s=>{d.a.saveApiUsers(s.users);const i=s.photos.map((t,i)=>(s.photos[i]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id));if("0"!==t&&t){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}return{count:s.count||i.length,photos:i}})}getPreviewURLFromBytes(e,t=!1){let s,i;t?s=e instanceof Uint8Array?e:new Uint8Array(e):(s=new Uint8Array(_.jpegHeader.concat(Array.from(e.slice(3)),_.jpegTail)),s[164]=e[1],s[166]=e[2]),i=t?a.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const n=new Blob([s],{type:i});return URL.createObjectURL(n)}getPathFromPhotoPathSize(e){const t=e.bytes;let s="M";for(let e=0,i=t.length;e=192?s+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[i-128-64]:(i>=128?s+=",":i>=64&&(s+="-"),s+=""+(63&i))}return s+="z",s}getPreviewURLFromThumb(e,t,s=!1){const i=o.a.getCacheContext(e,t.type);return i.url||(i.url=this.getPreviewURLFromBytes(t.bytes,s))}getImageFromStrippedThumb(e,t,s){const i=this.getPreviewURLFromThumb(e,t,!1),a=new Image;a.classList.add("thumbnail");const n=(s?Object(c.a)(i):Promise.resolve(i)).then(e=>Object(h.b)(a,e));return{image:a,loadPromise:n}}setAttachmentSize(e,t,s,i,a=!0,n,r,o){let d;o||(o=this.choosePhotoSize(e,s,i,void 0,r));const c="document"===e._;d=c?Object(p.c)(e.w||o.w||512,e.h||o.h||512):Object(p.c)(o.w||100,o.h||100);let l=Object(p.c)(s,i);l=d=d.aspect(l,a);let h=!0;return c&&!["video","gif"].includes(e.type)||(l.width<200&&l.height<200&&(l=d=d.aspectCovered(Object(p.c)(200,200))),n&&(n.message||n.reply_to_mid||n.media.webpage||n.replies&&n.replies.pFlags.comments&&777!==n.replies.channel_id)&&l.width<320&&(l=Object(p.c)(320,l.height),h=!1),h&&l.width<120&&n&&(l=Object(p.c)(120,l.height),h=!1)),t.style.width=l.width+"px",t.style.height=l.height+"px",{photoSize:o,size:d,isFit:h}}getStrippedThumbIfNeeded(e,t,s,i=!1){if(!t.downloaded||["video","gif"].includes(e.type)||i){if("document"===e._&&t.downloaded&&!i)return null;const a=e.sizes||e.thumbs,n=(null==a?void 0:a.length)?a.find(e=>"photoStrippedSize"===e._):null;if(n&&"bytes"in n)return this.getImageFromStrippedThumb(e,n,s)}return null}getPhotoDownloadOptions(e,t,s,i){const a="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const n=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,r={_:a?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:r,size:n?t.size:void 0,queueId:s,onlyCache:i}}preloadPhoto(e,t,s,a){const n=this.getPhoto(e);if(!n||"photoEmpty"===n._)throw new Error("preloadPhoto photoEmpty!");if(!t){const e=g.a.width,s=g.a.height;t=this.choosePhotoSize(n,e,s)}const r=o.a.getCacheContext(n,t.type);if(r.downloaded>=("size"in t?t.size:0)&&r.url)return Promise.resolve();const d=this.getPhotoDownloadOptions(n,t,s,a),c=Object(i.a)(d.location);let l=o.a.getDownload(c);return l||(l=o.a.download(d),l.then(e=>{if(!r.downloaded||r.downloaded{}),l)}getPhoto(e){return Object(m.a)(e)?e:this.photos[e]}getInput(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}getMediaInput(e){return{_:"inputMediaPhoto",id:this.getInput(e),ttl_seconds:0}}savePhotoFile(e,t){const s=this.choosePhotoSize(e,65535,65535);if("photoSize"!==s._&&"photoSizeProgressive"!==s._)return;const i=this.getPhotoDownloadOptions(e,s,t);i.fileName="photo"+e.id+".jpg",o.a.downloadToDisc(i,i.fileName)}}_.jpegHeader=Object(f.a)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),_.jpegTail=Object(f.a)("ffd9");const y=new _;l.a&&(l.a.appPhotosManager=y),t.a=y},,,,function(e,t,s){"use strict";s.r(t),s.d(t,"AppProfileManager",(function(){return _}));var i=s(30),a=s(58),n=s(159),r=s(16),o=s(32),d=s(15),c=s(132),l=s(64),h=s(47),u=s(100),p=s(109),g=s(40),f=s(56),m=s(37),v=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class _{constructor(){this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const s=e.user_id?e.user_id.toPeerId():g.a.getPeerId(e.from_id);if(d.default.myId===s||"speakingInGroupCallAction"===e.action._)return;const i=g.a.getPeerId(e),a=null!==(t=this.typingsInPeer[i])&&void 0!==t?t:this.typingsInPeer[i]=[];let n=a.find(e=>e.userId===s);const r=()=>{delete n.timeout;const e=a.indexOf(n);-1!==e&&a.splice(e,1),d.default.dispatchEvent("peer_typings",{peerId:i,typings:a}),a.length||delete this.typingsInPeer[i]};if(n&&void 0!==n.timeout&&clearTimeout(n.timeout),"sendMessageCancelAction"===e.action._){if(!n)return;return void r()}n||(n={userId:s},a.push(n)),n.action=e.action;const o=m.a.hasUser(s);o?m.a.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&h.a.hasChat(e.chat_id)&&!h.a.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then(()=>{void 0!==n.timeout&&m.a.hasUser(s)&&d.default.dispatchEvent("peer_typings",{peerId:i,typings:a})}),n.timeout=window.setTimeout(r,6e3),o&&d.default.dispatchEvent("peer_typings",{peerId:i,typings:a})},this.onUpdatePeerBlocked=e=>{const t=g.a.getPeerId(e.peer_id);if(g.a.isUser(t)){const s=t.toUserId(),i=this.usersFull[s];i&&(e.blocked?i.pFlags.blocked=!0:delete i.pFlags.blocked),d.default.dispatchEvent("user_full_update",s)}d.default.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})},d.default.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,s=this.chatsFull[e];void 0!==s&&(s.participants=t,d.default.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,s=i.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,a=i.length;t{var t,s;const i=this.chatsFull[e],a=h.a.getChat(e);if(!i||!a)return;let n=!1;!!i.call!=!!(null===(t=a.pFlags)||void 0===t?void 0:t.call_active)&&(n=!0);const{photo:r}=a;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!i.chat_photo||"photoEmpty"===i.chat_photo._)||e&&r.photo_id!==(null===(s=i.chat_photo)||void 0===s?void 0:s.id))&&(n=!0)}n&&this.refreshFullPeer(e.toPeerId(!0))}),d.default.addEventListener("channel_update",e=>{this.refreshFullPeer(e.toPeerId(!0))}),d.default.addEventListener("chat_full_update",e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!0))}),d.default.addEventListener("user_full_update",e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!1))}),d.default.addEventListener("invalidate_participants",e=>{this.invalidateChannelParticipants(e)}),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t?this.usersFull[e]:o.a.invokeApiSingleProcess({method:"users.getFullUser",params:{id:m.a.getUserInput(e)},processResult:t=>{h.a.saveApiChats(t.chats,!0),m.a.saveApiUsers(t.users);const s=t.full_user,i=e.toPeerId(!1);return s.profile_photo&&(s.profile_photo=f.a.savePhoto(s.profile_photo,{type:"profilePhoto",peerId:i})),p.a.savePeerSettings({peerId:i,settings:s.notify_settings}),this.usersFull[e]=s,d.default.dispatchEvent("user_full_update",e),s}})}getProfileByPeerId(e,t){return g.a.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return v(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(h.a.isChannel(e))return this.getChannelFull(e,t);const s=this.chatsFull[e];if(s&&!t){const t=h.a.getChat(e);if(t.version===s.participants.version||t.pFlags.left)return s}return o.a.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{h.a.saveApiChats(t.chats,!0),m.a.saveApiUsers(t.users);const s=t.full_chat,i=e.toPeerId(!0);return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=f.a.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:i})),p.a.savePeerSettings({peerId:i,settings:s.notify_settings}),this.chatsFull[e]=s,d.default.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return v(this,void 0,void 0,(function*(){const s=yield this.getChatFull(e);return!t&&s.exported_invite&&"chatInviteExported"==s.exported_invite._?s.exported_invite.link:o.a.invokeApi("messages.exportChatInvite",{peer:g.a.getInputPeerById(e.toPeerId(!0))}).then(t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},s=200,i=0){if("channelParticipantsRecent"===t._){const t=h.a.getChat(e);if(t&&t.pFlags&&(t.pFlags.kicked||t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights))return Promise.reject()}return o.a.invokeApiCacheable("channels.getParticipants",{channel:h.a.getChannelInput(e),filter:t,offset:i,limit:s,hash:"0"},{cacheSeconds:60}).then(e=>(m.a.saveApiUsers(e.users),e))}getChannelParticipant(e,t){return o.a.invokeApiSingle("channels.getParticipant",{channel:h.a.getChannelInput(e),participant:g.a.getInputPeerById(t)}).then(e=>(m.a.saveApiUsers(e.users),e.participant))}getChannelFull(e,t){return void 0===this.chatsFull[e]||t?o.a.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:h.a.getChannelInput(e)},processResult:t=>{const s=e.toPeerId(!0);h.a.saveApiChats(t.chats,!0),m.a.saveApiUsers(t.users);const i=t.full_chat;return i&&i.chat_photo.id&&(i.chat_photo=f.a.savePhoto(i.chat_photo,{type:"profilePhoto",peerId:s})),p.a.savePeerSettings({peerId:s,settings:i.notify_settings}),this.chatsFull[e]=i,d.default.dispatchEvent("chat_full_update",e),i},processError:t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=h.a.getChat(e);t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},l.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[t],users:[]})}throw t}}):this.chatsFull[e]}getMentions(e,t,s){let i;return i=h.a.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:u.a.getServerMessageId(s)},50,0).then(e=>e.participants.map(e=>h.a.getParticipantPeerId(e))):e?Promise.resolve(this.getChatFull(e)).then(e=>e.participants.participants.map(e=>e.user_id.toPeerId())):Promise.resolve([]),Promise.all([m.a.getTopPeers("bots_inline").catch(()=>[]),i]).then(e=>(e=>{"@"===t.charAt(0)&&(t=t.slice(1));const s=new c.a({ignoreCase:!0}),i=new Map;e.forEach(e=>{s.indexObject(e.id,m.a.getUserSearchText(e.id)),i.set(e.id,e.rating)});const a=Array.from(s.search(t));return a.sort((e,t)=>i.get(t)-i.get(e)),a})(e[0].concat(e[1].map(e=>({id:e,rating:0})))))}invalidateChannelParticipants(e){o.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],d.default.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],d.default.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,s){return o.a.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:s}).then(e=>{if(m.a.saveApiUser(e),void 0!==s){const t=e.id.toPeerId(),i=this.usersFull[e.id];i&&(i.about=s),d.default.dispatchEvent("peer_bio_edit",t)}return this.getProfile(d.default.myId,!0)})}uploadProfilePhoto(e){return o.a.invokeApi("photos.uploadProfilePhoto",{file:e}).then(e=>{const t=e.photo;if(!e.users.length){const s=t.sizes.find(e=>"photoStrippedSize"===e._);e.users.push(Object.assign(Object.assign({},m.a.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==s?void 0:s.bytes,pFlags:{}}}))}m.a.saveApiUsers(e.users);const s=d.default.myId;f.a.savePhoto(e.photo,{type:"profilePhoto",peerId:s});const i=s.toUserId();l.a.processLocalUpdate({_:"updateUserPhoto",user_id:i,date:Object(a.h)(!0),photo:m.a.getUser(i).photo,previous:!0})})}deletePhotos(e){return o.a.invokeApiSingle("photos.deletePhotos",{id:e.map(e=>{const t=f.a.getPhoto(e);return f.a.getInput(t)})}).then(e=>{})}getChatMembersString(e){var t,s;const i=h.a.getChat(e);if("chatForbidden"===i._)return Object(r.i18n)("YouWereKicked");const a=this.chatsFull[e];let o;o=a?"channelFull"===a._?a.participants_count:null===(t=a.participants.participants)||void 0===t?void 0:t.length:i.participants_count||(null===(s=i.participants)||void 0===s?void 0:s.participants.length);o=o||1;let d=h.a.isBroadcast(e)?"Peer.Status.Subscribers":"Peer.Status.Member";return Object(r.i18n)(d,[Object(n.a)(o)])}verifyParticipantForOnlineCount(e){const t=m.a.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce((e,t)=>e+ +this.verifyParticipantForOnlineCount(t),0)}getOnlines(e){var t;return v(this,void 0,void 0,(function*(){if(h.a.isBroadcast(e))return 1;const s=yield this.getChatFull(e);if(h.a.isMegagroup(e)){if(s.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const i=yield o.a.invokeApiCacheable("messages.getOnlines",{peer:h.a.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=i.onlines)&&void 0!==t?t:1}const i=s.participants;return(null==i?void 0:i.participants)?this.reduceParticipantsForOnlineCount(i.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}const y=new _;i.a.appProfileManager=y,t.default=y},,,,function(e,t,s){"use strict";var i=s(30),a=s(41),n=s(32),r=s(15),o=s(37),d=s(47),c=s(40),l=s(17),h=s(78),u=s(79),p=s(76),g=s(31),f=s(7);const m=new class{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=Object(a.b)("UPDATES",a.a.Error|a.a.Warn|a.a.Log),this.debug=i.b,this.processUpdateMessage=(e,t={})=>{const s={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,s);break;case"updateShortMessage":case"updateShortChatMessage":{Object(u.a)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,i=e.from_id||(t?r.default.myId:e.user_id),a=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||r.default.myId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:c.a.getOutputPeer(i.toPeerId()),peer_id:c.a.getOutputPeer(a),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},s);break}case"updatesCombined":case"updates":o.a.saveApiUsers(e.users,t.override),d.a.saveApiChats(e.chats,t.override),e.updates.forEach(e=>{this.processUpdate(e,s)});break;default:this.log.warn("Unknown update message",e)}}}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,s,i){return t[s]=i,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;l.default.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,s=e.pendingSeqUpdates[t];if(!s)return!1;const i=s.updates;for(let e=0,t=i.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort((e,t)=>e.pts-t.pts);let s=t.pts,i=0,a=0;for(let e=0,n=t.pendingPtsUpdates.length;e=n.pts&&(i=n.pts,a=e)}if(!i)return!1;this.debug&&this.log.debug("pop pending pts updates",i,t.pendingPtsUpdates.slice(0,a+1)),t.pts=i;for(let e=0;e<=a;++e){const s=t.pendingPtsUpdates[e];this.saveUpdate(s)}return t.pendingPtsUpdates.splice(0,a+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let s=t.syncLoading;s||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get diff result",s),"updates.differenceEmpty"===s._)return this.debug&&this.log.debug("apply empty diff",s.seq),t.date=s.date,void(t.seq=s.seq);if(e&&r.default.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==s._){o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),s.other_updates.forEach(e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)}),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})});const e="updates.difference"===s._?s.state:s.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=s.pts,t.date=(Date.now()/1e3|0)+h.a.serverTimeOffset,delete t.seq,this.channelStates={},this.log.warn("getDifference:",s._),r.default.dispatchEvent("state_cleared");if("updates.differenceSlice"===s._)return this.getDifference();this.debug&&this.log.debug("finished get diff")});return s||this.justAName(t,i),i}getChannelDifference(e){const t=this.getChannelState(e),s=t.syncLoading;s||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getChannelDifference",{channel:d.a.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get channel diff result",s),t.pts="pts"in s?s.pts:void 0,"updates.channelDifferenceEmpty"!==s._){if("updates.channelDifferenceTooLong"===s._)return this.debug&&this.log.debug("channel diff too long",s),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),this.debug&&this.log.debug("applying",s.other_updates.length,"channel other updates"),s.other_updates.forEach(e=>{this.saveUpdate(e)}),this.debug&&this.log.debug("applying",s.new_messages.length,"channel new messages"),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})}),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===s._&&!s.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",s)});return s||this.justAName(t,i,e),i}justAName(e,t,s){e.syncLoading=t,r.default.dispatchEvent("state_synchronizing",s),t.then(()=>{e.syncLoading=null,r.default.dispatchEvent("state_synchronized",s)},()=>{e.syncLoading=null})}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var s;let i;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":i=c.a.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(i=e.channel_id,!(i in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(i=e.channel_id)}const{pts:a,pts_count:n}=e,r=i?this.getChannelState(i,a):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(i?this.getChannelDifference(i):this.getDifference())},6)}),r.syncPending.ptsAwaiting=!0,!1;if(a>r.pts)r.pts=a,l=!0,r.lastPtsUpdateTime=Date.now();else if(n)return!1;i&&t.date&&this.updatesState.date0){const s=t.seq,i=t.seqStart||s;if(i!==r.seq+1&&i>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[i]&&(r.pendingSeqUpdates[i]={seq:s,date:t.date,updates:[]}),r.pendingSeqUpdates[i].updates.push(e),r.syncPending||(r.syncPending={timeout:window.setTimeout(()=>{r.syncPending=null,r.syncLoading||this.getDifference()},6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const t=l.default.newVersion;e&&e.pts&&e.date?(Object.assign(this.updatesState,e),this.log("will get difference",Object.assign({},e)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise(e=>{n.a.invokeApi("updates.getState",{},{noErrorBox:!0}).then(t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()})})),n.a.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),t&&this.updatesState.syncLoading.then(()=>{fetch("changelogs/"+t.split(" ")[0]+".md").then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e=`**Telegram Web${f.a.suffix} was updated to version ${t}**\n\n`+e;const s=[],i={_:"updateServiceNotification",entities:s,message:g.b.parseMarkdown(e,s),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(i)}).catch(p.a)})}))}};i.a.apiUpdatesManager=m,t.a=m},function(e,t,s){"use strict";var i=s(32),a=s(15),n=s(68),r=s(103),o=s(30),d=s(138),c=s(51),l=s(38),h=s(95),u=s(31),p=s(79),g=s(115),f=s(176),m=s(67),v=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const _=new Set(["emoji","emojiAnimations"]);const y=new class{constructor(){this.storage=new r.a(d.a,"stickerSets"),this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.getAnimatedEmojiStickerSet(),a.default.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),a.default.dispatchEvent("stickers_installed",t.set)}}),this.getGreetingStickersTimeout=window.setTimeout(()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)},5e3)}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then(e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort((e,t)=>Math.random()-Math.random())})),this.getGreetingStickersPromise.then(()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),n.a.downloadDoc(this.greetingStickers[0]),t})}saveStickers(e){Object(m.a)(e,(t,s)=>{(t=n.a.saveDoc(t))?e[s]=t:e.splice(s,1)})}getStickerSet(e,t={}){return v(this,void 0,void 0,(function*(){const s=e.id;return this.getStickerSetPromises[s]?this.getStickerSetPromises[s]:this.getStickerSetPromises[s]=new Promise(a=>v(this,void 0,void 0,(function*(){var n;if(!t.overwrite){const e=yield this.storage.get(s);if(e&&(null===(n=e.documents)||void 0===n?void 0:n.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),a(e),void delete this.getStickerSetPromises[s]}try{const n=yield i.a.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),r=t.saveById?s:n.set.id;this.saveStickerSet(n,r),a(n)}catch(e){a(null)}delete this.getStickerSetPromises[s]})))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:"emoji"},{saveById:!0}),this.getStickerSet({id:"emojiAnimations"},{saveById:!0}),this.getAnimatedEmojiSounds()]).then(([e,t])=>({emoji:e,animations:t}))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.resolve(i.a.getAppConfig(e)).then(e=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],i=atob(Object(g.a)(s.file_reference_base64,!1)),r=new Uint8Array(i.length);for(let e=0,t=r.length;e(Object(p.a)(e),this.saveStickers(e.stickers),e)})}))}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const s=this.storage.getFromCache(t?"emojiAnimations":"emoji");if(!s||!s.documents)return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const i=s.packs.find(t=>t.emoticon===e);return i?n.a.getDoc(i.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e,t,s){const i=this.getAnimatedEmojiStickerSet().then(()=>{const i=this.getAnimatedEmojiSticker(e);if(i)return n.a.downloadDoc(i).then(a=>v(this,void 0,void 0,(function*(){const r=l.b.active.emojiSticker,o=Object(h.d)(e),d=yield c.a.loadAnimationWorker({container:void 0,animationData:a,width:null!=t?t:r.width,height:null!=s?s:r.height,name:"doc"+i.id,autoplay:!1,loop:!1,toneIndex:o},"none");d.addEventListener("firstFrame",()=>{n.a.saveLottiePreview(i,d.canvas,o),d.remove()},{once:!0})})))});return Promise.all([i,this.preloadAnimatedEmojiStickerAnimation(e)])}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then(()=>{const t=this.getAnimatedEmojiSticker(e,!0);if(t){const s=this.getAnimatedEmojiSoundDocument(e);return Promise.all([n.a.downloadDoc(t),s?n.a.downloadDoc(s):void 0])}})}saveStickerSet(e,t){const s={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let i=this.storage.getFromCache(t);i?Object.assign(i,s):i=this.storage.setToCache(t,s),this.saveStickers(e.documents);const a=i.set.installed_date||_.has(t);i.refreshTime=Date.now(),this.storage.set({[t]:i},!a)}getStickerSetThumbDownloadOptions(e){var t;const s=e.thumbs.find(e=>"photoSize"===e._),i=e.thumb_dc_id,a=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:i,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:s.size,mimeType:a?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return"emoji"===e.id?{_:"inputStickerSetAnimatedEmoji"}:"emojiAnimations"===e.id?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return v(this,void 0,void 0,(function*(){return(yield i.a.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>(Object(p.a)(e),Object(m.a)(e.sets,(e,t,s)=>{e.set.pFlags.videos&&!f.a&&s.splice(t,1)}),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)})).sets}))}toggleStickerSet(e){return v(this,void 0,void 0,(function*(){if(e.installed_date){if(yield i.a.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,a.default.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else{if(yield i.a.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,a.default.dispatchEvent("stickers_installed",e),!0}return!1}))}searchStickerSets(e,t=!0){return v(this,void 0,void 0,(function*(){const s=t?1:0,a=yield i.a.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:s,exclude_featured:t||void 0,q:e},processResult:e=>(Object(p.a)(e),Object(m.a)(e.sets,(e,t,s)=>{e.set.pFlags.videos&&!f.a&&s.splice(t,1)}),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)}),n=[],r=this.storage.getCache();for(let t in r){const{set:s}=r[t];s.title.toLowerCase().includes(e.toLowerCase())&&!a.sets.find(e=>e.set.id===s.id)&&n.push({_:"stickerSetCovered",set:s,cover:null})}return a.sets.concat(n)}))}getAllStickers(){return i.a.invokeApiHashable({method:"messages.getAllStickers",processResult:e=>(Object(p.a)(e),Object(m.a)(e.sets,(e,t,s)=>{e.pFlags.videos&&!f.a&&s.splice(t,1)}),e)})}preloadStickerSets(){return this.getAllStickers().then(e=>Promise.all(e.sets.map(e=>this.getStickerSet(e,{useCache:!0}))))}getStickersByEmoticon(e,t=!0){return e=u.b.fixEmoji(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([i.a.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then(([t,s,i])=>{const a=t.stickers.map(e=>n.a.saveDoc(e)),r=[],o=[],d=t=>{for(const s of t){if(u.b.fixEmoji(s.emoticon).includes(e))for(const e of s.documents){const t=n.a.getDoc(e);(t.animated?r:o).push(t)}}};if(i){d(i.packs);const e=i.stickers;[r,o].forEach(t=>{t.sort((t,s)=>e.indexOf(t)-e.indexOf(s))})}for(const e of s)d(e.packs);const c=[...new Set(r.concat(o,a))];return Object(m.a)(c,(e,t,s)=>{3!==e.sticker||f.a||s.splice(t,1)}),c})}pushRecentSticker(e){const t=u.b.fixEmoji(e.stickerEmojiRaw);for(const s in this.getStickersByEmoticonsPromises){this.getStickersByEmoticonsPromises[s].then(i=>{const a=i.findAndSplice(t=>t.id===e.id);a?i.unshift(a):s.includes(t)&&i.unshift(e)})}}};o.a.appStickersManager=y,t.a=y},,,function(e,t,s){"use strict";var i=s(122),a=s(160),n=s(175),r=s(31),o=s(73),d=s(56),c=s(153),l=s(32),h=s(30),u=s(58),p=s(15),g=s(140),f=s(176),m=s(174),v=s(84),_=s(177),y=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const I={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};const S=new class{constructor(){this.docs={},this.savingLottiePreview={},this.downloading=new Map,this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];if(t.supportsStreaming){delete t.supportsStreaming;delete o.a.getCacheContext(t).url}}},l.a.onServiceWorkerFail=this.onServiceWorkerFail}saveDoc(e,t){if("documentEmpty"===e._)return;const s=this.docs[e.id];e.file_reference&&(Object(_.a)("file_reference",s,e),a.a.saveContext(e.file_reference,t)),s||(this.docs[e.id]=e);for(let t=0,s=e.attributes.length;t8e6||"audio"===e.type||"video"===e.type)){e.supportsStreaming=!0;const t=o.a.getCacheContext(e);t.url||(t.url=this.getFileURL(e))}return e.file_name||(e.file_name=e.fileName=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),s?Object.assign(s,e):e}getDoc(e){return Object(v.a)(e)?e:this.docs[e]}getMediaInput(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}getInput(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}getFileDownloadOptions(e,t,s,i){const a=this.getInput(e,null==t?void 0:t.type);let n;return n=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:a,size:t?t.size:e.size,mimeType:n,fileName:e.file_name,queueId:s,onlyCache:i}}getFileURL(e,t=!1,s){let a;return a=t?"download":s?"thumb":e.supportsStreaming?"stream":"document",Object(i.b)(a,this.getFileDownloadOptions(e,s))}getThumbURL(e,t){let s=Promise.resolve();const i=o.a.getCacheContext(e,t.type);return i.url||(s="bytes"in t?Object(c.a)(d.a.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then(e=>{i.url=e}):d.a.preloadPhoto(e,t)),{thumb:t,cacheContext:i,promise:s}}getThumb(e,t=!0){const s=d.a.choosePhotoSize(e,0,0,!t);return"photoSizeEmpty"===s._?null:this.getThumbURL(e,s)}getInputFileName(e,t){return Object(i.a)(this.getInput(e,t),{fileName:e.file_name})}downloadDoc(e,t,s){const i=this.getInputFileName(e);let a=o.a.getDownload(i);if(a)return a;const r=this.getFileDownloadOptions(e,void 0,t,s);a=o.a.download(r),this.downloading.set(e.id,a),p.default.dispatchEvent("download_start",e.id);const d=o.a.getCacheContext(e),c=a;return c.then(e=>{d.url=URL.createObjectURL(e),d.downloaded=e.size},()=>{}).finally(()=>{this.downloading.delete(e.id)}),"voice"!==e.type||n.a.isPlaySupported()||(a=c.then(e=>y(this,void 0,void 0,(function*(){const t=new FileReader;return yield new Promise((s,i)=>{t.onloadend=e=>{const t=new Uint8Array(e.target.result);n.a.decode(t).then(e=>{d.url=e.url,s()},e=>{delete d.downloaded,i(e)})},t.readAsArrayBuffer(e)}),e})))),a.then(()=>{p.default.dispatchEvent("document_downloaded",e)}),a}isSavingLottiePreview(e,t){const s=e.id+"-"+t;return!!this.savingLottiePreview[s]}saveLottiePreview(e,t,s){const i=e.id+"-"+s;if(this.savingLottiePreview[i])return;e.stickerCachedThumbs||(Object(m.a)(e,["stickerCachedThumbs"]),e.stickerCachedThumbs={});const a=e.stickerCachedThumbs[s];a&&a.w>=t.width&&a.h>=t.height||(this.savingLottiePreview[i]=!0,t.toBlob(a=>{const n={url:URL.createObjectURL(a),w:t.width,h:t.height};e.stickerCachedThumbs[s]=n,delete this.savingLottiePreview[i]}))}saveDocFile(e,t){const s=this.downloadDoc(e,t);return s.then(()=>{const t=o.a.getCacheContext(e);o.a.createDownloadAnchor(t.url,e.file_name)}),s}};h.a.appDocsManager=S,t.a=S},,,,,,,,,,function(e,t,s){"use strict";var i=s(30),a=s(74),n=s(32);const r=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),n.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=r),t.a=r},function(e,t,s){"use strict";function i(e){}s.d(t,"a",(function(){return i}))},,,,function(e,t,s){"use strict";s.d(t,"a",(function(){return c})),s.d(t,"d",(function(){return h})),s.d(t,"b",(function(){return u})),s.d(t,"c",(function(){return p}));var i=s(41);class a{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver(t=>{if(this.locked)return;const s=[];t.forEach(e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),s[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))}),s.forEach(t=>{e(t.target,t.visible)})})}getVisible(){const e=[];return this.items.forEach((t,s)=>{t&&e.push(s)}),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}var n=s(94);function r(e,t){const s=[];let i=-1;for(;-1!==(i=e.findIndex(t));)s.push(e.splice(i,1)[0]);return s}var o=s(59),d=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class c{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=Object(i.b)("LL",i.a.Error),this.processQueue=Object(n.a)(()=>this._processQueue(),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise((e,t)=>{this.unlockResolve=e}))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return d(this,void 0,void 0,(function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}}))}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit)return;do{if(e?Object(o.a)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.sizee.div===t.div&&e.load===t.load))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout(()=>{this.intersectorTimeout=0,this.processQueue()},0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){r(this.queue,t=>t.div===e),this.intersector.unobserve(e)}}class h extends l{constructor(e=8){super(e),this.parallelLimit=e,this.onVisibilityChange=(e,t)=>{t&&(r(this.queue,t=>t.div===e).forEach(e=>{e.wasSeen=!0,this.queue.unshift(e)}),this.setProcessQueueTimeout())},this.intersector=new a(this.onVisibilityChange)}getItem(){return this.queue.findAndSplice(e=>e.wasSeen)}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return d(this,void 0,void 0,(function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)}))}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}class u extends l{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this._queue=new Map,this.intersector=new a((e,t)=>{const s=r(this.queue,t=>t.div===e);if(t){(s.length?s:[this._queue.get(e)]).forEach(t=>{this.queue.unshift(t||this._queue.get(e))})}this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}class p extends l{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this.intersector=new a((e,t)=>{const s=r(this.queue,t=>t.div===e);t&&s.length&&s.forEach(e=>{this.queue.unshift(e)}),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}observe(e){this.intersector.observe(e)}}},,,,,,,,,function(e,t,s){"use strict";s.d(t,"a",(function(){return o}));var i=s(16);const a=new Map;let n=0;const r=(e,t,s="")=>{s=t.country_code+s,n=Math.max(n,s.length),a.set(s,{country:e,code:t})};function o(e){e=e||"",a.size||i.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(s=>{r(e,t,s)}):r(e,t)})});let t,s=e.replace(/\D/g,""),o=s.slice(0,n);for(let e=o.length-1;e>=0&&(t=a.get(o.slice(0,e+1)),!t);--e);if(!t)return{formatted:s,country:void 0,code:void 0,leftPattern:""};const d=t.country,c=t.code.patterns||[],l=s.slice(t.code.country_code.length);let h="",u=0,p="";for(let e=c.length-1;e>=0;--e){h=c[e];const t=h.replace(/ /g,"");let s=0;for(let e=0,i=Math.min(l.length,t.length);eu&&(u=s,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=t.code.country_code+" "+h,h.split("").forEach((e,t)=>{" "===e&&" "!==s[t]&&s.length>t&&(s=s.slice(0,t)+" "+s.slice(t))});let g=h&&h.length>s.length?h.slice(s.length):"";return g&&(g=g.replace(/X/g,"‒")),{formatted:s,country:d,code:t.code,leftPattern:g}}},,,,,,,function(e,t,s){"use strict";function i(e){const t=document.createElement("span");return t.innerHTML=e,t}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(30);class a{constructor(){this.tempNum=0}generateMessageId(e,t=!1){const s=a.MESSAGE_ID_OFFSET,i=t?++this.tempNum:0;return e>=s?t?e+(i&a.MESSAGE_ID_INCREMENT-1):e:s+(e*a.MESSAGE_ID_INCREMENT+(i&a.MESSAGE_ID_INCREMENT-1))}getServerMessageId(e){return this.clearMessageId(e,!0)}clearMessageId(e,t){const s=a.MESSAGE_ID_OFFSET;if(e{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function n(e,t,s,n=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(s&&s());if(i[t]&&n||e instanceof HTMLVideoElement)e&&a(e,t),s&&s();else{const n=e instanceof HTMLImageElement,r=n?e:new Image;r.src=t,r.addEventListener("load",()=>{!n&&e&&a(e,t),i[t]=!0,s&&s()},{once:!0}),s&&r.addEventListener("error",e=>{console.error("Render image from url failed:",e,t,r),s()})}}function r(e,t,s){return new Promise(i=>{n(e,t,i,s)})}},function(e,t,s){"use strict";const i=new class{constructor(){this.width=0,this.height=0;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}};t.a=i},,function(e,t,s){"use strict";var i=s(30),a=s(79),n=s(126);function r(e,t){return e.some(e=>e instanceof Promise)?Promise.all(e).then(t):t(e)}var o=s(53),d=s(32),c=s(15),l=s(64),h=s(68),u=s(100),p=s(40),g=s(60),f=s(37),m=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const v=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],_={type:"reactions"};const y=new class{constructor(){c.default.addEventListener("language_change",()=>{this.availableReactions=void 0,this.getAvailableReactions()}),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,setTimeout(()=>{Promise.resolve(this.getAvailableReactions()).then(e=>m(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&h.a.downloadDoc(t.around_animation),t.static_icon&&h.a.downloadDoc(t.static_icon),t.appear_animation&&h.a.downloadDoc(t.appear_animation),t.center_icon&&h.a.downloadDoc(t.center_icon)])})))},7500)}getAvailableReactions(){return this.availableReactions?this.availableReactions:d.a.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{Object(a.a)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of v)e[t]&&(e[t]=h.a.saveDoc(e[t],_));return t},params:{hash:0}})}getActiveAvailableReactions(){return Object(n.a)(this.getAvailableReactions(),e=>e.filter(e=>!e.pFlags.inactive))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();if(e.isUser())return this.unshiftQuickReaction(t);return r([t,g.default.getChatFull(e.toChatId()),this.getQuickReaction()],([e,t,s])=>{var i;const a=(null!==(i=t.available_reactions)&&void 0!==i?i:[]).map(t=>e.find(e=>e.reaction===t)).filter(Boolean);return this.unshiftQuickReactionInner(a,s)})}unshiftQuickReactionInner(e,t){const s=e.findAndSplice(e=>e.reaction===t.reaction);return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return r([e,t],([e,t])=>this.unshiftQuickReactionInner(e,t))}getAvailableReactionsByMessage(e){var t;const s=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&p.a.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(s)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find(t=>t.reaction===e)}getQuickReaction(){return r([d.a.getAppConfig(),this.getAvailableReactions()],([e,t])=>t.find(t=>t.reaction===e.reactions_default))}getReactionCached(e){return this.availableReactions.find(t=>t.reaction===e)}getReaction(e){return Object(n.a)(this.getAvailableReactions(),()=>this.getReactionCached(e))}getMessagesReactions(e,t){return d.a.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map(e=>u.a.getServerMessageId(e)),peer:p.a.getInputPeerById(e)},processResult:e=>{l.a.processUpdateMessage(e)}})}getMessageReactionsList(e,t,s,i,a){return d.a.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:p.a.getInputPeerById(e),id:u.a.getServerMessageId(t),limit:s,reaction:i,offset:a},processResult:e=>(f.a.saveApiUsers(e.users),e)})}setDefaultReaction(e){return d.a.invokeApi("messages.setDefaultReaction",{reaction:e}).then(t=>{if(t){const t=c.default.appConfig;t?t.reactions_default=e:d.a.getAppConfig(!0),c.default.dispatchEvent("quick_reaction",e)}return t})}sendReaction(e,t,s){const i=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(i))return;this.lastSendingTimes.set(i,Date.now()),setTimeout(()=>{this.lastSendingTimes.delete(i)},333);const{peerId:n,mid:r}=e,h=c.default.myId;let g=s?e.reactions:Object(o.a)(e.reactions),f=g?g.results.findIndex(e=>e.pFlags.chosen):-1,m=-1!==f&&g.results[f];if(m&&(--m.count,delete m.pFlags.chosen,t===m.reaction&&(t=void 0),m.count||g.results.splice(f,1),g.recent_reactions&&g.recent_reactions.findAndSplice(e=>p.a.getPeerId(e.peer_id)===h),g.results.length||(g=void 0)),t){g||(g={_:"messageReactions",results:[],pFlags:{}},p.a.isBroadcast(e.peerId)||(g.pFlags.can_see_list=!0));let s=g.results.findIndex(e=>e.reaction===t),i=-1!==s&&g.results[s];if(i||(i={_:"reactionCount",count:0,reaction:t,pFlags:{}},s=g.results.push(i)-1),++i.count,i.pFlags.chosen=!0,!g.recent_reactions&&g.pFlags.can_see_list&&(g.recent_reactions=[]),g.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:p.a.getOutputPeer(h)};p.a.isMegagroup(n)?(g.recent_reactions.unshift(e),g.recent_reactions=g.recent_reactions.slice(0,3)):(g.recent_reactions.push(e),g.recent_reactions=g.recent_reactions.slice(-3))}}const v=this.availableReactions;if(g&&(null==v?void 0:v.length)){const e=new Map;v.forEach((t,s)=>{e.set(t.reaction,s)}),g.results.sort((t,s)=>s.count-t.count||e.get(t.reaction)-e.get(s.reaction))}if(s)return e.reactions=g,c.default.dispatchEvent("message_reactions",{message:e,changedResults:[]}),Promise.resolve();l.a.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:g,local:!0});const _=[n,r].join("-"),y=u.a.getServerMessageId(r),I=d.a.invokeApi("messages.sendReaction",{peer:p.a.getInputPeerById(n),msg_id:y,reaction:t}).then(e=>{Object(a.a)(e);const t=e.updates.findIndex(e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._);if(-1!==t){const s=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:y,peer:p.a.getOutputPeer(n),reactions:s.message.reactions,pts:s.pts,pts_count:s.pts_count}}l.a.processUpdateMessage(e)}).catch(t=>{"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===I&&this.sendReaction(e,null==m?void 0:m.reaction,!0)}).finally(()=>{this.sendReactionPromises.get(_)===I&&this.sendReactionPromises.delete(_)});return this.sendReactionPromises.set(_,I),I}};i.a&&(i.a.appReactionsManager=y);t.a=y},,,,,function(e,t,s){"use strict";var i=s(133),a=s(30),n=s(52),r=s(58),o=s(0),d=s(16),c=s(32),l=s(26),h=s(15),u=s(89),p=s(64),g=s(47),f=s(40),m=s(157),v=s(17),_=s(37),y=s(172),I=s(43),S=s(94),P=s(85),M=s(173);const b=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=y.a,this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.faviconEl=document.head.querySelector('link[rel="icon"]'),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{Promise.all(["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map(e=>u.a.get(e))).then(e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&l.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?l.default.subscribe():l.default.unsubscribe())}l.default.setSettings(this.settings)}),v.default.getState().then(e=>{this.settings.nosound=!e.settings.notifications.sound})},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=Object(r.h)(!0);let t=I.b;for(const s in this.peerSettings.notifyPeer){const i=this.peerSettings.notifyPeer[s];if(i instanceof Promise)continue;const a=i.mute_until;a&&(a<=e?(i.mute_until=0,h.default.dispatchEvent("updateNotifySettings",{_:"updateNotifySettings",peer:{_:"notifyPeer",peer:f.a.getOutputPeer(s.toPeerId())},notify_settings:i})):a{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)},navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.topMessagesDeferred=Object(n.a)(),this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.checkMuteUntilThrottled=Object(S.a)(this.checkMuteUntil,1e3,!1),h.default.addEventListener("instance_deactivated",()=>{this.stop()}),h.default.addEventListener("instance_activated",()=>{this.stopped&&this.start()}),h.default.addEventListener("idle",e=>{this.stopped||(e||this.clear(),this.toggleToggler())}),h.default.addMultipleEventsListeners({updateNotifySettings:e=>{const t="notifyPeer"===e.peer._&&f.a.getPeerId(e.peer.peer),s="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:s,peerId:t,settings:e.notify_settings}),h.default.dispatchEvent("notify_settings",e)}}),h.default.addEventListener("push_init",e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):l.default.subscribe()}),h.default.addEventListener("push_subscribe",e=>{this.registerDevice(e)}),h.default.addEventListener("push_unsubscribe",e=>{this.unregisterDevice(e)}),h.default.addEventListener("dialogs_multiupdate",()=>{this.topMessagesDeferred.resolve()},{once:!0}),h.default.addEventListener("push_notification_click",e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void c.a.invokeApi("account.updateDeviceLocked",{period:86400}).then(()=>{});const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then(()=>{e.custom.channel_id&&!g.a.hasChat(e.custom.channel_id)||t.isUser()&&!_.a.hasUser(t)||h.default.dispatchEvent("history_focus",{peerId:t,mid:+e.custom.msg_id})})})}toggleToggler(e=h.default.idle.isIDLE){if(o.IS_MOBILE)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval(()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=d.default.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const s=t.getContext("2d");s.beginPath(),s.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),s.fillStyle="#3390ec",s.fill();let a=24,n=""+e;e<10?a=22:e<100?a=20:(n="99+",a=16),a*=window.devicePixelRatio,s.font=`700 ${a}px ${i.b}`,s.textBaseline="middle",s.textAlign="center",s.fillStyle="white",s.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)},1e3):t()}getLocalSettings(){return this.settings}getNotifySettings(e){let t,s=Object(M.a)(e._),i=this.peerSettings[s];return"inputNotifyPeer"===e._&&(t=s=f.a.getPeerId(e.peer),i=i[s]),i||((i||this.peerSettings)[s]=c.a.invokeApi("account.getNotifySettings",{peer:e}).then(e=>(this.savePeerSettings({key:s,peerId:t,settings:e}),e)))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map(e=>this.getNotifySettings({_:e}));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return c.a.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then(s=>{s&&p.a.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:Object(M.a)(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})})}getNotifyExceptions(){c.a.invokeApi("account.getNotifyExceptions",{compare_sound:!0}).then(e=>{p.a.processUpdateMessage(e)})}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=c.a.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){c.a.invokeApi("account.setContactSignUpNotification",{silent:e}).then(t=>{this.notifyContactsSignUp=Promise.resolve(!e)})}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}savePeerSettings({key:e,peerId:t,settings:s}){let i;t&&(e=t,i=this.peerSettings.notifyPeer),(i||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(h.default.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),v.default.getState().then(t=>{const i=t.notifySettings;i[e]=s,v.default.pushToState("notifySettings",i)}))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>Object(r.h)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:f.a.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then(e=>this.isMuted(e))}getPeerLocalSettings(e,t=!0){const s={_:"peerNotifySettings"},i=this.peerSettings.notifyPeer[e];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=f.a.getInputNotifyPeerById(e,!0),i=Object(M.a)(t._),a=this.peerSettings[i];if(a&&!(a instanceof Promise))for(let e in a)void 0===s[e]&&(s[e]=a[e])}return s}isPeerLocalMuted(e,t=!0){if(e===h.default.myId)return!1;const s=this.getPeerLocalSettings(e,t);return this.isMuted(s)}start(){if(this.updateLocalSettings(),h.default.addEventListener("settings_updated",this.updateLocalSettings),l.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),this.notificationsCount++,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,s=e.key||"k"+t;this.notificationsShown[s]=!0;const i=Object(r.h)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=i),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let a;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const s=this.notificationsShown[t];"boolean"!=typeof s&&s.tag===e.tag&&(s.hidden=!0)}a=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void l.default.setLocalNotificationsDisabled()}a.onclick=()=>{a.close(),m.a.focus(),this.clear(),e.onclick&&e.onclick()},a.onclose=()=>{a.hidden||(delete this.notificationsShown[s],this.clear())},a.show&&a.show(),this.notificationsShown[s]=a,o.IS_MOBILE||setTimeout(()=>{this.hide(s)},8e3)}}testSound(e){const t=Object(r.h)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(i),i.addEventListener("ended",()=>{i.remove()},{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,l.default.hidePushNotifications()}registerDevice(e){if(this.registeredDevice&&Object(P.a)(this.registeredDevice,e))return!1;c.a.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then(()=>{this.registeredDevice=e},e=>{e.handled=!0})}unregisterDevice(e){if(!this.registeredDevice)return!1;c.a.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then(()=>{this.registeredDevice=!1},e=>{e.handled=!0})}getVibrateSupport(){return this.vibrateSupport}};a.a.appNotificationsManager=b,t.a=b},function(e,t,s){"use strict";s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return d})),s.d(t,"a",(function(){return c})),s.d(t,"e",(function(){return l})),s.d(t,"d",(function(){return h})),s.d(t,"f",(function(){return u}));var i=s(38),a=s(80),n=s(0),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function o(e){let t,s;return e instanceof HTMLVideoElement?(t=e.videoWidth,s=e.videoHeight):(t=e.naturalWidth,s=e.naturalHeight),a={media:e,mediaSize:Object(i.c)(t,s),boxSize:Object(i.c)(320,240),quality:.9},new Promise(e=>{var t,s;const i=document.createElement("canvas"),n=a.mediaSize.aspectFitted(a.boxSize);i.width=n.width*window.devicePixelRatio,i.height=n.height*window.devicePixelRatio,i.getContext("2d").drawImage(a.media,0,0,i.width,i.height),i.toBlob(t=>{e({blob:t,size:n})},null!==(t=a.mimeType)&&void 0!==t?t:"image/jpeg",null!==(s=a.quality)&&void 0!==s?s:1)});var a}function d(e){return new Promise((t,s)=>{e.onseeked=()=>{e.onseeked=()=>{o(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=s,e.currentTime=Math.min(e.duration,1)})}function c(e){return r(this,void 0,void 0,(function*(){const t=yield function(e){return new Promise((t,s)=>{const i=document.createElement("video");i.volume=0,i.addEventListener("loadedmetadata",()=>t(i),{once:!0}),i.addEventListener("error",s,{once:!0}),i.src=e})}(e);return Promise.race([Object(a.a)(2e3),d(t)])}))}function l(e,t=e.HAVE_METADATA,s){return new Promise(i=>{e.readyState>=t?i():e.addEventListener(n.IS_APPLE_MOBILE&&!s?"loadeddata":"canplay",()=>i(),{once:!0})})}function h(e,t=!1){return r(this,void 0,void 0,(function*(){const s=[],i=(e,a)=>r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise((e,s)=>{t.readEntries(t=>r(this,void 0,void 0,(function*(){for(const e of t)yield i(e,a);e()})))})}else if(e)if(t)s.push(e.type);else{const t=a.getAsFile(),i=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise((s,i)=>e.file(s,e=>s(t)));if(!i)return;s.push(i)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let i=0;i{t.addEventListener("change",t=>{const i=t.target.files[0];i?e(i):s("NO_FILE_SELECTED")},{once:!0})}).finally(()=>{t.remove()});return t.click(),s}},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const i=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const s=e;return()=>!s.cleaned&&(!t||t())}}}},,,,function(e,t,s){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}s.d(t,"a",(function(){return i}))},,,function(e,t,s){"use strict";function i(e,t){if(!e)return t;for(var s in e)t.hasOwnProperty(s)||delete e[s];for(var s in t)e[s]=t[s];return e}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return c}));var i=s(48),a=s(45),n=s(5),r=s(29),o=s(90),d=s(42);class c{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&Object(n.a)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&Object(d.a)(this,e)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&Object(r.b)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,s=Date.now(),i=i=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const n=Date.now()-s;if(!i&&this.cancelable){this.setProgress(100);const e=150;n{t===this.tempId&&this.detach()},e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),Object(a.b)(()=>{this.setManual()})):this.detach();this.promise=e=null};e.then(()=>i(null)).catch(e=>i(e)),e.addNotifyListener&&e.addNotifyListener(e=>{if(t!==this.tempId)return;const s=e.done/e.total*100;this.setProgress(s)})}attach(e,t=!1,s){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,s&&this.attachPromise(s),this.detached||this.preloader.parentElement!==e){const t=Object(o.a)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),Object(i.a)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&Object(i.a)(this.preloader,"is-visible",!1,200,()=>{this.preloader.remove()},1))}setProgress(e){if(this.totalLength||Object(o.a)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},,,,function(e,t,s){"use strict";function i(e,t,s=t+10){return(e=e.trim()).length>s&&(e=e.slice(0,t)+"..."),e}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(101),a=s(33),n=s(120),r=s(43),o=s(31),d=s(15),c=s(73),l=s(40),h=s(56),u=s(37);const p=new class{constructor(){this.savedAvatarURLs={}}isAvatarCached(e){return!!this.savedAvatarURLs[e]}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,s){const i=l.a.getInputPeerById(e);let a,n=!1,r=this.savedAvatarURLs[e];if(r&&r[s])"string"!=typeof r[s]?a=r[s]:(a=Promise.resolve(r[s]),n=!0);else{r||(r=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:i,photo_id:t.photo_id};"photo_big"===s&&(n.pFlags.big=!0);const o={dcId:t.dc_id,location:n},d=c.a.download(o);a=r[s]=d.then(e=>r[s]=URL.createObjectURL(e))}return{cached:n,loadPromise:a}}putAvatar(e,t,s,r,o=new Image,c=!1){let l,u,p,{cached:g,loadPromise:f}=this.loadAvatar(t,s,r);if(o.classList.add("avatar-photo"),g)u=()=>{Object(a.a)(e,o),e.dataset.color=""};else{const c=d.default.settings.animationsEnabled;if(c&&o.classList.add("fade-in"),"photo_big"===r){const i=this.putAvatar(e,t,s,"photo_small");l=i.loadPromise,p=i.thumbImage}else if(s.stripped_thumb){p=new Image,e.classList.add("avatar-relative"),p.classList.add("avatar-photo","avatar-photo-thumbnail");const t=h.a.getPreviewURLFromBytes(s.stripped_thumb);l=Object(i.b)(p,t).then(()=>{Object(a.a)(e,p)})}u=()=>{p?e.append(o):Object(a.a)(e,o),setTimeout(()=>{e.childElementCount&&n.a.mutateElement(o,()=>{e.dataset.color="",c&&o.classList.remove("fade-in"),p&&p.remove()})},c?200:0)}}const m=f.then(e=>Object(i.b)(o,e)).then(u);return{cached:g,loadPromise:l||m,thumbImage:p}}s(e,t,s,i){e.innerHTML=t,e.dataset.color=s,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),i&&e.classList.add(i)}putPhoto(e,t,s=!1,i="",a=!1,n){var c;const h=d.default.myId;if(t===h&&s)return void this.s(e,"","","tgico-saved");if(t!==r.c&&t.isUser()){const s=u.a.getUser(t);if(s&&s.pFlags&&s.pFlags.deleted)return void this.s(e,"",l.a.getPeerColorById(t),"tgico-deletedaccount")}const p=l.a.getPeerPhoto(t),g=!!p,f=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!g||!f||!this.savedAvatarURLs[t]){let a,n="";if(!t||t===h&&s||(n=l.a.getPeerColorById(t)),t===r.d)return void this.s(e,"",n,"tgico-reply_filled");if(i)a=o.b.getAbbreviation(i);else{a=null!==(c=l.a.getPeer(t).initials)&&void 0!==c?c:""}this.s(e,a,n,"")}if(g){const s=n?"photo_big":"photo_small";return this.putAvatar(e,t,p,s,void 0,a)}}};t.a=p},function(e,t,s){"use strict";var i;!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(i||(i={})),t.a=i},function(e,t,s){"use strict";function i(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,"a",(function(){return i}))},,,,,,function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(145);class a{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=Object(i.c)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}search(e){const t=this.fullTexts;this.options&&(e=Object(i.c)(e,this.options));const s=[],a=e.split(" "),n=a.length;t.forEach((e,t)=>{let i=!0,r=0;for(let t=0;te.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars);return new Set(s.map(e=>e.what))}}},function(e,t,s){"use strict";s.d(t,"b",(function(){return r})),s.d(t,"a",(function(){return p}));var i=s(105);const a=new Map,n=new Set,r='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let o;const d=()=>{cancelAnimationFrame(o),o=window.requestAnimationFrame(c)},c=()=>{n.forEach(l),n.clear()};window.addEventListener("resize",()=>{for(const[e]of a)n.add(e);d()},{capture:!0,passive:!0});const l=e=>{let t=a.get(e);const s=!t;let{text:n,textLength:o,from:d,multiplier:c,font:l,textWidth:h,elementWidth:p}=t||{};s&&(n=e.textContent,o=n.length,d=50,c=d>0&&d/100,l=`${e.dataset.fontWeight||400} 16px ${r}`,h=u(n,l),p=e.getBoundingClientRect().width,t={text:n,textLength:o,from:d,multiplier:c,font:l,textWidth:h,elementWidth:p},a.set(e,t));const g=e.getBoundingClientRect().width,f=s||p!==g;if(!s&&f&&(t.elementWidth=p=g),f)if(h>p){e.setAttribute("title",n);let s=n,a=p;for(;s.length>3;){let t=s.length;const n=c&&Object(i.a)(c*t<<0,1,t-2)||Math.max(t+d-1,1),r=s.substr(0,n).replace(/\s*$/,""),o=s.substr(n+1).replace(/^\s*/,"");if(s=r+o,a=u(s+"…",l),a{this.drafts=e||{}}),i.default.addMultipleEventsListeners({updateDraftMessage:e=>{const t=a.a.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}})}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then(()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();n.a.getDialogOnly(t)||n.a.reloadConversation(t)}})}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=c.a.invokeApi("messages.getAllDrafts").then(e=>{(r.a.updatesState.syncLoading||Promise.resolve()).then(()=>{r.a.processUpdateMessage(e)})}))}saveDraft(e,t,s,a={}){const n=this.processApiDraft(s),r=this.getKey(e,t);return n?this.drafts[r]=n:delete this.drafts[r],u.a.set({drafts:this.drafts}),a.notify&&i.default.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:a.force}),n}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!Object(f.a)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!Object(m.a)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(!e||"draftMessage"!==e._)return;const t=o.b.parseEntities(e.message),s=e.entities||[],i=o.b.mergeEntities(s.slice(),t);return e.rMessage=o.b.wrapDraftText(e.message,{entities:i}),e.reply_to_msg_id&&(e.reply_to_msg_id=p.a.generateMessageId(e.reply_to_msg_id)),e}syncDraft(e,t,s,i=!0,r=!1){return v(this,void 0,void 0,(function*(){const o=this.getDraft(e,t);if(this.draftsAreEqual(o,s))return!0;let h,u={peer:a.a.getInputPeerById(e),message:""};if(this.isEmptyDraft(s))h={_:"draftMessageEmpty"};else{Object(g.a)(s);let e=s.message,t=s.entities;s.reply_to_msg_id&&(u.reply_to_msg_id=p.a.getServerMessageId(s.reply_to_msg_id)),(null==t?void 0:t.length)&&(u.entities=n.a.getInputEntities(t)),s.pFlags.no_webpage&&(u.no_webpage=s.pFlags.no_webpage),u.message=e}const f=h||s;return f.date=Object(l.h)(!0)+d.a.serverTimeOffset,this.saveDraft(e,t,f,{notify:!0,force:r}),!(i&&!t)||c.a.invokeApi("messages.saveDraft",u)}))}clearAllDrafts(){return c.a.invokeApi("messages.clearAllDrafts").then(e=>{if(e)for(const e in this.drafts){const[t,s]=e.split("_");i.default.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:s?+s:void 0,draft:void 0})}})}clearDraft(e,t){const s={_:"draftMessageEmpty"};t?this.syncDraft(e,t,s,!1,!0):this.saveDraft(e,t,s,{notify:!0,force:!0})}setDraft(e,t,s,i){const a={_:"draftMessage",date:Date.now()/1e3|0,message:s,pFlags:{},entities:i};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}};h.a.appDraftsManager=_,t.a=_},function(e,t,s){"use strict";s.d(t,"a",(function(){return r})),s.d(t,"c",(function(){return o})),s.d(t,"b",(function(){return d}));var i=s(59),a=s(42),n=s(165);class r{constructor(e,t){this.mid=e,this.type=t,this.port=n.b}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver(Object(n.c)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function o(e,t,s){let i;if(Array.isArray(t)){if(!t[0])return;i=t,t=i[0].sources[0]}return{endpoint:s,type:e,source:t,sourceGroups:i}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return Object(a.a)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,s=new r(t,e);return this.entries.push(s),this.entriesByMid.set(t,s),s}deleteEntry(e){Object(i.a)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let s=this.entriesByPeerId.get(t);s||this.entriesByPeerId.set(t,s=new Set),s.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let s=this.entries.find(s=>"sendrecv"===s.direction&&s.type===e&&!(t?s.sendEntry:s.recvEntry));return s||(s=this.createEntry(e),s.setDirection("sendrecv")),s}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return n.a.fromConference(Object.assign({conference:this},e))}}},,function(e,t,s){"use strict";var i=s(30),a=s(180),n=s(118),r=s(66),o=s(127),d=s(186),c=s(125),l=s(164),h=s(150),u=s(193),p=s(162),g=s(163),f=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};var m=s(135),v=s(41),_=s(32),y=s(43),I=s(15),S=s(64),P=s(47),M=s(40),b=s(37),w=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const C=new class{constructor(){this.makeSsrcsFromParticipant=e=>{var t,s;return[this.makeSsrcFromParticipant(e,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.video.audio_source),e.video&&this.makeSsrcFromParticipant(e,"video",e.video.source_groups,e.video.endpoint),(null===(s=e.presentation)||void 0===s?void 0:s.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.presentation.audio_source),e.presentation&&this.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)},this.log=Object(v.b)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,I.default.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),I.default.addEventListener("group_call_update",e=>{if("groupCallDiscarded"===e._){const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&t.hangUp(!1,!1,!0),this.participants.delete(e.id)}}),this.audioAsset=new a.a(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"])}get groupCall(){return this.currentGroupCall}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,s=t.get(e);return{nextOffset:s,setNextOffset:i=>{t.get(e)===s&&t.set(e,i)}}}saveApiParticipant(e,t,s){const{currentGroupCall:i}=this,a=this.getCachedParticipants(e),r=M.a.getPeerId(t.peer),o=a.get(r),d=t.pFlags.left;if(!o&&d)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0);const c=(null==i?void 0:i.id)===e;o?(Object(n.a)(o,t),t=o):a.set(r,t),c&&i.onParticipantUpdate(t,this.doNotDispatchParticipantUpdate);const l=this.getGroupCall(e);if("groupCall"===(null==l?void 0:l._)){let e=!1;d?(--l.participants_count,e=!0):!t.pFlags.just_joined||o||t.pFlags.self||(++l.participants_count,e=!0),e&&I.default.dispatchEvent("group_call_update",l)}d&&a.delete(r),o&&this.doNotDispatchParticipantUpdate!==r&&I.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,s){t.saved||(t.saved=!0,t.forEach(t=>this.saveApiParticipant(e,t,s)))}editParticipant(e,t,s){return w(this,void 0,void 0,(function*(){if(!Object.keys(s).length)return;if(t){const{currentGroupCall:i}=this,a=(null==i?void 0:i.id)===e&&t.pFlags.self;if(a&&void 0!==s.muted&&!i.isSharingAudio&&(delete s.muted,!Object.keys(s).length))return;const n=s.muted;void 0!==n&&t.pFlags.self&&(n?t.pFlags.muted=!0:t.pFlags.can_self_unmute&&delete t.pFlags.muted),void 0!==s.raiseHand&&(s.raiseHand?t.raise_hand_rating="1":delete t.raise_hand_rating),a&&(void 0!==s.videoStopped&&(s.videoStopped?delete t.video:t.video=this.generateSelfVideo(i.connections.main.sources.video)),!t.pFlags.muted&&t.pFlags.can_self_unmute&&i.setMuted(!1),i.dispatchEvent("state",i.state)),I.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}const i=t.pFlags.self?y.c:M.a.getPeerId(t.peer),a=yield _.a.invokeApiSingle("phone.editGroupCallParticipant",{call:C.getGroupCallInput(e),participant:i===y.c?M.a.getInputPeerSelf():M.a.getInputPeerById(i),muted:s.muted,volume:s.volume,raise_hand:s.raiseHand,video_paused:s.videoPaused,video_stopped:s.videoStopped,presentation_paused:s.presentationPaused});S.a.processUpdateMessage(a)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return w(this,void 0,void 0,(function*(){const s=this.getGroupCall(e);if(s&&"inputGroupCall"!==s._&&!t)return s;const i=this.getCachedParticipants(e).size?0:100;return _.a.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:i},processResult:t=>{b.a.saveApiUsers(t.users),P.a.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const s=this.saveGroupCall(t.call);return i&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),s}})}))}saveGroupCall(e,t){const s=this.groupCalls.get(e.id),i="inputGroupCall"!==e._&&(!s||"groupCallDiscarded"!==s._);return s?(i&&Object(n.a)(s,e),e=s):this.groupCalls.set(e.id,e),i&&I.default.dispatchEvent("group_call_update",e),e}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}setCurrentGroupCall(e){this.currentGroupCall=e,e&&I.default.dispatchEvent("group_call_instance",e)}createGroupCall(e,t,s){return w(this,void 0,void 0,(function*(){const i=yield _.a.invokeApi("phone.createGroupCall",{peer:M.a.getInputPeerById(e.toPeerId(!0)),random_id:Object(r.a)(32),schedule_date:t,title:s});S.a.processUpdateMessage(i);return i.updates.find(e=>"updateGroupCall"===e._).call}))}joinGroupCall(e,t,s=!0,i,a){return w(this,void 0,void 0,(function*(){let n;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${s} rejoin=${i}`),n=i?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return f(this,void 0,void 0,(function*(){const s={audio:Object(u.a)(),video:t&&Object(g.a)()},i=new h.a(l.b);try{const t=yield Object(p.a)(s,e);i.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,s),i.inputStream=new MediaStream}return i}))}(s,a),this.joinGroupCallInternal(e,t,n,s,i,a)}))}joinGroupCallInternal(e,t,s,i,a=!1,n){return w(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);let{currentGroupCall:o}=this;if(!o||!a){o=new d.a({chatId:e,id:t}),o.fixSafariAudio(),o.addEventListener("state",e=>{this.currentGroupCall===o&&e===c.a.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),I.default.dispatchEvent("chat_update",o.chatId))}),o.groupCall=yield this.getGroupCallFull(t);const l=o.createConnectionInstance({streamManager:s,type:"main",options:{type:"main",isMuted:i,joinVideo:n,rejoin:a}}),h=l.createPeerConnection();return h.addEventListener("negotiationneeded",()=>{l.negotiate()}),h.addEventListener("track",e=>{r("ontrack",e),o.onTrack(e)}),h.addEventListener("iceconnectionstatechange",()=>{o.dispatchEvent("state",o.state);const{iceConnectionState:e}=h;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":break;case"closed":o.hangUp();break;case"completed":break;case"connected":o.joined||(o.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.getGroupCallParticipants(t).then(({participants:e})=>{this.saveApiParticipants(t,[...e.values()])}));break;case"disconnected":break;case"failed":o.hangUp()}}),l.createDescription(),l.createDataChannel(),l.appendStreamToConference(),this.setCurrentGroupCall(o),r("set currentGroupCall",t,o),this.startConnectingSound(),l.negotiate()}o.handleUpdateGroupCallParticipants=!1,o.updatingSdp=!1,r("update currentGroupCall",t,o)}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}generateSelfVideo(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}generateSelfParticipant(){var e,t;const s=this.currentGroupCall.connections.main.sources,i=null===(e=this.currentGroupCall.connections.presentation)||void 0===e?void 0:e.sources;return{_:"groupCallParticipant",pFlags:{can_self_unmute:!0,self:!0},source:s.audio.source,video:this.generateSelfVideo(s.video),presentation:i&&this.generateSelfVideo(i.video,null===(t=i.audio)||void 0===t?void 0:t.source),date:Object(o.a)(!0),peer:M.a.getOutputPeer(I.default.myId)}}makeSsrcFromParticipant(e,t,s,i){return Object(m.c)(t,s,i)}getGroupCallParticipants(e){return w(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:s}=this.prepareToSavingNextOffset(e);return""!==t&&(yield _.a.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const i=t.count===t.participants.length?"":t.next_offset;P.a.saveApiChats(t.chats),b.a.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),s(i)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t=!1,s=!1){return w(this,void 0,void 0,(function*(){this.log(`hangUp start id=${e} discard=${t} rejoin=${s}`);const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.hangUp(t,s)}))}toggleMuted(e){return this.changeUserMuted(y.c,e)}changeUserMuted(e,t){const{currentGroupCall:s}=this;if(!s)return;const i=s.getParticipantByPeerId(e);return y.c===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(s.id,i,{muted:t})}};i.a&&(i.a.appGroupCallsManager=C);t.a=C},,,,,,,,function(e,t,s){"use strict";s.d(t,"a",(function(){return r})),s.d(t,"b",(function(){return d})),s.d(t,"c",(function(){return c}));var i=s(158);const a=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,n=/^\s+|\s$/g;function r(e){return e.replace(a,"").replace(n,"")}function o(e){return e.replace(/[^A-Za-z0-9]/g,e=>{const t=i.a.LatinizeMap[e];return void 0!==t?t:e})}function d(e,t=!0){const s="%"===e.charAt(0);return e=r(e),t&&(e=o(e)),e=e.toLowerCase(),s&&(e="%"+e),e}function c(e,t={}){const s=t.includeTag&&"%"===e.charAt(0);return t.clearBadChars&&(e=r(e)),t.latinize&&(e=o(e)),t.ignoreCase&&(e=e.toLowerCase()),s&&(e="%"+e),e}},function(e,t,s){"use strict";s.d(t,"a",(function(){return i})),s.d(t,"b",(function(){return n}));var i,a=s(30);!function(e){e[e.None=0]="None",e[e.Top=1]="Top",e[e.Bottom=2]="Bottom",e[e.Both=3]="Both"}(i||(i={}));class n{constructor(){this.sliceConstructor=n.getSliceConstructor(this);const e=this.constructSlice();this.slices=[e]}static getSliceConstructor(e){return class extends Array{constructor(){super(...arguments),this.end=i.None}isEnd(t){if((this.end&t)===t)return!0;let s=!1;if(t===i.Top){const i=e.last;s=!!(i.end&t)&&this.includes(i[i.length-1])}else if(t===i.Bottom){const i=e.first;s=!!(i.end&t)&&this.includes(i[0])}else if(t===i.Both)return this.isEnd(i.Top)&&this.isEnd(i.Bottom);return s&&this.setEnd(t),s}setEnd(e){this.end|=e}unsetEnd(e){this.end&=~e}splice(t,s,...a){const n=super.splice(t,s,...a);if(!this.length){const t=e.slices,s=t.indexOf(this);-1!==s&&(1===t.length?this.unsetEnd(i.Both):t.splice(s,1))}return n}}}constructSlice(...e){const t=new this.sliceConstructor(e.length);for(let s=0,i=e.length;ss[0])break}this.slices.splice(t,0,this.constructSlice(...e)),d=t}return t?this.flatten(d):void 0}flatten(e){if(this.slices.length>=2)for(let t=0,s=this.slices.length;t=t[i])return{slice:t,offset:e===t[i]?i:i-1}}if(t&&t.isEnd(i.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let a=this.slice,n=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;a=t.slice,n=r=t.offset,a.includes(e)&&(r+=1)}let o=Math.max(r+t,0),d=r+t+s;const c=a.slice(o,d),l=t<0?s+t:s,h=Math.abs(t),u=a.length-r>=l||!!a.isEnd(i.Top)&&(c.setEnd(i.Top),!0),p=r-h>=0||!!a.isEnd(i.Bottom)&&(c.setEnd(i.Bottom),!0);return{slice:c,offsetIdOffset:n,fulfilled:i.None|(u&&p?i.Both:(u?i.Top:i.None)|(p?i.Bottom:i.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(i.Bottom)||(t=this.constructSlice(),t.setEnd(i.Bottom),this.slices.unshift(t)):t.setEnd(i.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(i.Top)||(t=this.constructSlice(),t.setEnd(i.Top),this.slices.push(t)):t.setEnd(i.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}}a.a&&(a.a.SlicedArray=n)},function(e,t,s){"use strict";function i(e,t,s,i){const a=t[s];if(void 0===i&&-1!==(i=e.indexOf(t))){const t=e[i-1],n=e[i+1];if((!t||t[s]>=a)&&(!n||n[s]<=a))return i;e.splice(i,1)}const n=e.length;if(!n||a<=e[n-1][s])return e.push(t)-1;if(a>=e[0][s])return e.unshift(t),0;for(let i=0;ie[i][s])return e.splice(i,0,t),i;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(30),a=s(53),n=s(41),r=s(32),o=s(31),d=s(15),c=s(64),l=s(100),h=s(39),u=s(40),p=s(37);const g=new class{constructor(){this.polls={},this.results={},this.pollToMessages={},this.log=Object(n.b)("POLLS",n.a.Error),d.default.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let s=e.results;const i=this.savePoll(t,s);t=i.poll,s=i.results,d.default.dispatchEvent("poll_update",{poll:t,results:s})}})}savePoll(e,t,s){s&&this.updatePollToMessage(s,!0);const i=e.id;return this.polls[i]?(e=Object.assign(this.polls[i],e),t=this.saveResults(e,t)):(this.polls[i]=e,e.rQuestion=o.a.wrapEmojiText(e.question),e.rReply=o.a.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var s;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(s=null==t?void 0:t.results)||void 0===s?void 0:s.length)&&t.results.forEach((t,s)=>{var i;(null===(i=t.pFlags)||void 0===i?void 0:i.chosen)&&e.chosenIndexes.push(s)})),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,s,i){return s?(i||(i=[]),s=o.a.parseMarkdown(s,i)):s=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:s,solution_entities:s?i:void 0}}updatePollToMessage(e,t){const{id:s}=e.media.poll;let i=this.pollToMessages[s];if(!t&&!i)return;i||(i=this.pollToMessages[s]=new Set);const a=e.peerId+"_"+e.mid;t?i.add(a):i.delete(a),t||i.size||(delete this.polls[s],delete this.results[s],delete this.pollToMessages[s])}sendVote(e,t){const s=e.media.poll,i=t.map(e=>s.answers[e].option),a=e.mid,n=e.peerId,o=u.a.getInputPeerById(n);return e.pFlags.is_outgoing?h.a.invokeAfterMessageIsSent(a,"sendVote",e=>(this.log("invoke sendVote callback"),this.sendVote(e,t))):r.a.invokeApi("messages.sendVote",{peer:o,msg_id:l.a.getServerMessageId(e.mid),options:i}).then(e=>{this.log("sendVote updates:",e),c.a.processUpdateMessage(e)})}getResults(e){const t=u.a.getInputPeerById(e.peerId);return r.a.invokeApi("messages.getPollResults",{peer:t,msg_id:l.a.getServerMessageId(e.mid)}).then(e=>{c.a.processUpdateMessage(e),this.log("getResults updates:",e)})}getVotes(e,t,s,i=20){return r.a.invokeApi("messages.getPollVotes",{peer:u.a.getInputPeerById(e.peerId),id:l.a.getServerMessageId(e.mid),option:t,offset:s,limit:i}).then(e=>(this.log("getPollVotes messages:",e),p.a.saveApiUsers(e.users),e))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const s=Object(a.a)(t);return s.pFlags.closed=!0,h.a.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(s)}).then(()=>{},e=>{this.log.error("stopPoll error:",e)})}};i.a.appPollsManager=g,t.a=g},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(81);function a(e){e.stop(),Object(i.a)(e,"ended")}},function(e,t,s){"use strict";s.d(t,"a",(function(){return l}));var i=s(41),a=s(15),n=s(164),r=s(149),o=s(165),d=s(151);class c{constructor(e,t){const s=this.streamSource=e.createMediaStreamSource(t),i=this.analyser=e.createAnalyser();this.gain=e.createGain();i.minDecibels=-100,i.maxDecibels=-30,i.smoothingTimeConstant=.05,i.fftSize=1024,s.connect(i)}}class l{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:s,track:i,source:a,type:n}=e,r=t.analyser;if(!r)return;const o=new Uint8Array(r.frequencyBinCount);r.getByteFrequencyData(o);return{type:n,source:a,stream:s,track:i,value:Object(d.b)(o)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter(e=>"input"===e.type)).filter(e=>"audio"===e.kind).slice(0,n.a).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),a.default.dispatchEvent("group_call_amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=Object(i.b)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach(s=>{this.addTrack(e,s,t)})}addTrack(e,t,s){this.log("addTrack",s,t,e);const{context:i,items:a,inputStream:n,outputStream:r}=this,o=t.kind,d=l.getSource(e,s);switch(s){case"input":n?n.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)},{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find(t=>"input"===t.type&&t.kind===e)}static getSource(e,t){return"input"===t?e.source||e.id:""+Object(d.c)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let s=!1;for(let i=0,a=t.length;!s&&i[e,a]),r=t.getTracks();for(const[t,a]of n){let n=e.findEntry(e=>e.direction===s&&e.type===t);if(!n){if(!i)continue;n=e.createEntry(t)}let{transceiver:d}=n;d||(d=n.createTransceiver(e.connection,a)),n.direction!==d.direction&&(d.direction=n.direction);const c=Object(o.c)(t),l=r.findIndex(e=>e.kind===c),h=-1!==l?r.splice(l,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch(e=>{this.log.error(e)})}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach(e=>{Object(r.a)(e)})}catch(e){this.log.error(e)}}}},function(e,t,s){"use strict";function i(e){return e<<0}function a(e){return e>>>0}function n(e,t=3){if(!e)return 0;const{length:s}=e;let i=0;for(let t=0;t+e);return"asc"===t?s.sort((e,t)=>e-t):s.sort((e,t)=>t-e)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return f}));var i=s(52),a=s(82),n=s(45),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=[];let d=!1;function c(e,t="push"){return e.items.length?(e.promise=Object(i.a)(),o[t](e),function e(){if(!d){(function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),s=[];return new Promise((i,o)=>{const d=()=>r(this,void 0,void 0,(function*(){const r=performance.now();do{yield Object(a.c)();const i=e.process.apply(e.context,t.shift());let n;if(i instanceof Promise)try{n=yield i}catch(e){return void o(e)}else n=i;s.push(n)}while(t.length>0&&performance.now()-r<6);t.length>0?Object(n.b)(d):i(s)}));Object(n.b)(d)}).then(e.promise.resolve,e.promise.reject)})(o.shift()).finally(()=>{d=!1,o.length&&e()})}}(),e.promise):Promise.resolve([])}const l="filter"in(document.createElement("canvas").getContext("2d")||{});let h,u;function p(e,t,s){return new Promise(i=>{const a=document.createElement("canvas");a.width=e.width,a.height=e.height;const n=a.getContext("2d",{alpha:!1});l?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,a.width+4*t,a.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,a.width,a.height,t,s)),i(a.toDataURL())})}h=l?Promise.resolve():s.e(31).then(s.bind(null,200)).then(e=>{u=e.default});const g=new Map;function f(e,t=2,s=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(g.size>1e3&&g.clear(),g.has(e))return g.get(e);const i=new Promise(i=>{h.then(()=>{const a=new Image;a.onload=()=>{l?p(a,t,s).then(i):c({items:[[a,t,s]],context:null,process:p},"unshift").then(e=>{i(e[0])})},a.src=e})});return g.set(e,i),i}},,function(e,t,s){"use strict";function i(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let i=0;t%2&&(s[i++]=parseInt(e.charAt(0),16));for(let a=i;a{const t=e.payload;Object(o.a)(e),e.originalPayload=t,this.refreshReference(t).then(t=>{e.payload=t},t=>{e.error=t}).then(()=>r.a.postMessage(e))})}saveContext(e,t,s){[s,e]=this.getContexts(e),s||(s=new Set,this.contexts.set(e,s)),this.links[Object(c.a)(e)]=e;for(const e of s)if(Object(l.a)(e,t))return;s.add(t)}getReferenceByLink(e){return this.links[Object(c.a)(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,s){if([s,e]=this.getContexts(e),s)for(const i of s)if(Object(l.a)(i,t))return s.delete(i),s.size||(this.contexts.delete(e),delete this.links[Object(c.a)(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const s=this.getContext(e);if(!s)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=s}let s;switch(null==t?void 0:t.type){case"message":s=i.a.wrapSingleMessage(t.peerId,t.messageId,!0);break;case"emojiesSounds":s=this.refreshEmojiesSoundsPromise||a.a.getAnimatedEmojiSounds(!0).then(()=>{this.refreshEmojiesSoundsPromise=void 0});break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const n=Object(c.a)(e);return this.log("refreshReference: refreshing reference:",n),s.then(()=>{const s=Object(c.a)(e);if(this.log("refreshReference: refreshed, reference before:",n,"after:",s),n!==s)return e;this.deleteContext(e,t);const i=this.getContext(e);if(i)return this.refreshReference(e,i[0]);throw this.log.error("refreshReference: no new context, reference before:",n,"after:",s,t),"NO_NEW_CONTEXT"})}};n.a.referenceDatabase=h,t.a=h},function(e,t,s){"use strict";function i(e){var t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function a(e,t){return i(this,void 0,void 0,(function*(){const s=yield navigator.mediaDevices.getUserMedia(e);return s.getTracks().forEach(e=>{e.enabled=!t}),s}))}window.getStream=a},function(e,t,s){"use strict";function i(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return i})),s.d(t,"b",(function(){return a}));const i=50,a=100},function(e,t,s){"use strict";s.d(t,"b",(function(){return r})),s.d(t,"c",(function(){return o})),s.d(t,"d",(function(){return c})),s.d(t,"a",(function(){return l}));var i=s(0),a=s(183),n=s(151);const r="9";function o(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function c(e,t=r,s){const i=d(e);return`m=${o(e)} ${t} ${i} ${s.join(" ")}`}class l extends a.a{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(" generation "+e.generation),t.join("")}(e))}addHeader(e,t){const s=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed","a=group:BUNDLE "+s,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add("a=ice-ufrag:"+e.ufrag,"a=ice-pwd:"+e.pwd,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,"a=setup:"+t.setup);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:s,sourceGroups:i}=e;const a=Object(n.a)(e.source);t+=a,s+=a;const r=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${s}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${s}`)};return(()=>{this.add(`a=msid:${t} ${s}`)})(),(null==i?void 0:i.length)?i.forEach(e=>{if(e.sources.length){const t=e.sources.map(n.a);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(r)}}):r(a),this}addSsrcEntry(e,t,s){const i=(...e)=>this.add(...e),{type:a,mid:n,direction:r,port:l}=e,h=t.transport,u="application"===a,p=u?void 0:t[a],g="inactive"===r;if(e.shouldBeSkipped(s))return i(`m=${o(a)} 0 ${d(a)} 0`,"c=IN IP4 0.0.0.0","a=inactive","a=mid:"+n);const f=u?[{id:5e3}]:p["payload-types"],m=f.map(e=>e.id);i(c(a,l,m),"c=IN IP4 0.0.0.0",`a=rtcp:${l} IN IP4 0.0.0.0`),h["rtcp-mux"]&&i("a=rtcp-mux"),i("a=mid:"+n);let v=r;if("sendrecv"===r||!s||g||u||(v="sendonly"===r?"recvonly":"sendonly"),i("a="+v),this.addTransport(h),u)i(`a=sctpmap:${f[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach(e=>{i(`a=extmap:${e.id} ${e.uri}`)}),f.forEach(e=>{i(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?"/"+e.channels:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const s=[];for(const e in t)s.push(`${e}=${t[e]}`);i(`a=fmtp:${e.id} ${s.join(";")}`)}const s=e["rtcp-fbs"];(null==s?void 0:s.length)&&s.forEach(t=>{i(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)})})}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:s,bundle:a,isAnswer:n}=e;this.addHeader(t.sessionId,a),i.IS_FIREFOX&&this.addTransport(t.transport);for(const e of s)this.addSsrcEntry((n?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,n);return this}static fromConference(e){return(new l).addConference(e).finalize()}}},function(e,t,s){"use strict";s.d(t,"b",(function(){return re})),s.d(t,"a",(function(){return de}));var i,a,n=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},r=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class o{constructor(e,t){i.set(this,void 0),a.set(this,void 0),n(this,i,e,"f"),n(this,a,t,"f")}get session(){return r(this,i,"f")}get media(){return r(this,a,"f")}get bundle(){return this.session.lines.find(e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map(e=>e.lines)).map(e=>e.toString()).join("\r\n")+"\r\n"}}function d(e,t,s){const i=e.split(t),a=[];for(;s>0&&i.length;)a.push(i.shift()),--s;return i.length&&a.push(i.join(t)),a}i=new WeakMap,a=new WeakMap;var c,l,h,u=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},p=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class g{constructor(e,t){c.set(this,void 0),l.set(this,void 0),h.set(this,void 0),u(this,c,new Set,"f"),u(this,l,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,l,"f"),t=p(this,h,"f"),s=p(this,c,"f"),i=t-e+1;let a=Math.floor(e+i*Math.random()),n=0;for(;s.has(a);)if(a=i)return null;return s.add(a),a}add(e){p(this,c,"f").add(e)}}c=new WeakMap,l=new WeakMap,h=new WeakMap;var f,m,v=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},_=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class y{constructor(e,t){f.set(this,void 0),m.set(this,void 0),v(this,f,e,"f"),v(this,m,t,"f")}get key(){return _(this,f,"f")}get value(){return _(this,m,"f")}}f=new WeakMap,m=new WeakMap;var I,S,P,M,b=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},w=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class C{constructor(e,t,s,i){I.set(this,void 0),S.set(this,void 0),P.set(this,void 0),M.set(this,void 0),b(this,I,e,"f"),b(this,S,t,"f"),b(this,P,s,"f"),b(this,M,i,"f")}get type(){return w(this,I,"f")}get port(){return w(this,S,"f")}get protocol(){return w(this,P,"f")}get ids(){return w(this,M,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}I=new WeakMap,S=new WeakMap,P=new WeakMap,M=new WeakMap;var k,E,A,D,T=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},U=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class F{constructor(e,t){if(k.set(this,void 0),E.set(this,void 0),A.set(this,void 0),D.set(this,void 0),T(this,k,e,"f"),"string"==typeof t){if(T(this,E,t,"f"),"m"===e){const e=t.split(" ");T(this,A,new C(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],T(this,D,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof C?(T(this,A,t,"f"),T(this,E,t.toString(),"f")):t instanceof y&&(T(this,D,t,"f"),T(this,E,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return U(this,k,"f")}get value(){return U(this,E,"f")}get parsed(){return U(this,D,"f")}get mediaLineParts(){return U(this,A,"f")}toString(){return`${this.key}=${this.value}`}}k=new WeakMap,E=new WeakMap,A=new WeakMap,D=new WeakMap;var O,x,j,L,R,B,N=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},H=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class G{constructor(e,t,s=":",i=!1){O.set(this,void 0),x.set(this,void 0),j.set(this,void 0),L.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N(this,O,e,"f"),N(this,x,t,"f"),N(this,j,s,"f"),N(this,R,i,"f"),N(this,L,i?new Map:null,"f"),N(this,B,i?[]:null,"f")}get lines(){return H(this,x,"f")}get value(){return H(this,R,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,R,"f")}get key(){return H(this,O,"f")}get keys(){return G.fill(this),H(this,B,"f")}forEach(e){G.fill(this),H(this,L,"f").forEach(e)}get(e){return G.fill(this),H(this,L,"f").get(e)||new G(e,[],":",!0)}static fill(e){if(null!==H(e,L,"f"))return;const t=new Map;e.lines.forEach(s=>{const[i,a]=d(s,H(e,j,"f"),1),n=t.get(i)||[];t.set(i,[...n,a||""])});const s=N(e,L,G.makeAttributes(t),"f");N(e,B,Array.from(s.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach((e,s)=>{t.set(s,new G(s,e))}),t}}O=new WeakMap,x=new WeakMap,j=new WeakMap,L=new WeakMap,R=new WeakMap,B=new WeakMap;var z,q,W=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},V=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ${constructor(e){z.set(this,void 0),q.set(this,void 0),W(this,z,e,"f"),W(this,q,new Map,"f"),$.fillAttributes(this)}get(e){return V(this,q,"f").get(e)||new G(e,[]," ",!0)}static fillAttributes(e){const t=new Map;V(e,z,"f").forEach(e=>{if("a"===e.key){const{key:s,value:i}=e.parsed;let a=t.get(s);a||(a=[],t.set(s,a)),a.push(i||"")}}),t.forEach((t,s)=>{V(e,q,"f").set(s,new G(s,t," ",!1))})}}z=new WeakMap,q=new WeakMap;var K,Q,J,Y,X=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},Z=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ee{constructor(e){K.set(this,void 0),Q.set(this,void 0),J.set(this,void 0),Y.set(this,void 0),X(this,K,e,"f"),X(this,Q,e[0],"f"),X(this,J,X(this,Y,null,"f"),"f")}get lines(){return Z(this,K,"f")}get mediaLine(){return Z(this,Q,"f")}get mediaLineParts(){return Z(this,Q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!Z(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",X(this,Y,t,"f")}return Z(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return Z(this,J,"f")||X(this,J,new $(this.lines),"f"),Z(this,J,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const s in e){const i=this.attributes.get(s),a=!e[s];t[s]=i?a?i.lines:i.value:a?[]:void 0}return t}}K=new WeakMap,Q=new WeakMap,J=new WeakMap,Y=new WeakMap;var te,se,ie=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},ae=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ne{constructor(e){te.set(this,void 0),se.set(this,void 0),ie(this,te,e,"f"),ie(this,se,e.filter(e=>"o"===e.key).map(e=>e.value.split(" ")[1])[0],"f")}get lines(){return ae(this,te,"f")}get sessionId(){return ae(this,se,"f")}}function re(e){function t(){s?i.push(new ee(a)):s=new ne(a)}let s=null,i=[],a=[];return e.split(/\r?\n/).forEach(e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const s=oe(e);"m"===s.key&&(t(),a=[]),a.push(s)}}),t(),new o(s,i)}function oe(e){const t=d(e,"=",1);return new F(t[0],t[1])}function de(e){let t;return e.media.forEach((s,i)=>{if("video"===s.mediaType&&s.isSending&&!s.attributes.get("ssrc-group").get("SIM").exists){t||(t=new g(2,4294967295));const a=s.attributes.get("ssrc-group").get("FID").value.split(" "),n=s.lines;a.forEach(e=>t.add(+e));const r=[a[0],t.generate(),t.generate()],o=[a[1],t.generate(),t.generate()];n.push(oe("a=ssrc-group:SIM "+r.join(" ")));const d=s.attributes.get("ssrc").get(a[0]).lines;r.forEach((e,t)=>{const s=o[t];t>0&&(n.push(oe("a=ssrc-group:FID "+e+" "+s)),d.forEach(t=>{n.push(oe("a=ssrc:"+e+" "+t))}),d.forEach(e=>{n.push(oe("a=ssrc:"+s+" "+e))}))}),e.media[i]=new ee(n)}}),!!t}te=new WeakMap,se=new WeakMap},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(151);function a(e,t){const s=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!s.fingerprint){const t=e.session.lines.find(e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)});s.fingerprint=t.parsed.value}const a=function(e){const t=e.map(e=>{const[t,...s]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:s.map(e=>Object(i.c)(+e))}});return t.length?t:void 0}(s["ssrc-group"]),[n,r]=s.fingerprint.split(" ",2),o=s.ssrc&&Object(i.c)(+s.ssrc.split(" ",1)[0]);return{raw:s,ufrag:s["ice-ufrag"],pwd:s["ice-pwd"],fingerprint:{fingerprint:r,setup:s.setup,hash:n},source:o,sourceGroups:a,mid:s.mid}}},,,,function(e,t,s){"use strict";function i(e){return[...new Set(e)]}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";const i=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate);t.a=i},function(e,t,s){"use strict";function i(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";function i(e,t){const s={writable:!0,configurable:!0},i={};t.forEach(t=>{e.hasOwnProperty(t)||(i[t]=s)}),Object.defineProperties(e,i)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(30),a=s(0),n=s(41),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=Object(n.b)("OPUS",n.a.Error)}isPlaySupported(){if(void 0!==this.isPlaySupportedResult)return this.isPlaySupportedResult;const e=document.createElement("audio");return this.isPlaySupportedResult=!(!e.canPlayType||!e.canPlayType("audio/ogg;").replace(/no/,""))}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}}))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},a.IS_SAFARI?void 0:t.map(e=>e.buffer))}))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},a.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout(()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())},1e4)}pushDecodeTask(e,t){return new Promise((s,i)=>{const a={pages:e,withWaveform:t,callback:{resolve:s,reject:i},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(a)&&this.executeNewTask(a)})}decode(e,t=!1){return r(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then(e=>{const t=new Blob([e.bytes],{type:"audio/wav"});return{url:URL.createObjectURL(t),waveform:e.waveform}})}))}};i.a.opusDecodeController=o,t.a=o},function(e,t,s){"use strict";var i=s(0);const a=!!document.createElement("video").canPlayType("video/webm")&&!i.IS_SAFARI&&!i.IS_APPLE_MOBILE;window.IS_WEBM_SUPPORTED=a,t.a=a},function(e,t,s){"use strict";function i(e,t,s){"byteLength"in s[e]&&(s[e]=[...s[e]]),t&&t[e]!==s[e]&&(t[e].length=s[e].length,s[e].forEach((s,i)=>{t[e][i]=s}),s[e]=t[e])}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(56),a=s(68),n=s(31),r=s(15),o=s(30),d=s(118),c=s(123);const l=new Set(["photo","video","gif","document"]);const h=new class{constructor(){this.webpages={},this.pendingWebPages={},r.default.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,s){var o,h;if("webPageNotModified"===e._)return;const{id:u}=e,p=this.webpages[u],g=p&&p._===e._&&p.hash==p.hash;if("webPage"===e._){"photo"===(null===(o=e.photo)||void 0===o?void 0:o._)?e.photo=i.a.savePhoto(e.photo,s):delete e.photo,"document"===(null===(h=e.document)||void 0===h?void 0:h._)?e.document=a.a.saveDoc(e.document,s):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let r=e.title||e.author||t||"";t&&r===t&&delete e.site_name,r=Object(c.a)(r,80,100),e.rTitle=n.a.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let d="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(d=t[0]+"/issues/{1}")}const u=Object(c.a)(e.description||"",150,180);e.rDescription=n.a.wrapRichText(u,{contextSite:t||"external",contextHashtag:d}),l.has(e.type)||e.description||!e.photo||(e.type="photo")}let f=this.pendingWebPages[u];if(t&&(f||(f=this.pendingWebPages[u]=new Set),f.add(t)),void 0===p?this.webpages[u]=e:Object(d.a)(p,e),!t&&void 0!==f&&g){const e=[];f.forEach(t=>{const[s,i,a]=t.split("_");e.push({peerId:s.toPeerId(),mid:+i,isScheduled:!!a})}),r.default.dispatchEvent("webpage_updated",{id:u,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,s){return e+"_"+t+(s?"_s":"")}deleteWebPageFromPending(e,t){const s=e.id;if(!s)return;const i=this.pendingWebPages[s];i&&i.has(t)&&(i.delete(t),i.size||delete this.pendingWebPages[s])}getWebPage(e){return this.webpages[e]}};o.a&&(o.a.appWebPagesManager=h),t.a=h},function(e,t,s){"use strict";var i=s(140);const a=new Set(["image/jpeg","image/png","image/bmp"]);i.a&&a.add("image/webp"),t.a=a},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const s=this.createAudio();s.autoplay=!0,s.src="assets/audio/"+e,s.loop=t,s.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,s){const i=++this.tempId;setTimeout(()=>{this.tempId===i&&this.playSound(e,t)},s)}}},function(e,t,s){"use strict";function i(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function a(e){return i(this,void 0,void 0,(function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t}))}},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}},function(e,t,s){"use strict";function i(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}s.d(t,"a",(function(){return i}))},,function(e,t,s){"use strict";s.d(t,"a",(function(){return U}));var i=s(0),a=s(59),n=s(42),r=s(94),o=s(64),d=s(137),c=s(40),l=s(41),h=s(32),u=s(43),p=s(15),g=s(192),f=s(67),m=s(187);var v=s(53),_=s(135),y=s(166),I=s(165),S=s(167);var P=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class M extends m.a{constructor(e){super(e),this.negotiateThrottled=Object(r.a)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",()=>{this.maybeUpdateRemoteVideoConstraints()}),e.addEventListener("close",()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}),e}createDescription(){if(this.description)return this.description;return super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,s){return P(this,void 0,void 0,(function*(){const{groupCall:i,description:a}=this,n=i.id,r=t.map(t=>{const s=function(e,t){const s=Object(S.a)(e,t),i=t.mediaType,a={source:s.source,sourceGroups:s.sourceGroups,type:i};s.fingerprint.setup="active";const n={fingerprints:[s.fingerprint],pwd:s.pwd,ssrc:s.source,"ssrc-groups":s.sourceGroups||[],ufrag:s.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(n)},source:s.source,media:t,sourceGroups:s.sourceGroups,entry:a}}(e,t);return this.sources[s.entry.type]=s.entry,s});let c;const l=r.find(e=>"audio"===e.media.mediaType),u=r.find(e=>"video"===e.media.mediaType);let{source:g,params:m}=l||{};const v=u||l,_={audio:l,video:u};if(a.entries.forEach(e=>{if("sendonly"===e.direction){const t=_[e.type];if(!t)return;a.setEntrySource(e,t.sourceGroups||t.source),a.setEntryPeerId(e,p.default.myId)}}),m!==v.params){const e=JSON.parse(v.params.data);g?e.ssrc=g:delete e.ssrc,m={_:"dataJSON",data:JSON.stringify(e)}}const y=d.a.getGroupCallInput(n);if("main"===s.type){const e={call:y,join_as:{_:"inputPeerSelf"},params:m,muted:s.isMuted,video_stopped:!s.joinVideo};c=h.a.invokeApi("phone.joinGroupCall",e),this.log("[api] joinGroupCall id="+n,e)}else{const e={call:y,params:m};c=h.a.invokeApi("phone.joinGroupCallPresentation",e),this.log("[api] joinGroupCallPresentation id="+n,e)}const I=yield c;o.a.processUpdateMessage(I);const P=I.updates.find(e=>"updateGroupCallConnection"===e._),M=JSON.parse(P.params.data);return M.audio=M.audio||i.connections.main.description.audio,a.setData(M),function(e,t){["audio","video"].filter(e=>t[e]).map(e=>[t[e],e]).forEach(([t,s])=>{const i=e.find(e=>e.mediaType===s);if(!i)return;const a=(e=>{const t={};return e.attributes.get("extmap").forEach(e=>{const s=e.key.split("/",1)[0];t[s]=e.value}),t})(i);Object(f.a)(t["rtp-hdrexts"],(e,t,i)=>{a[e.id]!==e.uri&&(i.splice(t,1),console.log("[sdp] filtered extmap:",e,t,s))})})}(t,M),M}))}negotiateInternal(){return P(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,s="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,i=this.log.bindPrefix("startNegotiation");i("start");const a=yield e.createOffer({iceRestart:!1});if(s&&this.dataChannel){t.createEntry("application").setDirection("sendrecv")}const{sdp:n,offer:r}=function(e){const{offer:t,data:s}=e,i=Object(y.b)(t.sdp);let a=!1;if(e.skipAddingMulticast||(a=Object(y.a)(i)||a),Object(f.a)(i.media,(e,t,n)=>{if(e.isSending)return;if("application"===e.mediaType)return;const r=e.mediaLine,o=r.mediaLineParts,d=(o.ids,r.toString()),c=s[e.mediaType]["payload-types"].map(e=>""+e.id);if(d!==Object(I.d)(e.mediaType,void 0,c)){const r=Object(S.a)(i,e);let d=Object.assign({},s);d.transport=Object(v.a)(d.transport),d.transport.ufrag=r.ufrag,d.transport.pwd=r.pwd,d.transport.fingerprints=[r.fingerprint],d.transport.candidates=[];const c=new _.a(r.mid,o.type);c.setPort(o.port),r.source&&c.setSource(r.sourceGroups||r.source),c.setDirection(e.direction);const l=(new I.a).addSsrcEntry(c,d).finalize(),h=Object(y.b)(l).media[0];n[t]=h,a=!0}}),a){const e=i.toString();t.sdp=e}return{offer:t,sdp:i}}({offer:a,data:t});i("[sdp] setLocalDescription",r.sdp),yield e.setLocalDescription(r);const o=n.media.filter(e=>"application"!==e.mediaType&&e.isSending);if(s)try{yield this.invokeJoinGroupCall(n,o,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],c=n.bundle;Object(f.a)(c,(e,s,i)=>{const a=t.getEntryByMid(e);a.shouldBeSkipped(!0)&&(i.splice(s,1),d.push(a))});const l=n.media.map(e=>{const s=e.mid;let i=t.getEntryByMid(s);return i||(i=new _.a(s,e.mediaType),i.setDirection("inactive")),i}),h={type:"answer",sdp:t.generateSdp({bundle:c,entries:l,isAnswer:!0})};d.forEach(e=>{t.deleteEntry(e)}),i(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,h.sdp),yield e.setRemoteDescription(h),i("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then(()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1}),"presentation"===this.options.type&&e.then(()=>{this.connection.getTransceivers().find(e=>{var t,s;"video"===(null===(s=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===s?void 0:s.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))})}),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:s}=t;e.onStageEndpoints.push(s),e.constraints[s]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var b=s(125),w=s(181),C=s(182),k=s(162),E=s(163),A=s(149),D=s(150),T=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class U extends g.a{constructor(e){super(),Object(n.a)(this,e),this.log||(this.log=Object(l.b)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=Object(r.a)(()=>{this.dispatchEvent("pinned",this.pinnedSource)},0,!1),this.addEventListener("state",e=>{e===b.a.CLOSED&&this.cleanup()})}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return b.a.CLOSED;if("connected"===e||i.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?b.a.MUTED:b.a.UNMUTED:b.a.MUTED_BY_ADMIN}return b.a.CONNECTING}get participants(){return d.a.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==b.a.UNMUTED}get isClosing(){const{state:e}=this;return e===b.a.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){Object(a.a)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),Object(a.a)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return u.c===e?this.participant:this.participants.get(e)}toggleMuted(){return this.requestAudioSource(!0).then(()=>d.a.toggleMuted())}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let s;if(e.pFlags.self){s="video"===t?"main":"presentation"}else{s=e[t].source_groups[0].sources[0]}const i=this.getElement(s);if(!i)return;const a=i.cloneNode();return a.srcObject=i.srcObject,{video:a,source:s}}createConnectionInstance(e){return this.connections[e.type]=new M(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type)},e))}changeRaiseHand(e){return d.a.editParticipant(this.id,this.participant,{raiseHand:e})}startScreenSharingInternal(){return T(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Object(C.a)(Object(w.a)()),s=new D.a,i=this.createConnectionInstance({streamManager:s,type:e,options:{type:e}});i.createPeerConnection().addEventListener("negotiationneeded",()=>{i.negotiate()}),t.getVideoTracks()[0].addEventListener("ended",()=>{this.connections.presentation&&this.stopScreenSharing()},{once:!0}),i.createDescription(),i.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){return this.startScreenSharingPromise||(this.startScreenSharingPromise=this.startScreenSharingInternal().finally(()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,d.a.saveApiParticipant(this.id,this.participant),h.a.invokeApi("phone.leaveGroupCallPresentation",{call:d.a.getGroupCallInput(this.id)}).then(e=>{o.a.processUpdateMessage(e)})):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return T(this,void 0,void 0,(function*(){const e={video:Object(E.a)()};try{const t=yield Object(k.a)(e,!1);this.connections.main.addInputVideoStream(t),yield d.a.editParticipant(this.id,this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){return this.startVideoSharingPromise||(this.startVideoSharingPromise=this.startVideoSharingInternal().finally(()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return T(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(Object(A.a)(t),e.streamManager.appendToConference(e.description),yield d.a.editParticipant(this.id,this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,s=!1){return T(this,void 0,void 0,(function*(){for(const e in this.connections){this.connections[e].closeConnectionAndStream(!t)}if(this.dispatchEvent("state",this.state),!s&&!t){let t;const s=d.a.getGroupCallInput(this.id);if(e)this.log("[api] discardGroupCall id="+this.id),t=h.a.invokeApi("phone.discardGroupCall",{call:s});else if(this.joined){this.log("[api] leaveGroupCall id="+this.id);const e=this.connections.main;t=h.a.invokeApi("phone.leaveGroupCall",{call:s,source:e.sources.audio.source})}else this.log(`[api] id=${this.id} payload=null`),t=h.a.invokeApi("phone.joinGroupCall",{call:s,join_as:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}});const i=yield t;o.a.processUpdateMessage(i)}}))}tryAddTrack(e){const{description:t}=this,s=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+s),i=this.participants.get(e.peerId);i&&p.default.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:i})}return s}onParticipantUpdate(e,t){const s=this.connections.main,{connection:i,description:a}=s,n=c.a.getPeerId(e.peer),r=!!e.pFlags.left,o=this.participantsSsrcs.get(n)||[];if(e.presentation&&!r){const{source:t}=d.a.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,s.sources.audio.source!==e.source&&this.hangUp();let i=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(i=!0):(this.stopScreenSharing(),this.stopVideoSharing(),i=!0),i&&this.setMuted(!0),void(t!==n&&this.dispatchEvent("state",this.state))}const l=r?[]:d.a.makeSsrcsFromParticipant(e);r?this.participantsSsrcs.delete(n):this.participantsSsrcs.set(n,l);const h=new Set;o.forEach(e=>{const t=e.source;if(!l.find(e=>e.source===t)){this.unpinSource(t);const e=a.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),h.add(e.type))}}),l.forEach(e=>{let t=a.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),h.add(t.type)):(t=a.createEntry(e.type),a.setEntrySource(t,e.sourceGroups||e.source),a.setEntryPeerId(t,n),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(i,{direction:"recvonly"}),h.add(t.type))}),h.size&&(h.has("video")&&(s.updateConstraints=!0),s.negotiateThrottled())}}},function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(42),a=s(41);var n=s(135);class r{constructor(e){var t;Object(i.a)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||Object(a.b)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=Object(a.b)("RTCPeerConnection")),t("constructor");const s=new RTCPeerConnection(e);return s.addEventListener("track",e=>{t("ontrack",e)}),s.addEventListener("signalingstatechange",()=>{t("onsignalingstatechange",s.signalingState)}),s.addEventListener("connectionstatechange",()=>{t("onconnectionstatechange",s.connectionState)}),s.addEventListener("negotiationneeded",()=>{t("onnegotiationneeded",s.signalingState)}),s.addEventListener("icecandidate",e=>{t("onicecandidate",e)}),s.addEventListener("iceconnectionstatechange",()=>{t("oniceconnectionstatechange",s.iceConnectionState)}),s.addEventListener("datachannel",()=>{t("ondatachannel")}),s.log=t,{connection:s}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,s){s||(s=Object(a.b)("RTCDataChannel"));const i=e.createDataChannel("data",t);return i.addEventListener("message",e=>{s("onmessage",e)}),i.addEventListener("open",()=>{s("onopen")}),i.addEventListener("close",()=>{s("onclose")}),i.log=s,i}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new n.b(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){let e=this.negotiating;return e||(this.negotiating=this.negotiateInternal().finally(()=>{this.negotiating=void 0}))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},,,function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(16);const a={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function n(e,t){const s=function(e,t=2){e||(e=1);let s=[];const i=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let a=1;i.forEach((t,n)=>{if(a*=t.m,e=0;--e)0===n[e].duration&&n.splice(e,1);return n}(e,2);if(t){const e=s.map(e=>i.default.format(a[e.type],!0,[e.duration]));return Object(i.join)(e,!1,t)}const n=s.map(e=>Object(i.i18n)(a[e.type],[e.duration])),r=document.createElement("span");return r.append(...Object(i.join)(n,!1)),r}},function(e,t,s){"use strict";var i=s(0);var a=!!document.createElement("video").canPlayType("video/quicktime")||i.IS_SAFARI||i.IS_APPLE_MOBILE;const n=new Set(["image/gif","video/mp4","video/webm"]);a&&n.add("video/quicktime");t.a=n},function(e,t,s){"use strict";s.d(t,"a",(function(){return g}));var i=s(50),a=s(76),n=s(193),r=s(181),o=s(182),d=s(162),c=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function l(){const e={main:{},screen:{}};return t=>c(this,void 0,void 0,(function*(){const{isScreen:s,constraints:i}=t,a=e[s?"screen":"main"];let n=a[i.audio?"audio":"video"];n||(n=(s?o.a:d.a)(i,t.muted),i.audio&&!a.audio&&(a.audio=n.finally(()=>a.audio=void 0)),i.video&&!a.video&&(a.video=n.finally(()=>a.video=void 0)));try{return yield n}catch(e){throw e}}))}window.getStreamCached=l;var h=s(163),u=s(149),p=s(150);class g extends i.a{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(a.a)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,s){const{streamManager:i}=this;if(i){const s=!e||this.isSharingAudio,i=!t||this.isSharingVideo;if(s&&i)return Promise.resolve()}const a={audio:e&&Object(n.a)(),video:t&&Object(h.a)()};return this.getStream({constraints:a,muted:s}).then(e=>{this.onInputStream(e)})}requestScreen(){return this.getStream({isScreen:!0,constraints:Object(r.a)(!0)}).then(e=>{this.onInputStream(e)})}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const s=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:s,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:s,source:i}){i||(i=p.a.getSource(e,s)),this.log("tryAddTrack",e,t,s,i);const n="output"===s,{player:r,elements:o,streamManager:d}=this,c=t.kind,l="video"===c,h=l?i:c;let u=o.get(h);l&&t.addEventListener("ended",()=>{this.log("[track] onended"),o.delete(h)},{once:!0}),n&&d.addTrack(e,t,s);const g=l?e:d.outputStream;if(u)u.paused&&u.play().catch(a.a),u.srcObject=g;else{if(u=document.createElement(c),u.autoplay=!0,u.srcObject=g,u.volume=1,"undefined"!==u.sinkId){const{outputDeviceId:e}=this;e&&u.setSinkId(e)}l?(u.setAttribute("playsinline","true"),u.muted=!0):r.appendChild(u),o.set(h,u)}return i}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach(t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)})}onInputStream(e){if(this.isClosing)e.getTracks().forEach(e=>{Object(u.a)(e)});else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:s}=this;t.addStream(e,"input"),s&&t.appendToConference(s)}}}},function(e,t,s){"use strict";function i(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach(t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)}),e}s.d(t,"a",(function(){return i}))}])]); +//# sourceMappingURL=5.42c4ae7c503d2aa6aec3.chunk.js.map \ No newline at end of file diff --git a/public/5.42c4ae7c503d2aa6aec3.chunk.js.map b/public/5.42c4ae7c503d2aa6aec3.chunk.js.map new file mode 100644 index 00000000..381c401a --- /dev/null +++ b/public/5.42c4ae7c503d2aa6aec3.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/cleanUsername.ts","webpack:///./src/lib/appManagers/appUsersManager.ts","webpack:///./src/lib/storages/dialogs.ts","webpack:///./src/lib/storages/filters.ts","webpack:///./src/lib/appManagers/appMessagesManager.ts","webpack:///./src/helpers/string/splitStringByLength.ts","webpack:///./src/lib/appManagers/appPeersManager.ts","webpack:///./src/lib/appManagers/appChatsManager.ts","webpack:///./src/components/peerTitle.ts","webpack:///./src/lib/appManagers/appPhotosManager.ts","webpack:///./src/lib/appManagers/appProfileManager.ts","webpack:///./src/lib/appManagers/apiUpdatesManager.ts","webpack:///./src/lib/appManagers/appStickersManager.ts","webpack:///./src/lib/appManagers/appDocsManager.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/assumeType.ts","webpack:///./src/components/visibilityIntersector.ts","webpack:///./src/helpers/array/findAndSpliceAll.ts","webpack:///./src/components/lazyLoadQueue.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/lib/appManagers/appMessagesIdsManager.ts","webpack:///./src/helpers/dom/renderImageFromUrl.ts","webpack:///./src/helpers/windowSize.ts","webpack:///./src/helpers/callbackifyAll.ts","webpack:///./src/lib/appManagers/appReactionsManager.ts","webpack:///./src/lib/appManagers/appNotificationsManager.ts","webpack:///./src/helpers/files.ts","webpack:///./src/helpers/middleware.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/object/safeReplaceObject.ts","webpack:///./src/components/preloader.ts","webpack:///./src/helpers/string/limitSymbols.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/helpers/callbackify.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/components/middleEllipsis.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/lib/calls/localConferenceDescription.ts","webpack:///./src/lib/appManagers/appGroupCallsManager.ts","webpack:///./src/lib/calls/helpers/createMainStreamManager.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/slicedArray.ts","webpack:///./src/helpers/array/insertInDescendSortedArray.ts","webpack:///./src/lib/appManagers/appPollsManager.ts","webpack:///./src/lib/calls/helpers/stopTrack.ts","webpack:///./src/lib/calls/streamManager.ts","webpack:///./src/lib/calls/utils.ts","webpack:///./src/helpers/object/getObjectKeysAndSort.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/helpers/bytes/bytesFromHex.ts","webpack:///./src/helpers/bytes/bytesToHex.ts","webpack:///./src/helpers/number/numberThousandSplitter.ts","webpack:///./src/lib/mtproto/referenceDatabase.ts","webpack:///./src/helpers/dom/htmlToDocumentFragment.ts","webpack:///./src/lib/calls/helpers/getStream.ts","webpack:///./src/lib/calls/helpers/getVideoConstraints.ts","webpack:///./src/lib/calls/constants.ts","webpack:///./src/lib/calls/sdpBuilder.ts","webpack:///./src/lib/calls/sdp/index.ts","webpack:///./src/helpers/string/splitStringByLimitWithRest.ts","webpack:///./src/helpers/uniqueNumberGenerator.ts","webpack:///./src/lib/calls/sdp/attributeSplitted.ts","webpack:///./src/lib/calls/sdp/mediaLineParts.ts","webpack:///./src/lib/calls/sdp/line.ts","webpack:///./src/lib/calls/sdp/attributeInner.ts","webpack:///./src/lib/calls/sdp/attributes.ts","webpack:///./src/lib/calls/sdp/mediaSection.ts","webpack:///./src/lib/calls/sdp/sessionSection.ts","webpack:///./src/lib/calls/sdp/utils.ts","webpack:///./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack:///./src/lib/calls/helpers/parseSourceGroups.ts","webpack:///./src/helpers/array/filterUnique.ts","webpack:///./src/environment/vibrateSupport.ts","webpack:///./src/helpers/string/convertInputKeyToKey.ts","webpack:///./src/helpers/object/defineNotNumerableProperties.ts","webpack:///./src/lib/opusDecodeController.ts","webpack:///./src/environment/webmSupport.ts","webpack:///./src/helpers/object/safeReplaceArrayInObject.ts","webpack:///./src/lib/appManagers/appWebPagesManager.ts","webpack:///./src/environment/imageMimeTypesSupport.ts","webpack:///./src/helpers/audioAssetPlayer.ts","webpack:///./src/lib/calls/helpers/getScreenConstraints.ts","webpack:///./src/lib/calls/helpers/getScreenStream.ts","webpack:///./src/lib/calls/stringFromLineBuilder.ts","webpack:///./src/helpers/string/escapeRegExp.ts","webpack:///./src/lib/calls/groupCallConnectionInstance.ts","webpack:///./src/lib/calls/helpers/processMediaSection.ts","webpack:///./src/lib/calls/helpers/filterServerCodecs.ts","webpack:///./src/lib/calls/helpers/fixLocalOffer.ts","webpack:///./src/lib/calls/groupCallInstance.ts","webpack:///./src/lib/calls/callConnectionInstanceBase.ts","webpack:///./src/lib/calls/helpers/createPeerConnection.ts","webpack:///./src/lib/calls/helpers/createDataChannel.ts","webpack:///./src/helpers/formatCallDuration.ts","webpack:///./src/helpers/formatDuration.ts","webpack:///./src/environment/movSupport.ts","webpack:///./src/environment/videoMimeTypesSupport.ts","webpack:///./src/lib/calls/helpers/getStreamCached.ts","webpack:///./src/lib/calls/callInstanceBase.ts","webpack:///./src/lib/calls/helpers/getAudioConstraints.ts","webpack:///./src/environment/constraintSupport.ts"],"names":["cleanUsername","username","toLowerCase","appUsersManager","storage","appStateManager","storages","users","updateUsersStatuses","timestampNow","i","this","user","updateUserStatus","clear","setInterval","rootScope","addEventListener","addMultipleEventsListeners","update","userId","user_id","status","expires","serverTimeManager","serverTimeOffset","was_online","dispatchEvent","setUserToStateIfNeeded","updateUserPhoto","photo","photo_id","forceUserOnline","date","_","safeReplaceObject","toPeerId","console","warn","updateUserName","saveApiUser","first_name","last_name","e","getSelf","id","contactsIndex","indexObject","getUserSearchText","getState","then","state","storagesResults","length","setUserNameToCache","contactsList","Array","isArray","forEach","pushContact","contactsFillPromise","resolve","peerId","appPeersManager","isUser","toUserId","getFromCache","set","getUser","delete","init","usernames","isPeerNeeded","findAndSplice","getTopPeersPromises","createSearchIndex","undefined","Set","updatedContactsList","pushToState","cached","isFulfilled","promise","invokeApi","result","saveApiUsers","contacts","contact","onContactsModified","slice","Promise","resolvedPeer","appChatsManager","saveApiChats","chats","getPeer","getPeerId","peer","add","requestPeerSingle","releaseSinglePeer","phone","pFlags","self","format","filter","Boolean","join","query","includeSaved","sortBy","fillContacts","_contactsList","results","search","has","sort","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","myId","indexOfAndSplice","testSelfSearch","unshift","getContacts","userIds","map","block","invokeApiSingle","getInputPeerById","value","apiUpdatesManager","processLocalUpdate","peer_id","getOutputPeer","blocked","index","clearBadChars","ignoreCase","latinize","includeTag","apiUsers","override","saved","oldUser","oldSearchUsername","searchUsername","min","initials","fullName","deleted","cleanSearchText","getAbbreviation","changedPhoto","changedTitle","wasContact","newContact","onContactUpdated","formatPhoneNumber","formatted","isObject","access_hash","key","args","isBot","support","today","Date","diff","getTime","getDate","dateEl","timeEl","bot","isRegularUser","isContact","allowMin","phone_number","vcard","eventTimestamp","timestamp","updatesState","syncLoading","importContacts","phones","error","Error","type","inputContacts","j","push","client_id","toString","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","now","peers","offset","limit","hash","topPeers","categories","topPeer","requestPeer","rating","contactsBlocked","count","peerIds","u","concat","c","lat","long","accuracy_radius","background","self_expires","geo_point","updates","processUpdateMessage","entities","parseEntities","trim","path","URL","wrapUrl","url","pathname","err","invokeApiCacheable","q","cacheSeconds","my_results","filterUnique","p","curIsContact","popContact","offline","showPhone","getUserInput","add_phone_privacy_exception","restrictionReasons","restriction_reason","restricted","appMessagesManager","appDraftsManager","appNotificationsManager","appMessagesIdsManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","dialog","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","reverse","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","d","getCache","peerText","getPeerSearchText","dialogsIndex","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","chatId","chat","getChat","left","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","freezeSaving","setDialogsFromState","bind","allDialogsLoaded","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","loaded","0","1","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","offsetDate","Math","getOffsetDate","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","getFolder","migratedTo","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","indexOf","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","skipped","isPinned","filters","getDialogIndexKey","wasIndex","findIndex","wasDialog","wasDialogIndex","newDialogIndex","setDialogIndexInFilter","prepareFolderUnreadCountModifyingByDialog","splice","insertInDescendSortedArray","callbacks","callback","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","max","dispatchUnreadTimeout","ctx","setTimeout","justReturn","message","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","foundIndex","pts","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","fromId","viaBotId","isAnyChat","newPts","getChannelState","ignoreOffsetDate","saveGlobalOffset","pos","setDialogToState","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","isDialogsLoaded","clearDialogFromState","foundDialog","getDialog","wasPinned","keepLocal","dropped","dropDialogWithEvent","forEachReverse","idx","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","newUpdatesAfterReloadToHandle","saveUpdate","size","Object","keys","assign","kicked","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","out","isOutgoing","log","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","Bottom","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","settings","notify_settings","addChannelState","defineNotNumerableProperties","getFilter","offsetIndex","ret","promises","fillContactsResult","reloadMissingDialogsPromise","reloadMissingPeerIds","all","getDialogs","realFolderId","curDialogStorage","indexStr","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","hasOwnProperty","updateDialogFilter","updateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","find","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includes","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","bots","non_contacts","config","pinned_infolder_count_max","reject","prepend","remove","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","reloadDialogs","inputPeer","reloadPromises","reloadPromise","overwrite","from","to","oldFilter","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","Map","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","logger","Debug","Log","Warn","groupedTempId","typings","unreadMentions","goToNextMentionPromises","handleNewMessages","clearTimeout","handleNewDialogs","newMaxSeenId","obj","dialogsStorage","incrementMaxSeenId","handleNotifications","window","_peerId","idle","isIDLE","notifyPeerToHandle","getNotifyPeerSettings","muted","peerTypeNotifySettings","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","random_id","pendingData","tempId","threadId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","split","threadsStorage","good","isInChat","ignoreExisting","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","first","action","channel_id","top_msg_id","chat_id","handleNewMessage","inboxUnread","releaseUnreadCount","prepareDialogUnreadCountModifying","mentioned","modifyCachedMentions","setDialogTopMessage","notifyPeer","fwd_from","onUpdateMessageReactions","msg_id","reactions","recentReactions","recent_reactions","recentReaction","previousReactions","previousRecentReactions","deepEqual","show_previews","userReaction","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reaction","chosen","local","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","updateMessage","get","replyTo","reply_to","reply_to_top_id","reply_to_msg_id","cancel","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","clearCache","params","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","onUpdateServiceNotification","messageId","inbox_date","media","hasUser","verified","pts_count","onUpdatePinnedMessages","missingMessages","wrapSingleMessage","finally","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","isScheduled","onUpdateDeleteScheduledMessages","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getWebPage","drop","poll","appPollsManager","pollToMessages","maxSeenMsgId","middleware","clean","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","sendEntites","entity","callbackName","finalize","deferred","text","options","invokeAfterMessageIsSent","editMessage","parseMarkdown","schedule_date","scheduleDate","is_scheduled","newMedia","getInputEntities","no_webpage","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","splitted","splitStringByLength","str","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","lastIndex","partLength","webPage","sendText","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","query_id","queryId","resultId","clear_draft","clearDraft","send_as","silent","wrapMessageEntities","seq","beforeMessageSending","file","attachType","apiFileName","fileType","mime_type","fileName","File","name","isDocument","Blob","caption","attributes","isPhoto","document","actionName","isVoiceMessage","attribute","voice","waveform","duration","isMedia","photoSize","w","width","h","height","location","sizes","cacheContext","appDownloadManager","getCacheContext","downloaded","objectURL","appPhotosManager","savePhoto","videoAttribute","round_message","isRoundMessage","supports_streaming","noSound","file_name","thumbs","thumb","blob","thumbCacheContext","appDocsManager","saveDoc","preloader","attachMethod","tryAgainOnFail","isUpload","sentDeferred","attachPromise","catch","uploaded","cancelPendingMessage","setTyping","uploadPromise","file_reference","inputMedia","load","thumbUploadPromise","upload","notifyAll","done","total","inputFile","force_file","addNotifyListener","progress","percents","floor","isGroupedItem","code","files","sendFile","sendFileDetails","groupId","details","o","invoke","multiMedia","multi_media","messageMedia","getMediaInput","doc","inputSingleMedia","inputs","contactPeerId","sendOther","getContactMediaInput","pollId","savePoll","total_voters","recent_voters","getPoll","getPhoto","getDoc","geo","geoPoint","title","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","getCachedFullChat","linked_chat_id","comments","replies_pts","isAnonymousSending","post","originalMessage","fwdHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","Number","MAX_SAFE_INTEGER","admin_rights","anonymous","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","noErrorBox","resetPinnedOrder","telegramMeWebManager","setAuthorized","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","fromPeerId","dropCaptions","dropAuthor","newMessages","generateForwardHeader","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","just_clear","revoke","affectedHistory","doFlushHistory","justClear","getHistory","historyResult","getChannelInput","s","m","ss","getPinnedMessage","getSearch","inputFilter","unpin","pm_oneside","unpinAll","unpinAllMessages","totalEntities","foundMessages","minMid","getMidsByAlbum","verify","isMessage","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","mediaContext","unsupported","ttl_seconds","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","migrateFrom","migrateTo","suffix","video_sizes","appGroupCallsManager","saveGroupCall","call","video","reason","migrateChecks","saveMessage","apiEntities","fixEmoji","myEntities","mergeEntities","usingMids","plain","highlightWord","withoutMediaType","parts","hasAlbumKey","addPart","langKey","el","createElement","innerHTML","append","isRestricted","assumeType","usingFullAlbum","getMidsByMessage","albumText","getAlbumText","emoticon","wrapEmojiText","question","rReply","game","stickerEmojiRaw","stickerEmoji","performer","actionWrapped","wrapMessageActionTextNew","limitSymbols","wrapPlainText","match","found","regExp","RegExp","escapeRegExp","exec","sortEntities","messageWrapped","wrapRichText","noLinebreaks","noLinks","noTextFormat","htmlToDocumentFragment","fragment","createDocumentFragment","senderTitle","classList","fromMe","getMessageSenderPeerIdOrName","element","peerTitle","fromName","onclick","href","setAttribute","unsafeMessage","langPackKey","getNameDivHTML","getPeerTitle","formatCallDuration","endsWith","wrapJoinVoiceChatAnchor","daysToStart","tomorrowDate","setDate","k","_args","IntlDateElement","day","month","year","t","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dataset","dir","wrapMessageForReply","htmlToSpan","joined","anchorHTML","domain","langPack","wrapMessageActionTextNewUnsafe","botId","startParam","start_param","inviteToChannel","addChatUser","toggleDialogPin","pinned_dialogs_count_max","getPinnedOrders","getDialogPeer","read","hasChat","fromChat","kind","goodMedias","sticker","canMessageBeEdited","edit_time_limit","hasRights","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","canCache","func","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","offset_id_offset","next_rate","filterMessagesByInputFilter","method","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","getDiscussionMessage","maxMessageId","serviceStartMessage","is_single","filterMessages","generateThreadServiceStartMessage","newDialogsHandlePromise","localMessageIds","creator","delete_messages","affectedMessages","force","triedToReadMaxId","readPromise","soundReset","getPeerString","readHistory","slicedArray","Top","fixUnreadMentionsCountIfNeeded","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","msgIds","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","threadMessage","broadcastEventName","finalizePendingMessage","muteUntil","mute_until","mute","mutePeer","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","downloadOptions","getPhotoDownloadOptions","fakeDownload","getInputFileName","polls","handleReleasingMessage","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","next_offset","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","arr","some","combined","readPeerId","reactionsCount","readParticipants","nextOffset","participants_count","appConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","increment","notification","peerString","notificationMessage","tag","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","loadPromise","image","notify","canSendToPeer","isFetchIntervalNeeded","unsetEnd","Both","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","topWasMeantToLoad","isBottomEnd","isHistoryResultEnd","requestHistory","oldestMessage","foundSlice","_historyResult","requestPromises","after","getMessagesResult","fetchSingleMessages","replyToPeerId","reply_to_peer_id","typing","timeout","smth","referenceDatabase","deleteContext","deleteWebPageFromPending","updatePollToMessage","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","noforwards","noForwards","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","originMethod","String","prototype","getUserPhoto","getChatPhoto","plainText","onlyFirstName","_limitSymbols","getUserString","getChatString","isPeerId","charAt","peerParams","substr","isMegagroup","ignorePeerId","getInputPeer","getUserInputPeer","pic","abs","getDialogType","getChatTyped","onChatUpdated","updateChannelParticipant","updateChatDefaultBannedRights","default_banned_rights","apiChats","saveApiChat","oldChat","rights","defaultRights","isThread","isCheckingRightsForSelf","megagroup","banned_rights","myFlags","post_messages","broadcast","until_date","getChannelInputPeer","getChatInputPeer","input","usersInputs","fwdLimit","fwd_limit","deleteChatUser","leaveChannel","leaveChat","deleteChannel","deleteChat","inputChatPhoto","about","participant","getParticipantPeerId","actor_id","qts","prev_participant","new_participant","kicked_by","editBanned","view_messages","kickFromChannel","messagesChats","enabled","migrateChat","available_reactions","invokeApiSingleProcess","processResult","sendAsPeers","weakMap","WeakMap","peerTitleWeakMap","querySelectorAll","PeerTitle","AppPhotosManager","photos","context","oldPhoto","saveContext","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","inputUser","photosResult","photoIds","bytes","isSticker","mimeType","Uint8Array","jpegHeader","jpegTail","createObjectURL","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","Image","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","fullHeight","download","getDownload","getInput","fullPhotoSize","downloadToDisc","AppProfileManager","usersFull","chatsFull","onUpdateUserTyping","typingsInPeer","cancelAction","getChatFull","onUpdatePeerBlocked","updateChatParticipants","participants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","getProfile","profile","getProfileByPeerId","getChannelFull","full_chat","exported_invite","link","exportedInvite","channelParticipant","fullChannel","processError","getChannelParticipants","cP","getTopPeers","ratingMap","processUserIds","updateResult","strippedThumb","stripped_thumb","previous","deletedList","reduce","acc","verifyParticipantForOnlineCount","chatInfo","channelParticipants","reduceParticipantsForOnlineCount","res","onlines","pendingPtsUpdates","pendingSeqUpdates","syncPending","channelStates","attached","debug","processOpts","seqStart","seq_start","forceGetDifference","processUpdate","toId","Proxy","target","saveUpdatesState","us","nextSeq","pendingUpdatesData","popPendingSeqUpdate","seqAwaiting","ptsAwaiting","curState","curPts","goodPts","goodIndex","getDifference","wasSyncing","pts_total_limit","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","channelState","getChannelDifference","lastPtsUpdateTime","popPts","popSeq","popPendingPtsUpdate","newVersion","stateResult","setUpdatesProcessor","setProxy","fetch","ok","LOCAL_IDS_SET","appStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","updateNewStickerSet","stickerSet","stickerset","saveStickerSet","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","docs","greetingStickers","shift","downloadDoc","cachedSet","documents","refreshTime","useCache","saveStickers","getStickerSetInput","saveById","getStickerSet","getAnimatedEmojiSounds","emoji","animations","getAnimatedEmojiSoundsPromise","getAppConfig","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","invokeApiHashable","stickers","replace","isAnimation","cleanEmoji","pack","packs","preloadEmojiPromise","getAnimatedEmojiSticker","mediaSize","active","emojiSticker","toneIndex","animation","loadAnimationWorker","container","animationData","autoplay","loop","saveLottiePreview","canvas","once","preloadAnimatedEmojiStickerAnimation","soundDoc","getAnimatedEmojiSoundDocument","newSet","setToCache","needSave","installed_date","thumb_dc_id","isAnimated","animated","thumb_version","short_name","sets","covered","videos","archived","excludeFeatured","exclude_featured","foundSaved","cache","cover","allStickers","getAllStickers","includeOurStickers","preloadStickerSets","getRecentStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","docId","docEmoticon","_doc","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","savingLottiePreview","downloading","onServiceWorkerFail","supportsStreaming","oldDoc","audioTitle","audioPerformer","alt","stickerSetInput","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","thumbSize","inputFileLocation","getFileDownloadOptions","preloadPhoto","tryNotToUseBytes","getThumbURL","originalPromise","isPlaySupported","reader","FileReader","onloadend","uint8","decode","readAsArrayBuffer","stickerCachedThumbs","toBlob","createDownloadAnchor","addTaskListener","task","payload","x","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","visible","getVisible","disconnect","targets","observe","unobserve","unlock","refresh","findAndSpliceAll","array","parallelLimit","queue","inProcess","lockPromise","unlockResolve","processQueue","throttle","_processQueue","item","loadItem","getItem","processItem","addElement","super","lock","intersector","unlockAndRefresh","div","intersectorTimeout","wasSeen","setProcessQueueTimeout","_queue","spliced","prefixes","maxPrefixLength","setPrefix","country","prefix","country_code","originalStr","countriesList","country_codes","prefixCountry","phoneCode","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","html","span","AppMessagesIdsManager","tempNum","temp","MESSAGE_ID_OFFSET","MESSAGE_ID_INCREMENT","clearMessageId","toServer","l","used","loadedURLs","elem","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","isImage","loader","renderImageFromUrlPromise","windowSize","visualViewport","innerWidth","innerHeight","callbackifyAll","values","SAVE_DOC_KEYS","REFERENCE_CONTEXT","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","callbackify","inactive","activeAvailableReactions","getActiveAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsForPeer","reactions_default","getReactionCached","onlyLocal","lastSendingTimeKey","myPeerId","chosenReactionIdx","chosenReaction","can_see_list","reactionCountIdx","indexes","promiseKey","editMessageUpdateIdx","editMessageUpdate","sendReaction","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","volume","novibrate","nopreview","nopush","needPush","isAvailable","registeredDevice","subscribe","unsubscribe","setSettings","nosound","notifications","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","requestPermission","Notification","removeEventListener","navigator","vibrate","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","body","checkMuteUntilThrottled","stop","start","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","notificationData","period","custom","enable","resetTitle","setFavicon","clearInterval","titleInterval","getContext","beginPath","arc","PI","fillStyle","fill","fontSize","font","textBaseline","textAlign","fillText","toDataURL","getNotifyPeerTypePromise","inputKey","compare_sound","notifyContactsSignUp","prevFavicon","cloneNode","parentNode","replaceChild","notifySettings","isMuted","respectType","n","inputNotify","typeNotifySettings","getPeerLocalSettings","permission","data","testSound","icon","setLocalNotificationsDisabled","close","focus","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","audio","hidePushNotifications","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","createPosterFromMedia","videoWidth","videoHeight","naturalWidth","naturalHeight","quality","aspectFitted","drawImage","createPosterFromVideo","onseeked","currentTime","onerror","createPosterForVideo","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","webkitGetAsEntry","requestFile","accept","display","click","getMiddleware","cleanupObj","cleaned","additionalCallback","_cleanupObj","fixBase64String","toUrl","wasObject","newObject","ProgressivePreloader","detached","cancelable","streamable","onClick","contains","loadFunc","color","bold","constructContainer","construct","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","setProgress","startTime","onEnd","elapsedTime","delay","TRANSITION_TIME","detach","attach","parentElement","setManual","reset","useRafs","getTotalLength","strokeDasharray","limitFrom","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","putAvatar","childElementCount","mutateElement","renderPromise","isDialog","isBig","getPeerColorById","avatarAvailable","avatarRendered","abbr","GROUP_CALL_STATE","SearchIndex","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","testQueue","fontFamily","timeoutId","setTestQueue","cancelAnimationFrame","requestAnimationFrame","testQueueElements","testElement","capture","passive","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","getTextWidth","getBoundingClientRect","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","half2","removeAttribute","measureText","MiddleEllipsisElement","HTMLElement","customElements","define","drafts","getAllDraftPromise","updateDraftMessage","peerID","getKey","getAllDrafts","apiDraft","processApiDraft","draft1","draft2","rMessage","wrapDraftText","localDraft","saveOnServer","serverDraft","getDraft","draftsAreEqual","draftObj","isEmptyDraft","saveLocalDraft","emptyDraft","syncDraft","ConferenceEntry","port","direction","originalDirection","endpoint","connection","setDirection","transceiver","addTransceiver","source","sourceGroups","sources","isAnswer","generateSsrc","LocalConferenceDescription","sessionId","entriesByMid","entriesBySource","entriesByPeerId","setSource","setPeerId","isSending","sendEntry","recvEntry","createEntry","fromConference","conference","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","source_groups","presentation","groupCalls","nextOffsets","updateGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","currentGroupCall","hangUp","audioAsset","nextOffsetsMap","setNextOffset","newNextOffset","skipCounterUpdating","getCachedParticipants","oldParticipant","hasLeft","can_self_unmute","isCurrentGroupCall","onParticipantUpdate","doNotDispatchParticipantUpdate","getGroupCall","modified","just_joined","apiParticipants","saveApiParticipant","isUpdatingMeInCurrentCall","isSharingAudio","raiseHand","raise_hand_rating","videoStopped","generateSelfVideo","connections","main","setMuted","getGroupCallInput","getInputPeerSelf","raise_hand","video_paused","videoPaused","video_stopped","presentation_paused","presentationPaused","participants_next_offset","oldCall","shouldUpdate","stopConnectingSound","playSoundWithTimeout","stopSound","cancelDelayedPlay","rejoin","joinVideo","streamManager","createAudio","constraints","getAudioConstraints","getVideoConstraints","stream","getStream","addStream","inputStream","MediaStream","createMainStreamManager","joinGroupCallInternal","bindPrefix","fixSafariAudio","CLOSED","setCurrentGroupCall","playSound","getGroupCallFull","connectionInstance","createConnectionInstance","createPeerConnection","negotiate","event","onTrack","iceConnectionState","startConnectingSound","getGroupCallParticipants","createDescription","createDataChannel","appendStreamToConference","handleUpdateGroupCallParticipants","updatingSdp","audioSource","mainSources","presentationSources","tsNow","prepareToSavingNextOffset","ids","groupCallParticipants","discard","changeUserMuted","getParticipantByPeerId","editParticipant","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","LatinizeMap","hasTag","processSearchText","SliceEnd","SlicedArray","sliceConstructor","getSliceConstructor","slices","None","side","deleteCount","flatten","lowerBound","upperBound","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","prevSlice","nextSlice","sliceOffset","findSliceOffset","sliceStart","sliceEnd","bottomWasMeantToLoad","topFulfilled","bottomFulfilled","property","sortProperty","prev","next","len","updateMessagePoll","poll_id","saveResults","rQuestion","chosenIndexes","answer","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","optionIds","answers","option","sendVote","votesList","closed","newPoll","getInputMediaPoll","stopTrack","track","AudioStreamAnalyser","streamSource","createMediaStreamSource","analyser","createAnalyser","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","connect","StreamManager","interval","getAmplitude","streamAnalyser","frequencyBinCount","getByteFrequencyData","analyse","counter","amplitudes","AudioContext","webkitAudioContext","outputStream","canCreateConferenceEntry","types","getTracks","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","oldTrack","timer","transceiverInit","streams","tracks","findEntry","createTransceiver","mediaTrackType","trackIdx","sender","replaceTrack","toTelegramSource","fromTelegramSource","scale","rms","sqrt","object","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","apply","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","blurPromises","dataUri","onload","bytesFromHex","hexString","ceil","parseInt","bytesToHex","numberThousandSplitter","joiner","contexts","links","originalPayload","refreshReference","postMessage","reference","getContexts","_context","getReferenceByLink","refreshEmojiesSoundsPromise","hex","newHex","newContext","template","content","mediaDevices","getUserMedia","frameRate","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","WEBRTC_MEDIA_PORT","fixMediaLineType","mediaType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","foundation","component","protocol","toUpperCase","priority","ip","generation","performCandidate","sId","bundleMids","bundle","transport","skipCandidates","ufrag","pwd","fingerprint","fingerprints","setup","candidates","candidate","addCandidate","streamName","addSource","ssrc","addMsid","ssrcGroup","semantics","isApplication","codec","isInactive","shouldBeSkipped","payloadTypes","addTransport","hdrexts","hdrext","uri","clockrate","channels","parameters","fbs","fb","subtype","addSsrc","addHeader","addSsrcEntry","addConference","SDP","session","mediaSections","lines","line","parsed","section","splitStringByLimitWithRest","separator","UniqueNumberGenerator","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","missed","rest","nestedMap","makeAttributes","innerParts","fillAttributes","attributesMap","linesArray","mediaLineParts","exists","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","test","isIncorrectSdpLine","parseSdpLine","addSimulcast","sdp","generator","originalSsrcs","ssrcs","generate","ssrcs2","ssrcsStrLines","ssrc2","v","parseMediaSectionInfo","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","parseSourceGroups","raw","IS_VIBRATE_SUPPORTED","convertInputKeyToKey","names","props","writable","configurable","defineProperties","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupportedResult","canPlayType","wavWorker","Worker","page","onTaskEnd","worker","command","buffers","typedArray","buffer","loadWorker","loadWavWorker","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","dataBlob","IS_WEBM_SUPPORTED","safeReplaceArrayInObject","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","description","rDescription","contextSite","pendingSet","IMAGE_MIME_TYPES_SUPPORTED","AudioAssetPlayer","assets","assetName","play","Audio","pause","getScreenConstraints","skipAudio","getScreenStream","screenStream","getDisplayMedia","getVideoTracks","contentHint","StringFromLineBuilder","newLine","strs","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","dataChannel","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","localSdp","mainChannels","processedChannels","processed","sectionInfo","JSON","stringify","processMediaSection","audioChannel","videoChannel","useChannel","setEntrySource","setEntryPeerId","parse","groupCallInput","request","join_as","setData","extmap","performExtmap","filterServerCodecs","isNewConnection","getEntryByMid","originalOffer","createOffer","iceRestart","offer","hasMunged","skipAddingMulticast","mediaLine","localMLine","codecIds","newData","setPort","newSdp","newChannel","mungedSdp","fixLocalOffer","setLocalDescription","invokeJoinGroupCall","entriesToDelete","answerDescription","generateSdp","deleteEntry","signalingState","iceGatheringState","connectionState","setRemoteDescription","negotiating","updateConstraints","getTransceivers","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","maxHeight","onStageEndpoints","minHeight","sendDataChannelData","saveInputVideoStream","safeAssign","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","cleanup","MUTED","UNMUTED","MUTED_BY_ADMIN","CONNECTING","requestAudioSource","toggleMuted","getElement","clone","srcObject","raise","stopScreenSharing","addInputVideoStream","startScreenSharingPromise","startScreenSharingInternal","unpinSource","closeConnectionAndStream","isSharingScreen","startScreenSharing","startVideoSharingPromise","startVideoSharingInternal","appendToConference","isSharingVideo","stopVideoSharing","startVideoSharing","isDiscarded","tryAddTrack","getEntryBySource","oldSsrcs","pinSource","modifiedTypes","oldSsrc","oldSource","oldEntry","setEndpoint","RTCPeerConnection","dict","stopStream","closeConnection","negotiateInternal","CALL_DURATION_LANG_KEYS","showLast","modulus","formatDuration","strings","elements","VIDEO_MIME_TYPES_SUPPORTED","getStreamCached","_cache","screen","isScreen","player","hasInputTrackKind","noop","requestInputSource","isAudioGood","isVideoGood","onInputStream","isOutput","tagName","isVideo","elementEndpoint","useStream","paused","sinkId","outputDeviceId","setSinkId","appendChild","getAudioTracks","isClosing","channelCount","constraint","getSupportedConstraints","constraintSupported"],"mappings":"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","file":"5.42c4ae7c503d2aa6aec3.chunk.js","sourcesContent":["/*\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 cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport filterUnique from \"../../helpers/array/filterUnique\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { formatFullSentTimeRaw, tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { isRestricted } from \"../../helpers/restrictions\";\nimport { Chat, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser({\n ...user, \n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n users.findAndSplice((user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer));\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser \n || oldUser.initials === undefined \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false); \n user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {id, pFlags: {deleted: true}, access_hash: ''} as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n \n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number, \n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return apiManager.invokeApi('contacts.getLocated', {\n geo_point, \n background\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then(results => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map(p => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map(p => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = RichTextProcessor.parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(RichTextProcessor.wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public isRestricted(userId: UserId) {\n const user: MTUser.user = this.getUser(userId);\n const restrictionReasons = user.restriction_reason;\n\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport rootScope from \"../rootScope\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\nimport AppStorage from \"../storage\";\nimport type DATABASE_STATE from \"../../config/databases/state\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\nimport defineNotNumerableProperties from \"../../helpers/object/defineNotNumerableProperties\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processDialogForFilters(dialog);\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, -1);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\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 { DialogFilter, Update } from \"../../layer\";\nimport type { Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport copy from \"../../helpers/object/copy\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear(true);\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n } else {\n this.filters = {};\n this.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(peers?.length) {\n const reloadDialogs = peers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { randomLong } from \"../../helpers/random\";\nimport { Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\nimport './appGroupCallsManager';\nimport appGroupCallsManager from \"./appGroupCallsManager\";\nimport appReactionsManager from \"./appReactionsManager\";\nimport { getRestrictionReason, isRestricted } from \"../../helpers/restrictions\";\nimport copy from \"../../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport escapeRegExp from \"../../helpers/string/escapeRegExp\";\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport splitStringByLength from \"../../helpers/string/splitStringByLength\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: any) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true,\n sendAsPeerId: PeerId,\n }> = {}) {\n if(!text.trim()) {\n return Promise.resolve();\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n //this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n //this.log('sendText sent', message.mid);\n //if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n //assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(error);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n return Promise.all(promises).then(inputs => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n sendAsPeerId: PeerId, \n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n promise: options.groupId === undefined ? deferredPromise() : undefined\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n \n if(fromId.isUser()) {\n const userFull = appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === rootScope.myId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n fullfillLeft();\n resolve();\n }, (err) => {\n fullfillLeft();\n reject(err);\n }).finally(() => {\n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getGroupsFirstMessage(message: Message.message): Message.message {\n if(!message.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return storage.get(minMid);\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message) {\n if((message as Message.message)?.grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(isMessage && message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id.toPeerId();\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from as MessageFwdHeader;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find(entity => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n if(isMessage && message.media) {\n let unsupported = false;\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = message.media.document;\n message.media.document = appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!message.media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n unsupported = true;\n message.media = {_: 'messageMediaUnsupported'};\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n\n if(unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed'\n ? 'missed'\n : 'cancelled'\n )\n );\n break;\n }\n \n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n \n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const isRestricted = this.isRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = this.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n if(document.stickerEmojiRaw) {\n addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\n }\n \n addPart('AttachSticker');\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name));\n }\n \n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n /* for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n } */\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(RichTextProcessor.wrapPlainText(text, entities));\n } else {\n // let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n \n if(found) {\n RichTextProcessor.sortEntities(entities);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped) as any);\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n ...this.getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n }\n\n public wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n }\n\n private wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = RichTextProcessor.wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n }\n\n private wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n element.innerHTML = RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true});\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain)),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n try {\n return this.wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n this.log.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peer_id._ !== 'peerChannel' && \n message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.pFlags.out \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise {\n if(appPeersManager.isRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n excludeDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = storage.get(history[i]);\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(appPeersManager.isRestricted(peerId)) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilter(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0] as Message.message, message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then(messages => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private getNotifyPeerSettings(peerId: PeerId) {\n return Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: appNotificationsManager.isPeerLocalMuted(peerId, true),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if(muted || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = appMessagesIdsManager.generateMessageId(msg_id);\n const peerId = appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n appPeersManager.getPeerId(recentReaction.peer_id) !== rootScope.myId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions || \n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(muted || !peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n userReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const results = reactions?.results ?? [];\n const previousResults = message.reactions?.results ?? [];\n const changedResults = results.filter(reactionCount => {\n const previousReactionCount = previousResults.find(_reactionCount => _reactionCount.reaction === reactionCount.reaction);\n return (\n message.pFlags.out && (\n !previousReactionCount || \n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.pFlags.chosen && (\n !previousReactionCount || \n !previousReactionCount.pFlags.chosen\n )\n );\n });\n\n message.reactions = reactions;\n\n rootScope.dispatchEvent('message_reactions', {message, changedResults});\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n return;\n }\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n rootScope.dispatchEvent('message_views', {peerId, mid, views});\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, muteUntil: number) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(appPeersManager.isRestricted(peerId)) {\n return false;\n }\n \n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const doc = appDocsManager.getDoc('' + tempId);\n if(doc) {\n if(/* doc._ !== 'documentEmpty' && */doc.type && doc.type !== 'sticker' && doc.mime_type !== 'image/gif') {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n const oldCacheContext = appDownloadManager.getCacheContext(doc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public getMessageReactionsListAndReadParticipants(\n message: Message.message, \n limit?: number, \n reaction?: string, \n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch(err => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map(userId => userId.toPeerId());\n \n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some(reaction => appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: string}[] = messageReactionsList.reactions.map(reaction => ({peerId: appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map(readPeerId => ({peerId: readPeerId})));\n \n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(userIds => { // ! convert long to number\n return userIds.map(userId => userId.toUserId());\n });\n }\n\n public canViewMessageReadParticipants(message: Message) {\n if(\n message._ !== 'message' || \n message.pFlags.is_outgoing || \n !message.pFlags.out || \n !appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(message.peerId.toChatId());\n return chat.participants_count < rootScope.appConfig.chat_read_mark_size_threshold && \n (tsNow(true) - message.date) < rootScope.appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n userReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(appPeersManager.isRestricted(peerId)) {\n return;\n }\n\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n\n if(options.userReaction) {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n options.userReaction.reaction, \n notificationMessage\n ];\n \n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n \n notificationMessage = I18n.format(langPackKey, true, args);\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(isAnyChat && message.fromId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(message.fromId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread || options.userReaction) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id !== '777')) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public isRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(appPeersManager.isRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n \n return {\n count: 0,\n history: slice,\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId);\n }\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';//'\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n let overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach(part => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n \n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\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 * 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 { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\nimport { getRestrictionReason } from \"../../helpers/restrictions\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false, _limitSymbols?: number) {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n\r\n if(_limitSymbols !== undefined) {\r\n title = limitSymbols(title, _limitSymbols, _limitSymbols);\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n const userId = (peerId as Peer.peerUser).user_id;\r\n if(userId !== undefined) {\r\n return userId.toPeerId(false);\r\n }\r\n\r\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\r\n if(chatId !== undefined) {\r\n return chatId.toPeerId(true);\r\n }\r\n\r\n return rootScope.myId; // maybe it is an inputPeerSelf\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return NULL_PEER_ID;\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? appUsersManager.isRestricted(peerId.toUserId()) : appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport copy from \"../../helpers/object/copy\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport { isRestricted } from \"../../helpers/restrictions\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n chats.findAndSplice((chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n chat.initials = RichTextProcessor.getAbbreviation(chat.title);\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n (chat as Chat.chat).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n || (chat as Chat.chat).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: Array) {\n return apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public isRestricted(chatId: ChatId) {\n const chat: Chat.channel = this.getChat(chatId);\n const restrictionReasons = chat.restriction_reason;\n\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public getSendAs(channelId: ChatId) {\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs', \n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n appUsersManager.saveApiUsers(sendAsPeers.users);\n appChatsManager.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\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 appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport limitSymbols from \"../helpers/string/limitSymbols\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean,\r\n limitSymbols?: number\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public fromName: string;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n public limitSymbols: number;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n let fromName = this.fromName;\r\n if(fromName !== undefined) {\r\n if(this.limitSymbols !== undefined) {\r\n fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols);\r\n }\r\n\r\n this.element.innerHTML = RichTextProcessor.wrapEmojiText(fromName);\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n this.element.innerHTML = appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceArrayInObject from \"../../helpers/object/safeReplaceArrayInObject\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id !== 777)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.width;\n const fullHeight = windowSize.height;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto && \n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n rootScope.addEventListener('chat_full_update', (chatId) => {\n rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n rootScope.addEventListener('user_full_update', (userId) => {\n rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override) {\n return this.usersFull[id];\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n appChatsManager.saveApiChats(usersUserFull.chats, true);\n appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n //appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return fullChat as ChatFull;\n }\n }\n \n return apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n \n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n if(this.chatsFull[id] !== undefined && !override) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then(chatFull => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n \n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find(size => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...appUsersManager.getSelf(), \n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(chatId: ChatId) {\n const chat: Chat = appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[chatId];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(chatId);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n rootScope.dispatchEvent('user_full_update', userId);\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach() {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(() => {\n fetch('changelogs/' + newVersion.split(' ')[0] + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n this.processLocalUpdate(update);\n })\n .catch(noop);\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\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 { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport DATABASE_STATE from '../../config/databases/state';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport forEachReverse from '../../helpers/array/forEachReverse';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n \n constructor() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {}; \n this.sounds = {};\n\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.resolve(apiManager.getAppConfig(overwrite)).then(appConfig => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n \n const doc = appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: rootScope.config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg',\n size: 1\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(): Promise> {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const stickerSet = this.storage.getFromCache(isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID);\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n \n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]);\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji, true);\n if(doc) {\n const soundDoc = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n appDocsManager.downloadDoc(doc),\n soundDoc ? appDocsManager.downloadDoc(soundDoc) : undefined\n ]);\n }\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets', \n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable({\n method: 'messages.getAllStickers', \n processResult: (allStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n }\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable({\n method: 'messages.getStickers', \n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if(sticker.sticker === 3 && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = stickers.findAndSplice(_doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!IS_WEBM_SUPPORTED) {\n return;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.fileName = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = doc.fileName = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public isSavingLottiePreview(doc: MyDocument, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n return !!this.savingLottiePreview[key];\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\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 { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\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\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\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 { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise\r\n};\r\n\r\ntype LazyLoadElement = Omit & {\r\n load: (target?: HTMLElement) => Promise,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n protected lockPromise: Promise = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return this.queue.findAndSplice(item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\r\n }\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 { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\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\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\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\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: (err?: Event) => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', (err) => {\n console.error('Render image from url failed:', err, url, loader);\n callback();\n });\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\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\nexport class WindowSize {\n public width = 0;\n public height = 0;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\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 {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T, \n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): PromiseLike | R {\n if(values.some(value => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport callbackifyAll from \"../../helpers/callbackifyAll\";\nimport copy from \"../../helpers/object/copy\";\nimport { AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Update, Updates } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appDocsManager from \"./appDocsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appProfileManager from \"./appProfileManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n constructor() {\n rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && appDocsManager.downloadDoc(availableReaction.around_animation),\n availableReaction.static_icon && appDocsManager.downloadDoc(availableReaction.static_icon),\n availableReaction.appear_animation && appDocsManager.downloadDoc(availableReaction.appear_animation),\n availableReaction.center_icon && appDocsManager.downloadDoc(availableReaction.center_icon)\n ]);\n }\n });\n }, 7.5e3);\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n \n reaction[key] = appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter(availableReaction => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? [];\n\n const filteredChatAvailableReactions = chatAvailableReactions.map(reaction => {\n return activeAvailableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }).filter(Boolean);\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction.availableReaction[], quickReaction: AvailableReaction.availableReaction) {\n const availableReaction = availableReactions.findAndSplice(availableReaction => availableReaction.reaction === quickReaction.reaction);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction.availableReaction[] | PromiseLike, \n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n const peerId = (message.fwd_from?.channel_post && appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n apiManager.getAppConfig(),\n this.getAvailableReactions()\n ], ([appConfig, availableReactions]) => {\n return availableReactions.find(reaction => reaction.reaction === appConfig.reactions_default);\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n peer: appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find(update => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: string, offset?: string) {\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: appPeersManager.getInputPeerById(peerId),\n id: appMessagesIdsManager.getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: string) {\n return apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(value => {\n if(value) {\n const appConfig = rootScope.appConfig;\n if(appConfig) {\n appConfig.reactions_default = reaction;\n } else { // if no config or loading it - overwrite\n apiManager.getAppConfig(true);\n }\n\n rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public sendReaction(message: Message.message, reaction?: string, onlyLocal?: boolean) {\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = rootScope.myId;\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n let chosenReactionIdx = reactions ? reactions.results.findIndex((reactionCount) => reactionCount.pFlags.chosen) : -1;\n let chosenReaction = chosenReactionIdx !== -1 && reactions.results[chosenReactionIdx];\n if(chosenReaction) { // clear current reaction\n --chosenReaction.count;\n delete chosenReaction.pFlags.chosen;\n\n if(reaction === chosenReaction.reaction) {\n reaction = undefined;\n }\n\n if(!chosenReaction.count) {\n reactions.results.splice(chosenReactionIdx, 1);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n reactions.recent_reactions.findAndSplice((recentReaction) => appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n }\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(!appPeersManager.isBroadcast(message.peerId)) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionCount.reaction === reaction);\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction,\n pFlags: {}\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.pFlags.chosen = true;\n\n if(!reactions.recent_reactions && reactions.pFlags.can_see_list) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const userReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!appPeersManager.isMegagroup(peerId)) {\n reactions.recent_reactions.push(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n return (b.count - a.count) || (indexes.get(a.reaction) - indexes.get(b.reaction));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n rootScope.dispatchEvent('message_reactions', {message, changedResults: []});\n return Promise.resolve();\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = appMessagesIdsManager.getServerMessageId(mid);\n const promise = apiManager.invokeApi('messages.sendReaction', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction\n }).then((updates) => {\n assumeType(updates);\n \n const editMessageUpdateIdx = updates.updates.findIndex(update => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }).catch(err => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReaction?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n \n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n\nconst appReactionsManager = new AppReactionsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appReactionsManager = appReactionsManager);\nexport default appReactionsManager;\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 { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\r\nimport { MUTE_UNTIL } from \"../mtproto/mtproto_config\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n rootScope.dispatchEvent('updateNotifySettings', {\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = window.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n appStateManager.getState().then(state => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n this.notificationsCount++;\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n \r\n \r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\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 { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport { pause } from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\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\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\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","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n //if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n //}\n }\n \n return wasObject;\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 { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\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 { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n }\n\n const downloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: string, color: string, icon: string) {\n div.innerHTML = innerHTML;\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false, isBig?: boolean) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nexport default appAvatarsManager;\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\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\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 {Awaited} from '../types';\n\nexport default function callbackify, R>(\n smth: T, \n callback: (result: Awaited) => R\n): PromiseLike | R {\n if(smth instanceof Promise) {\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' ')) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map(o => o.what));\n\n /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\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 clamp from \"../helpers/number/clamp\";\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet timeoutId: number;\r\n\r\nconst setTestQueue = () => {\r\n cancelAnimationFrame(timeoutId);\r\n timeoutId = window.requestAnimationFrame(testQueueElements);\r\n};\r\n\r\nconst testQueueElements = () => {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nconst testElement = (element: HTMLElement) => {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = element.getBoundingClientRect().width;\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = element.getBoundingClientRect().width;\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = element.getBoundingClientRect().width;\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n};\r\n\r\nlet context: CanvasRenderingContext2D;\r\n/**\r\n * Get the text width\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\nfunction getTextWidth(text: string, font: string) {\r\n //const perf = performance.now();\r\n if(!context) {\r\n const canvas = document.createElement('canvas');\r\n context = canvas.getContext('2d');\r\n context.font = font;\r\n }\r\n\r\n //context.font = font;\r\n const metrics = context.measureText(text);\r\n //console.log('getTextWidth perf:', performance.now() - perf);\r\n return metrics.width;\r\n //return Math.round(metrics.width);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n testQueue.add(this);\r\n setTestQueue();\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\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 rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities});\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT } from './sdpBuilder';\nimport { AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec } from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n \n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n \n return {\n endpoint,\n type,\n source,\n sourceGroups,\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n \n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n \n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n \n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find(entry => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n \n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { GroupCall, GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup, InputGroupCall, Peer, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport GroupCallInstance from \"../calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../calls/groupCallState\";\nimport createMainStreamManager from \"../calls/helpers/createMainStreamManager\";\nimport { generateSsrc } from \"../calls/localConferenceDescription\";\nimport { WebRTCLineType } from \"../calls/sdpBuilder\";\nimport StreamManager from \"../calls/streamManager\";\nimport { Ssrc } from \"../calls/types\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nlet IS_MUTED = true;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\n\nexport class AppGroupCallsManager {\n private log: ReturnType;\n \n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n \n // private audioAsset: AudioAsset;\n \n private currentGroupCall: GroupCallInstance;\n private connectionAudio: HTMLAudioElement;\n private doNotDispatchParticipantUpdate: PeerId;\n private audioAsset: AudioAssetPlayer;\n\n constructor() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n rootScope.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.hangUp(false, false, true);\n }\n\n this.participants.delete(groupCall.id);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const {currentGroupCall} = this;\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n const isCurrentGroupCall = currentGroupCall?.id === groupCallId;\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n if(isCurrentGroupCall) {\n currentGroupCall.onParticipantUpdate(participant, this.doNotDispatchParticipantUpdate);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant && this.doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach(p => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n let processUpdate = true;\n if(participant) {\n const {currentGroupCall} = this;\n const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !currentGroupCall.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = this.generateSelfVideo(currentGroupCall.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n currentGroupCall.setMuted(false);\n }\n\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n }\n\n rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : appPeersManager.getPeerId(participant.peer);\n const updates = await apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: appGroupCallsManager.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? appPeersManager.getInputPeerSelf() : appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n if(!processUpdate) this.doNotDispatchParticipantUpdate = appPeersManager.getPeerId(participant.peer);\n apiUpdatesManager.processUpdateMessage(updates);\n if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n appUsersManager.saveApiUsers(groupCall.users);\n appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n \n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n \n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n rootScope.dispatchEvent('group_call_instance', groupCall);\n }\n /* TdLibController.clientUpdate({\n '@type': 'clientUpdateGroupCall',\n call\n }); */\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await apiManager.invokeApi('phone.createGroupCall', {\n peer: appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n \n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n \n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\n }\n\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n \n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n \n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n \n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n \n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n \n case 'completed': {\n break;\n }\n \n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n \n this.getGroupCallParticipants(groupCallId).then(({participants}) => {\n this.saveApiParticipants(groupCallId, [...participants.values()]);\n });\n }\n \n break;\n }\n \n case 'disconnected': {\n break;\n }\n \n case 'failed': {\n //TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n \n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n \n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n public generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n }\n \n public generateSelfParticipant(): GroupCallParticipant {\n const mainSources = this.currentGroupCall.connections.main.sources;\n const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n return {\n _: 'groupCallParticipant',\n pFlags: {\n can_self_unmute: true,\n self: true\n },\n source: mainSources.audio.source,\n video: this.generateSelfVideo(mainSources.video),\n presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n date: tsNow(true),\n peer: appPeersManager.getOutputPeer(rootScope.myId)\n };\n }\n\n public makeSsrcsFromParticipant = (participant: GroupCallParticipant) => {\n return [\n this.makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && this.makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && this.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n };\n\n public makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n appChatsManager.saveApiChats(groupCallParticipants.chats);\n appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public async hangUp(groupCallId: GroupCallId, discard = false, rejoin = false) {\n this.log(`hangUp start id=${groupCallId} discard=${discard} rejoin=${rejoin}`);\n const {currentGroupCall} = this;\n if(currentGroupCall?.id !== groupCallId) return;\n\n currentGroupCall.hangUp(discard, rejoin);\n }\n\n public toggleMuted(muted?: boolean) {\n return this.changeUserMuted(NULL_PEER_ID, muted);\n }\n \n public changeUserMuted(peerId: PeerId, muted?: boolean) {\n const {currentGroupCall} = this;\n if(!currentGroupCall) return;\n\n const participant = currentGroupCall.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(currentGroupCall.id, participant, {muted});\n }\n}\n\nconst appGroupCallsManager = new AppGroupCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appGroupCallsManager = appGroupCallsManager);\nexport default appGroupCallsManager;\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 { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../constants\";\nimport StreamManager from \"../streamManager\";\nimport getAudioConstraints from \"./getAudioConstraints\";\nimport getStream from \"./getStream\";\nimport getVideoConstraints from \"./getVideoConstraints\";\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n \n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from \"../lib/config\";\n\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = Config.LatinizeMap[ch];\n return latinizeCh !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n return text;\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n new(...items: ItemType[]): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as number[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: ItemType[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: ItemType[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(slice[0] > s[0]) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: ItemType) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: number) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; offset++) {\r\n if(maxId >= slice[offset]) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: number, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: ItemType[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: ItemType[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: ItemType) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","export default function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\n const sortProperty: number = element[property];\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n \n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= array[len - 1][property]) {\n return array.push(element) - 1;\n } else if(sortProperty >= array[0][property]) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > array[i][property]) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport copy from \"../../helpers/object/copy\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\r\n","import simulateEvent from \"../../../helpers/dom/dispatchEvent\";\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { fixMediaLineType, WebRTCLineType } from './sdpBuilder';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach(track => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find(item => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter(x => x.type === 'input');\n const audioItems = filteredItems.filter(x => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n rootScope.dispatchEvent('group_call_amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach(track => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n \n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map(type => {\n return [\n type, \n /* type === 'video' || type === 'screencast' ? \n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry(entry => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find(transceiver => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex(track => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch(err => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach(track => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\n","export default function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\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 { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: T;\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\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 fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n \r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(isFilterAvailable) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n \r\n resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const promise = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n if(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join(\".\");\n}\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 { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport appStickersManager from \"../appManagers/appStickersManager\";\nimport { Photo } from \"../../layer\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\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 htmlToDocumentFragment(html: string) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n \n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach(x => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport LocalConferenceDescription, { ConferenceEntry } from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport { GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n \n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n \n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach(ssrcGroup => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n \n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n \n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n \n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map(type => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`,\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n \n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach(hdrext => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n \n payloadTypes.forEach(type => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n \n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n \n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach(fb => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n \n public addConference(options: {\n conference: LocalConferenceDescription, \n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean, \n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n \n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\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 SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find(line => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map(section => section.lines))\n .map(line => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\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\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\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\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\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 { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\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\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\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 splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\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 splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach(str => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\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 SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\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 { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\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 SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter(line => line.key === 'o').map(line => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\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 SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach(lineStr => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach(ssrc => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\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 SDP from \"../sdp\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { toTelegramSource } from \"../utils\";\nimport { parseSourceGroups } from \"./parseSourceGroups\";\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n fingerprint: true,\n setup: true,\n ssrc: true,\n mid: true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find(line => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\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 { GroupCallParticipantVideoSourceGroup } from \"../../../layer\";\nimport { toTelegramSource } from \"../utils\";\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map(str => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map(ssrc => +ssrc)\n sources: rest.map(ssrc => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex(g => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n //const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach(name => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\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 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 isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\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(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.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;","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\n(window as any).IS_WEBM_SUPPORTED = IS_WEBM_SUPPORTED;\nexport default IS_WEBM_SUPPORTED;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key \n * @param wasObject \n * @param newObject \n */\n export default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\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 * 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 appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n let contextHashtag = '';\r\n if(siteName === 'GitHub') {\r\n const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n if(matches) {\r\n contextHashtag = matches[0] + '/issues/{1}';\r\n }\r\n }\r\n\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\r\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\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\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n \n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamConstraints = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n \n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\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 forEachReverse from \"../../helpers/array/forEachReverse\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { Updates, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, JoinGroupCallJsonPayload } from \"../appManagers/appGroupCallsManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport GroupCallInstance from \"./groupCallInstance\";\nimport filterServerCodecs from \"./helpers/filterServerCodecs\";\nimport fixLocalOffer from \"./helpers/fixLocalOffer\";\nimport processMediaSection from \"./helpers/processMediaSection\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({ \n iceServers: [], \n iceTransportPolicy: 'all', \n bundlePolicy: 'max-bundle', \n rtcpMuxPolicy: 'require', \n iceCandidatePoolSize: 0, \n // sdpSemantics: \"unified-plan\", \n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach(type => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map(section => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n let promise: Promise;\n const audioChannel = processedChannels.find(channel => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find(channel => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach(entry => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n \n const groupCallInput = appGroupCallsManager.getGroupCallInput(groupCallId);\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n \n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer, \n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter(media => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n \n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n \n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find(section => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle, \n entries, \n isAnswer\n })\n };\n\n entriesToDelete.forEach(entry => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find(transceiver => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n \n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n \n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\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 { DataJSON } from \"../../../layer\";\nimport { JoinGroupCallJsonPayload } from \"../../appManagers/appGroupCallsManager\";\nimport SDP from \"../sdp\";\nimport { Ssrc } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n fingerprints: [sectionInfo.fingerprint],\n pwd: sectionInfo.pwd,\n ssrc: sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n ufrag: sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params, \n source: sectionInfo.source, \n media, \n sourceGroups: sectionInfo.sourceGroups, \n entry\n };\n}\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 forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { UpdateGroupCallConnectionData, Codec } from \"../types\";\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map(data => {\n return */['audio' as const, 'video' as const].filter(type => data[type]).map(type => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find(line => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec[\"rtp-hdrexts\"], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\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 forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport copy from \"../../../helpers/object/copy\";\nimport { ConferenceEntry } from \"../localConferenceDescription\";\nimport { parseSdp, addSimulcast } from \"../sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"../sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find(line => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map(payload => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\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 { IS_SAFARI } from \"../../environment/userAgent\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCall, GroupCallParticipant, Updates } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, GroupCallId, GroupCallOutputSource } from \"../appManagers/appGroupCallsManager\";\nimport appPeersManager from \"../appManagers/appPeersManager\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport CallInstanceBase, { TryAddTrackOptions } from \"./callInstanceBase\";\nimport GroupCallConnectionInstance from \"./groupCallConnectionInstance\";\nimport GROUP_CALL_STATE from \"./groupCallState\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getScreenStream from \"./helpers/getScreenStream\";\nimport getStream from \"./helpers/getStream\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription from \"./localConferenceDescription\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n \n // will be set with negotiation\n public joined: boolean;\n \n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections']\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : this.participants.get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => appGroupCallsManager.toggleMuted());\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return appGroupCallsManager.editParticipant(this.id, this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise || (this.startScreenSharingPromise = this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n }));\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: appGroupCallsManager.getGroupCallInput(this.id)\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise || (this.startVideoSharingPromise = this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n }));\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let promise: Promise;\n const groupCallInput = appGroupCallsManager.getGroupCallInput(this.id);\n\n if(discard) {\n this.log(`[api] discardGroupCall id=${this.id}`);\n promise = apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(this.joined) {\n this.log(`[api] leaveGroupCall id=${this.id}`);\n const connectionInstance = this.connections.main;\n promise = apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: connectionInstance.sources.audio.source\n });\n } else {\n this.log(`[api] id=${this.id} payload=null`);\n promise = apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n \n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n const participant = this.participants.get(entry.peerId);\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n }\n\n return source;\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = appGroupCallsManager.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : appGroupCallsManager.makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach(oldSsrc => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find(ssrc => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\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 safeAssign from \"../../helpers/object/safeAssign\";\nimport { logger } from \"../logger\";\nimport createDataChannel from \"./helpers/createDataChannel\";\nimport createPeerConnection from \"./helpers/createPeerConnection\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\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 { Logger, logger } from \"../../logger\";\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\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 { Logger, logger } from \"../../logger\";\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\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 I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map(d => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\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 type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\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 getScreenStream from \"./getScreenStream\";\nimport getStream from \"./getStream\";\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true, \n constraints: DisplayMediaStreamConstraints,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints, \n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then(stream => out.audio = stream),\n constraints.video && cache.video.then(stream => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\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 EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\nimport noop from \"../../helpers/noop\";\nimport { logger } from \"../logger\";\nimport getAudioConstraints from \"./helpers/getAudioConstraints\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getStreamCached from \"./helpers/getStreamCached\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager, { StreamItem } from \"./streamManager\";\n\nexport type TryAddTrackOptions = {\n stream: MediaStream, \n track: MediaStreamTrack, \n type: StreamItem['type'], \n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n \n return this.getStream({\n constraints, \n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0], \n track: event.track, \n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream, \n track, \n type: 'input', \n source: type || 'main'\n });\n }\n \n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n \n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n \n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n \n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n \n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach(track => {\n stopTrack(track);\n });\n }\n }\n}\n","import constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../../environment/constraintSupport\";\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach(constraint => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean, \n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/512.ec58298a13873ce49c3f.chunk.js b/public/512.ec58298a13873ce49c3f.chunk.js deleted file mode 100644 index 09b28fd4..00000000 --- a/public/512.ec58298a13873ce49c3f.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[512],{410:(e,t,s)=>{s.d(t,{GO:()=>n,ZP:()=>o});const i=s(1267).Z.debug,n="undefined"!=typeof window?window:self,o=i},1267:(e,t,s)=>{s.d(t,{Z:()=>n});const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};i.http=location.search.indexOf("http=1")>0,i.http&&(i.transport="https");const n=i},3241:(e,t,s)=>{s.d(t,{Z:()=>i});class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var i;(null!==(i=this.listeners[e])&&void 0!==i?i:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null==s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice((e=>e.callback===t))}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const i=t&&[],n=this.listeners[e];return n&&n.slice().forEach((t=>{var o;if(-1===n.findIndex((e=>e.callback===t.callback)))return;let h;try{h=t.callback(...s)}catch(e){console.error(e)}i&&i.push(h),(null===(o=t.options)||void 0===o?void 0:o.once)&&this.removeEventListener(e,t.callback)})),i}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},1507:(e,t,s)=>{s.d(t,{NM:()=>i,gZ:()=>r,hj:()=>n,rU:()=>h,yF:()=>o});const i=0,n=1271266957,o=777e3,h=2147483647,r=""},3512:(e,t,s)=>{s.r(t),s.d(t,{RootScope:()=>h,default:()=>c});var i=s(1507),n=s(3241),o=s(410);class h extends n.Z{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",(e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)})),this.addEventListener("user_auth",(({id:e})=>{this.myId="number"==typeof i.NM?+e:""+e})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.addEventListener("idle",(e=>{e?this.idle.focusPromise=new Promise((e=>{this.idle.focusResolve=e})):this.idle.focusResolve()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find((t=>t.name===e))}}const r=new h;o.GO.rootScope=r;const c=r}}]); -//# sourceMappingURL=512.ec58298a13873ce49c3f.chunk.js.map \ No newline at end of file diff --git a/public/512.ec58298a13873ce49c3f.chunk.js.map b/public/512.ec58298a13873ce49c3f.chunk.js.map deleted file mode 100644 index a8e40aaa..00000000 --- a/public/512.ec58298a13873ce49c3f.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"512.ec58298a13873ce49c3f.chunk.js","mappings":"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","sources":["webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/rootScope.ts"],"sourcesContent":["/*\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\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\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\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\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 { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_reactions': {message: Message.message, changedResults: ReactionCount[]},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n"],"names":["DEBUG","MOUNT_CLASS_TO","window","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","EventListenerBase","constructor","reuseResults","this","_constructor","listeners","listenerResults","addEventListener","name","callback","options","push","hasOwnProperty","once","pop","addMultipleEventsListeners","obj","i","removeEventListener","findAndSplice","l","_dispatchEvent","collectResults","args","arr","slice","forEach","listener","findIndex","result","err","console","error","dispatchResultableEvent","dispatchEvent","cleanup","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","peerId","document","body","classList","toggle","id","myId","status","themeColorElem","undefined","_themeColorElem","head","querySelector","setThemeColor","color","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","setTheme","addListener","colorScheme","documentElement","isOverlayActive","value","getTheme","settings","theme","themes","find","t","rootScope"],"sourceRoot":""} \ No newline at end of file diff --git a/public/518.ede329767abdce9961b0.chunk.js b/public/518.ede329767abdce9961b0.chunk.js deleted file mode 100644 index 0521fcf6..00000000 --- a/public/518.ede329767abdce9961b0.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[518],{5269:(f,e,d)=>{d.d(e,{Z:()=>t});const t=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},9897:(f,e,d)=>{d.d(e,{Z:()=>s});var t=d(4755);function s(f,e,d,s,a=!0){if(fd/s?i=e*d/f|0:(c=f*s/e|0,c>d&&(i=i*d/c|0,c=d)),a&&c>=f&&i>=e&&(c=f,i=e),(0,t.CJ)(c,i)}d(410).GO.calcImageInBox=s},632:(f,e,d)=>{d.d(e,{OD:()=>l,bz:()=>a.Z,fl:()=>A,mr:()=>b,rz:()=>u,s2:()=>n,xE:()=>h,zM:()=>r});var t=d(410),s=d(4727),a=d(7298);const c=["January","February","March","April","May","June","July","August","September","October","November","December"],i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],n=86400,o=f=>{const e=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate())),d=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-d);const t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/n+1)/7)};function r(f){const e=new Date,d=e.getTime()/1e3|0,t=f.getTime()/1e3|0,a={};return d-t{const d=e.monthAsNumber?".":" ",t=("0"+f.getHours()).slice(-2)+":"+("0"+f.getMinutes()).slice(-2)+(e.noSeconds?"":":"+("0"+f.getSeconds()).slice(-2));return(e.leadingZero?("0"+f.getDate()).slice(-2):f.getDate())+d+(e.monthAsNumber?("0"+(f.getMonth()+1)).slice(-2):c[f.getMonth()])+d+f.getFullYear()+(e.noTime?"":", "+t)},g=2013,p=new RegExp("20[0-9]{1,2}"),m=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),k=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),y=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),v=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function A(f,e){const d=f.trim().toLowerCase();if(d.length<3)return;if(0==="today".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),s=f.getDate();f.setFullYear(d,t,s),f.setHours(0,0,0);const a=f.getTime();f.setFullYear(d,t,s+1),f.setHours(0,0,0);const c=f.getTime()-1;return void e.push({title:"Today",minDate:a,maxDate:c})}if(0==="yesterday".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),s=f.getDate();f.setFullYear(d,t,s),f.setHours(0,0,0);const a=f.getTime()-864e5;f.setFullYear(d,t,s+1),f.setHours(0,0,0);const c=f.getTime()-86400001;return void e.push({title:"Yesterday",minDate:a,maxDate:c})}const t=function(f){const e=new Date;if(f.length<=3)return-1;for(let d=0;d<7;d++)if(e.setDate(e.getDate()+1),0===D(e.getTime()).toLowerCase().indexOf(f))return e.getDay();return-1}(d);if(t>=0){const f=new Date,d=f.getTime(),s=t-f.getDay();f.setDate(f.getDate()+s),f.getTime()>d&&f.setTime(f.getTime()-6048e5);const a=f.getFullYear(),c=f.getMonth(),i=f.getDate();f.setFullYear(a,c,i),f.setHours(0,0,0);const n=f.getTime();f.setFullYear(a,c,i+1),f.setHours(0,0,0);const o=f.getTime()-1;return void e.push({title:D(n),minDate:n,maxDate:o})}let s;if(null===(s=y.exec(d)))if(null===(s=v.exec(d)))if(null===(s=p.exec(d))){if(null!==(s=m.exec(d))){const f=s[1],d=s[2],t=L(f);if(t>=0){const f=+d;if(f>0&&f<=31)return void C(e,f-1,t);if(f>=g)return void E(e,t,f)}}if(null!==(s=k.exec(d))){const f=s[1],d=L(s[2]);if(d>=0){const t=+f;if(t>0&&t<=31)return void C(e,t-1,d);t>=g&&E(e,d,t)}}}else{let f=+d;const t=(new Date).getFullYear();if(f=f;d--){const f=new Date;f.setFullYear(d,0,1),f.setHours(0,0,0);const t=f.getTime();f.setFullYear(d+1,0,1),f.setHours(0,0,0);const s=f.getTime()-1;e.push({title:""+d,minDate:t,maxDate:s})}}else if(f<=t){const d=new Date;d.setFullYear(f,0,1),d.setHours(0,0,0);const t=d.getTime();d.setFullYear(f+1,0,1),d.setHours(0,0,0);const s=d.getTime()-1;e.push({title:""+f,minDate:t,maxDate:s})}}else{const f=s[1],d=s[3],t=s[5];if(!s[2]===s[4])return;const a=parseInt(f),c=parseInt(d)-1;let i=parseInt(t);i>=10&&i<=99&&(i+=2e3);const n=(new Date).getFullYear();if(_(a-1,c)&&i>=g&&i<=n){const f=new Date;f.setFullYear(i,c,a),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(i,c,a+1),f.setHours(0,0,0);const t=f.getTime()-1;return void e.push({title:T(d),minDate:d,maxDate:t})}}else{const f=s[1],d=s[3],t=parseInt(f),a=parseInt(d);if(t>0&&t<=31){if(a>=g&&t<=12)return void E(e,t-1,a);a<=12&&C(e,t-1,a-1)}else t>=g&&a<=12&&E(e,a-1,t)}}function E(f,e,d){const t=(new Date).getFullYear(),s=Date.now();if(d>=g&&d<=t){const t=new Date;t.setFullYear(d,e,1),t.setHours(0,0,0);const a=t.getTime();if(a>s)return;t.setMonth(t.getMonth()+1);const c=t.getTime()-1;f.push({title:S(a),minDate:a,maxDate:c})}}function C(f,e,d){if(_(e,d)){const s=(new Date).getFullYear(),a=Date.now();for(let c=s;c>=g;c--){if(1===d&&28===e&&((t=c)%4!=0||t%100==0)&&t%400!=0)continue;const i=new Date;i.setFullYear(c,d,e+1),i.setHours(0,0,0);const n=i.getTime();if(n>a)continue;i.setFullYear(c,d,e+2),i.setHours(0,0,0);const o=i.getTime()-1;c===s?f.push({title:P(n),minDate:n,maxDate:o}):f.push({title:T(n),minDate:n,maxDate:o})}}var t}function S(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getFullYear()}function P(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getDate()}function T(f){const e=new Date(f);return("0"+e.getDate()).slice(-2)+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+e.getFullYear()}function D(f){const e=new Date(f);return i[e.getDay()]}function _(f,e){return e>=0&&e<12&&f>=0&&f{d.d(e,{CJ:()=>n,ZP:()=>u,_G:()=>t});var t,s=d(410),a=d(9897),c=d(3241);class i{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return(0,a.Z)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function n(f,e){return new i(f,e)}!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class o extends c.Z{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:n(270,270),webpage:n(270,200),album:n(270,0),esgSticker:n(68,68),animatedSticker:n(180,180),staticSticker:n(180,180),emojiSticker:n(112,112),poll:n(240,0),round:n(200,200)},desktop:{regular:n(420,340),webpage:n(420,340),album:n(420,0),esgSticker:n(80,80),animatedSticker:n(200,200),staticSticker:n(200,200),emojiSticker:n(112,112),poll:n(330,0),round:n(280,280)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const r=new o;s.GO.mediaSizes=r;const u=r},6848:(f,e,d)=>{function t(f,e){const d=Object.keys,s=typeof f;return f&&e&&"object"===s&&s===typeof e?d(f).length===d(e).length&&d(f).every((d=>t(f[d],e[d]))):f===e}d.d(e,{Z:()=>t})},677:(f,e,d)=>{d.d(e,{Ki:()=>i,RP:()=>a,X:()=>c});const t=new Set(["all","web","webk"]),s=new Set;function a(f){return f.find((f=>t.has(f.platform)&&!s.has(f.reason)))}function c(f){return!!a(f)}function i(f){s.clear(),f.forEach((f=>{s.add(f)}))}},5418:(f,e,d)=>{d.d(e,{w:()=>t});const t=f=>new Promise((e=>{setTimeout(e,f)}))},7298:(f,e,d)=>{function t(f){const e=Date.now();return f?e/1e3|0:e}d.d(e,{Z:()=>t})},1722:(f,e,d)=>{d.d(e,{Z:()=>t});const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}}},6718:(f,e,d)=>{d.d(e,{ZP:()=>a});var t=d(410);const s={Emoji:{2049:62748,2122:62776,2139:62801,2194:62678,2195:62677,2196:62676,2197:62670,2198:62672,2199:62674,2328:61155,2600:4954,2601:4962,2602:4977,2603:4982,2604:4984,2611:62764,2614:4978,2615:3750,2618:2639,2620:196,2622:62667,2623:62668,2626:62697,2638:62694,2639:168,2648:62702,2649:62703,2650:62710,2651:62711,2652:62712,2653:62713,2660:51057,2663:51060,2665:51058,2666:51059,2668:4832,2692:61258,2693:4887,2694:61261,2696:61272,2697:61280,2699:61270,2702:61245,2705:62763,2708:4895,2709:61206,2712:61220,2714:62765,2716:62742,2721:62693,2728:5993,2733:62771,2734:62772,2744:4981,2747:62773,2753:62749,2754:62750,2755:62751,2757:62752,2763:1127,2764:1129,2795:62743,2796:62744,2797:62745,2934:62681,2935:62682,3030:62753,3297:62825,3299:62826,"0023-20e3":62777,"002a-20e3":62778,"0030-20e3":62779,"0031-20e3":62780,"0032-20e3":62781,"0033-20e3":62782,"0034-20e3":62783,"0035-20e3":62784,"0036-20e3":62785,"0037-20e3":62786,"0038-20e3":62787,"0039-20e3":62788,"00a9":62774,"00ae":62775,"1f004":51063,"1f0cf":51062,"1f170":62795,"1f171":62797,"1f17e":62806,"1f17f":62808,"1f18e":62796,"1f191":62798,"1f192":62799,"1f193":62800,"1f194":62802,"1f195":62804,"1f196":62805,"1f197":62807,"1f198":62809,"1f199":62810,"1f19a":62811,"1f1e6-1f1e8":71550,"1f1e6-1f1e9":71551,"1f1e6-1f1ea":71552,"1f1e6-1f1eb":71553,"1f1e6-1f1ec":71554,"1f1e6-1f1ee":71555,"1f1e6-1f1f1":71556,"1f1e6-1f1f2":71557,"1f1e6-1f1f4":71558,"1f1e6-1f1f6":71559,"1f1e6-1f1f7":71560,"1f1e6-1f1f8":71561,"1f1e6-1f1f9":71562,"1f1e6-1f1fa":71563,"1f1e6-1f1fc":71564,"1f1e6-1f1fd":71565,"1f1e6-1f1ff":71566,"1f1e7-1f1e6":71567,"1f1e7-1f1e7":71568,"1f1e7-1f1e9":71569,"1f1e7-1f1ea":71570,"1f1e7-1f1eb":71571,"1f1e7-1f1ec":71572,"1f1e7-1f1ed":71573,"1f1e7-1f1ee":71574,"1f1e7-1f1ef":71575,"1f1e7-1f1f1":71576,"1f1e7-1f1f2":71577,"1f1e7-1f1f3":71578,"1f1e7-1f1f4":71579,"1f1e7-1f1f6":71580,"1f1e7-1f1f7":71581,"1f1e7-1f1f8":71582,"1f1e7-1f1f9":71583,"1f1e7-1f1fb":71584,"1f1e7-1f1fc":71585,"1f1e7-1f1fe":71586,"1f1e7-1f1ff":71587,"1f1e8-1f1e6":71588,"1f1e8-1f1e8":71589,"1f1e8-1f1e9":71590,"1f1e8-1f1eb":71591,"1f1e8-1f1ec":71592,"1f1e8-1f1ed":71593,"1f1e8-1f1ee":71594,"1f1e8-1f1f0":71595,"1f1e8-1f1f1":71596,"1f1e8-1f1f2":71597,"1f1e8-1f1f3":71598,"1f1e8-1f1f4":71599,"1f1e8-1f1f5":71600,"1f1e8-1f1f7":71601,"1f1e8-1f1fa":71602,"1f1e8-1f1fb":71603,"1f1e8-1f1fc":71604,"1f1e8-1f1fd":71605,"1f1e8-1f1fe":71606,"1f1e8-1f1ff":71607,"1f1e9-1f1ea":71608,"1f1e9-1f1ec":71609,"1f1e9-1f1ef":71610,"1f1e9-1f1f0":71611,"1f1e9-1f1f2":71612,"1f1e9-1f1f4":71613,"1f1e9-1f1ff":71614,"1f1ea-1f1e6":71615,"1f1ea-1f1e8":71616,"1f1ea-1f1ea":71617,"1f1ea-1f1ec":71618,"1f1ea-1f1ed":71619,"1f1ea-1f1f7":71620,"1f1ea-1f1f8":71621,"1f1ea-1f1f9":71622,"1f1ea-1f1fa":71623,"1f1eb-1f1ee":71624,"1f1eb-1f1ef":71625,"1f1eb-1f1f0":71626,"1f1eb-1f1f2":71627,"1f1eb-1f1f4":71628,"1f1eb-1f1f7":71629,"1f1ec-1f1e6":71630,"1f1ec-1f1e7":71631,"1f1ec-1f1e9":71632,"1f1ec-1f1ea":71633,"1f1ec-1f1eb":71634,"1f1ec-1f1ec":71635,"1f1ec-1f1ed":71636,"1f1ec-1f1ee":71637,"1f1ec-1f1f1":71638,"1f1ec-1f1f2":71639,"1f1ec-1f1f3":71640,"1f1ec-1f1f5":71641,"1f1ec-1f1f6":71642,"1f1ec-1f1f7":71643,"1f1ec-1f1f8":71644,"1f1ec-1f1f9":71645,"1f1ec-1f1fa":71646,"1f1ec-1f1fc":71647,"1f1ec-1f1fe":71648,"1f1ed-1f1f0":71649,"1f1ed-1f1f2":71650,"1f1ed-1f1f3":71651,"1f1ed-1f1f7":71652,"1f1ed-1f1f9":71653,"1f1ed-1f1fa":71654,"1f1ee-1f1e8":71655,"1f1ee-1f1e9":71656,"1f1ee-1f1ea":71657,"1f1ee-1f1f1":71658,"1f1ee-1f1f2":71659,"1f1ee-1f1f3":71660,"1f1ee-1f1f4":71661,"1f1ee-1f1f6":71662,"1f1ee-1f1f7":71663,"1f1ee-1f1f8":71664,"1f1ee-1f1f9":71665,"1f1ef-1f1ea":71666,"1f1ef-1f1f2":71667,"1f1ef-1f1f4":71668,"1f1ef-1f1f5":71669,"1f1f0-1f1ea":71670,"1f1f0-1f1ec":71671,"1f1f0-1f1ed":71672,"1f1f0-1f1ee":71673,"1f1f0-1f1f2":71674,"1f1f0-1f1f3":71675,"1f1f0-1f1f5":71676,"1f1f0-1f1f7":71677,"1f1f0-1f1fc":71678,"1f1f0-1f1fe":71679,"1f1f0-1f1ff":71680,"1f1f1-1f1e6":71681,"1f1f1-1f1e7":71682,"1f1f1-1f1e8":71683,"1f1f1-1f1ee":71684,"1f1f1-1f1f0":71685,"1f1f1-1f1f7":71686,"1f1f1-1f1f8":71687,"1f1f1-1f1f9":71688,"1f1f1-1f1fa":71689,"1f1f1-1f1fb":71690,"1f1f1-1f1fe":71691,"1f1f2-1f1e6":71692,"1f1f2-1f1e8":71693,"1f1f2-1f1e9":71694,"1f1f2-1f1ea":71695,"1f1f2-1f1eb":71696,"1f1f2-1f1ec":71697,"1f1f2-1f1ed":71698,"1f1f2-1f1f0":71699,"1f1f2-1f1f1":71700,"1f1f2-1f1f2":71701,"1f1f2-1f1f3":71702,"1f1f2-1f1f4":71703,"1f1f2-1f1f5":71704,"1f1f2-1f1f6":71705,"1f1f2-1f1f7":71706,"1f1f2-1f1f8":71707,"1f1f2-1f1f9":71708,"1f1f2-1f1fa":71709,"1f1f2-1f1fb":71710,"1f1f2-1f1fc":71711,"1f1f2-1f1fd":71712,"1f1f2-1f1fe":71713,"1f1f2-1f1ff":71714,"1f1f3-1f1e6":71715,"1f1f3-1f1e8":71716,"1f1f3-1f1ea":71717,"1f1f3-1f1eb":71718,"1f1f3-1f1ec":71719,"1f1f3-1f1ee":71720,"1f1f3-1f1f1":71721,"1f1f3-1f1f4":71722,"1f1f3-1f1f5":71723,"1f1f3-1f1f7":71724,"1f1f3-1f1fa":71725,"1f1f3-1f1ff":71726,"1f1f4-1f1f2":71727,"1f1f5-1f1e6":71728,"1f1f5-1f1ea":71729,"1f1f5-1f1eb":71730,"1f1f5-1f1ec":71731,"1f1f5-1f1ed":71732,"1f1f5-1f1f0":71733,"1f1f5-1f1f1":71734,"1f1f5-1f1f2":71735,"1f1f5-1f1f3":71736,"1f1f5-1f1f7":71737,"1f1f5-1f1f8":71738,"1f1f5-1f1f9":71739,"1f1f5-1f1fc":71740,"1f1f5-1f1fe":71741,"1f1f6-1f1e6":71742,"1f1f7-1f1ea":71743,"1f1f7-1f1f4":71744,"1f1f7-1f1f8":71745,"1f1f7-1f1fa":71746,"1f1f7-1f1fc":71747,"1f1f8-1f1e6":71748,"1f1f8-1f1e7":71749,"1f1f8-1f1e8":71750,"1f1f8-1f1e9":71751,"1f1f8-1f1ea":71752,"1f1f8-1f1ec":71753,"1f1f8-1f1ed":71754,"1f1f8-1f1ee":71755,"1f1f8-1f1ef":71756,"1f1f8-1f1f0":71757,"1f1f8-1f1f1":71758,"1f1f8-1f1f2":71759,"1f1f8-1f1f3":71760,"1f1f8-1f1f4":71761,"1f1f8-1f1f7":71762,"1f1f8-1f1f8":71763,"1f1f8-1f1f9":71764,"1f1f8-1f1fb":71765,"1f1f8-1f1fd":71766,"1f1f8-1f1fe":71767,"1f1f8-1f1ff":71768,"1f1f9-1f1e6":71769,"1f1f9-1f1e8":71770,"1f1f9-1f1e9":71771,"1f1f9-1f1eb":71772,"1f1f9-1f1ec":71773,"1f1f9-1f1ed":71774,"1f1f9-1f1ef":71775,"1f1f9-1f1f0":71776,"1f1f9-1f1f1":71777,"1f1f9-1f1f2":71778,"1f1f9-1f1f3":71779,"1f1f9-1f1f4":71780,"1f1f9-1f1f7":71781,"1f1f9-1f1f9":71782,"1f1f9-1f1fb":71783,"1f1f9-1f1fc":71784,"1f1f9-1f1ff":71785,"1f1fa-1f1e6":71786,"1f1fa-1f1ec":71787,"1f1fa-1f1f2":71788,"1f1fa-1f1f3":71789,"1f1fa-1f1f8":71790,"1f1fa-1f1fe":71791,"1f1fa-1f1ff":71792,"1f1fb-1f1e6":71793,"1f1fb-1f1e8":71794,"1f1fb-1f1ea":71795,"1f1fb-1f1ec":71796,"1f1fb-1f1ee":71797,"1f1fb-1f1f3":71798,"1f1fb-1f1fa":71799,"1f1fc-1f1eb":71800,"1f1fc-1f1f8":71801,"1f1fd-1f1f0":71802,"1f1fe-1f1ea":71803,"1f1fe-1f1f9":71804,"1f1ff-1f1e6":71805,"1f1ff-1f1f2":71806,"1f1ff-1f1fc":71807,"1f201":62812,"1f202":62813,"1f21a":62819,"1f22f":62816,"1f232":62820,"1f233":62824,"1f234":62823,"1f235":62828,"1f236":62815,"1f237":62814,"1f238":62822,"1f239":62818,"1f23a":62827,"1f250":62817,"1f251":62821,"1f300":4974,"1f301":4824,"1f302":4976,"1f303":4825,"1f304":4827,"1f305":4828,"1f306":4829,"1f307":4830,"1f308":4975,"1f309":4831,"1f30a":4987,"1f30b":4782,"1f30c":4961,"1f30d":4773,"1f30e":4774,"1f30f":4775,"1f310":4776,"1f311":4941,"1f312":4942,"1f313":4943,"1f314":4944,"1f315":4945,"1f316":4946,"1f317":4947,"1f318":4948,"1f319":4949,"1f31a":4950,"1f31b":4951,"1f31c":4952,"1f31d":4955,"1f31e":4956,"1f31f":4959,"1f320":4960,"1f321":4953,"1f324":4965,"1f325":4966,"1f326":4967,"1f327":4968,"1f328":4969,"1f329":4970,"1f32a":4971,"1f32b":4972,"1f32c":4973,"1f32d":3694,"1f32e":3696,"1f32f":3697,"1f330":3677,"1f331":2631,"1f332":2633,"1f333":2634,"1f334":2635,"1f335":2636,"1f336":3668,"1f337":2630,"1f338":2622,"1f339":2625,"1f33a":2627,"1f33b":2628,"1f33c":2629,"1f33d":3667,"1f33e":2637,"1f33f":2638,"1f340":2640,"1f341":2641,"1f342":2642,"1f343":2643,"1f344":3675,"1f345":3660,"1f346":3664,"1f347":3644,"1f348":3645,"1f349":3646,"1f34a":3647,"1f34b":3648,"1f34c":3649,"1f34d":3650,"1f34e":3652,"1f34f":3653,"1f350":3654,"1f351":3655,"1f352":3656,"1f353":3657,"1f354":3691,"1f355":3693,"1f356":3687,"1f357":3688,"1f358":3713,"1f359":3714,"1f35a":3715,"1f35b":3716,"1f35c":3717,"1f35d":3718,"1f35e":3678,"1f35f":3692,"1f360":3719,"1f361":3725,"1f362":3720,"1f363":3721,"1f364":3722,"1f365":3723,"1f366":3734,"1f367":3735,"1f368":3736,"1f369":3737,"1f36a":3738,"1f36b":3743,"1f36c":3744,"1f36d":3745,"1f36e":3746,"1f36f":3747,"1f370":3740,"1f371":3712,"1f372":3704,"1f373":3702,"1f374":3769,"1f375":3752,"1f376":3753,"1f377":3755,"1f378":3756,"1f379":3757,"1f37a":3758,"1f37b":3759,"1f37c":3748,"1f37d":3768,"1f37e":3754,"1f37f":3708,"1f380":51004,"1f381":51005,"1f382":3739,"1f383":5988,"1f384":5989,"1f385":1490,"1f386":5990,"1f387":5991,"1f388":5994,"1f389":5995,"1f38a":5996,"1f38b":5997,"1f38c":71544,"1f38d":5998,"1f38e":5999,"1f38f":51e3,"1f390":51001,"1f391":51002,"1f392":61096,"1f393":61109,"1f396":51009,"1f397":51006,"1f399":61129,"1f39a":61130,"1f39b":61131,"1f39e":61164,"1f39f":51007,"1f3a0":4833,"1f3a1":4834,"1f3a2":4835,"1f3a3":51036,"1f3a4":61132,"1f3a5":61163,"1f3a6":62733,"1f3a7":61133,"1f3a8":51067,"1f3a9":61108,"1f3aa":4837,"1f3ab":51008,"1f3ac":61166,"1f3ad":51065,"1f3ae":51049,"1f3af":51042,"1f3b0":51051,"1f3b1":51045,"1f3b2":51052,"1f3b3":51024,"1f3b4":51064,"1f3b5":61127,"1f3b6":61128,"1f3b7":61135,"1f3b8":61137,"1f3b9":61138,"1f3ba":61139,"1f3bb":61140,"1f3bc":61126,"1f3bd":51038,"1f3be":51022,"1f3bf":51039,"1f3c0":51018,"1f3c1":71542,"1f3c2":1562,"1f3c3-200d-2640":1546,"1f3c3-200d-2642":1545,"1f3c3":1544,"1f3c4-200d-2640":1568,"1f3c4-200d-2642":1567,"1f3c4":1566,"1f3c5":51011,"1f3c6":51010,"1f3c7":1560,"1f3c8":51020,"1f3c9":51021,"1f3ca-200d-2640":1574,"1f3ca-200d-2642":1573,"1f3ca":1572,"1f3cb-200d-2640":1580,"1f3cb-200d-2642":1579,"1f3cb":1578,"1f3cc-200d-2640":1565,"1f3cc-200d-2642":1564,"1f3cc":1563,"1f3cd":4868,"1f3ce":4867,"1f3cf":51025,"1f3d0":51019,"1f3d1":51026,"1f3d2":51027,"1f3d3":51029,"1f3d4":4780,"1f3d5":4784,"1f3d6":4785,"1f3d7":4791,"1f3d8":4796,"1f3d9":4826,"1f3da":4797,"1f3db":4790,"1f3dc":4786,"1f3dd":4787,"1f3de":4788,"1f3df":4789,"1f3e0":4798,"1f3e1":4799,"1f3e2":4800,"1f3e3":4801,"1f3e4":4802,"1f3e5":4803,"1f3e6":4804,"1f3e7":62643,"1f3e8":4805,"1f3e9":4806,"1f3ea":4807,"1f3eb":4808,"1f3ec":4809,"1f3ed":4810,"1f3ee":61177,"1f3ef":4811,"1f3f0":4812,"1f3f3-200d-1f308":71547,"1f3f3-200d-26a7":71548,"1f3f3":71546,"1f3f4-200d-2620":71549,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71808,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71809,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71810,"1f3f4":71545,"1f3f5":2624,"1f3f7":61195,"1f3f8":51030,"1f3f9":61264,"1f3fa":3772,"1f3fb":9499,"1f3fc":9500,"1f3fd":9501,"1f3fe":9502,"1f3ff":9503,"1f400":2550,"1f401":2549,"1f402":2530,"1f403":2531,"1f404":2532,"1f405":2521,"1f406":2522,"1f407":2553,"1f408-200d-2b1b":2518,"1f408":2517,"1f409":2592,"1f40a":2587,"1f40b":2596,"1f40c":2605,"1f40d":2590,"1f40e":2524,"1f40f":2537,"1f410":2539,"1f411":2538,"1f412":2505,"1f413":2570,"1f414":2569,"1f415-200d-1f9ba":2511,"1f415":2509,"1f416":2534,"1f417":2535,"1f418":2544,"1f419":2603,"1f41a":2604,"1f41b":2607,"1f41c":2608,"1f41d":2609,"1f41e":2611,"1f41f":2599,"1f420":2600,"1f421":2601,"1f422":2588,"1f423":2571,"1f424":2572,"1f425":2573,"1f426":2574,"1f427":2575,"1f428":2560,"1f429":2512,"1f42a":2540,"1f42b":2541,"1f42c":2597,"1f42d":2548,"1f42e":2529,"1f42f":2520,"1f430":2552,"1f431":2516,"1f432":2591,"1f433":2595,"1f434":2523,"1f435":2504,"1f436":2508,"1f437":2533,"1f438":2586,"1f439":2551,"1f43a":2513,"1f43b-200d-2744":2559,"1f43b":2558,"1f43c":2561,"1f43d":2536,"1f43e":2567,"1f43f":2554,"1f440":1350,"1f441-200d-1f5e8":1147,"1f441":1351,"1f442":1342,"1f443":1344,"1f444":1353,"1f445":1352,"1f446":1318,"1f447":1320,"1f448":1316,"1f449":1317,"1f44a":1325,"1f44b":1303,"1f44c":1308,"1f44d":1322,"1f44e":1323,"1f44f":1328,"1f450":1330,"1f451":61106,"1f452":61107,"1f453":61072,"1f454":61077,"1f455":61078,"1f456":61079,"1f457":61084,"1f458":61085,"1f459":61090,"1f45a":61091,"1f45b":61092,"1f45c":61093,"1f45d":61094,"1f45e":61098,"1f45f":61099,"1f460":61102,"1f461":61103,"1f462":61105,"1f463":1649,"1f464":1646,"1f465":1647,"1f466":1356,"1f467":1357,"1f468-200d-1f33e":1423,"1f468-200d-1f373":1426,"1f468-200d-1f37c":1487,"1f468-200d-1f393":1414,"1f468-200d-1f3a4":1444,"1f468-200d-1f3a8":1447,"1f468-200d-1f3eb":1417,"1f468-200d-1f3ed":1432,"1f468-200d-1f466-200d-1f466":1636,"1f468-200d-1f466":1635,"1f468-200d-1f467-200d-1f466":1638,"1f468-200d-1f467-200d-1f467":1639,"1f468-200d-1f467":1637,"1f468-200d-1f468-200d-1f466":1625,"1f468-200d-1f468-200d-1f466-200d-1f466":1628,"1f468-200d-1f468-200d-1f467":1626,"1f468-200d-1f468-200d-1f467-200d-1f466":1627,"1f468-200d-1f468-200d-1f467-200d-1f467":1629,"1f468-200d-1f469-200d-1f466":1620,"1f468-200d-1f469-200d-1f466-200d-1f466":1623,"1f468-200d-1f469-200d-1f467":1621,"1f468-200d-1f469-200d-1f467-200d-1f466":1622,"1f468-200d-1f469-200d-1f467-200d-1f467":1624,"1f468-200d-1f4bb":1441,"1f468-200d-1f4bc":1435,"1f468-200d-1f527":1429,"1f468-200d-1f52c":1438,"1f468-200d-1f680":1453,"1f468-200d-1f692":1456,"1f468-200d-1f9af":1536,"1f468-200d-1f9b0":1362,"1f468-200d-1f9b1":1363,"1f468-200d-1f9b2":1365,"1f468-200d-1f9b3":1364,"1f468-200d-1f9bc":1539,"1f468-200d-1f9bd":1542,"1f468-200d-2695":1411,"1f468-200d-2696":1420,"1f468-200d-2708":1450,"1f468-200d-2764-200d-1f468":1617,"1f468-200d-2764-200d-1f48b-200d-1f468":1613,"1f468":1360,"1f469-200d-1f33e":1424,"1f469-200d-1f373":1427,"1f469-200d-1f37c":1486,"1f469-200d-1f393":1415,"1f469-200d-1f3a4":1445,"1f469-200d-1f3a8":1448,"1f469-200d-1f3eb":1418,"1f469-200d-1f3ed":1433,"1f469-200d-1f466-200d-1f466":1641,"1f469-200d-1f466":1640,"1f469-200d-1f467-200d-1f466":1643,"1f469-200d-1f467-200d-1f467":1644,"1f469-200d-1f467":1642,"1f469-200d-1f469-200d-1f466":1630,"1f469-200d-1f469-200d-1f466-200d-1f466":1633,"1f469-200d-1f469-200d-1f467":1631,"1f469-200d-1f469-200d-1f467-200d-1f466":1632,"1f469-200d-1f469-200d-1f467-200d-1f467":1634,"1f469-200d-1f4bb":1442,"1f469-200d-1f4bc":1436,"1f469-200d-1f527":1430,"1f469-200d-1f52c":1439,"1f469-200d-1f680":1454,"1f469-200d-1f692":1457,"1f469-200d-1f9af":1537,"1f469-200d-1f9b0":1367,"1f469-200d-1f9b1":1369,"1f469-200d-1f9b2":1373,"1f469-200d-1f9b3":1371,"1f469-200d-1f9bc":1540,"1f469-200d-1f9bd":1543,"1f469-200d-2695":1412,"1f469-200d-2696":1421,"1f469-200d-2708":1451,"1f469-200d-2764-200d-1f468":1616,"1f469-200d-2764-200d-1f469":1618,"1f469-200d-2764-200d-1f48b-200d-1f468":1612,"1f469-200d-2764-200d-1f48b-200d-1f469":1614,"1f469":1366,"1f46a":1619,"1f46b":1609,"1f46c":1610,"1f46d":1608,"1f46e-200d-2640":1460,"1f46e-200d-2642":1459,"1f46e":1458,"1f46f-200d-2640":1552,"1f46f-200d-2642":1551,"1f46f":1550,"1f470-200d-2640":1483,"1f470-200d-2642":1482,"1f470":1481,"1f471-200d-2640":1375,"1f471-200d-2642":1376,"1f471":1359,"1f472":1476,"1f473-200d-2640":1475,"1f473-200d-2642":1474,"1f473":1473,"1f474":1378,"1f475":1379,"1f476":1354,"1f477-200d-2640":1470,"1f477-200d-2642":1469,"1f477":1468,"1f478":1472,"1f479":199,"1f47a":1100,"1f47b":1101,"1f47c":1489,"1f47d":1102,"1f47e":1103,"1f47f":194,"1f480":195,"1f481-200d-2640":1394,"1f481-200d-2642":1393,"1f481":1392,"1f482-200d-2640":1466,"1f482-200d-2642":1465,"1f482":1464,"1f483":1547,"1f484":61114,"1f485":1335,"1f486-200d-2640":1522,"1f486-200d-2642":1521,"1f486":1520,"1f487-200d-2640":1525,"1f487-200d-2642":1524,"1f487":1523,"1f488":4836,"1f489":61287,"1f48a":61289,"1f48b":1117,"1f48c":1118,"1f48d":61115,"1f48e":61116,"1f48f":1611,"1f490":2621,"1f491":1615,"1f492":4813,"1f493":1123,"1f494":1128,"1f495":1125,"1f496":1121,"1f497":1122,"1f498":1119,"1f499":1133,"1f49a":1132,"1f49b":1131,"1f49c":1134,"1f49d":1120,"1f49e":1124,"1f49f":1126,"1f4a0":62859,"1f4a1":61175,"1f4a2":1139,"1f4a3":1145,"1f4a4":1151,"1f4a5":1140,"1f4a6":1142,"1f4a7":4986,"1f4a8":1143,"1f4a9":197,"1f4aa":1337,"1f4ab":1141,"1f4ac":1146,"1f4ad":1150,"1f4ae":2623,"1f4af":1138,"1f4b0":61196,"1f4b1":62754,"1f4b2":62755,"1f4b3":61203,"1f4b4":61198,"1f4b5":61199,"1f4b6":61200,"1f4b7":61201,"1f4b8":61202,"1f4b9":61205,"1f4ba":4900,"1f4bb":61152,"1f4bc":61226,"1f4bd":61158,"1f4be":61159,"1f4bf":61160,"1f4c0":61161,"1f4c1":61227,"1f4c2":61228,"1f4c3":61188,"1f4c4":61190,"1f4c5":61230,"1f4c6":61231,"1f4c7":61234,"1f4c8":61235,"1f4c9":61236,"1f4ca":61237,"1f4cb":61238,"1f4cc":61239,"1f4cd":61240,"1f4ce":61241,"1f4cf":61243,"1f4d0":61244,"1f4d1":61193,"1f4d2":61187,"1f4d3":61186,"1f4d4":61179,"1f4d5":61180,"1f4d6":61181,"1f4d7":61182,"1f4d8":61183,"1f4d9":61184,"1f4da":61185,"1f4db":62760,"1f4dc":61189,"1f4dd":61225,"1f4de":61147,"1f4df":61148,"1f4e0":61149,"1f4e1":61286,"1f4e2":61121,"1f4e3":61122,"1f4e4":61210,"1f4e5":61211,"1f4e6":61212,"1f4e7":61207,"1f4e8":61208,"1f4e9":61209,"1f4ea":61214,"1f4eb":61213,"1f4ec":61215,"1f4ed":61216,"1f4ee":61217,"1f4ef":61123,"1f4f0":61191,"1f4f1":61144,"1f4f2":61145,"1f4f3":62737,"1f4f4":62738,"1f4f5":62665,"1f4f6":62736,"1f4f7":61168,"1f4f8":61169,"1f4f9":61170,"1f4fa":61167,"1f4fb":61134,"1f4fc":61171,"1f4fd":61165,"1f4ff":61113,"1f500":62715,"1f501":62716,"1f502":62717,"1f503":62683,"1f504":62684,"1f505":62734,"1f506":62735,"1f507":61117,"1f508":61118,"1f509":61119,"1f50a":61120,"1f50b":61150,"1f50c":61151,"1f50d":61172,"1f50e":61173,"1f50f":61251,"1f510":61252,"1f511":61253,"1f512":61249,"1f513":61250,"1f514":61124,"1f515":61125,"1f516":61194,"1f517":61274,"1f518":62860,"1f519":62685,"1f51a":62686,"1f51b":62687,"1f51c":62688,"1f51d":62689,"1f51e":62666,"1f51f":62789,"1f520":62790,"1f521":62791,"1f522":62792,"1f523":62793,"1f524":62794,"1f525":4985,"1f526":61176,"1f527":61267,"1f528":61255,"1f529":61269,"1f52a":3771,"1f52b":61262,"1f52c":61284,"1f52d":61285,"1f52e":51046,"1f52f":62701,"1f530":62761,"1f531":62759,"1f532":62862,"1f533":62861,"1f534":62829,"1f535":62833,"1f536":62853,"1f537":62854,"1f538":62855,"1f539":62856,"1f53a":62857,"1f53b":62858,"1f53c":62725,"1f53d":62727,"1f549":62692,"1f54a":2576,"1f54b":4821,"1f54c":4817,"1f54d":4819,"1f54e":62700,"1f550":4919,"1f551":4921,"1f552":4923,"1f553":4925,"1f554":4927,"1f555":4929,"1f556":4931,"1f557":4933,"1f558":4935,"1f559":4937,"1f55a":4939,"1f55b":4917,"1f55c":4920,"1f55d":4922,"1f55e":4924,"1f55f":4926,"1f560":4928,"1f561":4930,"1f562":4932,"1f563":4934,"1f564":4936,"1f565":4938,"1f566":4940,"1f567":4918,"1f56f":61174,"1f570":4916,"1f573":1144,"1f574":1549,"1f575-200d-2640":1463,"1f575-200d-2642":1462,"1f575":1461,"1f576":61073,"1f577":2614,"1f578":2615,"1f579":51050,"1f57a":1548,"1f587":61242,"1f58a":61222,"1f58b":61221,"1f58c":61223,"1f58d":61224,"1f590":1305,"1f595":1319,"1f596":1307,"1f5a4":1136,"1f5a5":61153,"1f5a8":61154,"1f5b1":61156,"1f5b2":61157,"1f5bc":51066,"1f5c2":61229,"1f5c3":61246,"1f5c4":61247,"1f5d1":61248,"1f5d2":61232,"1f5d3":61233,"1f5dc":61271,"1f5dd":61254,"1f5de":61192,"1f5e1":61260,"1f5e3":1645,"1f5e8":1148,"1f5ef":1149,"1f5f3":61218,"1f5fa":4777,"1f5fb":4783,"1f5fc":4814,"1f5fd":4815,"1f5fe":4778,"1f5ff":61320,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":113,"1f608":193,"1f609":111,"1f60a":112,"1f60b":123,"1f60c":143,"1f60d":115,"1f60e":162,"1f60f":138,"1f610":135,"1f611":136,"1f612":139,"1f613":185,"1f614":144,"1f615":165,"1f616":182,"1f617":118,"1f618":117,"1f619":121,"1f61a":120,"1f61b":124,"1f61c":125,"1f61d":127,"1f61e":184,"1f61f":166,"1f620":191,"1f621":190,"1f622":179,"1f623":183,"1f624":189,"1f625":178,"1f626":174,"1f627":175,"1f628":176,"1f629":186,"1f62a":145,"1f62b":187,"1f62c":141,"1f62d":180,"1f62e":169,"1f62f":170,"1f630":177,"1f631":181,"1f632":171,"1f633":172,"1f634":147,"1f635":157,"1f636":137,"1f637":148,"1f638":1106,"1f639":1107,"1f63a":1105,"1f63b":1108,"1f63c":1109,"1f63d":1110,"1f63e":1113,"1f63f":1112,"1f640":1111,"1f641":167,"1f642":19,"1f643":110,"1f644":140,"1f645-200d-2640":1388,"1f645-200d-2642":1387,"1f645":1386,"1f646-200d-2640":1391,"1f646-200d-2642":1390,"1f646":1389,"1f647-200d-2640":1403,"1f647-200d-2642":1402,"1f647":1401,"1f648":1114,"1f649":1115,"1f64a":1116,"1f64b-200d-2640":1397,"1f64b-200d-2642":1396,"1f64b":1395,"1f64c":1329,"1f64d-200d-2640":1382,"1f64d-200d-2642":1381,"1f64d":1380,"1f64e-200d-2640":1385,"1f64e-200d-2642":1384,"1f64e":1383,"1f64f":1333,"1f680":4906,"1f681":4901,"1f682":4838,"1f683":4839,"1f684":4840,"1f685":4841,"1f686":4842,"1f687":4843,"1f688":4844,"1f689":4845,"1f68a":4846,"1f68b":4849,"1f68c":4850,"1f68d":4851,"1f68e":4852,"1f68f":4877,"1f690":4853,"1f691":4854,"1f692":4855,"1f693":4856,"1f694":4857,"1f695":4858,"1f696":4859,"1f697":4860,"1f698":4861,"1f699":4862,"1f69a":4864,"1f69b":4865,"1f69c":4866,"1f69d":4847,"1f69e":4848,"1f69f":4902,"1f6a0":4903,"1f6a1":4904,"1f6a2":4894,"1f6a3-200d-2640":1571,"1f6a3-200d-2642":1570,"1f6a3":1569,"1f6a4":4890,"1f6a5":4883,"1f6a6":4884,"1f6a7":4886,"1f6a8":4882,"1f6a9":71543,"1f6aa":61292,"1f6ab":62659,"1f6ac":61316,"1f6ad":62661,"1f6ae":62644,"1f6af":62662,"1f6b0":62645,"1f6b1":62663,"1f6b2":4873,"1f6b3":62660,"1f6b4-200d-2640":1583,"1f6b4-200d-2642":1582,"1f6b4":1581,"1f6b5-200d-2640":1586,"1f6b5-200d-2642":1585,"1f6b5":1584,"1f6b6-200d-2640":1528,"1f6b6-200d-2642":1527,"1f6b6":1526,"1f6b7":62664,"1f6b8":62657,"1f6b9":62647,"1f6ba":62648,"1f6bb":62649,"1f6bc":62650,"1f6bd":61299,"1f6be":62651,"1f6bf":61301,"1f6c0":1605,"1f6c1":61302,"1f6c2":62652,"1f6c3":62653,"1f6c4":62654,"1f6c5":62655,"1f6cb":61297,"1f6cc":1606,"1f6cd":61095,"1f6ce":4908,"1f6cf":61296,"1f6d0":62690,"1f6d1":4885,"1f6d2":61315,"1f6d5":4818,"1f6d6":4795,"1f6d7":61293,"1f6e0":61259,"1f6e1":61265,"1f6e2":4880,"1f6e3":4878,"1f6e4":4879,"1f6e5":4893,"1f6e9":4896,"1f6eb":4897,"1f6ec":4898,"1f6f0":4905,"1f6f3":4891,"1f6f4":4874,"1f6f5":4869,"1f6f6":4889,"1f6f7":51040,"1f6f8":4907,"1f6f9":4875,"1f6fa":4872,"1f6fb":4863,"1f6fc":4876,"1f7e0":62830,"1f7e1":62831,"1f7e2":62832,"1f7e3":62834,"1f7e4":62835,"1f7e5":62838,"1f7e6":62842,"1f7e7":62839,"1f7e8":62840,"1f7e9":62841,"1f7ea":62843,"1f7eb":62844,"1f90c":1309,"1f90d":1137,"1f90e":1135,"1f90f":1310,"1f910":133,"1f911":128,"1f912":149,"1f913":163,"1f914":132,"1f915":150,"1f916":1104,"1f917":129,"1f918":1314,"1f919":1315,"1f91a":1304,"1f91b":1326,"1f91c":1327,"1f91d":1332,"1f91e":1312,"1f91f":1313,"1f920":159,"1f921":198,"1f922":151,"1f923":17,"1f924":146,"1f925":142,"1f926-200d-2640":1406,"1f926-200d-2642":1405,"1f926":1404,"1f927":153,"1f928":134,"1f929":116,"1f92a":126,"1f92b":131,"1f92c":192,"1f92d":130,"1f92e":152,"1f92f":158,"1f930":1484,"1f931":1485,"1f932":1331,"1f933":1336,"1f934":1471,"1f935-200d-2640":1480,"1f935-200d-2642":1479,"1f935":1478,"1f936":1491,"1f937-200d-2640":1409,"1f937-200d-2642":1408,"1f937":1407,"1f938-200d-2640":1589,"1f938-200d-2642":1588,"1f938":1587,"1f939-200d-2640":1601,"1f939-200d-2642":1600,"1f939":1599,"1f93a":1559,"1f93c-200d-2640":1592,"1f93c-200d-2642":1591,"1f93c":1590,"1f93d-200d-2640":1595,"1f93d-200d-2642":1594,"1f93d":1593,"1f93e-200d-2640":1598,"1f93e-200d-2642":1597,"1f93e":1596,"1f93f":51037,"1f940":2626,"1f941":61142,"1f942":3760,"1f943":3761,"1f944":3770,"1f945":51033,"1f947":51012,"1f948":51013,"1f949":51014,"1f94a":51031,"1f94b":51032,"1f94c":51041,"1f94d":51028,"1f94e":51017,"1f94f":51023,"1f950":3679,"1f951":3663,"1f952":3670,"1f953":3690,"1f954":3665,"1f955":3666,"1f956":3680,"1f957":3707,"1f958":3703,"1f959":3699,"1f95a":3701,"1f95b":3749,"1f95c":3676,"1f95d":3659,"1f95e":3684,"1f95f":3726,"1f960":3727,"1f961":3728,"1f962":3767,"1f963":3706,"1f964":3762,"1f965":3662,"1f966":3672,"1f967":3742,"1f968":3682,"1f969":3689,"1f96a":3695,"1f96b":3711,"1f96c":3671,"1f96d":3651,"1f96e":3724,"1f96f":3683,"1f970":114,"1f971":188,"1f972":122,"1f973":160,"1f974":156,"1f975":154,"1f976":155,"1f977":1467,"1f978":161,"1f97a":173,"1f97b":61086,"1f97c":61075,"1f97d":61074,"1f97e":61100,"1f97f":61101,"1f980":3729,"1f981":2519,"1f982":2616,"1f983":2568,"1f984":2525,"1f985":2577,"1f986":2578,"1f987":2557,"1f988":2602,"1f989":2580,"1f98a":2514,"1f98b":2606,"1f98c":2527,"1f98d":2506,"1f98e":2589,"1f98f":2546,"1f990":3731,"1f991":3732,"1f992":2543,"1f993":2526,"1f994":2556,"1f995":2593,"1f996":2594,"1f997":2612,"1f998":2565,"1f999":2542,"1f99a":2584,"1f99b":2547,"1f99c":2585,"1f99d":2515,"1f99e":3730,"1f99f":2617,"1f9a0":2620,"1f9a1":2566,"1f9a2":2579,"1f9a3":2545,"1f9a4":2581,"1f9a5":2562,"1f9a6":2563,"1f9a7":2507,"1f9a8":2564,"1f9a9":2583,"1f9aa":3733,"1f9ab":2555,"1f9ac":2528,"1f9ad":2598,"1f9ae":2510,"1f9af":61273,"1f9b4":1349,"1f9b5":1340,"1f9b6":1341,"1f9b7":1348,"1f9b8-200d-2640":1495,"1f9b8-200d-2642":1494,"1f9b8":1493,"1f9b9-200d-2640":1498,"1f9b9-200d-2642":1497,"1f9b9":1496,"1f9ba":61076,"1f9bb":1343,"1f9bc":4871,"1f9bd":4870,"1f9be":1338,"1f9bf":1339,"1f9c0":3686,"1f9c1":3741,"1f9c2":3710,"1f9c3":3764,"1f9c4":3673,"1f9c5":3674,"1f9c6":3700,"1f9c7":3685,"1f9c8":3709,"1f9c9":3765,"1f9ca":3766,"1f9cb":3763,"1f9cd-200d-2640":1531,"1f9cd-200d-2642":1530,"1f9cd":1529,"1f9ce-200d-2640":1534,"1f9ce-200d-2642":1533,"1f9ce":1532,"1f9cf-200d-2640":1400,"1f9cf-200d-2642":1399,"1f9cf":1398,"1f9d0":164,"1f9d1-200d-1f33e":1422,"1f9d1-200d-1f373":1425,"1f9d1-200d-1f37c":1488,"1f9d1-200d-1f384":1492,"1f9d1-200d-1f393":1413,"1f9d1-200d-1f3a4":1443,"1f9d1-200d-1f3a8":1446,"1f9d1-200d-1f3eb":1416,"1f9d1-200d-1f3ed":1431,"1f9d1-200d-1f4bb":1440,"1f9d1-200d-1f4bc":1434,"1f9d1-200d-1f527":1428,"1f9d1-200d-1f52c":1437,"1f9d1-200d-1f680":1452,"1f9d1-200d-1f692":1455,"1f9d1-200d-1f91d-200d-1f9d1":1607,"1f9d1-200d-1f9af":1535,"1f9d1-200d-1f9b0":1368,"1f9d1-200d-1f9b1":1370,"1f9d1-200d-1f9b2":1374,"1f9d1-200d-1f9b3":1372,"1f9d1-200d-1f9bc":1538,"1f9d1-200d-1f9bd":1541,"1f9d1-200d-2695":1410,"1f9d1-200d-2696":1419,"1f9d1-200d-2708":1449,"1f9d1":1358,"1f9d2":1355,"1f9d3":1377,"1f9d4":1361,"1f9d5":1477,"1f9d6-200d-2640":1555,"1f9d6-200d-2642":1554,"1f9d6":1553,"1f9d7-200d-2640":1558,"1f9d7-200d-2642":1557,"1f9d7":1556,"1f9d8-200d-2640":1604,"1f9d8-200d-2642":1603,"1f9d8":1602,"1f9d9-200d-2640":1501,"1f9d9-200d-2642":1500,"1f9d9":1499,"1f9da-200d-2640":1504,"1f9da-200d-2642":1503,"1f9da":1502,"1f9db-200d-2640":1507,"1f9db-200d-2642":1506,"1f9db":1505,"1f9dc-200d-2640":1510,"1f9dc-200d-2642":1509,"1f9dc":1508,"1f9dd-200d-2640":1513,"1f9dd-200d-2642":1512,"1f9dd":1511,"1f9de-200d-2640":1516,"1f9de-200d-2642":1515,"1f9de":1514,"1f9df-200d-2640":1519,"1f9df-200d-2642":1518,"1f9df":1517,"1f9e0":1345,"1f9e1":1130,"1f9e2":61110,"1f9e3":61080,"1f9e4":61081,"1f9e5":61082,"1f9e6":61083,"1f9e7":51003,"1f9e8":5992,"1f9e9":51053,"1f9ea":61281,"1f9eb":61282,"1f9ec":61283,"1f9ed":4779,"1f9ee":61162,"1f9ef":61314,"1f9f0":61277,"1f9f1":4792,"1f9f2":61278,"1f9f3":4909,"1f9f4":61305,"1f9f5":51068,"1f9f6":51070,"1f9f7":61306,"1f9f8":51054,"1f9f9":61307,"1f9fa":61308,"1f9fb":61309,"1f9fc":61311,"1f9fd":61313,"1f9fe":61204,"1f9ff":51048,"1fa70":61104,"1fa71":61087,"1fa72":61088,"1fa73":61089,"1fa74":61097,"1fa78":61288,"1fa79":61290,"1fa7a":61291,"1fa80":51043,"1fa81":51044,"1fa82":4899,"1fa83":61263,"1fa84":51047,"1fa85":51055,"1fa86":51056,"1fa90":4957,"1fa91":61298,"1fa92":61304,"1fa93":61256,"1fa94":61178,"1fa95":61141,"1fa96":61111,"1fa97":61136,"1fa98":61143,"1fa99":61197,"1fa9a":61266,"1fa9b":61268,"1fa9c":61279,"1fa9d":61276,"1fa9e":61294,"1fa9f":61295,"1faa0":61300,"1faa1":51069,"1faa2":51071,"1faa3":61310,"1faa4":61303,"1faa5":61312,"1faa6":61318,"1faa7":61321,"1faa8":4793,"1fab0":2618,"1fab1":2619,"1fab2":2610,"1fab3":2613,"1fab4":2632,"1fab5":4794,"1fab6":2582,"1fac0":1346,"1fac1":1347,"1fac2":1648,"1fad0":3658,"1fad1":3669,"1fad2":3661,"1fad3":3681,"1fad4":3698,"1fad5":3705,"1fad6":3751,"203c":62747,"21a9":62679,"21aa":62680,"231a":4912,"231b":4910,"23cf":62732,"23e9":62719,"23ea":62723,"23eb":62726,"23ec":62728,"23ed":62720,"23ee":62724,"23ef":62721,"23f0":4913,"23f1":4914,"23f2":4915,"23f3":4911,"23f8":62729,"23f9":62730,"23fa":62731,"24c2":62803,"25aa":62851,"25ab":62852,"25b6":62718,"25c0":62722,"25fb":62848,"25fc":62847,"25fd":62850,"25fe":62849,"260e":61146,"261d":1321,"262a":62698,"262e":62699,"262f":62695,"263a":119,"264a":62704,"264b":62705,"264c":62706,"264d":62707,"264e":62708,"264f":62709,"265f":51061,"267b":62757,"267e":62746,"267f":62646,"269b":62691,"269c":62758,"26a0":62656,"26a1":4980,"26a7":62741,"26aa":62837,"26ab":62836,"26b0":61317,"26b1":61319,"26bd":51015,"26be":51016,"26c4":4983,"26c5":4963,"26c8":4964,"26ce":62714,"26cf":61257,"26d1":61112,"26d3":61275,"26d4":62658,"26e9":4820,"26ea":4816,"26f0":4781,"26f1":4979,"26f2":4822,"26f3":51034,"26f4":4892,"26f5":4888,"26f7":1561,"26f8":51035,"26f9-200d-2640":1577,"26f9-200d-2642":1576,"26f9":1575,"26fa":4823,"26fd":4881,"270a":1324,"270b":1306,"270c":1311,"270d":1334,"270f":61219,"271d":62696,"274c":62766,"274e":62767,"27a1":62671,"27b0":62768,"27bf":62769,"2b05":62675,"2b06":62669,"2b07":62673,"2b1b":62845,"2b1c":62846,"2b50":4958,"2b55":62762,"303d":62770,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0},LatinizeMap:{Á:"A",Ă:"A",Ắ:"A",Ặ:"A",Ằ:"A",Ẳ:"A",Ẵ:"A",Ǎ:"A",Â:"A",Ấ:"A",Ậ:"A",Ầ:"A",Ẩ:"A",Ẫ:"A",Ä:"A",Ǟ:"A",Ȧ:"A",Ǡ:"A",Ạ:"A",Ȁ:"A",À:"A",Ả:"A",Ȃ:"A",Ā:"A",Ą:"A",Å:"A",Ǻ:"A",Ḁ:"A",Ⱥ:"A",Ã:"A",Ꜳ:"AA",Æ:"AE",Ǽ:"AE",Ǣ:"AE",Ꜵ:"AO",Ꜷ:"AU",Ꜹ:"AV",Ꜻ:"AV",Ꜽ:"AY",Ḃ:"B",Ḅ:"B",Ɓ:"B",Ḇ:"B",Ƀ:"B",Ƃ:"B",Ć:"C",Č:"C",Ç:"C",Ḉ:"C",Ĉ:"C",Ċ:"C",Ƈ:"C",Ȼ:"C",Ď:"D",Ḑ:"D",Ḓ:"D",Ḋ:"D",Ḍ:"D",Ɗ:"D",Ḏ:"D",Dz:"D",Dž:"D",Đ:"D",Ƌ:"D",DZ:"DZ",DŽ:"DZ",É:"E",Ĕ:"E",Ě:"E",Ȩ:"E",Ḝ:"E",Ê:"E",Ế:"E",Ệ:"E",Ề:"E",Ể:"E",Ễ:"E",Ḙ:"E",Ë:"E",Ė:"E",Ẹ:"E",Ȅ:"E",È:"E",Ẻ:"E",Ȇ:"E",Ē:"E",Ḗ:"E",Ḕ:"E",Ę:"E",Ɇ:"E",Ẽ:"E",Ḛ:"E",Ꝫ:"ET",Ḟ:"F",Ƒ:"F",Ǵ:"G",Ğ:"G",Ǧ:"G",Ģ:"G",Ĝ:"G",Ġ:"G",Ɠ:"G",Ḡ:"G",Ǥ:"G",Ḫ:"H",Ȟ:"H",Ḩ:"H",Ĥ:"H",Ⱨ:"H",Ḧ:"H",Ḣ:"H",Ḥ:"H",Ħ:"H",Í:"I",Ĭ:"I",Ǐ:"I",Î:"I",Ï:"I",Ḯ:"I",İ:"I",Ị:"I",Ȉ:"I",Ì:"I",Ỉ:"I",Ȋ:"I",Ī:"I",Į:"I",Ɨ:"I",Ĩ:"I",Ḭ:"I",Ꝺ:"D",Ꝼ:"F",Ᵹ:"G",Ꞃ:"R",Ꞅ:"S",Ꞇ:"T",Ꝭ:"IS",Ĵ:"J",Ɉ:"J",Ḱ:"K",Ǩ:"K",Ķ:"K",Ⱪ:"K",Ꝃ:"K",Ḳ:"K",Ƙ:"K",Ḵ:"K",Ꝁ:"K",Ꝅ:"K",Ĺ:"L",Ƚ:"L",Ľ:"L",Ļ:"L",Ḽ:"L",Ḷ:"L",Ḹ:"L",Ⱡ:"L",Ꝉ:"L",Ḻ:"L",Ŀ:"L",Ɫ:"L",Lj:"L",Ł:"L",LJ:"LJ",Ḿ:"M",Ṁ:"M",Ṃ:"M",Ɱ:"M",Ń:"N",Ň:"N",Ņ:"N",Ṋ:"N",Ṅ:"N",Ṇ:"N",Ǹ:"N",Ɲ:"N",Ṉ:"N",Ƞ:"N",Nj:"N",Ñ:"N",NJ:"NJ",Ó:"O",Ŏ:"O",Ǒ:"O",Ô:"O",Ố:"O",Ộ:"O",Ồ:"O",Ổ:"O",Ỗ:"O",Ö:"O",Ȫ:"O",Ȯ:"O",Ȱ:"O",Ọ:"O",Ő:"O",Ȍ:"O",Ò:"O",Ỏ:"O",Ơ:"O",Ớ:"O",Ợ:"O",Ờ:"O",Ở:"O",Ỡ:"O",Ȏ:"O",Ꝋ:"O",Ꝍ:"O",Ō:"O",Ṓ:"O",Ṑ:"O",Ɵ:"O",Ǫ:"O",Ǭ:"O",Ø:"O",Ǿ:"O",Õ:"O",Ṍ:"O",Ṏ:"O",Ȭ:"O",Ƣ:"OI",Ꝏ:"OO",Ɛ:"E",Ɔ:"O",Ȣ:"OU",Ṕ:"P",Ṗ:"P",Ꝓ:"P",Ƥ:"P",Ꝕ:"P",Ᵽ:"P",Ꝑ:"P",Ꝙ:"Q",Ꝗ:"Q",Ŕ:"R",Ř:"R",Ŗ:"R",Ṙ:"R",Ṛ:"R",Ṝ:"R",Ȑ:"R",Ȓ:"R",Ṟ:"R",Ɍ:"R",Ɽ:"R",Ꜿ:"C",Ǝ:"E",Ś:"S",Ṥ:"S",Š:"S",Ṧ:"S",Ş:"S",Ŝ:"S",Ș:"S",Ṡ:"S",Ṣ:"S",Ṩ:"S",ẞ:"SS",Ť:"T",Ţ:"T",Ṱ:"T",Ț:"T",Ⱦ:"T",Ṫ:"T",Ṭ:"T",Ƭ:"T",Ṯ:"T",Ʈ:"T",Ŧ:"T",Ɐ:"A",Ꞁ:"L",Ɯ:"M",Ʌ:"V",Ꜩ:"TZ",Ú:"U",Ŭ:"U",Ǔ:"U",Û:"U",Ṷ:"U",Ü:"U",Ǘ:"U",Ǚ:"U",Ǜ:"U",Ǖ:"U",Ṳ:"U",Ụ:"U",Ű:"U",Ȕ:"U",Ù:"U",Ủ:"U",Ư:"U",Ứ:"U",Ự:"U",Ừ:"U",Ử:"U",Ữ:"U",Ȗ:"U",Ū:"U",Ṻ:"U",Ų:"U",Ů:"U",Ũ:"U",Ṹ:"U",Ṵ:"U",Ꝟ:"V",Ṿ:"V",Ʋ:"V",Ṽ:"V",Ꝡ:"VY",Ẃ:"W",Ŵ:"W",Ẅ:"W",Ẇ:"W",Ẉ:"W",Ẁ:"W",Ⱳ:"W",Ẍ:"X",Ẋ:"X",Ý:"Y",Ŷ:"Y",Ÿ:"Y",Ẏ:"Y",Ỵ:"Y",Ỳ:"Y",Ƴ:"Y",Ỷ:"Y",Ỿ:"Y",Ȳ:"Y",Ɏ:"Y",Ỹ:"Y",Ź:"Z",Ž:"Z",Ẑ:"Z",Ⱬ:"Z",Ż:"Z",Ẓ:"Z",Ȥ:"Z",Ẕ:"Z",Ƶ:"Z",IJ:"IJ",Œ:"OE",ᴀ:"A",ᴁ:"AE",ʙ:"B",ᴃ:"B",ᴄ:"C",ᴅ:"D",ᴇ:"E",ꜰ:"F",ɢ:"G",ʛ:"G",ʜ:"H",ɪ:"I",ʁ:"R",ᴊ:"J",ᴋ:"K",ʟ:"L",ᴌ:"L",ᴍ:"M",ɴ:"N",ᴏ:"O",ɶ:"OE",ᴐ:"O",ᴕ:"OU",ᴘ:"P",ʀ:"R",ᴎ:"N",ᴙ:"R",ꜱ:"S",ᴛ:"T",ⱻ:"E",ᴚ:"R",ᴜ:"U",ᴠ:"V",ᴡ:"W",ʏ:"Y",ᴢ:"Z",á:"a",ă:"a",ắ:"a",ặ:"a",ằ:"a",ẳ:"a",ẵ:"a",ǎ:"a",â:"a",ấ:"a",ậ:"a",ầ:"a",ẩ:"a",ẫ:"a",ä:"a",ǟ:"a",ȧ:"a",ǡ:"a",ạ:"a",ȁ:"a",à:"a",ả:"a",ȃ:"a",ā:"a",ą:"a",ᶏ:"a",ẚ:"a",å:"a",ǻ:"a",ḁ:"a",ⱥ:"a",ã:"a",ꜳ:"aa",æ:"ae",ǽ:"ae",ǣ:"ae",ꜵ:"ao",ꜷ:"au",ꜹ:"av",ꜻ:"av",ꜽ:"ay",ḃ:"b",ḅ:"b",ɓ:"b",ḇ:"b",ᵬ:"b",ᶀ:"b",ƀ:"b",ƃ:"b",ɵ:"o",ć:"c",č:"c",ç:"c",ḉ:"c",ĉ:"c",ɕ:"c",ċ:"c",ƈ:"c",ȼ:"c",ď:"d",ḑ:"d",ḓ:"d",ȡ:"d",ḋ:"d",ḍ:"d",ɗ:"d",ᶑ:"d",ḏ:"d",ᵭ:"d",ᶁ:"d",đ:"d",ɖ:"d",ƌ:"d",ı:"i",ȷ:"j",ɟ:"j",ʄ:"j",dz:"dz",dž:"dz",é:"e",ĕ:"e",ě:"e",ȩ:"e",ḝ:"e",ê:"e",ế:"e",ệ:"e",ề:"e",ể:"e",ễ:"e",ḙ:"e",ë:"e",ė:"e",ẹ:"e",ȅ:"e",è:"e",ẻ:"e",ȇ:"e",ē:"e",ḗ:"e",ḕ:"e",ⱸ:"e",ę:"e",ᶒ:"e",ɇ:"e",ẽ:"e",ḛ:"e",ꝫ:"et",ḟ:"f",ƒ:"f",ᵮ:"f",ᶂ:"f",ǵ:"g",ğ:"g",ǧ:"g",ģ:"g",ĝ:"g",ġ:"g",ɠ:"g",ḡ:"g",ᶃ:"g",ǥ:"g",ḫ:"h",ȟ:"h",ḩ:"h",ĥ:"h",ⱨ:"h",ḧ:"h",ḣ:"h",ḥ:"h",ɦ:"h",ẖ:"h",ħ:"h",ƕ:"hv",í:"i",ĭ:"i",ǐ:"i",î:"i",ï:"i",ḯ:"i",ị:"i",ȉ:"i",ì:"i",ỉ:"i",ȋ:"i",ī:"i",į:"i",ᶖ:"i",ɨ:"i",ĩ:"i",ḭ:"i",ꝺ:"d",ꝼ:"f",ᵹ:"g",ꞃ:"r",ꞅ:"s",ꞇ:"t",ꝭ:"is",ǰ:"j",ĵ:"j",ʝ:"j",ɉ:"j",ḱ:"k",ǩ:"k",ķ:"k",ⱪ:"k",ꝃ:"k",ḳ:"k",ƙ:"k",ḵ:"k",ᶄ:"k",ꝁ:"k",ꝅ:"k",ĺ:"l",ƚ:"l",ɬ:"l",ľ:"l",ļ:"l",ḽ:"l",ȴ:"l",ḷ:"l",ḹ:"l",ⱡ:"l",ꝉ:"l",ḻ:"l",ŀ:"l",ɫ:"l",ᶅ:"l",ɭ:"l",ł:"l",lj:"lj",ſ:"s",ẜ:"s",ẛ:"s",ẝ:"s",ḿ:"m",ṁ:"m",ṃ:"m",ɱ:"m",ᵯ:"m",ᶆ:"m",ń:"n",ň:"n",ņ:"n",ṋ:"n",ȵ:"n",ṅ:"n",ṇ:"n",ǹ:"n",ɲ:"n",ṉ:"n",ƞ:"n",ᵰ:"n",ᶇ:"n",ɳ:"n",ñ:"n",nj:"nj",ó:"o",ŏ:"o",ǒ:"o",ô:"o",ố:"o",ộ:"o",ồ:"o",ổ:"o",ỗ:"o",ö:"o",ȫ:"o",ȯ:"o",ȱ:"o",ọ:"o",ő:"o",ȍ:"o",ò:"o",ỏ:"o",ơ:"o",ớ:"o",ợ:"o",ờ:"o",ở:"o",ỡ:"o",ȏ:"o",ꝋ:"o",ꝍ:"o",ⱺ:"o",ō:"o",ṓ:"o",ṑ:"o",ǫ:"o",ǭ:"o",ø:"o",ǿ:"o",õ:"o",ṍ:"o",ṏ:"o",ȭ:"o",ƣ:"oi",ꝏ:"oo",ɛ:"e",ᶓ:"e",ɔ:"o",ᶗ:"o",ȣ:"ou",ṕ:"p",ṗ:"p",ꝓ:"p",ƥ:"p",ᵱ:"p",ᶈ:"p",ꝕ:"p",ᵽ:"p",ꝑ:"p",ꝙ:"q",ʠ:"q",ɋ:"q",ꝗ:"q",ŕ:"r",ř:"r",ŗ:"r",ṙ:"r",ṛ:"r",ṝ:"r",ȑ:"r",ɾ:"r",ᵳ:"r",ȓ:"r",ṟ:"r",ɼ:"r",ᵲ:"r",ᶉ:"r",ɍ:"r",ɽ:"r",ↄ:"c",ꜿ:"c",ɘ:"e",ɿ:"r",ś:"s",ṥ:"s",š:"s",ṧ:"s",ş:"s",ŝ:"s",ș:"s",ṡ:"s",ṣ:"s",ṩ:"s",ʂ:"s",ᵴ:"s",ᶊ:"s",ȿ:"s",ɡ:"g",ß:"ss",ᴑ:"o",ᴓ:"o",ᴝ:"u",ť:"t",ţ:"t",ṱ:"t",ț:"t",ȶ:"t",ẗ:"t",ⱦ:"t",ṫ:"t",ṭ:"t",ƭ:"t",ṯ:"t",ᵵ:"t",ƫ:"t",ʈ:"t",ŧ:"t",ᵺ:"th",ɐ:"a",ᴂ:"ae",ǝ:"e",ᵷ:"g",ɥ:"h",ʮ:"h",ʯ:"h",ᴉ:"i",ʞ:"k",ꞁ:"l",ɯ:"m",ɰ:"m",ᴔ:"oe",ɹ:"r",ɻ:"r",ɺ:"r",ⱹ:"r",ʇ:"t",ʌ:"v",ʍ:"w",ʎ:"y",ꜩ:"tz",ú:"u",ŭ:"u",ǔ:"u",û:"u",ṷ:"u",ü:"u",ǘ:"u",ǚ:"u",ǜ:"u",ǖ:"u",ṳ:"u",ụ:"u",ű:"u",ȕ:"u",ù:"u",ủ:"u",ư:"u",ứ:"u",ự:"u",ừ:"u",ử:"u",ữ:"u",ȗ:"u",ū:"u",ṻ:"u",ų:"u",ᶙ:"u",ů:"u",ũ:"u",ṹ:"u",ṵ:"u",ᵫ:"ue",ꝸ:"um",ⱴ:"v",ꝟ:"v",ṿ:"v",ʋ:"v",ᶌ:"v",ⱱ:"v",ṽ:"v",ꝡ:"vy",ẃ:"w",ŵ:"w",ẅ:"w",ẇ:"w",ẉ:"w",ẁ:"w",ⱳ:"w",ẘ:"w",ẍ:"x",ẋ:"x",ᶍ:"x",ý:"y",ŷ:"y",ÿ:"y",ẏ:"y",ỵ:"y",ỳ:"y",ƴ:"y",ỷ:"y",ỿ:"y",ȳ:"y",ẙ:"y",ɏ:"y",ỹ:"y",ź:"z",ž:"z",ẑ:"z",ʑ:"z",ⱬ:"z",ż:"z",ẓ:"z",ȥ:"z",ẕ:"z",ᵶ:"z",ᶎ:"z",ʐ:"z",ƶ:"z",ɀ:"z",ff:"ff",ffi:"ffi",ffl:"ffl",fi:"fi",fl:"fl",ij:"ij",œ:"oe",st:"st",ₐ:"a",ₑ:"e",ᵢ:"i",ⱼ:"j",ₒ:"o",ᵣ:"r",ᵤ:"u",ᵥ:"v",ₓ:"x",Ё:"YO",Й:"I",Ц:"TS",У:"U",К:"K",Е:"E",Н:"N",Г:"G",Ш:"SH",Щ:"SCH",З:"Z",Х:"H",Ъ:"",ё:"yo",й:"i",ц:"ts",у:"u",к:"k",е:"e",н:"n",г:"g",ш:"sh",щ:"sch",з:"z",х:"h",ъ:"",Ф:"F",Ы:"I",В:"V",А:"A",П:"P",Р:"R",О:"O",Л:"L",Д:"D",Ж:"ZH",Э:"E",ф:"f",ы:"i",в:"v",а:"a",п:"p",р:"r",о:"o",л:"l",д:"d",ж:"zh",э:"e",Я:"Ya",Ч:"CH",С:"S",М:"M",И:"I",Т:"T",Ь:"",Б:"B",Ю:"YU",я:"ya",ч:"ch",с:"s",м:"m",и:"i",т:"t",ь:"",б:"b",ю:"yu"},TLD:["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"],MediaSizes:d(4755).ZP};t.GO.Config=s;const a=s},4727:(f,e,d)=>{d.r(e),d.d(e,{I18n:()=>h,UNSUPPORTED_LANG_PACK_KEY:()=>b,_i18n:()=>k,default:()=>g,i18n:()=>p,i18n_:()=>m,join:()=>v,joinElementsWith:()=>y,langPack:()=>l});var t=d(410),s=d(9518),a=d(7922),c=d(4159),i=d(3512),n=d(8598),o=d(4762),r=d(6848),u=d(5953);const l={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},b=o.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var h;!function(f){let e,o;function l(){const e=c.Z.langPackCode;return f.lastRequestedLangCode=e,Promise.all([d.e(104).then(d.bind(d,9104)),d.e(301).then(d.bind(d,9301)),d.e(8).then(d.bind(d,9179))]).then((([f,d,t])=>{const s=[];return h(f.default,s),h(d.default,s),g({_:"langPackDifference",from_version:0,lang_code:e,strings:s,version:0,local:!0,countries:t.default})}))}function b(e){return f.requestedServerLanguage=!0,Promise.all([s.Z.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:c.Z.langPack}),s.Z.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:"android"}),d.e(104).then(d.bind(d,9104)),d.e(301).then(d.bind(d,9301)),s.Z.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(f,e=[]){for(const d in f){const t=f[d];"string"==typeof t?e.push({_:"langPackString",key:d,value:t}):e.push(Object.assign({_:"langPackStringPluralized",key:d},t))}return e}function g(f){return f.appVersion=c.Z.langPackVersion,a.Z.set({langPack:f}).then((()=>(p(f),f)))}function p(d){if(d.lang_code===f.lastRequestedLangCode){try{e=new Intl.PluralRules(d.lang_code)}catch(f){console.error("pluralRules error",f),e=new Intl.PluralRules(d.lang_code.split("-",1)[0])}f.strings.clear();for(const e of d.strings)f.strings.set(e.key,e);d.countries&&(f.countriesList.length=0,f.countriesList.push(...d.countries.countries),d.countries.countries.forEach((e=>{if(e.name){const d=e.default_name;f.strings.set(d,{_:"langPackString",key:d,value:e.name})}}))),f.lastAppliedLangCode!==d.lang_code&&(i.default.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code),Array.from(document.querySelectorAll(".i18n")).forEach((e=>{const d=f.weakMap.get(e);d&&d.update()}))}}function m(f,e,d={i:0}){let t=[],s=0;return f.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((f,a,c,i,o,r,u)=>{if(t.push(u.slice(s,r)),a){let f;switch(a){case"**":f=document.createElement("b");break;case"__":f=document.createElement("i")}f.append(...m(c,e,d)),t.push(f)}else if(i)t.push(document.createElement("br"));else if(o){const f=o.lastIndexOf("]"),s=o.slice(1,f),a=o.slice(f+2,o.length-1);let c;if(a&&n.Z.matchUrlProtocol(a)){c=document.createElement("a");const f=n.Z.wrapUrl(a);c.href=f.url,f.onclick&&c.setAttribute("onclick",f.onclick),c.target="_blank"}else c=e[d.i++],c.textContent="";c.append(...m(s,e,d)),t.push(c)}else e&&function(f,e,d){const t=e[d.i++];Array.isArray(t)?f.push(...t):f.push(t)}(t,e,d);return s=r+f.length,""})),s!==f.length&&t.push(f.slice(s)),t}function k(d,t=!1,s){const a=f.strings.get(d);let c;if(a)if("langPackStringPluralized"===a._&&(null==s?void 0:s.length)){let f=s[0];"string"==typeof f&&(f=+f.replace(/\D/g,"")),c=a[e.select(f)+"_value"]||a.other_value}else c="langPackString"===a._?a.value:d;else c=d;const i=m(c,s);return t?i.map((f=>f instanceof Node?f.textContent:f)).join(""):i}f.strings=new Map,f.countriesList=[],f.requestedServerLanguage=!1,f.getCacheLangPack=function(){return o||(o=Promise.all([a.Z.get("langPack"),f.polyfillPromise]).then((([e])=>e?(t.ZP,f.lastRequestedLangCode||(f.lastRequestedLangCode=e.lang_code),p(e),e):l())).finally((()=>{o=void 0})))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;f.timeFormat=e,d&&Array.from(document.querySelectorAll(".i18n")).forEach((e=>{const d=f.weakMap.get(e);d instanceof w&&d.update()}))},f.loadLocalLangPack=l,f.loadLangPack=b,f.getStrings=function(f,e){return s.Z.invokeApi("langpack.getStrings",{lang_pack:c.Z.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=function(e){return f.lastRequestedLangCode=e,b(e).then((([f,e,d,t,s,a])=>{let c=[];[d,t].forEach((f=>{h(f.default,c)})),c=c.concat(f.strings);for(const f of e.strings)c.push(f);return f.strings=c,f.countries=s,g(f)}))},f.saveLangPack=g,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(642).then(d.bind(d,4642)).then((f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)})),f.applyLangPack=p,f.superFormatter=m,f.format=k,f.weakMap=new WeakMap;class y{constructor(e){this.property="innerHTML",this.element=(null==e?void 0:e.element)||document.createElement("span"),this.element.classList.add("i18n"),e&&(e.key||e.date)&&this.update(e),f.weakMap.set(this.element,this)}}class v extends y{update(f){if((0,u.Z)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...k(this.key,!1,this.args));else{const f=this.element[this.property],e=k(this.key,!0,this.args);void 0===f?this.element.dataset[this.property]=e:this.element[this.property]=e}}compareAndUpdate(f){if(this.key!==f.key||!(0,r.Z)(this.args,f.args))return this.update(f)}}f.IntlElement=v;class w extends y{update(e){(0,u.Z)(this,e);const d=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,this.options);var t;this.element[this.property]=(t=d.format(this.date)).charAt(0).toUpperCase()+t.slice(1)}}f.IntlDateElement=w,f.i18n=function(f,e){return new v({key:f,args:e}).element},f.i18n_=function(f){return new v(f).element},f._i18n=function(f,e,d,t){return new v({element:f,key:e,args:d,property:t}).element}}(h||(h={}));const g=h,p=h.i18n,m=h.i18n_,k=h._i18n;function y(f,e){const d=f.slice(0,1);for(let t=1;t{const t=f&&e?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return d?h.format(t,!0):p(t)}));return d?t.join(""):t}t.GO.I18n=h},9518:(f,e,d)=>{function t(){return new Worker(d.p+"mtproto.worker.77bc82001791a2fea575.bundle.worker.js")}d.d(e,{Z:()=>A});var s=d(5003),a=d(3512),c=d(3689),i=d(410),n=d(1267),o=d(3241);class r extends o.Z{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=n.Z.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=f=>{this.log.error("handleError",f),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=f=>{this.debug&&this.log.debug("<-","handleMessage",f.data.byteLength),this.dispatchEvent("message",f.data)},this.send=f=>{this.debug&&this.log.debug("-> body length to send:",f.length),this.ws.send(f)};let t=s.v9.Error|s.v9.Log;return this.debug&&(t|=s.v9.Debug),this.log=(0,s.kg)(`WS-${f}`+d,t),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(f){}this.handleClose()}}}var u=d(490),l=d(7487),b=d(6702),h=d(6947),g=d(1722),p=d(5228),m=d(5418),k=d(5269),y=d(677),v=d(5880);const w=new class extends class{invokeCrypto(f,...e){return this.performTaskWorker(f,...e)}}{constructor(){super(),this.afterMessageIdTemp=0,this.taskId=0,this.awaiting={},this.pending=[],this.updatesProcessor=null,this.log=(0,s.kg)("API-PROXY"),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.isSWRegistered=!0,this.debug=i.ZP,this.sockets=new Map,this.taskListeners={},this.taskListenersSW={},this.postMessagesWaiting=[],this.onWorkerMessage=f=>{const e=f.data;if(!(0,v.Z)(e))return;const d=this.taskListeners[e.type];d?d(e):e.update?this.updatesProcessor&&this.updatesProcessor(e.update):e.progress?a.default.dispatchEvent("download_progress",e.progress):(e.hasOwnProperty("result")||e.hasOwnProperty("error"))&&this.finalizeTask(e.taskId,e.result,e.error)},this.log("constructor"),u.Z.start(),this.registerServiceWorker(),this.addTaskListener("clear",(()=>{Promise.all([h.Z.toggleStorage(!1),l.Z.clear(),Promise.race([p.default.setAuthorized(!1),(0,m.w)(3e3)]),b.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((f=>caches.delete(f))))]).finally((()=>{g.Z.reload()}))})),this.addTaskListener("connectionStatusChange",(f=>{a.default.dispatchEvent("connection_status_change",f.payload)})),this.addTaskListener("convertWebp",(f=>{c.Z.postMessage(f)})),this.addTaskListener("socketProxy",(f=>{const e=f.payload,d=e.id;if("send"===e.type)this.sockets.get(d).send(e.payload);else if("close"===e.type)this.sockets.get(d).close();else if("setup"===e.type){const f=new r(e.payload.dcId,e.payload.url,e.payload.logSuffix),t=()=>{this.postMessage({type:"socketProxy",payload:{type:"open",id:d}})},s=()=>{this.postMessage({type:"socketProxy",payload:{type:"close",id:d}}),f.removeEventListener("open",t),f.removeEventListener("close",s),f.removeEventListener("message",a),this.sockets.delete(d)},a=f=>{this.postMessage({type:"socketProxy",payload:{type:"message",id:d,payload:f}})};f.addEventListener("open",t),f.addEventListener("close",s),f.addEventListener("message",a),this.sockets.set(d,f)}})),this.addTaskListener("localStorageProxy",(f=>{const e=f.payload;l.Z[e.type](...e.args).then((e=>{this.postMessage({type:"localStorageProxy",id:f.id,payload:e})}))})),a.default.addEventListener("language_change",(f=>{this.performTaskWorkerVoid("setLanguage",f)})),window.addEventListener("online",(f=>{this.forceReconnectTimeout()})),this.registerWorker(),setTimeout((()=>{this.getConfig()}),5e3)}isServiceWorkerOnline(){return this.isSWRegistered}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const f=navigator.serviceWorker;f.register("./sw.js",{scope:"./"}).then((f=>{this.log("SW registered",f),this.isSWRegistered=!0,(f.installing||f.waiting||f.active).addEventListener("statechange",(f=>{this.log("SW statechange",f)}))}),(f=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",f),this.onServiceWorkerFail&&this.onServiceWorkerFail()})),f.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange"),this.releasePending(),f.controller.addEventListener("error",(f=>{this.log.error("controller error:",f)}))})),f.addEventListener("message",(f=>{const e=f.data;if(!(0,v.Z)(e))return;const d=this.taskListenersSW[e.type];d&&d(e)})),this.addServiceWorkerTaskListener("requestFilePart",(f=>{const e={type:f.type,id:f.id};this.performTaskWorker("requestFilePart",...f.payload).then((f=>{e.payload=f,this.postSWMessage(e)}),(d=>{e.originalPayload=f.payload,e.error=d,this.postSWMessage(e)}))})),f.addEventListener("messageerror",(f=>{this.log.error("SW messageerror:",f)}))}postMessage(...f){this.postMessagesWaiting.push(f)}postSWMessage(f){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(f)}onWorkerFirstMessage(f){if(!this.worker){this.worker=f,this.log("set webWorker"),this.postMessage=this.worker.postMessage.bind(this.worker),this.postMessagesWaiting.forEach((f=>this.postMessage(...f))),this.postMessagesWaiting.length=0;const e=k.Z;this.log("WebP supported:",e),this.postMessage({type:"webpSupport",payload:e}),this.postMessage({type:"userAgent",payload:navigator.userAgent}),this.releasePending()}}addTaskListener(f,e){this.taskListeners[f]=e}addServiceWorkerTaskListener(f,e){this.taskListenersSW[f]=e}registerWorker(){const f=new t;f.addEventListener("message",this.onWorkerFirstMessage.bind(this,f),{once:!0}),f.addEventListener("message",this.onWorkerMessage),f.addEventListener("error",(f=>{this.log.error("WORKER ERROR",f)}))}finalizeTask(f,e,d){const t=this.awaiting[f];void 0!==t&&(this.debug&&this.log.debug("done",t.taskName,e,d),d?t.reject(d):t.resolve(e),delete this.awaiting[f])}createTask(f,e,d){return{task:f,taskId:this.taskId++,type:e,args:d}}performTaskWorkerVoid(f,...e){const d=this.createTask(f,void 0,e);this.pending.push(d),this.releasePending()}performTaskWorkerNew(f,e,...d){return this.debug&&this.log.debug("start",f,d),new Promise(((t,s)=>{const a=this.createTask(f,e,d);this.pending.push(a),this.awaiting[a.taskId]={resolve:t,reject:s,taskName:f},this.releasePending()}))}performTaskWorker(f,...e){return this.performTaskWorkerNew(f,void 0,...e)}releasePending(){this.postMessage&&(this.debug&&this.log.debug("releasing tasks, length:",this.pending.length),this.pending.forEach((f=>{this.postMessage(f)})),this.debug&&this.log.debug("released tasks"),this.pending.length=0)}setUpdatesProcessor(f){this.updatesProcessor=f}invokeCrypto(f,...e){return this.performTaskWorkerNew(f,"crypto",...e)}invokeApi(f,e={},d={}){return this.performTaskWorker("invokeApi",f,e,d)}invokeApiAfter(f,e={},d={}){let t=d;return t.prepareTempMessageId=""+ ++this.afterMessageIdTemp,t=Object.assign({},d),d.messageId=t.prepareTempMessageId,this.invokeApi(f,e,t)}invokeApiHashable(f){var e,d;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{params:t,options:s,method:a}=f,c=JSON.stringify(t);let i;return this.hashes[a]&&(i=this.hashes[a][c],i&&(t.hash=i.hash)),this.invokeApiSingleProcess({method:a,processResult:e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",a,c),i.result;if(e.hash){const f=e.hash;this.hashes[a]||(this.hashes[a]={}),this.hashes[a][c]={hash:f,result:e}}return f.processResult?f.processResult(e):e},params:t,options:s})}invokeApiSingle(f,e={},d={}){const t=f+"-"+JSON.stringify(e),s=this.apiPromisesSingle;return s[t]?s[t]:s[t]=this.invokeApi(f,e,d).finally((()=>{delete s[t]}))}invokeApiSingleProcess(f){var e,d,t;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{method:s,processResult:a,processError:c,params:i,options:n}=f,o=this.apiPromisesSingleProcess,r=n.cacheKey||JSON.stringify(i),u=null!==(t=o[s])&&void 0!==t?t:o[s]=new Map,l=u.get(r);if(l)return l;const b=this.invokeApi(s,i,n).then(a,c).finally((()=>{u.delete(r),u.size||delete o[s]}));return u.set(r,b),b}invokeApiCacheable(f,e={},d={}){var t;const s=null!==(t=this.apiPromisesCacheable[f])&&void 0!==t?t:this.apiPromisesCacheable[f]={},a=JSON.stringify(e),c=s[a];if(c&&(!d.override||!c.fulfilled))return c.promise;let i;d.override&&(c&&c.timeout&&(clearTimeout(c.timeout),delete c.timeout),delete d.override),d.cacheSeconds&&(i=window.setTimeout((()=>{delete s[a]}),1e3*d.cacheSeconds),delete d.cacheSeconds);const n=this.invokeApi(f,e,d);return s[a]={timestamp:Date.now(),fulfilled:!1,timeout:i,promise:n,params:e},n}clearCache(f,e){const d=this.apiPromisesCacheable[f];if(d)for(const f in d){const t=d[f];try{e(t.params)&&(t.timeout&&clearTimeout(t.timeout),delete d[f])}catch(e){this.log.error("clearCache error:",e,f,t)}}}setBaseDcId(f){return this.performTaskWorker("setBaseDcId",f)}setQueueId(f){return this.performTaskWorker("setQueueId",f)}setUserAuth(f){return"string"!=typeof f&&"number"!=typeof f||(f={dcID:0,date:Date.now()/1e3|0,id:f.toPeerId(!1)}),a.default.dispatchEvent("user_auth",f),this.performTaskWorker("setUserAuth",f)}setUser(f){return this.setUserAuth(f.id)}getNetworker(f,e){return this.performTaskWorker("getNetworker",f,e)}logOut(){return this.performTaskWorker("logOut")}cancelDownload(f){return this.performTaskWorker("cancelDownload",f)}downloadFile(f){return this.performTaskWorker("downloadFile",f)}uploadFile(f){return this.performTaskWorker("uploadFile",f)}toggleStorage(f){const e={type:"toggleStorage",payload:f};this.postMessage(e),this.postSWMessage(e)}stopAll(){return this.performTaskWorkerVoid("stopAll")}startAll(){return this.performTaskWorkerVoid("startAll")}forceReconnectTimeout(){this.postMessage({type:"online"})}forceReconnect(){this.postMessage({type:"forceReconnect"})}getConfig(){return this.getConfigPromise?this.getConfigPromise:this.getConfigPromise=this.invokeApi("help.getConfig").then((f=>(a.default.config=f,f)))}getAppConfig(f){if(a.default.appConfig&&!f)return a.default.appConfig;if(this.getAppConfigPromise&&!f)return this.getAppConfigPromise;const e=this.getAppConfigPromise=this.invokeApi("help.getAppConfig").then((f=>{var d;return this.getAppConfigPromise!==e?this.getAppConfigPromise:(a.default.appConfig=f,(0,y.Ki)(null!==(d=f.ignore_restriction_reasons)&&void 0!==d?d:[]),f)}));return e}};i.GO.apiManagerProxy=w;const A=w},490:(f,e,d)=>{d.d(e,{Z:()=>r});var t=d(410),s=d(144),a=d(5003),c=d(3512),i=d(7487),n=d(9518);const o=new class{constructor(){this.log=(0,a.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),i.Z.delete("xt_instance"))},this.deactivateInstance=()=>{if(this.masterInstance||this.deactivated)return!1;this.log("deactivate"),this.deactivateTimeout=0,this.deactivated=!0,this.clearInstance(),c.default.idle.deactivated=!0,c.default.dispatchEvent("instance_deactivated")},this.checkInstance=(f=c.default.idle&&c.default.idle.isIDLE)=>{if(this.deactivated)return!1;const e=Date.now(),d={id:this.instanceID,idle:f,time:e};i.Z.get("xt_instance",!1).then((t=>{!f||!t||t.id===this.instanceID||t.time{d.r(e),d.d(e,{TelegramMeWebManager:()=>n,default:()=>r});var t=d(4159),s=d(410),a=d(1267),c=d(632),i=d(7487);class n{constructor(){this.disabled=a.Z.test||-1===t.Z.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return i.Z.get("tgme_sync").then((e=>{const d=(0,c.bz)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;i.Z.set({tgme_sync:{canRedirect:f,ts:d}});const s=`_websync_?authed=${f?"1":"0"}&version=${encodeURIComponent(t.Z.version+" "+t.Z.suffix)}`,a=["//telegram.me/"+s,"//t.me/"+s].map((f=>{const e=document.createElement("script"),d=new Promise((f=>{e.onload=e.onerror=()=>{e.remove(),f()}}));return e.src=f,document.body.appendChild(e),d}));return Promise.all(a)}))}}const o=new n;s.GO&&(s.GO.telegramMeWebManager=o);const r=o},6702:(f,e,d)=>{d.r(e),d.d(e,{WebPushApiManager:()=>u,default:()=>b});var t=d(410),s=d(5003),a=d(3512),c=d(9518),i=d(4727),n=d(4762),o=d(1722),r=d(8479);class u{constructor(){this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,s.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((f=>{f.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((f=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",f)})).catch((f=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",f),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||a.default.idle&&a.default.idle.deactivated)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"")+"#/im";const f={},e={push_action_mute1d:n.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:n.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=i.default.format(e[d],!0);const d={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:f,settings:this.settings}};c.Z.postSWMessage(d),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((f=>{f.pushManager.getSubscription().then((f=>{this.isPushEnabled=!!f,this.pushSubscriptionNotify("init",f)})).catch((f=>{this.log.error("Error during getSubscription()",f)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((f=>{f.pushManager.getSubscription().then((f=>{this.isPushEnabled=!1,f&&(this.pushSubscriptionNotify("unsubscribe",f),setTimeout((()=>{f.unsubscribe().then((f=>{this.isPushEnabled=!1})).catch((f=>{this.log.error("Unsubscription error: ",f)}))}),3e3))})).catch((f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((f=>{f.pushManager.getSubscription().then((f=>{this.log.warn("force unsubscribe",f),f&&f.unsubscribe().then((f=>{this.log.warn("force unsubscribe successful",f),this.isPushEnabled=!1})).catch((f=>{this.log.error("Unsubscription error: ",f)}))})).catch((f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)}))}))}setSettings(f){this.settings=(0,r.Z)(f),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&c.Z.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(c.Z.addServiceWorkerTaskListener("push_click",(f=>{a.default.idle&&a.default.idle.deactivated?o.Z.reload():a.default.dispatchEvent("push_notification_click",f.payload)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(f,e){if(e){const d=e.toJSON();if(!(d&&d.endpoint&&d.keys&&d.keys.p256dh&&d.keys.auth))return this.log.warn("Invalid push subscription",d),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(f);this.log.warn("Push",f,d),a.default.dispatchEvent("push_"+f,{tokenType:10,tokenValue:JSON.stringify(d)})}else this.log.warn("Push",f,!1),a.default.dispatchEvent("push_"+f,!1)}}const l=new u;t.GO&&(t.GO.webPushApiManager=l);const b=l},8598:(f,e,d)=>{d.d(e,{o:()=>A,Z:()=>E});var t=d(6718),s=d(671),a=d(4762),c=d(410),i=d(9976),n=d(8479);function o(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(f=>"&#"+f.charCodeAt(0)+";")).replace(//g,">")}const r=t.ZP.Emoji,u="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",l="["+u+"0-9]",b="((?:https?|ftp)://|mailto:)?",h=b+"(?:"+l+"{1,64}(?::"+l+"{0,64})?@)?(?:(?: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}|"+l+"["+u+"·0-9-]{0,64}(?:\\."+l+"["+u+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+u+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",g=(new RegExp("^"+b.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),p=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+h+")|(\\n)|(((?:👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍❤️?‍💋‍👨|👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍❤️?‍👨|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍❤️?‍\ud83d[\udc68\udc69]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️?⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️))|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),m=/^(([^<>()[\]\\.,;:\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,}))$/,k=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,y={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},v={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},w=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let f in v)w.add(v[f]);var A;!function(f){function e(f){let e=(0,s.N0)(f).replace(/-?fe0f/g,"");return r.hasOwnProperty(e)?e:null}function d(f){let d,s=f;const a=[];let c,i=0;for(p.lastIndex=0;d=s.match(p);){if(c=i+d.index,d[3])a.push({_:"messageEntityMention",offset:c+d[1].length,length:d[2].length+d[3].length});else if(d[4])if(m.test(d[4]))a.push({_:"messageEntityEmail",offset:c,length:d[4].length});else{let f,e=d[5];const s=d[6];if(s){if(e||"xn--"!==s.substr(0,4)&&-1===t.ZP.TLD.indexOf(s.toLowerCase())||(e="http://"),e){const t=C(d[4]);t.length!==d[4].length&&(d[4]=t),f=(d[5]?"":e)+d[4]}}else f=(d[5]?"":"http://")+d[4];f&&a.push({_:"messageEntityUrl",offset:c,length:d[4].length})}else if(d[7])a.push({_:"messageEntityLinebreak",offset:c,length:1});else if(d[8]){const f=e(d[8]);f&&a.push({_:"messageEntityEmoji",offset:c,length:d[8].length,unicode:f})}else d[11]?a.push({_:"messageEntityHashtag",offset:c+(d[10]?d[10].length:0),length:d[11].length}):d[13]&&a.push({_:"messageEntityBotCommand",offset:c+(d[11]?d[11].length:0)+(d[12]?d[12].length:0),length:1+d[13].length+(d[14]?1+d[14].length:0),unsafe:!0});s=s.substr(d.index+d[0].length),i+=d.index+d[0].length}return a}function c(f,e){return f.find((f=>(e._===f._||!w.has(e._)&&!w.has(f._))&&(e.offset>=f.offset&&e.length+e.offset<=f.length+f.offset)))}function u(f,e){const d=e.filter((e=>!c(f,e)));f.push(...d),A(f);for(let e=0;ec(e,f)?s=!1:(t.push(f),s=!0),i=[];let n,o=0;for(;n=f.match(k);){const e=o+n.index;i.push(f.substr(0,n.index));const d=n[3]||n[8]||n[11]||n[13];let t;if(o-=d.length,o+=d.length,s=!1,d.match(/^`*$/))i.push(n[0]);else if(n[3])t={_:"messageEntityPre",language:"",offset:e+n[1].length,length:d.length},a(t)&&("\n"===n[5]&&(n[5]="",o-=1),i.push(n[1]+d+n[5]),o-=n[2].length+n[4].length);else if(n[7]){const f=""===n[6];t={_:v[n[7]],offset:e+(f?0:n[6].length),length:d.length},a(t)&&(f?i.push(d):i.push(n[6]+d+n[9]),o-=2*n[7].length+(f?2:0))}else n[11]?(t={_:"messageEntityMentionName",user_id:n[10].toUserId(),offset:e,length:d.length},a(t)&&(i.push(d),o-=n[0].length-d.length)):n[12]&&(t={_:"messageEntityTextUrl",url:n[14],offset:e,length:d.length},a(t)&&(i.push(d),o-=n[12].length-d.length));s||i.push(n[0]),f=f.substr(n.index+n[0].length),o+=n.index+n[0].length}i.push(f);let r=i.join("");r.replace(/\s+/g,"").length||(r=f,t.splice(0,t.length)),u(e,t),b(e);let l=r.length;if(!d){r=r.replace(/^\s*/,"");let f=l-r.length;f&&e.forEach((e=>{e.offset=Math.max(0,e.offset-f)})),r=r.replace(/\s*$/,""),f=l-r.length,l=r.length,f&&e.forEach((f=>{f.offset+f.length>l&&(f.length=l-f.offset)}))}return r},f.findConflictingEntity=c,f.mergeEntities=u;const l=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function b(f){for(let e=0;el.has(f._)&&t!==e&&f._===d._&&f.offset-d.length===d.offset)),-1!==t){const e=f[t];d.length+=e.length,f.splice(t,1)}}while(-1!==t)}}function A(f){f.sort(((f,e)=>f.offset-e.offset||e.length-f.length))}function E(f,e={}){if(!f)return"";const t=[],s=e.entities||d(f),c=e.passEntities||{},r=e.contextSite||"Telegram",u="Telegram"!==r,l=(f,e,d)=>{const s=f.offset,a=d?f.offset+f.length:void 0;let c,i;for(let f=t.length-1;f>=0;--f){const e=t[f].offset;if(void 0===c&&s>=e&&(c=f+1),void 0!==a&&a<=e&&(i=f),s>e&&(void 0===a||a=h){if("messageEntityCaret"!==t._)continue}else t.offset+t.length>h&&(t=(0,n.Z)(t),t.length=t.offset+t.length-h);switch(t._){case"messageEntityBold":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityStrike":e.wrappingDraft?l(t,``,""):e.noTextFormat||l(t,"","");break;case"messageEntityUnderline":e.wrappingDraft?l(t,``,""):e.noTextFormat||l(t,"","");break;case"messageEntityCode":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,"","");break;case"messageEntityPre":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,`
`,"
");break;case"messageEntityHighlight":l(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&c[t._]){let d,s,a=f.substr(t.offset,t.length).substr(1);-1!==(s=a.indexOf("@"))?(d=a.substr(s+1),a=a.substr(0,s)):d=e.fromBot,l(t,``,"")}break;case"messageEntityEmoji":i.Z?e.wrappingDraft||l(t,'',""):l(t,``,'');break;case"messageEntityCaret":{const f='';b.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||c[t._]){const a=f.substr(t.offset,t.length);let c,i=t.url||a,n=!1;const r=T(i);if(i=r.url,c=r.onclick,"messageEntityTextUrl"===t._){const f=s[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,i!==a&&(n=!0)}const u=!!c;c||!n||u||(c="showMaskedAlert"),e.wrappingDraft&&(c=void 0),l(t,``,"")}break;case"messageEntityEmail":e.noLinks||l(t,``,"");break;case"messageEntityHashtag":{const d=!e.noLinks&&y[r];if(d){const e=f.substr(t.offset,t.length).substr(1);l(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!c[t._]||l(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:s}=T("t.me/"+e);l(t,``,"")}break;case"messageEntitySpoiler":if(e.noTextFormat){const e=f.slice(0,t.offset),d=f.slice(t.offset,t.offset+t.length),s=f.slice(t.offset+t.length);f=e+S(d)+s}else e.wrappingDraft?l(t,'',""):l(t,'',"")}}let g=t.length,p=b.length;for(let f=0;f=e.offset););t.splice(d,0,e)}g+=p;const m=[];let k=0;for(let d=0;dk){const d=f.slice(k,a);m.push(e.noEncoding?d:o(d)),k=a}m.push(s)}if(kd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function S(f){const e="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",d=e.length,t=[];for(let s=0;s"messageEntityEmoji"===f._)),wrappingDraft:e}):""}function T(f,e){let d,t,s,a;if(D(f)||(f="https://"+f),d=f.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=d[1];if(/^\W/.test(e))return a="joinchat",{url:f,onclick:a};const t=e.split("/");switch(t[0]){case"joinchat":case"addstickers":case"voicechat":a=t[0];break;default:if(t[1]&&t[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===t.length){a="im";break}}}else(t=f.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?a="im":(s=f.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(a="tg_"+s[1]);return window[a]||(a=void 0),{url:f,onclick:a}}function D(f){return f?f.match(g):null}function _(f){return{_:"messageEntityEmoji",offset:0,length:f.length,unicode:(0,s.w1)(f).join("-").replace(/-?fe0f/g,"")}}f.combineSameEntities=b,f.sortEntities=A,f.wrapRichText=E,f.fixEmoji=function(f,e){return f.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,((f,d,t)=>{if(e){const t=f.length;d+=t,e.forEach((f=>{const e=f.offset+f.length;e===d?f.length+=t:e>d&&(f.offset+=t)}))}return f+"️"}))},f.wrapDraftText=function(f,e={}){return f?E(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=C,f.spoiler=S,f.wrapPlainText=function(f,e=[]){return(null==e?void 0:e.length)&&(e=e.filter((f=>"messageEntitySpoiler"===f._))),E(f,{entities:e,noEncoding:!0,noTextFormat:!0,noLinebreaks:!0,noLinks:!0})},f.wrapEmojiText=P,f.wrapUrl=T,f.matchUrlProtocol=D,f.matchUrl=function(f){return f?f.match(h):null},f.matchEmail=function(f){return f?f.match(m):null},f.getAbbreviation=function(f,e=!1){if(!f)return"";const d=f.trim().split(" ");if(!d[0])return"";const t=[...d[0]][0];return e||1===d.length?P(t):P(t+[...d[d.length-1]][0])},f.isUsernameValid=function(f){return(f.length>=5&&f.length<=32||!f.length)&&/^[a-zA-Z0-9_]*$/.test(f)},f.getEmojiEntityFromEmoji=_,f.wrapSingleEmoji=function(f){return E(f,{entities:[_(f)]})}}(A||(A={})),c.GO.RichTextProcessor=A;const E=A},3689:(f,e,d)=>{function t(){return new Worker(d.p+"webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js")}d.d(e,{Z:()=>n});var s=d(410),a=d(3725),c=d(9518);const i=new class{constructor(){this.convertPromises={}}init(){this.worker=new t,this.worker.addEventListener("message",(f=>{const e=f.data.payload;if(0===e.fileName.indexOf("main-")){const f=this.convertPromises[e.fileName];f&&(e.bytes?f.resolve(e.bytes):f.reject(),delete this.convertPromises[e.fileName])}else c.Z.postMessage(f.data)}))}postMessage(f){this.init&&(this.init(),this.init=null),this.worker.postMessage(f)}convert(f,e){if(f="main-"+f,this.convertPromises.hasOwnProperty(f))return this.convertPromises[f];const d=(0,a.b)();return this.postMessage({type:"convertWebp",payload:{fileName:f,bytes:e}}),this.convertPromises[f]=d}};s.GO.webpWorkerController=i;const n=i},671:(f,e,d)=>{function t(f){return i(c(f)).join("-")}d.d(e,{Ml:()=>o,N0:()=>t,tB:()=>n,w1:()=>i,zu:()=>r});const s=/\uFE0F/g,a=String.fromCharCode(8205),c=f=>f.indexOf(a)<0?f.replace(s,""):f;function i(f){const e=[];let d=0,t=0,s=0;for(;s55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function n(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function o(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function r(f){return f.split("-").reduce(((f,e)=>f+String.fromCodePoint(parseInt(e,16))),"")}}}]); -//# sourceMappingURL=518.ede329767abdce9961b0.chunk.js.map \ No newline at end of file diff --git a/public/518.ede329767abdce9961b0.chunk.js.map b/public/518.ede329767abdce9961b0.chunk.js.map deleted file mode 100644 index 0326073e..00000000 --- a/public/518.ede329767abdce9961b0.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"518.ede329767abdce9961b0.chunk.js","mappings":"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AM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GActs7DC,YAJgD,CAAC,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EA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","sources":["webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/config.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/crypto/crypto_methods.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/lib/richtextprocessor.ts","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/./src/vendor/emoji/index.ts"],"sourcesContent":["const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\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 { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\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 I18n, { i18n } from \"../lib/langPack\";\r\nimport tsNow from './tsNow';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport {tsNow};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\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 calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize\r\n};\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every(key => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","import { RestrictionReason } from \"../layer\";\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find(reason => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach(reason => {\n ignore.add(reason);\n });\n}\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\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 * 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 * 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 { MOUNT_CLASS_TO } from '../config/debug';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\n\r\n// !WARNING, ТУТ СЛОЖНО! по-хорошему, надо бы это переделать без fe0f, но они здесь необходимы чтобы отрендерить панель, и ниже дописаны 3 элемента которые не воспроизводятся без fe0f\r\nexport const Emoji: {[emoji: string]: number} = {\"2049\":62748,\"2122\":62776,\"2139\":62801,\"2194\":62678,\"2195\":62677,\"2196\":62676,\"2197\":62670,\"2198\":62672,\"2199\":62674,\"2328\":61155,\"2600\":4954,\"2601\":4962,\"2602\":4977,\"2603\":4982,\"2604\":4984,\"2611\":62764,\"2614\":4978,\"2615\":3750,\"2618\":2639,\"2620\":196,\"2622\":62667,\"2623\":62668,\"2626\":62697,\"2638\":62694,\"2639\":168,\"2648\":62702,\"2649\":62703,\"2650\":62710,\"2651\":62711,\"2652\":62712,\"2653\":62713,\"2660\":51057,\"2663\":51060,\"2665\":51058,\"2666\":51059,\"2668\":4832,\"2692\":61258,\"2693\":4887,\"2694\":61261,\"2696\":61272,\"2697\":61280,\"2699\":61270,\"2702\":61245,\"2705\":62763,\"2708\":4895,\"2709\":61206,\"2712\":61220,\"2714\":62765,\"2716\":62742,\"2721\":62693,\"2728\":5993,\"2733\":62771,\"2734\":62772,\"2744\":4981,\"2747\":62773,\"2753\":62749,\"2754\":62750,\"2755\":62751,\"2757\":62752,\"2763\":1127,\"2764\":1129,\"2795\":62743,\"2796\":62744,\"2797\":62745,\"2934\":62681,\"2935\":62682,\"3030\":62753,\"3297\":62825,\"3299\":62826,\"0023-20e3\":62777,\"002a-20e3\":62778,\"0030-20e3\":62779,\"0031-20e3\":62780,\"0032-20e3\":62781,\"0033-20e3\":62782,\"0034-20e3\":62783,\"0035-20e3\":62784,\"0036-20e3\":62785,\"0037-20e3\":62786,\"0038-20e3\":62787,\"0039-20e3\":62788,\"00a9\":62774,\"00ae\":62775,\"1f004\":51063,\"1f0cf\":51062,\"1f170\":62795,\"1f171\":62797,\"1f17e\":62806,\"1f17f\":62808,\"1f18e\":62796,\"1f191\":62798,\"1f192\":62799,\"1f193\":62800,\"1f194\":62802,\"1f195\":62804,\"1f196\":62805,\"1f197\":62807,\"1f198\":62809,\"1f199\":62810,\"1f19a\":62811,\"1f1e6-1f1e8\":71550,\"1f1e6-1f1e9\":71551,\"1f1e6-1f1ea\":71552,\"1f1e6-1f1eb\":71553,\"1f1e6-1f1ec\":71554,\"1f1e6-1f1ee\":71555,\"1f1e6-1f1f1\":71556,\"1f1e6-1f1f2\":71557,\"1f1e6-1f1f4\":71558,\"1f1e6-1f1f6\":71559,\"1f1e6-1f1f7\":71560,\"1f1e6-1f1f8\":71561,\"1f1e6-1f1f9\":71562,\"1f1e6-1f1fa\":71563,\"1f1e6-1f1fc\":71564,\"1f1e6-1f1fd\":71565,\"1f1e6-1f1ff\":71566,\"1f1e7-1f1e6\":71567,\"1f1e7-1f1e7\":71568,\"1f1e7-1f1e9\":71569,\"1f1e7-1f1ea\":71570,\"1f1e7-1f1eb\":71571,\"1f1e7-1f1ec\":71572,\"1f1e7-1f1ed\":71573,\"1f1e7-1f1ee\":71574,\"1f1e7-1f1ef\":71575,\"1f1e7-1f1f1\":71576,\"1f1e7-1f1f2\":71577,\"1f1e7-1f1f3\":71578,\"1f1e7-1f1f4\":71579,\"1f1e7-1f1f6\":71580,\"1f1e7-1f1f7\":71581,\"1f1e7-1f1f8\":71582,\"1f1e7-1f1f9\":71583,\"1f1e7-1f1fb\":71584,\"1f1e7-1f1fc\":71585,\"1f1e7-1f1fe\":71586,\"1f1e7-1f1ff\":71587,\"1f1e8-1f1e6\":71588,\"1f1e8-1f1e8\":71589,\"1f1e8-1f1e9\":71590,\"1f1e8-1f1eb\":71591,\"1f1e8-1f1ec\":71592,\"1f1e8-1f1ed\":71593,\"1f1e8-1f1ee\":71594,\"1f1e8-1f1f0\":71595,\"1f1e8-1f1f1\":71596,\"1f1e8-1f1f2\":71597,\"1f1e8-1f1f3\":71598,\"1f1e8-1f1f4\":71599,\"1f1e8-1f1f5\":71600,\"1f1e8-1f1f7\":71601,\"1f1e8-1f1fa\":71602,\"1f1e8-1f1fb\":71603,\"1f1e8-1f1fc\":71604,\"1f1e8-1f1fd\":71605,\"1f1e8-1f1fe\":71606,\"1f1e8-1f1ff\":71607,\"1f1e9-1f1ea\":71608,\"1f1e9-1f1ec\":71609,\"1f1e9-1f1ef\":71610,\"1f1e9-1f1f0\":71611,\"1f1e9-1f1f2\":71612,\"1f1e9-1f1f4\":71613,\"1f1e9-1f1ff\":71614,\"1f1ea-1f1e6\":71615,\"1f1ea-1f1e8\":71616,\"1f1ea-1f1ea\":71617,\"1f1ea-1f1ec\":71618,\"1f1ea-1f1ed\":71619,\"1f1ea-1f1f7\":71620,\"1f1ea-1f1f8\":71621,\"1f1ea-1f1f9\":71622,\"1f1ea-1f1fa\":71623,\"1f1eb-1f1ee\":71624,\"1f1eb-1f1ef\":71625,\"1f1eb-1f1f0\":71626,\"1f1eb-1f1f2\":71627,\"1f1eb-1f1f4\":71628,\"1f1eb-1f1f7\":71629,\"1f1ec-1f1e6\":71630,\"1f1ec-1f1e7\":71631,\"1f1ec-1f1e9\":71632,\"1f1ec-1f1ea\":71633,\"1f1ec-1f1eb\":71634,\"1f1ec-1f1ec\":71635,\"1f1ec-1f1ed\":71636,\"1f1ec-1f1ee\":71637,\"1f1ec-1f1f1\":71638,\"1f1ec-1f1f2\":71639,\"1f1ec-1f1f3\":71640,\"1f1ec-1f1f5\":71641,\"1f1ec-1f1f6\":71642,\"1f1ec-1f1f7\":71643,\"1f1ec-1f1f8\":71644,\"1f1ec-1f1f9\":71645,\"1f1ec-1f1fa\":71646,\"1f1ec-1f1fc\":71647,\"1f1ec-1f1fe\":71648,\"1f1ed-1f1f0\":71649,\"1f1ed-1f1f2\":71650,\"1f1ed-1f1f3\":71651,\"1f1ed-1f1f7\":71652,\"1f1ed-1f1f9\":71653,\"1f1ed-1f1fa\":71654,\"1f1ee-1f1e8\":71655,\"1f1ee-1f1e9\":71656,\"1f1ee-1f1ea\":71657,\"1f1ee-1f1f1\":71658,\"1f1ee-1f1f2\":71659,\"1f1ee-1f1f3\":71660,\"1f1ee-1f1f4\":71661,\"1f1ee-1f1f6\":71662,\"1f1ee-1f1f7\":71663,\"1f1ee-1f1f8\":71664,\"1f1ee-1f1f9\":71665,\"1f1ef-1f1ea\":71666,\"1f1ef-1f1f2\":71667,\"1f1ef-1f1f4\":71668,\"1f1ef-1f1f5\":71669,\"1f1f0-1f1ea\":71670,\"1f1f0-1f1ec\":71671,\"1f1f0-1f1ed\":71672,\"1f1f0-1f1ee\":71673,\"1f1f0-1f1f2\":71674,\"1f1f0-1f1f3\":71675,\"1f1f0-1f1f5\":71676,\"1f1f0-1f1f7\":71677,\"1f1f0-1f1fc\":71678,\"1f1f0-1f1fe\":71679,\"1f1f0-1f1ff\":71680,\"1f1f1-1f1e6\":71681,\"1f1f1-1f1e7\":71682,\"1f1f1-1f1e8\":71683,\"1f1f1-1f1ee\":71684,\"1f1f1-1f1f0\":71685,\"1f1f1-1f1f7\":71686,\"1f1f1-1f1f8\":71687,\"1f1f1-1f1f9\":71688,\"1f1f1-1f1fa\":71689,\"1f1f1-1f1fb\":71690,\"1f1f1-1f1fe\":71691,\"1f1f2-1f1e6\":71692,\"1f1f2-1f1e8\":71693,\"1f1f2-1f1e9\":71694,\"1f1f2-1f1ea\":71695,\"1f1f2-1f1eb\":71696,\"1f1f2-1f1ec\":71697,\"1f1f2-1f1ed\":71698,\"1f1f2-1f1f0\":71699,\"1f1f2-1f1f1\":71700,\"1f1f2-1f1f2\":71701,\"1f1f2-1f1f3\":71702,\"1f1f2-1f1f4\":71703,\"1f1f2-1f1f5\":71704,\"1f1f2-1f1f6\":71705,\"1f1f2-1f1f7\":71706,\"1f1f2-1f1f8\":71707,\"1f1f2-1f1f9\":71708,\"1f1f2-1f1fa\":71709,\"1f1f2-1f1fb\":71710,\"1f1f2-1f1fc\":71711,\"1f1f2-1f1fd\":71712,\"1f1f2-1f1fe\":71713,\"1f1f2-1f1ff\":71714,\"1f1f3-1f1e6\":71715,\"1f1f3-1f1e8\":71716,\"1f1f3-1f1ea\":71717,\"1f1f3-1f1eb\":71718,\"1f1f3-1f1ec\":71719,\"1f1f3-1f1ee\":71720,\"1f1f3-1f1f1\":71721,\"1f1f3-1f1f4\":71722,\"1f1f3-1f1f5\":71723,\"1f1f3-1f1f7\":71724,\"1f1f3-1f1fa\":71725,\"1f1f3-1f1ff\":71726,\"1f1f4-1f1f2\":71727,\"1f1f5-1f1e6\":71728,\"1f1f5-1f1ea\":71729,\"1f1f5-1f1eb\":71730,\"1f1f5-1f1ec\":71731,\"1f1f5-1f1ed\":71732,\"1f1f5-1f1f0\":71733,\"1f1f5-1f1f1\":71734,\"1f1f5-1f1f2\":71735,\"1f1f5-1f1f3\":71736,\"1f1f5-1f1f7\":71737,\"1f1f5-1f1f8\":71738,\"1f1f5-1f1f9\":71739,\"1f1f5-1f1fc\":71740,\"1f1f5-1f1fe\":71741,\"1f1f6-1f1e6\":71742,\"1f1f7-1f1ea\":71743,\"1f1f7-1f1f4\":71744,\"1f1f7-1f1f8\":71745,\"1f1f7-1f1fa\":71746,\"1f1f7-1f1fc\":71747,\"1f1f8-1f1e6\":71748,\"1f1f8-1f1e7\":71749,\"1f1f8-1f1e8\":71750,\"1f1f8-1f1e9\":71751,\"1f1f8-1f1ea\":71752,\"1f1f8-1f1ec\":71753,\"1f1f8-1f1ed\":71754,\"1f1f8-1f1ee\":71755,\"1f1f8-1f1ef\":71756,\"1f1f8-1f1f0\":71757,\"1f1f8-1f1f1\":71758,\"1f1f8-1f1f2\":71759,\"1f1f8-1f1f3\":71760,\"1f1f8-1f1f4\":71761,\"1f1f8-1f1f7\":71762,\"1f1f8-1f1f8\":71763,\"1f1f8-1f1f9\":71764,\"1f1f8-1f1fb\":71765,\"1f1f8-1f1fd\":71766,\"1f1f8-1f1fe\":71767,\"1f1f8-1f1ff\":71768,\"1f1f9-1f1e6\":71769,\"1f1f9-1f1e8\":71770,\"1f1f9-1f1e9\":71771,\"1f1f9-1f1eb\":71772,\"1f1f9-1f1ec\":71773,\"1f1f9-1f1ed\":71774,\"1f1f9-1f1ef\":71775,\"1f1f9-1f1f0\":71776,\"1f1f9-1f1f1\":71777,\"1f1f9-1f1f2\":71778,\"1f1f9-1f1f3\":71779,\"1f1f9-1f1f4\":71780,\"1f1f9-1f1f7\":71781,\"1f1f9-1f1f9\":71782,\"1f1f9-1f1fb\":71783,\"1f1f9-1f1fc\":71784,\"1f1f9-1f1ff\":71785,\"1f1fa-1f1e6\":71786,\"1f1fa-1f1ec\":71787,\"1f1fa-1f1f2\":71788,\"1f1fa-1f1f3\":71789,\"1f1fa-1f1f8\":71790,\"1f1fa-1f1fe\":71791,\"1f1fa-1f1ff\":71792,\"1f1fb-1f1e6\":71793,\"1f1fb-1f1e8\":71794,\"1f1fb-1f1ea\":71795,\"1f1fb-1f1ec\":71796,\"1f1fb-1f1ee\":71797,\"1f1fb-1f1f3\":71798,\"1f1fb-1f1fa\":71799,\"1f1fc-1f1eb\":71800,\"1f1fc-1f1f8\":71801,\"1f1fd-1f1f0\":71802,\"1f1fe-1f1ea\":71803,\"1f1fe-1f1f9\":71804,\"1f1ff-1f1e6\":71805,\"1f1ff-1f1f2\":71806,\"1f1ff-1f1fc\":71807,\"1f201\":62812,\"1f202\":62813,\"1f21a\":62819,\"1f22f\":62816,\"1f232\":62820,\"1f233\":62824,\"1f234\":62823,\"1f235\":62828,\"1f236\":62815,\"1f237\":62814,\"1f238\":62822,\"1f239\":62818,\"1f23a\":62827,\"1f250\":62817,\"1f251\":62821,\"1f300\":4974,\"1f301\":4824,\"1f302\":4976,\"1f303\":4825,\"1f304\":4827,\"1f305\":4828,\"1f306\":4829,\"1f307\":4830,\"1f308\":4975,\"1f309\":4831,\"1f30a\":4987,\"1f30b\":4782,\"1f30c\":4961,\"1f30d\":4773,\"1f30e\":4774,\"1f30f\":4775,\"1f310\":4776,\"1f311\":4941,\"1f312\":4942,\"1f313\":4943,\"1f314\":4944,\"1f315\":4945,\"1f316\":4946,\"1f317\":4947,\"1f318\":4948,\"1f319\":4949,\"1f31a\":4950,\"1f31b\":4951,\"1f31c\":4952,\"1f31d\":4955,\"1f31e\":4956,\"1f31f\":4959,\"1f320\":4960,\"1f321\":4953,\"1f324\":4965,\"1f325\":4966,\"1f326\":4967,\"1f327\":4968,\"1f328\":4969,\"1f329\":4970,\"1f32a\":4971,\"1f32b\":4972,\"1f32c\":4973,\"1f32d\":3694,\"1f32e\":3696,\"1f32f\":3697,\"1f330\":3677,\"1f331\":2631,\"1f332\":2633,\"1f333\":2634,\"1f334\":2635,\"1f335\":2636,\"1f336\":3668,\"1f337\":2630,\"1f338\":2622,\"1f339\":2625,\"1f33a\":2627,\"1f33b\":2628,\"1f33c\":2629,\"1f33d\":3667,\"1f33e\":2637,\"1f33f\":2638,\"1f340\":2640,\"1f341\":2641,\"1f342\":2642,\"1f343\":2643,\"1f344\":3675,\"1f345\":3660,\"1f346\":3664,\"1f347\":3644,\"1f348\":3645,\"1f349\":3646,\"1f34a\":3647,\"1f34b\":3648,\"1f34c\":3649,\"1f34d\":3650,\"1f34e\":3652,\"1f34f\":3653,\"1f350\":3654,\"1f351\":3655,\"1f352\":3656,\"1f353\":3657,\"1f354\":3691,\"1f355\":3693,\"1f356\":3687,\"1f357\":3688,\"1f358\":3713,\"1f359\":3714,\"1f35a\":3715,\"1f35b\":3716,\"1f35c\":3717,\"1f35d\":3718,\"1f35e\":3678,\"1f35f\":3692,\"1f360\":3719,\"1f361\":3725,\"1f362\":3720,\"1f363\":3721,\"1f364\":3722,\"1f365\":3723,\"1f366\":3734,\"1f367\":3735,\"1f368\":3736,\"1f369\":3737,\"1f36a\":3738,\"1f36b\":3743,\"1f36c\":3744,\"1f36d\":3745,\"1f36e\":3746,\"1f36f\":3747,\"1f370\":3740,\"1f371\":3712,\"1f372\":3704,\"1f373\":3702,\"1f374\":3769,\"1f375\":3752,\"1f376\":3753,\"1f377\":3755,\"1f378\":3756,\"1f379\":3757,\"1f37a\":3758,\"1f37b\":3759,\"1f37c\":3748,\"1f37d\":3768,\"1f37e\":3754,\"1f37f\":3708,\"1f380\":51004,\"1f381\":51005,\"1f382\":3739,\"1f383\":5988,\"1f384\":5989,\"1f385\":1490,\"1f386\":5990,\"1f387\":5991,\"1f388\":5994,\"1f389\":5995,\"1f38a\":5996,\"1f38b\":5997,\"1f38c\":71544,\"1f38d\":5998,\"1f38e\":5999,\"1f38f\":51000,\"1f390\":51001,\"1f391\":51002,\"1f392\":61096,\"1f393\":61109,\"1f396\":51009,\"1f397\":51006,\"1f399\":61129,\"1f39a\":61130,\"1f39b\":61131,\"1f39e\":61164,\"1f39f\":51007,\"1f3a0\":4833,\"1f3a1\":4834,\"1f3a2\":4835,\"1f3a3\":51036,\"1f3a4\":61132,\"1f3a5\":61163,\"1f3a6\":62733,\"1f3a7\":61133,\"1f3a8\":51067,\"1f3a9\":61108,\"1f3aa\":4837,\"1f3ab\":51008,\"1f3ac\":61166,\"1f3ad\":51065,\"1f3ae\":51049,\"1f3af\":51042,\"1f3b0\":51051,\"1f3b1\":51045,\"1f3b2\":51052,\"1f3b3\":51024,\"1f3b4\":51064,\"1f3b5\":61127,\"1f3b6\":61128,\"1f3b7\":61135,\"1f3b8\":61137,\"1f3b9\":61138,\"1f3ba\":61139,\"1f3bb\":61140,\"1f3bc\":61126,\"1f3bd\":51038,\"1f3be\":51022,\"1f3bf\":51039,\"1f3c0\":51018,\"1f3c1\":71542,\"1f3c2\":1562,\"1f3c3-200d-2640\":1546,\"1f3c3-200d-2642\":1545,\"1f3c3\":1544,\"1f3c4-200d-2640\":1568,\"1f3c4-200d-2642\":1567,\"1f3c4\":1566,\"1f3c5\":51011,\"1f3c6\":51010,\"1f3c7\":1560,\"1f3c8\":51020,\"1f3c9\":51021,\"1f3ca-200d-2640\":1574,\"1f3ca-200d-2642\":1573,\"1f3ca\":1572,\"1f3cb-200d-2640\":1580,\"1f3cb-200d-2642\":1579,\"1f3cb\":1578,\"1f3cc-200d-2640\":1565,\"1f3cc-200d-2642\":1564,\"1f3cc\":1563,\"1f3cd\":4868,\"1f3ce\":4867,\"1f3cf\":51025,\"1f3d0\":51019,\"1f3d1\":51026,\"1f3d2\":51027,\"1f3d3\":51029,\"1f3d4\":4780,\"1f3d5\":4784,\"1f3d6\":4785,\"1f3d7\":4791,\"1f3d8\":4796,\"1f3d9\":4826,\"1f3da\":4797,\"1f3db\":4790,\"1f3dc\":4786,\"1f3dd\":4787,\"1f3de\":4788,\"1f3df\":4789,\"1f3e0\":4798,\"1f3e1\":4799,\"1f3e2\":4800,\"1f3e3\":4801,\"1f3e4\":4802,\"1f3e5\":4803,\"1f3e6\":4804,\"1f3e7\":62643,\"1f3e8\":4805,\"1f3e9\":4806,\"1f3ea\":4807,\"1f3eb\":4808,\"1f3ec\":4809,\"1f3ed\":4810,\"1f3ee\":61177,\"1f3ef\":4811,\"1f3f0\":4812,\"1f3f3-200d-1f308\":71547,\"1f3f3-200d-26a7\":71548,\"1f3f3\":71546,\"1f3f4-200d-2620\":71549,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71808,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71809,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71810,\"1f3f4\":71545,\"1f3f5\":2624,\"1f3f7\":61195,\"1f3f8\":51030,\"1f3f9\":61264,\"1f3fa\":3772,\"1f3fb\":9499,\"1f3fc\":9500,\"1f3fd\":9501,\"1f3fe\":9502,\"1f3ff\":9503,\"1f400\":2550,\"1f401\":2549,\"1f402\":2530,\"1f403\":2531,\"1f404\":2532,\"1f405\":2521,\"1f406\":2522,\"1f407\":2553,\"1f408-200d-2b1b\":2518,\"1f408\":2517,\"1f409\":2592,\"1f40a\":2587,\"1f40b\":2596,\"1f40c\":2605,\"1f40d\":2590,\"1f40e\":2524,\"1f40f\":2537,\"1f410\":2539,\"1f411\":2538,\"1f412\":2505,\"1f413\":2570,\"1f414\":2569,\"1f415-200d-1f9ba\":2511,\"1f415\":2509,\"1f416\":2534,\"1f417\":2535,\"1f418\":2544,\"1f419\":2603,\"1f41a\":2604,\"1f41b\":2607,\"1f41c\":2608,\"1f41d\":2609,\"1f41e\":2611,\"1f41f\":2599,\"1f420\":2600,\"1f421\":2601,\"1f422\":2588,\"1f423\":2571,\"1f424\":2572,\"1f425\":2573,\"1f426\":2574,\"1f427\":2575,\"1f428\":2560,\"1f429\":2512,\"1f42a\":2540,\"1f42b\":2541,\"1f42c\":2597,\"1f42d\":2548,\"1f42e\":2529,\"1f42f\":2520,\"1f430\":2552,\"1f431\":2516,\"1f432\":2591,\"1f433\":2595,\"1f434\":2523,\"1f435\":2504,\"1f436\":2508,\"1f437\":2533,\"1f438\":2586,\"1f439\":2551,\"1f43a\":2513,\"1f43b-200d-2744\":2559,\"1f43b\":2558,\"1f43c\":2561,\"1f43d\":2536,\"1f43e\":2567,\"1f43f\":2554,\"1f440\":1350,\"1f441-200d-1f5e8\":1147,\"1f441\":1351,\"1f442\":1342,\"1f443\":1344,\"1f444\":1353,\"1f445\":1352,\"1f446\":1318,\"1f447\":1320,\"1f448\":1316,\"1f449\":1317,\"1f44a\":1325,\"1f44b\":1303,\"1f44c\":1308,\"1f44d\":1322,\"1f44e\":1323,\"1f44f\":1328,\"1f450\":1330,\"1f451\":61106,\"1f452\":61107,\"1f453\":61072,\"1f454\":61077,\"1f455\":61078,\"1f456\":61079,\"1f457\":61084,\"1f458\":61085,\"1f459\":61090,\"1f45a\":61091,\"1f45b\":61092,\"1f45c\":61093,\"1f45d\":61094,\"1f45e\":61098,\"1f45f\":61099,\"1f460\":61102,\"1f461\":61103,\"1f462\":61105,\"1f463\":1649,\"1f464\":1646,\"1f465\":1647,\"1f466\":1356,\"1f467\":1357,\"1f468-200d-1f33e\":1423,\"1f468-200d-1f373\":1426,\"1f468-200d-1f37c\":1487,\"1f468-200d-1f393\":1414,\"1f468-200d-1f3a4\":1444,\"1f468-200d-1f3a8\":1447,\"1f468-200d-1f3eb\":1417,\"1f468-200d-1f3ed\":1432,\"1f468-200d-1f466-200d-1f466\":1636,\"1f468-200d-1f466\":1635,\"1f468-200d-1f467-200d-1f466\":1638,\"1f468-200d-1f467-200d-1f467\":1639,\"1f468-200d-1f467\":1637,\"1f468-200d-1f468-200d-1f466\":1625,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1628,\"1f468-200d-1f468-200d-1f467\":1626,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1627,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1629,\"1f468-200d-1f469-200d-1f466\":1620,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1623,\"1f468-200d-1f469-200d-1f467\":1621,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1622,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1624,\"1f468-200d-1f4bb\":1441,\"1f468-200d-1f4bc\":1435,\"1f468-200d-1f527\":1429,\"1f468-200d-1f52c\":1438,\"1f468-200d-1f680\":1453,\"1f468-200d-1f692\":1456,\"1f468-200d-1f9af\":1536,\"1f468-200d-1f9b0\":1362,\"1f468-200d-1f9b1\":1363,\"1f468-200d-1f9b2\":1365,\"1f468-200d-1f9b3\":1364,\"1f468-200d-1f9bc\":1539,\"1f468-200d-1f9bd\":1542,\"1f468-200d-2695\":1411,\"1f468-200d-2696\":1420,\"1f468-200d-2708\":1450,\"1f468-200d-2764-200d-1f468\":1617,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1613,\"1f468\":1360,\"1f469-200d-1f33e\":1424,\"1f469-200d-1f373\":1427,\"1f469-200d-1f37c\":1486,\"1f469-200d-1f393\":1415,\"1f469-200d-1f3a4\":1445,\"1f469-200d-1f3a8\":1448,\"1f469-200d-1f3eb\":1418,\"1f469-200d-1f3ed\":1433,\"1f469-200d-1f466-200d-1f466\":1641,\"1f469-200d-1f466\":1640,\"1f469-200d-1f467-200d-1f466\":1643,\"1f469-200d-1f467-200d-1f467\":1644,\"1f469-200d-1f467\":1642,\"1f469-200d-1f469-200d-1f466\":1630,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1633,\"1f469-200d-1f469-200d-1f467\":1631,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1632,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1634,\"1f469-200d-1f4bb\":1442,\"1f469-200d-1f4bc\":1436,\"1f469-200d-1f527\":1430,\"1f469-200d-1f52c\":1439,\"1f469-200d-1f680\":1454,\"1f469-200d-1f692\":1457,\"1f469-200d-1f9af\":1537,\"1f469-200d-1f9b0\":1367,\"1f469-200d-1f9b1\":1369,\"1f469-200d-1f9b2\":1373,\"1f469-200d-1f9b3\":1371,\"1f469-200d-1f9bc\":1540,\"1f469-200d-1f9bd\":1543,\"1f469-200d-2695\":1412,\"1f469-200d-2696\":1421,\"1f469-200d-2708\":1451,\"1f469-200d-2764-200d-1f468\":1616,\"1f469-200d-2764-200d-1f469\":1618,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1612,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1614,\"1f469\":1366,\"1f46a\":1619,\"1f46b\":1609,\"1f46c\":1610,\"1f46d\":1608,\"1f46e-200d-2640\":1460,\"1f46e-200d-2642\":1459,\"1f46e\":1458,\"1f46f-200d-2640\":1552,\"1f46f-200d-2642\":1551,\"1f46f\":1550,\"1f470-200d-2640\":1483,\"1f470-200d-2642\":1482,\"1f470\":1481,\"1f471-200d-2640\":1375,\"1f471-200d-2642\":1376,\"1f471\":1359,\"1f472\":1476,\"1f473-200d-2640\":1475,\"1f473-200d-2642\":1474,\"1f473\":1473,\"1f474\":1378,\"1f475\":1379,\"1f476\":1354,\"1f477-200d-2640\":1470,\"1f477-200d-2642\":1469,\"1f477\":1468,\"1f478\":1472,\"1f479\":199,\"1f47a\":1100,\"1f47b\":1101,\"1f47c\":1489,\"1f47d\":1102,\"1f47e\":1103,\"1f47f\":194,\"1f480\":195,\"1f481-200d-2640\":1394,\"1f481-200d-2642\":1393,\"1f481\":1392,\"1f482-200d-2640\":1466,\"1f482-200d-2642\":1465,\"1f482\":1464,\"1f483\":1547,\"1f484\":61114,\"1f485\":1335,\"1f486-200d-2640\":1522,\"1f486-200d-2642\":1521,\"1f486\":1520,\"1f487-200d-2640\":1525,\"1f487-200d-2642\":1524,\"1f487\":1523,\"1f488\":4836,\"1f489\":61287,\"1f48a\":61289,\"1f48b\":1117,\"1f48c\":1118,\"1f48d\":61115,\"1f48e\":61116,\"1f48f\":1611,\"1f490\":2621,\"1f491\":1615,\"1f492\":4813,\"1f493\":1123,\"1f494\":1128,\"1f495\":1125,\"1f496\":1121,\"1f497\":1122,\"1f498\":1119,\"1f499\":1133,\"1f49a\":1132,\"1f49b\":1131,\"1f49c\":1134,\"1f49d\":1120,\"1f49e\":1124,\"1f49f\":1126,\"1f4a0\":62859,\"1f4a1\":61175,\"1f4a2\":1139,\"1f4a3\":1145,\"1f4a4\":1151,\"1f4a5\":1140,\"1f4a6\":1142,\"1f4a7\":4986,\"1f4a8\":1143,\"1f4a9\":197,\"1f4aa\":1337,\"1f4ab\":1141,\"1f4ac\":1146,\"1f4ad\":1150,\"1f4ae\":2623,\"1f4af\":1138,\"1f4b0\":61196,\"1f4b1\":62754,\"1f4b2\":62755,\"1f4b3\":61203,\"1f4b4\":61198,\"1f4b5\":61199,\"1f4b6\":61200,\"1f4b7\":61201,\"1f4b8\":61202,\"1f4b9\":61205,\"1f4ba\":4900,\"1f4bb\":61152,\"1f4bc\":61226,\"1f4bd\":61158,\"1f4be\":61159,\"1f4bf\":61160,\"1f4c0\":61161,\"1f4c1\":61227,\"1f4c2\":61228,\"1f4c3\":61188,\"1f4c4\":61190,\"1f4c5\":61230,\"1f4c6\":61231,\"1f4c7\":61234,\"1f4c8\":61235,\"1f4c9\":61236,\"1f4ca\":61237,\"1f4cb\":61238,\"1f4cc\":61239,\"1f4cd\":61240,\"1f4ce\":61241,\"1f4cf\":61243,\"1f4d0\":61244,\"1f4d1\":61193,\"1f4d2\":61187,\"1f4d3\":61186,\"1f4d4\":61179,\"1f4d5\":61180,\"1f4d6\":61181,\"1f4d7\":61182,\"1f4d8\":61183,\"1f4d9\":61184,\"1f4da\":61185,\"1f4db\":62760,\"1f4dc\":61189,\"1f4dd\":61225,\"1f4de\":61147,\"1f4df\":61148,\"1f4e0\":61149,\"1f4e1\":61286,\"1f4e2\":61121,\"1f4e3\":61122,\"1f4e4\":61210,\"1f4e5\":61211,\"1f4e6\":61212,\"1f4e7\":61207,\"1f4e8\":61208,\"1f4e9\":61209,\"1f4ea\":61214,\"1f4eb\":61213,\"1f4ec\":61215,\"1f4ed\":61216,\"1f4ee\":61217,\"1f4ef\":61123,\"1f4f0\":61191,\"1f4f1\":61144,\"1f4f2\":61145,\"1f4f3\":62737,\"1f4f4\":62738,\"1f4f5\":62665,\"1f4f6\":62736,\"1f4f7\":61168,\"1f4f8\":61169,\"1f4f9\":61170,\"1f4fa\":61167,\"1f4fb\":61134,\"1f4fc\":61171,\"1f4fd\":61165,\"1f4ff\":61113,\"1f500\":62715,\"1f501\":62716,\"1f502\":62717,\"1f503\":62683,\"1f504\":62684,\"1f505\":62734,\"1f506\":62735,\"1f507\":61117,\"1f508\":61118,\"1f509\":61119,\"1f50a\":61120,\"1f50b\":61150,\"1f50c\":61151,\"1f50d\":61172,\"1f50e\":61173,\"1f50f\":61251,\"1f510\":61252,\"1f511\":61253,\"1f512\":61249,\"1f513\":61250,\"1f514\":61124,\"1f515\":61125,\"1f516\":61194,\"1f517\":61274,\"1f518\":62860,\"1f519\":62685,\"1f51a\":62686,\"1f51b\":62687,\"1f51c\":62688,\"1f51d\":62689,\"1f51e\":62666,\"1f51f\":62789,\"1f520\":62790,\"1f521\":62791,\"1f522\":62792,\"1f523\":62793,\"1f524\":62794,\"1f525\":4985,\"1f526\":61176,\"1f527\":61267,\"1f528\":61255,\"1f529\":61269,\"1f52a\":3771,\"1f52b\":61262,\"1f52c\":61284,\"1f52d\":61285,\"1f52e\":51046,\"1f52f\":62701,\"1f530\":62761,\"1f531\":62759,\"1f532\":62862,\"1f533\":62861,\"1f534\":62829,\"1f535\":62833,\"1f536\":62853,\"1f537\":62854,\"1f538\":62855,\"1f539\":62856,\"1f53a\":62857,\"1f53b\":62858,\"1f53c\":62725,\"1f53d\":62727,\"1f549\":62692,\"1f54a\":2576,\"1f54b\":4821,\"1f54c\":4817,\"1f54d\":4819,\"1f54e\":62700,\"1f550\":4919,\"1f551\":4921,\"1f552\":4923,\"1f553\":4925,\"1f554\":4927,\"1f555\":4929,\"1f556\":4931,\"1f557\":4933,\"1f558\":4935,\"1f559\":4937,\"1f55a\":4939,\"1f55b\":4917,\"1f55c\":4920,\"1f55d\":4922,\"1f55e\":4924,\"1f55f\":4926,\"1f560\":4928,\"1f561\":4930,\"1f562\":4932,\"1f563\":4934,\"1f564\":4936,\"1f565\":4938,\"1f566\":4940,\"1f567\":4918,\"1f56f\":61174,\"1f570\":4916,\"1f573\":1144,\"1f574\":1549,\"1f575-200d-2640\":1463,\"1f575-200d-2642\":1462,\"1f575\":1461,\"1f576\":61073,\"1f577\":2614,\"1f578\":2615,\"1f579\":51050,\"1f57a\":1548,\"1f587\":61242,\"1f58a\":61222,\"1f58b\":61221,\"1f58c\":61223,\"1f58d\":61224,\"1f590\":1305,\"1f595\":1319,\"1f596\":1307,\"1f5a4\":1136,\"1f5a5\":61153,\"1f5a8\":61154,\"1f5b1\":61156,\"1f5b2\":61157,\"1f5bc\":51066,\"1f5c2\":61229,\"1f5c3\":61246,\"1f5c4\":61247,\"1f5d1\":61248,\"1f5d2\":61232,\"1f5d3\":61233,\"1f5dc\":61271,\"1f5dd\":61254,\"1f5de\":61192,\"1f5e1\":61260,\"1f5e3\":1645,\"1f5e8\":1148,\"1f5ef\":1149,\"1f5f3\":61218,\"1f5fa\":4777,\"1f5fb\":4783,\"1f5fc\":4814,\"1f5fd\":4815,\"1f5fe\":4778,\"1f5ff\":61320,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":113,\"1f608\":193,\"1f609\":111,\"1f60a\":112,\"1f60b\":123,\"1f60c\":143,\"1f60d\":115,\"1f60e\":162,\"1f60f\":138,\"1f610\":135,\"1f611\":136,\"1f612\":139,\"1f613\":185,\"1f614\":144,\"1f615\":165,\"1f616\":182,\"1f617\":118,\"1f618\":117,\"1f619\":121,\"1f61a\":120,\"1f61b\":124,\"1f61c\":125,\"1f61d\":127,\"1f61e\":184,\"1f61f\":166,\"1f620\":191,\"1f621\":190,\"1f622\":179,\"1f623\":183,\"1f624\":189,\"1f625\":178,\"1f626\":174,\"1f627\":175,\"1f628\":176,\"1f629\":186,\"1f62a\":145,\"1f62b\":187,\"1f62c\":141,\"1f62d\":180,\"1f62e\":169,\"1f62f\":170,\"1f630\":177,\"1f631\":181,\"1f632\":171,\"1f633\":172,\"1f634\":147,\"1f635\":157,\"1f636\":137,\"1f637\":148,\"1f638\":1106,\"1f639\":1107,\"1f63a\":1105,\"1f63b\":1108,\"1f63c\":1109,\"1f63d\":1110,\"1f63e\":1113,\"1f63f\":1112,\"1f640\":1111,\"1f641\":167,\"1f642\":19,\"1f643\":110,\"1f644\":140,\"1f645-200d-2640\":1388,\"1f645-200d-2642\":1387,\"1f645\":1386,\"1f646-200d-2640\":1391,\"1f646-200d-2642\":1390,\"1f646\":1389,\"1f647-200d-2640\":1403,\"1f647-200d-2642\":1402,\"1f647\":1401,\"1f648\":1114,\"1f649\":1115,\"1f64a\":1116,\"1f64b-200d-2640\":1397,\"1f64b-200d-2642\":1396,\"1f64b\":1395,\"1f64c\":1329,\"1f64d-200d-2640\":1382,\"1f64d-200d-2642\":1381,\"1f64d\":1380,\"1f64e-200d-2640\":1385,\"1f64e-200d-2642\":1384,\"1f64e\":1383,\"1f64f\":1333,\"1f680\":4906,\"1f681\":4901,\"1f682\":4838,\"1f683\":4839,\"1f684\":4840,\"1f685\":4841,\"1f686\":4842,\"1f687\":4843,\"1f688\":4844,\"1f689\":4845,\"1f68a\":4846,\"1f68b\":4849,\"1f68c\":4850,\"1f68d\":4851,\"1f68e\":4852,\"1f68f\":4877,\"1f690\":4853,\"1f691\":4854,\"1f692\":4855,\"1f693\":4856,\"1f694\":4857,\"1f695\":4858,\"1f696\":4859,\"1f697\":4860,\"1f698\":4861,\"1f699\":4862,\"1f69a\":4864,\"1f69b\":4865,\"1f69c\":4866,\"1f69d\":4847,\"1f69e\":4848,\"1f69f\":4902,\"1f6a0\":4903,\"1f6a1\":4904,\"1f6a2\":4894,\"1f6a3-200d-2640\":1571,\"1f6a3-200d-2642\":1570,\"1f6a3\":1569,\"1f6a4\":4890,\"1f6a5\":4883,\"1f6a6\":4884,\"1f6a7\":4886,\"1f6a8\":4882,\"1f6a9\":71543,\"1f6aa\":61292,\"1f6ab\":62659,\"1f6ac\":61316,\"1f6ad\":62661,\"1f6ae\":62644,\"1f6af\":62662,\"1f6b0\":62645,\"1f6b1\":62663,\"1f6b2\":4873,\"1f6b3\":62660,\"1f6b4-200d-2640\":1583,\"1f6b4-200d-2642\":1582,\"1f6b4\":1581,\"1f6b5-200d-2640\":1586,\"1f6b5-200d-2642\":1585,\"1f6b5\":1584,\"1f6b6-200d-2640\":1528,\"1f6b6-200d-2642\":1527,\"1f6b6\":1526,\"1f6b7\":62664,\"1f6b8\":62657,\"1f6b9\":62647,\"1f6ba\":62648,\"1f6bb\":62649,\"1f6bc\":62650,\"1f6bd\":61299,\"1f6be\":62651,\"1f6bf\":61301,\"1f6c0\":1605,\"1f6c1\":61302,\"1f6c2\":62652,\"1f6c3\":62653,\"1f6c4\":62654,\"1f6c5\":62655,\"1f6cb\":61297,\"1f6cc\":1606,\"1f6cd\":61095,\"1f6ce\":4908,\"1f6cf\":61296,\"1f6d0\":62690,\"1f6d1\":4885,\"1f6d2\":61315,\"1f6d5\":4818,\"1f6d6\":4795,\"1f6d7\":61293,\"1f6e0\":61259,\"1f6e1\":61265,\"1f6e2\":4880,\"1f6e3\":4878,\"1f6e4\":4879,\"1f6e5\":4893,\"1f6e9\":4896,\"1f6eb\":4897,\"1f6ec\":4898,\"1f6f0\":4905,\"1f6f3\":4891,\"1f6f4\":4874,\"1f6f5\":4869,\"1f6f6\":4889,\"1f6f7\":51040,\"1f6f8\":4907,\"1f6f9\":4875,\"1f6fa\":4872,\"1f6fb\":4863,\"1f6fc\":4876,\"1f7e0\":62830,\"1f7e1\":62831,\"1f7e2\":62832,\"1f7e3\":62834,\"1f7e4\":62835,\"1f7e5\":62838,\"1f7e6\":62842,\"1f7e7\":62839,\"1f7e8\":62840,\"1f7e9\":62841,\"1f7ea\":62843,\"1f7eb\":62844,\"1f90c\":1309,\"1f90d\":1137,\"1f90e\":1135,\"1f90f\":1310,\"1f910\":133,\"1f911\":128,\"1f912\":149,\"1f913\":163,\"1f914\":132,\"1f915\":150,\"1f916\":1104,\"1f917\":129,\"1f918\":1314,\"1f919\":1315,\"1f91a\":1304,\"1f91b\":1326,\"1f91c\":1327,\"1f91d\":1332,\"1f91e\":1312,\"1f91f\":1313,\"1f920\":159,\"1f921\":198,\"1f922\":151,\"1f923\":17,\"1f924\":146,\"1f925\":142,\"1f926-200d-2640\":1406,\"1f926-200d-2642\":1405,\"1f926\":1404,\"1f927\":153,\"1f928\":134,\"1f929\":116,\"1f92a\":126,\"1f92b\":131,\"1f92c\":192,\"1f92d\":130,\"1f92e\":152,\"1f92f\":158,\"1f930\":1484,\"1f931\":1485,\"1f932\":1331,\"1f933\":1336,\"1f934\":1471,\"1f935-200d-2640\":1480,\"1f935-200d-2642\":1479,\"1f935\":1478,\"1f936\":1491,\"1f937-200d-2640\":1409,\"1f937-200d-2642\":1408,\"1f937\":1407,\"1f938-200d-2640\":1589,\"1f938-200d-2642\":1588,\"1f938\":1587,\"1f939-200d-2640\":1601,\"1f939-200d-2642\":1600,\"1f939\":1599,\"1f93a\":1559,\"1f93c-200d-2640\":1592,\"1f93c-200d-2642\":1591,\"1f93c\":1590,\"1f93d-200d-2640\":1595,\"1f93d-200d-2642\":1594,\"1f93d\":1593,\"1f93e-200d-2640\":1598,\"1f93e-200d-2642\":1597,\"1f93e\":1596,\"1f93f\":51037,\"1f940\":2626,\"1f941\":61142,\"1f942\":3760,\"1f943\":3761,\"1f944\":3770,\"1f945\":51033,\"1f947\":51012,\"1f948\":51013,\"1f949\":51014,\"1f94a\":51031,\"1f94b\":51032,\"1f94c\":51041,\"1f94d\":51028,\"1f94e\":51017,\"1f94f\":51023,\"1f950\":3679,\"1f951\":3663,\"1f952\":3670,\"1f953\":3690,\"1f954\":3665,\"1f955\":3666,\"1f956\":3680,\"1f957\":3707,\"1f958\":3703,\"1f959\":3699,\"1f95a\":3701,\"1f95b\":3749,\"1f95c\":3676,\"1f95d\":3659,\"1f95e\":3684,\"1f95f\":3726,\"1f960\":3727,\"1f961\":3728,\"1f962\":3767,\"1f963\":3706,\"1f964\":3762,\"1f965\":3662,\"1f966\":3672,\"1f967\":3742,\"1f968\":3682,\"1f969\":3689,\"1f96a\":3695,\"1f96b\":3711,\"1f96c\":3671,\"1f96d\":3651,\"1f96e\":3724,\"1f96f\":3683,\"1f970\":114,\"1f971\":188,\"1f972\":122,\"1f973\":160,\"1f974\":156,\"1f975\":154,\"1f976\":155,\"1f977\":1467,\"1f978\":161,\"1f97a\":173,\"1f97b\":61086,\"1f97c\":61075,\"1f97d\":61074,\"1f97e\":61100,\"1f97f\":61101,\"1f980\":3729,\"1f981\":2519,\"1f982\":2616,\"1f983\":2568,\"1f984\":2525,\"1f985\":2577,\"1f986\":2578,\"1f987\":2557,\"1f988\":2602,\"1f989\":2580,\"1f98a\":2514,\"1f98b\":2606,\"1f98c\":2527,\"1f98d\":2506,\"1f98e\":2589,\"1f98f\":2546,\"1f990\":3731,\"1f991\":3732,\"1f992\":2543,\"1f993\":2526,\"1f994\":2556,\"1f995\":2593,\"1f996\":2594,\"1f997\":2612,\"1f998\":2565,\"1f999\":2542,\"1f99a\":2584,\"1f99b\":2547,\"1f99c\":2585,\"1f99d\":2515,\"1f99e\":3730,\"1f99f\":2617,\"1f9a0\":2620,\"1f9a1\":2566,\"1f9a2\":2579,\"1f9a3\":2545,\"1f9a4\":2581,\"1f9a5\":2562,\"1f9a6\":2563,\"1f9a7\":2507,\"1f9a8\":2564,\"1f9a9\":2583,\"1f9aa\":3733,\"1f9ab\":2555,\"1f9ac\":2528,\"1f9ad\":2598,\"1f9ae\":2510,\"1f9af\":61273,\"1f9b4\":1349,\"1f9b5\":1340,\"1f9b6\":1341,\"1f9b7\":1348,\"1f9b8-200d-2640\":1495,\"1f9b8-200d-2642\":1494,\"1f9b8\":1493,\"1f9b9-200d-2640\":1498,\"1f9b9-200d-2642\":1497,\"1f9b9\":1496,\"1f9ba\":61076,\"1f9bb\":1343,\"1f9bc\":4871,\"1f9bd\":4870,\"1f9be\":1338,\"1f9bf\":1339,\"1f9c0\":3686,\"1f9c1\":3741,\"1f9c2\":3710,\"1f9c3\":3764,\"1f9c4\":3673,\"1f9c5\":3674,\"1f9c6\":3700,\"1f9c7\":3685,\"1f9c8\":3709,\"1f9c9\":3765,\"1f9ca\":3766,\"1f9cb\":3763,\"1f9cd-200d-2640\":1531,\"1f9cd-200d-2642\":1530,\"1f9cd\":1529,\"1f9ce-200d-2640\":1534,\"1f9ce-200d-2642\":1533,\"1f9ce\":1532,\"1f9cf-200d-2640\":1400,\"1f9cf-200d-2642\":1399,\"1f9cf\":1398,\"1f9d0\":164,\"1f9d1-200d-1f33e\":1422,\"1f9d1-200d-1f373\":1425,\"1f9d1-200d-1f37c\":1488,\"1f9d1-200d-1f384\":1492,\"1f9d1-200d-1f393\":1413,\"1f9d1-200d-1f3a4\":1443,\"1f9d1-200d-1f3a8\":1446,\"1f9d1-200d-1f3eb\":1416,\"1f9d1-200d-1f3ed\":1431,\"1f9d1-200d-1f4bb\":1440,\"1f9d1-200d-1f4bc\":1434,\"1f9d1-200d-1f527\":1428,\"1f9d1-200d-1f52c\":1437,\"1f9d1-200d-1f680\":1452,\"1f9d1-200d-1f692\":1455,\"1f9d1-200d-1f91d-200d-1f9d1\":1607,\"1f9d1-200d-1f9af\":1535,\"1f9d1-200d-1f9b0\":1368,\"1f9d1-200d-1f9b1\":1370,\"1f9d1-200d-1f9b2\":1374,\"1f9d1-200d-1f9b3\":1372,\"1f9d1-200d-1f9bc\":1538,\"1f9d1-200d-1f9bd\":1541,\"1f9d1-200d-2695\":1410,\"1f9d1-200d-2696\":1419,\"1f9d1-200d-2708\":1449,\"1f9d1\":1358,\"1f9d2\":1355,\"1f9d3\":1377,\"1f9d4\":1361,\"1f9d5\":1477,\"1f9d6-200d-2640\":1555,\"1f9d6-200d-2642\":1554,\"1f9d6\":1553,\"1f9d7-200d-2640\":1558,\"1f9d7-200d-2642\":1557,\"1f9d7\":1556,\"1f9d8-200d-2640\":1604,\"1f9d8-200d-2642\":1603,\"1f9d8\":1602,\"1f9d9-200d-2640\":1501,\"1f9d9-200d-2642\":1500,\"1f9d9\":1499,\"1f9da-200d-2640\":1504,\"1f9da-200d-2642\":1503,\"1f9da\":1502,\"1f9db-200d-2640\":1507,\"1f9db-200d-2642\":1506,\"1f9db\":1505,\"1f9dc-200d-2640\":1510,\"1f9dc-200d-2642\":1509,\"1f9dc\":1508,\"1f9dd-200d-2640\":1513,\"1f9dd-200d-2642\":1512,\"1f9dd\":1511,\"1f9de-200d-2640\":1516,\"1f9de-200d-2642\":1515,\"1f9de\":1514,\"1f9df-200d-2640\":1519,\"1f9df-200d-2642\":1518,\"1f9df\":1517,\"1f9e0\":1345,\"1f9e1\":1130,\"1f9e2\":61110,\"1f9e3\":61080,\"1f9e4\":61081,\"1f9e5\":61082,\"1f9e6\":61083,\"1f9e7\":51003,\"1f9e8\":5992,\"1f9e9\":51053,\"1f9ea\":61281,\"1f9eb\":61282,\"1f9ec\":61283,\"1f9ed\":4779,\"1f9ee\":61162,\"1f9ef\":61314,\"1f9f0\":61277,\"1f9f1\":4792,\"1f9f2\":61278,\"1f9f3\":4909,\"1f9f4\":61305,\"1f9f5\":51068,\"1f9f6\":51070,\"1f9f7\":61306,\"1f9f8\":51054,\"1f9f9\":61307,\"1f9fa\":61308,\"1f9fb\":61309,\"1f9fc\":61311,\"1f9fd\":61313,\"1f9fe\":61204,\"1f9ff\":51048,\"1fa70\":61104,\"1fa71\":61087,\"1fa72\":61088,\"1fa73\":61089,\"1fa74\":61097,\"1fa78\":61288,\"1fa79\":61290,\"1fa7a\":61291,\"1fa80\":51043,\"1fa81\":51044,\"1fa82\":4899,\"1fa83\":61263,\"1fa84\":51047,\"1fa85\":51055,\"1fa86\":51056,\"1fa90\":4957,\"1fa91\":61298,\"1fa92\":61304,\"1fa93\":61256,\"1fa94\":61178,\"1fa95\":61141,\"1fa96\":61111,\"1fa97\":61136,\"1fa98\":61143,\"1fa99\":61197,\"1fa9a\":61266,\"1fa9b\":61268,\"1fa9c\":61279,\"1fa9d\":61276,\"1fa9e\":61294,\"1fa9f\":61295,\"1faa0\":61300,\"1faa1\":51069,\"1faa2\":51071,\"1faa3\":61310,\"1faa4\":61303,\"1faa5\":61312,\"1faa6\":61318,\"1faa7\":61321,\"1faa8\":4793,\"1fab0\":2618,\"1fab1\":2619,\"1fab2\":2610,\"1fab3\":2613,\"1fab4\":2632,\"1fab5\":4794,\"1fab6\":2582,\"1fac0\":1346,\"1fac1\":1347,\"1fac2\":1648,\"1fad0\":3658,\"1fad1\":3669,\"1fad2\":3661,\"1fad3\":3681,\"1fad4\":3698,\"1fad5\":3705,\"1fad6\":3751,\"203c\":62747,\"21a9\":62679,\"21aa\":62680,\"231a\":4912,\"231b\":4910,\"23cf\":62732,\"23e9\":62719,\"23ea\":62723,\"23eb\":62726,\"23ec\":62728,\"23ed\":62720,\"23ee\":62724,\"23ef\":62721,\"23f0\":4913,\"23f1\":4914,\"23f2\":4915,\"23f3\":4911,\"23f8\":62729,\"23f9\":62730,\"23fa\":62731,\"24c2\":62803,\"25aa\":62851,\"25ab\":62852,\"25b6\":62718,\"25c0\":62722,\"25fb\":62848,\"25fc\":62847,\"25fd\":62850,\"25fe\":62849,\"260e\":61146,\"261d\":1321,\"262a\":62698,\"262e\":62699,\"262f\":62695,\"263a\":119,\"264a\":62704,\"264b\":62705,\"264c\":62706,\"264d\":62707,\"264e\":62708,\"264f\":62709,\"265f\":51061,\"267b\":62757,\"267e\":62746,\"267f\":62646,\"269b\":62691,\"269c\":62758,\"26a0\":62656,\"26a1\":4980,\"26a7\":62741,\"26aa\":62837,\"26ab\":62836,\"26b0\":61317,\"26b1\":61319,\"26bd\":51015,\"26be\":51016,\"26c4\":4983,\"26c5\":4963,\"26c8\":4964,\"26ce\":62714,\"26cf\":61257,\"26d1\":61112,\"26d3\":61275,\"26d4\":62658,\"26e9\":4820,\"26ea\":4816,\"26f0\":4781,\"26f1\":4979,\"26f2\":4822,\"26f3\":51034,\"26f4\":4892,\"26f5\":4888,\"26f7\":1561,\"26f8\":51035,\"26f9-200d-2640\":1577,\"26f9-200d-2642\":1576,\"26f9\":1575,\"26fa\":4823,\"26fd\":4881,\"270a\":1324,\"270b\":1306,\"270c\":1311,\"270d\":1334,\"270f\":61219,\"271d\":62696,\"274c\":62766,\"274e\":62767,\"27a1\":62671,\"27b0\":62768,\"27bf\":62769,\"2b05\":62675,\"2b06\":62669,\"2b07\":62673,\"2b1b\":62845,\"2b1c\":62846,\"2b50\":4958,\"2b55\":62762,\"303d\":62770,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0};\r\n\r\n/* Emoji[\"00a9-fe0f\"] = 6362;\r\nEmoji[\"00ae-fe0f\"] = 6363;\r\nEmoji[\"2122-fe0f\"] = 6364; */\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nexport const TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nexport const LatinizeMap: {[k: string]: string} = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\r\n\r\nconst Config = {\r\n Emoji,\r\n LatinizeMap,\r\n TLD,\r\n MediaSizes: mediaSizes\r\n};\r\nMOUNT_CLASS_TO.Config = Config;\r\nexport default Config;\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 DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport deepEqual from \"../helpers/object/deepEqual\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport capitalizeFirstLetter from \"../helpers/string/capitalizeFirstLetter\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\n\n if(haveToUpdate) {\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach(element => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && RichTextProcessor.matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = RichTextProcessor.wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map(item => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: /* 'innerText' | */'innerHTML' | 'placeholder',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.77bc82001791a2fea575.bundle.worker.js\");\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 { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\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 { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, JSONValue, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport CryptoWorkerMethods, { CryptoMethods } from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport { pause } from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport type { ApiError } from './apiManager';\nimport { MTAppConfig } from './appConfig';\nimport { ignoreRestrictionReasons } from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise;\n private getAppConfigPromise: Promise;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \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 this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\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 this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n private createTask(task: string, type: string, args: any[]): any {\n return {\n task,\n taskId: this.taskId++,\n type,\n args,\n };\n }\n\n public performTaskWorkerVoid(taskName: string, ...args: any[]) {\n const task = this.createTask(taskName, undefined, args);\n this.pending.push(task);\n this.releasePending();\n }\n\n public performTaskWorkerNew(taskName: string, type: string, ...args: any[]) {\n this.debug && this.log.debug('start', taskName, args);\n\n return new Promise((resolve, reject) => {\n const task = this.createTask(taskName, type, args);\n this.pending.push(task);\n this.awaiting[task.taskId] = {resolve, reject, taskName: taskName};\n this.releasePending();\n });\n }\n\n public performTaskWorker(task: string, ...args: any[]) {\n return this.performTaskWorkerNew(task, undefined, ...args);\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return this.performTaskWorkerNew(method, 'crypto', ...args);\n }\n \n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T, \n processResult?: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: Omit, \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(rootScope.appConfig && !overwrite) return rootScope.appConfig;\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n const promise: Promise = this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then((config: MTAppConfig) => {\n if(this.getAppConfigPromise !== promise) {\n return this.getAppConfigPromise;\n }\n \n rootScope.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n return config;\n });\n\n return promise;\n }\n}\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\r\nimport type bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport type gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport type { Awaited } from \"../../types\";\r\nimport type getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport type computeDhKey from \"./computeDhKey\";\r\nimport type generateDh from \"./generateDh\";\r\nimport type computeSRP from \"./srp\";\r\nimport type { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport type factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\n// import type factorizeTdlibPQ from \"./utils/factorize/tdlib\";\r\nimport type pbkdf2 from \"./utils/pbkdf2\";\r\nimport type rsaEncrypt from \"./utils/rsa\";\r\nimport type sha1 from \"./utils/sha1\";\r\nimport type sha256 from \"./utils/sha256\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1': typeof sha1,\r\n 'sha256': typeof sha256,\r\n 'pbkdf2': typeof pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': typeof factorizeTdlibPQ,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP,\r\n 'generate-dh': typeof generateDh,\r\n 'compute-dh-key': typeof computeDhKey,\r\n 'get-emojis-fingerprint': typeof getEmojisFingerprint\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(\r\n method: Method, \r\n ...args: Parameters\r\n ): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceID ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\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 { tsNow } from \"../../helpers/date\";\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(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\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 const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\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 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 * 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 { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager 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\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 {\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 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 || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['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 const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\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 const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.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 rootScope.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 rootScope.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","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from './config';\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { MessageEntity } from '../layer';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport copy from '../helpers/object/copy';\nimport encodeEntities from '../helpers/string/encodeEntities';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst emojiData = Config.Emoji;\n\nconst alphaCharsRegExp = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\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}' +\n '|' +\n // host name\n urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\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,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nconst passConflictingEntities: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export function getEmojiSpritesheetCoords(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!emojiData.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return null;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const emojiCoords = getEmojiSpritesheetCoords(match[8]);\n if(emojiCoords) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: emojiCoords\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\n\n /* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n } */\n\n export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n \n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n }\n\n const CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n ]);\n export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n }\n\n /**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n\n contextHashtag?: string,\n }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n const startOffset = entity.offset, endOffset = endPart ? entity.offset + entity.length : undefined;\n let startIndex: number, endIndex: number, length = lol.length;\n for(let i = length - 1; i >= 0; --i) {\n const offset = lol[i].offset;\n\n if(startIndex === undefined && startOffset >= offset) {\n startIndex = i + 1;\n }\n\n if(endOffset !== undefined) {\n if(endOffset <= offset) {\n endIndex = i;\n }\n }\n\n if(startOffset > offset && (endOffset === undefined || endOffset < offset)) {\n break;\n }\n }\n\n startIndex ??= 0;\n lol.splice(startIndex, 0, {part: startPart, offset: entity.offset/* , priority */});\n\n if(endOffset !== undefined) {\n endIndex ??= startIndex;\n ++endIndex;\n lol.splice(endIndex, 0, {part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n const textLength = text.length;\n for(let i = 0, length = entities.length; i < length; ++i) {\n let entity = entities[i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, ``, ``);\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n //if(!(options.wrappingDraft && IS_EMOJI_SUPPORTED)) { // * fix safari emoji\n if(!IS_EMOJI_SUPPORTED) { // no wrapping needed\n // if(IS_EMOJI_SUPPORTED) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!IS_EMOJI_SUPPORTED) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\n break;\n }\n\n /* case 'messageEntityLinebreak': {\n if(options.noLinebreaks) {\n insertPart(entity, ' ');\n } else {\n insertPart(entity, '
');\n }\n \n break;\n } */\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const after = text.slice(entity.offset + entity.length);\n text = before + spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */ + after;\n } else if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n // lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, pushPartsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < pushPartsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += pushPartsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n const sliced = text.slice(usedLength, offset);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n const sliced = text.slice(usedLength);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n }\n\n return arr.join('');\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return '';\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n\n export function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n }\n \n /* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n } */\n \n /**\n * ! This function is still unsafe to use with .innerHTML\n */\n export function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n if(entities?.length) {\n entities = entities.filter(entity => entity._ === 'messageEntitySpoiler');\n }\n \n return wrapRichText(text, {\n entities, \n noEncoding: true,\n noTextFormat: true,\n noLinebreaks: true,\n noLinks: true\n });\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n if(/^\\W/.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n \n return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js\");\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 WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\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 WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\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 } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\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 fileName = 'main-' + fileName;\r\n\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;","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"names":["document","createElement","toDataURL","startsWith","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","months","days","ONE_DAY","getWeekNumber","date","d","Date","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","Math","ceil","getTime","formatDateAccordingToTodayNew","time","today","now","timestamp","options","hour","minute","year","day","month","weekday","element","formatFullSentTimeRaw","timeEl","formatTime","dateEl","i18n","capitalize","style","textTransform","formatFullSentTime","fragment","createDocumentFragment","append","getFullDate","joiner","monthAsNumber","getHours","slice","getMinutes","noSeconds","getSeconds","leadingZero","noTime","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","q","trim","toLowerCase","length","indexOf","setFullYear","setHours","minDate","maxDate","push","title","dayOfWeek","c","i","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","ScreenSize","MediaSize","constructor","width","height","aspect","boxSize","fitted","this","aspectFitted","aspectCovered","makeMediaSize","MediaSizes","super","screenSizes","key","mobile","value","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","round","desktop","isMobile","handleResize","innerWidth","window","activeScreen","wasScreen","active","undefined","dispatchEvent","addEventListener","rAF","cancelAnimationFrame","requestAnimationFrame","mediaSizes","deepEqual","x","y","ok","Object","keys","tx","every","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","platform","isRestricted","ignoreRestrictionReasons","clear","forEach","add","pause","ms","Promise","resolve","setTimeout","tsNow","seconds","t","reload","location","e","close","focus","Config","Emoji","LatinizeMap","TLD","langPack","UNSUPPORTED_LANG_PACK_KEY","IS_MOBILE","I18n","pluralRules","cacheLangPackPromise","loadLocalLangPack","defaultCode","lastRequestedLangCode","all","then","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","version","local","loadLangPack","langCode","requestedServerLanguage","lang_pack","hash","polyfillPromise","pushTo","v","appVersion","stateStorage","applyLangPack","Intl","PluralRules","err","console","error","split","string","set","countriesList","country","name","langPackKey","default_name","lastAppliedLangCode","rootScope","Array","from","querySelectorAll","instance","weakMap","get","update","superFormatter","input","args","indexHolder","out","lastIndex","replace","match","p1","p2","p3","p4","offset","idx","lastIndexOf","text","url","a","wrappedUrl","href","onclick","setAttribute","target","textContent","arg","isArray","pushNextArgument","format","plain","str","select","result","map","item","Node","join","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","concat","_Intl","assign","WeakMap","IntlElementBase","property","classList","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","dateTimeFormat","DateTimeFormat","charAt","toUpperCase","i18n_","_i18n","joinElementsWith","elements","arr","isLast","useLast","joined","Worker_fn","Worker","Socket","dcId","logSuffix","debug","handleOpen","log","handleError","handleClose","removeListeners","handleMessage","event","data","byteLength","send","body","ws","logTypes","Log","logger","connect","removeEventListener","WebSocket","binaryType","apiManagerProxy","invokeCrypto","method","performTaskWorker","afterMessageIdTemp","taskId","awaiting","pending","updatesProcessor","hashes","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","task","isObject","callback","type","progress","hasOwnProperty","finalizeTask","singleInstance","registerServiceWorker","addTaskListener","sessionStorage","race","telegramMeWebManager","webPushApiManager","cacheName","caches","delete","appRuntimeManager","payload","webpWorkerController","socketTask","id","socket","onOpen","postMessage","onClose","onMessage","buffer","storageTask","res","language","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","isServiceWorkerOnline","navigator","worker","serviceWorker","register","scope","registration","installing","waiting","onServiceWorkerFail","warn","releasePending","controller","addServiceWorkerTaskListener","responseTask","uploadFile","postSWMessage","originalPayload","message","onWorkerFirstMessage","bind","isWebpSupported","userAgent","once","deferred","taskName","reject","createTask","performTaskWorkerNew","setUpdatesProcessor","invokeApi","params","invokeApiAfter","o","prepareTempMessageId","messageId","invokeApiHashable","queryJSON","JSON","stringify","cached","invokeApiSingleProcess","processResult","includes","invokeApiSingle","cache","processError","cacheKey","oldPromise","p","size","invokeApiCacheable","override","fulfilled","promise","timeout","clearTimeout","cacheSeconds","clearCache","verify","setBaseDcId","setQueueId","queueId","setUserAuth","userAuth","dcID","toPeerId","setUser","user","getNetworker","dc_id","logOut","cancelDownload","fileName","downloadFile","toggleStorage","enabled","stopAll","startAll","forceReconnect","getConfigPromise","config","getAppConfig","overwrite","getAppConfigPromise","ignore_restriction_reasons","clearInstance","masterInstance","deactivated","deactivateInstance","deactivateTimeout","checkInstance","idle","newInstance","instanceID","curInstance","xt_instance","initial","start","started","reset","setInterval","documentElement","activateInstance","TelegramMeWebManager","disabled","hostname","setAuthorized","canRedirect","curValue","ts","tgme_sync","path","encodeURIComponent","promises","script","onload","onerror","remove","src","appendChild","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","settings","isFirefox","userVisibleOnly","subscribe","ready","reg","pushManager","subscription","pushSubscriptionNotify","catch","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","forceUnsubscribe","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","auth","tokenType","tokenValue","encodeEntities","charCodeAt","emojiData","alphaCharsRegExp","urlAlphanumericRegExpPart","urlProtocolRegExpPart","urlRegExp","urlAnyProtocolRegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","RichTextProcessor","getEmojiSpritesheetCoords","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","index","test","protocol","tld","substr","balanced","checkBrackets","emojiCoords","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","currentEntity","mergeEntities","newEntities","filtered","filter","sortEntities","entity","nextEntity","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","isSOH","user_id","toUserId","newText","splice","combineSameEntities","diff","max","CAN_COMBINE_ENTITIES","nextEntityIdx","findIndex","_i","sort","b","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","startOffset","endOffset","startIndex","endIndex","part","pushPartsAfterSort","textLength","copy","noTextFormat","wrappingDraft","IS_SAFARI","noLinks","bot","atPos","command","fromBot","html","entityText","masked","wrapped","wrapUrl","currentContext","electronHelpers","contextUrl","hashtag","username","before","spoilerBefore","after","spoiler","partsLength","pushPartsAfterSortLength","insertAt","usedLength","sliced","noEncoding","urlLength","urlOpenBrackets","urlCloseBrackets","chars","charsLength","char","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","matchUrlProtocol","fullPath","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","noLinebreaks","matchUrl","matchEmail","getAbbreviation","onlyFirst","splitted","first","isUsernameValid","wrapSingleEmoji","convertPromises","init","bytes","convert","convertPromise","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","prev","curr","fromCodePoint"],"sourceRoot":""} \ No newline at end of file diff --git a/public/53.0848e83cc329eb6130be.chunk.js b/public/53.0848e83cc329eb6130be.chunk.js deleted file mode 100644 index 87ab57ea..00000000 --- a/public/53.0848e83cc329eb6130be.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[53,688,465,392,810],{4489:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(503);class a extends i.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a}))}}},9638:(e,t,n)=>{n.d(t,{Z:()=>p});var i=n(3910),a=n(2738),o=n(4541),s=n(4727),r=n(9518),l=n(3512),d=n(4494),c=n(6858);let u,h=!1;function p(e){h||(u||(u=r.Z.getConfig().then((e=>e.suggested_lang_code!==s.default.lastRequestedLangCode?Promise.all([e,s.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),s.default.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const r=[];n.forEach((e=>{const t=s.default.strings.get(e.key);t&&(r.push(t),s.default.strings.set(e.key,e))}));const u=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),(0,o.Z)().then((()=>{window.requestAnimationFrame((()=>{e.append(u)}))})),l.default.addEventListener("language_change",(()=>{u.remove()}),{once:!0}),r.forEach((e=>{s.default.strings.set(e.key,e)})),(0,a.fc)(u,(e=>{(0,i.d)(e),h=!0,u.disabled=!0,(0,c.y7)(u),s.default.getLangPack(t.suggested_lang_code)}))}))}},3083:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2897);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.Z.waitForFirstFrame(e)))),i.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),i.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},4484:(e,t,n)=>{function i(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ii})},8079:(e,t,n)=>{function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,{Z:()=>i})},8045:(e,t,n)=>{n.d(t,{Z:()=>r});var i=n(410),a=n(7487),o=n(9518);const s=new class{constructor(){this.serverTimeOffset=0,a.Z.get("server_time_offset").then((e=>{e&&(this.serverTimeOffset=e)})),o.Z.addTaskListener("applyServerTimeOffset",(e=>{this.serverTimeOffset=e.payload}))}};i.GO&&(i.GO.serverTimeManager=s);const r=s},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var i=n(4755),a=n(4687),o=n(9518),s=n(4874),r=n(810),l=n(3083),d=n(4489),c=n(4727),u=n(144),h=n(5565);let p,m=null,g=null,f=null;const v=new s.Z("page-authCode",!0,(()=>{const e=m.type.length,t=new d.Z({label:"Code",name:(0,u.a)(),length:e,onFill:e=>{s(e)}});p=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container),v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return r.default.mount()}));const a=()=>{setTimeout((()=>{y.remove()}),300)},s=e=>{p.setAttribute("disabled","true");const i={phone_number:m.phone_number,phone_code_hash:m.phone_code_hash,phone_code:e};o.Z.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":o.Z.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(339)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:m.phone_number,phone_code_hash:m.phone_code_hash})})),a()}})).catch((e=>{return i=void 0,a=void 0,s=function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{p.value=""}),300);break;case"PHONE_CODE_EXPIRED":p.classList.add("error"),(0,h.Z)(t.label,(0,c.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":p.classList.add("error"),(0,h.Z)(t.label,(0,c.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),p.removeAttribute("disabled")},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{l(s.next(e))}catch(e){t(e)}}function r(e){try{l(s.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,r)}l((s=s.apply(i,a||[])).next())}));var i,a,o,s}))},g=v.pageEl.querySelector(".auth-image"),f=i.ZP.isMobile?100:166,y=new l.Z(t,f);return g.append(y.container),y.load()}),(e=>{if(m=e,g){p.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),p.dispatchEvent(e)}else g=v.pageEl.getElementsByClassName("phone")[0],f=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(g.innerText=m.phone_number,m.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[m.type._]}(0,h.Z)(f,(0,c.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{p.focus()})),y=v},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>H});var i=n(6858),a=n(8805),o=n(4687),s=n(9518),r=n(8598),l=n(4874),d=n(503),c=n(9807),u=n(4494),h=n(4789),p=n(5432),m=n(4159),g=n(4727),f=n(2897),v=n(1405),y=n(4668),E=n(8497),_=n(144),L=n(6947),w=n(8576),b=n(4465),Z=n(9638),S=n(3910),k=n(2738),T=n(5565),C=n(1656),P=n(7487),A=n(2398),x=n(671),O=n(6669),D=n(7922),N=n(3512),F=n(709),R=n(9976);let I,q=null;const M=new l.Z("page-sign",!0,(()=>{const e=()=>{t=g.default.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let t;e(),N.default.addEventListener("language_change",(()=>{e()}));const l=new Map;let v,H;const z=document.createElement("div");z.classList.add("input-wrapper");const Q=new d.Z({label:"Login.CountrySelectorLabel",name:(0,_.a)()});Q.container.classList.add("input-select");const B=Q.input,U=document.createElement("div");U.classList.add("select-wrapper","z-depth-3","hide");const V=document.createElement("span");V.classList.add("arrow","arrow-down"),Q.container.append(V);const $=document.createElement("ul");U.appendChild($),new a.ZP(U);let W=()=>{W=null,t.forEach((e=>{const t=(0,x.Ml)(e.iso2),n=[];e.country_codes.forEach((i=>{const a=document.createElement("li");let o=r.o.wrapEmojiText(t);if(R.Z){const e=document.createElement("span");e.innerHTML=o,a.append(e)}else a.innerHTML=o;const s=(0,g.i18n)(e.default_name);s.dataset.defaultName=e.default_name,a.append(s);const l=document.createElement("span");l.classList.add("phone-code"),l.innerText="+"+i.country_code,a.appendChild(l),n.push(a),$.append(a)})),l.set(e.iso2,n)})),$.addEventListener("mousedown",(e=>{if(0!==e.button)return;const t=(0,y.Z)(e.target,"LI");j(t)})),Q.container.appendChild(U)};const j=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,a=i.replace(/\D/g,"");(0,T.Z)(B,(0,g.i18n)(n)),(0,O.Z)(B,"input"),v=t.find((e=>e.default_name===n)),H=v.country_codes.find((e=>e.country_code===a)),J.value=J.lastValue=i,Y(),setTimeout((()=>{ee.focus(),(0,A.Z)(ee,!0)}),0)};let G;W(),B.addEventListener("focus",(function(e){W?W():t.forEach((e=>{l.get(e.iso2).forEach((e=>e.style.display=""))})),clearTimeout(G),G=void 0,U.classList.remove("hide"),U.offsetWidth,U.classList.add("active"),Q.select(),(0,h.Z)({container:M.pageEl.parentElement.parentElement,element:B,position:"start",margin:4}),setTimeout((()=>{K||(document.addEventListener("mousedown",X,{capture:!0}),K=!0)}),0)}));let K=!1;const X=e=>{(0,E.Z)(e.target,"input-select")||e.target!==B&&(Y(),document.removeEventListener("mousedown",X,{capture:!0}),K=!1)},Y=()=>{void 0===G&&(U.classList.remove("active"),G=window.setTimeout((()=>{U.classList.add("hide"),G=void 0}),200))};B.addEventListener("keyup",(e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=Q.value.toLowerCase(),a=[];t.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const n=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");n.length>1&&t.push(n)}));let n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));l.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&a.push(e)})),0===a.length?t.forEach((e=>{l.get(e.iso2).forEach((e=>e.style.display=""))})):1===a.length&&"Enter"===n&&j(l.get(a[0].iso2)[0])})),V.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),B.matches(":focus")?B.blur():B.focus()}));const J=new F.Z({onInput:e=>{f.Z.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===Q.value||v&&t&&n&&(v===t||H.country_code===n.country_code)||((0,T.Z)(B,t?(0,g.i18n)(t.default_name):i),v=t,H=n),t||J.value.length-1>1?q.style.visibility="":q.style.visibility="hidden"}}),ee=J.input;ee.addEventListener("keypress",(e=>{if(!q.style.visibility&&"Enter"===e.key)return ne()}));const te=new c.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});te.input.addEventListener("change",(()=>{const e=te.checked;o.default.pushToState("keepSigned",e),L.Z.toggleStorage(e),w.Z.toggleStorage(e),s.Z.toggleStorage(e),P.Z.toggleStorage(e)})),o.default.getState().then((e=>{o.default.storage.isAvailable()?te.checked=e.keepSigned:(te.checked=!1,te.label.classList.add("checkbox-disabled"))})),q=(0,u.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),q.style.visibility="hidden";const ne=e=>{e&&(0,S.d)(e);const t=(0,C.Z)([q,I],!0);(0,T.Z)(q,(0,g.i18n)("PleaseWait")),(0,i.y7)(q);let a=J.value;s.Z.invokeApi("auth.sendCode",{phone_number:a,api_id:m.Z.id,api_hash:m.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:a}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(J.setError(),(0,T.Z)(J.label,(0,g.i18n)("Login.PhoneLabelInvalid")),ee.classList.add("error"),(0,T.Z)(q,(0,g.i18n)("Login.Next"))):(console.error("auth.sendCode error:",e),q.innerText=e.type)}))};(0,k.fc)(q,ne),I=(0,u.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),I.addEventListener("click",(()=>{b.default.mount()})),z.append(Q.container,J.container,te.label,q,I);const ie=document.createElement("h4");ie.classList.add("text-center"),(0,g._i18n)(ie,"Login.Title");const ae=document.createElement("div");ae.classList.add("subtitle","text-center"),(0,g._i18n)(ae,"Login.StartText"),M.pageEl.querySelector(".container").append(ie,ae,z),p.IS_TOUCH_SUPPORTED||setTimeout((()=>{ee.focus()}),0),(0,Z.Z)(z),s.Z.invokeApi("help.getNearestDc").then((e=>{var t;const n=D.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.default.getLangPack(n.lang_code).then((()=>{(0,O.Z)(ee,"input")}));const i=new Set([1,2,3,4,5]),a=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=s.Z.getNetworker(e.nearest_dc).then((()=>{a.push(e.nearest_dc)}))),(o||Promise.resolve()).then((()=>{a.forEach((e=>{i.delete(e)}));const e=[...i],t=()=>{return n=void 0,i=void 0,o=function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield P.Z.get(i))return t();setTimeout((()=>{s.Z.getNetworker(n).finally(t)}),3e3)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof a?n:new a((function(e){e(n)}))).then(s,r)}l((o=o.apply(n,i||[])).next())}));var n,i,a,o};t()})),e})).then((e=>{Q.value.length||J.value.length||j(l.get(e.country)[0])}))}),(()=>{q&&((0,T.Z)(q,(0,g.i18n)("Login.Next")),(0,v.ripple)(q,void 0,void 0,!0),q.removeAttribute("disabled")),I&&I.removeAttribute("disabled"),o.default.pushToState("authState",{_:"authStateSignIn"})})),H=M},4465:(e,t,n)=>{n.r(t),n.d(t,{default:()=>_});var i=n(9518),a=n(4874),o=n(8045),s=n(4159),r=n(4494),l=n(4727),d=n(4687),c=n(3512),u=n(6858),h=n(9638),p=n(5418),m=n(8079),g=n(4484);function f(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var v=function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function s(e){try{l(i.next(e))}catch(e){o(e)}}function r(e){try{l(i.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,r)}l((i=i.apply(e,t||[])).next())}))};let y;const E=new a.Z("page-signQR",!0,(()=>y),(()=>{y||(y=v(void 0,void 0,void 0,(function*(){const e=E.pageEl.querySelector(".auth-image");let t=(0,u.y7)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const d=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(d),(0,h.Z)(a);const _=e.parentElement,L=document.createElement("h4");(0,l._i18n)(L,"Login.QR.Title");const w=document.createElement("ol");w.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,l.i18n)(e)),w.append(t)})),_.append(L,w,a),d.addEventListener("click",(()=>{Promise.all([n.e(458),n.e(325),n.e(810)]).then(n.bind(n,810)).then((e=>e.default.mount())),Z=!0}));const b=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let Z=!1;c.default.addEventListener("user_auth",(()=>{Z=!0,y=null}),{once:!0});let S,k={ignoreErrors:!0};const T=a=>v(void 0,void 0,void 0,(function*(){try{let r=yield i.Z.invokeApi("auth.exportLoginToken",{api_id:s.Z.id,api_hash:s.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(k.dcId||(k.dcId=r.dc_id,i.Z.setBaseDcId(r.dc_id)),r=yield i.Z.invokeApi("auth.importLoginToken",{token:r.token},k)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return i.Z.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!S||!(0,g.Z)(S,r.token)){S=r.token;let n=function(e){let t,n="";for(let i=e.length,a=0,o=0;o>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(f(a>>>18&63),f(a>>>12&63),f(a>>>6&63),f(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token),i="tg://login?token="+(0,m.Z)(n,!0);const a=window.getComputedStyle(document.documentElement),o=a.getPropertyValue("--surface-color").trim(),s=a.getPropertyValue("--primary-text-color").trim(),l=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)}))})),c=new b({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:d,dotsOptions:{color:s,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:o},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,p.w)(1e3),new Promise((e=>{c._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield u.then((()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout((()=>{n.style.display=""}),150),setTimeout((()=>{n.style.animation=""}),500),t=void 0}else Array.from(e.children).slice(0,-1).forEach((e=>{e.remove()}))}))}if(a){let e=Date.now()/1e3,t=r.expires-e-o.Z.serverTimeOffset;yield(0,p.w)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,Promise.all([n.e(458),n.e(442)]).then(n.bind(n,9437)).then((e=>e.default.mount())),Z=!0,y=null):(console.error("pageSignQR: default error:",e),Z=!0),!0}return!1}));return()=>v(void 0,void 0,void 0,(function*(){for(Z=!1;!Z&&!(yield T(!0)););}))}))),y.then((e=>{e()})),d.default.pushToState("authState",{_:"authStateSignQr"})})),_=E}}]); -//# sourceMappingURL=53.0848e83cc329eb6130be.chunk.js.map \ No newline at end of file diff --git a/public/53.0848e83cc329eb6130be.chunk.js.map b/public/53.0848e83cc329eb6130be.chunk.js.map deleted file mode 100644 index af9b4ab2..00000000 --- a/public/53.0848e83cc329eb6130be.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"53.0848e83cc329eb6130be.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/mtproto/serverTimeManager.ts","webpack://tweb/./src/pages/pageAuthCode.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts"],"sourcesContent":["/*\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 InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\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 { 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 apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = 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;\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 btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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 InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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","/*\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 { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\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 mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\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 { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\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 findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\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 { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet 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 const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\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 let 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 replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\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 appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.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 let phone_number = telInputField.value;\r\n 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 let 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 let tryAgain = () => {\r\n 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 simulateEvent(telEl, 'input');\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;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(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 => {\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 apiManager.getNetworker(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 selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\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 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 type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\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 appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\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\nlet 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 let 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 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 apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await 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 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 let encoded = bytesToBase64(loginToken.token);\r\n let 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((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;\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((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 let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\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 console.warn('pageSignQR: 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>;\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 appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","window","requestAnimationFrame","append","once","disabled","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","loop","autoplay","width","height","_animation","currentFrame","pause","bytesCmp","bytes1","bytes2","len","i","fixBase64String","str","toUrl","serverTimeManager","serverTimeOffset","to","task","payload","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","i18n","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","focus","btnQr","btnNext","setCountries","countries","country","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","spanEmoji","innerHTML","el","dataset","defaultName","span","country_code","button","target","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","lastValue","hidePicker","telEl","hideTimeout","get","clearTimeout","undefined","offsetWidth","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","toggle","api_id","api_hash","settings","Object","assign","setError","console","error","h4","_i18n","subtitle","IS_TOUCH_SUPPORTED","nearestDcResult","langPack","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","ripple","uint6ToBase64","nUint6","preloader","btnBack","helpList","QRCodeStyling","rootScope","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","children","Array","from","timestamp","Date","now","diff","expires","warn","func","appStateManager"],"sourceRoot":""} \ No newline at end of file diff --git a/public/554.7d2b9a9c4096088ac7e1.chunk.js b/public/554.7d2b9a9c4096088ac7e1.chunk.js deleted file mode 100644 index 6ee88dab..00000000 --- a/public/554.7d2b9a9c4096088ac7e1.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[554],{9818:(t,e,n)=>{n.d(e,{Z:()=>h});var i=n(410),s=n(4762),o=n(5003),a=n(8799),r=n(3910),d=n(3444),c=n(1655);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,o.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",(e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();if(this.currentHash=window.location.hash,e.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!t,this.handleItem(n)):this.pushState()})),window.addEventListener("keydown",(t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||((0,r.d)(t),this.back(e.type)))}),{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",(e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(t=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{t=!1}),100)}),{passive:!0,once:!0})))}),e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||(0,a.Z)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const n=this.navigations[e];if(n.type===t)return{item:n,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return void this.backByItem(e.item,e.index)}history.back()}backByItem(t,e=this.navigations.indexOf(t)){this.manual=!0,this.navigations.splice(e,1),this.handleItem(t)}onItemAdded(t){this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushItem(t){this.navigations.push(t),this.onItemAdded(t)}unshiftItem(t){this.navigations.unshift(t),this.onItemAdded(t)}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){t&&(0,c.Z)(this.navigations,t)}removeByType(t,e=!1){for(let n=this.navigations.length-1;n>=0&&(this.navigations[n].type!==t||(this.navigations.splice(n,1),!e));--n);}};i.GO.appNavigationController=l;const h=l},4494:(t,e,n)=>{n.d(e,{Z:()=>o});var i=n(4727),s=n(1405);const o=(t,e={})=>{const n=document.createElement(e.asDiv?"div":"button");return n.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&n.classList.add("rp-square"),(0,s.ripple)(n)),e.onlyMobile&&n.classList.add("only-handhelds"),e.disabled&&n.setAttribute("disabled","true"),e.text&&n.append((0,i.i18n)(e.text)),n}},6858:(t,e,n)=>{n.d(e,{Eo:()=>I,UR:()=>v,YP:()=>E,oy:()=>L,px:()=>u,s3:()=>S,y7:()=>h});var i=n(410),s=n(3910),o=n(2738),a=n(4755),r=n(5432),d=n(4762),c=n(3512),l=n(9818);function h(t,e=!1){const n='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=n,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",n),t.lastElementChild}function u(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,h(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}i.GO.putPreloader=h;let p=t=>{let e=g.getBoundingClientRect(),{clientX:n,clientY:i}=t,s=n>=e.right?n-e.right:e.left-n,o=i>=e.bottom?i-e.bottom:e.top-i;(s>=100||o>=100)&&v()};const m=t=>{v()},v=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),f&&f.remove(),g=null,c.default.dispatchEvent("context_menu_toggle",!1)),w&&(w(),w=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.pf,m),d.IS_MOBILE_SAFARI||l.Z.removeByType("menu")};window.addEventListener("resize",(()=>{g&&v()}));let g=null,w=null,f=null;function E(t,e){v(),d.IS_MOBILE_SAFARI||l.Z.pushItem({type:"menu",onPop:t=>{v()}}),g=t,g.classList.add("active"),g.parentElement.classList.add("menu-open"),f||(f=document.createElement("div"),f.classList.add("btn-menu-overlay"),f.addEventListener(o.pf,(t=>{(0,s.d)(t),m()}))),g.parentElement.insertBefore(f,g),w=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.pf,m),c.default.dispatchEvent("context_menu_toggle",!0)}function L({pageX:t,pageY:e},n,i,s){const o=Array.from(n.children).find((t=>t.classList.contains("btn-menu-item")&&!t.classList.contains("hide")))||n;let{scrollWidth:r}=o,{scrollHeight:d}=n;const c=document.body.getBoundingClientRect(),l=c.width,h=c.height;let u=8,p=8,m=8,v=8;s&&(s.top&&s.top,s.right&&(p+=s.right),s.bottom&&(m+=s.bottom),s.left&&(v+=s.left)),i=a.ZP.isMobile?"right":"left";let g="top";const w=h-d-m,f=l-r-p,E=v,L={x:{left:t,right:Math.min(f,t-r)},intermediateX:"right"===i?E:f,y:{top:e,bottom:e-d},intermediateY:w},b={left:L.x.left+r+p<=l,right:L.x.right>=v},y={top:L.y.top+d+m<=h,bottom:L.y.bottom-m>=m};{let t;t=b[i]?L.x[i]:(i="center",L.intermediateX),n.style.left=t+"px"}{let t;t=y[g]?L.y[g]:(g="center",L.intermediateY),n.style.top=t+"px"}return n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===g?g:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:r,height:d}}let b=!1,y=0;function S(){y&&clearTimeout(y),y=window.setTimeout((()=>{y=0,b=!1}),400),b=!0}function I(t,e,n){const i=n?n.add(t):t.addEventListener.bind(t),o=n?n.removeManual.bind(n,t):t.removeEventListener.bind(t);if(d.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",(o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout((()=>{b?r():(e(o.touches[0]),r(),g&&t.addEventListener("touchend",s.d,{once:!0}))}),400))}))}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{e(n),g&&t.addEventListener("touchend",s.d,{once:!0})}:e)}},1405:(t,e,n)=>{n.r(e),n.d(e,{ripple:()=>c});var i=n(8497),s=n(9674),o=n(5432),a=n(3512),r=n(5975);let d=0;function c(t,e=(()=>Promise.resolve()),n=null,c=!1,l=t){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let h,u=document.createElement("div");u.classList.add("c-ripple"),t.classList.contains("rp-square")&&u.classList.add("is-square"),t[c?"prepend":"append"](u);const p=(t,i)=>{const a=Date.now(),r=document.createElement("div"),c=d++,l=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let t=Date.now()-a;const e=()=>{s.Z.mutate((()=>{r.remove()})),n&&n(c)};if(tr.classList.add("hiding")),Math.max(n-l/2,0)),setTimeout(e,n)}else r.classList.add("hiding"),setTimeout(e,l/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,v=!1},e&&e(c),window.requestAnimationFrame((()=>{const e=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=t-e.left,s=i-e.top,o=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(n-e.width/2)+e.width/2,2)),a=n-o/2,d=s-o/2;r.style.width=r.style.height=o+"px",r.style.left=a+"px",r.style.top=d+"px",u.append(r)}))},m=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||(0,i.Z)(e.target,"c-ripple")!==u)&&(l===t||!(0,r.Z)(e.target,l));let v=!1;if(o.IS_TOUCH_SUPPORTED){let t=()=>{h&&h()};l.addEventListener("touchstart",(e=>{if(!a.default.settings.animationsEnabled)return;if(e.touches.length>1||v||m(e))return;v=!0;let{clientX:n,clientY:i}=e.touches[0];p(n,i),l.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",(e=>{e.cancelBubble=!0,e.stopPropagation(),t(),l.removeEventListener("touchend",t)}),{once:!0})}),{passive:!0})}else l.addEventListener("mousedown",(t=>{if(![0,2].includes(t.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===l.dataset.ripple||m(t))return;if(v)return void(v=!1);let{clientX:e,clientY:n}=t;p(e,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})}),{passive:!0})}},2738:(t,e,n)=>{n.d(e,{EN:()=>r,fc:()=>a,pf:()=>o,tH:()=>d});var i=n(5432),s=n(6669);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(t,e,n={}){const i=n.listenerSetter?n.listenerSetter.add(t):t.addEventListener.bind(t);n.touchMouseDown=!0,i(o,e,n)}function r(t,e,n){t.removeEventListener(o,e,n)}function d(t){(0,s.Z)(t,o)}},6669:(t,e,n)=>{function i(t,e){const n=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(n)}n.d(e,{Z:()=>i})},3444:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(4762);function s(t){return i.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},9674:(t,e,n)=>{n.d(e,{Z:()=>d});var i=n(3035),s=n(3725),o=n(410),a=n(8487);const r=new class{constructor(){this.promises={},this.raf=i.T2.bind(null),this.scheduled=!1}do(t,e){let n=this.promises[t];return n||(this.scheduleFlush(),n=this.promises[t]=(0,s.b)()),void 0!==e&&n.then((()=>e())),n}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const n=(0,a.Z)(t),i=n?this.mutate():Promise.resolve();return void 0!==e&&(n?e():i.then((()=>e()))),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};o.GO&&(o.GO.sequentialDom=r);const d=r}}]); -//# sourceMappingURL=554.7d2b9a9c4096088ac7e1.chunk.js.map \ No newline at end of file diff --git a/public/554.7d2b9a9c4096088ac7e1.chunk.js.map b/public/554.7d2b9a9c4096088ac7e1.chunk.js.map deleted file mode 100644 index 095fc577..00000000 --- a/public/554.7d2b9a9c4096088ac7e1.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"554.7d2b9a9c4096088ac7e1.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/misc.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/sequentialDom.ts"],"sourcesContent":["/*\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_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search' | 'filters',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\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 { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nexport type MenuPositionPadding = {\r\n top?: number, \r\n right?: number, \r\n bottom?: number, \r\n left?: number\r\n};\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_BOTTOM = PADDING_TOP;\r\nconst PADDING_LEFT = 8;\r\nconst PADDING_RIGHT = PADDING_LEFT;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find(element => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\r\n\r\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\r\n let {scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\r\n if(additionalPadding) {\r\n if(additionalPadding.top) paddingTop += additionalPadding.top;\r\n if(additionalPadding.right) paddingRight += additionalPadding.right;\r\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\r\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\r\n }\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const maxTop = windowHeight - menuHeight - paddingBottom;\r\n const maxLeft = windowWidth - menuWidth - paddingRight;\r\n const minTop = paddingTop;\r\n const minLeft = paddingLeft;\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: Math.min(maxLeft, pageX - menuWidth)\r\n },\r\n intermediateX: side === 'right' ? minLeft : maxLeft,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\r\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\r\n intermediateY: maxTop,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\r\n right: sides.x.right >= paddingLeft\r\n },\r\n y: {\r\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\r\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n\r\n return {\r\n width: menuWidth,\r\n height: menuHeight\r\n };\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\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 findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\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 ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\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 { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\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 { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n"],"names":["appNavigationController","constructor","navigations","id","Date","now","manual","log","debug","currentHash","window","location","hash","isPossibleSwipe","addEventListener","e","this","onHashChange","replaceState","state","pushState","item","pop","handleItem","length","key","onEscape","back","type","capture","passive","IS_MOBILE_SAFARI","options","touches","setTimeout","once","history","scrollRestoration","good","onPop","undefined","pushItem","noBlurOnPop","findItemByType","i","index","ret","backByItem","indexOf","splice","onItemAdded","noHistory","push","unshiftItem","unshift","origin","pathname","removeItem","removeByType","single","className","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","ripple","onlyMobile","disabled","setAttribute","text","append","i18n","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","onMouseMove","rect","openedMenu","getBoundingClientRect","clientX","clientY","diffX","right","left","diffY","bottom","top","closeBtnMenu","onClick","parentElement","menuOverlay","openedMenuOnClose","IS_TOUCH_SUPPORTED","removeEventListener","openBtnMenu","menuElement","onClose","canAnimate","insertBefore","positionMenu","pageX","pageY","side","additionalPadding","getScrollWidthFromElement","Array","from","children","find","element","contains","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","width","windowHeight","height","paddingTop","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","x","Math","min","intermediateX","y","intermediateY","possibleSides","style","replace","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","callback","listenerSetter","bind","removeManual","IS_APPLE","timeout","onCancel","rippleClickId","Promise","resolve","onEnd","prepend","attachListenerTo","querySelector","handler","r","drawRipple","startTime","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","delay","max","touchStartFired","requestAnimationFrame","clickX","clickY","size","sqrt","abs","isRippleUnneeded","target","includes","tagName","touchEnd","cancelBubble","stopPropagation","dataset","CLICK_EVENT_NAME","attachClickEvent","touchMouseDown","detachClickEvent","simulateClickEvent","simulateEvent","name","event","Event","bubbles","cancelable","dispatchEvent","isSwipingBackSafari","TouchEvent","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","then","measure","mutate","mutateElement","isConnected","read","write"],"sourceRoot":""} \ No newline at end of file diff --git a/public/6.20c444db88e2e357fc97.chunk.js b/public/6.20c444db88e2e357fc97.chunk.js new file mode 100644 index 00000000..d87d170b --- /dev/null +++ b/public/6.20c444db88e2e357fc97.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[6],{112:function(t,e,i){"use strict";i.d(e,"a",(function(){return h}));var n=i(75),s=i(93),a=i(97);function o(t){return function(t){return Object(a.a)(t,"readAsArrayBuffer")}(t).then(t=>new Uint8Array(t))}var r=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{l(n.next(t))}catch(t){a(t)}}function r(t){try{l(n.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}l((n=n.apply(t,e||[])).next())}))};var l=new class{constructor(){this.blobSupported=!0;try{Object(s.a)([],"")}catch(t){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(t,e){return e instanceof Blob?o(e).then(e=>t.write(e)):t.write(e)}getFakeFileWriter(t,e){const i=[];return{write:t=>r(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;i.push(t)})),truncate:()=>{i.length=0},finalize:(n=!0)=>{const a=Object(s.a)(i,t);return n&&e&&e(a),a}}}},c=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{l(n.next(t))}catch(t){a(t)}}function r(t){try{l(n.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}l((n=n.apply(t,e||[])).next())}))};class h{constructor(t){this.dbName=t,this.useStorage=!0,n.a.test&&(this.dbName+="_test"),h.STORAGES.length&&(this.useStorage=h.STORAGES[0].useStorage),this.openDatabase(),h.STORAGES.push(this)}openDatabase(){var t;return null!==(t=this.openDbPromise)&&void 0!==t?t:this.openDbPromise=caches.open(this.dbName)}delete(t){return this.timeoutOperation(e=>e.delete("/"+t))}deleteAll(){return caches.delete(this.dbName)}get(t){return this.timeoutOperation(e=>e.match("/"+t))}save(t,e){return this.timeoutOperation(i=>i.put("/"+t,e))}getFile(t,e="blob"){return this.get(t).then(t=>{if(!t)throw"NO_ENTRY_FOUND";return t[e]()})}saveFile(t,e){e instanceof Blob||(e=Object(s.a)(e));const i=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,i).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,i)=>c(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{i(),n=!0},15e3);try{const i=yield this.openDatabase();if(!i)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(i);if(n)return;e(s)}catch(t){i(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e){const i=l.getFakeFileWriter(e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(i)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}h.STORAGES=[]},121:function(t,e,i){"use strict";i.d(e,"a",(function(){return r}));var n=i(87),s=i(92),a=i(0),o=i(36);class r extends o.b{constructor(t={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},t)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let e=this.input;if(e instanceof HTMLInputElement)e.type="tel",e.autocomplete="rr55RandomRR55";else{e.inputMode="decimal";const t=window.devicePixelRatio;if(t>1){let i;a.IS_APPLE?i=-.16*t:a.IS_ANDROID&&(i=0),e.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=t=>{i(t),Object(n.a)(this.input,!0)}}e.addEventListener("input",()=>{e.classList.remove("error");const i=this.value;let n;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,l,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(n=Object(s.a)(this.value),o=n.formatted,r=n.country,c=n.leftPattern,l=n.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),e.dataset.leftPattern=c,t.onInput&&t.onInput(n)}),e.addEventListener("paste",()=>{this.pasted=!0}),e.addEventListener("keypress",t=>{const e=t.key;if(/\D/.test(e)&&!t.metaKey&&!t.ctrlKey&&"Backspace"!==e&&("+"!==e||!t.shiftKey))return t.preventDefault(),!1})}}},33:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},36:function(t,e,i){"use strict";i.d(e,"a",(function(){return u}));var n=i(81),s=i(71),a=i(57),o=i(77);var r=i(16),l=i(31),c=i(48);let h=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),o=!0,r=(t.originalEvent||t).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const t=r.match(/([\s\S]*)<\/body>/);t&&(r=t[1].trim());let s=document.createElement("span");s.innerHTML=r;let c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const h=Object(a.a)(s,!0);if(h.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=h.value,i=h.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),h=null};var u;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(u||(u={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l,canBeEdited:c=!0}=t;let u,d,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,u=this.container.firstElementChild;else{h&&h(),this.container.innerHTML=`\n
\n `,u=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});u.addEventListener("input",()=>{Object(o.a)(u)&&(u.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=u.innerHTML,this.onFakeInput())}),e.observe(u,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(u.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=u.className+" input-field-input-fake")}if(u.setAttribute("dir","auto"),e&&(Object(r._i18n)(u,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=u.classList.contains("error"),o=l?u.value.length:[...Object(a.a)(u,!1).value].length,r=i-o,c=r<0;u.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},u.addEventListener("input",d)}this.input=u}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&u.Error)),this.input.classList.toggle("valid",!!(t&u.Valid))}setError(t){this.setState(u.Error,t)}}},44:function(t,e,i){"use strict";i.d(e,"b",(function(){return c})),i.d(e,"a",(function(){return h}));var n=i(1),s=i(41),a=i(86),o=i(82),r=i(5);class l{constructor(t,e="",i=document.createElement("div")){this.el=t,this.container=i,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const t=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===t?0:this.lastScrollPositionthis.container.append(t)),t.append(this.container))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),this.removeHeavyAnimationListener=Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)}))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.container.removeEventListener("scroll",this.onScroll,{capture:!0}),this.removeHeavyAnimationListener())}append(t){this.container.append(t)}scrollIntoViewNew(t){return Object(a.b)(Object.assign(Object.assign({},t),{container:this.container}))}}class c extends l{constructor(t,e="",i=300,n){super(t,e),this.onScrollOffset=i,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const t=this.container.scrollHeight;if(!t)return;const e=t-this.container.clientHeight,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&e-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(t){this.splitUp=t,this.log("setVirtualContainer:",t,this)}prepend(...t){(this.splitUp||this.padding||this.container).prepend(...t)}append(...t){(this.splitUp||this.padding||this.container).append(...t)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(t){this.container.scrollTop=t}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class h extends l{constructor(t,e="",i=300,s=15,a=document.createElement("div")){if(super(t,e,a),this.onScrollOffset=i,this.splitCount=s,this.container=a,this.container.classList.add("scrollable-x"),!n.IS_TOUCH_SUPPORTED){const t=t=>{!t.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=t.deltaY/4,Object(r.a)(t))};this.container.addEventListener("wheel",t,{passive:!1})}this.scrollProperty="scrollLeft"}}},46:function(t,e,i){"use strict";i.d(e,"a",(function(){return r}));var n=i(17),s=i(18),a=i(16),o=i(113);class r{constructor(t={}){const e=this.label=document.createElement("label");e.classList.add("checkbox-field"),t.restriction&&e.classList.add("checkbox-field-restriction"),t.round&&e.classList.add("checkbox-field-round"),t.disabled&&this.toggleDisability(!0);const i=this.input=document.createElement("input");let r;if(i.classList.add("checkbox-field-input"),i.type="checkbox",t.name&&(i.id="input-"+t.name),t.checked&&(i.checked=!0),t.stateKey&&n.default.getState().then(e=>{const s=Object(o.a)(e,t.stateKey);let a;a=t.stateValues?1===t.stateValues.indexOf(s):s,this.setValueSilently(a),i.addEventListener("change",()=>{let e;e=t.stateValues?t.stateValues[i.checked?1:0]:i.checked,n.default.setByKey(t.stateKey,e)})}),t.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(a._i18n)(r,t.text,t.textArgs)):e.classList.add("checkbox-without-caption"),e.append(i),t.toggle){e.classList.add("checkbox-field-toggle");const t=document.createElement("div");t.classList.add("checkbox-toggle"),e.append(t)}else{const t=document.createElement("div");t.classList.add("checkbox-box");const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.setAttributeNS(null,"viewBox","0 0 24 24");const n=document.createElementNS("http://www.w3.org/2000/svg","use");n.setAttributeNS(null,"href","#check"),n.setAttributeNS(null,"x","-1"),i.append(n);const s=document.createElement("div");s.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),t.append(a,s,i),e.append(t)}r&&e.append(r),t.withRipple?(e.classList.add("checkbox-ripple","hover-effect"),Object(s.ripple)(e,void 0,void 0,!0)):t.withHover&&e.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(t){this.setValueSilently(t);const e=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(e)}setValueSilently(t){this.input.checked=t}toggleDisability(t){return this.label.classList.toggle("checkbox-disabled",t),()=>this.toggleDisability(!t)}}},48:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const h=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void h();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(h,a)};e.a=s},55:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},57:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(30),s=i(31),a=i(72);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}n.a.getRichValue=o},61:function(t,e,i){"use strict";function n(t,e){return t.closest(e)}i.d(e,"a",(function(){return n}))},71:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},72:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return a}));const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,o,r,l,c={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),l&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:e.length}))}}return void(c.offset+=e.length)}if(1!==t.nodeType)return;const h=o===t,u=s.has(t.tagName);if(u&&i.length)e.push(i.join("")),i.splice(0,i.length),++c.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),c.offset+=e.length)}h&&!r&&i.push("");const d=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,i,o,r,l,c),m=m.nextSibling;if(h&&r&&i.push(""),d&&t.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let t=p,e=l.length;t{const n=new FileReader;n.addEventListener("loadend",t=>{i(t.target.result)}),n[e](t)})}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=6.20c444db88e2e357fc97.chunk.js.map \ No newline at end of file diff --git a/public/6.20c444db88e2e357fc97.chunk.js.map b/public/6.20c444db88e2e357fc97.chunk.js.map new file mode 100644 index 00000000..f2f2ea7b --- /dev/null +++ b/public/6.20c444db88e2e357fc97.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/blob/readBlobAs.ts"],"names":["readBlobAsUint8Array","blob","readBlobAs","readBlobAsArrayBuffer","then","buffer","Uint8Array","blobSupported","blobConstruct","e","this","fileWriter","bytes","Blob","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","length","finalize","saveToStorage","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","get","Response","headers","size","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","TelInputField","options","super","label","name","pasted","lastValue","container","classList","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","window","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","addEventListener","remove","formattedPhoneNumber","Math","abs","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","metaKey","ctrlKey","shiftKey","preventDefault","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","append","init","document","findUpAttribute","target","text","entities","plainText","originalEvent","clipboardData","getData","usePlainText","html","trim","span","createElement","curChild","nextSibling","nodeType","nodeValue","richValue","getRichValue","entities2","parseEntities","filter","_","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","height","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","state","Error","Valid","setState","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelAnimationFrame","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","Array","from","children","forEach","c","removeHeavyAnimationListener","passive","capture","removeEventListener","element","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","disabled","toggleDisability","id","checked","stateKey","getState","stateValue","stateValues","indexOf","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withRipple","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","settings","animationsEnabled","afterTimeout","removeAttribute","field","withEntities","lines","line","join","combineSameEntities","sortEntities","findUpTag","tag","closest","attribute","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","selNode","selOffset","offset","substr","parentNode","parentElement","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","hasAttribute","placeCaretAtEnd","ignoreTouchCheck","activeElement","focus","collapse","body","createTextRange","textRange","moveToElementText","reader","FileReader","result"],"mappings":"oJAQe,SAASA,EAAqBC,GAC3C,OCDa,SAA+BA,GAC5C,OAAO,OAAAC,EAAA,GAAWD,EAAM,qBDAjBE,CAAsBF,GAAMG,KAAKC,GAAU,IAAIC,WAAWD,I,0SE0DpD,UArDR,MAGL,cAFQ,KAAAE,eAAgB,EAGtB,IACE,OAAAC,EAAA,GAAc,GAAI,IAClB,MAAMC,GACNC,KAAKH,eAAgB,GAIlB,cACL,OAAOG,KAAKH,cAGP,MAAMI,EAA0DC,GACrE,OAAGA,aAAiBC,KACXb,EAAqBY,GAAOR,KAAKU,GAC/BH,EAAWI,MAAMD,IAGnBH,EAAWI,MAAMH,GAIrB,kBAAkBI,EAAkBC,GACzC,MAAMC,EAAwC,GAuB9C,MAtBuB,CACrBH,MAAaI,GAA8B,EAAD,gCACxC,IAAIT,KAAKH,cACP,MAAM,EAGRW,EAAUE,KAAKD,MAEjBE,SAAU,KACRH,EAAUI,OAAS,GAErBC,SAAU,CAACC,GAAgB,KACzB,MAAMvB,EAAO,OAAAO,EAAA,GAAcU,EAAWF,GAMtC,OAJGQ,GAAiBP,GAClBA,EAAiBhB,GAGZA,M,sSC7CA,MAAM,EAQnB,YAAoBwB,GAAA,KAAAA,SAJZ,KAAAC,YAAa,EAKhB,IAAMC,OACPjB,KAAKe,QAAU,SAGd,EAAuBG,SAASN,SACjCZ,KAAKgB,WAAa,EAAuBE,SAAS,GAAGF,YAGvDhB,KAAKmB,eACL,EAAuBD,SAASR,KAAKV,MAG/B,e,MACN,OAAyB,QAAlB,EAAAA,KAAKoB,qBAAa,QAAKpB,KAAKoB,cAAgBC,OAAOC,KAAKtB,KAAKe,QAG/D,OAAOQ,GACZ,OAAOvB,KAAKwB,iBAAkBC,GAAUA,EAAMC,OAAO,IAAMH,IAGtD,YACL,OAAOF,OAAOK,OAAO1B,KAAKe,QAGrB,IAAIQ,GACT,OAAOvB,KAAKwB,iBAAkBC,GAAUA,EAAME,MAAM,IAAMJ,IAGrD,KAAKA,EAAmBK,GAE7B,OAAO5B,KAAKwB,iBAAkBC,GAAUA,EAAMI,IAAI,IAAMN,EAAWK,IAG9D,QAAQE,EAAkBC,EAAmC,QAOlE,OAAO/B,KAAKgC,IAAIF,GAAUpC,KAAMkC,IAC9B,IAAIA,EAEF,KAAM,iBAOR,OAJgBA,EAASG,OAQtB,SAASD,EAAkBvC,GAE3BA,aAAgBY,OACnBZ,EAAO,OAAAO,EAAA,GAAcP,IAGvB,MAAMqC,EAAW,IAAIK,SAAS1C,EAAM,CAClC2C,QAAS,CACP,iBAAkB,GAAK3C,EAAK4C,QAIhC,OAAOnC,KAAKoC,KAAKN,EAAUF,GAAUlC,KAAK,IAAMH,GAG3C,iBAAoB8C,GACzB,OAAIrC,KAAKgB,WAIF,IAAIsB,QAAW,CAAMC,EAASC,IAAW,kCAC9C,IAAIC,GAAW,EACf,MAAMC,EAAUC,WAAW,KACzBH,IAEAC,GAAW,GACV,MAEH,IACE,MAAMhB,QAAczB,KAAKmB,eACzB,IAAIM,EAGF,MAFAzB,KAAKgB,YAAa,EAClBhB,KAAKoB,mBAAgBwB,EACf,YAGR,MAAMC,QAAYR,EAASZ,GAE3B,GAAGgB,EAAU,OACbF,EAAQM,GACR,MAAMC,GACNN,EAAOM,GAGTC,aAAaL,OA3BNJ,QAAQE,OAAO,mBA+BnB,cAAcV,EAAkBxB,GACrC,MAAM0C,EAAa,EAAYC,kBAAkB3C,EAAWf,GACnDS,KAAKkD,SAASpB,EAAUvC,GAAM4D,MAAM,IAAM5D,IAGnD,OAAO+C,QAAQC,QAAQS,GAGlB,qBAAqBI,GAC1B,OAAOd,QAAQe,IAAIrD,KAAKkB,SAASoC,IAAIC,IAGnC,GAFAA,EAAQvC,WAAaoC,GAEjBA,EACF,OAAOG,EAAQC,gBA3HN,EAAAtC,SAAqC,I,iCCftD,qEAYe,MAAMuC,UAAsB,IAIzC,YAAYC,EAER,IACFC,MAAM,OAAD,QACHC,MAAO,mCAEPC,KAAM,SACHH,IAVC,KAAAI,QAAS,EACV,KAAAC,UAAY,GAYjB/D,KAAKgE,UAAUC,UAAUC,IAAI,qBAE7B,IAAIC,EAAQnE,KAAKoE,MACjB,GAAGD,aAAiBE,iBAClBF,EAAMG,KAAO,MACbH,EAAMI,aAAe,qBAChB,CACLJ,EAAMK,UAAY,UAElB,MAAMC,EAAaC,OAAOC,iBAC1B,GAAGF,EAAa,EAAG,CACjB,IAAIG,EACD,WACDA,GAA8B,IAAdH,EACR,eACRG,EAAgB,GAGlBT,EAAMU,MAAMC,YAAY,mBAAoBF,EAAgB,MAG9D,MAAMG,EAAe/E,KAAKgF,iBAAiBC,KAAKjF,MAChDA,KAAKgF,iBAAoBE,IACvBH,EAAaG,GACb,YAAgBlF,KAAKoE,OAAO,IAIhCD,EAAMgB,iBAAiB,QAAS,KAE9BhB,EAAMF,UAAUmB,OAAO,SAEvB,MAAMF,EAAQlF,KAAKkF,MAUnB,IAAIG,EATSC,KAAKC,IAAIL,EAAMtE,OAASZ,KAAK+D,UAAUnD,QAC1C,IAAMZ,KAAK8D,QAAU,mBAC7B9D,KAAKgF,iBAAiBhF,KAAK+D,UAAYmB,GAGzClF,KAAK8D,QAAS,EAEd9D,KAAKwF,WAGL,IAAIC,EAAmBC,EAAsBC,EAA8BC,EAAc,GACnD,MAAnC5F,KAAKkF,MAAMW,QAAQ,MAAO,KAC3B7F,KAAKgF,iBAAiB,MAEtBK,EAAuB,YAAkBrF,KAAKkF,OAC9CO,EAAYJ,EAAqBI,UACjCC,EAAUL,EAAqBK,QAC/BE,EAAcP,EAAqBO,YACnCD,EAAcN,EAAqBS,KACnC9F,KAAKgF,iBAAiBhF,KAAK+D,UAAY0B,EAAY,IAAMA,EAAY,KAGvEtB,EAAM4B,QAAQH,YAAcA,EAI5BlC,EAAQsC,SAAWtC,EAAQsC,QAAQX,KAGrClB,EAAMgB,iBAAiB,QAAS,KAC9BnF,KAAK8D,QAAS,IAQhBK,EAAMgB,iBAAiB,WAAapF,IAElC,MAAMkG,EAAMlG,EAAEkG,IACd,GAAG,KAAKhF,KAAKgF,KAAUlG,EAAEmG,UAAWnG,EAAEoG,SAAoB,cAARF,IAAiC,MAARA,IAAelG,EAAEqG,UAE1F,OADArG,EAAEsG,kBACK,O,gCChGA,SAASC,EAAeC,EAAmBC,GACxD,GAAoB,iBAAX,EAEP,YADAD,EAAKE,UAAYD,GAKnB,MAAME,EAAaH,EAAKG,WACrBA,EACEH,EAAKI,YAAcD,EACpBA,EAAWE,YAAYJ,IAEvBD,EAAKM,YAAc,GACnBN,EAAKO,OAAON,IAGdD,EAAKO,OAAON,GAtBhB,mC,kICgBA,IAAIO,EAAO,KACTC,SAAS7B,iBAAiB,QAAUpF,IAClC,IAAI,OAAAkH,EAAA,GAAgBlH,EAAEmH,OAAQ,0BAC5B,OAIF,IAAIC,EAAcC,EADlBrH,EAAEsG,iBAIF,IAAIgB,GAAqBtH,EAAEuH,eAAiBvH,GAAGwH,cAAcC,QAAQ,cACjEC,GAAe,EAGfC,GAAgB3H,EAAEuH,eAAiBvH,GAAGwH,cAAcC,QAAQ,aAChE,GAAGE,EAAKC,OAAQ,CACdD,EAAOA,EAAK7B,QAAQ,2BAA4B,IAChD6B,EAAOA,EAAK7B,QAAQ,mBAAoB,IAExC,MAAMlE,EAAQ+F,EAAK/F,MAAM,2BACtBA,IACD+F,EAAO/F,EAAM,GAAGgG,QAGlB,IAAIC,EAAoBZ,SAASa,cAAc,QAC/CD,EAAKnB,UAAYiB,EAEjB,IAAII,EAAWF,EAAKlB,WACpB,KAAMoB,GAAU,CACd,IAAIC,EAAcD,EAASC,YACF,IAAtBD,EAASE,WACNF,EAASG,UAAUN,QACrBG,EAAS1C,UAIb0C,EAAWC,EAGb,MAAMG,EAAY,OAAAC,EAAA,GAAaP,GAAM,GACrC,GAAGM,EAAUhD,MAAMW,QAAQ,MAAO,IAAIjF,SAAWyG,EAAUxB,QAAQ,MAAO,IAAIjF,OAAQ,CACpFuG,EAAOe,EAAUhD,MACjBkC,EAAWc,EAAUd,SACrBK,GAAe,EAEf,IAAIW,EAAY,IAAkBC,cAAclB,GAChDiB,EAAYA,EAAUE,OAAOvI,GAAa,uBAARA,EAAEwI,GAAsC,2BAARxI,EAAEwI,GACpE,IAAkBC,cAAcpB,EAAUgB,IAI3CX,IACDN,EAAOE,EACPD,EAAW,IAAkBiB,cAAclB,GAC3CC,EAAWA,EAASkB,OAAOvI,GAAa,uBAARA,EAAEwI,GAAsC,2BAARxI,EAAEwI,IAGpEpB,EAAO,IAAkBsB,cAActB,EAAM,CAACC,aAE9C1C,OAAOsC,SAAS0B,YAAY,cAAc,EAAOvB,KAGnDJ,EAAO,MAoBT,IAAY4B,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,MAAU,KAuRP,IAlQf,MAeE,YAAmBjF,EAA6B,IAA7B,KAAAA,UACjB1D,KAAKgE,UAAYgD,SAASa,cAAc,OACxC7H,KAAKgE,UAAUC,UAAUC,IAAI,eAE7BlE,KAAK4I,SAAWlF,EAAQkF,SACxB5I,KAAK6I,SAAWnF,EAAQmF,cAECjG,IAAtBc,EAAQoF,gBAAoDlG,IAAzBc,EAAQqF,eAC5CrF,EAAQqF,aAAezD,KAAK0D,IAAI,GAAI1D,KAAK2D,MAAMvF,EAAQoF,UAAY,KAGrE,MAAM,YAACI,EAAW,UAAEJ,EAAS,aAAEC,EAAY,KAAElF,EAAI,UAAEwD,EAAS,YAAE8B,GAAc,GAAQzF,EAEpF,IAEIU,EAyEAgF,EA3EAxF,EAAQF,EAAQE,OAASF,EAAQ2F,UAGrC,GAAIhC,EA0CFrH,KAAKgE,UAAUyC,UAAY,8BACN5C,EAAO,SAASA,KAAU,yBAAyBD,EAAQ,cAAgB,wCAGhGQ,EAAQpE,KAAKgE,UAAUsF,sBA9CV,CACVvC,GACDA,IAGF/G,KAAKgE,UAAUyC,UAAY,iCACH8C,SAASJ,+CAGjC/E,EAAQpE,KAAKgE,UAAUsF,kBACvB,MAAME,EAAW,IAAIC,iBAAiB,KAGjCL,GACDA,MAKJhF,EAAMe,iBAAiB,QAAS,KAC3B,OAAAuE,EAAA,GAAatF,KACdA,EAAMqC,UAAY,IAGjBzG,KAAK2J,YACN3J,KAAK2J,UAAUlD,UAAYrC,EAAMqC,UACjCzG,KAAK4J,iBAKTJ,EAASK,QAAQzF,EAAO,CAAC0F,eAAe,EAAMC,WAAW,EAAMC,SAAS,IAErEtG,EAAQuG,UACT7F,EAAMH,UAAUC,IAAI,aAAc,gBAGlClE,KAAK2J,UAAY3C,SAASa,cAAc,OACxC7H,KAAK2J,UAAUO,aAAa,kBAAmB,QAC/ClK,KAAK2J,UAAUQ,UAAY/F,EAAM+F,UAAY,2BAqBjD,GAVA/F,EAAM8F,aAAa,MAAO,QAEvBhB,IACD,gBAAM9E,EAAO8E,OAAatG,EAAW,eAElC5C,KAAK2J,WACN,gBAAM3J,KAAK2J,UAAWT,OAAatG,EAAW,gBAI/CgB,GAASsF,EAAa,CACvB,MAAMkB,EAASpD,SAASa,cAAc,OACtCuC,EAAOnG,UAAUC,IAAI,sBACrBlE,KAAKgE,UAAU8C,OAAOsD,GAUxB,GAPGxG,IACD5D,KAAK4D,MAAQoD,SAASa,cAAc,SACpC7H,KAAKwF,WACLxF,KAAKgE,UAAU8C,OAAO9G,KAAK4D,QAI1BkF,EAAW,CACZ,MAAMuB,EAAUrK,KAAKgE,UAAUsG,iBAC/B,IAAIC,GAAgB,EAEpBnB,EAAe,KACb,MAAMoB,EAAWpG,EAAMH,UAAUwG,SAAS,SAEpCC,EAAcrD,EAAajD,EAA2Bc,MAAMtE,OAAS,IAAI,OAAAuH,EAAA,GAAa/D,GAAO,GAAOc,OAAOtE,OAC3G+J,EAAO7B,EAAY4B,EACnBE,EAAUD,EAAO,EACvBvG,EAAMH,UAAU4G,OAAO,QAASD,GAI7BA,GAAWD,GAAQ5B,GACpB/I,KAAKwF,WACL6E,EAAQvD,OAAO,KAAKgC,EAAY4B,MAC5BH,IAAeA,GAAgB,KAC1BC,IAAaI,GAAYL,KAClCvK,KAAKwF,WACL+E,GAAgB,IAIpBnG,EAAMe,iBAAiB,QAASiE,GAGlCpJ,KAAKoE,MAAQA,EAGR,SACDpE,KAAKkF,QAINlF,KAAK0D,QAAQ2D,UACbrH,KAAKoE,MAA2B0G,SClQxB,SAA+BC,GAC5C,MAAMC,EAAQhE,SAASiE,cACvBD,EAAME,mBAAmBH,GACzB,MAAMI,EAAMzG,OAAO0G,eACnBD,EAAIE,kBACJF,EAAIG,SAASN,GD+PTO,CAAsBvL,KAAKoE,QAIxB,WACLpE,KAAK4D,MAAMiD,YAAc,GACtB7G,KAAK0D,QAAQ2F,UACdrJ,KAAK4D,MAAM6C,UAAYzG,KAAK0D,QAAQ2F,UAEpCrJ,KAAK4D,MAAMkD,OAAO,eAAK9G,KAAK0D,QAAQE,MAAO5D,KAAK0D,QAAQ8H,eAIrD,YAAYC,GAAY,GAC7B,MAAOC,aAAcC,GAAiC3L,KAAK2J,UAMrDiC,GAAiB5L,KAAKoE,MAAMS,MAAMgH,OAAOhG,QAAQ,KAAM,IAC7D,GAAG+F,IAAkBD,EACnB,OAGF,MACMG,EAAqBxG,KAAK2D,MADG,GAEJ3D,KAAKyG,IAAIzG,KAAKC,IAAIoG,EAAYC,KAI7D5L,KAAKoE,MAAMS,MAAMiH,mBAAwBA,EAAH,KAEnCL,IACDzL,KAAKoE,MAAMS,MAAMgH,OAASF,EAAYA,EAAY,KAAO,IAI3D,YAAc3L,KAAKoE,MADD,sBACmB,EAAM0H,EAAoB,KAC7D9L,KAAKoE,MAAMH,UAAUmB,OAFL,wBAMpB,YACE,OAAOpF,KAAK0D,QAAQ2D,UAAarH,KAAKoE,MAA2Bc,MAAQ,OAAAiD,EAAA,GAAanI,KAAKoE,OAAO,GAAOc,MAI3G,UAAUA,GACRlF,KAAKgF,iBAAiBE,GAAO,GAE7B,YAAclF,KAAKoE,MAAO,SAGrB,iBAAiBc,EAAe8G,GAAgB,GAClDhM,KAAK0D,QAAQ2D,UACbrH,KAAKoE,MAA2Bc,MAAQA,GAEzClF,KAAKoE,MAAMqC,UAAYvB,EAEpBlF,KAAK2J,YACN3J,KAAK2J,UAAUlD,UAAYvB,EAExB8G,GACDhM,KAAK4J,gBAMN,YACL,OAAO5J,KAAKkF,QAAUlF,KAAKiM,cAGtB,UACL,OAAQjM,KAAKoE,MAAMH,UAAUwG,SAAS,YAClCzK,KAAK6I,UAAY7I,KAAK6I,eACtB7I,KAAK4I,WAAa,OAAAc,EAAA,GAAa1J,KAAKoE,QAGnC,kBACL,OAAOpE,KAAKkM,WAAalM,KAAKmM,YAGzB,cAAcjH,EAAQ,GAAIkH,GAAS,GACpCpM,KAAK0D,QAAQ2D,YACfnC,EAAQ,IAAkBuD,cAAcvD,IAGvCkH,EACDpM,KAAKgF,iBAAiBE,GAAO,GAE7BlF,KAAKkF,MAAQA,EAIV,iBAAiBA,EAAqC,GAAIkH,GAAS,GACxEpM,KAAKiM,cAAgB/G,EACrBlF,KAAKqM,cAAcnH,EAAOkH,GAGrB,SAASE,EAAmB1I,GAC9BA,IACD5D,KAAK4D,MAAMiD,YAAc,GACzB7G,KAAK4D,MAAMkD,OAAO,eAAKlD,EAAO5D,KAAK0D,QAAQ8H,gBAG7CxL,KAAKoE,MAAMH,UAAU4G,OAAO,WAAYyB,EAAQ3D,EAAW4D,QAC3DvM,KAAKoE,MAAMH,UAAU4G,OAAO,WAAYyB,EAAQ3D,EAAW6D,QAGtD,SAAS5I,GACd5D,KAAKyM,SAAS9D,EAAW4D,MAAO3I,M,gCErXpC,8GAsDO,MAAM8I,EAsBX,YAAmB3B,EAAiB4B,EAAY,GAAW3I,EAAyBgD,SAASa,cAAc,QAAxF,KAAAkD,KAAwC,KAAA/G,YAlBpD,KAAA4I,gBAA0B,EAE1B,KAAAC,mBAA6B,EAC7B,KAAAC,oBAA8B,EAM9B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAqE7B,KAAAC,SAAW,KAOhB,GAAGjN,KAAK+M,2BAMN,OALG/M,KAAK4M,iBACNlI,OAAOwI,qBAAqBlN,KAAK4M,sBAGnC5M,KAAKgN,yBAA0B,IAK5BhN,KAAKmN,eAAkBnN,KAAKoN,kBAAsBpN,KAAKqN,SAAYrN,KAAKsN,sBAC1EtN,KAAK4M,iBAAiBlI,OAAOwI,qBAAqBlN,KAAK4M,iBAC1D5M,KAAK4M,gBAAkBlI,OAAO6I,sBAAsB,KAClDvN,KAAK4M,gBAAkB,EAEvB,MAAMY,EAAiBxN,KAAKgE,UAAUhE,KAAKyN,gBAC3CzN,KAAK8M,oBAAsB9M,KAAK6M,qBAAuBW,EAAiB,EAAKxN,KAAK6M,mBAAqBW,EAAiB,GAAK,EAC7HxN,KAAK6M,mBAAqBW,EAEvBxN,KAAKsN,oBAAmD,IAA7BtN,KAAK8M,qBACjC9M,KAAKsN,qBAGJtN,KAAK0N,kBACN1N,KAAK0N,uBA3FT1N,KAAKgE,UAAUC,UAAUC,IAAI,cAE7BlE,KAAK+L,IAAM,YAAO,UAAYY,EAAY,IAAMA,EAAY,IAAK,IAASJ,OAEvExB,IACD4C,MAAMC,KAAK7C,EAAG8C,UAAUC,QAAQC,GAAK/N,KAAKgE,UAAU8C,OAAOiH,IAE3DhD,EAAGjE,OAAO9G,KAAKgE,YAKZ,eACFhE,KAAKgO,+BAIRtJ,OAAOS,iBAAiB,SAAUnF,KAAKiN,SAAU,CAACgB,SAAS,IAC3DjO,KAAKgE,UAAUmB,iBAAiB,SAAUnF,KAAKiN,SAAU,CAACgB,SAAS,EAAMC,SAAS,IAElFlO,KAAKgO,6BAA+B,YAAuB,KACzDhO,KAAK+M,4BAA6B,EAE/B/M,KAAK4M,kBACN5M,KAAKgN,yBAA0B,EAC/BtI,OAAOwI,qBAAqBlN,KAAK4M,mBAElC,KACD5M,KAAK+M,4BAA6B,EAE/B/M,KAAKgN,0BACNhN,KAAKiN,WACLjN,KAAKgN,yBAA0B,MAK9B,kBACDhN,KAAKgO,+BAITtJ,OAAOyJ,oBAAoB,SAAUnO,KAAKiN,UAC1CjN,KAAKgE,UAAUmK,oBAAoB,SAAUnO,KAAKiN,SAAU,CAACiB,SAAS,IAEtElO,KAAKgO,gCAGA,OAAOI,GACZpO,KAAKgE,UAAU8C,OAAOsH,GAGjB,kBAAkB1K,GAEvB,OAAO,YAAiB,OAAD,wBAClBA,GAAO,CACVM,UAAWhE,KAAKgE,cA4CP,MAAMqK,UAAmB3B,EAKtC,YAAY3B,EAAiB4B,EAAY,GAAW2B,EAAiB,IAAKC,GACxE5K,MAAMoH,EAAI4B,GADwC,KAAA2B,iBAF7C,KAAAE,UAAiC,CAACC,KAAK,EAAMC,QAAQ,GAsBrD,KAAAhB,iBAAmB,KACxB,IAAK1N,KAAKmN,gBAAkBnN,KAAKoN,iBAAmB,OAEpD,GAAGpN,KAAK+M,2BAEN,YADA/M,KAAKiN,WAIP,MAAMvB,EAAe1L,KAAKgE,UAAU0H,aACpC,IAAIA,EACF,OAGF,MACMiD,EAAejD,EADA1L,KAAKgE,UAAU4K,aAE9BC,EAAY7O,KAAK6M,mBAIpB7M,KAAKmN,eAAiB0B,GAAa7O,KAAKsO,gBAAkBtO,KAAK8M,qBAAuB,GACvF9M,KAAKmN,gBAGJnN,KAAKoN,kBAAqBuB,EAAeE,GAAc7O,KAAKsO,gBAAkBtO,KAAK8M,qBAAuB,GAC3G9M,KAAKoN,oBAlCPpN,KAAKgE,UAAUC,UAAUC,IAAI,gBAC7BlE,KAAK8O,eACL9O,KAAKyN,eAAiB,YAGjB,oBAAoB1C,GACzB/K,KAAKqN,QAAUtC,EACf/K,KAAK+L,IAAI,uBAAwBhB,EAAI/K,MA+BhC,WAAW+O,IACf/O,KAAKqN,SAAWrN,KAAKgP,SAAWhP,KAAKgE,WAAWiL,WAAWF,GAGvD,UAAUA,IACd/O,KAAKqN,SAAWrN,KAAKgP,SAAWhP,KAAKgE,WAAW8C,UAAUiI,GAGtD,mBACL,OAAO/O,KAAK0L,aAAepG,KAAK2D,MAAMjJ,KAAK6O,UAAY7O,KAAKgE,UAAUkL,cAGxE,qBACE,OAAOlP,KAAKmP,oBAAsB,EAGpC,cAAcC,GACZpP,KAAKgE,UAAU6K,UAAYO,EAG7B,gBAEE,OAAOpP,KAAKgE,UAAU6K,UAGxB,mBACE,OAAO7O,KAAKgE,UAAU0H,cAInB,MAAM2D,UAAoB3C,EAC/B,YAAY3B,EAAiB4B,EAAY,GAAW2B,EAAiB,IAAYgB,EAAa,GAAWtL,EAAyBgD,SAASa,cAAc,QAKvJ,GAJAlE,MAAMoH,EAAI4B,EAAW3I,GAD6B,KAAAsK,iBAA6B,KAAAgB,aAAwB,KAAAtL,YAGvGhE,KAAKgE,UAAUC,UAAUC,IAAI,iBAEzB,qBAAoB,CACtB,MAAMqL,EAAsBxP,KACtBA,EAAEyP,QAAUxP,KAAKgE,UAAUyL,YAAczP,KAAKgE,UAAU0L,cAC1D1P,KAAKgE,UAAU2L,YAAc5P,EAAE6P,OAAS,EACxC,YAAY7P,KAIhBC,KAAKgE,UAAUmB,iBAAiB,QAASoK,EAAoB,CAACtB,SAAS,IAGzEjO,KAAKyN,eAAiB,gB,gCCrR1B,uEAyBe,MAAMoC,EAKnB,YAAYnM,EAAgC,IAC1C,MAAME,EAAQ5D,KAAK4D,MAAQoD,SAASa,cAAc,SAClDjE,EAAMK,UAAUC,IAAI,kBAEjBR,EAAQoM,aACTlM,EAAMK,UAAUC,IAAI,8BAGnBR,EAAQuF,OACTrF,EAAMK,UAAUC,IAAI,wBAGnBR,EAAQqM,UACT/P,KAAKgQ,kBAAiB,GAGxB,MAAM5L,EAAQpE,KAAKoE,MAAQ4C,SAASa,cAAc,SAoClD,IAAID,EAWJ,GA9CAxD,EAAMH,UAAUC,IAAI,wBACpBE,EAAME,KAAO,WACVZ,EAAQG,OACTO,EAAM6L,GAAK,SAAWvM,EAAQG,MAG7BH,EAAQwM,UACT9L,EAAM8L,SAAU,GAGfxM,EAAQyM,UACT,UAAgBC,WAAW1Q,KAAK4M,IAC9B,MAAM+D,EAAa,YAAgB/D,EAAO5I,EAAQyM,UAClD,IAAID,EAEFA,EADCxM,EAAQ4M,YAC6C,IAA5C5M,EAAQ4M,YAAYC,QAAQF,GAE5BA,EAGZrQ,KAAKgF,iBAAiBkL,GAEtB9L,EAAMe,iBAAiB,SAAU,KAC/B,IAAID,EAEFA,EADCxB,EAAQ4M,YACD5M,EAAQ4M,YAAYlM,EAAM8L,QAAU,EAAI,GAExC9L,EAAM8L,QAGhB,UAAgBM,SAAS9M,EAAQyM,SAAUjL,OAM9CxB,EAAQyD,MACTS,EAAO5H,KAAK4H,KAAOZ,SAASa,cAAc,QAC1CD,EAAK3D,UAAUC,IAAI,oBACnB,gBAAM0D,EAAMlE,EAAQyD,KAAMzD,EAAQ+M,WAElC7M,EAAMK,UAAUC,IAAI,4BAGtBN,EAAMkD,OAAO1C,GAEVV,EAAQmH,OAAQ,CACjBjH,EAAMK,UAAUC,IAAI,yBAEpB,MAAM2G,EAAS7D,SAASa,cAAc,OACtCgD,EAAO5G,UAAUC,IAAI,mBACrBN,EAAMkD,OAAO+D,OACR,CACL,MAAM6F,EAAM1J,SAASa,cAAc,OACnC6I,EAAIzM,UAAUC,IAAI,gBAElB,MAAMyM,EAAW3J,SAAS4J,gBAAgB,6BAA8B,OACxED,EAAS1M,UAAUC,IAAI,sBACvByM,EAASE,eAAe,KAAM,UAAW,aACzC,MAAMC,EAAM9J,SAAS4J,gBAAgB,6BAA8B,OACnEE,EAAID,eAAe,KAAM,OAAQ,UACjCC,EAAID,eAAe,KAAM,IAAK,MAC9BF,EAAS7J,OAAOgK,GAEhB,MAAMC,EAAK/J,SAASa,cAAc,OAClCkJ,EAAG9M,UAAUC,IAAI,2BAEjB,MAAMkG,EAASpD,SAASa,cAAc,OACtCuC,EAAOnG,UAAUC,IAAI,uBAErBwM,EAAI5J,OAAOsD,EAAQ2G,EAAIJ,GAEvB/M,EAAMkD,OAAO4J,GAGZ9I,GACDhE,EAAMkD,OAAOc,GAGZlE,EAAQsN,YACTpN,EAAMK,UAAUC,IAAI,kBAAmB,gBACvC,iBAAON,OAAOhB,OAAWA,GAAW,IAE5Bc,EAAQuN,WAChBrN,EAAMK,UAAUC,IAAI,gBAIxB,cACE,OAAOlE,KAAKoE,MAAM8L,QAGpB,YAAYA,GAKVlQ,KAAKgF,iBAAiBkL,GAEtB,MAAMgB,EAAQ,IAAIC,MAAM,SAAU,CAACC,SAAS,EAAMC,YAAY,IAC9DrR,KAAKoE,MAAMkN,cAAcJ,GAGpB,iBAAiBhB,GACtBlQ,KAAKoE,MAAM8L,QAAUA,EAGhB,iBAAiBqB,GAEtB,OADAvR,KAAK4D,MAAMK,UAAU4G,OAAO,oBAAqB0G,GAC1C,IAAMvR,KAAKgQ,kBAAkBuB,M,gCC5JxC,YAQA,MAAMC,EAAgB,CACpBpD,EACAjE,EACAsH,EACAC,EACAC,EACAC,KAEA,MAAM,QAAClP,EAAO,IAAEmP,GAAOzD,EAAQrI,QAgB/B,QAfenD,IAAZF,GACDK,cAAcL,QAGLE,IAARiP,IACDnN,OAAOwI,sBAAsB2E,GACzBD,UACKxD,EAAQrI,QAAQ8L,KAQxBD,GAAW,UAAUE,SAASC,mBAAqBL,EAMpD,YALAtD,EAAQrI,QAAQ8L,IAAM,GAAKnN,OAAO6I,sBAAsB,YAC/Ca,EAAQrI,QAAQ8L,IACvBL,EAAcpD,EAASjE,EAAWsH,EAAUC,EAAUC,EAAiBC,EAAU,MAMlFH,GAAYtH,GACbiE,EAAQnK,UAAUC,IAAIiG,GAGxB,MAAM6H,EAAe,YACZ5D,EAAQrI,QAAQrD,SACnB+O,GAAYtH,GACdiE,EAAQnK,UAAUmB,OAAO,YAAa+E,GAGxCiE,EAAQnK,UAAUmB,OAAO,aAEzBuM,GAAmBA,KAGrB,IAAI,UAAUG,SAASC,oBAAsBL,EAG3C,OAFAtD,EAAQnK,UAAUmB,OAAO,YAAa,kBACtC4M,IAIF5D,EAAQnK,UAAUC,IAAI,aAEtBkK,EAAQnK,UAAU4G,OAAO,aAAc4G,GACvCrD,EAAQrI,QAAQrD,QAAU,GAAKC,WAAWqP,EAAcN,IAG3C,O,gCC9DA,SAAS1B,EAAiBjB,EAAyBwC,GAOhE,OANGA,EACDxC,EAASjB,QAAQ/C,GAAMA,EAAGb,aAAa,WAAY,SAEnD6E,EAASjB,QAAQ/C,GAAMA,EAAGkH,gBAAgB,aAGrC,IAAMjC,EAAiBjB,GAAWwC,GAb3C,mC,gCCAA,8DAgBe,SAASpJ,EAAa+J,EAAoBC,GAAe,GACtE,MAAMC,EAAkB,GAClBC,EAAiB,GAEjBjL,EAA4B+K,EAAe,QAAKvP,EACtD,YAAoBsP,EAAOE,EAAOC,OAAMzP,OAAWA,EAAWwE,GAC3DiL,EAAKzR,QACNwR,EAAM1R,KAAK2R,EAAKC,KAAK,KAGvB,IAAIpN,EAAQkN,EAAME,KAAK,MAkBvB,OAjBApN,EAAQA,EAAMW,QAAQ,UAAW,MAE9BuB,aAAQ,EAARA,EAAUxG,UASX,IAAkB2R,oBAAoBnL,GACtC,IAAkBoL,aAAapL,IAK1B,CAAClC,QAAOkC,YAGjB,IAAee,aAAeA,G,gCCzCf,SAASsK,EAAU1H,EAAS2H,GACzC,OAAO3H,EAAG4H,QAAQD,GAPpB,mC,gCCMe,SAASzL,EAAgB8D,EAAS6H,GAC/C,OAAO7H,EAAG4H,QAAQ,IAAIC,MAPxB,mC,gCCAA,oEAoBO,MAAMC,EAAsD,CACjEC,KAAM,CACJnR,MAAO,+IACPoR,WAAY,qBAEdC,UAAW,CACTrR,MAAO,+BACPoR,WAAY,0BAEdE,OAAQ,CACNtR,MAAO,2BACPoR,WAAY,uBAEdG,UAAW,CACTvR,MAAO,gDACPoR,WAAY,oBAEdI,cAAe,CACbxR,MAAO,0CACPoR,WAAY,uBAEdK,KAAM,CACJzR,MAAO,iBACPoR,WAAY,wBAEdM,YAAa,CACX1R,MAAO,WACPoR,WAAY,4BAEdO,QAAS,CACP3R,MAAO,qBACPoR,WAAY,yBAoBVQ,EAAkB,IAAIC,IAAI,CAC9B,MACA,IACA,KACA,KACA,UACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGa,SAASC,EAAoBjN,EAAmB4L,EAAiBC,EAAgBqB,EAAgBC,EAAoBvM,EAA4BwM,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlBpN,EAAKwB,SAAgB,CACtB,IAAIC,EAAYzB,EAAKyB,UAerB,GANGyL,IAAYlN,EACb6L,EAAK3R,KAAKuH,EAAU4L,OAAO,EAAGF,GAAa,IAAS1L,EAAU4L,OAAOF,IAErEtB,EAAK3R,KAAKuH,GAGTb,GAAYa,EAAUrH,QACpB4F,EAAKsN,WAAY,CAClB,MAAMC,EAAgBvN,EAAKuN,cAG3B,IAAI,MAAMzP,KAAQuO,EAAc,CAC9B,MAAMH,EAAMG,EAAavO,GACnBqO,EAAUoB,EAAcpB,QAAQD,EAAI/Q,MAAQ,uBACF,QAA7CgR,aAAO,EAAPA,EAASqB,aAAa,sBAUH,yBAAnBtB,EAAIK,WACL3L,EAAS1G,KAAK,CACZ6H,EAAGmK,EAAIK,WACPkB,IAAMtB,EAA8BuB,KACpCN,OAAQA,EAAOA,OACfhT,OAAQqH,EAAUrH,SAEO,6BAAnB8R,EAAIK,WACZ3L,EAAS1G,KAAK,CACZ6H,EAAGmK,EAAIK,WACPa,OAAQA,EAAOA,OACfhT,OAAQqH,EAAUrH,OAClBuT,QAAUxB,EAAwB5M,QAAQqO,OAAOC,aAGnDjN,EAAS1G,KAAK,CACZ6H,EAAGmK,EAAIK,WACPa,OAAQA,EAAOA,OACfhT,OAAQqH,EAAUrH,WAQ5B,YADAgT,EAAOA,QAAU3L,EAAUrH,QAI7B,GAAqB,IAAlB4F,EAAKwB,SACN,OAGF,MAAMsM,EAAaZ,IAAYlN,EACzB+N,EAAUhB,EAAgBiB,IAAIhO,EAAKiO,SACzC,GAAGF,GAAWlC,EAAKzR,OACjBwR,EAAM1R,KAAK2R,EAAKC,KAAK,KACrBD,EAAKqC,OAAO,EAAGrC,EAAKzR,UAClBgT,EAAOA,YACJ,GAAGpN,aAAgBmO,iBAAkB,CAC1C,MAAMC,EAAMpO,EAAKoO,IACdA,IACDvC,EAAK3R,KAAKkU,GACVhB,EAAOA,QAAUgB,EAAIhU,QAItB0T,IAAeX,GAChBtB,EAAK3R,KAAK,KAGZ,MAAMmU,EAAcrO,EAAKsO,QArHH,iCAsHhBC,EAAoB3N,aAAQ,EAARA,EAAUxG,OAEpC,IAAIkH,EAAWtB,EAAKE,WACpB,KAAMoB,GACJ2L,EAAoB3L,EAAUsK,EAAOC,EAAMqB,EAASC,EAAWvM,EAAUwM,GACzE9L,EAAWA,EAASC,YAOtB,GAJGuM,GAAcX,GACftB,EAAK3R,KAAK,KAGTmU,GAAerO,EAAKuB,cACrBsK,EAAK3R,KAAK,OACRkT,EAAOA,YAGgBhR,IAAtBmS,GACD,IAAI,IAAIC,EAAID,EAAmBnU,EAASwG,EAASxG,OAAQoU,EAAIpU,IAAUoU,IACnE5N,EAAS4N,GAAGpU,OAKpB,MAAMqU,EAAY5C,EAAKzR,OACpB2T,GAAWU,IACZ7C,EAAM1R,KAAK2R,EAAKC,KAAK,KACrBD,EAAKqC,OAAO,EAAGO,KACbrB,EAAOA,QAGRqB,GAA8B,MAAjBzO,EAAKiO,SAAmBjO,EAAKuB,cAC3CqK,EAAM1R,KAAK,MACTkT,EAAOA,U,gCC9Mb,8CAQe,SAASlK,EAAa0E,GACnC,OAAGA,EAAQ8G,aAAa,oBAA0C,UAApB9G,EAAQqG,SAI5C,YAAarG,GAAS,GAAOlJ,MAAMyC,QAElCyG,EAA6BlJ,MAAMyC,S,gCCfhD,6CAae,SAASwN,EAAgBpK,EAAiBqK,GAAmB,GAC1E,IAAG,sBAAwBA,GAAoBpO,SAASqO,gBAAkBtK,EAK1E,GADAA,EAAGuK,aAC+B,IAAxB5Q,OAAO0G,mBAAgE,IAAzBpE,SAASiE,YAA6B,CAC5F,IAAID,EAAQhE,SAASiE,cACrBD,EAAME,mBAAmBH,GACzBC,EAAMuK,UAAS,GACf,IAAIpK,EAAMzG,OAAO0G,eACjBD,EAAIE,kBACJF,EAAIG,SAASN,QAER,QAA4C,IAAlChE,SAASwO,KAAKC,gBAAiC,CAE9D,IAAIC,EAAY1O,SAASwO,KAAKC,kBAC9BC,EAAUC,kBAAkB5K,GAC5B2K,EAAUH,UAAS,GACnBG,EAAU5K,Y,gCCpBC,SAAStL,EAAWD,EAAYwC,GAE7C,OAAO,IAAIO,QAAcC,IACvB,MAAMqT,EAAS,IAAIC,WACnBD,EAAOzQ,iBAAiB,UAAYpF,IAElCwC,EAAQxC,EAAEmH,OAAO4O,UAEnBF,EAAO7T,GAAQxC,KApBnB","file":"6.20c444db88e2e357fc97.chunk.js","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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\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\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\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 simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n private removeHeavyAnimationListener: () => void;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n\r\n this.removeHeavyAnimationListener();\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\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 appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\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 rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\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 findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \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\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \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 * 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 { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\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 getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\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\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/642.6689d152002321243b91.chunk.js b/public/642.6689d152002321243b91.chunk.js deleted file mode 100644 index feebd221..00000000 --- a/public/642.6689d152002321243b91.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[642],{4642:(e,a,s)=>{s.r(a),s.d(a,{default:()=>f});const c="zero",r="one",t="two",n="few",u="many";function i(e,a){switch(e){case 27764:if(a%10==1&&(a%100<11||a%100>19))return r;if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return n;break;case 27766:if(0==a)return c;if(a%10==1&&a%100!=11)return r;break;case 25465:if(2==a)return t;if(3==a)return n;if(0==a)return c;if(1==a)return r;if(6==a)return u;break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return u;break;case 7041896:if(0==a)return c;if(1==a)return r;break;case 7563369:if(a>=2&&a<=10)return n;if(a>=0&&a<=1)return r;break;case 26725:if(2==a)return t;if(1==a)return r;if(0!=a&&a%10==0)return u;break;case 25459:case 29547:if(1==a)return r;if(a>=2&&a<=4)return n;break;case 25202:if(0!=a&&a%1e6==0)return u;if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return r;if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return t;if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return n;break;case 29548:if(a%100==2)return t;if(a%100==1)return r;if(a%100>=3&&a%100<=4)return n;break;case 7102823:if(0==a)return c;if(a>=0&&a<=2&&0!=a&&2!=a)return r;break;case 28780:if(1==a)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return u;break;case 26468:if(2==a||12==a)return t;if(1==a||11==a)return r;if(a>=3&&a<=10||a>=13&&a<=19)return n;break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return r;break;case 28011:if(a%10==1&&11!=a)return r;break;case 28020:if(1==a)return r;if(a%100>=11&&a%100<=19)return u;if(0==a||a%100>=2&&a%100<=10)return n;break;case 28015:case 29295:if(1==a)return r;if(0==a||1!=a&&a%100>=1&&a%100<=19)return n;break;case 26465:if(2==a)return t;if(1==a)return r;if(a>=3&&a<=6)return n;if(a>=7&&a<=10)return u;break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return r;break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return t;if(1==a)return r;break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return r;break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return r;break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return r;break;case 24946:if(2==a)return t;if(1==a)return r;if(0==a)return c;if(a%100>=3&&a%100<=10)return n;if(a%100>=11&&a%100<=99)return u}return"other"}const f={PluralRules:class{constructor(e){this.select=i.bind(null,function(e){let a=0;for(let s=0;s 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set2\r\n case 0x6c76: // lv\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set3\r\n case 0x6379: // cy\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set5\r\n case 0x6b7368: // ksh\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set6\r\n case 0x736869: // shi\r\n if ((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if ((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set7\r\n case 0x6865: // he\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set9\r\n case 0x6272: // br\r\n if ((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if (((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if (((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if ((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set10\r\n case 0x736c: // sl\r\n if ((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if ((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set11\r\n case 0x6c6167: // lag\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set12\r\n case 0x706c: // pl\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set13\r\n case 0x6764: // gd\r\n if ((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if ((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set14\r\n case 0x6776: // gv\r\n if ((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set15\r\n case 0x6d6b: // mk\r\n if (((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set16\r\n case 0x6d74: // mt\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if ((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set18\r\n case 0x6761: // ga\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if ((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if (((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if ((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set22\r\n case 0x747a6d: // tzm\r\n if (((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set24\r\n case 0x6172: // ar\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if (((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n \r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"names":["NumberPluralizationFormZero","NumberPluralizationFormOne","NumberPluralizationFormTwo","NumberPluralizationFormFew","NumberPluralizationFormMany","numberPluralizationForm","lc","n","PluralRules","constructor","code","this","select","bind","i","length","charCodeAt","languageCodehash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/664.22c6afb6ed739f8b3773.chunk.js b/public/664.22c6afb6ed739f8b3773.chunk.js deleted file mode 100644 index 5b0fffe4..00000000 --- a/public/664.22c6afb6ed739f8b3773.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackChunktweb=this.webpackChunktweb||[]).push([[664],{4489:(e,t,s)=>{"use strict";s.d(t,{Z:()=>n});var i=s(503);class n extends i.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let s=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===s)return;s=n}))}}},4425:(e,t,s)=>{"use strict";s.d(t,{Z:()=>n});var i=s(2897);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=i.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},i.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,s)=>{"use strict";s.d(t,{Z:()=>n});var i=s(2897);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const s=e.input;s.addEventListener("blur",(()=>{this.playAnimation(0)})),s.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const s=this.needFrame>t?-1:1;this.animation.setDirection(s),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.Z.waitForFirstFrame(e)))),i.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),i.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});var i=s(3910),n=s(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,i.d)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const s=document.createElement("input");s.classList.add("stealthy"),s.tabIndex=-1,s.type="password",t.parentElement.prepend(s),t.parentElement.insertBefore(s.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},4903:(e,t,s)=>{"use strict";function i(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),s=new Uint8Array(t);let i=0;return e.forEach((e=>{s.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length})),s}s.d(t,{Z:()=>i})},4484:(e,t,s)=>{"use strict";function i(e,t){const s=e.length;if(s!==t.length)return!1;for(let i=0;ii})},2664:(e,t,s)=>{"use strict";s.r(t),s.d(t,{AppDialogsManager:()=>cd,default:()=>pd});var i=s(7223),n=s(8209),a=s(3512),o=s(6440),r=s(3714),l=s(2738),d=s(3910),c=s(9256),h=s(1174),p=s(5844);const u=[...h.Z].concat([...p.Z]),g=new Set(u);function m(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var v=s(4755),f=s(9492),b=s(7625);function y(e){(0,b.Z)(e.history,((t,s,i)=>{t.action.photo||(i.splice(s,1),void 0!==e.count&&--e.count)}))}var w=s(5953);class S{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,w.Z)(this,e)}setTargets(e,t,s){this.previous=e,this.next=t,this.reverse=s}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.loadedAllUp=this.loadedAllDown=e,this.loadPromiseUp=this.loadPromiseDown=null}go(e,t=!0){let s,i;if(e>0){if(s=this.next.splice(0,e),i=s.pop(),!i)return;this.previous.push(this.current,...s)}else{if(s=this.previous.splice(this.previous.length+e,-e),i=s.shift(),!i)return;this.next.unshift(...s,this.current)}return this.next.length0),this.current}load(e){if(e&&this.loadedAllDown)return Promise.resolve();if(!e&&this.loadedAllUp)return Promise.resolve();if(e&&this.loadPromiseDown)return this.loadPromiseDown;if(!e&&this.loadPromiseUp)return this.loadPromiseUp;let t;t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0];const s=this.loadMore(t,e,this.loadCount).then((t=>{e&&this.loadPromiseDown!==s||!e&&this.loadPromiseUp!==s||(t.items.length{const s=this.processItem?this.processItem(t):t;s&&(e?this.reverse?this.previous.unshift(s):this.next.push(s):this.reverse?this.next.push(s):this.previous.unshift(s))})),this.onLoadedMore&&this.onLoadedMore())}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null}));return e?this.loadPromiseDown=s:this.loadPromiseUp=s,s}}class C extends S{constructor(e={}){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var n;const a=t?0:s;let o=null===(n=this.current)||void 0===n?void 0:n.mid;return e&&(o=e.mid),t||(o=f.Z.incrementMessageId(o,1)),i.Z.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:s,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&y(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>{if(this.filterMids([t.mid]).length)return e.processItem(t)}})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const s=s=>s.peerId===e&&t.has(s.mid),i=(e,t,i)=>{s(e)&&i.splice(t,1)};(0,b.Z)(this.previous,i),(0,b.Z)(this.next,i),this.current&&s(this.current)&&this.onEmptied&&this.onEmptied()},this.onHistoryMultiappend=e=>{if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const t=e[this.searchContext.peerId];if(!t)return;const s=Array.from(t).sort(((e,t)=>e-t)),i=this.filterMids(s).map((e=>this.processItem(e))).filter(Boolean);i.length&&this.next.push(...i)},this.onMessageSent=({message:e})=>{this.onHistoryMultiappend({[e.peerId]:new Set([e.mid])})},a.default.addEventListener("history_delete",this.onHistoryDelete),a.default.addEventListener("history_multiappend",this.onHistoryMultiappend),a.default.addEventListener("message_sent",this.onMessageSent)}filterMids(e){const t=this.searchContext.isScheduled?i.Z.getScheduledMessagesStorage(this.searchContext.peerId):i.Z.getMessagesStorage(this.searchContext.peerId);return i.Z.filterMessagesByInputFilter(this.searchContext.inputFilter._,e,t,e.length)}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),this.searchContext.useSearch||(this.loadedAllDown=this.loadedAllUp=!0)}reset(){super.reset(),this.searchContext=void 0}cleanup(){this.reset(),a.default.removeEventListener("history_delete",this.onHistoryDelete),a.default.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.default.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0}}var L=s(1592),I=s(5814),M=s(4687),E=s(5555),P=s(8805),T=s(5565),k=s(4727);class x{constructor(e,t,s=!0,i,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=s,this.autonomous=a,this.onFound=o,this.list=pd.createChatList(),this.container=document.createElement("div"),i&&(this.container.className=i),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,k.i18n)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&pd.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class A{constructor(e,t,s,i){this.container=e,this.searchInput=t,this.searchGroups=s,this.onSearch=i,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new P.ZP(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout((()=>{this.searchMore(),this.searchTimeout=0}),0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,s=""){this.peerId=e,this.threadId=t,this.query!==s&&(this.searchInput.inputField.value=s),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=i.Z.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:s,history:i}=t;i.length&&i[0].mid===this.minMsgId&&i.shift();const n=this.searchGroups.messages;i.forEach((t=>{try{const s=this.peerId?t.fromId:t.peerId;pd.addDialogAndSetLastMessage({peerId:s,container:this.scrollable,drawStatus:!1,avatarSize:54,meAsSaved:!1,message:t,query:e})}catch(e){console.error("[appSearch] render search result",e)}})),n.toggle(),this.minMsgId=i.length&&i[i.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=i.length,-1===this.foundCount&&(this.foundCount=s,n.nameEl&&(0,T.Z)(n.nameEl,(0,k.i18n)(s?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[s])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}var _=s(503);class Z{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout((()=>{this.onChange(e)}),200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new _.Z({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const s=document.createElement("i");s.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(s,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var D=s(426),F=s(9818),R=s(3241),B=s(3699),U=s(4494);const N=(e,t={})=>(0,U.Z)("btn-icon",Object.assign({icon:e||void 0},t));class O{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=N("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new P.ZP(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider.addTab(this),this.listenerSetter=new B.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,s=void 0,n=function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((i=void 0)||(i=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((n=n.apply(t,s||[])).next())}));var t,s,i,n}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append((0,k.i18n)(e))}}class H extends O{constructor(e){super(e),this.eventListener=new R.Z}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}var z=s(1655);class V{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{F.Z.findItemByType(this.navigationType)?F.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,s)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const i=this.historyTabIds.pop();this.onCloseTab(i,t,s);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof O?n.container:n:this.canHideFirst?-1:0,t),!0},(0,w.Z)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,D.v)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach((e=>{(0,l.fc)(e,this.onCloseBtnClick)}))}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof O?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout((()=>{t.onOpenAfterTimeout()}),250)),F.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof O?e.container:e),!0}removeTabFromHistory(e){(0,z.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let s=this.historyTabIds.length-1;s>=0;--s){const i=this.historyTabIds[s];if(i!==t){if(i instanceof e)break;this.removeTabFromHistory(i)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,s){s||F.Z.removeByType(this.navigationType,!0);const i=e instanceof O?e:this.tabs.get(e);i&&(i.onClose&&i.onClose(),i.onCloseAfterTimeout&&setTimeout((()=>{i.onCloseAfterTimeout()}),250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}}var j=s(8138),G=s(6765);class K{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,l.fc)(this.container,(()=>{(new G.Z).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}const W=(e={})=>(0,U.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class q extends O{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(){this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new K((e=>{this.uploadAvatar=e}));const e=new Mn({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new _.Z({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new _.Z({label:"ChatLocation",name:"location",canBeEdited:!1}),t.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.groupNameInputField.input.addEventListener("input",(()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)})),this.nextBtn=W({icon:"arrow_next"}),this.nextBtn.addEventListener("click",(()=>{const e=this.groupNameInputField.value;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;j.Z.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{j.Z.editPhoto(e,t)})),this.peerIds.length&&j.Z.inviteToChannel(e,this.peerIds),xn.removeTabFromHistory(this),xn.selectTab(0)}))}else this.nextBtn.disabled=!0,j.Z.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{j.Z.editPhoto(e,t)})),xn.removeTabFromHistory(this),xn.selectTab(0)}))}));const s=new Mn({name:"Members",nameArgs:[this.peerIds.length]}),i=this.list=pd.createChatList({new:!0});s.content.append(i),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,s.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const s=super.open();return s.then((()=>{t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(k.default.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),this.peerIds.forEach((e=>{const{dom:t}=pd.addDialogNew({dialog:e,container:this.list,drawStatus:!1,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(E.Z.getUserStatusString(e))}))})),s}startLocating(){navigator.geolocation.getCurrentPosition((e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then((e=>e.json())).then((e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)}))}),(e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")}))}}var $=s(5003),Q=s(8598),Y=s(6008),X=s(1425),J=s(6858),ee=s(1405),te=s(671),se=s(3725),ie=s(632),ne=s(4762),ae=s(2897),oe=s(3689),re=s(410),le=s(7309),de=s(6669),ce=s(5432),he=s(6056),pe=s(8479),ue=s(6848);const ge=(()=>{try{return ne.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})(),me=new class{constructor(){if(this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this._volume=1,this._muted=!1,this._playbackRate=1,this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=e=>{const t=this.playingMedia;t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=L.Z.getDoc(t.docId);"audio"===s.type&&s.supportsStreaming&&ge&&this.handleSafariStreamable(e);const i=le.Z.getCacheContext(s);e.src=i.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate);const n=this.waitingDocumentsForLoad[s.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[s.id])},this.onPlay=e=>{const t=e.target,s=this.mediaDetails.get(t),{peerId:i,mid:n}=s,o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop();const e=e=>e.mid===n&&e.peerId===i;if(!this.listLoader.current||!e(this.listLoader.current)){let t,s=this.listLoader.previous.findIndex(e);-1!==s?t=-(this.listLoader.previous.length-s):(s=this.listLoader.next.findIndex(e),-1!==s&&(t=s+1)),-1!==s?t&&this.listLoader.go(t,!1):this.setTargets({peerId:i,mid:n})}this.setMedia(t,o)}setTimeout((()=>{this.playingMedia===t&&a.default.dispatchEvent("media_play",this.getPlayingDetails())}),0)},this.onPause=e=>{a.default.dispatchEvent("media_pause")},this.onEnded=e=>{e.isTrusted&&(this.onPause(e),this.next()||(this.stop(),a.default.dispatchEvent("media_stop")))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=()=>{const e=this.playingMedia;if(!e)return!1;e.paused||e.pause(),e.currentTime=0,(0,de.Z)(e,"ended");const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const s=t.peerId,i=t.isScheduled?this.scheduled:this.media,n=i.get(s);n&&(n.delete(t.mid),n.size||i.delete(s)),e.remove(),this.mediaDetails.delete(e)}return this.playingMedia=void 0,this.playingMediaType=void 0,!0},this.playItem=e=>{const{peerId:t,mid:s}=e,i=this.searchContext.isScheduled;this.getMedia(t,s,i).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,s,i)}),0)},this.next=()=>!this.lockedSwitchers&&this.listLoader.go(1),this.previous=()=>{const e=this.playingMedia;return e&&(e.currentTime>5||!this.listLoader.previous.length)?(e.currentTime=0,void this.toggle(!0)):!this.lockedSwitchers&&this.listLoader.go(-1)},this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.play,pause:this.pause,stop:this.stop,seekbackward:this.seekBackward,seekforward:this.seekForward,seekto:this.seekTo,previoustrack:this.previous,nexttrack:this.next};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}a.default.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e.id];if(t)for(const e of t)this.onMediaDocumentLoad(e)}));const e={};["volume","muted","playbackRate"].forEach((t=>{const s="_"+t;e[t]={get:()=>this[s],set:e=>{this[s]!==e&&(this[s]=e,this.playingMedia&&(this.playingMedia[t]=e),"playbackRate"===t&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=e),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,e)}dispatchPlaybackParams(){const{volume:e,muted:t,playbackRate:s}=this;a.default.dispatchEvent("media_playback_params",{volume:e,muted:t,playbackRate:s})}addMedia(e,t,s){const{peerId:n,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let l=r.get(e.peerId);l||r.set(e.peerId,l=new Map);let d=l.get(o);if(d)return d;const c=i.Z.getMediaFromMessage(e);l.set(o,d=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&d.setAttribute("playsinline","true");const h={peerId:n,mid:o,docId:c.id,clean:s,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(d,h),d.volume=1,this.container.append(d),d.addEventListener("play",this.onPlay),d.addEventListener("pause",this.onPause),d.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==a.default.myId&&d.addEventListener("timeupdate",(()=>{i.Z.readMessages(n,[o])}),{once:!0});const p=(0,se.b)();if(t)p.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let s=t.get(n);s||t.set(n,s=new Map),s.set(o,p)}return p.then((()=>{const e=le.Z.getCacheContext(c);if(c.supportsStreaming||e.url)this.onMediaDocumentLoad(d);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(d),L.Z.downloadDoc(c)}})),d}getMedia(e,t,s){const i=(s?this.scheduled:this.media).get(e);return null==i?void 0:i.get(t)}handleSafariStreamable(e){e.addEventListener("play",(()=>{const t=e.currentTime;e.addEventListener("progress",(()=>{e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{e.currentTime=t,e.paused||e.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(e,t,s){const i=s?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=i.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||i.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var s,n,a,l,d;return n=this,a=void 0,d=function*(){yield(0,he.xD)(t,void 0,!1);const n=i.Z.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let d="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=le.Z.getCacheContext(n,s.type);i.url?a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"}):r.Z.preloadPhoto(n,s).then((()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)}))}}else if(l){const s=e.fromId||e.peerId,i=o.Z.getPeerPhoto(s);if(i){const n=c.Z.loadAvatar(s,i,"photo_small");if(n.cached){const e=yield n.loadPromise;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then((s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)}))}d=o.Z.getPeerTitle(s,!0,!1),h=k.default.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));d=e&&e.title||n.file_name,h=e&&e.performer}a.length||(ne.IS_APPLE?ce.IS_TOUCH_SUPPORTED?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((e=>{const t=`${e}x${e}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const p=new MediaMetadata({title:d,artist:h,artwork:a});navigator.mediaSession.metadata=p},new((l=void 0)||(l=Promise))((function(e,t){function s(e){try{o(d.next(e))}catch(e){t(e)}}function i(e){try{o(d.throw(e))}catch(e){t(e)}}function o(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(s,i)}o((d=d.apply(n,a||[])).next())}))}getMessageByMedia(e){const t=this.mediaDetails.get(e),{peerId:s,mid:n}=t;return t.isScheduled?i.Z.getScheduledMessageByPeer(s,n):i.Z.getMessageByPeer(s,n)}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:i.Z.getMediaFromMessage(t),message:t,media:e}}toggle(e){return!!this.playingMedia&&(void 0===e&&(e=this.playingMedia.paused),this.playingMedia.paused===e&&(e?this.playingMedia.play():this.playingMedia.pause(),!0))}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!(0,ue.Z)(this.searchContext,e)&&(this.searchContext=(0,pe.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,s){this.listLoader?this.listLoader.reset():this.listLoader=new C({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{a.default.dispatchEvent("media_stop"),this.stop()}});const i=void 0===this.searchContext.folderId;t?this.listLoader.setTargets(t,s,i):this.listLoader.reverse=i,this.listLoader.setSearchContext(this.searchContext),this.listLoader.current=e,this.listLoader.load(!0),this.listLoader.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=i.Z.getMediaFromMessage(e);let s="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?s="voice":"video"===t.type&&(s="video")),s}setMedia(e,t){const s=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[s],this.playingMedia=e,this.playingMediaType=s,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const s=this.playingMedia,i=this.pause();return this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),()=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),e&&this.playingMedia===e&&this.stop(),i&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}};re.GO.appMediaPlaybackController=me;const ve=me;var fe=s(1964);function be(e,t,s,i){const n=e=>{s({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),i&&i({x:t.pageX,y:t.pageY,event:t})},o=s=>{0===s.button?(t({x:s.pageX,y:s.pageY,event:s}),n(s),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),s({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",d,{passive:!1,once:!0}),i&&i({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},d=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",d,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",d),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}var ye=s(3228);class we{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,w.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const s=this.seek=document.createElement("input");s.classList.add("progress-line__seek"),s.type="range",s.step=""+this.step,s.min=""+this.min,s.max=""+this.max,s.value=""+t,t&&this.setProgress(t);const i=""+this.step,n=i.indexOf(".");this.decimals=-1===n?0:i.length-n-1,this.container.append(this.filled,s)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=be(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,ye.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const s=this.vertical?this.rect.height:this.rect.width,i=(0,ye.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,s);let n=this.min+i/s*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=(0,ye.Z)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}const Se=e=>{if(e.element)return e.element;const{icon:t,text:s,onClick:i,checkboxField:n,noCheckboxClickListener:a}=e,o=document.createElement("div");o.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:""),(0,ee.ripple)(o);let r=e.textElement;r||(r=e.textElement=s?(0,k.i18n)(s,e.textArgs):document.createElement("span"),e.regularText&&(r.innerHTML=e.regularText)),r.classList.add("btn-menu-item-text"),o.append(r);const c=!!n||!!e.keepOpen;return i&&(0,l.fc)(o,(e=>{(0,d.d)(e),!1!==i(e)&&(c||(0,J.UR)(),n&&!a&&(n.checked="radio"===n.input.type||!n.checked))}),e.options),n&&o.append(n.label),e.element=o},Ce=(e,t)=>{const s=document.createElement("div");s.classList.add("btn-menu"),t&&e.forEach((e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}}));const i=e.map(Se);return s.append(...i),s},Le=(e,t,s,i)=>{((null==s?void 0:s.listenerSetter)?s.listenerSetter.add(e):e.addEventListener.bind(e))(l.pf,(s=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const n=e.querySelector(".btn-menu");(0,d.d)(s),e.classList.contains("menu-open")?(0,J.UR)():(t&&t(s),(0,J.YP)(n,i))}))},Ie=(e={},t,s,i,n)=>{var a;e.asDiv=!0;const o=null!==(a=e.container)&&void 0!==a?a:N("more",e);o.classList.add("btn-menu-toggle");const r=Ce(s,e.listenerSetter);return r.classList.add(t),Le(o,i,e,n),o.append(r),o};var Me=s(8497);class Ee extends R.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,w.Z)(this,e);const{listenerSetter:t,element:s}=this;ce.IS_TOUCH_SUPPORTED?t.add(s)("click",(e=>{this.ignoreClickClassName&&(0,Me.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(s)("mousemove",(()=>{this.showControls()})),t.add(s)("mouseenter",(()=>{this.showControls(!1)})),t.add(s)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,Me.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}var Pe=s(6733);class Te extends we{constructor(e,t,s,i){super({step:1e3/60/1e3,min:0,max:1,withTransition:s,useTransform:i},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let s=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{s=!this.media.paused,s&&this.media.pause()},onMouseUp:e=>{s&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(ve.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,s=this.media.currentTime;let i=0,n=0;for(let a=0;a=t&&t>=i&&(i=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(ve.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}class ke extends we{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,d.d)(e),ve.muted=!ve.muted},this.setVolume=()=>{const{volume:e,muted:t}=ve;let s;s=!e||t?0:e>.5?3:e>0&&e<.25?1:2,ke.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+ke.ICONS[s]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);ve.muted=!1,ve.volume=t}});const s="player-volume",i=this.btn=document.createElement("div");i.classList.add("btn-icon",s);const n=this.icon=document.createElement("span");n.classList.add(s+"__icon"),i.append(n,this.container),(0,l.fc)(n,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("media_playback_params",this.setVolume),this.setVolume()}}ke.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class xe extends Ee{constructor({video:e,play:t=!1,streamable:s=!1,duration:i,onPlaybackRackMenuToggle:n}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.listenerSetter=new B.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(i),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new Te(e,s),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:s,skin:i,listenerSetter:n}=this;t.classList.add(i);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===i){this.playbackRateButton=this.wrapper.querySelector(".playback-rate");const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=String(0|s.duration).toHHMMSS();const l=new ke(n),c=t.querySelector(".left-controls");l.btn.classList.remove("btn-icon"),c.insertBefore(l.btn,o.parentElement),Array.from(e).forEach((e=>{n.add(e)("click",(()=>{this.togglePlay()}))})),ce.IS_TOUCH_SUPPORTED||(n.add(s)("click",(()=>{this.togglePlay()})),n.add(document)("keydown",(e=>{if(a.default.overlaysActive>1)return;const{key:s,code:i}=e;let n=!0;if("KeyF"===i)this.toggleFullScreen();else if("KeyM"===i)ve.muted=!ve.muted;else if("Space"===i)this.togglePlay();else if(!e.altKey||"Equal"!==i&&"Minus"!==i)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?n=!1:"ArrowLeft"===s?ve.seekBackward({action:"seekbackward"}):ve.seekForward({action:"seekforward"});else{const e="Equal"===i?1:-1,t=ve.playbackRate,s=xe.PLAYBACK_RATES.indexOf(t)+e;s>=0&&s{ce.IS_TOUCH_SUPPORTED||this.toggleFullScreen()})),n.add(i)("click",(()=>{this.toggleFullScreen()})),(0,Pe.Ms)(t,this.onFullScreen.bind(this,i),n),n.add(s)("timeupdate",(()=>{o.innerHTML=String(0|s.currentTime).toHHMMSS()})),n.add(s)("play",(()=>{t.classList.add("played"),ce.IS_TOUCH_SUPPORTED||n.add(s)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(s)("pause",(()=>{this.showControls(!1)})),n.add(a.default)("media_playback_params",(()=>{this.setPlaybackRateIcon()}))}n.add(s)("play",(()=>{t.classList.add("is-playing")})),n.add(s)("pause",(()=>{t.classList.remove("is-playing")})),s.duration||e?r.innerHTML=String(Math.round(s.duration||e)).toHHMMSS():(0,he.xD)(s).then((()=>{r.innerHTML=String(Math.round(s.duration)).toHHMMSS()}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`}setBtnMenuToggle(){const e=xe.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{ve.playbackRate=e}}))),t=Ce(e);t.classList.add("top-left"),Le(this.playbackRateButton,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,void 0,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;xe.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=xe.PLAYBACK_RATES.indexOf(ve.playbackRate);-1===t&&(t=xe.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+xe.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(ne.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,Pe.rB)()?(0,Pe.C8)():(0,Pe.Dj)(e)}onFullScreen(e){const t=(0,Pe.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}removeListeners(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=void 0}}xe.PLAYBACK_RATES=[.5,1,1.5,2],xe.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var Ae=s(3251),_e=s(319),Ze=s(2614),De=s(3035);function Fe(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e((()=>{i=!1,t(...s)})))}}(De.T2,e)}var Re=s(1507);function Be(e,t=2){if(0===e)return(0,k.i18n)("FileSize.B",[0]);const s=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1024));return(0,k.i18n)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][i],[parseFloat((e/Math.pow(1024,i)).toFixed(s))])}var Ue=s(5296);function Ne(e=!0){const t=new fe.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}a.default.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const s=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${s}, .media-round.is-unread${s}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const Oe=e=>{let t,s;const i=!e.classList.contains("search-super-item"),n=(0,Me.Z)(e,i?"bubbles-inner":"tabs-tab");if(n){const a=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${a}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${a}`,`.media-round${a}`],i){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const l=r.join(", "),d=Array.from(n.querySelectorAll(l)),c=d.indexOf(e),h=d.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));t=h.slice(0,c),s=h.slice(c+1)}return[t,s]};class He extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new B.Z}render(){var e,t;this.classList.add("audio"),this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=i.Z.getMediaFromMessage(this.message),n="voice"===s.type,a=!this.voiceAsMusic&&n,o=this.message.pFlags.is_outgoing,r=o&&this.preloader,c=String(0|s.duration).toHHMMSS();this.innerHTML='\n
\n
\n
\n
\n
\n
';const h=this.firstElementChild,p=document.createElement("div");p.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),r&&(this.classList.add("is-outgoing"),this.append(p));const u=a?function(e){e.classList.add("is-voice");const t=e.message,s=i.Z.getMediaFromMessage(t);t.pFlags.out&&e.classList.add("is-out");let n=s.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);n=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let s;try{const i=new DataView(e.buffer);s=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){s=new Uint8Array([])}return s}(n.slice(0,63));const{svg:a,container:o,availW:r}=function(e,t){const s=v.ZP.isMobile?16:23,i=v.ZP.isMobile?152:190,n=v.ZP.isMobile?190:256,a=(0,ye.Z)(t/60*n,i,n),o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.classList.add("audio-waveform-bars"),o.setAttributeNS(null,"width",""+a),o.setAttributeNS(null,"height",""+s),o.setAttributeNS(null,"viewBox",`0 0 ${a} ${s}`);const r=Math.max(...e),l=e.length?e.length:100,d=Math.min(a/4|0,l);let c=0;const h=s-4;let p="";for(let t=0,i=0,n=0;t=l){n=n+d-l,n<(d+1)/2&&c\n `,i+=4,c=n<(d+1)/2?0:a}else c{let t=e.audio;const s=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&s();const i=Fe(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.addAudioListener("play",(()=>{(0,Ue.cK)((()=>(s(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,s=!1;function i(e){let s;if(e instanceof MouseEvent)s=e.offsetX;else{const t=e.target.getBoundingClientRect();s=e.targetTouches[0].pageX-t.left}const i=s/r*t.duration;t.currentTime=i}u.addEventListener("mouseleave",(i=>{e&&(t.play(),e=!1),s=!1})),u.addEventListener("mousemove",(t=>{s=!0,e&&i(t)})),u.addEventListener("mousedown",(s=>{s.preventDefault(),0===s.button&&(t.paused||t.pause(),i(s),e=!0)})),u.addEventListener("mouseup",(i=>{s&&e&&(t.play(),e=!1)})),(0,l.fc)(u,(e=>{(0,d.d)(e),t.paused||i(e)}))}),_e.Z),()=>{u.remove(),u=null,t=null}}}(this):function(e){const t=e.withTime,s=e.message,n=i.Z.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push((0,Ze.Z)(n.audioPerformer)),t?a.push((0,ie.OD)(s.date)):a.length||a.push(Be(n.size)),e.showSender&&a.push(i.Z.wrapSenderToPeer(s)),o.append(...(0,k.joinElementsWith)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new Ae.I;l.dataset.fontWeight=e.dataset.fontWeight,a?l.append(i.Z.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.Z.wrapSentTime(s));const d=e.querySelector(".audio-subtitle");return d.append(o),()=>{let t=!1,s=new Te(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),d.lastChild.replaceWith(o),t=!1}));const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&d.lastChild.replaceWith(s.container))};return e.addAudioListener("play",i),(!e.audio.paused||e.audio.currentTime>0)&&i(),()=>{s.removeListeners(),s.container.remove(),s=null}}}(this),g=this.querySelector(".audio-time");g.innerHTML=c;const m=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=ve.addMedia(this.message,e),s=this.readyPromise=(0,se.b)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?s.resolve():this.addAudioListener("canplay",(()=>s.resolve()),{once:!0}),this.onTypeDisconnect=u();const i=()=>String(0|t.currentTime).toHHMMSS()+(a?" / "+c:""),n=()=>{g.innerText=i(),h.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&n();const o=(e,s=t.paused)=>{if(e&&(0,d.d)(e),s){const e=!!this.searchContext;if(ve.setSearchContext(this.searchContext||{peerId:Re.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?Oe(this):[];ve.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,s)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(h,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{h.classList.remove("playing"),g.innerText=c})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||ve.isSafariBuffering(t)||(g.innerText=i())})),this.addAudioListener("pause",(()=>{h.classList.remove("playing")})),this.addAudioListener("play",n),o};if(null===(e=s.thumbs)||void 0===e?void 0:e.length){const e=[],t=Ss({photo:s,message:null,container:h,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});h.style.width=h.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach((e=>e.classList.add("audio-thumb")))}if(o)r&&(this.dataset.isOutgoing="1",this.preloader.attach(p,!1));else{let e=this.preloader;const i="audio"!==s.type;m(i);const n=t=>{if(this.audio.src)return;ve.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(ve.willBePlayed(this.audio),ne.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=Ne(!1),s=(0,se.b)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),ve.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=_e.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(p,!1,s),e=this.addAudioListener("pause",(()=>{s.cancel()}),{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then((()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)}))}else{e=Ne(),t||(this.readyPromise=(0,se.b)());const n=()=>{i();const n=L.Z.downloadDoc(s);return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(p,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?h.append(p):this.append(p),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),p.classList.add("downloaded"),setTimeout((()=>{p.remove()}),200),ve.willBePlayedMedia===this.audio&&(this.audio.play(),ve.willBePlayed(void 0))}))};(null===(t=this.audio)||void 0===t?void 0:t.src)||(i?n(!1):(0,l.fc)(h,(()=>{n(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",He);var ze=s(8456);class Ve{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}const je=32;function Ge(e){var t,s;let{title:n,titleEl:a,subtitle:o,subtitleEl:l,mediaEl:d,message:c,loadPromises:h}=e;void 0!==n&&("string"==typeof n&&(n=(0,ze.Z)(n,140),n=Q.o.wrapEmojiText(n)),(0,T.Z)(a,n)),h||(h=[]);let p=c&&c.media,u=!1,g=!1;const m=d?Array.from(d.children).slice():[];let v;if(p&&d){if(l.textContent="",l.append(i.Z.wrapMessageForReply(c,void 0,void 0,void 0,void 0,!0)),p.webpage&&(p=p.webpage),p.photo||p.document&&(null===(t=p.document.thumbs)||void 0===t?void 0:t.length)){v=Ol.chat.bubbles.getMiddleware();const e=Ol.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,Is({doc:p.document,div:d,lazyLoadQueue:e,group:Bl,width:je,height:je,middleware:v,loadPromises:h});else{const t=p.photo||p.document;g="round"===t.type;try{Ss({photo:t,container:d,boxWidth:je,boxHeight:je,size:r.Z.choosePhotoSize(t,je,je),middleware:v,lazyLoadQueue:e,noBlur:!0,withoutPreloader:!0,loadPromises:h}),u=!0}catch(e){}}}}else c?(l.textContent="",l.append(i.Z.wrapMessageForReply(c))):("string"==typeof o&&(o=(0,ze.Z)(o,140),o=Q.o.wrapEmojiText(o)),(0,T.Z)(l,o||""));return Promise.all(h).then((()=>{v&&!v()||(m.forEach((e=>e.remove())),d&&d.classList.toggle("is-round",g))})),u}class Ke extends Ve{constructor(e){super(e,((e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=Ge({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s});this.container.classList.toggle("is-media",i),i?this.content.prepend(this.mediaEl):this.mediaEl.remove()})),this.className=e}}function We(e,t){return e.reduce(((e,t)=>e+t),t)}class qe{constructor(e,t,s,i,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=s,this.spacing=i,this.maxHeight=n,this.count=e.length,this.ratios=qe.countRatios(e),this.proportions=qe.countProportions(this.ratios),this.averageRatio=We(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new $e(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),s=this.maxWidth-t-this.spacing,i=Math.min(this.maxHeight,Math.round(Math.min(s/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:s,height:i},sides:13},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),s=e-t-this.spacing,i=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],s*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-i);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:3},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=(this.maxWidth-this.spacing)/2,i=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(s/this.ratios[1],s/this.ratios[2]))),n=e-s-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),i=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),s*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),s*this.ratios[3])),a=e-i-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,s);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),s=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),i=Math.round(s/this.ratios[1]),n=Math.round(s/this.ratios[2]),a=e-i-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,s));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:3},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class $e{constructor(e,t,s,i,n,a=4*s/3){this.averageRatio=t,this.maxWidth=s,this.minWidth=i,this.spacing=n,this.maxHeight=a,this.ratios=$e.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,ye.Z)(e,1,2.75):(0,ye.Z)(e,.6667,1)))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=We(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/s},i=e=>{let i=[],n=0;for(let t of e)i.push(s(n,t)),n+=t;t.push({lineCounts:e,heights:i})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||i([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const s=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||s>3||i([e,t,s])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let s=1;s!==this.count-e-t;++s){const n=this.count-e-t-s;e>3||t>3||s>3||n>3||i([e,t,s,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:s}=e,i=s.length,o=We(t,0)+this.spacing*(i-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==i;++e)if(s[e-1]>s[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*l*d;(!n||c{if(this.uploadAvatar)return!0;let e=0,t=0,s=0;return this.inputFields.forEach((i=>{i.isValid()&&(i.isChanged()&&++e,i.required&&++s),i.required&&++t})),t===s&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,w.Z)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=W({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.setAttribute("peer",""+this.peerId),e.doNotEditAvatar||(this.avatarEdit=new K((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()})),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach((e=>{this.listenerSetter.add(e.input)("input",this.handleChange)})),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach((t=>t.input.toggleAttribute("disabled",e))),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then((()=>{t&&(this.disabled=!1)}),(()=>{this.disabled=!1}))}}function Je(e,t){const s=document.createElement("form");return e.forEach((e=>{const{container:i,input:n}=e;s.append(i),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),s}class et{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?m(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append((0,k.i18n)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),t=!0),e.checkboxField){this.checkboxField=e.checkboxField;const s=e.checkboxField.label.classList.contains("checkbox-field-toggle");s?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(t=!0,this.container.append(this.checkboxField.label)),e.noCheckboxSubtitle||s||this.checkboxField.input.addEventListener("change",(()=>{(0,T.Z)(this.subtitle,(0,k.i18n)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))}))}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const s=e.titleRight||e.titleRightSecondary;if(s?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?"string"==typeof e.title?this.title.innerHTML=e.title:this.title.append(e.title):this.title.append((0,k.i18n)(e.titleLangKey)),t.append(this.title),s){const i=this.titleRight=document.createElement("div");i.classList.add("row-title","row-title-right"),e.titleRightSecondary&&i.classList.add("row-title-right-secondary"),"string"==typeof s?i.innerHTML=s:i.append(s),t.append(i)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",(t=>{this.freezed||e.clickable(t)})),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,ee.ripple)(this.container,void 0,void 0,!0))}createMedia(e){this.container.classList.add("row-with-padding");const t=this.media=document.createElement("div");return t.classList.add("row-media"),e&&t.classList.add("row-media-"+e),this.container.append(t),t}}const tt=(e,t)=>Je(e.map((e=>({container:e.container,input:e.radioField.input}))),t);function st(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var it=s(144),nt=s(9750);class at{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const s=this.input=document.createElement("input");s.type="radio",s.name="input-radio-"+e.name,e.value&&(s.value=e.value,e.stateKey&&(M.default.getState().then((t=>{s.checked=(0,nt.Z)(t,e.stateKey)===e.value})),s.addEventListener("change",(()=>{M.default.setByKey(e.stateKey,e.value)}))));const i=this.main=document.createElement("div");i.classList.add("radio-field-main"),e.text?i.innerHTML=e.text:e.langKey&&(0,k._i18n)(i,e.langKey),t.append(s,i)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const ot=document.createElement("div");function rt(e){(0,T.Z)(ot,e),document.body.append(ot),ot.dataset.timeout&&clearTimeout(+ot.dataset.timeout),ot.dataset.timeout=""+setTimeout((()=>{ot.remove(),delete ot.dataset.timeout}),3e3)}function lt(e){rt((0,k.i18n)(e.langPackKey))}function dt(e,t,s=!0,i=!0){let n,a,o,r,l=!1;return(...d)=>(a||(a=new Promise(((e,t)=>(o=e,r=t)))),n?(clearTimeout(n),l=!0,r(),a=new Promise(((e,t)=>(o=e,r=t)))):s&&(o(e(...d)),l=!1),n=setTimeout((()=>{!i||s&&!l||o(e(...d)),n=a=o=r=void 0,l=!1}),t),a.catch((()=>{})),a)}ot.classList.add("toast");var ct=s(9518);class ht extends _.Z{constructor(e){super(e),this.checkUsernameDebounced=dt(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(_.I.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());Q.Z.isUsernameValid(e)?this.setState(_.I.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)}))}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=ct.Z.invokeApi("channels.checkUsername",{channel:j.Z.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=ct.Z.invokeApi("account.checkUsername",{username:e}),this.checkUsernamePromise.then((t=>{this.getValue()===e&&(t?this.setState(_.I.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&"USERNAME_INVALID"===t.type&&this.setError(this.options.invalidText)})).then((()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&Q.Z.isUsernameValid(t)&&this.checkUsername(t)})))}}var pt=s(1168),ut=s(9807);class gt extends pt.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&(0,pt.x)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){let e=new Yl;e.setAttribute("dialog","1"),e.setAttribute("peer",""+t.peerId),e.classList.add("avatar-32"),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,k.i18n)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const s=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,k.i18n)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!1;const t=new ut.Z(e);e.checkboxField=t,s.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const s=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),s(e)}}}))),this.container.insertBefore(s,this.header.nextElementSibling)}}var mt=s(1656);class vt extends H{init(){this.container.classList.add("edit-peer-container","group-type-container");const e=j.Z.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new Mn({name:e?"ChannelType":"GroupType"}),s=(0,it.a)(),i=new et({radioField:new at({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new et({radioField:new at({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=tt([i,o],(e=>{const t=[c,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),v()})),d=j.Z.getChat(this.chatId);t.content.append(r);const c=new Mn({}),h=new et({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{st(this.chatFull.exported_invite.link),rt(k.default.format("LinkCopied",!0))}}),p=(0,U.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,l.fc)(p,(()=>{new gt("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,mt.Z)([p],!0);n.default.getChatInviteLink(this.chatId,!0).then((t=>{e(),h.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),c.content.append(h.container,p);const u=new Mn({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),g=document.createElement("div");g.classList.add("input-wrapper");const m="t.me/",v=()=>{const e=i.radioField.checked&&b!==m||f.isValidToChange()&&f.input.classList.contains("valid");y.classList.toggle("is-visible",e)},f=new ht({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:v,peerId:this.chatId.toPeerId(!0),head:m}),b=m+(d.username||"");g.append(f.container),u.content.append(g);const y=W({icon:"check",className:"is-visible"});this.content.append(y),(0,l.fc)(y,(()=>{(0,J.px)(y);const e=o.radioField.checked?f.getValue():"";j.Z.migrateChat(this.chatId).then((t=>j.Z.updateUsername(t,e))).then((()=>{this.close()}))}),{listenerSetter:this.listenerSetter}),(b!==m?o:i).radioField.checked=!0,f.setOriginalValue(b),this.scrollable.append(t.container,c.container,u.container);{const t=new Mn({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),s=new ut.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(s.input)("change",(()=>{const e=s.toggleDisability(!0);j.Z.toggleNoForwards(this.chatId,s.checked).then((()=>{e()}))}));const i=()=>{s.setValueSilently(!!d.pFlags.noforwards)};this.listenerSetter.add(a.default)("chat_update",(e=>{this.chatId===e&&i()})),i(),t.content.append(s.label),this.scrollable.append(t.container)}}}var ft=s(4668);class bt{constructor(e){this.loading=!1,this.loaded=!1,(0,w.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}var yt=s(4789),wt=s(8763),St=s(1431),Ct=s(241),Lt=s(6690),It=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Mt{constructor(e){this.container=document.createElement("div"),this.list=pd.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=pd.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,w.Z)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>(this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=e.filter((e=>!(e.isPeerId()&&!o.Z.getPeer(e).deleted)||this.filterPeerTypeBy.find((t=>o.Z[t](e)))))),t(e)),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,k._i18n)(this.input,this.placeholder,void 0,"placeholder"):(0,k._i18n)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new Mn({});e.innerContainer.classList.add("selector-search-section");let t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new P.ZP(t),(0,l.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,Me.Z)(t,"selector-user"),!t)return;const s=t.dataset.key,i=this.chatsContainer.querySelector('[data-peer-id="'+s+'"]');i?i.click():this.remove(s.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const s=new Mn({name:this.sectionNameLangPackKey,noShadow:!0});s.content.append(this.list),this.chatsContainer.append(s.container),this.scrollable=new P.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,l.fc)(this.chatsContainer,(e=>{const t=(0,wt.Z)(e.target,"data-peer-id");if((0,d.d)(e),!t)return;if(this.freezed)return;let s=t.dataset.peerId;if(s=s.isPeerId()?s.toPeerId():s,!this.multiSelect)return void this.add(s);this.selected.has(s)?this.remove(s):this.add(s);const i=t.querySelector("input");i.checked=!i.checked}));const i=dt(this.onInput,200,!1,!0);this.input.addEventListener("input",i),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(Pn()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{let t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!E.Z.testSelfSearch(this.query)||this.renderResultsFunc([a.default.myId])}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return It(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=Ct.Z.height/72*1.25|0,t=this.getTempId("dialogs"),s=i.Z.getConversations(this.query,this.offsetIndex,e,this.folderId,!0).promise;this.promise=s;const n=yield s;if(this.tempIds.dialogs!==t)return;this.promise=null;let o=n.dialogs;if(o.length){const e=o[o.length-1].index||0;o=o.slice(),o.findAndSplice((e=>e.peerId===a.default.myId)),this.chatRightsAction&&(o=o.filter((e=>this.filterByRights(e.peerId)))),this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(o.map((e=>e.peerId))),n.isEnd){if(!this.loadedWhat.dialogs)return this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return e.isUser()&&("send_messages"!==this.chatRightsAction||E.Z.canSendToUser(e))||j.Z.hasRights(e.toChatId(),this.chatRightsAction)}getMoreContacts(){return It(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),s=Promise.all([e?E.Z.getContactsPeerIds(this.query):[],this.query?E.Z.searchContacts(this.query):void 0]);this.promise=s;let[i,n]=yield s;if(this.tempIds.contacts!==t)return;if(n){let t=e?n.my_results.concat(n.results):n.my_results;this.chatRightsAction&&(t=t.filter((e=>this.filterByRights(e)))),this.peerType.includes("dialogs")||(t=t.filter((e=>e.isUser()))),this.cachedContacts=(0,Lt.Z)(i.concat(t))}else this.cachedContacts=i.slice();(0,z.Z)(this.cachedContacts,a.default.myId),this.promise=null}const t=Ct.Z.height/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return It(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=n.default.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),s=yield t;if(this.tempIds.channelParticipants!==e)return;const i=s.participants.map((e=>j.Z.getParticipantPeerId(e)));(0,z.Z)(i,a.default.myId),this.renderResultsFunc(i),(this.list.childElementCount>=s.count||s.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=e.filter((e=>E.Z.isNonContactUser(e)))),e.forEach((e=>{const{dom:t}=pd.addDialogNew({dialog:e,container:this.scrollable,drawStatus:!1,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const s=this.selected.has(e),i=new ut.Z;s&&(i.input.checked=!0),t.containerEl.prepend(i.label)}let s;s=e.isAnyChat()?n.default.getChatMembersString(e.toChatId()):e===a.default.myId?(0,k.i18n)(this.selfPresence):E.Z.getUserStatusString(e),t.lastMessageSpan.append(s)}))}add(e,t,s=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const i=document.createElement("div");i.classList.add("selector-user","scale-in");const n=document.createElement("avatar-element");return n.classList.add("selector-user-avatar","tgico"),n.setAttribute("dialog","1"),n.classList.add("avatar-32"),i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new St.Z({peerId:e.toPeerId(),dialog:!0}).element),n.setAttribute("peer",""+e)),t&&("string"==typeof t?i.innerHTML=t:((0,T.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(i,this.input),this.onChange&&this.onChange(this.selected.size),s&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),i}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const s=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};a.default.settings.animationsEnabled?t.addEventListener("animationend",s,{once:!0}):s()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:yt.f.Static})}))}}class Et extends pt.Z{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new Mt({appendTo:this.body,onChange:()=>{return t=this,s=void 0,n=function*(){const t=this.selector.getSelected(),s=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(s);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((i=void 0)||(i=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((n=n.apply(t,s||[])).next())}));var t,s,i,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),ce.IS_TOUCH_SUPPORTED||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence}),this.title.append(this.selector.input)}}class Pt extends H{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new Mn({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=pd.createChatList({new:!0});s.append(i);const{dom:n}=pd.addDialogNew({dialog:this.userId.toPeerId(!1),container:i,drawStatus:!1,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(E.Z.getUserStatusString(this.userId));const a=new kt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0});e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,ue.Z)(this.participant.banned_rights.pFlags,e.pFlags)||j.Z.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new Mn({});if("channelParticipantBanned"===this.participant._){const s=(0,U.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,l.fc)(s,(()=>{const t=(0,mt.Z)([s],!0);j.Z.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(s)}const s=(0,U.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,l.fc)(s,(()=>{(0,mt.Z)([s],!0),j.Z.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container)}}}var Tt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class kt{constructor(e){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const t=j.Z.getChat(e.chatId),s=t.default_banned_rights,i=e.participant?j.Z.combineParticipantBannedRights(e.chatId,e.participant.banned_rights):s,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0];a.checkboxField=new ut.Z({text:a.text,checked:j.Z.hasRights(e.chatId,o,i),restriction:!0,withRipple:!0}),(e.participant&&s.pFlags[o]||t.username&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,l.fc)(a.checkboxField.label,(e=>{rt(k.default.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(a.checkboxField.label)}}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v)!t.checkboxField.checked&&t.flags.forEach((t=>{e.pFlags[t]=!0}));return e}}class xt extends H{init(){return Tt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new Mn({name:"ChannelPermissionsHeader"});e=new kt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content}),this.eventListener.addEventListener("destroy",(()=>{j.Z.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new Mn({name:"PrivacyExceptions"}),s=new et({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Et({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{i(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>Tt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void rt("User is no longer participant")}const s=new Pt(this.slider);s.participant=t,s.chatId=this.chatId,s.userId=e,s.open()}));t.content.append(s.container);const r=t.generateContentElement();r.classList.add("chatlist-container");const d=pd.createChatList({new:!0});r.append(d),(0,l.fc)(d,(e=>{const t=(0,ft.Z)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();i(s)}),{listenerSetter:this.listenerSetter});const c=(t,s)=>{const i=s.banned_rights,n=j.Z.getChat(this.chatId).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];i.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...(0,k.join)(a.map((e=>(0,k.i18n)(e))),!1))),o.classList.toggle("hide",!a.length)},h=(e,t)=>{const{dom:s}=pd.addDialogNew({dialog:o.Z.getPeerId(e.peer),container:d,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t});c(s.listEl,e)};this.listenerSetter.add(a.default)("updateChannelParticipant",(e=>{var t,s,i;const n="channelParticipantBanned"===(null===(t=e.new_participant)||void 0===t?void 0:t._)&&!e.new_participant.banned_rights.pFlags.view_messages,a=d.querySelector(`[data-peer-id="${e.user_id}"]`);n?(a?c(a,e.new_participant):h(e.new_participant,!1),"channelParticipantBanned"!==(null===(s=e.prev_participant)||void 0===s?void 0:s._)&&++g):(a&&a.remove(),"channelParticipantBanned"===(null===(i=e.prev_participant)||void 0===i?void 0:i._)&&--g),p()}));const p=()=>{(0,T.Z)(s.subtitle,(0,k.i18n)(g?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[g]))};let u,g=0;const m=()=>(u=new bt({scrollable:this.scrollable,getPromise:()=>n.default.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,d.childElementCount).then((e=>{for(const t of e.participants)h(t,!0);return g=e.count,p(),e.participants.length<50||e.count===d.childElementCount}))}),u.load());this.scrollable.append(t.container),j.Z.isChannel(this.chatId)?yield m():(p(),this.listenerSetter.add(a.default)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,m())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class At{constructor(e,t=o.Z.getDialogType(e),s){const n=new St.Z({peerId:e}).element,a=(t,n=p&&!!t.size)=>{let a=j.Z.leave(e.toChatId());n&&(a=a.finally((()=>i.Z.flushHistory(e)))),s&&s(a)},r=t=>{let n;if(e.isUser())n=i.Z.flushHistory(e,!1,p?!!t.size:void 0);else{if(!t.size)return a(t);n=j.Z.delete(e.toChatId())}s&&s(n)};let l,d,c,h,p;switch(t){case"channel":j.Z.hasRights(e.toChatId(),"delete_chat")?(j.Z.deleteChannel,l="ChannelDeleteMenu",d="AreYouSureDeleteAndExitChannel",h=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChannelForAll"}]):(l="LeaveChannelMenu",d="ChannelLeaveAlertWithName",c=[n],h=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":l="DeleteChatUser",d="AreYouSureDeleteThisChatWithUser",c=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}],p=[{text:"DeleteMessagesOptionAlso",textArgs:[new St.Z({peerId:e}).element]}];break;case"saved":l="DeleteChatUser",d="AreYouSureDeleteThisChatSavedMessages",h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}];break;case"megagroup":case"group":j.Z.hasRights(e.toChatId(),"delete_chat")?(l="DeleteMegaMenu",d="AreYouSureDeleteAndExit",h=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChat.DeleteGroupForAll"}]):(l="LeaveMegaMenu",d="AreYouSureDeleteAndExitName",c=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:d,descriptionLangArgs:c,buttons:h,checkboxes:p}).show()}}var _t=s(6689);class Zt extends H{init(){var e,t,s,i,a;return t=this,s=void 0,a=function*(){this.setTitle("Reactions");const t=yield _t.Z.getActiveAvailableReactions(),s=yield n.default.getChatFull(this.chatId);let i=null!==(e=s.available_reactions)&&void 0!==e?e:[];const a=new Set(i),o=new Mn({caption:j.Z.isBroadcast(this.chatId)?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),r=new ut.Z({toggle:!0,checked:!!a.size}),l=new et({checkboxField:r,titleLangKey:"EnableReactions"});o.content.append(l.container);const d=new Mn({name:"AvailableReactions"}),c=t.map((e=>{const t=new ut.Z({toggle:!0,checked:a.has(e.reaction)});this.listenerSetter.add(t.input)("change",(()=>{t.checked?(a.add(e.reaction),r.checked||r.setValueSilently(!0)):(a.delete(e.reaction),!a.size&&r.checked&&r.setValueSilently(!1)),p()}));const s=new et({checkboxField:t,title:e.title,havePadding:!0});return Es({row:s,doc:e.static_icon,size:"small"}),d.content.append(s.container),t}));this.listenerSetter.add(l.checkboxField.input)("change",(()=>{r.checked?c.every((e=>!e.checked))&&(c.forEach((e=>e.checked=!0)),p()):(c.forEach((e=>e.checked=!1)),p())}));const h=()=>{const e=Array.from(a);if([...e].sort().join()===[...i].sort().join())return;const t=n.default.getCachedFullChat(this.chatId);t&&(t.available_reactions=e),j.Z.setChatAvailableReactions(this.chatId,e),i=e},p=dt(h,3e3,!1,!0);this.eventListener.addEventListener("destroy",h,{once:!0}),this.scrollable.append(o.container,d.container)},new((i=void 0)||(i=Promise))((function(e,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((a=a.apply(t,s||[])).next())}))}}class Dt extends O{_init(){var e,t,s,i,o;return t=this,s=void 0,o=function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",null!==(e=this.tempId)&&void 0!==e||(this.tempId=0);const t=++this.tempId;this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let s=yield n.default.getChatFull(this.chatId,!0);const i=j.Z.getChat(this.chatId),o=j.Z.isBroadcast(this.chatId),r=j.Z.isChannel(this.chatId),d=[],c=e=>{d.push(e)};this.listenerSetter.add(a.default)("chat_update",(e=>{this.chatId===e&&d.forEach((e=>e()))})),this.listenerSetter.add(a.default)("chat_full_update",(e=>{this.chatId===e&&(s=n.default.getCachedFullChat(e)||s)}));const h=this.chatId.toPeerId(!0),p=j.Z.hasRights(this.chatId,"change_type"),u=j.Z.hasRights(this.chatId,"change_permissions");{const e=new Mn({noDelimiter:!0}),n=[],r=document.createElement("div");if(r.classList.add("input-wrapper"),this.chatNameInputField=new _.Z({label:o?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new _.Z({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(i.title),this.descriptionInputField.setOriginalValue(s.about),r.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new Xe({peerId:h,inputFields:n,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.content.append(this.editPeer.avatarEdit.container,r),p){const t=new et({titleLangKey:o?"ChannelType":"GroupType",clickable:()=>{const e=new vt(this.slider);e.chatId=this.chatId,e.chatFull=s,e.open(),this.listenerSetter.add(e.eventListener)("destroy",n)},icon:"lock"}),n=()=>{let e;t.subtitle.textContent="",e=o?i.username?"TypePublic":"TypePrivate":i.username?"TypePublicGroup":"TypePrivateGroup",t.subtitle.append((0,k.i18n)(e))};n(),e.content.append(t.container)}if(p||u){const i=new et({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=new Zt(this.slider);e.chatId=this.chatId,e.open().then((()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)}))}}),n=(yield _t.Z.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,a=()=>{var e;const t=null!==(e=s.available_reactions)&&void 0!==e?e:[];i.subtitle.innerHTML=t.length+"/"+n};a(),e.content.append(i.container)}if(u&&!o){const t=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],s=new et({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new xt(this.slider);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>{s.subtitle.innerHTML=t.reduce(((e,t)=>e+ +j.Z.hasRights(this.chatId,t,i.default_banned_rights)),0)+"/"+t.length};n(),e.content.append(s.container),this.listenerSetter.add(a.default)("chat_update",(e=>{this.chatId===e&&n()}))}if(this.scrollable.append(e.container),(0,l.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(j.Z.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(j.Z.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>j.Z.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),o&&j.Z.hasRights(this.chatId,"change_info")){const t=new ut.Z({text:"PeerInfo.SignMessages",checked:!!i.pFlags.signatures,withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);j.Z.toggleSignatures(this.chatId,t.checked).then((()=>{e()}))})),c((()=>{t.setValueSilently(!!i.pFlags.signatures)})),e.content.append(t.label)}}if(!o){const e=new Mn({});if(!o&&p){const t=new ut.Z({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);j.Z.togglePreHistoryHidden(this.chatId,!t.checked).then((()=>{e()}))}));const i=()=>{t.setValueSilently(r&&!s.pFlags.hidden_prehistory)};i(),c(i),e.content.append(t.label)}e.content.childElementCount&&this.scrollable.append(e.container)}if(j.Z.hasRights(this.chatId,"delete_chat")){const e=new Mn({}),t=(0,U.Z)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,l.fc)(t,(()=>{new At(h,void 0,(e=>{const s=(0,mt.Z)([t],!0);e.then((()=>{this.close()}),(()=>{s()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}r||this.listenerSetter.add(a.default)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{h===e&&(this.chatId=t.toChatId(),this._init())}))},new((i=void 0)||(i=Promise))((function(e,n){function a(e){try{l(o.next(e))}catch(e){n(e)}}function r(e){try{l(o.throw(e))}catch(e){n(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(a,r)}l((o=o.apply(t,s||[])).next())}))}init(){return this._init()}}var Ft=s(9090);class Rt extends O{init(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!E.Z.isContact(this.peerId.toUserId());this.setTitle(e?"AddContactTitle":"Edit");{const t=new Mn({noDelimiter:!0}),s=[],n=document.createElement("div");if(n.classList.add("input-wrapper"),this.nameInputField=new _.Z({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new _.Z({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=E.Z.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(n.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new Xe({peerId:this.peerId,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const r=new ut.Z({text:"Notifications"});r.input.addEventListener("change",(e=>{e.isTrusted&&i.Z.togglePeerMute(this.peerId)})),this.listenerSetter.add(a.default)("notify_settings",(e=>{if("notifyPeer"!==e.peer._)return;const t=o.Z.getPeerId(e.peer.peer);if(this.peerId===t){const t=!Ft.Z.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}}));const l=document.createElement("div");l.classList.add("profile-name"),l.append(new St.Z({peerId:this.peerId}).element);const d=document.createElement("div");if(d.classList.add("profile-subtitle"),d.append((0,k.i18n)("EditContact.OriginalName")),t.content.append(s,l,d,n),e){const e=E.Z.getUser(this.peerId),s=new et({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?E.Z.formatUserPhone(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new St.Z({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new et({checkboxField:r}),s=!Ft.Z.isPeerLocalMuted(this.peerId,!1);r.checked=s,t.content.append(e.container)}}else t.content.append(n);this.scrollable.append(t.container),(0,l.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0,E.Z.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,E.Z.getUser(this.peerId).phone).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter})}if(!e){const e=new Mn({}),t=(0,U.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,l.fc)(t,(()=>{new gt("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,pt.x)([{langKey:"Delete",callback:()=>{const e=(0,mt.Z)([t],!0);E.Z.deleteContacts([this.peerId]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}}class Bt extends O{init(){this.container.classList.add("add-members-container"),this.nextBtn=W({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",(()=>{const e=this.selector.getSelected().map((e=>e.toPeerId()));if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}}))}attachToPromise(e){const t=(0,J.px)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const s="privacy"===this.peerType;return this.selector=new Mt({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[s?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:s,filterPeerTypeBy:s?["isAnyGroup","isUser"]:void 0}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}const Ut=!ne.IS_FIREFOX&&!1;var Nt=s(6654);function Ot(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-check"),s.classList.add("verified-check"),e.append(t,s),e}const Ht=e=>e.touches?e.touches[0]:e,zt=window;let Vt=!1;a.default.addEventListener("context_menu_toggle",(e=>{Vt=e}));class jt{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{ce.IS_TOUCH_SUPPORTED?zt.removeEventListener("touchmove",this.handleMove,{capture:!0}):(zt.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{const t=Ht(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,ce.IS_TOUCH_SUPPORTED?zt.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):zt.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||Vt)return void this.reset();this.cancelEvent&&(0,d.d)(e);const t=Ht(e),s=t.clientX,i=t.clientY,n=this.xDown-s,a=this.yDown-i;if(!this.hadMove){if(!n&&!a)return;this.hadMove=!0,ce.IS_TOUCH_SUPPORTED||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const o=this.onSwipe(n,a,e);void 0!==o&&o&&this.reset()},(0,w.Z)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){ce.IS_TOUCH_SUPPORTED?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),zt.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),zt.addEventListener("mouseup",this.reset))}removeListeners(){ce.IS_TOUCH_SUPPORTED?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),zt.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),zt.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!ce.IS_TOUCH_SUPPORTED&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}class Gt{constructor(e){this.scrollable=e,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(Gt.BASE_CLASS+"-avatar","media-container"),e&&(s="object"!=typeof e?r.Z.getPhoto(e):e.action.photo);const i=new Image;i.classList.add("avatar-photo"),i.draggable=!1;const n=()=>{if(s){const e=Ss({container:t,photo:s,size:r.Z.choosePhotoSize(s,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=o.Z.getPeerPhoto(this.peerId);c.Z.putAvatar(t,this.peerId,e,"photo_big",i)}};return this.avatars.childElementCount<=3?n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.avatars.append(t),this.addTab(),e},this.container=document.createElement("div"),this.container.classList.add(Gt.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Gt.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Gt.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Gt.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Gt.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Gt.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Gt.BASE_CLASS+"-arrow",Gt.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new B.Z;const t=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let i=!1,n=!1;(0,l.fc)(this.container,(e=>{return a=this,o=void 0,l=function*(){if(n)return void(0,d.d)(e);if(i)return void(i=!1);if(!t())return;const a=this.container.getBoundingClientRect(),o=e.pageX,r=o-a.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>a.width*s&&r{t.push({element:this.avatars.children[s],item:e})}));const s=t.slice(0,this.listLoader.previous.length),i=t.slice(this.listLoader.previous.length+1),a=this.avatars.children[this.listLoader.previous.length];n=!0,ql(a,e,(()=>e===this.peerId),this.listLoader.current,s,i),n=!1}else{const e=o>a.right-a.width/2;let t;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,t=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(t),(0,De.T2)((()=>{this.avatars.classList.remove("no-transition")}))}},new((r=void 0)||(r=Promise))((function(e,t){function s(e){try{n(l.next(e))}catch(e){t(e)}}function i(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,i)}n((l=l.apply(a,o||[])).next())}));var a,o,r,l}),{listenerSetter:this.listenerSetter});const a=()=>{i=!0,document.body.addEventListener(ce.IS_TOUCH_SUPPORTED?"touchend":"click",(e=>{i=!1}),{once:!0})};let h=0,p=0,u=0,g=0;this.swipeHandler=new jt({element:this.avatars,onSwipe:(e,t)=>{u=e;let s=p+e*-Gt.SCALE;return s>0?s=0:st()?!this.container.classList.contains("is-single")&&!n:(a(),(0,d.d)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();h=e.width,g=-h*(this.tabs.childElementCount-1),p=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Gt.TRANSLATE_TEMPLATE.replace("{x}",p+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(u)/(h/Gt.SCALE))*(u>=0?1:-1);a(),this.avatars.classList.remove("no-transition"),(0,De.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){this.peerId=e;const t=o.Z.getPeerPhoto(e);if(!t)return;const s=this.listLoader=new S({loadCount:50,loadMore:(t,a,o)=>{if(!a)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t||s.current;return r.Z.getUserPhotos(e,i,o).then((e=>({count:e.count,items:e.photos})))}{const t=[];return s.current||t.push(Promise.resolve(n.default.getChatFull(e.toChatId()))),t.push(i.Z.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:o,backLimit:0})),Promise.all(t).then((e=>{const t=e.pop();if(y(t),!s.current){const n=e[0],a=t.history.findAndSplice((e=>e.action.photo.id===n.chat_photo.id));s.current=a||i.Z.generateFakeAvatarMessage(this.peerId,n.chat_photo)}return{count:t.count,items:t.history}}))}},processItem:this.processItem,onJump:(e,t)=>{const s=this.listLoader.index,i=100*Gt.SCALE*s;this.avatars.style.transform=Gt.TRANSLATE_TEMPLATE.replace("{x}",`-${i}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[s].classList.add("active"),this.loadNearestToTarget(this.avatars.children[s])}});"userProfilePhoto"===t._&&(s.current=t.photo_id),this.processItem(s.current),s.load(!0)}addTab(){const e=document.createElement("div");e.classList.add(Gt.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),s=t.indexOf(e);t.slice(Math.max(0,s-3),Math.min(t.length,s+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){this.listenerSetter.removeAll(),this.swipeHandler.removeListeners()}}Gt.BASE_CLASS="profile-avatars",Gt.SCALE=Ut?2:1,Gt.TRANSLATE_TEMPLATE=Ut?`translate3d({x}, 0, -1px) scale(${Gt.SCALE})`:"translate({x}, 0)";let Kt=(e,t)=>{t.title.innerHTML=e||"",t.container.style.display=e?"":"none"};class Wt{constructor(e,t,s=!0){this.scrollable=e,this.listenerSetter=t,this.isDialog=s,this.setPeerStatus=(e=!1)=>{const t=this.peerId;!t||a.default.myId===t&&this.isDialog||Ol.setPeerStatus(this.peerId,this.subtitle,e,!0,(()=>t===this.peerId),!this.isDialog)},Ut||this.scrollable.container.classList.add("no-parallax"),t||(this.listenerSetter=new B.Z)}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new Mn({noDelimiter:!0}),this.avatar=new Yl,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.setAttribute("dialog",""+ +this.isDialog),this.avatar.setAttribute("clickable",""),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new et({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&Promise.resolve(n.default.getProfileByPeerId(this.peerId)).then((e=>{st(e.about),rt(k.default.format("BioCopied",!0))}))}}),this.bio.title.classList.add("pre-wrap"),this.username=new et({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{st("@"+o.Z.getPeer(this.peerId).username),rt(k.default.format("UsernameCopied",!0))}}),this.phone=new et({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{st("+"+E.Z.getUser(this.peerId).phone),rt(k.default.format("PhoneCopied",!0))}}),this.link=new et({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{st(this.link.title.textContent),rt(k.default.format("LinkCopied",!0))}}),this.location=new et({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new et({checkboxField:new ut.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&i.Z.togglePeerMute(this.peerId)})),e.add(a.default)("dialog_notify_settings",(e=>{if(this.peerId===e.peerId){const e=Ft.Z.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}})),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),Ut&&this.element.append(Pn()),e.add(a.default)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(a.default)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)})),e.add(a.default)("peer_title_edit",(e=>{e===this.peerId&&this.fillUsername()})),e.add(a.default)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(a.default)("contacts_update",(e=>{this.peerId===e.toPeerId()&&(E.Z.getUser(e).pFlags.self&&this.isDialog||this.fillUserPhone())})),e.add(a.default)("avatar_update",(e=>{this.peerId===e&&this.setAvatar()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0)}canBeDetailed(){return this.peerId!==a.default.myId||!this.isDialog}setAvatar(){if(this.canBeDetailed()&&o.Z.getPeerPhoto(this.peerId)){const e=this.avatars;return this.avatars=new Gt(this.scrollable),this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(Ut&&this.scrollable.container.classList.add("parallax"))}Ut&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),this.avatar.setAttribute("peer",""+this.peerId),this.section.content.prepend(this.avatar,this.name,this.subtitle)}fillUsername(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=o.Z.getPeerUsername(e);Kt(t,this.username)}}fillUserPhone(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=E.Z.getUser(e);Kt(t.phone?E.Z.formatUserPhone(t.phone):void 0,this.phone)}}fillNotifications(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=Ft.Z.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else(0,De.T2)((()=>{e.container.style.display="none"}))}fillRows(){var e;const t=this.peerId;this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(),(0,T.Z)(this.name,new St.Z({peerId:t,dialog:this.isDialog}).element);const s=o.Z.getPeer(t);(null===(e=null==s?void 0:s.pFlags)||void 0===e?void 0:e.verified)&&this.name.append(Ot()),this.setPeerStatus(!0)}fillProfileElements(){this.cleaned&&(this.cleaned=!1,this.cleanupHTML(),this.setAvatar(),this.fillRows())}setMoreDetails(e){this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0);const t=this.peerId,s=this.threadId;t&&!o.Z.isRestricted(t)&&this.canBeDetailed()&&(0,Nt.Z)(n.default.getProfileByPeerId(t,e),(e=>{if(this.peerId!==t||this.threadId!==s||o.Z.isRestricted(t))return;if(Kt(e.about?Q.Z.wrapRichText(e.about):void 0,this.bio),!t.isUser()){const s=j.Z.getChat(t.toChatId());if(s.username)Kt("https://t.me/"+s.username,this.link);else{const t=e.exported_invite;t&&Kt(t.link,this.link)}}const i=e.location;"channelLocation"==(null==i?void 0:i._)&&Kt(i.address,this.location),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4)}))}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}}class qt extends O{constructor(e){super(e,!1),this.threadId=0,this.historiesStorage={}}init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,U.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const s=document.createElement("div");s.className="transition slide-fade";const i=document.createElement("div");i.classList.add("transition-item"),this.title.append((0,k.i18n)("Profile")),this.editBtn=N("edit"),i.append(this.title,this.editBtn);const n=document.createElement("div");n.classList.add("transition-item");const o=this.title.cloneNode();o.append((0,k.i18n)("PeerInfo.SharedMedia")),n.append(o),s.append(i,n),this.header.append(s),this.profile=new Wt(this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const s=e.top-1<=56;t.classList.toggle("state-back",s),this.searchSuper.container.classList.toggle("is-full-viewport",s),r(+s),s||this.searchSuper.cleanScrollPositions()};const r=(0,D.v)(s,"slide-fade",400,null,!1);r(0),(0,l.fc)(this.closeBtn,(e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),r(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()})),(0,l.fc)(this.editBtn,(e=>{let t;t=this.peerId.isAnyChat()?new Dt(this.slider):new Rt(this.slider),t&&(t instanceof Dt?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())})),a.default.addEventListener("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),a.default.addEventListener("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),a.default.addEventListener("history_multiappend",(e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))})),a.default.addEventListener("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),a.default.addEventListener("message_sent",(({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])})),this.searchSuper=new si({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&a.default.settings.animationsEnabled?250:0;setTimeout((()=>{d.classList.toggle("is-hidden","members"!==e.type)}),t)}}),this.profile.element.append(this.searchSuper.container);const d=W({icon:"addmember_filled"});this.content.append(d),d.addEventListener("click",(()=>{const e=this.peerId,t=this.peerId.toChatId(),s=j.Z.isChannel(t),i=(t,i)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[(0,k.i18n)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new St.Z({peerId:e}).element),t})),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new St.Z({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new St.Z({peerId:t[0]}).element],checked:!0}])}r.push(new St.Z({peerId:e}).element),new gt("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:i}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&<({langPackKey:"InviteToGroupError"})};if(s){const e=new Bt(this.slider);e.open({type:"channel",skippable:!1,takeOut:s=>(i(s,(()=>{const i=j.Z.inviteToChannel(t,s);i.catch(n),e.attachToPromise(i)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Et({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{i([e],(s=>{j.Z.addChatUser(t,e,s.size?void 0:0).catch(n)}))}),0)}})}))}renderNewMessages(e,t){if(!this.init&&this.historiesStorage[e]){t=t.slice().reverse();for(const s of this.searchSuper.mediaTabs){const n=s.inputFilter,a=this.searchSuper.filterMessagesByType(t.map((t=>i.Z.getMessageByPeer(e,t))),n);if(a.length){const t=this.historiesStorage[e][n];t&&t.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[n]&&(this.searchSuper.usedFromHistory[n]+=a.length,this.searchSuper.performSearchResult(a,s,!1))}}}}deleteDeletedMessages(e,t){if(!this.init&&this.historiesStorage[e]){for(const s of t)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=this.historiesStorage[e][i];if(!n)continue;const a=n.findIndex((e=>e.mid===s));if(-1!==a){if(n.splice(a,1),this.peerId===e){const t=this.searchSuper.tabs[i].querySelector(`div[data-mid="${s}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[i]>=a+1&&this.searchSuper.usedFromHistory[i]--}break}}this.scrollable.onScroll()}}cleanupHTML(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",this.searchSuper.canViewMembers()&&j.Z.hasRights(this.peerId.toChatId(),"invite_users"))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var s;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){this.peerChanged&&(this.peerChanged=!1,this.cleanupHTML(),this.profile.fillProfileElements(),this.toggleEditBtn())}toggleEditBtn(){let e;e=this.peerId.isUser()?this.peerId!==a.default.myId&&E.Z.isContact(this.peerId.toUserId()):j.Z.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}loadSidebarMedia(e,t=!1){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}}const $t="is-right-column-shown",Qt=new class extends V{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1,v.ZP.addEventListener("changeScreen",((e,t)=>{t===v._G.medium&&e!==v._G.mobile&&this.toggleSidebar(!1)})),v.ZP.addEventListener("resize",(()=>{this.setColumnProportion()})),this.sharedMediaTab=new qt(this)}onCloseTab(e,t,s){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,s)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const s=document.body.classList.contains($t);let i;if(void 0!==e?e?s||(i=!0):s&&(i=!0):i=!0,!i)return Promise.resolve();s||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=Ol.selectTab(s?1:2,t);return document.body.classList.toggle($t,e),n}};re.GO.appSidebarRight=Qt;const Yt=Qt;class Xt extends O{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=super.open(),s=Qe.Z.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map((e=>e.voters/s.results.total_voters*100));ts(n);const a=document.createDocumentFragment();return s.results.results.forEach(((t,i)=>{if(!t.voters)return;const o=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const d=document.createElement("div");d.innerHTML=Q.o.wrapEmojiText(r.text);const c=document.createElement("div");c.innerText=Math.round(n[i])+"%",l.append(d,c);const h=pd.createChatList();h.classList.add("poll-results-voters"),pd.setListClickListener(h,(()=>{Yt.onCloseBtnClick()}),void 0,!0),h.style.minHeight=50*Math.min(t.voters,4)+"px",a.append(o,l,h);let p,u=4,g=!1,m=t.voters-4;const v=()=>{g||(g=!0,Qe.Z.getVotes(e,r.option,p,u).then((e=>{e.votes.forEach((e=>{const{dom:t}=pd.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()})),p&&(m-=e.votes.length,f.lastElementChild.replaceWith((0,k.i18n)("PollResults.LoadMore",[Math.min(20,m)]))),p=e.next_offset,u=20,m&&e.votes.length||f.remove()})).finally((()=>{g=!1})))};if(v(),m<=0)return;const f=document.createElement("div");f.classList.add("poll-results-more","show-more","rp-overflow"),f.addEventListener("click",v),(0,ee.ripple)(f);const b=document.createElement("div");b.classList.add("tgico-down"),f.append(b,(0,k.i18n)("PollResults.LoadMore",[Math.min(20,m)])),a.append(f)})),this.resultsDiv.append(i,a),Yt.toggleSidebar(!0).then((()=>{})),t}}var Jt=s(9099);let es=0;const ts=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const s=t-100,i=e.length;for(let t=0;t=.5&&is&&(s=i,t=n)}if(-1===t)return;e[t]+=1-s}}};a.default.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((s=>{s.isClosed=!!e.pFlags.closed,s.performResults(t,e.chosenIndexes)}))})),a.default.addEventListener("peer_changed",(()=>{is&&ss(is,ns,as)})),v.ZP.addEventListener("resize",(()=>{os.setMaxLength(),os.resizePolls()})),v.ZP.addEventListener("changeScreen",(()=>{os.setMaxLength()}));const ss=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout((()=>{t(),e.remove(),is===e&&ns===t&&as===s&&(is=ns=null,as=0)}),200)};let is,ns,as;class os extends HTMLElement{constructor(){super(),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Ct.Z.width<=360?Ct.Z.width-120:v.ZP.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,s)=>{e.setLineProgress(s,1)}))}))}render(){es||(es=document.getElementById("poll-line").getTotalLength(),os.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=Qe.Z.getPoll(e);let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),t.pFlags&&(this.isPublic=!!t.pFlags.public_voters,this.isQuiz=!!t.pFlags.quiz,this.isClosed=!!t.pFlags.closed,this.isMultiple=!!t.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const n=this.isMultiple?'':"",a=t.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${n}\n
\n
\n
${Q.o.wrapEmojiText(e.text)}
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,k.i18n)(i)),this.isQuiz&&(this.classList.add("is-quiz"),t.close_period&&t.close_date)){const e=document.createElement("div");e.classList.add("poll-time"),this.descDiv.append(e);const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("poll-quiz-timer"),this.quizTimer=s;const i=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+i),s.append(o),this.descDiv.append(s);const r=1e3*t.close_period,l=1e3*(t.close_date-Ye.Z.serverTimeOffset);this.quizInterval=window.setInterval((()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=String(i).toHHMMSS(),i<=5&&(e.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+s*a,o.style.strokeDasharray=`${a} ${a}`,t>=l&&(clearInterval(this.quizInterval),e.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{Qe.Z.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,k.i18n)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",(e=>{(0,d.d)(e),Yt.isTabExists(Xt)||new Xt(Yt).open(this.message)})),(0,ee.ripple)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,k.i18n)("Chat.Poll.SubmitVote")),(0,ee.ripple)(this.sendVoteBtn),t.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,l.fc)(this.sendVoteBtn,(e=>{(0,d.d)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),o.append(this.sendVoteBtn));const r=!(t.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(s,t.chosenIndexes,!1),r&&(this.setVotersCount(s),(0,l.fc)(this,this.clickHandler))}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,l.fc)(t,(s=>{(0,d.d)(s),t.classList.add("active"),((e,t,s)=>{is&&ss(is,ns,as);const i=document.createElement("div");i.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),i.append(n),a.innerHTML=Q.o.wrapRichText(e,{entities:t}),Ol.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),is=i,ns=s,as=window.setTimeout((()=>{ss(i,s,as)}),ce.IS_TOUCH_SUPPORTED?5e3:7e3)})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const s=e.results.find((e=>e.pFlags.correct));s&&!s.pFlags.chosen&&t.click()}}}clickHandler(e){const t=(0,Me.Z)(e.target,"poll-answer");if(!t)return;(0,d.d)(e);const s=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(s);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(s)}else this.sendVotes([s])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,s)=>e.includes(s)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=Qe.Z.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,s=!0){var i,n;if(a.default.settings.animationsEnabled||(s=!1),this.isQuiz&&((null===(i=e.results)||void 0===i?void 0:i.length)||this.isClosed)){this.answerDivs.forEach(((t,s)=>{t.classList.toggle("is-correct",!!e.results[s].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,T.Z)(this.typeDiv,(0,k.i18n)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,l.fc)(this,this.clickHandler):(0,l.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!s),s&&(0,Jt.Z)(this,"",!this.isRetracted,340),(0,De.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,s),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));let t="";(e.recent_voters||[]).forEach(((e,s)=>{const i=0===s?"":`style="transform: translateX(-${3*s}px);"`;t+=``})),this.avatarsDiv.innerHTML=t}if(this.isMultiple){const t=!!this.chosenIndexes.length,s=this.isClosed||t,i=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",s),this.viewResults.classList.toggle("hide",i),this.votersCountDiv.classList.toggle("hide",!s||!i)}}setResults(e,t,s){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,s)=>{e.classList.toggle("is-chosen",t.includes(s))}));const i=Math.max(...e);if(this.maxPercents=e.map((e=>e/i)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};s?(0,De.T2)(e):e()}let n;e=e.slice(),ts(e);const a=t=>{e.forEach(((e,s)=>{const i=n(e,t);this.numberDivs[s].innerText=i+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),s)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),s)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){s&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};s?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let s,i=[t];s=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,T.Z)(this.votersCountDiv,(0,k.i18n)(s,i))}setLineProgress(e,t){const s=this.svgLines[e];-1===t?(s.style.strokeDasharray="",s.style.strokeDashoffset=""):(s.style.strokeDasharray=t*this.maxPercents[e]*os.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*os.MAX_OFFSET)}}os.MAX_OFFSET=-46.5,os.MAX_LENGTH=0,customElements.define("poll-element",os);var rs=s(6740),ls=s(9674),ds=s(3847),cs=s(8487),hs=s(467),ps=s(6705),us=s(5269),gs=s(8938),ms=s(6724),vs=s(2131),fs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let bs=0;function ys({doc:e,container:t,message:s,boxWidth:i,boxHeight:n,withTail:o,isOut:r,middleware:c,lazyLoadQueue:h,noInfo:p,group:u,onlyPreview:g,withoutPreloader:m,loadPromises:f,noPlayButton:b,size:y,searchContext:w,autoDownload:S}){var C,M;const E=null==S?void 0:S.video;let P=0===E;const T=!(i&&n),k=("video"!==e.type||e.size<=52428800&&!T)&&("gif"===e.type?a.default.settings.autoPlay.gifs:a.default.settings.autoPlay.videos);let x,A;if(!p){x=document.createElement("span"),x.classList.add("video-time"),t.append(x);let s=!1;"gif"!==e.type?(x.innerText=(e.duration+"").toHHMMSS(!1),b||"round"===e.type||(k&&!P?x.classList.add("tgico","can-autoplay"):s=!0)):(x.innerText="GIF",k||b||(s=!0,P=void 0)),s&&(A=document.createElement("span"),A.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(A))}let _,Z={};if("image/gif"===e.mime_type){const a=Ss({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:c,withoutPreloader:m,loadPromises:f,autoDownloadSize:E,size:y});return Z.thumb=a,Z.loadPromise=a.loadPromises.full,Z}const D=document.createElement("video");if(D.classList.add("media-video"),D.setAttribute("playsinline","true"),D.muted=!0,"round"===e.type){const i=document.createElement("div");i.classList.add("media-round","z-depth-1"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,i.message=s;const n=v.ZP.active.round,a=n.width/2,o=3.5,r=a-2*o;i.innerHTML=`\n \n `;const c=i.firstElementChild.firstElementChild;bs||(bs=2*Math.PI*r),c.style.strokeDasharray=bs+" "+bs,c.style.strokeDashoffset=""+bs,x.classList.add("tgico"),s.pFlags.media_unread&&i.classList.add("is-unread");const h=document.createElement("canvas");h.width=h.height=e.w,i.prepend(h,x),i.append(D),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=ve.addMedia(e,!P),s=()=>{(Ol.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,cs.Z)(t)||(t.removeEventListener("play",r),t.removeEventListener("timeupdate",o),t.removeEventListener("pause",u),t.removeEventListener("ended",g))}))},n=()=>{p.drawImage(t,0,0);const e=bs-t.currentTime/t.duration*bs;return c.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&((0,cs.Z)(t)?(t.paused&&n(),x.innerText=(t.duration-t.currentTime+"").toHHMMSS(!1)):s())},o=Fe(a),r=()=>{D.classList.add("hide"),i.classList.remove("is-paused"),(0,Ue.cK)(n,h),_&&_.preloader&&_.preloader.classList.contains("manual")&&_.onClick()},u=()=>{(0,cs.Z)(t)?i.classList.add("is-paused"):s()},g=()=>{D.classList.remove("hide"),i.classList.add("is-paused"),D.currentTime=0,x.innerText=(""+t.duration).toHHMMSS(!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",r),t.addEventListener("timeupdate",o),t.addEventListener("pause",u),t.addEventListener("ended",g),(0,l.fc)(h,(s=>{if((0,d.d)(s),_&&!_.detached&&_.onClick(),t.paused){const s=!!w;if(ve.setSearchContext(w||{peerId:Re.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?Oe(i):[];ve.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(n(),a(),D.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else D.autoplay=!0;let F;if(s){if(F=Ss({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:c,withoutPreloader:!0,loadPromises:f,autoDownloadSize:null==S?void 0:S.photo,size:y}),Z.thumb=F,!k&&"gif"!==e.type||g)return Z.loadPromise=F.loadPromises.full,Z;if(o){const e=(F.images.thumb||F.images.full).parentElement;D.width=+e.getAttributeNS(null,"width"),D.height=+e.getAttributeNS(null,"height"),e.append(D)}}else{const t=L.Z.getThumb(e,!1);t&&t.promise.then((()=>{D.poster=t.cacheContext.url}))}!D.parentElement&&t&&((null==F?void 0:F.aspecter)||t).append(D);const R=le.Z.getCacheContext(e),B=!!(null===(C=null==s?void 0:s.media)||void 0===C?void 0:C.preloader);B?(_=s.media.preloader,_.attach(t,!1),P=void 0):R.downloaded||e.supportsStreaming||m?e.supportsStreaming&&(_=new fe.Z({cancelable:!1,attachMethod:"prepend"})):_=new fe.Z({attachMethod:"prepend"});const U=(0,se.b)();D.addEventListener("error",(e=>{4!==D.error.code&&console.error("Error "+D.error.code+"; details: "+D.error.message),_&&!B&&_.detach(),U.isFulfilled||U.resolve()}),{once:!0}),(0,he.xD)(D).then((()=>{u&&I.Z.addAnimation(D,u),_&&!B&&_.detach(),U.resolve()})),"video"===e.type&&(D.addEventListener("timeupdate",(()=>{x.innerText=(D.duration-D.currentTime+"").toHHMMSS(!1)})),A&&D.addEventListener("timeupdate",(()=>{A.remove()}),{once:!0})),D.muted=!0,D.loop=!0,D.autoplay=!0;let N=P&&(null===(M=null==F?void 0:F.preloader)||void 0===M?void 0:M.loadFunc);const O=()=>{_&&P&&!m&&(_.construct(),_.setManual());let i=Promise.resolve();if(_&&!B||m)if(R.downloaded||e.supportsStreaming)e.supportsStreaming&&(P?i=Promise.reject():!R.downloaded&&_&&(_.attach(t,!1,null),D.addEventListener(ne.IS_SAFARI?"timeupdate":"canplay",(()=>{_.detach()}),{once:!0})));else{const s=i=L.Z.downloadDoc(e,null==h?void 0:h.queueId,P);_&&_.attach(t,!1,s)}return!P&&N&&(N(),N=null),P=void 0,i.then((()=>{!c||c()?("round"===e.type&&ve.resolveWaitingForLoadMedia(s.peerId,s.mid,s.pFlags.is_scheduled),(0,rs.ZP)(D,R.url)):U.resolve()}),(()=>{})),{download:i,render:U}};return _&&!B&&_.setDownloadFunction(O),"gif"!==e.type||k?Z.loadPromise=h?(h.push({div:t,load:()=>O().render}),Promise.resolve()):O().render:(0,l.fc)(t,(e=>{(0,d.d)(e),A.remove(),O()}),{capture:!0,once:!0}),Z}function ws({message:e,withTime:t,fontWeight:s,voiceAsMusic:n,showSender:o,searchContext:d,loadPromises:c,autoDownloadSize:h,lazyLoadQueue:p}){var u,m;s||(s=500);const v=0===h,f=e.media.document||e.media.webpage.document,b=e.pFlags.is_outgoing&&(null===(u=e.media)||void 0===u?void 0:u.preloader);if("audio"===f.type||"voice"===f.type||"round"===f.type){const i=new He;return i.withTime=t,i.message=e,i.noAutoDownload=v,i.lazyLoadQueue=p,i.loadPromises=c,n&&(i.voiceAsMusic=n),d&&(i.searchContext=d),o&&(i.showSender=o),b&&(i.preloader=e.media.preloader),i.dataset.fontWeight=""+s,i.render(),i}let y=f.file_name?f.file_name.split("."):"",w="";w=y.length>1&&Array.isArray(y)?(0,hs.ST)(y.pop().split(" ",1)[0].toLowerCase()):"file";let S=document.createElement("div");S.classList.add("document",`ext-${w}`),S.dataset.docId=""+f.id;const C=document.createElement("div");C.classList.add("document-ico");const I=le.Z.getCacheContext(f);if((null===(m=f.thumbs)||void 0===m?void 0:m.length)||e.pFlags.is_outgoing&&I.url&&"photo"===f.type){S.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing)C.innerHTML=``,t.push(C.firstElementChild);else{const e=Ss({photo:f,message:null,container:C,boxWidth:54,boxHeight:54,loadPromises:c,withoutPreloader:!0,lazyLoadQueue:p,size:r.Z.choosePhotoSize(f,54,54,!0)});C.style.width=C.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach((e=>e.classList.add("document-thumb")))}else C.innerText=w;let M=f.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const E=[Be(f.size)];t&&E.push((0,ie.OD)(e.date)),o&&E.push(i.Z.wrapSenderToPeer(e)),S.innerHTML=`\n ${I.downloaded&&!b?"":'
'}\n
\n
\n `;const P=S.querySelector(".document-name"),T=new Ae.I;if(T.dataset.fontWeight=""+s,T.innerHTML=M,P.append(T),o&&P.append(i.Z.wrapSentTime(e)),S.querySelector(".document-size").append(...(0,k.joinElementsWith)(E," · ")),S.prepend(C),!b&&e.pFlags.is_outgoing)return S;let x,A=null;const _=()=>{if(x){x.classList.add("downloaded");const e=x;setTimeout((()=>{e.remove()}),200),x=null}A&&(A=null)},Z=e=>{var t;const s=!e||e.isTrusted,i=L.Z.getDoc(S.dataset.docId);let n;const o=Ol.chat.bubbles?Ol.chat.bubbles.lazyLoadQueue.queueId:void 0;if(s)if("pdf"===i.type){const e=L.Z.downloading.has(i.id)||I.downloaded;n=L.Z.downloadDoc(i,o),e&&n.then((()=>{setTimeout((()=>{const e=le.Z.getCacheContext(i).url;window.open(e)}),a.default.settings.animationsEnabled?250:0)}))}else n=g.has(i.mime_type)&&(null===(t=i.thumbs)||void 0===t?void 0:t.length)?L.Z.downloadDoc(i,o):L.Z.saveDocFile(i,o);else n=L.Z.downloadDoc(i,o);return x&&(n.then(_),A.attach(x,!0,n)),{download:n}};return L.Z.downloading.has(f.id)?(x=S.querySelector(".document-download"),A=new fe.Z,A.attach(x,!1,L.Z.downloading.get(f.id))):I.downloaded&&!b||(x=S.querySelector(".document-download"),A=e.media.preloader,A?(A.attach(x),e.media.promise.then(_)):(A=new fe.Z,A.construct(),A.setManual(),A.attach(x),A.setDownloadFunction(Z),void 0!==h&&h>=f.size&&(0,l.tH)(A.preloader))),(0,l.fc)(S,(e=>{A?A.onClick(e):Z(e)})),S}function Ss({photo:e,message:t,container:s,boxWidth:i,boxHeight:n,withTail:o,isOut:l,lazyLoadQueue:d,middleware:c,size:h,withoutPreloader:p,loadPromises:u,autoDownloadSize:g,noBlur:m,noThumb:f,noFadeIn:b,blurAfter:y}){var w;if(!e.sizes&&!e.thumbs)return i&&n&&!h&&"document"===e._&&r.Z.setAttachmentSize(e,s,i,n,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};let S=0===g;h||(void 0===i&&(i=v.ZP.active.regular.width),void 0===n&&(n=v.ZP.active.regular.height)),s.classList.add("media-container");let C,I,M,E=s,P=!0,T=Promise.resolve();const k="document"===e._&&"image/gif"===e.mime_type&&!h;if(I=new Image,i&&n&&!h){const a=r.Z.setAttachmentSize(e,s,i,n,void 0,t,void 0,k?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=a.photoSize,P=a.isFit,M=le.Z.getCacheContext(e,h.type),!P){E=document.createElement("div"),E.classList.add("media-container-aspecter"),E.style.width=a.size.width+"px",E.style.height=a.size.height+"px";const i=r.Z.getStrippedThumbIfNeeded(e,M,!m,!0);if(i){T=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else Ss({container:s,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:d,isOut:l,loadPromises:u,middleware:c,withoutPreloader:p,withTail:o,autoDownloadSize:g,noBlur:m,noThumb:!0,blurAfter:!0}).images.full.classList.add("media-photo","thumbnail");s.classList.add("media-container-fitted"),s.append(E)}}else h||(h=r.Z.choosePhotoSize(e,i,n,!0)),M=le.Z.getCacheContext(e,null==h?void 0:h.type);if(!f){const t=r.Z.getStrippedThumbIfNeeded(e,M,!m);t&&(T=Promise.all([T,t.loadPromise]),C=t.image,C.classList.add("media-photo"),E.append(C))}I.classList.add("media-photo");const x=(C||!M.downloaded)&&a.default.settings.animationsEnabled&&!b;let A;(null===(w=null==t?void 0:t.media)||void 0===w?void 0:w.preloader)&&!p?(A=t.media.preloader,A.attach(s),S=void 0):M.downloaded||(A=new fe.Z({attachMethod:"prepend"}));const _=e=>Cs(s,I,e,x,E,C),Z=()=>c&&!c()?Promise.resolve():y?(0,ps.Z)(M.url,12).then((e=>_(e))):_(M.url);let D;const F=h.w>=150&&h.h>=150||S,R=()=>{S&&!p&&A&&(A.construct(),A.setManual());const t=k&&!h?L.Z.downloadDoc(e,null==d?void 0:d.queueId):r.Z.preloadPhoto(e,h,null==d?void 0:d.queueId,S);A&&!M.downloaded&&!p&&F&&A.attach(s,!1,t),S=void 0;const i=t.then(Z);return i.catch((()=>{})),{download:t,render:i}};return A&&A.setDownloadFunction(R),M.downloaded?T=D=R().render:d?d.push({div:s,load:()=>R().download}):D=R().render,u&&T&&u.push(T),{loadPromises:{thumb:T,full:D||Promise.resolve()},images:{thumb:C,full:I},preloader:A,aspecter:E}}function Cs(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise((o=>{(0,rs.ZP)(t,s,(()=>{ls.Z.mutateElement(e,(()=>{n.append(t),(0,De.T2)((()=>{o()})),i&&t.addEventListener("animationend",(()=>{ls.Z.mutate((()=>{t.classList.remove("fade-in"),a&&a.remove()}))}),{once:!0})}))}))}))}function Ls({size:e,doc:t,middleware:s,target:i,side:n,skipRatio:a,play:o}){const r=document.createElement("div");r.classList.add("emoji-animation"),r.style.width=e+"px",r.style.height=e+"px";const l=Is({div:r,doc:t,middleware:s,withThumb:!1,needFadeIn:!1,loop:!1,width:e,height:e,play:o,group:"none",skipRatio:a}).then((e=>((0,gs.Z)(e),e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(e.remove(),r.remove(),Ol.chat.bubbles.scrollable.container.removeEventListener("scroll",g))})),vs.Z&&e.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),e))),d=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},c=d(16),h=d(4),p=e/8*("right"===n?1:-1),u=()=>{if(!(0,cs.Z)(i))return;const t=i.getBoundingClientRect(),s=("right"===n?t.right:t.left)+("center"===n?(t.width-e)/2:("right"===n?-e:0)+p+c),a=t.top+(t.height-e)/2+("center"===n?0:h);r.style.top=a+"px",r.style.left=s+"px"},g=Fe(u);return Ol.chat.bubbles.scrollable.container.addEventListener("scroll",g),u(),Ol.emojiAnimationContainer.append(r),{animationDiv:r,stickerPromise:l}}function Is({doc:e,div:t,middleware:s,lazyLoadQueue:n,group:o,play:c,onlyThumb:h,emoji:p,width:u,height:g,withThumb:m,loop:v,loadPromises:b,needFadeIn:y,needUpscale:w,skipRatio:S,static:C}){var M;const E=e.sticker;if(1===E&&(C=!0),u||(u=p?void 0:200),g||(g=p?void 0:200),2===E&&ae.Z.loadLottieWorkers(),!E)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");let P;if(t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper"),C&&1!==E){const t=r.Z.choosePhotoSize(e,u,g,!1);P=le.Z.getCacheContext(e,t.type)}else P=le.Z.getCacheContext(e);const T=p?(0,te.tB)(p):-1,k=P.downloaded&&!y,x=!C&&(2===E||3===E),A=x;let _=(0,se.b)(),Z=!1;if(((null===(M=e.thumbs)||void 0===M?void 0:M.length)||e.stickerCachedThumbs)&&!t.firstElementChild&&(!k||A||h)&&!1!==m){let i,a=e.stickerCachedThumbs&&e.stickerCachedThumbs[T]||e.thumbs[0];const o=()=>{t.childElementCount||(i.classList.add("media-sticker","thumbnail"),ls.Z.mutateElement(t,(()=>{t.append(i),_.resolve()})))};if("url"in a)i=new Image,(0,rs.ZP)(i,a.url,o),Z=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.Z.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}else a=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||a;a&&"photoPathSize"!==a._&&T<=0&&(i=new Image,us.Z||e.pFlags.stickerThumbConverted||P.url?((0,rs.ZP)(i,r.Z.getPreviewURLFromThumb(e,a,!0),o),Z=!0):oe.Z.convert(""+e.id,a.bytes).then((n=>{a.bytes=n,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||(0,rs.ZP)(i,r.Z.getPreviewURLFromThumb(e,a,!0),o)})).catch((()=>{})))}else if((2===E&&T<=0||3===E)&&(m||h)){i=new Image;const r=()=>{if(t.childElementCount||s&&!s())return;const n=()=>{t.childElementCount||s&&!s()||(0,rs.ZP)(i,P.url,o)};return P.url?(n(),Promise.resolve()):L.Z.getThumbURL(e,a).promise.then(n)};if(n&&h)return n.push({div:t,load:r}),Promise.resolve();r(),a.url&&(Z=!0)}}if(b&&Z&&b.push(_),h)return Promise.resolve();const D=()=>fs(this,void 0,void 0,(function*(){if(!s||s()){if(2===E&&!C)return yield L.Z.downloadDoc(e,null==n?void 0:n.queueId).then((n=>fs(this,void 0,void 0,(function*(){if(s&&!s())throw new Error("wrapSticker 2 middleware");let r=yield ae.Z.loadAnimationWorker({container:t,loop:v&&!p,autoplay:c,animationData:n,width:u,height:g,name:"doc"+e.id,needUpscale:w,skipRatio:S,toneIndex:T},o,s);if(r.addEventListener("firstFrame",(()=>{const s=t.firstElementChild;!1!==y&&(y=(y||!s||"svg"===s.tagName)&&a.default.settings.animationsEnabled);const i=()=>{s&&s!==r.canvas&&s.remove()};y?ls.Z.mutate((()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",(()=>{ls.Z.mutate((()=>{r.canvas.classList.remove("fade-in"),i()}))}),{once:!0})})):s&&ls.Z.mutate(i),!1!==m&&L.Z.saveLottiePreview(e,r.canvas,T)}),{once:!0}),p){const e={a:[],v:1};let n;ds.Z.preloadAnimatedEmojiStickerAnimation(p),(0,l.fc)(t,(a=>fs(this,void 0,void 0,(function*(){(0,d.d)(a);const o=ae.Z.getAnimation(t);if(o.paused){const e=ds.Z.getAnimatedEmojiSoundDocument(p);if(e){const s=document.createElement("audio");s.style.display="none",t.parentElement.append(s);try{yield L.Z.downloadDoc(e);const t=le.Z.getCacheContext(e);s.src=t.url,s.play(),yield(0,he.xD)(s,void 0,!0),s.addEventListener("ended",(()=>{s.src="",s.remove()}),{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}if(!Ol.chat.peerId.isUser())return;const r=ds.Z.getAnimatedEmojiSticker(p,!0);if(!r)return;const l=(0,Me.Z)(t,"bubble"),c=l.classList.contains("is-out"),{animationDiv:h}=Ls({doc:r,middleware:s,side:c?"right":"left",size:280,target:t,play:!0});l&&(c?h.classList.add("is-out"):h.classList.add("is-in")),n||(n=(0,ms.Z)((()=>{if(!e.a.length)return;const s=e.a[0].t;e.a.forEach((e=>{e.t=(e.t-s)/1e3}));const n=(0,Me.Z)(t,"bubble");i.Z.setTyping(Ol.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:f.Z.getServerMessageId(+n.dataset.mid),emoticon:p,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0}),1e3,!1)),a.isTrusted&&(e.a.push({i:1,t:Date.now()}),n())}))))}return r}))));if(C||3===E){let i;C?i=new Image:(i=document.createElement("video"),i.setAttribute("playsinline","true"),i.muted=!0,c&&(i.autoplay=!0,i.loop=!0));const l=t.firstElementChild!==i&&t.firstElementChild;return!1!==y&&(y=(y||!k||(C?l:!l||"svg"===l.tagName))&&a.default.settings.animationsEnabled),i.classList.add("media-sticker"),y&&i.classList.add("fade-in"),new Promise(((a,d)=>{const c=()=>{if(s&&!s())return a();const n=()=>{ls.Z.mutateElement(t,(()=>{if(t.append(i),l&&l.classList.add("fade-out"),3===E&&!L.Z.isSavingLottiePreview(e,T)){(0,gs.Z)(i);const t=document.createElement("canvas");t.width=u*window.devicePixelRatio,t.height=g*window.devicePixelRatio,t.getContext("2d").drawImage(i,0,0,t.width,t.height),L.Z.saveLottiePreview(e,t,T)}3===E&&o&&I.Z.addAnimation(i,o),a(),y&&i.addEventListener("animationend",(()=>{i.classList.remove("fade-in"),l&&l.remove()}),{once:!0})}))};C?(0,rs.ZP)(i,P.url,n):(i.src=P.url,(0,he.xD)(i).then(n))};if(P.url)c();else{let t;if(2===E&&C){const s=r.Z.choosePhotoSize(e,u,g,!1);t=L.Z.getThumbURL(e,s).promise}else t=L.Z.downloadDoc(e,null==n?void 0:n.queueId);t.then(c,a)}}))}}})),F=!n||k&&!x?D():(n.push({div:t,load:D}),Promise.resolve());return k&&C&&(_=F,b&&b.push(_)),F}function Ms({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return fs(this,void 0,void 0,(function*(){if(null===(r=e.thumbs)||void 0===r?void 0:r.length)return s.classList.add("media-sticker-wrapper"),void t.push({div:s,load:()=>{const t=ds.Z.getStickerSetThumbDownloadOptions(e),r=le.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{ae.Z.loadAnimationWorker({container:s,loop:!0,autoplay:n,animationData:t,width:a,height:o,needUpscale:!0,name:"setThumb"+e.id},i)}));{let t;return e.pFlags.videos?(t=document.createElement("video"),t.setAttribute("playsinline","true"),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((e=>{(0,rs.ZP)(t,URL.createObjectURL(e),(()=>{s.append(t)}))}))}}});const l=ds.Z.getStickerSet(e),d=yield l;"documentEmpty"!==d.documents[0]._&&Is({doc:d.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function Es({doc:e,row:t,size:s}){const i=t.media,n=t.createMedia("small");i&&n.classList.add("hide");const a=i?[]:void 0,o="small"===s?32:48,r=Is({div:n,doc:e,width:o,height:o,loadPromises:a});return a&&Promise.all(a).then((()=>{n.classList.remove("hide"),i.remove()})),r}function Ps(e,t,s){const i=new Ke("reply");return i.fill(e,t,s),i.container}function Ts(e){const t=new qe(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find((e=>2&e.sides)),i=s.geometry.width+s.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=i+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:s},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/i*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/i*100+"%",8&s&&1&s&&(l.style.borderTopLeftRadius="inherit"),8&s&&4&s&&(l.style.borderBottomLeftRadius="inherit"),2&s&&1&s&&(l.style.borderTopRightRadius="inherit"),2&s&&4&s&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}}))}function ks({groupId:e,attachmentDiv:t,middleware:s,uploading:n,lazyLoadQueue:a,isOut:o,chat:l,loadPromises:d,autoDownload:c}){const h=[],p=i.Z.getMidsByAlbum(e);for(const e of p){const t=l.getMessage(e),s=t.media.photo||t.media.document,i="photo"===s._?r.Z.choosePhotoSize(s,480,480):{w:s.w,h:s.h};h.push({size:i,media:s,message:t})}Ts({container:t,items:h.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:v.ZP.active.album.width,minWidth:100,spacing:2,forMedia:!0}),h.forEach(((e,i)=>{const{size:n,media:r,message:l}=e,h=t.children[i];h.dataset.mid=""+l.mid,h.dataset.peerId=""+l.peerId;const p=h.firstElementChild;"photo"===r._?Ss({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:d,autoDownloadSize:c.photo}):ys({doc:l.media.document,container:p,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:s,loadPromises:d,autoDownload:c})}))}v.ZP.addEventListener("changeScreen",((e,t)=>{if(t===v._G.mobile||e===v._G.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=v.ZP.active.round.width,s=t/2,i=s-7;bs=2*Math.PI*i,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+s),n.setAttributeNS(null,"cy",""+s),n.setAttributeNS(null,"r",""+i),n.style.strokeDasharray=bs+" "+bs,n.style.strokeDashoffset=""+bs}))}})),a.default.addEventListener("download_start",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,l.tH)(e)}))}));var xs=s(8594),As=s(3624),_s=s(2648);function Zs(e,t,s,i){return void 0===i&&(i=e.parentElement===t?(0,_s.Z)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}var Ds=s(6519);class Fs{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=(0,As.k)(),(0,w.Z)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id,!0)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((s=>{if(!t()||void 0!==s&&!s)return e(!1);this._updateList(),e(!0)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,s,i=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,i,n,s),n}delete(e,t){const s=this.elements.get(e);if(!s)return!1;this.elements.delete(e);const i=this.sorted.indexOf(s);if(-1!==i&&this.sorted.splice(i,1),this.onDelete)if(t)this.onDelete(s);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(s)}))}return!0}update(e,t=!1,s=this.get(e),i){if(!s)return;s.index=this.getIndex(s),this.onUpdate&&this.onUpdate(s);const n=(0,Ds.Z)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)((()=>{e()&&this.onSort(s,n)}))}}}class Rs extends Fs{constructor(e={}){let t;super({getIndex:e.getIndex||(e=>E.Z.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>{const t=E.Z.getUserStatusString(e.id);(0,T.Z)(e.dom.lastMessageSpan,t)}),onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Zs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=pd.addDialogNew({dialog:e.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:De.T2,updateListWith:e=>{return t=this,s=void 0,n=function*(){return(0,cs.Z)(this.list)?(yield(0,xs.e9)(),(0,cs.Z)(this.list)?void e(!0):e(!1)):e(!1)},new((i=void 0)||(i=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((n=n.apply(t,s||[])).next())}));var t,s,i,n}}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,(0,w.Z)(this,e),this.list=pd.createChatList(this.createChatListOptions);const s=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&s()}))}),Rs.SORT_INTERVAL)};s()}}Rs.SORT_INTERVAL=3e4;var Bs=s(3444);function Us(e){let t=!1;return new jt(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,Me.Z)(t.target,"progress-line")&&!(0,Bs.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(s,i,n)=>{if(!t&&Math.abs(i)>20)return!0;if(Math.abs(s)>Math.abs(i))(0,d.d)(n),t=!0;else if(!t&&Math.abs(i)>Math.abs(s))return!0;return e.onSwipe(s,i,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Ns(e){return Us(Object.assign(Object.assign({},e),{onSwipe:(t,s,i)=>{if(Math.abs(t)>50)return e.onSwipe(t,s,i),(0,J.s3)(),!0}}))}var Os=s(6272);class Hs extends Et{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>{return i=this,n=void 0,o=function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}Ol.setInnerPeer({peerId:s}),Ol.chat.input.initMessagesForward(e)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}));var i,n,a,o},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class zs{constructor(e,t,s,n){const r=new St.Z({peerId:e}).element;t=t.slice();const l=(a,o)=>{n&&n(),"scheduled"===s?i.Z.deleteScheduledMessages(e,t):i.Z.deleteMessages(e,t,!!a.size||o)};let d,c,h,p,u,g=[];if(1===t.length?d="DeleteSingleMessagesTitle":(d="DeleteMessagesTitle",c=[(0,k.i18n)("messages",[t.length])]),h=o.Z.isMegagroup(e)?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:l}],e===a.default.myId||"scheduled"===s);else if(e.isUser())g.push({text:"DeleteMessagesOptionAlso",textArgs:[r]});else{const s=j.Z.getChat(e.toChatId()),n=j.Z.hasRights(e.toChatId(),"delete_messages");if("chat"===s._){const s=n?t.slice():t.filter((t=>i.Z.getMessageByPeer(e,t).fromId===a.default.myId));s.length&&(s.length===t.length?g.push({text:"DeleteForAll"}):(g.push({text:"DeleteMessagesOption"}),h="DeleteMessagesTextGroup",p=[(0,k.i18n)("messages",[s.length])]))}else u[0].callback=e=>l(e,!0)}(0,pt.x)(u),new gt("popup-delete-chat",{peerId:e,titleLangKey:d,titleLangArgs:c,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:g}).show()}}var Vs=s(5705);class js{constructor(e,t,s){let n,a,o=[];n=`Send Message${t.length>1?"s":""} Now`,a=t.length>1?"Send "+t.length+" messages now?":"Send message now?",o.push({langKey:"Send",callback:()=>{s&&s(),i.Z.sendScheduledMessages(e,t)}}),new gt("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var Gs=s(8799);function Ks(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var Ws=s(5975);const qs=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class $s extends R.Z{constructor(e){if(super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.cancelSelection=e=>{e&&(this.doNotAnimate=!0),this.onCancelSelection&&this.onCancelSelection(),this.selectedMids.clear(),this.toggleSelection(),Ks(),e&&(this.doNotAnimate=void 0)},(0,w.Z)(this,e),this.navigationType="multiselect-"+(0,it.a)(),ce.IS_TOUCH_SUPPORTED)return this.listenerSetter.add(this.listenElement)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,J.Eo)(this.listenElement,(e=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),this.listenElement.addEventListener("touchend",(e=>{(0,d.d)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),Ks();const t=this.getElementFromTarget(e.target);t&&this.toggleByElement(t)}),this.listenerSetter);const t=(e,t)=>{if(e===t)return[];const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=(s.top-i.top||s.left-i.left)<0,a=(0,Me.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);return n||([l,r]=[r,l]),o.slice(r+1,l)};this.listenerSetter.add(this.listenElement)("mousedown",(e=>{const s=(0,Me.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,s))return;const i=new Map;let n,a=s;const o=(e,s=!0)=>{const r=+e.dataset.mid;if(!r||!e.dataset.peerId)return;const l=e.dataset.peerId.toPeerId();(0,cs.Z)(a)||(a=e);let d=i.get(l);if(d||i.set(l,d=new Set),!d.has(r)){const c=this.isMidSelected(l,r);if(void 0===n&&(n=!c),d.add(r),n&&!c||!n&&c){const n=qs(i);if(this.toggleByElement&&s){n<2&&(0,Ws.Z)(e,a)&&(a=e);const s=t(a,e);s.length&&s.forEach((e=>{o(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===n&&this.toggleByMid)for(const[e,t]of i)for(const s of t)this.toggleByMid(e,s)}}};let r=!1;const c=e=>{r||(Ks(),r=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,n)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",c),void this.listenerSetter.removeManual(document,"mouseup",h,p)):void o(t)},h=e=>{i.size&&(0,l.fc)(window,d.d,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",c),Ks()},p={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",c),this.listenerSetter.add(document)("mouseup",h,p)}))}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const s=!!this.getCheckboxInputFromElement(e);if(t){if(s)return!1;const t=new ut.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else s&&this.getCheckboxInputFromElement(e).parentElement.remove();return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){const t=this.selectedMids.size;if(!t&&!e)return;let s=!t,i=!t,n=!t;for(const[e,t]of this.selectedMids){const n=this.isScheduled?this.appMessagesManager.getScheduledMessagesStorage(e):this.appMessagesManager.getMessagesStorage(e);for(const e of t){const t=this.appMessagesManager.getMessageFromStorage(n,e);if(s||(s=!this.appMessagesManager.canForward(t)),i||(i=!this.appMessagesManager.canDeleteMessage(t)),s&&i)break}if(s&&i)break}this.onUpdateContainer&&this.onUpdateContainer(s,i,n)}toggleSelection(e=!0,t=!1){const s=this.isSelecting,i=this.selectedMids.size;if(this.isSelecting=!!i||t,s===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),ce.IS_TOUCH_SUPPORTED||(this.listenElement.classList.toggle("no-select",this.isSelecting),s&&Ks()),(0,Gs.Z)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),ne.IS_MOBILE_SAFARI||(n?F.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):F.Z.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,Jt.Z)(e,"is-selected",t,200)}isMidSelected(e,t){const s=this.selectedMids.get(e);return null==s?void 0:s.has(t)}length(){return qs(this.selectedMids)}toggleMid(e,t,s){let i=this.selectedMids.get(e);if(s||void 0===s&&(null==i?void 0:i.has(t)))i&&(i.delete(t),i.size||this.selectedMids.delete(e));else{if(a.default.config.forwarded_count_max-this.length()-1<0)return rt(k.default.format("Chat.Selection.LimitToast",!0)),!1;i||(i=new Set,this.selectedMids.set(e,i)),i.add(t)}return!0}deleteSelectedMids(e,t){const s=this.selectedMids.get(e);s&&(t.forEach((e=>{s.delete(e)})),s.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class Qs extends $s{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new B.Z,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,Me.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,s=e.dataset.peerId.toPeerId();this.toggleMid(s,t)&&this.updateElementSelection(e,this.isMidSelected(s,t))},this.toggleByMid=(e,t)=>{const s=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(s)},this.onUpdateContainer=(e,t,s)=>{const i=this.length();(0,T.Z)(this.selectionCountEl,(0,k.i18n)("messages",[i])),this.selectionGotoBtn.classList.toggle("hide",1!==i),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,Jt.Z)(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)})),(0,Jt.Z)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=N(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",(()=>this.cancelSelection()),{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=N(`message ${e}-goto`);const s={listenerSetter:this.listenerSetter};(0,l.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),a.default.dispatchEvent("history_focus",{peerId:e,mid:t})}),s),this.selectionForwardBtn=N(`forward ${e}-forward`),(0,l.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort(((e,t)=>e-t));new Hs(e,(()=>{this.cancelSelection()}))}),s),this.isPrivate&&(this.selectionDeleteBtn=N(`delete danger ${e}-delete`),(0,l.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new zs(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),s)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const i=this.selectionContainer;i.style.opacity="0",this.searchSuper.navScrollableContainer.append(i),i.offsetLeft,i.style.opacity=""}},this.isPrivate=!e.showSender}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);return s&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),s}}class Ys extends $s{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>(0,Me.Z)(e,"grouped-item")||(0,Me.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,s)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===s&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=s,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const e=this.selectedMids.get(this.bubbles.peerId);e&&this.chat.getMidsByMid(t).forEach((t=>e.delete(t)))}this.bubbles.getBubbleGroupedItems(e).forEach(this.toggleByElement)}else if(this.toggleMid(this.bubbles.peerId,t)){if(e.classList.contains("grouped-item")){const s=(0,Me.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(s),n=this.isGroupedMidsSelected(t);(n||i)&&this.updateElementSelection(s,n)}this.updateElementSelection(e,this.isMidSelected(this.bubbles.peerId,t))}},this.toggleByMid=(e,t)=>{const s=this.bubbles.getMountedBubble(t);s&&this.toggleByElement(s.bubble)},this.onToggleSelection=(e,t)=>{const{needTranslateX:s,widthFrom:i,widthTo:n}=this.chat.input.center(t);(0,Jt.Z)(this.listenElement,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)}));const a=ithis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,U.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,k.i18n)("MessageScheduleSend")),(0,l.fc)(this.selectionSendNowBtn,(()=>{new js(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,U.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,k.i18n)("Forward")),(0,l.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort(((e,t)=>e-t));new Hs(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,U.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,k.i18n)("Delete")),(0,l.fc)(this.selectionDeleteBtn,(()=>{new zs(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const s=this.selectionLeft=document.createElement("div");s.classList.add("selection-container-left"),s.append(t,this.selectionCountEl);const i=this.selectionRight=document.createElement("div");i.classList.add("selection-container-right"),i.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==a&&(s.style.transform=`translateX(${-a}px)`,i.style.transform=`translateX(${a}px)`),this.selectionContainer.append(s,i),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",s.style.transform="",i.style.transform=""}}else this.selectionLeft&&void 0!==a&&(this.selectionLeft.style.transform=`translateX(-${a}px)`,this.selectionRight.style.transform=`translateX(${a}px)`)},this.onUpdateContainer=(e,t,s)=>{(0,T.Z)(this.selectionCountEl,(0,k.i18n)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",s),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>{for(const[e,t]of this.selectedMids)for(const e of t){const t=this.bubbles.getMountedBubble(e);t&&this.toggleByElement(t.bubble)}}}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e)for(const e in this.bubbles.bubbles){const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return s}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const s=super.toggleElementCheckbox(e,t);return s&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),s}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(+e.dataset.mid))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}isGroupedMidsSelected(e){const t=this.chat.getMidsByMid(e),s=t.filter((e=>this.isMidSelected(this.bubbles.peerId,e)));return t.length===s.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}var Xs=s(7401),Js=s(3738),ei=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ti{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{a.default.dispatchEvent("history_focus",{peerId:this.peerId,mid:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,l.tH)(this.searchSuper.selection.selectionForwardBtn):new Hs({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,l.tH)(this.searchSuper.selection.selectionDeleteBtn):new zs(this.peerId,[this.mid],"chat")};ce.IS_TOUCH_SUPPORTED||(0,J.Eo)(e,(e=>{let s;this.init&&(this.init(),this.init=null);try{s=(0,Me.Z)(e.target,"search-super-item")}catch(e){}if(s){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.target=s,this.peerId=s.dataset.peerId.toPeerId(),this.mid=+s.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),this.buttons.forEach((e=>{let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||e.verify()),e.element.classList.toggle("hide",!t)})),s.classList.add("menu-open"),(0,J.oy)(e,this.element),(0,J.YP)(this.element,(()=>{s.classList.remove("menu-open")}))}}))}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>i.Z.canForward(i.Z.getMessageByPeer(this.peerId,this.mid))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>i.Z.canDeleteMessage(i.Z.getMessageByPeer(this.peerId,this.mid))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=Ce(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class si{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new X.ZP,this.middleware=(0,As.k)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,$.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,w.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new ti(this.container,this),this.selection=new Qs(this,i.Z);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const s=this.navScrollable=new P.v7(t);s.container.classList.add("search-super-nav-scrollable");const n=this.nav=document.createElement("nav");n.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=n,s.container.append(n);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("i");s.append((0,k.i18n)(e.name)),s.append(i),t.append(s),(0,ee.ripple)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),ce.IS_TOUCH_SUPPORTED&&Ns({element:this.tabsContainer,onSwipe:(e,t,s)=>{const i=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=i+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,d.d)(e)};let s=2;const i=()=>{--s||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",i,{once:!0}),i}(this.tabsContainer),this.selectTab(o))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const s=document.createElement("div");s.classList.add("search-super-content-"+e.type),t.append(s),this.tabsContainer.append(t),this.tabs[e.inputFilter]=s,e.contentTab=s}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new x(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&!this.loaded[this.mediaTab.inputFilter]&&this.load(!0)},this.selectTab=(0,Y.X)(this.tabsMenu,this.tabsContainer,((e,t,s)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start"});const i=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(i);const n=this.mediaTab;if(this.mediaTab=i,-1!==this.prevTabId&&s&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(i.scroll={scrollTop:n,scrollHeight:0})}if(i.scroll){const e=n.scroll.scrollTop-i.scroll.scrollTop;e&&(i.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||i.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()}),void 0,s),(0,l.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,d.d)(e),this.selection.toggleByElement((0,Me.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=(0,Me.Z)(n.target,e);if(!a)return;const o=+a.dataset.mid;if(!o)return void this.log.warn("no messageId by click on target:",a);const r=a.dataset.peerId.toPeerId(),l=Array.from(this.tabs[s].querySelectorAll("."+t)).map((t=>{const s=(0,Me.Z)(t,e);return{element:t,mid:+s.dataset.mid,peerId:s.dataset.peerId.toPeerId()}})),d=l.findIndex((e=>e.mid===o&&e.peerId===r)),c=i.Z.getMessageByPeer(r,o);(new Vl).setSearchContext(this.copySearchContext(s)).openMedia(c,l[d].element,0,!1,l.slice(0,d),l.slice(d+1))};(0,l.fc)(this.tabs.inputMessagesFilterPhotoVideo,o.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),(0,l.fc)(this.tabs.inputMessagesFilterDocument,o.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],(0,xs.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}))}filterMessagesByType(e,t){if("inputMessagesFilterEmpty"===t)return e;"inputMessagesFilterUrl"!==t&&(e=e.filter((e=>!!e.media)));let s=[];switch(t){case"inputMessagesFilterPhotoVideo":for(let t of e){let e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document;e&&("document"===e._&&"video"!==e.type||s.push(t))}break;case"inputMessagesFilterDocument":for(let t of e)t.media.document&&!["voice","audio","gif","sticker","round"].includes(t.media.document.type)&&s.push(t);break;case"inputMessagesFilterUrl":for(let t of e)s.push(t);break;case"inputMessagesFilterMusic":for(let t of e)t.media.document&&"audio"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterVoice":for(let t of e)t.media.document&&"voice"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterRoundVoice":for(let t of e)t.media.document&&["voice","round"].includes(t.media.document.type)&&s.push(t)}return s}processEmptyFilter({message:e,searchGroup:t}){const{dialog:s,dom:i}=pd.addDialogNew({dialog:e.peerId,container:t.list,drawStatus:!1,avatarSize:54});pd.setLastMessage(s,e,i,this.searchContext.query)}processPhotoVideoFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){const a=i.Z.getMediaFromMessage(e),o=document.createElement("div");let l;o.classList.add("grid-item");const d=r.Z.choosePhotoSize(a,200,200);l="photo"!==a._?ys({doc:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:d}).thumb:Ss({photo:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,withoutPreloader:!0,noBlur:!0,size:d}),[l.images.thumb,l.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(l.loadPromises.thumb),n.push({element:o,message:e})}processDocumentFilter({message:e,elemsToAppend:t,inputFilter:s}){const n=i.Z.getMediaFromMessage(e),a=this.showSender||["voice","round"].includes(n.type),o=ws({message:e,withTime:!a,fontWeight:400,voiceAsMusic:!0,showSender:a,searchContext:this.copySearchContext(s),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});["audio","voice","round"].includes(n.type)&&o.classList.add("audio-48"),t.push({element:o,message:e})}processUrlFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){var a;let o=null===(a=e.media)||void 0===a?void 0:a.webpage;if(!o){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let s,i,n;if(t)n=e.message.slice(t.offset,t.offset+t.length);else{const t=Q.Z.matchUrl(e.message);if(!t)return;s=t[0]}s="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:s||n,i=s;const a=e.message===s;s.match(/^(ftp|http|https):\/\//)||(i="https://"+s,s=s.includes("@")?s:"https://"+s),i=new URL(i).hostname,o={_:"webPage",url:s,display_url:i,id:"",hash:0},a||(o.description=e.message,o.rDescription=Q.Z.wrapRichText((0,ze.Z)(e.message,150,180)))}let l=document.createElement("div");l.classList.add("preview","row-media"),o.photo?Ss({container:l,message:null,photo:o.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,size:r.Z.choosePhotoSize(o.photo,60,60,!1),loadPromises:t,noBlur:!0}):(l.classList.add("empty"),l.innerHTML=Q.Z.getAbbreviation(o.title||o.display_url||o.description||o.url,!0));let d=o.rTitle||"",c=o.rDescription||"";const h=(0,Vs.Z)(c),p=(0,Vs.Z)(Q.Z.wrapRichText(o.url||"")).firstElementChild;if(p instanceof HTMLAnchorElement)try{p.innerText=decodeURIComponent(p.href)}catch(e){}h.firstChild&&h.append("\n"),h.append(p),this.showSender&&h.append("\n",i.Z.wrapSenderToPeer(e)),d||(d=Q.Z.wrapPlainText(o.display_url.split("/",1)[0]));const u=new et({title:d,titleRight:i.Z.wrapSentTime(e),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});u.container.append(l),u.container.innerText.trim().length&&n.push({element:u.container,message:e})}performSearchResult(e,t,s=!0){return ei(this,void 0,void 0,(function*(){const i=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield(0,xs.e9)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const d={elemsToAppend:i,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(l){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);for(const t of e)try{d.message=t,c(d)}catch(e){this.log.error("error rendering filter",l,d,t,e)}}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(i.length){const e=s?"append":"prepend";i.forEach((t=>{const{element:s,message:i}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?i.date:0,l);s.classList.add("search-super-item"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,n.items[e](s),this.selection.isSelecting&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===l?1:e.length,n)}}))}afterPerforming(e,t){if(t){const s=t.parentElement;if(Array.from(s.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),s.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const s=this.searchContext.query;if(s){const r=(t,i,r=!1)=>{t.forEach((t=>{if(e.has(t))return;e.add(t);const l=o.Z.getPeer(t),{dom:d}=pd.addDialogNew({dialog:t,container:i.list,drawStatus:!1,avatarSize:48,autonomous:i.autonomous});if(r&&(l.participants_count||l.participants)){const e=new RegExp(`(${(0,Js.Z)(s)}|${(0,Js.Z)((0,hs.ZP)(s))})`,"gi");d.titleSpan.innerHTML=d.titleSpan.innerHTML.replace(e,"$1"),d.lastMessageSpan.append(n.default.getChatMembersString(t.toChatId()))}else if(t===a.default.myId)d.lastMessageSpan.append((0,k.i18n)("Presence.YourChat"));else{let e=o.Z.getPeerUsername(t);if(e)e="@"+e;else{const s=E.Z.getUser(t);s&&s.phone&&(e="+"+(0,Os.u)(s.phone).formatted)}d.lastMessageSpan.innerHTML=""+e+""}})),i.toggle()},d=e=>{if(t())return e};return Promise.all([E.Z.getContactsPeerIds(s,!0).then(d).then((e=>{e&&r(e,this.searchGroups.contacts,!0)})),E.Z.searchContacts(s,20).then(d).then((e=>{if(e&&(r(e.my_results,this.searchGroups.contacts,!0),r(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new k.default.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,l.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),i.Z.getConversations(s,0,20,0).promise.then(d).then((e=>{e&&r(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>M.default.getState().then((s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach((e=>{let{dialog:t,dom:s}=pd.addDialogNew({dialog:e,container:this.searchGroups.recent.list,drawStatus:!1,meAsSaved:!0,avatarSize:48,autonomous:!0});s.lastMessageSpan.append(e.isUser()?E.Z.getUserStatusString(e):n.default.getChatMembersString(e.toChatId()))})),s.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([E.Z.getTopPeers("correspondents").then((e=>{if(!t())return;const s=e.findIndex((e=>e.id===a.default.myId));-1!==s&&(e=e.slice()).splice(s,1),e.length&&e.forEach((e=>{pd.addDialogNew({dialog:e.id,container:this.searchGroups.people.list,drawStatus:!1,onlyFirstName:!0,avatarSize:54,autonomous:!1})})),this.searchGroups.people.setActive()})),e()])}}loadMembers(e){const t=this.searchContext.peerId.toChatId(),s=this.middleware.get();let i;const a=t=>ei(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new Rs({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),(0,l.fc)(this.membersList.list,(e=>{const t=(0,ft.Z)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();v.ZP.isMobile&&(i=Yt.toggleSidebar(!1)),i.then((()=>{Ol.setInnerPeer({peerId:s})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab)),t.forEach((e=>{const t=j.Z.getParticipantPeerId(e);t.isAnyChat()||E.Z.getUser(t).pFlags.deleted||this.membersList.add(t)})))}));if(j.Z.isChannel(t)){const o=this.membersList?200:50;i=n.default.getChannelParticipants(t,void 0,o,this.nextRates[e.inputFilter]).then((t=>{if(!s())return;let i=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(i?i.childElementCount:0)+t.participants.length,t.participants.length{if(!s())return;this.loaded[e.inputFilter]=!0;const i=t.participants;return"chatParticipantsForbidden"!==i._?a(i.participants):void 0}));return this.loadPromises[e.inputFilter]=i.finally((()=>{s()&&(this.loadPromises[e.inputFilter]=null)}))}loadType(e,t,s,n){var a,o;const r=e.inputFilter;if(this.loadPromises[r])return this.loadPromises[r];if("members"===e.type)return this.loadMembers(e);const l=null!==(a=this.historyStorage[r])&&void 0!==a?a:this.historyStorage[r]=[];if(!("inputMessagesFilterEmpty"!==r||l.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[r]=!0,Promise.resolve();const d="load ["+r+"]: ";if(l.length&&this.usedFromHistory[r]i.Z.getMessageByPeer(e.peerId,e.mid))),r))}while(a{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}let c=l.length?l[l.length-1].mid:0;return this.loadPromises[r]=i.Z.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:r},maxId:c,limit:s,nextRate:null!==(o=this.nextRates[r])&&void 0!==o?o:this.nextRates[r]=0})).then((i=>{if(l.push(...i.history.map((e=>({mid:e.mid,peerId:e.peerId})))),this.log(d+"search house of glass",r,i),n())return(i.history.length{setTimeout((()=>{if(n()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{n()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(i.history,r),e))})).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[r]=null}))}load(e=!1,t=!1){return ei(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(this.hideEmptyTabs){const e=this.mediaTabs.filter((e=>"inputMessagesFilterEmpty"!==e.inputFilter)),t=e.map((e=>({_:e.inputFilter}))),a=yield i.Z.getSearchCounters(s,t);if(!n())return;if(this.loadMutex&&(yield this.loadMutex,!n()))return;let o,r=0;e.forEach((e=>{const t=a.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&void 0===o&&(o=e),t.count&&++r}));const l=this.mediaTabsMap.get("members"),d=this.canViewMembers();l.menuTab.classList.toggle("hide",!d),d&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),o.menuTab.classList.add("active"),this.navScrollableContainer.classList.toggle("hide",r<=1))}this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>{const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(Ct.Z.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var s;const i=new Date(1e3*e);i.setHours(0,0,0),i.setDate(1);const n=i.getTime(),a=null!==(s=this.monthContainers[t])&&void 0!==s?s:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const s=document.createElement("div");s.classList.add("search-super-month-name");const o={month:"long"};i.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new k.default.IntlDateElement({date:i,options:o}).element;s.append(r),e.append(s);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(s,l);const d=(0,Xs.Z)(a,"desc");let c=0;for(;cd[c]);++c);a[n]={container:e,items:l},Zs(e,this.tabs[t],c)}return a[n]}canViewMembers(){return this.searchContext.peerId.isAnyChat()&&!j.Z.isBroadcast(this.searchContext.peerId.toChatId())&&j.Z.hasRights(this.searchContext.peerId.toChatId(),"view_participants")}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach((e=>{URL.revokeObjectURL(e)})),this.urlsToRevoke.length=0),this.mediaTabs.forEach((e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,J.y7)(t,!0);const s=t.querySelector(".content-empty");s&&s.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,pe.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:s,historyStorage:i,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:s,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=i?i:{},this.cleanup()}}var ii,ni=s(5185),ai=s(4847);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(ii||(ii={}));const oi=new class{constructor(){this.privacy={},a.default.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,a.default.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return ct.Z.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((s=>(E.Z.saveApiUsers(s.users),j.Z.saveApiChats(s.chats),ni.Z.processLocalUpdate({_:"updatePrivacy",key:{_:(0,ai.Z)(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=(0,ai.Z)(t._),t}))}),s.rules)))}getPrivacy(e){const t=(0,ai.Z)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=ct.Z.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(E.Z.saveApiUsers(e.users),j.Z.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getPrivacyRulesDetails(e){const t=[];let s={users:[],chats:[]},i={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueAllowUsers":s.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueDisallowUsers":i.users.push(...e.users)}})),{type:t[0],disallowPeers:i,allowPeers:s}}};re.GO.appPrivacyManager=oi;const ri=oi;class li{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],s=this.radioSection.caption;t?(0,k._i18n)(s,t):s.innerHTML="",s.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===ii.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===ii.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new Mn({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:ii.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:ii.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:ii.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,it.a)();t.forEach((({type:e,langKey:t})=>{const i=new et({radioField:new at({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const i=tt([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=En(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((s=>{s.row=new et(s),s.row.container.addEventListener("click",(()=>{n.then((()=>{const t=this.peerIds[s.key];new Bt(e.tab.slider).open({type:"privacy",skippable:!0,title:s.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),s.row.subtitle.innerHTML="",s.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(s.row.container)}))}const n=ri.getPrivacy(e.inputKey).then((t=>{const s=ri.getPrivacyRulesDetails(t);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{const t=[];switch(this.type){case ii.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case ii.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case ii.Nobody:t.push({_:"inputPrivacyValueDisallowAll"})}this.exceptions&&[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]].forEach((([e,s,i],n)=>{if(this.exceptions.get(e).row.container.classList.contains("hide"))return;const a=this.peerIds[e];if(a){const e=this.splitPeersByType(a);e.chats.length&&t.push({_:s,chats:e.chats}),e.users.length&&t.push({_:i,users:e.users.map((e=>E.Z.getUserInput(e)))})}})),ri.setPrivacy(e.inputKey,t)}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,k.join)([e.users.length?(0,k.i18n)("Users",[e.users.length]):null,e.chats.length?(0,k.i18n)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,k.i18n)("PrivacySettingsController.AddUsers")]}}class di extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="PrivacyPhoneInfo",t=new li({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[e,e,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{i.setRadio(ii.Everybody),i.radioSection.container.classList.toggle("hide",e!==ii.Nobody)}}),s="PrivacyPhoneInfo3",i=new li({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[ii.Nobody]});this.scrollable.container.insertBefore(i.radioSection.container,t.radioSection.container.nextSibling)}}var ci=s(634);class hi extends O{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new Mn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=ds.Z.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?Is({doc:t,div:s,loop:!0,play:!0,width:160,height:160}).then((()=>{})):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=(0,U.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,l.fc)(a,(e=>{this.close()})),this.slider.sliceTabsUntilTab(un,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var pi=s(4489);function ui(e){return!ne.IS_MOBILE_SAFARI||!e}class gi extends O{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new Mn({caption:!0,noDelimiter:!0});(0,k._i18n)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=ds.Z.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?Is({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"📬"}).then((()=>{})):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.codeInputField=new pi.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{c(!0),ci.Z.confirmPasswordEmail(""+e).then((e=>{d()})).catch((e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),(0,T.Z)(a.label,(0,k.i18n)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),(0,T.Z)(a.label,(0,k.i18n)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}c(!1)}))}}),o=(0,U.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=(0,U.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),d=()=>{new hi(this.slider).open()},c=e=>{(0,mt.Z)([a.input,o,r],e)};(0,l.fc)(o,(e=>{c(!0),ci.Z.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab(mi,this),this.close()}),(()=>{c(!1)}))})),(0,l.fc)(r,(e=>{c(!0);const t=(0,J.y7)(r);ci.Z.resendPasswordEmail().then((e=>{t.remove(),c(!1)}))})),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){ui(this.isFirst)&&this.codeInputField.input.focus()}}class mi extends O{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new Mn({caption:!0,noDelimiter:!0}),t=ds.Z.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?Is({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💌"}).then((()=>{})):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.inputField=new _.Z({name:"recovery-email",label:"RecoveryEmail",plainText:!0});a.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,d.d)(e),h()})),a.input.addEventListener("input",(e=>{a.input.classList.remove("error")}));const o=(0,U.Z)("btn-primary btn-color-primary",{text:"Continue"}),r=(0,U.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=()=>{new hi(this.slider).open()},h=()=>{const e=a.value.trim(),t=Q.Z.matchEmail(e);if(!t||t[0].length!==e.length)return void a.input.classList.add("error");p(!0);const s=(0,J.y7)(o);ci.Z.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{c()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const s=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],i=new gi(this.slider);i.state=this.state,i.email=e,i.length=s,i.open()}else console.log("password set error",t);p(!1),s.remove()}))};(0,l.fc)(o,h);const p=e=>{e?(o.setAttribute("disabled","true"),r.setAttribute("disabled","true")):(o.removeAttribute("disabled"),r.removeAttribute("disabled"))};(0,l.fc)(r,(e=>{new gt("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),(0,J.y7)(r),ci.Z.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{c()}),(e=>{p(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){ui(this.isFirst)&&this.inputField.input.focus()}}var vi=s(4425),fi=s(6830),bi=s(3083);class yi extends O{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new Mn({noDelimiter:!0}),t=ds.Z.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?Is({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💡"}).then((()=>{})):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=document.createElement("div");i.classList.add("input-wrapper");const n=this.inputField=new _.Z({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,d.d)(e),n.value?c():h()}));const a=(e,t)=>{e&&(0,d.d)(e);const s=t?n.value:void 0;if(s&&this.newPassword===s)return void rt(k.default.format("PasswordAsHintError",!0));const i=new mi(this.slider);i.state=this.state,i.plainPassword=this.plainPassword,i.newPassword=this.newPassword,i.hint=s,i.open()},o=(0,U.Z)("btn-primary btn-color-primary",{text:"Continue"}),r=(0,U.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=e=>a(e,!0),h=e=>a(e,!1);(0,l.fc)(o,c),(0,l.fc)(r,h),i.append(n.container,o,r),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class wi extends O{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new Mn({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new fi.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new bi.Z(s,157),n=(0,U.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(s.container,n),e.content.append(i.container,t),this.scrollable.container.append(e.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&s.setState(_.I.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===s.value||(s.setError(),!1),o=e=>{if(e&&(0,d.d)(e),!a())return;const t=new yi(this.slider);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,l.fc)(n,o),i.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class Si extends O{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new Mn({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new fi.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?Q.Z.wrapEmojiText(this.state.hint):void 0}),n=new vi.Z(i,157),a=(0,U.Z)("btn-primary btn-color-primary"),o=new k.default.IntlElement({key:"Continue"});a.append(o.element),s.append(i.container,a),t.content.append(n.container,s),this.scrollable.container.append(t.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&(i.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return c()}));const r=()=>!!i.value.length||(i.input.classList.add("error"),!1);let c;if(e)c=e=>{if(e&&(0,d.d)(e),!r())return;const t=new wi(this.slider);t.state=this.state,t.newPassword=i.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),ci.Z.getState().then((e=>{this.state=e,this.state.hint?i.label.innerHTML=Q.Z.wrapEmojiText(this.state.hint):(0,T.Z)(i.label,(0,k.i18n)("LoginPassword"))})));c=s=>{if(!r())return void(0,d.d)(s);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const l=(0,J.y7)(a),c=i.value;ci.Z.check(i.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new Ci(this.slider);t.state=this.state,t.plainPassword=c,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),i.input.classList.add("error"),e.type,o.key="TwoStepAuth.InvalidPassword",o.update(),l.remove(),i.select(),t()}))},t()}return(0,l.fc)(a,c),n.load()}onOpenAfterTimeout(){ui(this.isFirst)&&this.passwordInputField.input.focus()}}class Ci extends O{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new Mn({caption:!0,noDelimiter:!0}),t=ds.Z.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?Is({doc:t,div:s,loop:!1,play:!0,width:168,height:168,emoji:"🔐"}).then((()=>{})):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,k._i18n)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,U.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,U.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,U.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,l.fc)(t,(()=>{const e=new Si(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,l.fc)(s,(()=>{new gt("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{ci.Z.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(un,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,l.fc)(n,(()=>{const e=new mi(this.slider);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()})),i.append(t,s,n)}else{(0,k._i18n)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,U.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,l.fc)(s,(e=>{const t=new Si(this.slider);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class Li extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new li({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class Ii extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new li({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[ii.Nobody]})}}class Mi extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new li({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class Ei extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new li({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[ii.Nobody]})}}class Pi extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new li({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new li({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Ti extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new et({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,ie.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const s=document.createElement("div");return s.classList.add("row-midtitle"),s.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(s,t.subtitle),t},t=this.authorizations.slice();{const n=new Mn({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=t.findAndSplice((e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,U.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,l.fc)(e,(t=>{new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,mt.Z)([e],!0);ct.Z.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),s.container.remove()}),i).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()})),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const s=new Mn({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{s.content.append(e(t).container)})),this.scrollable.append(s.container);const i=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&rt(k.default.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{ct.Z.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Ce([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,J.Eo)(this.scrollable.container,(e=>{n=(0,Me.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,J.oy)(e,o),(0,J.YP)(o))})),(0,l.fc)(this.scrollable.container,(e=>{n=(0,Me.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}))}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class ki extends O{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");{const e=new Mn({caption:"BlockedUsersInfo"});this.scrollable.append(e.container)}const e=W({icon:"add",className:"is-visible"});this.content.append(e),(0,l.fc)(e,(e=>{new Et({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{E.Z.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const t=pd.createChatList();this.scrollable.container.classList.add("chatlist-container"),this.scrollable.append(t);const s=(e,s)=>{const{dom:i}=pd.addDialogNew({dialog:e,container:t,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:s}),n=E.Z.getUser(e);n.pFlags.bot?i.lastMessageSpan.append("@"+n.username):n.phone?i.lastMessageSpan.innerHTML=E.Z.formatUserPhone(n.phone):i.lastMessageSpan.append(n.username?"@"+n.username:E.Z.getUserStatusString(e))};for(const e of this.peerIds)s(e,!0);let i;const n=this.menuElement=Ce([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=i.dataset.peerId.toPeerId();E.Z.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);n.id="blocked-users-contextmenu",n.classList.add("contextmenu"),document.getElementById("page-chats").append(n),(0,J.Eo)(this.scrollable.container,(e=>{i=(0,ft.Z)(e.target,"LI"),i&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,J.oy)(e,n),(0,J.YP)(n))}),this.listenerSetter),this.listenerSetter.add(a.default)("peer_block",(e=>{const{peerId:i,blocked:n}=e,a=t.querySelector(`[data-peer-id="${i}"]`);n?a||s(i,!1):a&&a.remove()}));let o=!1;this.scrollable.onScrolledBottom=()=>{o||(o=!0,E.Z.getBlocked(t.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||t.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{o=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var xi=s(5667);function Ai(e){return"input"+(e[0].toUpperCase()+e.slice(1))}class _i extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const e="Loading";{const t=new Mn({noDelimiter:!0,caption:"SessionsInfo"});let s;const i=new et({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:e,clickable:()=>{const e=new ki(this.slider);e.peerIds=s,e.open()}});let n;i.freezed=!0;const o=new et({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:e,clickable:e=>{let t;n.pFlags.has_password?t=new Si(this.slider):n.email_unconfirmed_pattern?(t=new gi(this.slider),t.email=n.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,ci.Z.resendPasswordEmail()):t=new Ci(this.slider),t.state=n,t.open()}});o.freezed=!0;const r=this.activeSessionsRow=new et({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:e,clickable:()=>{const e=new Ti(this.slider);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()}});r.freezed=!0,t.content.append(i.container,o.container,r.container),this.scrollable.append(t.container);const l=e=>{e?(0,T.Z)(i.subtitle,(0,k.i18n)("PrivacySettingsController.UserCount",[e])):(0,T.Z)(i.subtitle,(0,k.i18n)("BlockedEmpty",[e]))};this.listenerSetter.add(a.default)("peer_block",(()=>{d()}));const d=()=>{E.Z.getBlocked().then((e=>{i.freezed=!1,l(e.count),s=e.peerIds}))};d(),ci.Z.getState().then((e=>{n=e,(0,T.Z)(o.subtitle,(0,k.i18n)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),o.freezed=!1})),this.updateActiveSessions()}{const t=new Mn({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});t.content.classList.add("privacy-navigation-container");const s={},i=s.inputPrivacyKeyPhoneNumber=new et({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:e,clickable:()=>{new di(this.slider).open()}}),n=s.inputPrivacyKeyStatusTimestamp=new et({titleLangKey:"LastSeenTitle",subtitleLangKey:e,clickable:()=>{new Li(this.slider).open()}}),o=s.inputPrivacyKeyProfilePhoto=new et({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:e,clickable:()=>{new Ii(this.slider).open()}}),r=s.inputPrivacyKeyPhoneCall=new et({titleLangKey:"WhoCanCallMe",subtitleLangKey:e,clickable:()=>{new Pi(this.slider).open()}}),l=s.inputPrivacyKeyForwards=new et({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:e,clickable:()=>{new Mi(this.slider).open()}}),d=s.inputPrivacyKeyChatInvite=new et({titleLangKey:"WhoCanAddMe",subtitleLangKey:e,clickable:()=>{new Ei(this.slider).open()}}),c=e=>{const t=s[e];t&&ri.getPrivacy(e).then((e=>{const s=ri.getPrivacyRulesDetails(e),i=s.type===ii.Everybody?"PrivacySettingsController.Everbody":s.type===ii.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=s.disallowPeers.users.length+s.disallowPeers.chats.length,a=s.allowPeers.users.length+s.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,k.i18n)(i);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};t.content.append(i.container,n.container,o.container,r.container,l.container,d.container),this.scrollable.append(t.container);for(const e in s)c(e);a.default.addEventListener("privacy_update",(e=>{c(Ai(e.key._))}))}const t=[];{const e=new Mn({name:"Privacy.SensitiveContent"});e.container.classList.add("hide"),t.push(ct.Z.invokeApi("account.getContentSettings").then((t=>{if(!t.pFlags.sensitive_can_change)return;const s=t.pFlags.sensitive_enabled,i=new et({checkboxField:new ut.Z({text:"PrivacyAndSecurity.SensitiveText",checked:s}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});e.content.append(i.container),e.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",(()=>{const e=i.checkboxField.checked;e!==s&&ct.Z.invokeApi("account.setContentSettings",{sensitive_enabled:e})}),{once:!0})}))),this.scrollable.append(e.container)}{const e=new Mn({name:"FilterChats"}),t=()=>{new gt("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,mt.Z)([s],!0);xi.Z.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},s=(0,U.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(s)("click",t),e.content.append(s),this.scrollable.append(e.container)}return Promise.all(t)}updateActiveSessions(){ct.Z.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,k._i18n)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}}function Zi(e){const t=e.getContext("2d"),s=new Array(4).fill(0),i=t.getImageData(0,0,e.width,e.height).data;for(let e=0;e.5?i/(2-n-a):i/(n+a),n){case e:o=(t-s)/i+(t1&&(s-=1),s<1/6?e+6*(t-e)*s:s<.5?t:s<2/3?e+(t-e)*(2/3-s)*6:e},r=s<.5?s*(1+t):s+t-s*t,l=2*s-r;n=i(l,r,e+1/3),a=i(l,r,e),o=i(l,r,e-1/3)}return[Math.round(255*n),Math.round(255*a),Math.round(255*o),Math.round(255*i)]}function Ri(e){const t=[],s="#"===e[0]?1:0;if(e.length===5+s&&(e=(s?"#":"")+"0"+e.slice(s)),e.length===3+s)for(let i=s;i("0"+e.toString(16)).slice(-2))).join("")}function Ni(e){let{h:t,s,l:i}=Di(e[0],e[1],e[2]);return s>0&&(s=Math.min(100,s+5+.1*(100-s))),i=Math.max(0,.65*i),`hsla(${t}, ${s}%, ${i}%, .4)`}class Oi{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{let e=this._scrollDelta/this._scrollTails;if(this._scrollDelta%=this._scrollTails,e=e>0?Math.floor(e):Math.ceil(e),e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}this._onWheelRAF=void 0},this.drawNextPositionAnimated=()=>{const e=this._frames,t=e.shift();t&&this.drawImageData(t);const s=e.length;return s||(this._animatingToNextPosition=void 0),!!s};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,s=this._curve.length;t{var i;return e-(null!==(i=s[t-1])&&void 0!==i?i:0)}))}hexToRgb(e){const t=Bi(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();for(;e>0;)t.push(t.shift()),--e;const s=[];for(let e=0;e({x:(e.x-i[s].x)/t,y:(e.y-i[s].y)/t})));return s.map((e=>n.map(((t,s)=>({x:i[s].x+t.x*e,y:i[s].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),s=t.data;let i=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d")),this._canvas=e,this._ctx=this._canvas.getContext("2d"),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(){var e;if(this._colors.length<2)return;const t=this._tail,s=this._tails;let i;const n=[];for(let a=0,o=this._incrementalCurve.length;as&&void 0===i&&(i=a,r%=s),n.push(r)}[n.slice(0,i),void 0!==i?n.slice(i):[]].forEach(((e,t,i)=>{const n=e[e.length-1];if(void 0!==n&&n>s&&(e[e.length-1]=+n.toFixed(2)),this._tail=null!=n?n:0,!e.length)return;const a=this.getNextPositions(this._phase,s,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=a.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,Ue.jt)(this.drawNextPositionAnimated)}scrollAnimate(e){this._colors.length<2&&e||(e&&!this._addedScrollListener?(document.addEventListener("wheel",this.onWheel),this._addedScrollListener=!0):!e&&this._addedScrollListener&&(document.removeEventListener("wheel",this.onWheel),this._addedScrollListener=!1))}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),s=new Oi;return s.init(t),{gradientRenderer:s,canvas:t}}}class Hi{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(Hi.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new _.Z({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new _.Z({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=Hi.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),s=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(s?_.I.Neutral:_.I.Error),e="#"+e,this.hexInputField.setValueSilently(e),s&&this.setColor(e,!1,!0)}));const s=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(s);this.rgbInputField.setState(e?_.I.Neutral:_.I.Error),e&&this.setColor(Di(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){be(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){be(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,s=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=function(e){const t=Ri(e);return Di(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=Di(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const i=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+i,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,s)}getCurrentColor(){const e=Fi(this.hue,this.saturation,this.lightness,this.alpha),t=Ui(e),s=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:s,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const s=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",s.hex),e&&(this.hexInputField.setValueSilently(s.hex),this.hexInputField.setState(_.I.Neutral)),t&&(this.rgbInputField.setValueSilently(s.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(_.I.Neutral)),this.onChange&&this.onChange(s)}hueHandler(e,t=!0){const s=(0,ye.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*s);const i=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*s+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",i),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",i),t&&this.updatePicker()}saturationHandler(e,t,s=!0){const i=this.boxRect.width,n=this.boxRect.height,a=(0,ye.Z)(e-this.boxRect.left,0,i)/i*100,o=(0,ye.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=(0,ye.Z)(a,0,100),d=100-l/2,c=100-(0,ye.Z)(o,0,100),h=(0,ye.Z)(c/100*d,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}Hi.BASE_CLASS="color-picker";class zi extends O{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=Ri(e),s=this.theme.background,i=Ni(t);s.id="2",s.intensity=0,s.slug="",s.color=e.toLowerCase(),s.highlightningColor=i,M.default.pushToState("settings",a.default.settings),Ol.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=a.default.getTheme();const e=new Mn({});this.colorPicker=new Hi,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new Mn({}),s=this.grid=document.createElement("div");s.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const i=document.createElement("div");i.classList.add("grid-item-media"),i.style.backgroundColor=e,t.append(i),s.append(t)})),(0,l.fc)(s,(e=>{const t=(0,Me.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const s=t.dataset.color;s&&this.applyColor(s)}),{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container),this.applyColor=(0,ms.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,s=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],s=!!t&&!e.slug;s&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),s||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}let Vi=0;class ji extends O{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallpapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(0,he.hf)("image/x-png,image/png,image/jpeg").then((e=>{const t="wallpaper-upload-"+ ++Vi,s={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let i={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[s],file_name:e.name};i=L.Z.saveDoc(i);const n=le.Z.getCacheContext(i);n.downloaded=e.size,n.url=URL.createObjectURL(e);let a={_:"wallPaper",access_hash:"",document:i,id:t,slug:t,pFlags:{}};const o=le.Z.upload(e,e.name),r=(0,se.b)();r.addNotifyListener=o.addNotifyListener,r.cancel=o.cancel,o.then((t=>{ct.Z.invokeApi("account.uploadWallPaper",{file:t,mime_type:e.type,settings:{_:"wallPaperSettings"}}).then((e=>{const t=e.document,s=le.Z.getCacheContext(t);Object.assign(s,n),a=e,a.document=L.Z.saveDoc(a.document),this.setBackgroundDocument(a).then(r.resolve,r.reject)}),r.reject)}),r.reject);const l=this.getWallpaperKey(a);r.then((()=>{this.clicked.delete(l)}),(e=>{c.remove()}));const d=new fe.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),c=this.addWallPaper(a,!1);this.clicked.add(l),d.attach(c,!1,r)}))},this.onResetClick=()=>{const e=M.STATE_INIT.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,pe.Z)(e.background),M.default.pushToState("settings",a.default.settings),Ol.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,Me.Z)(e.target,"grid-item");if(!t)return;const s=this.wallpapersByElement.get(t);if("wallPaperNoFile"===s._)return void this.setBackgroundDocument(s);const i=this.getWallpaperKey(s);if(this.clicked.has(i))return;this.clicked.add(i);const n=s.document,a=new fe.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>{const e=this.setBackgroundDocument(s);le.Z.getCacheContext(n).url&&!this.theme.background.blur||a.attach(t,!0,e)};a.construct(),(0,l.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{le.Z.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{let t=++this.tempId;const s=()=>t===this.tempId,i=e.document,n=(0,se.b)();let o;return i?(o=L.Z.downloadDoc(i,Ol.chat.bubbles?Ol.chat.bubbles.lazyLoadQueue.queueId:0),n.addNotifyListener=o.addNotifyListener,n.cancel=o.cancel):o=Promise.resolve(),o.then((()=>{if(!s())return void n.resolve();const t=this.theme.background,o=i=>{let o;if(i&&!this.theme.background.color)o=function(e){const t=document.createElement("img");return new Promise((s=>{(0,rs.ZP)(t,e,(()=>{const e=document.createElement("canvas"),i=t.naturalWidth/t.naturalHeight;1===i?(e.width=50,e.height=e.width/i):i>1?(e.height=50,e.width=e.height/i):e.width=e.height=50,e.getContext("2d").drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height),s(Zi(e))}))}))}(i);else{const{canvas:t}=Oi.create(this.getColorsFromWallpaper(e));o=Promise.resolve(Zi(t))}o.then((o=>{var r,l,d;if(!s())return void n.resolve();const c=Ni(Array.from(o)),h=null!==(r=e.slug)&&void 0!==r?r:"";t.id=e.id,t.intensity=null!==(d=null===(l=e.settings)||void 0===l?void 0:l.intensity)&&void 0!==d?d:0,t.color=this.getColorsFromWallpaper(e),t.slug=h,t.highlightningColor=c,M.default.pushToState("settings",a.default.settings),h&&this.saveToCache(h,i),Ol.applyCurrentTheme(h,i,!0).then(n.resolve)}))};if(!i)return void o();const r=le.Z.getCacheContext(i);t.blur?setTimeout((()=>{(0,ps.Z)(r.url,12,4).then((e=>{s()?o(e):n.resolve()}))}),200):o(r.url)})),n},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallpaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground"),this.theme=a.default.getTheme();{const e=En(this.scrollable),s=(0,U.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=(0,U.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),n=(0,U.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,l.fc)(s,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,l.fc)(i,(()=>{new zi(this.slider).open()}),{listenerSetter:this.listenerSetter}),(0,l.fc)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new ut.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(o.input)("change",(()=>{this.theme.background.blur=o.input.checked,M.default.pushToState("settings",a.default.settings),setTimeout((()=>{const e=t.querySelector(".active");if(!e)return;const s=this.wallpapersByElement.get(e);s.pFlags.pattern||"wallPaperNoFile"===s._||this.setBackgroundDocument(s)}),100)})),e.append(s,i,n,o.label)}a.default.addEventListener("background_change",this.setActive),ct.Z.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{e.wallpapers.forEach((e=>{this.addWallPaper(e)}))}));const e=En(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),(0,l.fc)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallpaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map((e=>"#"+e.toString(16))).join(","):""}getWallpaperKey(e){return""+e.id}getWallpaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){var s;const i=this.getColorsFromWallpaper(e),n="wallPaper"===e._;if(n&&e.pFlags.pattern&&!i)return;const a=!!e.pFlags.dark,o=n?e.document=L.Z.saveDoc(e.document):void 0,l=document.createElement("div");l.classList.add("grid-item"),l.dataset.id=""+e.id;const d=this.getWallpaperKey(e);this.wallpapersByElement.set(l,e),this.elementsByKey.set(d,l);const c=document.createElement("div");let h,p;if(c.classList.add("grid-item-media"),n?(p=r.Z.choosePhotoSize(o,200,200),h=Ss({photo:o,message:null,container:c,withoutPreloader:!0,size:p,noFadeIn:e.pFlags.pattern}),(h.loadPromises.thumb||h.loadPromises.full).then((()=>{ls.Z.mutate((()=>{l.append(c)}))})),e.pFlags.pattern&&(c.classList.add("is-pattern"),a?(h.images.full.style.display="none",h.images.thumb&&(h.images.thumb.style.display="none")):(null===(s=e.settings)||void 0===s?void 0:s.intensity)&&(h.images.full.style.opacity=""+Math.abs(e.settings.intensity)/100))):l.append(c),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Oi.create(i);if(t.classList.add("background-colors-canvas"),a&&n){const s=le.Z.getCacheContext(o,p.type);h.loadPromises.full.then((()=>{t.style.webkitMaskImage=`url(${s.url})`,t.style.opacity=""+Math.abs(e.settings.intensity)/100,c.append(t)}))}else c.append(t)}return this.getWallpaperKeyFromTheme(this.theme)===d&&l.classList.add("active"),this.grid[t?"append":"prepend"](l),l}}const Gi="STICKERS-POPUP";class Ki extends pt.Z{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=(0,Me.Z)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;Ol.chat.input.sendMessageWithDocument(s)?this.hide():console.warn("got no doc by id:",s)},this.h6=document.createElement("h6"),this.h6.append((0,k.i18n)("Loading")),this.header.append(this.h6),this.addEventListener("close",(()=>{I.Z.setOnlyOnePlayableGroup("")}));const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),(0,l.fc)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),(0,J.y7)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const s=(0,U.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(s),this.body.append(t),new P.ZP(this.body),this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return ds.Z.getStickerSet(this.stickerSetInput).then((e=>{if(!e)return lt({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,I.Z.setOnlyOnePlayableGroup(Gi),this.h6.innerHTML=Q.o.wrapEmojiText(e.set.title),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=(0,U.Z)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append((0,k.i18n)("RemoveStickersCount",[(0,k.i18n)("Stickers",[e.set.count])]))):(t=(0,U.Z)("btn-primary btn-color-primary",{noRipple:!0}),t.append((0,k.i18n)("AddStickersCount",[(0,k.i18n)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),(0,l.fc)(t,(()=>{const e=(0,mt.Z)([t],!0);ds.Z.toggleStickerSet(this.set).then((()=>{this.hide()})).catch((()=>{e()}))}));const s=new X.ZP;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const i=v.ZP.active.esgSticker.width;Is({doc:t,div:e,lazyLoadQueue:s,group:Gi,play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}}))}}var Wi,qi=s(6761);const $i=!!(null===(Wi=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===Wi?void 0:Wi.getCurrentPosition)&&!1;class Qi extends O{init(){return this.header.classList.add("with-border"),this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([_t.Z.getQuickReaction(),_t.Z.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const s=new Mn,i=t.map((t=>{const s=new at({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),i=new et({radioField:s,havePadding:!0});return s.main.classList.add("quick-reaction-title"),Es({row:i,doc:t.static_icon,size:"small"}),t===e&&s.setValueSilently(!0),i})),n=tt(i,(e=>{_t.Z.setDefaultReaction(e)}));s.content.append(n),this.scrollable.append(s.container)}))}}class Yi{constructor(e,t,s,i,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const l=document.createElement("div");l.classList.add(o+"-name"),(0,k._i18n)(l,e);const d=this.valueContainer=document.createElement("div");d.classList.add(o+"-value"),a&&(d.innerHTML=""+s),r.append(l,d),this.range=new we({step:t,min:i,max:n},s),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(d.innerText=""+e)}}),this.container.append(r,this.range.container)}}class Xi extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=En.bind(null,this.scrollable);{const t=e("Settings"),s=new Yi("TextSize",1,a.default.settings.messagesTextSize,12,20);s.onChange=e=>{M.default.setByKey("settings.messagesTextSize",e)};const i=(0,U.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});(0,l.fc)(i,(()=>{new ji(this.slider).open()}));const n=new ut.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(s.container,i,n.label)}{const t=e("General.Keyboard"),s=document.createElement("form"),i="send-shortcut",n="settings.sendShortcut",a=new et({radioField:new at({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new et({radioField:new at({name:i,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,k._i18n)(o.radioField.main,"General.SendShortcut.CtrlEnter",[ne.IS_APPLE?"⌘":"Ctrl"]),s.append(a.container,o.container),t.append(s)}if($i){const t=e("DistanceUnitsTitle"),s=document.createElement("form"),i="distance-unit",n="settings.distanceUnit",a=new et({radioField:new at({langKey:"DistanceUnitsKilometers",name:i,value:"kilometers",stateKey:n})}),o=new et({radioField:new at({langKey:"DistanceUnitsMiles",name:i,value:"miles",stateKey:n})});s.append(a.container,o.container),t.append(s)}{const t=e("General.TimeFormat"),s=document.createElement("form"),i="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new et({radioField:new at({langKey:t,name:i,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,s=!0){const i=e;let n;return s||(e=_e.Z),function s(){e(),n=qi.Z.setTimeout(s,t())}(),e=i,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],s)=>{const i=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[s].subtitle.textContent=i}))}));this.eventListener.addEventListener("destroy",r),s.append(...o.map((e=>e.container))),t.append(s)}{const t=e("Emoji"),s=new ut.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new ut.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const e=new Mn({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new et({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{new Qi(this.slider).open()}}),s=()=>{Promise.resolve(_t.Z.getQuickReaction()).then((e=>{Es({row:t,doc:e.static_icon,size:"small"})}))};s(),this.listenerSetter.add(a.default)("quick_reaction",s);const i=new ut.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),n=new ut.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),o={},r=e.generateContentElement(),l=new X.ZP,d=(e,t="append")=>{const s=new et({title:Q.Z.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new Ki({id:e.id,access_hash:e.access_hash}).show()}});o[e.id]=s;const i=document.createElement("div");i.classList.add("row-media"),Ms({set:e,container:i,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),s.container.append(i),r[t](s.container)};ds.Z.getAllStickers().then((e=>{(0,gs.Z)(e);for(const t of e.sets)d(t)})),this.listenerSetter.add(a.default)("stickers_installed",(e=>{const t=e;o[t.id]||d(t,"prepend")})),this.listenerSetter.add(a.default)("stickers_deleted",(e=>{const t=e;o[t.id]&&(o[t.id].container.remove(),delete o[t.id])})),e.content.append(t.container,i.label,n.label),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}class Ji extends O{init(){return e=this,t=void 0,i=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=En(this.scrollable,void 0,"Bio.Description"),s=document.createElement("div");s.classList.add("input-wrapper"),this.firstNameInputField=new _.Z({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new _.Z({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new _.Z({label:"EditProfile.BioLabel",name:"bio",maxLength:70}),s.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const i=document.createElement("div");i.classList.add("caption"),(0,k.i18n_)({element:i,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new Xe({peerId:a.default.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,s)}{const t=new Mn({name:"EditAccount.Username",caption:!0}),s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new ht({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"}),s.append(this.usernameInputField.container);const i=t.caption;i.append((0,k.i18n)("UsernameSettings.ChangeDescription")),i.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append((0,k.i18n)("UsernameHelpLink",[a])),i.append(n),e.push(this.usernameInputField),t.content.append(s),this.scrollable.append(t.container)}(0,l.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(n.default.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>n.default.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(E.Z.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter});const t=E.Z.getSelf(),s=yield n.default.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(s.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()},new((s=void 0)||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}));var e,t,s,i}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}class en extends O{constructor(){super(...arguments),this.renderResults=e=>{return t=this,s=void 0,n=function*(){yield E.Z.getContacts(),e.forEach((e=>{const{dom:t}=pd.addDialogNew({dialog:e,container:this.selector.scrollable,drawStatus:!1,rippleEnabled:!0,avatarSize:46}),s=this.selector.selected.has(e);t.containerEl.append(this.checkbox(s));const i=[];this.dialogsByFilters.forEach(((t,s)=>{if(t.has(e)){const e=document.createElement("span");e.innerHTML=Q.Z.wrapEmojiText(s.title),i.push(e)}})),(0,k.join)(i,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))},new((i=void 0)||(i=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((n=n.apply(t,s||[])).next())}));var t,s,i,n},this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=N("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",(()=>{const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const s of e)s.isPeerId()?t.push(s.toPeerId()):this.filter.pFlags[s]=!0;let s;s="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,b.Z)(this.filter.pinnedPeerIds,((e,t)=>{s(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const i="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,b.Z)(this.filter[i],((e,s)=>{t.includes(e)&&(this.filter[i].splice(s,1),this.filter[n].splice(s,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=t.map((e=>o.Z.getInputPeerById(e))),this.editFolderTab.setFilter(this.filter,!1),this.close()})),this.dialogsByFilters=new Map,i.Z.filtersStorage.getDialogFilters().then((e=>{for(const t of e)this.dialogsByFilters.set(t,new Set(i.Z.dialogsStorage.getFolderDialogs(t.id).map((e=>e.peerId))))}))}checkbox(e){const t=new ut.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new Mn({noDelimiter:!0,name:"FilterChatTypes"});let s;t.container.classList.add("folder-categories"),s="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const i=document.createDocumentFragment();for(const e in s){const t=(0,U.Z)("btn-primary btn-transparent folder-category-button",{icon:s[e].ico,text:s[e].text});t.dataset.peerId=e,t.append(this.checkbox()),i.append(t)}t.content.append(i);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new Mt({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats"}),this.selector.selected=new Set(n);let a=!1;const o=this.selector.add.bind(this.selector);this.selector.add=(e,t,i)=>{if(this.selector.selected.size>=100&&a&&!s[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);return t&&setTimeout((()=>{t.checked=!1}),0),void rt(k.default.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=o(e,s[e]?(0,k.i18n)(s[e].text):void 0,i);return s[e]&&n.querySelector("avatar-element").classList.add("tgico-"+s[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const i in e.pFlags)s.hasOwnProperty(i)&&e.pFlags[i]&&t.content.querySelector(`[data-peer-id="${i}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,s){return this.originalFilter=e,this.filter=(0,pe.Z)(this.originalFilter),this.type=t,this.editFolderTab=s,super.open()}}class tn extends O{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,k.i18n)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=N("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new gt("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),i.Z.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{e.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=Ie({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new Mn({}),s=document.createElement("div");s.classList.add("input-wrapper"),this.nameInputField=new _.Z({label:"FilterNameHint",maxLength:12}),s.append(this.nameInputField.container),t.content.append(s);const n=(e,t,s,i)=>{const n=new Mn({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),s.forEach((e=>{const t=(0,U.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(i[e.name]=t),a.append(t)})),n};this.includePeerIds=n("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=n("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),o=this.excludePeerIds.container.querySelector(".folder-categories");a.querySelector(".btn").addEventListener("click",(()=>{new en(this.slider).open(this.filter,"included",this)})),o.querySelector(".btn").addEventListener("click",(()=>{new en(this.slider).open(this.filter,"excluded",this)})),this.confirmBtn.addEventListener("click",(()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(a.children).slice(1).reduce(((e,t)=>e+ +!t.style.display),0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?i.Z.filtersStorage.updateDialogFilter(this.filter):i.Z.filtersStorage.createDialogFilter(this.filter),e.then((e=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?rt("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):rt("Please choose at least one chat for this folder.")})),this.nameInputField.input.addEventListener("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const r="edit"===this.type?[i.Z.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),i.Z.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),i.Z.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=ae.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then((e=>(this.animation=e,ae.Z.waitForFirstFrame(e)))),...r])}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=Q.Z.wrapDraftText(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>{const s=this[t],i=pd.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20))),o.append((0,k.i18n)("FilterShowMoreChats",[n.length])),e.append(o)}a(4)}))}editCheckForChange(){if("edit"===this.type){const e=!(0,ue.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,pe.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then((()=>{"edit"===this.type?this.onEditOpen():this.onCreateOpen()}))}}class sn extends O{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,s){let n,a,r="",d=[];if("dialogFilterSuggested"===e._)n=e.filter,r=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&d.push((0,k.i18n)(t))}if(!d.length){const e=i.Z.dialogsStorage.getFolderDialogs(n.id);let t=0,s=0,a=0;for(const i of e)o.Z.isAnyGroup(i.peerId)?a++:o.Z.isBroadcast(i.peerId)?s++:t++;t&&d.push((0,k.i18n)("Chats",[t])),s&&d.push((0,k.i18n)("Channels",[s])),a&&d.push((0,k.i18n)("Groups",[a]))}}if(s)s.subtitle.textContent="",(0,k.join)(d).forEach((e=>{s.subtitle.append(e)}));else if(s=new et({title:Q.o.wrapEmojiText(n.title),subtitle:r,clickable:!0}),d.length&&(0,k.join)(d).forEach((e=>{s.subtitle.append(e)})),"dialogFilter"===e._){const e=n.id;this.filtersRendered.hasOwnProperty(n.id)||(0,l.fc)(s.container,(()=>{new tn(this.slider).open(i.Z.filtersStorage.getFilter(e))}),{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?Zs(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return e=this,t=void 0,n=function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),(0,k.i18n_)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,U.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new Mn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new Mn({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,l.fc)(this.createFolderBtn,(()=>{Object.keys(this.filtersRendered).length>=10?rt("Sorry, you can't create more folders."):new tn(this.slider).open()}),{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return i.Z.filtersStorage.getDialogFilters().then((e=>{for(const t of e)this.renderFolder(t,this.foldersSection.content);t()})),this.listenerSetter.add(a.default)("filter_update",(e=>{this.filtersRendered.hasOwnProperty(e.id)?this.renderFolder(e,null,this.filtersRendered[e.id]):this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()})),this.listenerSetter.add(a.default)("filter_delete",(e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()})),this.listenerSetter.add(a.default)("filter_order",(e=>{e.forEach(((e,t)=>{const s=this.filtersRendered[e].container;Zs(s,s.parentElement,t+1)}))})),this.loadAnimationPromise=ae.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then((e=>(this.animation=e,ae.Z.waitForFirstFrame(e)))),this.getSuggestedFilters(),this.loadAnimationPromise},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((n=n.apply(e,t||[])).next())}));var e,t,s,n}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}getSuggestedFilters(){return ct.Z.invokeApi("messages.getSuggestedDialogFilters").then((e=>{this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove())),e.forEach((e=>{const t=this.renderFolder(e),s=(0,U.Z)("btn-primary btn-color-primary",{text:"Add"});t.append(s),this.suggestedSection.content.append(t),(0,l.fc)(s,(n=>{if((0,d.d)(n),Object.keys(this.filtersRendered).length>=10)return void rt("Sorry, you can't create more folders.");s.setAttribute("disabled","true");const a=e.filter;a.includePeerIds=[],a.excludePeerIds=[],a.pinnedPeerIds=[],i.Z.filtersStorage.createDialogFilter(a,!0).then((e=>{e&&t.remove()})).finally((()=>{s.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter})}))}))}}class nn extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new Mn({name:e.name}),s=new et({checkboxField:new ut.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new et({checkboxField:new ut.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Ft.Z.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>{const e=Ft.Z.isMuted(t);return s.checkboxField.checked=!e,i.checkboxField.checked=t.show_previews,e};o(),this.eventListener.addEventListener("destroy",(()=>{const e=!s.checkboxField.checked,a=i.checkboxField.checked;if(e===Ft.Z.isMuted(t)&&a===t.show_previews)return;const o=(0,pe.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?2147483647:0,o.show_previews=a,Ft.Z.updateNotifySettings(n,o)}),{once:!0}),this.listenerSetter.add(a.default)("notify_settings",(s=>{const i=Ai(s.peer._);e.inputKey===i&&(t=s.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new Mn({name:"NotificationsOther"}),t=new et({checkboxField:new ut.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new et({checkboxField:new ut.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});M.default.getState().then((e=>{s.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,s.container),this.scrollable.append(e.container),Ft.Z.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const s=t.checkboxField.checked;e!==s&&Ft.Z.setContactSignUpNotification(!s)}),{once:!0})}))}}}class an extends O{init(){return e=this,t=void 0,i=function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new Mn({}),t=new Map,s=ct.Z.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then((s=>{const i=(0,it.a)();s.forEach((e=>{const s=new et({radioField:new at({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)}));const n=tt([...t.values()],(e=>{k.default.getLangPack(e)}));k.default.getCacheLangPack().then((e=>{const s=t.get(e.lang_code);s?s.radioField.setValueSilently(!0):console.error("no row",s,e)})),e.content.append(n)}));return this.scrollable.append(e.container),s},new((s=void 0)||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}));var e,t,s,i}}function on(e){return new Promise(((t,s)=>{const{button:i,checkbox:n}=e;i.callback=e=>{t(e?!!e.size:void 0)};const a=(0,pt.x)([i]),o=a.find((e=>e.isCancel));o.callback=()=>{s()},e.buttons=a,e.checkboxes=n&&[n],new gt("popup-confirmation",e).show()}))}function rn(e,t){const s=new Mn({name:t}),i="settings.autoDownload."+e+".",n=new ut.Z({text:"AutodownloadContacts",name:"contacts",stateKey:i+"contacts",withRipple:!0}),a=new ut.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:i+"private",withRipple:!0}),o=new ut.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:i+"groups",withRipple:!0}),r=new ut.Z({text:"AutodownloadChannels",name:"channels",stateKey:i+"channels",withRipple:!0});return s.content.append(n.label,a.label,o.label,r.label),s}class ln extends H{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=rn("photo","AutoDownloadPhotosTitle");this.scrollable.append(e.container)}}class dn extends H{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=dt((e=>{M.default.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=rn("file","AutoDownloadFilesTitle"),s=524288,i=20447232,n=a.default.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((n-s)/i)),r=new k.default.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[Be(n)]}),l=new Yi("AutoDownloadMaxFileSize",.01,o,0,1,!1);l.onChange=t=>{const n=Math.pow(t,4)*i+s|0;r.compareAndUpdate({args:[Be(n)]}),e(n)},l.valueContainer.append(r.element),t.content.append(l.container),this.scrollable.append(t.container)}}class cn extends H{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=rn("video","AutoDownloadVideosTitle");this.scrollable.append(e.container)}}const hn={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class pn extends H{init(){return e=this,t=void 0,i=function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new Mn({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield M.default.getState(),s=new ut.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),i=()=>{(0,mt.Z)([h],(0,ue.Z)(t.settings.autoDownload,M.STATE_INIT.settings.autoDownload)&&(0,ue.Z)(t.settings.autoDownloadNew,M.STATE_INIT.settings.autoDownloadNew))},n=()=>{this.setAutoDownloadSubtitle(r,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(d,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},o=e=>{const t=new e(this.slider,!0);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{n(),i()}),{once:!0})},r=new et({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{o(ln)}}),d=new et({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{o(cn)}}),c=new et({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{o(dn)}}),h=(0,U.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,l.fc)(h,(()=>{on({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{a.default.settings.autoDownloadNew=(0,pe.Z)(M.STATE_INIT.settings.autoDownloadNew),a.default.settings.autoDownload=(0,pe.Z)(M.STATE_INIT.settings.autoDownload),M.default.pushToState("settings",a.default.settings),a.default.dispatchEvent("settings_updated",{key:"settings",value:a.default.settings}),n(),s.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const p=()=>{const e=!s.checked,t=a.default.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[r,d,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),M.default.pushToState("settings",t),a.default.dispatchEvent("settings_updated",{key:"settings",value:t}),i()};s.input.addEventListener("change",p),p(),n(),e.content.append(s.label,r.container,d.container,c.container,h),this.scrollable.append(e.container)}{const e=new Mn({name:"AutoplayMedia"}),t=new ut.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),s=new ut.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});e.content.append(t.label,s.label),this.scrollable.append(e.container)}},new((s=void 0)||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}));var e,t,s,i}setAutoDownloadSubtitle(e,t,s){let i,n=[];const a=Object.keys(t),o=a.map((e=>t[e]?hn[e]:void 0)).filter(Boolean);if(o.length&&0!==s){const e=o.length===a.length;if(void 0!==s?(i=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push(Be(s))):i=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,k.join)(o.map((e=>(0,k.i18n)(e))),!0,!1)),n.push(e)}}else i="AutoDownloadOff";(0,T.Z)(e.subtitle,(0,k.i18n)(i,n))}}class un extends O{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=Ie({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new gt("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{ct.Z.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=N("edit"),this.header.append(this.buttons.edit,e),this.profile=new Wt(this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(a.default.myId),this.profile.fillProfileElements();const t=(0,U.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});t.addEventListener("click",(()=>{const e=document.createElement("canvas");(new G.Z).open(e,(e=>{e().then((e=>n.default.uploadProfilePhoto(e)))}))})),this.profile.element.lastElementChild.firstElementChild.append(t);const s=()=>{var e;const s=E.Z.getSelf();t.classList.toggle("hide","userProfilePhoto"!==(null===(e=s.photo)||void 0===e?void 0:e._))};s(),this.listenerSetter.add(a.default)("avatar_update",(e=>{a.default.myId===e&&s()}));const i=document.createElement("div");i.classList.add("profile-buttons");const o=[["unmute","AccountSettings.Notifications",nn],["data","DataSettings",pn],["lock","AccountSettings.PrivacyAndSecurity",_i],["settings","Telegram.GeneralSettingsViewController",Xi],["folder","AccountSettings.Filters",sn]].map((([e,t,s])=>new et({titleLangKey:t,icon:e,clickable:()=>{new s(this.slider,!0).open()}})));o.push(this.devicesRow=new et({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>{return e=this,t=void 0,i=function*(){this.authorizations||(yield this.updateActiveSessions());const e=new Ti(this.slider);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()},new((s=void 0)||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}));var e,t,s,i}}),this.languageRow=new et({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,k.i18n)("LanguageName"),icon:"language",clickable:()=>{new an(this.slider).open()}})),i.append(...o.map((e=>e.container)));const r=new Mn;r.content.append(i),this.scrollable.append(this.profile.element,r.container),this.buttons.edit.addEventListener("click",(()=>{new Ji(this.slider).open()})),ae.Z.loadLottieWorkers(),this.updateActiveSessions()}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=ct.Z.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}}class gn extends O{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new K((e=>{this.uploadAvatar=e}));const e=new Mn({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new _.Z({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new _.Z({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const s=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",s),this.channelDescriptionInputField.input.addEventListener("input",s),this.nextBtn=W({icon:"arrow_next"}),this.nextBtn.addEventListener("click",(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,j.Z.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{j.Z.editPhoto(e,t)})),xn.removeTabFromHistory(this),new Bt(this.slider).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>j.Z.inviteToChannel(e,t)})}))})),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var mn=s(709);class vn extends pt.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),(0,k._i18n)(this.title,"AddContactTitle"),(0,l.fc)(this.btnConfirm,(()=>{const e=E.Z.importContact(s.value,i.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&(lt({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const s=new _.Z({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),i=new _.Z({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new mn.Z({required:!0});e.push(s,i,n);const a=()=>{const e=s.value+" "+i.value;d.avatarElem.setAttribute("peer-title",e),d.avatarElem.update()};this.listenerSetter.add(s.input)("input",a),this.listenerSetter.add(i.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=E.Z.getSelf(),r=(0,Os.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new Xe({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(s.container,i.container,d.avatarElem),this.container.append(t,n.container),this.show()}}class fn extends O{init(){this.container.id="contacts-container";const e=W({icon:"add",className:"is-visible"});this.content.append(e),(0,l.fc)(e,(()=>{new vn}),{listenerSetter:this.listenerSetter}),this.inputSearch=new Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(a.default)("contacts_update",(e=>{const t=E.Z.isContact(e),s=e.toPeerId();t?this.sortedUserList.add(s):this.sortedUserList.delete(s)})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,As.k)()}createList(){const e=new Rs,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),pd.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!ne.IS_MOBILE&&ui(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",E.Z.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const s=this.sortedUserList=this.createList();let i=()=>{const t=Ct.Z.height/72*1.25|0;e.splice(0,t).forEach((e=>{s.add(e)})),e.length||(i=void 0,this.scrollable.onScrolledBottom=null)};i(),this.scrollable.onScrolledBottom=()=>{i?i():this.scrollable.onScrolledBottom=null},(0,T.Z)(this.scrollable.container,s.list)}))}open(){return this.openContacts(),super.open()}}class bn extends O{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!pd.sortedLists[bn.filterId]){const e=pd.createChatList();pd.generateScrollable(e,bn.filterId).container.append(e),pd.setListClickListener(e,null,!0)}const e=pd.scrollables[bn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=pd.filterId,pd.setFilterId(bn.filterId),pd.onTabChange()}onOpenAfterTimeout(){pd.sortedLists[this.wasFilterId].clear()}onClose(){pd.setFilterId(this.wasFilterId),pd.onTabChange()}onCloseAfterTimeout(){return pd.sortedLists[bn.filterId].clear(),super.onCloseAfterTimeout()}}bn.filterId=1;class yn extends O{constructor(){super(...arguments),this.isLocationWatched=!1}init(){this.container.classList.add("people-nearby-container"),this.setTitle("PeopleNearby"),this.errorCategory=document.createElement("div"),this.errorCategory.classList.add("text","hide","nearby-error"),this.retryBtn=W({icon:"check"});const e=ds.Z.getAnimatedEmojiSticker("🧭"),t=document.createElement("div");t.classList.add("sticker-container"),e?Is({doc:e,div:t,loop:!1,play:!0,width:86,height:86,emoji:"🧭",needUpscale:!0}).then((()=>{})):t.classList.add("media-sticker-wrapper");const s=document.createElement("div");s.classList.add("caption"),(0,k._i18n)(s,"PeopleNearbyInfo2"),this.locatedPeers=new Map;const i=()=>{const e=new Rs({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onUpdate:e=>{const t=this.locatedPeers.get(e.id),s=[this.parseDistance(t.distance)];e.id.isUser()||s.push(n.default.getChatMembersString(e.id.toChatId())),e.dom.lastMessageSpan.textContent="",e.dom.lastMessageSpan.append(...(0,k.join)(s,!1))},getIndex:e=>2147483647-this.locatedPeers.get(e.id).distance});return pd.setListClickListener(e.list,void 0,void 0,!1),e},a=this.peopleSection=new Tn({name:"PeopleNearbyHeader",sortedList:i()}),o=this.chatsSection=new Tn({name:"ChatsNearbyHeader",sortedList:i()}),r=a.makeButton({text:"MakeMyselfVisible",icon:"location"}),d=a.makeButton({text:"StopShowingMe",icon:"location"}),c=o.makeButton({text:"NearbyCreateGroup",icon:"newgroup"});(0,l.fc)(r,(()=>{on({titleLangKey:"MakeMyselfVisibleTitle",descriptionLangKey:"MakeMyselfVisibleInfo",button:{langKey:"OK"}}).then((()=>{this.startWatching()}))}),{listenerSetter:this.listenerSetter}),(0,l.fc)(d,(()=>{this.stopWatching()}),{listenerSetter:this.listenerSetter}),(0,l.fc)(c,(()=>{new q(this.slider).open([],!0)}),{listenerSetter:this.listenerSetter}),r.classList.add("primary"),d.classList.add("danger"),c.classList.add("primary"),this.content.append(this.retryBtn),this.scrollable.append(t,s,a.container,o.container,this.errorCategory)}parseDistance(e){return"miles"===a.default.settings.distanceUnit?e>1609.34?(0,k.i18n)("MilesAway",[Math.round(e/1609)]):(0,k.i18n)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,k.i18n)("KMetersAway2",[e/1e3]):(0,k.i18n)("MetersAway2",[e])}open(){const e=super.open();return e.then((()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition((e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),E.Z.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then((e=>{const t=e.updates[0].peers,s=t.sort(((e,t)=>e.distance-t.distance)),i=t.filter((e=>"peerChannel"==e.peer._)).length,n=t.filter((e=>"peerChannel"!=e.peer._)).length;null==s||s.forEach((e=>{const t=o.Z.getPeerId(e.peer),s=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),s.sortedList.add(t)})),this.errorCategory.classList.toggle("hide",!(!n&&!i)),this.errorCategory.innerHTML="No groups or channels found around you."}))}),(e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."}))})),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,rt("Your position is now being shared. Do not close the page or it will be suspended."),E.Z.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,s=e.coords.latitude!==this.latestLocationSaved.latitude,i=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(s||t)&&i&&(E.Z.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,rt("The sharing of your position has been stopped. You will no longer be visible to other users."),E.Z.getLocated(0,0,0,!1,0))}calculateDistance(e,t,s,i){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((s-e)*n)+Math.cos(e*n)*Math.cos(s*n)*(1-Math.cos((i-t)*n)/2)))}}var wn=s(4159),Sn=s(7487);function Cn(e,t=2){if(0===e)return"0";const s=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,i)).toFixed(s))+["","K","M","B","T"][i]}const Ln="is-left-column-shown",In="sidebar-left-section";class Mn{constructor(e={}){const t=this.container=document.createElement("div");t.classList.add(In+"-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add(In),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append(Pn()),s.classList.add("with-fake-delimiter");else if(e.noDelimiter)s.classList.add("no-delimiter");else{const e=document.createElement("hr");s.append(e)}const i=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",In+"-name"),(0,k.i18n_)({element:t,key:e.name,args:e.nameArgs}),i.append(t)}if(t.append(s),e.caption){const s=this.caption=this.generateContentElement();s.classList.add(In+"-caption"),t.append(s),!0!==e.caption&&(0,k.i18n_)({element:s,key:e.caption})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(In+"-content"),this.innerContainer.append(e),e}}const En=(e,t,s)=>{const i=new Mn({name:t,caption:s});return e.append(i.container),i.content},Pn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e};class Tn extends Mn{constructor(e){super(e),this.sortedList=e.sortedList,this.content.append(this.sortedList.list)}makeButton(e){const t=(0,U.Z)("folder-category-button btn btn-primary btn-transparent",e);return this.title?this.content.insertBefore(t,this.title.nextSibling):this.content.prepend(t),t}}const kn=new class extends V{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new Z("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new fn(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new bn(this).open()},verify:()=>!!i.Z.dialogsStorage.getFolderDialogs(1,!1).length||!i.Z.dialogsStorage.isDialogsLoaded(1)},n=new ut.Z({toggle:!0,checked:"night"===a.default.getTheme().name});n.input.addEventListener("change",(()=>{a.default.settings.theme=n.input.checked?"night":"day",M.default.pushToState("settings",a.default.settings),a.default.dispatchEvent("theme_change")})),a.default.addEventListener("theme_change",(()=>{n.setValueSilently("night"===a.default.getTheme().name)}));const o=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout((()=>{Ol.setPeer({peerId:Ol.myId})}),0)}},s,{icon:"user",text:"Contacts",onClick:t},$i?{icon:"group",text:"PeopleNearby",onClick:()=>{new yn(this).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{new un(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new ut.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{Ol.openUsername({userName:"TelegramTips"})}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout((()=>{e.remove()}),0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([Sn.Z.set({kz_version:"Z"}),Sn.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>wn.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Sn.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>wn.Z.isMainDomain}].filter(Boolean);this.toolsBtn=Ie({},"bottom-right",o,(e=>{o.forEach((e=>{e.verify&&e.element.classList.toggle("hide",!e.verify())}))})),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const r=this.toolsBtn.querySelector(".btn-menu"),d=document.createElement("a");d.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",d.target="_blank",d.rel="noopener noreferrer",d.classList.add("btn-menu-footer"),d.addEventListener(l.pf,(e=>{e.stopPropagation(),(0,J.UR)()}));const c=document.createElement("span");c.classList.add("btn-menu-footer-text"),c.innerHTML="Telegram Web"+wn.Z.suffix+" "+wn.Z.versionFull,d.append(c),r.classList.add("has-footer"),r.append(d),this.newBtnMenu=Ie({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new gn(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new Bt(this).open({type:"chat",skippable:!1,takeOut:e=>{new q(this).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:t}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",e.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,ee.ripple)(this.updateBtn),this.updateBtn.append((0,k.i18n)("Update")),(0,l.fc)(this.updateBtn,(()=>{location.reload()})),e.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",s.element.append(this.archivedCount),a.default.addEventListener("folder_unread",(e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+Cn(t,1),this.archivedCount.classList.toggle("hide",!t)}})),E.Z.getTopPeers("correspondents"),M.default.getState().then((e=>{const t=e.recentSearch||[];for(let e=0,s=t.length;e{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((e=>{e!==wn.Z.versionFull&&(this.hasUpdate=!0,clearInterval(s),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(_e.Z)}),18e5)}))}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new P.ZP(e),s=()=>{this.backBtn.click()};this.searchGroups={contacts:new x("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,s),globalContacts:new x("GlobalSearch","contacts",void 0,void 0,void 0,void 0,s),messages:new x("SearchMessages","messages"),people:new x(!1,"contacts",!0,"search-group-people",!0,!1,s),recent:new x("Recent","contacts",!0,"search-group-recent",!0,!0,s)};const n=this.searchSuper=new si({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0});e.prepend(n.nav.parentElement.parentElement),t.container.append(n.container),n.setQuery({peerId:"".toPeerId(),folderId:0}),n.selectTab(0),n.load(!0);let a=[],o="".toPeerId(),r=0,l=0;const d=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},c=document.createElement("div");c.classList.add("search-helper"),c.addEventListener("click",(e=>{const t=(0,Me.Z)(e.target,"selector-user");if(!t)return;const s=t.dataset.key;if(0===s.indexOf("date_")){const[e,t,i]=s.split("_");r=+t,l=+i}else o=s.toPeerId();t.addEventListener("click",(()=>{p(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),d()})),n.nav.parentElement.append(c);const h=(e,t)=>{const s=document.createElement("div");s.classList.add("selector-user");const i=document.createElement("avatar-element");return i.classList.add("selector-user-avatar","tgico"),i.setAttribute("dialog","1"),i.classList.add("avatar-30"),s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new St.Z({peerId:e.toPeerId()}).element),i.setAttribute("peer",""+e)):i.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?s.innerHTML=t:((0,T.Z)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",i),s},p=e=>{0===e.dataset.key.indexOf("date_")?r=l=0:o="".toPeerId(),e.remove(),(0,z.Z)(a,e),setTimeout((()=>{d(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{a.forEach((e=>{p(e)}))},this.inputSearch.onChange=e=>{if(n.cleanupHTML(),n.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:r,maxDate:l}),n.load(!0),c.innerHTML="",n.nav.classList.remove("hide"),!o&&e.trim()){const t=n.middleware.get();Promise.all([i.Z.getConversations(e).promise.then((({dialogs:e})=>e.map((e=>e.peerId)))),E.Z.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{c.append(h(e))})),n.nav.classList.toggle("hide",!!c.innerHTML))}))}if(!r&&e.trim()){const t=[];(0,ie.fl)(e,t),t.forEach((e=>{c.append(h("date_"+e.minDate+"_"+e.maxDate,e.title))})),n.nav.classList.toggle("hide",!!c.innerHTML)}},n.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,ft.Z)(e.target,"LI");if(!t)return;const s=(0,Me.Z)(t,"search-group");if(!s||s.classList.contains("search-group-recent")||s.classList.contains("search-group-people"))return;const i=t.getAttribute("data-peer-id").toPeerId();M.default.getState().then((e=>{const t=e.recentSearch||[];if(t[0]!==i){(0,z.Z)(t,i),t.unshift(i),t.length>20&&(t.length=20),M.default.pushToState("recentSearch",t);for(const e of t)M.default.requestPeer(e,"recentSearch")}}))}),{capture:!0});let u=document.createElement("div");u.classList.add("search-group-scrollable"),u.append(this.searchGroups.people.list),this.searchGroups.people.container.append(u),new P.v7(u);let g,m=!0;const v=(0,D.v)(e.parentElement,"zoom-fade",150,(e=>{g&&clearTimeout(g),0!==e||m||(n.selectTab(0,!1),this.inputSearch.onClearClick(),g=window.setTimeout((()=>{g=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),m=!1}));v(0);const f="is-visible",b=()=>{this.toolsBtn.classList.remove(f),this.backBtn.classList.add(f),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0),ne.IS_MOBILE_SAFARI||F.Z.findItemByType("global-search")||F.Z.pushItem({onPop:()=>{s()},type:"global-search"}),v(1)};this.inputSearch.input.addEventListener("focus",b),b(),this.backBtn.addEventListener("click",(e=>{this.toolsBtn.classList.add(f),this.backBtn.classList.remove(f),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),F.Z.removeByType("global-search"),v(0)}));const y=N("close");this.searchGroups.recent.nameEl.append(y),y.addEventListener("click",(()=>{on({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>{M.default.getState().then((e=>{this.searchGroups.recent.clear();const t=e.recentSearch||[];for(const e of t)M.default.releaseSinglePeer(e,"recentSearch");t.length=0,M.default.pushToState("recentSearch",t)}))}))}))}};re.GO.appSidebarLeft=kn;const xn=kn;class An{constructor(e){this.chat=e,this.bubbles=[],this.detailsMap=new Map,this.groups=[],this.newGroupDiff=121}removeBubble(e){const t=this.detailsMap.get(e);t&&(t.group.length&&(t.group.findAndSplice((t=>t.bubble===e)),t.group.length?this.updateGroup(t.group):(0,z.Z)(this.groups,t.group)),this.detailsMap.delete(e))}changeBubbleMid(e,t){const s=this.detailsMap.get(e);s&&(s.mid=t)}addBubble(e,t,s){const i=t.date,n=t.mid;let o,r=t.viaBotId||t.fromId;r===a.default.myId&&t.peerId===a.default.myId&&t.fwdFromId===r&&(r=r.toPeerId(!0)),this.removeBubble(e);const l={bubble:e,mid:n,timestamp:i};if(this.bubbles.length){let e,t=-1;for(let e=0;es.mid)break}if(-1!==t&&(e=this.bubbles[t]),e){o=e.group;let t=0,s=0;for(;tt.mid===e));t&&this.updateGroup(t.group)}cleanup(){this.bubbles=[],this.groups=[],this.detailsMap.clear()}}class _n extends pt.Z{constructor(e,t,s={}){if(super("popup-date-picker",s.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},s)),this.onPick=t,this.options=s,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const s=+t.dataset.timestamp;this.selectedDate=new Date(s),this.setTitle(),this.setTimeTitle()},this.minDate=s.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&i&&i(+o[1]),o="0"+o[0]),t.setValueSilently(o),s(o.length)}))};this.hoursInputField=new _.Z({plainText:!0}),this.minutesInputField=new _.Z({plainText:!0}),s(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),s(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,l.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const i=document.createElement("div");i.classList.add("popup-centerer"),i.append(this.container),this.element.append(i),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=s.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),s.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const s=new Date;s.setHours(0,0,0,0);const i={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===s.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const i={month:"short",day:"numeric"};n.getFullYear()!==s.getFullYear()&&(i.year="numeric"),t.push(new k.default.IntlDateElement({date:n,options:i}).element)}t.push(new k.default.IntlDateElement({date:n,options:i}).element),this.btnConfirm.firstChild.replaceWith((0,k.i18n)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new k.default.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const s=document.createElement("button");return s.classList.add("btn-icon","date-picker-month-date"),e&&s.setAttribute("disabled","true"),t&&s.append(t),s}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&v.ZP.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new k.default.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const s=new Date,i=s.getDay();1!==i&&s.setHours(-24*(i-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new k.default.IntlDateElement({date:s,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),s.setDate(s.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e3&&(e=e.slice(-3)),e.forEach(((e,i)=>{let n=s[i];n||(n=document.createElement("div"),n.classList.add("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new Yl,a.setAttribute("dialog","0"),a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),a.lazyLoadQueue=this.lazyLoadQueue,a.loadPromises=t),a.setAttribute("peer",""+e),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(s).slice(e.length).forEach((e=>e.remove()))}}class Fn extends HTMLElement{constructor(){super(),this.classList.add("reaction")}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e){this.type=e,this.classList.add("reaction-"+e)}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("reaction-sticker"),this.append(this.stickerContainer));const s=this.reactionCount;if(!e&&!t){const e=_t.Z.getReaction(s.reaction);(0,Nt.Z)(e,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive");const s="inline"===this.type?14:22,i=this.wrapStickerPromise=Is({div:this.stickerContainer,doc:null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon,width:s,height:s,static:!0}).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}))}}renderCounter(){var e;const t=this.reactionCount,s="inline"===this.type?2:4;if(t.count>=s||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add("reaction-counter"));const e=Cn(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new Dn({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>o.Z.getPeerId(e.peer_id))))))}setIsChosen(e=!!this.reactionCount.pFlags.chosen){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,Jt.Z)(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){(0,Nt.Z)(_t.Z.getReaction(this.reactionCount.reaction),(e=>{const t="inline"===this.type?28:40,s=document.createElement("div");s.classList.add("reaction-sticker-activate"),Promise.all([Is({div:s,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1}),Ls({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1}).stickerPromise]).then((([e,t])=>{const i=()=>{(0,De.T2)((()=>{e.remove(),s.remove(),this.stickerContainer.classList.remove("has-animation")}))};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(i,1e3)})):i())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(s),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define("reaction-element",Fn);const Rn=new Map;class Bn extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[]}connectedCallback(){let e=Rn.get(this.key);e||Rn.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=Rn.get(this.key);e.delete(this),e.size||Rn.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,s){void 0!==this.key&&this.disconnectedCallback(),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add("reactions-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.isPlaceholder)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,s=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!s),!s&&!this.sorted.length)return;const i=_t.Z.getAvailableReactions(),n=s?i instanceof Promise?t.results:t.results.filter((e=>_t.Z.isReactionActive(e.reaction))):[];(0,b.Z)(this.sorted,((e,t,s)=>{const i=e.reactionCount.reaction;n.some((e=>e.reaction===i))||(s.splice(t,1),e.remove())}));const a=n.reduce(((e,t)=>e+t.count),0),o=t&&!!t.pFlags.can_see_list&&a<4;if(this.sorted=n.map(((e,s)=>{const i=this.sorted.findIndex((t=>t.reactionCount.reaction===e.reaction));let n=-1!==i&&this.sorted[i];n||(n=new Fn,n.init(this.type)),Zs(n,this,s);const a=t.recent_reactions?t.recent_reactions.filter((t=>t.reaction===e.reaction)):[];return n.reactionCount=Object.assign({},e),n.setCanRenderAvatars(o),n.render(this.isPlaceholder),n.renderCounter(),n.renderAvatars(a),n.setIsChosen(),n})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===a.default.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>t.reactionCount.reaction===e.reaction));t&&t.fireAroundAnimation()}))}}customElements.define("reactions-element",Bn);a.default.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class Un extends HTMLElement{constructor(){super(),this.updated=!1}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new Dn({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>o.Z.getPeerId(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new k.default.IntlElement);const s=this.text;if(e?e.replies?s.compareAndUpdate({key:"Comments",args:[e.replies]}):s.compareAndUpdate({key:"LeaveAComment"}):s.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?Cn(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(i.Z.subscribeRepliesThread(this.message.peerId,this.message.mid),i.Z.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",Un);const Nn=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,k._i18n)(e,"EditedMessage"),e},On=()=>(0,k.i18n)("SponsoredMessage");var Hn;!function(e){e.setTime=e=>{var t;const{chatType:s,message:n}=e,a=new Date(1e3*n.date),o=[];let r,l,d,c;const h=!!n.pFlags.sponsored,p=!("action"in n)&&!h;let u,g=h?void 0:(0,ie.mr)(a);if(p){if(n.views){const e=n.post_author||(null===(t=n.fwd_from)||void 0===t?void 0:t.post_author),s=document.createElement("span");s.classList.add("post-views"),s.innerHTML=Cn(n.views,1);const i=document.createElement("i");if(i.classList.add("tgico-channelviews","time-icon"),o.push(s,i),e){const t=document.createElement("span");t.innerHTML=Q.Z.wrapEmojiText(e)+", ",o.push(t)}}if(n.edit_date&&"scheduled"!==s&&!n.pFlags.edit_hide&&o.unshift(r=Nn()),"pinned"!==s&&n.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),o.unshift(e)}"peerUser"===n.peer_id._&&(u=!0,c=i.Z.getGroupsFirstMessage(n),d=new Bn,d.init(c,"inline",!0),d.render(),o.unshift(d))}else h&&o.push(l=On());g&&o.push(g);let m=h?void 0:(0,ie.xE)(a);p&&(m+=(n.edit_date&&!n.pFlags.edit_hide?`\nEdited: ${(0,ie.xE)(new Date(1e3*n.edit_date))}`:"")+(n.fwd_from?`\nOriginal: ${(0,ie.xE)(new Date(1e3*n.fwd_from.date))}`:""));const v=document.createElement("span");v.classList.add("time","tgico"),v.append(...o);const f=document.createElement("div");f.classList.add("inner","tgico"),m&&(f.title=m);let b=o;if(r&&(b[b.indexOf(r)]=Nn()),l&&(b[b.indexOf(l)]=On()),d){const e=b[b.indexOf(d)]=new Bn;e.init(c,"inline"),e.render()}return b=b.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),g&&(b[b.length-1]=(0,ie.mr)(a)),f.append(...b),v.append(f),v},e.renderReplies=({bubble:e,bubbleContainer:t,message:s,messageDiv:i,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new Un;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:s,message:i})=>{const n=!s;n&&(s=t.querySelector(".bubble-content"));const a=n?s.querySelector(".reply"):null;if(!i.reply_to_mid)return a&&a.remove(),void t.classList.remove("is-reply");const o=i.reply_to.reply_to_peer_id?e.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):e.peerId;let r,l=e.appMessagesManager.getMessageByPeer(o,i.reply_to_mid);"messageEmpty"===l._?(e.appMessagesManager.wrapSingleMessage(o,i.reply_to_mid),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:i.reply_to_mid,mid:i.mid}),r=(0,k.i18n)("Loading")):r=new St.Z({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const d=Ps(r,void 0,l);a?a.replaceWith(d):s.append(d),t.classList.add("is-reply")}}(Hn||(Hn={}));var zn=s(5393);function Vn(e,t,s){const i=e.getBoundingClientRect(),n="center"===s?Math.ceil(i.left+(i.right-i.left)/2+1):Math.ceil(i.left+1),a="bottom"===t?Math.floor(i.top+i.height-1):Math.ceil(i.top+1);return document.elementFromPoint(n,a)}function jn(e){e.style.display="none",e.offsetLeft,e.style.display=""}re.GO.getElementByPoint=Vn;class Gn{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,s=t.target.parentElement,i=t.rootBounds;e.bottom=i.top&&e.bottom{let t=e.filter((e=>e.boundingClientRect.top<0)).sort(((e,t)=>e.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;let s=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,s)}),{root:this.container})}addSentinel(e,t){const s=document.createElement("div");return s.classList.add("sticky_sentinel",t),e.appendChild(s)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}var Kn=s(5418),Wn=s(5880),qn=s(946),$n=s(7381),Qn=s(7922);const Yn={keywords:{},version:0,langCode:wn.Z.langPackCode};class Xn{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=wn.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=Qn.Z.get(s).then((t=>((0,Wn.Z)(t)||(t={}),(0,qn.Z)(Yn,t),t.langCode=e,this.keywordLangPacks[e]=t,ct.Z.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const i=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return k.default.lastRequestedLangCode!==wn.Z.langPackCode&&e.push(this.getEmojiKeywords(k.default.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new $n.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const s=t[e];this.index.indexObject(s,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const s=this.index.search(e);t=Array.from(s).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.concat(Xn.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=M.default.getState().then((e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[]))}pushRecentEmoji(e){e=Q.Z.fixEmoji(e),this.getRecentEmojis().then((t=>{(0,z.Z)(t,e),t.unshift(e),t.length>36&&(t.length=36),M.default.pushToState("recentEmoji",t),a.default.dispatchEvent("emoji_recent",e)}))}}Xn.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const Jn=new Xn;re.GO&&(re.GO.appEmojiManager=Jn);const ea=Jn;var ta=s(6718),sa=s(9976);const ia=new Set;function na(e,t,s=!1,i=!1){const n=document.createElement("span");let o;if(n.classList.add("super-emoji"),i&&!sa.Z?o=Q.o.wrapSingleEmoji(e):(e=Q.o.fixEmoji(e),o=Q.o.wrapEmojiText(e)),n.innerHTML=o,n.children.length>1){const e=n.firstElementChild;n.innerHTML="",n.append(e)}if(n.firstElementChild&&!sa.Z){const e=n.firstElementChild,t=e.src;if(!ia.has(t)){e.setAttribute("loading","lazy");const s=document.createElement("span");s.classList.add("emoji-placeholder"),a.default.settings.animationsEnabled&&(e.style.opacity="0",s.style.opacity="1"),e.addEventListener("load",(()=>{(0,De.T2)((()=>{a.default.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),n.classList.remove("empty"),ia.add(t)}))}),{once:!0}),n.append(s)}}s?t.prepend(n):t.appendChild(n)}function aa(e){return(0,Me.Z)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class oa{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{(0,d.d)(e);const t=aa(e.target);t&&(Ol.chat.input.onEmojiSelected(t,!1),ce.IS_TOUCH_SUPPORTED&&(0,Gs.Z)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},s=new Map([["Emoji.Recent",[]]]);for(const t in ta.ZP.Emoji){const i=""+ta.ZP.Emoji[t],n=e[+i[0]-1];if(!n)continue;let a=s.get(n);a||(a=[],s.set(n,a)),a[+i.slice(1)||0]=t}s.delete(e.pop()),s.forEach(((e,s)=>{const i=document.createElement("div");i.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append((0,k.i18n)(s));const a=document.createElement("div");a.classList.add("super-emojis"),i.append(n,a),e.forEach((e=>{na((0,te.zu)(e),a,!1)})),t[s]=i}));const i=this.menu=this.content.previousElementSibling,n=this.scroll=new P.ZP(this.content,"EMOJI"),o=(0,J.y7)(this.content,!0);Promise.all([(0,Kn.w)(200),ea.getRecentEmojis().then((e=>{const t=!!e.length,s=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[s].classList.add("active");const a=wa.menuOnClick(i,n,void 0,s);return this.stickyIntersector=a.stickyIntersector,this.setMenuActive=a.setActive,e}))]).then((([s,i])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of i)na(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map((e=>{const s=t[e];return s||console.error("no div by category:",e),n.container.append(s),this.stickyIntersector.observeStickyHeaderChanges(s),s}))})),this.content.addEventListener("click",this.onContentClick),this.init=null,a.default.addEventListener("emoji_recent",(e=>{const t=Array.from(this.recentItemsDiv.children);for(let s=0,i=t.length;s{this.closeScrollTop=this.scroll.scrollTop}))}onClose(){}}var ra=s(9897);const la=100;class da{constructor(e,t,s,i=!0){this.element=e,this.group=t,this.scrollable=s,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,se.b)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>{return t=this,s=void 0,n=function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),s=e.querySelector("img");s&&(s&&s.classList.remove("hide"),yield(0,De.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),I.Z.getAnimations(t).forEach((e=>{I.Z.checkAnimation(e,!0,!0)})))},new((i=void 0)||(i=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((n=n.apply(t,s||[])).next())}));var t,s,i,n})),this.lazyLoadQueue=new X.br(void 0,((e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),i&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId,s=L.Z.getDoc(t);return this.scrollPromise.then((()=>{const t=ys({doc:s,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0}).loadPromise;return t.finally((()=>{const t=e.querySelector("video");e.style.opacity="";const s=e.querySelector("img");s&&s.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),I.Z.getAnimations(t).forEach((e=>{I.Z.checkAnimation(e,!0,!0)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),t}))}})}add(e,t=this.element){var s;let i=e.w,n=e.h;n{d.src=l.cacheContext.url})));const c=()=>{d&&(r.append(d),r.style.opacity="")};(null===(s=null==l?void 0:l.cacheContext)||void 0===s?void 0:s.url)?(0,rs.ZP)(d,l.cacheContext.url,c):c()}}class ca{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",wa.onMediaClick);const t=new P.ZP(this.content,"GIFS"),s=new da(e,ya,t),i=(0,J.y7)(this.content,!0);ct.Z.invokeApi("messages.getSavedGifs",{hash:"0"}).then((e=>{"messages.savedGifs"===e._&&e.gifs.forEach(((t,i)=>{e.gifs[i]=t=L.Z.saveDoc(t),s.add(t)})),i.remove()})),Ca.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}class ha{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{I.Z.getAnimations(e).forEach((e=>{t?I.Z.checkAnimation(e,!1):I.Z.checkAnimation(e,!0,!0)}))},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=L.Z.getDoc(t),i=v.ZP.active.esgSticker.width,n=Is({doc:s,div:e,width:i,height:i,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0});return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n},this.processInvisibleDiv=e=>{const t=e.dataset.docId,s=L.Z.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(s,e)},this.lazyLoadQueue=new X.dJ(void 0,((e,t)=>{t||this.processInvisibleDiv(e)}))}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,s){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),e.animated&&this.observeAnimatedDiv(t)),Is({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:s}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class pa{constructor(){this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",s,i){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&(a.innerHTML=t),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:i}),s.then((e=>{e.forEach((e=>{n.append(this.superStickerRenderer.renderSticker(e))})),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach((({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)})),this.queueCategoryPush.length=0)})),{titleDiv:a}}renderStickerSet(e,t=!1){return s=this,i=void 0,a=function*(){const s=document.createElement("div");s.classList.add("sticker-category"),s.dataset.id=""+e.id,s.dataset.access_hash=""+e.access_hash;const i=document.createElement("button");i.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:s,tab:i},t?this.menu.insertBefore(i,this.menu.firstElementChild.nextSibling):this.menu.append(i);const n=ds.Z.getStickerSet(e);this.categoryPush(s,Q.o.wrapEmojiText(e.title),n.then((e=>e.documents)),t),yield n,Ms({set:e,container:i,group:ya,lazyLoadQueue:wa.lazyLoadQueue,width:32,height:32,autoplay:!1})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(o,r)}l((a=a.apply(s,i||[])).next())}));var s,i,n,a}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new P.v7(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),a.default.addEventListener("stickers_installed",(e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)})),a.default.addEventListener("stickers_deleted",(e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}})),this.stickersDiv.addEventListener("click",(e=>{const t=e.target;if((0,Me.Z)(t,"category-title")){const e=(0,wt.Z)(t,"data-id");new Ki({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else wa.onMediaClick(e)}));const s=(e=!1)=>{a.default.dispatchEvent("choosing_sticker",!e)};this.scroll=new P.ZP(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{s()},Ca.addEventListener("closed",(()=>{s(!0)})),Ca.addEventListener("opened",(()=>{s()})),this.stickyIntersector=wa.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=(0,J.y7)(this.content,!0);Promise.all([ds.Z.getRecentStickers().then((e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},i.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append((0,k.i18n)("Stickers.Recent"))})),ds.Z.getAllStickers().then((e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)}))]).finally((()=>{this.mounted=!0,s()})),this.superStickerRenderer=new ha(wa.lazyLoadQueue,ya),Ca.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(ds.Z.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let s=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);s||(s=this.superStickerRenderer.renderSticker(e));const i=this.recentDiv.querySelector(".category-items");i.prepend(s),i.childElementCount>20&&Array.from(i.children).slice(20).forEach((e=>e.remove()))}onClose(){}}const ua=new class{constructor(){this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,s="",i="",n){return ct.Z.invokeApi("messages.getInlineBotResults",{bot:E.Z.getUserInput(t),peer:o.Z.getInputPeerById(e),query:s,geo_point:n?this.getGeoInput(n):void 0,offset:i},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=L.Z.saveDoc(e.document)),e.photo&&(e.photo=r.Z.savePhoto(e.photo))),this.inlineResults[this.generateQId(t,e.id)]=e})),e}))}generateQId(e,t){return e+"_"+t}pushPopularBot(e){E.Z.getTopPeers("bots_inline").then((t=>{const s=e.toPeerId(),i=t.findIndex((e=>e.id===s));let n;n=-1!==i?t[i]:{id:s,rating:0},++n.rating,(0,Ds.Z)(t,n,"rating"),M.default.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,s){return this.setHash[t]={peerId:e,time:Date.now()},a.default.dispatchEvent("history_focus",{peerId:t.toPeerId()}),i.Z.startBot(t,void 0,s)}checkSwitchReturn(e){return t=this,s=void 0,n=function*(){const t=E.Z.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const s=this.setHash[e];return s&&(delete this.setHash[e],Date.now()-s.time<36e5)?s.peerId:void 0},new((i=void 0)||(i=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((n=n.apply(t,s||[])).next())}));var t,s,i,n}switchInlineQuery(e,t,s,i){a.default.dispatchEvent("history_focus",{peerId:e,threadId:t}),xi.Z.setDraft(e,t,"@"+E.Z.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return ct.Z.invokeApi("messages.getBotCallbackAnswer",{peer:o.Z.getInputPeerById(e),msg_id:f.Z.getServerMessageId(t),data:s.data},{stopTime:-1,noErrorBox:!0}).then((e=>{"string"==typeof e.message&&e.message.length&&rt(Q.o.wrapRichText(e.message,{noLinks:!0,noLinebreaks:!0}))}))}sendInlineResult(e,t,s,n={}){var a;const o=this.inlineResults[s];if(!o)return;this.pushPopularBot(t);const l=s.split("_"),d=l.shift(),c=l.join("_");if(n.viaBotId=t,n.queryId=d,n.resultId=c,o.send_message.reply_markup&&(n.replyMarkup=o.send_message.reply_markup),"botInlineMessageText"===o.send_message._)n.entities=o.send_message.entities,i.Z.sendText(e,o.send_message.message,n);else{let t,s="";const l=o.send_message;switch(l._){case"botInlineMessageMediaAuto":if(s=l.message,"botInlineMediaResult"===o._){const{document:e,photo:s}=o;t=e?L.Z.getMediaInput(e):r.Z.getMediaInput(s)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(l.geo)},n.geoPoint=l.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(l.geo),title:l.title,address:l.address,provider:l.provider,venue_id:l.venue_id,venue_type:l.venue_type},n.geoPoint=l.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:l.phone_number,first_name:l.first_name,last_name:l.last_name,vcard:l.vcard}}t||(t={_:"messageMediaPending",type:o.type,file_name:o.title||(null===(a=o.content)||void 0===a?void 0:a.url)||o.url,size:0,progress:{percent:30,total:0}}),i.Z.sendOther(e,t,n)}}};re.GO&&(re.GO.appInlineBotsManager=ua);const ga=ua;const ma="GIFS-SEARCH";class va extends O{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=(0,Me.Z)(e.target,"gif");if(!t)return;const s=t.dataset.docId;Ol.chat.input.sendMessageWithDocument(s)?v.ZP.isMobile&&Yt.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,l.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new da(this.gifsDiv,ma,this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",I.Z.checkAnimations(void 0,ma),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return Yt.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}})),e}search(e,t=!0){return s=this,i=void 0,a=function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield E.Z.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=ga.getInlineResults(Re.NM,this.gifBotPeerId,e,this.nextOffset);const{results:s,next_offset:i}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=i,t&&(this.gifsDiv.innerHTML=""),s.length?s.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(o,r)}l((a=a.apply(s,i||[])).next())}));var s,i,n,a}}class fa extends O{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new X.ZP,this.inputSearch=new Z("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,l.fc)(this.setsDiv,(e=>{const t=(0,Me.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void Ol.chat.input.sendMessageWithDocument(e)}const s=(0,Me.Z)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=(0,Me.Z)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),ds.Z.getStickerSet({id:i,access_hash:n}).then((e=>{ds.Z.toggleStickerSet(e.set).then((t=>{t&&(a.textContent="",a.append((0,k.i18n)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{a.removeAttribute("disabled")}))}))):ds.Z.getStickerSet({id:i,access_hash:n}).then((e=>{new Ki(e.set).show()}))}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",I.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const s=document.createElement("div");s.classList.add("sticker-set-header");const i=document.createElement("div");i.classList.add("sticker-set-details"),i.innerHTML=`\n
${Q.o.wrapEmojiText(e.title)}
\n `;const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,k.i18n)("Stickers",[e.count])),i.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,k.i18n)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),s.append(i,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()})),e}renderFeatured(){return ds.Z.getFeaturedStickers().then((e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const s=Array.from(this.setsDiv.children);return(0,b.Z)(s,(s=>{const i=s.dataset.stickerSet,n=t.findIndex((e=>e.set.id===i));-1!==n?t.splice(n,1):e&&s.dataset.title.toLowerCase().includes(e.toLowerCase())||s.remove()})),I.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?ds.Z.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}class ba extends R.Z{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&(0,Ws.Z)(t,this.element)||(this.displayTimeout=window.setTimeout((()=>{this.toggle(!1)}),200))},this.toggle=e=>{return t=this,s=void 0,n=function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.forceClose=!1,this.dispatchEvent("opened")}),ce.IS_TOUCH_SUPPORTED?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),ce.IS_TOUCH_SUPPORTED?0:200)},new((i=void 0)||(i=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,r)}l((n=n.apply(t,s||[])).next())}));var t,s,i,n},(0,w.Z)(this,e)}attachButtonListener(e,t){let s=!0;ce.IS_TOUCH_SUPPORTED?(0,l.fc)(e,(()=>{s?(s=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):t.add(e)("mouseover",(i=>{s&&(t.add(e)("mouseout",this.onMouseOut),s=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.toggle(!0)}),200)}))}init(){ce.IS_TOUCH_SUPPORTED||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}const ya="emoticons-dropdown";class wa extends ba{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(I.Z.checkAnimations(!0,ya),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=Ol.chat,s=this.tabsEl.children,n=Array.from(s),a=i.Z.canSendToPeer(e,t,"send_stickers");n[2].toggleAttribute("disabled",!a);const o=i.Z.canSendToPeer(e,t,"send_gifs");n[3].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||1===(0,_s.Z)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",(()=>{return e=this,t=void 0,i=function*(){ce.IS_TOUCH_SUPPORTED&&(0,Gs.Z)()&&(yield(0,Kn.w)(100)),this.element.parentElement!==Ol.chat.input.chatInput&&Ol.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),wa.lazyLoadQueue.lock(),I.Z.lockIntersectionGroup(ya)},new((s=void 0)||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}));var e,t,s,i})),this.addEventListener("opened",(()=>{I.Z.unlockIntersectionGroup(ya),wa.lazyLoadQueue.unlock(),wa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")})),this.addEventListener("close",(()=>{wa.lazyLoadQueue.lock(),I.Z.lockIntersectionGroup(ya),I.Z.checkAnimations(!0,ya)})),this.addEventListener("closed",(()=>{I.Z.unlockIntersectionGroup(ya),wa.lazyLoadQueue.unlock(),wa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0}))}init(){this.emojiTab=new oa,this.stickersTab=new pa,this.gifsTab=new ca,this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,Y.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),I.Z.checkAnimations(!1,ya)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{1===this.tabId?Yt.isTabExists(fa)||new fa(Yt).open():Yt.isTabExists(va)||new va(Yt).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",(e=>{var t;const s=Ol.chat.input.messageInput;(null===(t=s.lastChild)||void 0===t?void 0:t.tagName)?s.lastElementChild.remove():s.lastChild&&(s.lastChild.textContent.length?s.lastChild.textContent=s.lastChild.textContent.slice(0,-1):s.lastChild.remove());const i=new Event("input",{bubbles:!0,cancelable:!0});Ol.chat.input.messageInput.dispatchEvent(i),(0,d.d)(e)}));const e=ne.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),a.default.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const s=e.intersector.getVisible();for(const e of s)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===Ol.chat.input.messageInput)return e.getRangeAt(0)}}wa.lazyLoadQueue=new X.ZP,wa.menuOnClick=(e,t,s,i=0)=>{let n=-1;const a=t=>t!==i&&(e.children[i].classList.remove("active"),e.children[t].classList.add("active"),i=t,!0),o=new Gn(t.container,((i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=(0,_s.Z)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=(0,Me.Z)(s,"menu-horizontal-div-item"),!s)return;const i=(0,_s.Z)(s);if(!a(i))return;const o=(t.splitUp||t.container).children[i].offsetTop+1;t.container.scrollTop=n=o})),{stickyIntersector:o,setActive:a}},wa.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=(0,ft.Z)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(Ol.chat.input.sendMessageWithDocument(i,void 0,t)?(Sa.container&&(Sa.forceClose=!0,Sa.container.classList.add("disable-hover"),Sa.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const Sa=new wa;re.GO.emoticonsDropdown=Sa;const Ca=Sa,La=2147483646;var Ia=s(8939);const Ma=!("undefined"==typeof RTCPeerConnection||ne.IS_FIREFOX),Ea=Ma;function Pa(e,t,s,i=e.getBoundingClientRect()){const n=t.getBoundingClientRect();let{top:a,right:o,bottom:r,left:l}=n;if(s){const e=t.querySelector(".sticky");e&&(a=e.getBoundingClientRect().bottom)}if(i.top>=r||i.bottom<=a||i.right<=l||i.left>=o)return null;const d={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},c="visualViewport"in window?window.visualViewport:window,h=c.width||c.innerWidth,p=c.height||c.innerHeight;return{rect:{top:i.topo&&o!==h?(d.right=!0,++d.horizontal,o):i.right,bottom:i.bottom>r&&r!==p?(d.bottom=!0,++d.vertical,r):i.bottom,left:i.left{ct.Z.invokeApi("messages.importChatInvite",{hash:e}).then((e=>{ni.Z.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.default.dispatchEvent("history_focus",{peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&<({langPackKey:"RequestToJoinSent"})}))}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new Yl;s.setAttribute("dialog","0"),s.classList.add("avatar-100"),"photo"===t.photo._?(t.photo=r.Z.savePhoto(t.photo),Ss({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):c.Z.putPhoto(s,Re.NM,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=Q.Z.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=(0,k.i18n)(n?"Subscribers":"Members",[(0,ka.Z)(t.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,i,o),t.pFlags.request_needed){const e=document.createElement("div");(0,k._i18n)(e,n?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT"}(Ta||(Ta={}));class Aa{constructor(e,t){this.scrollable=e,this.reverse=t}get container(){return this.scrollable.container}save(){const{scrollTop:e,scrollHeight:t}=this.container;this.previousScrollHeight=t,this.previousScrollHeightMinusTop=this.reverse?t-e:e}restore(e){const{container:t,previousScrollHeightMinusTop:s,scrollable:i}=this;if(void 0!==s){const n=t.scrollHeight;if(n===this.previousScrollHeight)return;const a=this.reverse?n-s:s;t.scrollTop=a,i.lastScrollPosition=a,ne.IS_SAFARI&&e&&jn(t)}}}var _a=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Za=new Set(["messageActionHistoryClear","messageActionChatCreate"]),Da=new Set;Ea&&Da.add("messageActionPhoneCall");const Fa=void 0;let Ra=Fa,Ba=0;class Ua{constructor(e,t,s,i,n,o,r,c,h,p,u,g){if(this.chat=e,this.appMessagesManager=t,this.appStickersManager=s,this.appUsersManager=i,this.appInlineBotsManager=n,this.appPhotosManager=o,this.appPeersManager=r,this.appProfileManager=c,this.appDraftsManager=h,this.appMessagesIdsManager=p,this.appChatsManager=u,this.appReactionsManager=g,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.loadedTopTimes=0,this.loadedBottomTimes=0,this.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRender=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=(0,As.k)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.onBubblesMouseMove=e=>{const t=(0,Me.Z)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=(0,Me.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:s,hoverReaction:i}=this;if(e===s)return;if(this.unhoverPrevious(),s=this.hoverBubble=e,i=this.hoverReaction,i)i.dataset.loaded&&this.setHoverVisible(i,!0);else{i=this.hoverReaction=document.createElement("div"),i.classList.add("bubble-hover-reaction");const s=document.createElement("div");s.classList.add("bubble-hover-reaction-sticker"),i.append(s),t.append(i);let n=this.chat.getMessage(+e.dataset.mid);n=this.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===i));Promise.all([this.appReactionsManager.getAvailableReactionsByMessage(n),(0,Kn.w)(400)]).then((([e])=>{const t=e[0];t?Is({div:s,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:Bl,withThumb:!1,needFadeIn:!1}).then((e=>{(0,gs.Z)(e),a()&&(e.addEventListener("firstFrame",(()=>{a()&&(i.dataset.loaded="1",this.setHoverVisible(i,!0))}),{once:!0}),(0,l.fc)(i,(e=>{(0,d.d)(e),this.appReactionsManager.sendReaction(n,t.reaction),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter}))})):i.remove()}))}}else this.unhoverPrevious()},this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>{var t;let s=e.target,i=null;try{i=(0,Me.Z)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&(0,Me.Z)(s,"bubble-content")){if(i.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===i){new _n(new Date(+e),this.onDatePick).show();break}return}if(!ce.IS_TOUCH_SUPPORTED&&(0,Me.Z)(s,"time"))return void this.chat.selection.toggleByElement(i);if(this.chat.selection.isSelecting&&e.isTrusted){if(i.classList.contains("service")&&void 0===i.dataset.mid)return;return(0,d.d)(e),ce.IS_TOUCH_SUPPORTED&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,Me.Z)(s,"grouped-item")||i)}const n=(0,Me.Z)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=(0,Me.Z)(s,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);const o=(0,Me.Z)(s,"spoiler");if(o){const t=(0,Me.Z)(o,"message"),s="is-spoiler-visible",i=t.classList.contains(s);i||(0,d.d)(e);const n=200,a=5e3,r=i?0:2;r&&t.classList.add("will-change");const l=t.dataset.spoilerTimeout;return null!==l&&(clearTimeout(+l),delete t.dataset.spoilerTimeout),void(0,Jt.Z)(t,s,!0,n,(()=>{t.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,Jt.Z)(t,s,!1,n,(()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout}))}),a)}),r)}const r=(0,ft.Z)(s,"REACTION-ELEMENT");if(r){if((0,d.d)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,s=t.getReactionCount(r),i=t.getMessage();return void this.appReactionsManager.sendReaction(i,s.reaction)}if((0,Me.Z)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Re.hj){const t=this.chat.getMessage(e),s=this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id),i=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(s,n,i)}else{const t=this.appMessagesManager.filterMessages(this.chat.getMessage(e),(e=>!!e.replies))[0],s=t.replies;s&&this.appMessagesManager.getDiscussionMessage(this.peerId,t.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const c=(0,Me.Z)(s,"is-via");if(c){const t=c.querySelector(".peer-title");if(s===t||(0,Ws.Z)(s,t)){const s=t.innerText+" ";return this.appDraftsManager.setDraft(this.peerId,this.chat.threadId,s),void(0,d.d)(e)}}const h=(0,Me.Z)(s,"peer-title")||(0,ft.Z)(s,"AVATAR-ELEMENT")||(0,wt.Z)(s,"data-saved-from");if(h&&h!==i){s=h||s;const e=s.dataset.peerId||s.getAttribute("peer"),t=s.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,s]=t.split("_");this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+s})}else{const t=e.toPeerId();t!==Re.NM?this.chat.appImManager.setInnerPeer({peerId:t}):rt(k.default.format("HidAccount",!0))}return}if(i.classList.contains("sticker")&&s.parentElement.classList.contains("attachment")){const e=+i.dataset.mid,s=null===(t=this.chat.getMessage(e).media)||void 0===t?void 0:t.document;return void((null==s?void 0:s.stickerSetInput)&&new Ki(s.stickerSetInput).show())}const p=(0,Me.Z)(s,"document-with-thumb");if("IMG"===s.tagName&&!s.classList.contains("emoji")&&!s.classList.contains("document-thumb")||s.classList.contains("album-item")||"VIDEO"===s.tagName&&!i.classList.contains("round")||p&&!p.querySelector(".preloader-container")){const t=(0,Me.Z)(s,"album-item")||(0,Me.Z)(s,"document-container"),n=+(t||i).dataset.mid,a=this.chat.getMessage(n);if(!a)return void this.log.warn("no message by messageId:",n);const o=(t||i).querySelector(".preloader-container");if(o)return(0,l.tH)(o),void(0,d.d)(e);const r="webpage",c=i.classList.contains(r),h=p?e=>Vl.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),u=[],g=c?[n]:Object.keys(this.bubbles).map((e=>+e)).filter((e=>{const t=this.chat.getMessage(e),s=this.appMessagesManager.getMediaFromMessage(t);return s&&h(s)})).sort(((e,t)=>e-t));g.forEach((e=>{let t;p?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const s=Array.from(this.bubbles[e].querySelectorAll(t)),i=new Set;if(p)s.forEach((e=>{u.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");s.forEach((s=>{if(t&&!(0,Me.Z)(s,"media-container-aspecter"))return;let n=(0,Me.Z)(s,"album-item");const a=n||s.parentElement;i.has(a)||(i.add(a),u.push({element:s,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),u.sort(((e,t)=>e.mid-t.mid));let m=u.findIndex((e=>e.mid===n));return re.ZP&&this.log("open mediaViewer single with ids:",g,m,u),u[m]?((new Vl).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:p?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!c,isScheduled:"scheduled"===this.chat.type}).openMedia(a,u[m].element,0,!0,u.slice(0,m),u.slice(m+1)),void(0,d.d)(e)):void this.log("no target for media viewer!",s)}if(-1===["IMG","DIV","SPAN"].indexOf(s.tagName)&&(s=(0,ft.Z)(s,"DIV")),-1!==["DIV","SPAN"].indexOf(s.tagName)){if(s.classList.contains("goto-original")){const e=i.dataset.savedFrom,[t,s]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+s})}if(s.classList.contains("forward")){const e=+i.dataset.mid,t=this.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Hs({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,Me.Z)(e.target,"reply")}catch(e){}if(t&&i.classList.contains("is-reply")){const e=+i.dataset.mid;this.replyFollowHistory.push(e);const t=this.chat.getMessage(e),s=t.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:s,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}},this.onScroll=()=>{if(this.isHeavyAnimationInProgress&&this.scrolledDown)return;const e=this.scrollable.getDistanceToEnd();!ce.IS_TOUCH_SUPPORTED&&0!==this.scrollable.lastScrollDirection&&e>0&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout((()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0}),1350)),e<300&&(this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.bubblesContainer.classList.add("scrolled-down"),this.scrolledDown=!0):this.bubblesContainer.classList.contains("scrolled-down")&&(this.bubblesContainer.classList.remove("scrolled-down"),this.scrolledDown=!1),this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection),this.setStickyDateManually()},this.onDatePick=e=>{const t=this.peerId;this.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var s;(null===(s=null==e?void 0:e.messages)||void 0===s?void 0:s.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.listenerSetter=new B.Z,this.bubblesContainer=document.createElement("div"),this.bubblesContainer.classList.add("bubbles","scrolled-down"),this.chatInner=document.createElement("div"),this.chatInner.classList.add("bubbles-inner"),this.setScroll(),this.bubblesContainer.append(this.scrollable.container),this.log=this.chat.log,this.bubbleGroups=new An(this.chat),this.preloader=new fe.Z({cancelable:!1}),this.lazyLoadQueue=new X.ZP,this.lazyLoadQueue.queueId=++Ba,this.listenerSetter.add(a.default)("history_update",(({storage:e,peerId:t,mid:s})=>{if(this.chat.getMessagesStorage()===e){const e=this.bubbles[s];if(!e)return;const t=this.chat.getMessage(s);if(+e.dataset.timestamp>=t.date+Ye.Z.serverTimeOffset-1)return void this.bubbleGroups.changeBubbleMid(e,s);this.setBubblePosition(e,t,!1),this.scrollingToBubble&&this.scrollToEnd()}})),this.listenerSetter.add(a.default)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(a.default)("message_sent",(e=>{var t,s,i,n,o,r,l,d;const{storage:c,tempId:h,tempMessage:p,mid:u}=e;if(this.chat.getMessagesStorage()!==c)return;const g=this.getMountedBubble(h,p)||this.getMountedBubble(u);if(g){const e=this.chat.getMessage(u),a=g.bubble,c=Array.from(a.querySelectorAll("reactions-element"));if(c.length&&c.forEach((t=>{t.changeMessage(e)})),e.replies){const t=a.querySelector("replies-element");t&&(t.message=e,t.init())}if(null===(t=e.media)||void 0===t?void 0:t.document){const t=a.querySelector(`.document-container[data-mid="${h}"] .document`);if(t){const a=(0,Me.Z)(t,"document-container");!(null===(n=null===(i=null===(s=p.media)||void 0===s?void 0:s.document)||void 0===i?void 0:i.thumbs)||void 0===n?void 0:n.length)&&(null===(o=e.media.document.thumbs)||void 0===o?void 0:o.length)&&t.replaceWith(ws({message:e})),a&&(a.dataset.mid=""+u)}}if(e.grouped_id){const e=a.querySelector(`.grouped-item[data-mid="${h}"]`)||a;e&&(e.dataset.mid=""+u)}if(null===(r=e.media)||void 0===r?void 0:r.poll){const t=a.querySelector("poll-element");if(t){const s=e.media.poll;t.message=e,t.setAttribute("poll-id",s.id),t.setAttribute("message-id",""+u)}}if(null===(l=e.media)||void 0===l?void 0:l.document){const t=a.querySelector(`audio-element[data-mid="${h}"], .document[data-doc-id="${h}"], .media-round[data-mid="${h}"]`);t&&(t instanceof He||t.classList.contains("media-round")?(t.dataset.mid=""+e.mid,delete t.dataset.isOutgoing,t.message=e,t.onLoad(!0)):t.dataset.docId=e.media.document.id)}(null===(d=e.media)||void 0===d?void 0:d.webpage)&&!a.querySelector(".web")&&(0,xs.e9)().then((()=>{this.safeRenderMessage(e,!0,!1,a,!1),this.scrollToBubbleIfLast(a)}))}else this.log.warn("message_sent there is no bubble",e);const m=this.bubbles;if(m[h]){const e=m[h];m[u]=e,delete m[h],(0,De.T2)((()=>{e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===a.default.myId&&"scheduled"!==this.chat.type?"is-read":"is-sent"))})),e.dataset.mid=""+u}this.unreadOut.has(h)&&(this.unreadOut.delete(h),this.unreadOut.add(u)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=p.date-10&&this.deleteMessagesByIds([u])})),this.listenerSetter.add(a.default)("message_edit",(({storage:e,peerId:t,mid:s})=>{if(e!==this.chat.getMessagesStorage())return;const i=this.chat.getMessage(s),n=i.grouped_id?this.getGroupedBubble(i.grouped_id):this.getMountedBubble(s);if(!n)return;const a="scheduled"===this.chat.type;this.saveOnUpdateScroll(),this.safeRenderMessage(n.message,!0,!1,n.bubble,a),a&&(this.messagesQueuePromise||Promise.resolve()).then((()=>{this.deleteEmptyDateGroups()}))})),"scheduled"!==this.chat.type&&(this.listenerSetter.add(a.default)("missed_reactions_element",(({message:e,changedResults:t})=>{if(this.peerId!==e.peerId||!e.reactions||!e.reactions.results.length)return;const s=this.getBubbleByMessage(e);s&&(e.grouped_id&&(e=this.getGroupedBubble(e.grouped_id).message),this.appendReactionsElementToBubble(s,e,t))})),this.listenerSetter.add(a.default)("message_reactions",(({message:e,changedResults:t})=>{if(this.peerId!==e.peerId)return;if(!this.getBubbleByMessage(e))return;this.saveOnUpdateScroll();const s=e.peerId+"_"+e.mid,i=Rn.get(s);if(i)for(const s of i)s.update(e,t);else a.default.dispatchEvent("missed_reactions_element",{message:e,changedResults:t})}))),this.listenerSetter.add(a.default)("album_edit",(({peerId:e,groupId:t,deletedMids:s})=>{if(e!==this.peerId)return;const i=this.appMessagesManager.getMidsByAlbum(t).concat(s).find((e=>this.bubbles[e]));if(!i)return;const n=(0,Xs.Z)(this.appMessagesManager.groupedMessagesStorage[t],"asc").pop();this.safeRenderMessage(this.chat.getMessage(n),!0,!1,this.bubbles[i],!1)})),this.listenerSetter.add(a.default)("messages_downloaded",(({peerId:e,mids:t})=>{const s=this.getMiddleware();(0,xs.e9)().then((()=>{s()&&t.forEach((t=>{(0,b.Z)(this.needUpdate,((s,i)=>{if(s.replyMid===t&&s.replyToPeerId===e){const{mid:e,replyMid:t}=this.needUpdate.splice(i,1)[0],n=this.bubbles[e];if(!n)return;const a=this.chat.getMessage(e);this.appMessagesManager.getMessageByPeer(s.replyToPeerId,t).deleted&&delete a.reply_to_mid,Hn.setReply({chat:this.chat,bubble:n,message:a})}}))}))}))})),ce.IS_TOUCH_SUPPORTED){const e="is-gesturing-reply",t=64,s=.75*t;let i,n,a=!1;Us({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.chat.canSend()||(i=(0,Me.Z)(t.target,"bubble"),i&&((0,Jt.Z)(i,e,!0,250),i.offsetLeft,n?(n.classList.remove("is-visible"),n.style.opacity=""):(n=document.createElement("span"),n.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),i.append(n)),!i)),onSwipe:(e,o)=>{a=e>=s,a&&!n.classList.contains("is-visible")&&n.classList.add("is-visible"),n.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(t,e));i.style.transform=`translateX(${r}px)`,(0,J.s3)()},onReset:()=>{const t=i;(0,Jt.Z)(t,e,!1,250,(()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())})),(0,De.T2)((()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}}))},listenerOptions:{capture:!0}})}let m;(0,l.fc)(this.bubblesContainer,this.onBubblesClick,{listenerSetter:this.listenerSetter}),re.ZP&&this.listenerSetter.add(this.bubblesContainer)("dblclick",(e=>{const t=(0,Me.Z)(e.target,"grouped-item")||(0,Me.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",this.chat.getMessage(e)),this.highlightBubble(t)}})),ne.IS_MOBILE||"pinned"===this.chat.type||this.listenerSetter.add(this.bubblesContainer)("dblclick",(e=>{if(this.chat.selection.isSelecting||!this.chat.canSend())return;const t=e.target,s=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(s&&!s.classList.contains("bubble-first")){const e=+s.dataset.mid;if(this.chat.getMessage(e).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}})),(0,xs.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),m=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,m&&m()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),m=null}),this.listenerSetter)}constructPeerHelpers(){if(this.listenerSetter.add(a.default)("history_append",(({storage:e,mid:t})=>{if(e===this.chat.getMessagesStorage()&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId(),a.default.settings.animationsEnabled)){const e=this.chat.gradientRenderer;e&&e.toNextPosition()}})),this.listenerSetter.add(a.default)("history_multiappend",(e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort(((e,t)=>t-e));this.renderNewMessagesByIds(t)})),this.listenerSetter.add(a.default)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(a.default)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),this.updateUnreadByDialog())})),this.listenerSetter.add(a.default)("dialogs_multiupdate",(e=>{e[this.peerId]&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(a.default)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(a.default)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.chatInner.classList.contains("has-rights")!==this.chat.canSend()&&(this.finishPeerChange(),this.chat.input.finishPeerChange())})),this.listenerSetter.add(a.default)("settings_updated",(e=>{if("settings.emoji.big"===e.key){const e=this.scrollable.isScrolledDown;e||this.setMessagesQueuePromise(),(0,Xs.Z)(this.bubbles,"desc").forEach((e=>{const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji")){const s=this.chat.getMessage(e);this.safeRenderMessage(s,void 0,!1,t)}})),e?this.scrollable.scrollTop=99999:this.performHistoryResult([],!0,!1,void 0)}})),this.listenerSetter.add(a.default)("message_views",(({peerId:e,views:t,mid:s})=>{this.peerId===e&&(0,De.T2)((()=>{const e=this.bubbles[s];if(!e)return;const i=Array.from(e.querySelectorAll(".post-views"));if(i.length){const e=Cn(t,1);let s=!1;i.forEach((t=>{(s||t.innerHTML!==e)&&(this.saveOnUpdateScroll(),s=!0,t.innerHTML=e)}))}}))})),this.unreadedObserver=new IntersectionObserver((e=>{e.forEach((e=>{if(e.isIntersecting){const t=e.target,s=this.unreaded.get(t);this.onUnreadedInViewport(t,s)}}))})),this.viewsObserver=new IntersectionObserver((e=>{e.forEach((e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.viewsObserver.unobserve(e.target),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this;e&&e.random_id&&(delete e.random_id,this.chat.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId()),random_id:e.random_id}))}}}))})),this.sendViewCountersDebounced=dt((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),"ResizeObserver"in window){let e=this.scrollable.container.offsetHeight,t=!1,s=!1,i=0,n=0,a=0;const o=()=>{const o=this.scrollable.container.offsetHeight,r=this.scrollable.isScrolledDown;o===e||s&&r||(n+=e-o),n&&(this.scrollable.scrollTop+=Math.round(n)),e=o,i=0,a=0,n=0,t=!1,s=!1},r=e=>{a&&window.cancelAnimationFrame(a),a=window.requestAnimationFrame(e?o:()=>{a=window.requestAnimationFrame(o)})},l=a=>{if(s)return void r(!1);const o=a[0].contentRect.height;if(!e)return void(e=o);const l=e-o;let d=l+n;const c=d%1;if(d-=c,!t&&(t=!0,l<0&&this.scrollable.isScrolledDown))return n=-l,s=!0,void r(!1);if(i+=d,d){const e=this.scrollable.scrollTop+d;this.scrollable.scrollTop=e}r(!1),n=c,e=o};new ResizeObserver(l).observe(this.bubblesContainer)}}saveOnUpdateScroll(){this.onUpdateScrollSaver||(this.onUpdateScrollSaver=new Aa(this.scrollable,!0),setTimeout((()=>{this.onUpdateScrollSaver.restore(),this.onUpdateScrollSaver=void 0}),0),this.onUpdateScrollSaver.save())}setReactionsHoverListeners(){this.listenerSetter.add(a.default)("context_menu_toggle",this.unhoverPrevious),this.listenerSetter.add(a.default)("overlay_toggle",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.bubblesContainer)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){(0,Jt.Z)(e,"is-visible",t,200,t?void 0:()=>{e.remove()},2)}setStickyDateManually(){const e=Object.keys(this.dateMessages).map((e=>+e)).sort(((e,t)=>t-e));let t;const{scrollTop:s}=this.scrollable.container;if(s>0)for(const s of e){const e=this.dateMessages[s],i=Pa(e.container,this.scrollable.container);if(i&&i.overflow.top)t=e.div;else if(t)break}if(t!==this.previousStickyDate){if(t){const e=!this.previousStickyDate;e&&t.classList.add("no-transition"),t.classList.add("is-sticky"),e&&(t.offsetLeft,t.classList.remove("no-transition"))}this.previousStickyDate&&this.previousStickyDate!==t&&this.previousStickyDate.classList.remove("is-sticky"),this.previousStickyDate=t}}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.unreadedObserver.unobserve(e),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=a.default.idle.focusPromise.then((()=>{if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max(this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).maxId||0,t))}this.unreaded.forEach(((e,s)=>{e<=t&&this.onUnreadedInViewport(s,e)}));const s=[];for(const e of this.unreadedSeen){const t=this.chat.getMessage(e);this.appMessagesManager.isMentionUnread(t)&&s.push(e)}return this.appMessagesManager.readMessages(this.peerId,s),this.unreadedSeen.clear(),re.ZP&&this.log("will readHistory by maxId:",t),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",(e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&(i||this.deleteMessagesByIds(s))}))}constructScheduledHelpers(){const e=()=>{this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size)};this.listenerSetter.add(a.default)("scheduled_new",(({peerId:t,mid:s})=>{t===this.peerId&&(this.renderNewMessagesByIds([s]),e())})),this.listenerSetter.add(a.default)("scheduled_delete",(({peerId:t,mids:s})=>{t===this.peerId&&(this.deleteMessagesByIds(s),e())}))}onGoDownClick(){if(this.replyFollowHistory.length){(0,b.Z)(this.replyFollowHistory,((e,t)=>{const s=this.bubbles[e];let i=!0;if(s){const e=s.getBoundingClientRect();i=Ct.Z.height/2>e.top}else this.chat.getMessage(e).deleted||(i=!1);i&&this.replyFollowHistory.splice(t,1)})),this.replyFollowHistory.sort(((e,t)=>t-e));const e=this.replyFollowHistory.pop();this.chat.setMessageId(e)}else this.chat.setMessageId()}getBubbleByPoint(e){let t=Vn(this.scrollable.container,e,"center");return t&&(t=(0,Me.Z)(t,"bubble")),t}getGroupedBubble(e){const t=this.appMessagesManager.groupedMessagesStorage[e];for(const[e]of t)if(this.bubbles[e]){const s=Math.max(...t.keys());return{bubble:this.bubbles[e],mid:+e,message:this.chat.getMessage(s)}}}getBubbleByMessage(e){if(!e.grouped_id)return this.bubbles[e.mid];const t=this.getGroupedBubble(e.grouped_id);return null==t?void 0:t.bubble}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t=this.chat.getMessage(e)){if(t.grouped_id&&this.appMessagesManager.getMidsByAlbum(t.grouped_id).length>1){const s=this.getGroupedBubble(t.grouped_id);if(s)return s.bubble=s.bubble.querySelector(`.document-container[data-mid="${e}"]`)||s.bubble,s}const s=this.bubbles[e];if(s)return{bubble:s,mid:e,message:t}}findNextMountedBubbleByMsgId(e){return this.bubbles[(0,Xs.Z)(this.bubbles).find((t=>{var s;return!(t+e)).sort(((e,t)=>e-t));if(s.length)if(e)re.ZP&&this.log("Will load more (up) history by id:",s[0],"maxId:",s[s.length-1],t),this.getHistory(s[0],!0,void 0,void 0,t);else{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);if(-1!==s.indexOf(e.maxId))return void this.setLoaded("bottom",!0);re.ZP&&this.log("Will load more (down) history by id:",s[s.length-1],t),this.getHistory(s[s.length-1],!1,!0,void 0,t)}}setScroll(){this.scrollable=new P.ZP(null,"IM",300),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),ce.IS_TOUCH_SUPPORTED&&(this.scrollable.container.addEventListener("touchmove",(()=>{this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling")}),{passive:!0}),this.scrollable.container.addEventListener("touchend",(()=>{this.chatInner.classList.contains("is-scrolling")&&(this.isScrollingTimeout&&clearTimeout(this.isScrollingTimeout),this.isScrollingTimeout=window.setTimeout((()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0}),1350))}),{passive:!0}))}updateUnreadByDialog(){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),t=this.peerId===a.default.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(t.classList.contains("is-outgoing"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}this.unreadOut.delete(e)}}deleteMessagesByIds(e,t=!0){let s=!1;e.forEach((e=>{if(!(e in this.bubbles))return;s=!0;const t=this.bubbles[e];delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeBubble(t),this.unreadedObserver&&(this.unreadedObserver.unobserve(t),this.unreaded.delete(t)),this.viewsObserver&&(this.viewsObserver.unobserve(t),this.viewsMids.delete(e)),t.remove(),this.emptyPlaceholderMid===e&&(this.emptyPlaceholderMid=void 0)})),s&&(t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),I.Z.checkAnimations(!1,Bl),this.deleteEmptyDateGroups(),this.onScroll())}renderNewMessagesByIds(e,t){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const s=this.getMiddleware();t.then((()=>{s()&&this.renderNewMessagesByIds(e)}))}return}this.chat.threadId&&(e=e.filter((e=>{const t=this.chat.getMessage(e).reply_to;return t&&(t.reply_to_top_id||t.reply_to_msg_id)===this.chat.threadId}))),e=e.filter((e=>!this.bubbles[e])),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const s=this.getMiddleware();let i,n=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:t}=this.scrollable.container;n=e===t,n&&(i=this.chatInner,i.style.paddingTop=e+"px",this.scrollable.scrollTop=t,this.isTopPaddingSet=!0)}const a=this.performHistoryResult(e,!1,!0);t&&a.then((()=>{if(!s())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();n&&a.then((()=>{s()&&n&&(i.style.paddingTop="",this.isTopPaddingSet=!1)}))}))}getLastBubble(){const e=this.getLastDateGroup();if(e)return e.lastElementChild}scrollToBubble(e,t,s,i){const n=(0,Me.Z)(e,"bubble");let a;n&&"end"!==t&&(0,_s.Z)(n)===(this.stickyIntersector?2:1)&&(a=n.parentElement);const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper");return this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:s,forceDuration:i,axis:"y",getNormalSize:o?({rect:e})=>{let t=Ct.Z.height;return t-=this.bubblesContainer.offsetTop,t-=v.ZP.isMobile||Ct.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a})}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return _a(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}getLastDateGroup(){let e,t=0;for(const s in this.dateMessages){const i=this.dateMessages[s];i.firstTimestamp>t&&(e=i.container,t=i.firstTimestamp)}return e}scrollToBubbleIfLast(e){return _a(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}getDateContainerByMessage(e,t){const s=new Date(1e3*e.date);s.setHours(0,0,0);const i=s.getTime();if(!this.dateMessages[i]){let t;const n=new Date;n.setHours(0,0,0,0);const a="scheduled"===this.chat.type;if(n.getTime()===s.getTime())t=(0,k.i18n)(a?"Chat.Date.ScheduledForToday":"Date.Today");else if(a&&e.date===La)t=(0,k.i18n)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};s.getFullYear()!==n.getFullYear()&&(e.year="numeric"),t=new k.default.IntlDateElement({date:s,options:e}).element,a&&(t=(0,k.i18n)("Chat.Date.ScheduledFor",[t]))}const o=document.createElement("div");o.className="bubble service is-date";const r=document.createElement("div");r.classList.add("bubble-content");const l=document.createElement("div");l.classList.add("service-msg"),l.append(t),r.append(l),o.append(r);const d=document.createElement("section");d.className="bubbles-date-group",d.append(o),this.dateMessages[i]={div:o,container:d,firstTimestamp:s.getTime()};const c=(0,Xs.Z)(this.dateMessages,"asc");let h,p=0,u=c.length;for(;p+e))))}else this.isFirstLoad=!0;const f=this.chatInner;this.cleanup();const b=this.chatInner=document.createElement("div");let y;n?(b.className=f.className,b.classList.remove("disable-hover","is-scrolling")):b.classList.add("bubbles-inner"),this.lazyLoadQueue.lock(),y=c?{promise:(0,xs.e9)().then((()=>this.performHistoryResult(c.mids,!0,!1,void 0))),cached:!0}:this.getHistory(t,!0,u,m);const{promise:w,cached:S}=y;S||n||(g.container.textContent="",this.chat.finishPeerChange(l,u,t,s),this.preloader.attach(this.bubblesContainer)),I.Z.lockGroup(Bl);const C=w.then((()=>{if(S?n||this.chat.finishPeerChange(l,u,t,s):this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),g.lastScrollDirection=0,g.lastScrollPosition=0,(0,T.Z)(g.container,b),I.Z.unlockGroup(Bl),I.Z.checkAnimations(!1,Bl),this.lazyLoadQueue.unlock(),c)g.scrollTop=g.lastScrollPosition=c.top;else if(r&&u||l){const e=v>0&&(v{g.checkForTriggers()})),this.chat.dispatchEvent("setPeer",t,!u),this.appPeersManager.isChannel(e)){const e=this.getMiddleware(),t=()=>{if(!e())return;const s=[];for(const e in this.bubbles){let t=this.chat.getMessage(+e);"message"===t._&&(t=this.appMessagesManager.getGroupsFirstMessage(t),s.push(t.mid))}(s.length?this.appReactionsManager.getMessagesReactions(this.peerId,s):Promise.resolve()).then((()=>{setTimeout(t,1e4)}))};Promise.all([o,(0,xs.e9)(),(0,Kn.w)(500)]).then((()=>{t()}))}const h=this.appMessagesManager.isFetchIntervalNeeded(e);if(c||h?o.then((()=>{if(i()&&(g.checkForTriggers(),h)){const t=()=>{this.fetchNewPromise=new Promise((s=>{i()&&this.appMessagesManager.isFetchIntervalNeeded(e)?this.appMessagesManager.getNewHistory(e,this.chat.threadId).then((e=>{if(!i()||!e)return void s();const n=e.history.slice.isEnd(zn.D.Bottom);g.loadedAll.bottom&&g.loadedAll.bottom!==n&&(this.setLoaded("bottom",n),this.onScroll()),setTimeout(t,3e4),s()})):s()})).finally((()=>{this.fetchNewPromise=void 0}))};n?setTimeout(t,3e4):t()}})):t&&!this.bubbles[r]&&t!==r||this.setLoaded("bottom",!0),this.log("scrolledAllDown:",g.loadedAll.bottom),g.loadedAll.bottom&&r&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===a){const t=this.appMessagesManager.getDialogOnly(e);(null==t?void 0:t.pFlags.unread_mark)&&this.appMessagesManager.markDialogUnread(e,!0)}})).catch((e=>{throw this.log.error("getHistory promise error:",e),this.preloader.detach(),e}));return{cached:S,promise:C}}onScrolledAllDown(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);this.appMessagesManager.readHistory(this.peerId,e.maxId,this.chat.threadId,!0)}}finishPeerChange(){const e=this.appPeersManager.isChannel(this.peerId),t=this.chat.canSend();this.chatInner.classList.toggle("has-rights",t),this.bubblesContainer.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",this.chat.isAnyGroup()),this.chatInner.classList.toggle("is-channel",e)}renderMessagesQueue(e,t,s,i){return this.messagesQueue.push({message:e,bubble:t,reverse:s,promises:i}),this.setMessagesQueuePromise()}setMessagesQueuePromise(){return this.messagesQueuePromise||!this.messagesQueue.length?Promise.resolve():this.messagesQueuePromise=new Promise(((e,t)=>{setTimeout((()=>{const s=this.messagesQueue.slice();this.messagesQueue.length=0;const i=s.reduce(((e,{promises:t})=>(e.push(...t),e)),[]);this.log("promises to call",i,s,this.isHeavyAnimationInProgress);const n=this.getMiddleware();Promise.all(i).then((()=>{if(!n())throw"setMessagesQueuePromise: peer changed!";this.messagesQueueOnRender&&this.messagesQueueOnRender(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),s.forEach((({message:e,bubble:t,reverse:s})=>{this.setBubblePosition(t,e,s)})),e(),this.messagesQueuePromise=null,this.messagesQueue.length&&this.setMessagesQueuePromise(),this.setUnreadDelimiter()})).catch(t)}),0)}))}setBubblePosition(e,t,s){if(t.pFlags.local)return void this.chatInner[t.pFlags.sponsored?"append":"prepend"](e);const i=this.getDateContainerByMessage(t,s);if("scheduled"===this.chat.type||"pinned"===this.chat.type){const s=this.stickyIntersector?2:1;let n=Array.from(i.container.children).slice(s),a=0,o=0;for(;as.includes(e))));i.className=n.join(" "),y=i.lastElementChild,y.classList.contains("bubble-content-wrapper")||(y=i.querySelector(".bubble-content-wrapper")),b=y.firstElementChild,b.innerHTML="",b.style.cssText="",y.innerHTML="",y.appendChild(b);const a=y.style.transitionDelay;y.style.cssText="",y.style.transitionDelay=a,i===this.firstUnreadBubble&&i.classList.add("is-first-unread");const o=+i.dataset.mid;+e.mid===o||(delete this.bubbles[o],this.skippedMids.delete(o))}else y=document.createElement("div"),y.classList.add("bubble-content-wrapper"),b=document.createElement("div"),b.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),y.appendChild(b),i.appendChild(y),g||e.pFlags.out||!this.unreadedObserver||(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._)),t=S.length;if(e.reduce(((e,t)=>e+t.length),0)===t&&e.length<=3&&C.length===e.length){if(a.default.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(S);if(1===e.length&&!L&&t)L={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=I,i.classList.add("emoji-"+e.length+"x"),b.append(t)}i.classList.add("is-message-empty","emoji-big"),E=!0,M=!1,P=!1}i.classList.add("can-have-big-emoji")}}P&&m(f,I);const T=Hn.setTime({chatType:this.chat.type,message:e});if(f.append(T),b.prepend(f),c&&e.views){if(i.classList.add("channel-post"),!(null===(r=e.fwd_from)||void 0===r?void 0:r.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),b.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.viewsObserver&&this.viewsObserver.observe(i)}const x=c&&e.reply_markup;if(x&&"replyInlineMarkup"===x._&&x.rows&&x.rows.length){const t=x.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach((t=>{const i=t.buttons;if(!i||!i.length)return;const n=document.createElement("div");n.classList.add("reply-markup-row"),i.forEach((t=>{const s=Q.Z.wrapRichText(t.text,{noLinks:!0,noLinebreaks:!0});let i;switch(t._){case"keyboardButtonUrl":{const e=Q.Z.wrapRichText(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,Vs.Z)(e).firstElementChild,i.classList.add("is-link","tgico");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline","tgico"),(0,l.fc)(i,(s=>{(0,d.d)(s);const i=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.appInlineBotsManager.checkSwitchReturn(i).then((e=>e||new Promise(((e,t)=>{const s=new Hs({[this.peerId]:[]},(t=>{e(t)}),!0);s.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const s=this.peerId===e?this.chat.threadId:void 0;this.appInlineBotsManager.switchInlineQuery(e,s,i,t.query)}))}));break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp"),i.insertAdjacentHTML("beforeend",s),(0,ee.ripple)(i),n.append(i)})),s.append(n)})),(0,l.fc)(s,(s=>{let i=s.target;if(i.classList.contains("reply-markup-button")||(i=(0,Me.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline"))return;(0,d.d)(s);const n=(0,_s.Z)(i),a=t[(0,_s.Z)(i.parentElement)];if(!a.buttons||!a.buttons[n])return void this.log.warn("no such button",a,n,e);const o=a.buttons[n];this.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,o)})),M=!1,i.classList.add("with-reply-markup"),y.append(s)}const A=e.pFlags.is_outgoing;if(g){(e.pFlags.unread||A)&&this.unreadOut.add(e.mid);let t="";t=A?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}A&&i.classList.add("is-outgoing");const _=c&&this.appMessagesManager.getMessageWithReplies(e),Z=!!_&&e.mid>0;Z&&i.classList.add("with-replies");const D=c&&e.fwd_from,F=c&&e.fwdFromId,R=g&&(!D||this.peerId!==a.default.myId);let B=b;const U=!(e.viaBotId||e.fromId!==a.default.myId&&e.pFlags.out);if(L){let t=document.createElement("div");t.classList.add("attachment"),S||i.classList.add("is-message-empty");let s=!1;switch(L._){case"messageMediaPhoto":{const s=L.photo;S||(M=!1),U&&i.classList.add("hide-name"),i.classList.add("photo");const n=this.appMessagesManager.groupedMessagesStorage[h];if(h&&1!==n.size&&p){i.classList.add("is-album","is-grouped"),ks({groupId:h,attachmentDiv:t,middleware:this.getMiddleware(),isOut:g,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:w,autoDownload:this.chat.autoDownload});break}const a=!ne.IS_ANDROID&&M&&!Z&&!1;a&&i.classList.add("with-media-tail"),Ss({photo:s,message:e,container:t,withTail:a,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:w,autoDownloadSize:this.chat.autoDownload.photo});break}case"messageMediaWebPage":{s=!0;let t=L.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let n=document.createElement("div");n.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));const d=t.document;if(d)if("gif"===d.type||"video"===d.type||"round"===d.type){const t="round"===d.type?v.ZP.active.round:v.ZP.active.webpage;"round"===d.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),ys({doc:d,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:R,group:Bl,loadPromises:w,autoDownload:this.chat.autoDownload})}else{const t=ws({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:w});o.append(t),o.classList.add("preview-with-document")}let c,h=document.createElement("div");if(h.classList.add("quote-text"),a&&h.append(a),t.site_name){const e=Q.Z.wrapRichText(t.url),s=(0,Vs.Z)(e).firstElementChild;s.classList.add("webpage-name");const i=document.createElement("strong");m(i,Q.Z.wrapEmojiText(t.site_name)),s.textContent="",s.append(i),h.append(s),c=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title");const s=document.createElement("strong");m(s,t.rTitle),e.append(s),h.append(e),c=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),m(e,t.rDescription),h.append(e),c=e}if(r.append(h),l&&!d){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&c?(i.classList.add("is-square-photo"),s=!0,this.appPhotosManager.setAttachmentSize(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),Ss({photo:l,message:e,container:o,boxWidth:s?0:v.ZP.active.webpage.width,boxHeight:s?0:v.ZP.active.webpage.height,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:w,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}n.append(r),f.insertBefore(n,T);break}case"messageMediaDocument":{const n=L.document;if(n.sticker){i.classList.add("sticker"),M=!1,E=!0,n.animated&&i.classList.add("sticker-animated");const e=v.ZP.active,s=i.classList.contains("emoji-big")?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;this.appPhotosManager.setAttachmentSize(n,t,s.width,s.height),b.style.minWidth=t.style.width,b.style.minHeight=t.style.height,Is({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:Bl,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?S:void 0,withThumb:!0,loadPromises:w})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(E=!0),!s&&S||(M=!1),U&&i.classList.add("hide-name"),i.classList.add(s?"round":"video");const a=this.appMessagesManager.groupedMessagesStorage[h];if(h&&1!==a.size&&p)i.classList.add("is-album","is-grouped"),ks({groupId:h,attachmentDiv:t,middleware:this.getMiddleware(),isOut:g,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:w,autoDownload:this.chat.autoDownload});else{const a=!ne.IS_ANDROID&&!ne.IS_APPLE&&!s&&M&&!Z&&!1;a&&i.classList.add("with-media-tail"),ys({doc:n,container:t,message:e,boxWidth:v.ZP.active.regular.width,boxHeight:v.ZP.active.regular.height,withTail:a,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:Bl,loadPromises:w,autoDownload:this.chat.autoDownload,searchContext:s?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=function({albumMustBeRenderedFull:e,message:t,bubble:s,messageDiv:i,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,useSearch:d}){let c;const h=e?n.getMidsByMid(t.mid):[t.mid];return h.forEach(((e,t)=>{const s=n.getMessage(e),d=ws({message:s,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l}),p=document.createElement("div");p.classList.add("document-container"),p.dataset.mid=""+e,p.dataset.peerId=""+s.peerId;const u=document.createElement("div");if(u.classList.add("document-wrapper"),s.message){const e=document.createElement("div");e.classList.add("document-message");const t=Q.Z.wrapRichText(s.message,{entities:s.totalEntities});e.innerHTML=t,u.append(e)}if(h.length>1){const e=document.createElement("div");e.classList.add("document-selection"),p.append(e),p.classList.add("grouped-item"),0===t&&(c=u)}u.append(d),p.append(u),i.append(p)})),h.length>1&&s.classList.add("is-multiple-documents","is-grouped"),c}({albumMustBeRenderedFull:p,message:e,bubble:i,messageDiv:f,chat:this.chat,loadPromises:w,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0});t&&(B=t);const a=f.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(T),i.classList.remove("is-message-empty"),f.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),s=!0}break}case"messageMediaCall":{const e=L.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";t.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,k._i18n)(a,R?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append((0,Ia.Z)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,k._i18n)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),s=!0,i.classList.remove("is-message-empty"),f.classList.add("call-message"),f.append(t);break}case"messageMediaContact":{const e=L,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,s=!0;const n=[];e.first_name&&n.push(Q.Z.wrapEmojiText(e.first_name)),e.last_name&&n.push(Q.Z.wrapEmojiText(e.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.phone_number?"+"+(0,Os.u)(e.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new Yl;a.lazyLoadQueue=this.lazyLoadQueue,a.setAttribute("peer",""+e.user_id.toPeerId()),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),i.classList.remove("is-message-empty"),f.classList.add("contact-message"),f.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e){const t=new os;return t.message=e,t.setAttribute("peer-id",""+e.peerId),t.setAttribute("poll-id",e.media.poll.id),t.setAttribute("message-id",""+e.mid),t.render(),t}(e);f.prepend(t),f.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),f.append((0,k.i18n)(k.UNSUPPORTED_LANG_PACK_KEY),T),this.log.warn("unrecognized media type:",L._,e)}s||b.append(t)}E&&i.classList.add("just-media"),this.chat.selection.isSelecting&&this.chat.selection.toggleElementCheckbox(i,!0);let N="";const O=e.fromId!==a.default.myId&&this.appPeersManager.isAnyGroup(u)||e.viaBotId||e.pFlags.sponsored;if(O||D||e.reply_to_mid){let t,s;const n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===F;let o,r=D&&!D.from_id;if(e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+this.appUsersManager.getUser(e.viaBotId).username,s.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),t.innerHTML=Q.Z.wrapEmojiText(D.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new St.Z({peerId:F||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&c&&Hn.setReply({chat:this.chat,bubble:i,bubbleContainer:b,message:e}),F||D)if(this.peerId===a.default.myId||n||i.classList.add("forwarded"),e.savedFrom&&(N=e.savedFrom,t.dataset.savedFrom=N),o=document.createElement("div"),t.dataset.peerId=""+F,this.peerId!==a.default.myId&&this.peerId!==Re.hj&&!n||E){const e=[t];E&&e.unshift(document.createElement("br")),o.append((0,k.i18n)("ForwardedFrom",[e]))}else o.style.color=this.appPeersManager.getPeerColorById(F,!1),o.append(t);else e.viaBotId||(!E&&O?(o=document.createElement("div"),o.append(t),g||(o.style.color=this.appPeersManager.getPeerColorById(e.fromId,!1)),o.dataset.peerId=""+e.fromId):i.classList.add("hide-name"));if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append((0,k.i18n)("ViaBot")," ",s),e.classList.add("is-via"),o.append(e)}if(o&&(o.classList.add("name"),B.append(o)),this.chat.isAnyGroup()&&!R){let t=new Yl;t.lazyLoadQueue=this.lazyLoadQueue,t.classList.add("user-avatar","avatar-40"),t.loadPromises=w,!F&&D&&D.from_name&&t.setAttribute("peer-title",D.from_name),t.setAttribute("peer",""+((D&&(this.peerId===a.default.myId||this.peerId===Re.hj)||n?F:e.fromId)||Re.NM)),y.append(t)}}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(N=`${this.chat.peerId}_${e.mid}`),_&&_.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),N&&("pinned"===this.chat.type||D.saved_from_msg_id)&&this.peerId!==Re.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),b.append(e),i.dataset.savedFrom=N,i.classList.add("with-beside-button")}return i.classList.add(R?"is-out":"is-in"),n&&this.renderMessagesQueue(e,i,t,w),Z&&Hn.renderReplies({bubble:i,bubbleContainer:b,message:_,messageDiv:f,loadPromises:w,lazyLoadQueue:this.lazyLoadQueue})&&(M=!0),c&&this.appendReactionsElementToBubble(i,e),M&&(i.classList.add("can-have-tail"),b.append(Na())),i}appendReactionsElementToBubble(e,t,s){if(this.peerId.isUser())return;const i=this.appMessagesManager.getGroupsFirstMessage(t);if(!i.reactions||!i.reactions.results.length)return;const n=new Bn;if(n.init(i,"block"),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let i=e.querySelector(".document-message"),a=i&&i.querySelector(".time");a||(a=Hn.setTime({chatType:this.chat.type,message:t})),n.append(a),i||(i=document.createElement("div"),i.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(i)),i.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}safeRenderMessage(e,t,s,i,n){try{return this.renderMessage(e,t,s,i,n)}catch(e){this.log.error("renderMessage error:",e)}}performHistoryResult(e,t,s,i){return _a(this,void 0,void 0,(function*(){let s;e=e.slice(),i&&e.unshift(i),this.messagesQueueOnRender=()=>{s=new Aa(this.scrollable,t),s.save()},this.needReflowScroll&&(jn(this.scrollable.container),this.needReflowScroll=!1);const n=e=>{const s="number"==typeof e?this.chat.getMessage(e):e;s.pFlags.local?this.processLocalMessageRender(s):this.safeRenderMessage(s,t,!0)},a=e.length;if(t)for(let t=0;t=0;--t)n(e[t]);if("scheduled"!==this.chat.type){const t=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),s=t.history.first,i=t.history.last;!s.isEnd(zn.D.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(zn.D.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);return yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),s&&s.restore(!(1===e.length&&!t)),!0}))}requestHistory(e,t,s){return"chat"===this.chat.type||"discussion"===this.chat.type?this.appMessagesManager.getHistory(this.peerId,e,t,s,this.chat.threadId):"pinned"===this.chat.type?this.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:s}).then((e=>({history:e.history.map((e=>e.mid))}))):"scheduled"===this.chat.type?this.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({history:e.slice().reverse()}))):void 0}animateAsLadder(e,t,s,i,n){return _a(this,void 0,void 0,(function*(){if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,s,i,n));if(!Object.keys(this.bubbles).length)return;let a,o=(0,Xs.Z)(this.bubbles,"desc");s&&t.length&&(o=o.filter((e=>!t.includes(e)))),a=i?n||Math.max(...o):e||Math.max(...o);const r=o.slice(o.findIndex((e=>a>e))),l=s?[]:[a],d=s?[]:o.slice(0,o.findIndex((e=>a>=e))).reverse();re.ZP&&this.log("getHistory: targeting mid:",a,n,e,r.map((e=>this.appMessagesIdsManager.getServerMessageId(e))),d.map((e=>this.appMessagesIdsManager.getServerMessageId(e))));const c=[];this.chatInner.classList.add("zoom-fading");const h=s?10:40,p=s?0:1,u=(e,t=0)=>{const s=(0,se.b)();let i=0;return e.forEach(((n,a)=>{if(!this.bubbles[n]||this.skippedMids.has(n))return void this.log.warn("animateAsLadder: no bubble by mid:",n);const o=this.bubbles[n].lastElementChild;if(i=(a+t||.1)*h,o.classList.add("zoom-fade"),o.style.transitionDelay=i+"ms",a===e.length-1){const e=t=>{t.target===o&&(s.resolve(),o.removeEventListener("transitionend",e))};o.addEventListener("transitionend",e)}c.push(o)})),e.length||s.resolve(),{lastMsDelay:i,animationPromise:s}},g=u(r,p),m=u(l),v=u(d,p),f=[g.animationPromise,m.animationPromise,v.animationPromise],b=[g.lastMsDelay,m.lastMsDelay,v.lastMsDelay];let y;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,De.T2)((()=>{this.setStickyDateManually(),c.forEach((e=>{e.classList.remove("zoom-fade")}))})),(r.length||l.length||d.length)&&(y=Promise.all(f),(0,xs.YW)(y,Math.max(...b)+200).then((()=>{(0,De.T2)((()=>{c.forEach((e=>{e.style.transitionDelay=""})),this.chatInner.classList.remove("zoom-fading")})),ne.IS_SAFARI||(this.needReflowScroll=!0)}))),y}))}renderEmptyPlaceholder(e,t,s,i){const n="empty-bubble-placeholder";let a,o;if(t.classList.add(n,n+"-"+e),"group"===e?a=(0,k.i18n)("GroupEmptyTitle1"):"saved"===e?a=(0,k.i18n)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?a=(0,k.i18n)("NoMessages"):"noScheduledMessages"===e?a=(0,k.i18n)("NoScheduledMessages"):"restricted"===e&&(a=document.createElement("span"),a.innerText=this.appPeersManager.getRestrictionReasonText(this.peerId)),a.classList.add("center",n+"-title"),i.push(a),"group"===e)i.push((0,k.i18n)("GroupEmptyTitle2")),o=[(0,k.i18n)("GroupDescription1"),(0,k.i18n)("GroupDescription2"),(0,k.i18n)("GroupDescription3"),(0,k.i18n)("GroupDescription4")];else if("saved"===e)o=[(0,k.i18n)("ChatYourSelfDescription1"),(0,k.i18n)("ChatYourSelfDescription2"),(0,k.i18n)("ChatYourSelfDescription3"),(0,k.i18n)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,k.i18n)("NoMessagesGreetingsDescription");e.classList.add("center",n+"-subtitle"),this.messagesQueue.findAndSplice((e=>e.bubble===t));const a=document.createElement("div");a.classList.add(n+"-sticker");const o=this.getMiddleware(),r=this.appStickersManager.getGreetingSticker().then((e=>{if(!o())return;const t=[];return Is({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:Bl,play:!0,loop:!0,withThumb:!0,loadPromises:t}),(0,l.fc)(a,(e=>{(0,d.d)(e),wa.onMediaClick({target:e.target})})),Promise.all(t)}));this.renderMessagesQueue(s,t,!1,[r]),i.push(e,a)}o&&(i.push(...o.map((e=>{const t=document.createElement("span");return t.classList.add(n+"-list-item"),t.append(e),t}))),"group"===e?o.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&o.forEach((e=>{const t=document.createElement("span");t.classList.add(n+"-list-bullet"),t.innerText="•",e.prepend(t)}))),i.length>1&&t.classList.add("has-description"),i.forEach((e=>e.classList.add(n+"-line")))}processLocalMessageRender(e){const t=!!e.pFlags.sponsored,s=this.safeRenderMessage(e,void 0,void 0,void 0,t);s.classList.add("is-group-last","is-group-first"),t||(s.classList.add("bubble-first"),s.classList.remove("can-have-tail","is-in"));const i=[],n=this.appPeersManager.isBot(this.peerId);if(this.chat.isRestricted)this.renderEmptyPlaceholder("restricted",s,e,i);else{if(t){let t,i,n,o;s.classList.add("avoid-selection");const r=this.sponsoredMessage=e.sponsoredMessage,d=this.appPeersManager.getPeerId(r.from_id);r.channel_post?(t="OpenChannelPost",i=this.appMessagesIdsManager.generateMessageId(r.channel_post)):r.start_param||this.appUsersManager.isBot(d.toUserId())?(t="Chat.Message.ViewBot",n=r.start_param):t=this.appPeersManager.isAnyGroup(d)?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new xa(r.chat_invite_hash,r.chat_invite).show()}:r.chat_invite_hash?()=>{const e={_:Ta.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{a.default.dispatchEvent("history_focus",{peerId:d,mid:i,startParam:n})};const c=(0,U.Z)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.viewsObserver.observe(c),o&&(0,l.fc)(c,o),void s.querySelector(".bubble-content").prepend(c)}if(n&&"message"===e._){const e=document.createElement("b");e.append((0,k.i18n)("BotInfoTitle")),i.push(e,"\n\n")}else this.appPeersManager.isAnyGroup(this.peerId)&&this.appPeersManager.getPeer(this.peerId).pFlags.creator?this.renderEmptyPlaceholder("group",s,e,i):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",s,e,i):a.default.myId===this.peerId?this.renderEmptyPlaceholder("saved",s,e,i):this.appPeersManager.isUser(this.peerId)&&!n&&this.chat.canSend()&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",s,e,i):this.renderEmptyPlaceholder("noMessages",s,e,i)}i.length&&s.querySelector(".message, .service-msg").prepend(...i);const o=t?"append":"prepend";this.messagesQueueOnRenderAdditional?this.onAnimateLadder=()=>{if(this.chatInner[o](s),this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,De.AD)()}:this.chatInner[o](s),this.emptyPlaceholderMid=e.mid}generateLocalMessageId(e=0){let t=("scheduled"===this.chat.type?-1:0)+e;const s=-Math.abs(t);return{id:s,mid:-Math.abs(this.appMessagesIdsManager.generateMessageId(s))}}generateLocalFirstMessage(e,t,s=0){const{id:i,mid:n}=this.generateLocalMessageId(s),a={_:e?"messageService":"message",date:0,id:i,mid:n,peer_id:this.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,gs.Z)(a),t&&t(a),this.appMessagesManager.saveMessages([a],{storage:new Map}),a.mid=n,a}setLoaded(e,t,s=!0){if(this.scrollable.loadedAll[e]!==t){if(this.scrollable.loadedAll[e]=t,"bottom"===e&&this.appPeersManager.isBroadcast(this.peerId)&&!this.chat.isRestricted){const{mid:e}=this.generateLocalMessageId(1);if(t){const t=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&!this.bubbles[e]&&this.getSponsoredMessagePromise===s)),s=this.getSponsoredMessagePromise=this.chat.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId())},{cacheSeconds:300}).then((e=>{if(!t())return;this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const s=e.messages.shift();if(!s)return;e.messages.push(s);const i=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([this.getHistoryTopPromise,this.messagesQueuePromise]).then((()=>{t()&&this.performHistoryResult([i],!1,!0)}))})).finally((()=>{this.getSponsoredMessagePromise=void 0}))}else this.deleteMessagesByIds([e]),this.getSponsoredMessagePromise=void 0}if("top"===e&&t&&this.appPeersManager.isBot(this.peerId)&&!this.chat.isRestricted){this.log("inject bot description");const e=this.getMiddleware();return Promise.resolve(this.appProfileManager.getProfile(this.peerId.toUserId())).then((t=>{var s;if(!e())return;if(!(null===(s=t.bot_info)||void 0===s?void 0:s.description))return void this.checkIfEmptyPlaceholderNeeded();const i=this.generateLocalFirstMessage(!1,(e=>{e.message=t.bot_info.description}));this.processLocalMessageRender(i)}))}this.checkIfEmptyPlaceholderNeeded()}}checkIfEmptyPlaceholderNeeded(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderMid&&(this.chat.isRestricted||!this.appMessagesManager.getHistoryStorage(this.peerId).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=this.generateLocalFirstMessage(!0);return this.processLocalMessageRender(e),!0}return!1}getHistory(e=0,t=!1,s=!1,i=0,n=!1){const o=this.peerId,r=this.appPeersManager.isBroadcast(o),l=Math.min(30,Ct.Z.height/48|0),d=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;let c=d;if(void 0!==Ra){if(!Ra)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--Ra}let h,p=0;if(s&&(p=c,t||(c=0)),i&&!s)if("pinned"===this.chat.type)h=[i];else{const t=this.appMessagesManager.getHistoryStorage(o,this.chat.threadId).history.slice;if(t.length=0&&this.chat.getMessage(h[e]).grouped_id;--e)h.splice(e,1);e=h[h.length-1]||e}}let u,g=this.requestHistory(e,c,p);const m=(null==h?void 0:h.length)&&g instanceof Promise,v=this.isFirstLoad&&p&&g instanceof Promise||m;m&&(u=g,g={history:h}),this.isFirstLoad=!1;const f=e=>_a(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(zn.D.Top)){if("discussion"===this.chat.type){const t=this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId+"_"+this.chat.threadId];t&&e.history.push(t),e.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse())}yield this.setLoaded("top",!0)}})),b=e=>(0,xs.e9)().then((()=>f(e))).then((()=>this.performHistoryResult(e.history||[],t,s,!m&&i))),y=e=>{const s=e.then((e=>(t?this.getHistoryTopPromise!==s:this.getHistoryBottomPromise!==s)?(this.log.warn("getHistory: peer changed"),Promise.reject()):n?(this.scrollable.onScroll(),!0):b(e)),(e=>{throw this.log.error("getHistory error:",e),e}));return s};let w,S;if(g instanceof Promise)S=!1,w=y(g);else{if(n)return null;S=!0,w=b(g)}const C=m?y(u):w;if(v&&a.default.settings.animationsEnabled){let s=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("ship went past rocks of magnets"),--s||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(i,h,m,p,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return t?this.getHistoryTopPromise=C:this.getHistoryBottomPromise=C,C.then((()=>{t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0})),n?null:(!v&&w.then((()=>{let e;t?(this.loadedTopTimes++,this.loadedBottomTimes=Math.max(0,--this.loadedBottomTimes)):(this.loadedBottomTimes++,this.loadedTopTimes=Math.max(0,--this.loadedTopTimes)),(t&&this.loadedTopTimes>2||!t&&this.loadedBottomTimes>2)&&(e=(0,Xs.Z)(this.bubbles));const s=2*d;e&&e.length>s&&(t?(e=e.slice(s),this.setLoaded("bottom",!1)):(e=e.slice(0,e.length-s),this.setLoaded("top",!1)),this.deleteMessagesByIds(e,!1))})),w.then((()=>{"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0)})),{cached:S,promise:w})}setUnreadDelimiter(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);let t=this.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){let s=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==s&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e.maxId&&s.classList.add("is-first-unread"),this.firstUnreadBubble=s,this.attachedUnreadBubble=!0}}deleteEmptyDateGroups(){const e=+!!this.stickyIntersector+1;let t=!1;for(const s in this.dateMessages){const i=this.dateMessages[s];i.container.childElementCount===e&&(i.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(i.container,i.div),delete this.dateMessages[s],t=!0)}t&&(this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Na(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class Oa{constructor(e,t,s,n){var r;let l,d,c,h=[],p=[];const u=o.Z.canPinMessage(e),g=(a,o,r)=>{setTimeout((()=>{let a;a=s&&!t?u?i.Z.unpinAllMessages(e):i.Z.hidePinnedMessages(e):i.Z.updatePinnedMessage(e,t,s,r,o),n&&a.then(n)}),300)};if(s){let s="UnpinMessage";t?(l="UnpinMessageAlertTitle",d="Chat.Confirm.Unpin"):u?(l="Popup.Unpin.AllTitle",d="Chat.UnpinAllMessagesConfirmation",c=[""+((null===(r=i.Z.pinnedMessages[e])||void 0===r?void 0:r.count)||1)]):(l="Popup.Unpin.HideTitle",d="Popup.Unpin.HideDescription",s="Popup.Unpin.Hide"),h.push({langKey:s,isDanger:!0,callback:g})}else{l="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(h.push({langKey:t,callback:e=>g(0,!1,!e.size)}),j.Z.isBroadcast(e.toChatId())?d="PinMessageAlertChannel":(d="PinMessageAlert",p.push({text:"PinNotify",checked:!0}))):(d="PinMessageAlertChat",e===a.default.myId?h.push({langKey:t,callback:g}):(h.push({langKey:t,callback:e=>g(0,!e.size)}),p.push({text:"PinAlsoFor",textArgs:[new St.Z({peerId:e}).element],checked:!0})))}(0,pt.x)(h),new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:d,descriptionLangArgs:c,buttons:h,checkboxes:p}).show()}}function Ha(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class za extends gt{constructor(e,t,s,n){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{o.isValid()&&(n&&n(),i.Z.reportMessages(e,t,s,o.value).then((e=>{e&<({langPackKey:"ReportSentInfo"})})))}}],body:!0});const a=document.createElement("div");Is({doc:ds.Z.getAnimatedEmojiSticker(za.STICKER_EMOJI),div:a,emoji:za.STICKER_EMOJI,width:100,height:100,loop:!1,play:!0}).finally((()=>{this.show()})),this.header.append(a);const o=new _.Z({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});o.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!o.isValid())})),this.body.append(o.container)}}za.STICKER_EMOJI="👮‍♀️";class Va extends gt{constructor(e,t,s){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const i=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"]];i.forEach((e=>{const t=(0,U.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=ds.Z.preloadAnimatedEmojiSticker(za.STICKER_EMOJI);(0,l.fc)(this.body,(a=>{const o=(0,Me.Z)(a.target,"btn-primary"),r=i[(0,_s.Z)(o)][1];n.then((()=>{this.hide(),new za(e,t,r,s)}))}),{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class ja extends gt{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,k.i18n)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(k.default.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}]});const e=new P.ZP(void 0);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},this.description.replaceWith(e.container),e.container.append(this.description),e.container.classList.add("scrolled-top"),this.show()}}var Ga=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ka extends pt.Z{constructor(e,t){super("popup-reacted-list",null,{closable:!0,overlayClosable:!0,body:!0}),this.appMessagesManager=e,this.message=t,this.init()}init(){return Ga(this,void 0,void 0,(function*(){const e=this.appMessagesManager.getGroupsFirstMessage(this.message),t=this.appMessagesManager.canViewMessageReadParticipants(e),s=new Bn,i=Object.assign(Object.assign({},e),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},e.reactions),{pFlags:{},recent_reactions:[]})});i.reactions.results=i.reactions.results.map((e=>Object.assign(Object.assign({},e),{pFlags:{}}))),s.init(i,"block"),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const n=document.createElement("div");n.classList.add("tabs-container"),n.dataset.animation="tabs";const a=new Map;let o=!1;if(i.reactions.results.length){const e=this.createFakeReaction("reactions",i.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),i.reactions.results.unshift(e.reactionCount),o=!0}let r=!1;if(t)try{const t=yield this.appMessagesManager.getMessageReadParticipants(e.peerId,e.mid);if(!t.length)throw"";const n=this.createFakeReaction("checks",t.length);s.prepend(n),i.reactions.results.unshift(n.reactionCount),r=!0}catch(e){}i.reactions.results.forEach((t=>{const s=new P.ZP(void 0);s.container.classList.add("tabs-tab");const i=new Mn({noShadow:!0,noDelimiter:!0}),o=pd.createChatList({dialogSize:72});pd.setListClickListener(o,(()=>{this.hide()}),void 0,!1,!0),i.content.append(o),s.container.append(i.container);const r="checks"!==t.reaction,l="checks"===t.reaction;let d;["checks","reactions"].includes(t.reaction)&&(t.reaction=void 0);const c=new bt({scrollable:s,getPromise:()=>Ga(this,void 0,void 0,(function*(){const s=yield this.appMessagesManager.getMessageReactionsListAndReadParticipants(e,void 0,t.reaction,d,r,l);return d=s.nextOffset,s.combined.forEach((({peerId:e,reaction:t})=>{const{dom:s}=pd.addDialogNew({dialog:e,autonomous:!0,container:o,avatarSize:54,rippleEnabled:!1,meAsSaved:!1,drawStatus:!1});if(t){const e=document.createElement("div");e.classList.add("reacted-list-reaction-icon"),Is({doc:_t.Z.getReactionCached(t).static_icon,div:e,width:24,height:24}),s.listEl.append(e)}(0,T.Z)(s.lastMessageSpan,E.Z.getUserStatusString(e.toUserId()))})),!d}))});a.set(s.container,c),n.append(s.container)})),this.body.append(n);const l=(0,Y.X)(s,n,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),a.get(t).load()}));l(0,!1),this.show()}))}createFakeReaction(e,t){const s=new Fn;s.init("block"),s.reactionCount={_:"reactionCount",count:t,reaction:e},s.setCanRenderAvatars(!1),s.renderCounter();const i=document.createElement("div");return i.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),s.prepend(i),s}}const Wa="btn-menu-reactions-reaction",qa=!ne.IS_SAFARI;class $a{constructor(e,t,s){this.appReactionsManager=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const s=(0,Me.Z)(e.target,Wa);if(!s)return;const i=this.reactionsMap.get(s);if(!i)return;if(!(null===(t=i.appear)||void 0===t?void 0:t.paused))return;const n=i.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const i=this.widthContainer=document.createElement("div");i.classList.add("btn-menu-reactions-container"),i.classList.add("btn-menu-reactions-container-"+t);const n=this.container=document.createElement("div");n.classList.add("btn-menu-reactions");const a=this.scrollable="vertical"===t?new P.ZP(void 0):new P.v7(void 0);n.append(a.container),a.onAdditionalScroll=this.onScroll,a.setListeners(),a.container.classList.add("no-scrollbar"),["big"].forEach((e=>{const t=document.createElement("div");t.classList.add("btn-menu-reactions-bubble","btn-menu-reactions-bubble-"+e),n.append(t)})),this.reactionsMap=new Map,this.animationGroup="CHAT-MENU-REACTIONS-"+Date.now(),I.Z.setOverrideIdleGroup(this.animationGroup,!0),ce.IS_TOUCH_SUPPORTED||n.addEventListener("mousemove",this.onMouseMove),(0,l.fc)(n,(e=>{const t=(0,Me.Z)(e.target,Wa);if(!t)return;const s=this.reactionsMap.get(t);s&&this.appReactionsManager.sendReaction(this.message,s.reaction)})),i.append(n),this.middleware=null!=s?s:(0,As.k)()}init(e){this.message=e;const t=this.middleware.get(),s=this.appReactionsManager.getAvailableReactionsByMessage(e);(0,Nt.Z)(s,(e=>{if(!t()||!e.length)return;e.forEach((e=>{this.renderReaction(e)}));const i=()=>{this.container.classList.add("is-visible")};s instanceof Promise?(0,De.T2)(i):i()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),I.Z.setOverrideIdleGroup(this.animationGroup,!1),I.Z.checkAnimations(!0,this.animationGroup,!0)}renderReaction(e){const t=document.createElement("div");t.classList.add(Wa);const s=document.createElement("div");s.classList.add(Wa+"-scale");const i=document.createElement("div");let n;i.classList.add(Wa+"-appear"),a.default.settings.animationsEnabled&&(n=document.createElement("div"),n.classList.add(Wa+"-select","hide"));const o={selectWrapper:n,appearWrapper:i,reaction:e.reaction};this.reactionsMap.set(t,o);const r=this.middleware.get(),l=28*(ce.IS_TOUCH_SUPPORTED?1:1.25),d={width:l,height:l,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:r};if(a.default.settings.animationsEnabled){let t=!0;Is(Object.assign({doc:e.appear_animation,div:i,play:!0},d)).then((e=>{(0,gs.Z)(e),o.appear=e,e.addEventListener("enterFrame",(a=>{e.maxFrame===a&&s.then((e=>{(0,gs.Z)(e),i.classList.add("hide"),n.classList.remove("hide"),t&&(o.select=e,t=!1)}),_e.Z)}))}),_e.Z);const s=Is(Object.assign({doc:e.select_animation,div:n},d)).then((e=>((0,gs.Z)(e),ae.Z.waitForFirstFrame(e)))).catch(_e.Z)}else delete d.needFadeIn,delete d.withThumb,Is(Object.assign({doc:e.static_icon,div:i},d));s.append(i),n&&s.append(n),t.append(s),this.scrollable.append(t)}onScrollProcessItem(e,t){const s=e.firstElementChild,i=Pa(e,this.scrollable.container);let n;if(i)if(i.overflow.left||i.overflow.right){const e=Math.abs(i.rect.left-i.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(36,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}qa&&(s.style.transform=n)}}class Qa{constructor(e,t,s,i,n,a,o,r){this.attachTo=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.appPollsManager=n,this.appDocsManager=a,this.appMessagesIdsManager=o,this.appReactionsManager=r,this.onContextMenu=e=>{let t,s;try{s=(0,Me.Z)(e.target,"bubble-content-wrapper"),t=s?s.parentElement:(0,Me.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let i=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),i&&i.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;if(!n)return;const a=this.isSponsored=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Ha(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention"),this.chat.selection.isSelecting&&!s){if(a)return;const e=this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));t&&(n=t)}}this.isOverBubble=!!s;const o=(0,Me.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=this.chat.getMessage(this.mid),this.noForwards=!a&&!this.appMessagesManager.canForward(this.message),this.viewerPeerId=void 0,this.canOpenReactedList=void 0;const r=this.init();i=r.element;const{cleanup:l,destroy:d,menuPadding:c}=r,h=t.classList.contains("is-in")?"left":"right";(0,J.oy)(e.touches?e.touches[0]:e,i,h,c),(0,J.YP)(i,(()=>{this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{d()}),300)}))},this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?(0,l.tH)(this.chat.selection.selectionSendNowBtn):new js(this.peerId,this.chat.getMidsByMid(this.mid))},this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>{Ha()?st((this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid]).reduce(((e,t)=>{const s=this.chat.getMessage(t);return e+((null==s?void 0:s.message)?s.message+"\n":"")}),"").trim()):document.execCommand("copy")},this.onCopyAnchorLinkClick=()=>{st(this.target.href)},this.onCopyLinkClick=()=>{let e;"discussion"===this.chat.type&&(e=this.appMessagesManager.getMessageByPeer(this.peerId,this.chat.threadId));const t=this.appPeersManager.getPeerUsername(e?e.fromId:this.peerId),s=this.appMessagesIdsManager.getServerMessageId(this.mid);let i,n="https://t.me/";t?(n+=t+"/"+(e?this.appMessagesIdsManager.getServerMessageId(e.fwd_from.channel_post):s),e&&(n+="?comment="+s),i="LinkCopied"):(n+="c/"+this.peerId.toChatId()+"/"+s,e&&(n+="?thread="+this.appMessagesIdsManager.getServerMessageId(e.mid)),i="LinkCopiedPrivateInfo"),rt(k.default.format(i,!0)),st(n)},this.onPinClick=()=>{new Oa(this.peerId,this.mid)},this.onUnpinClick=()=>{new Oa(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>{if(this.chat.selection.isSelecting)(0,l.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid);new Hs({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,Me.Z)(this.target,"grouped-item")||(0,Me.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?(0,l.tH)(this.chat.selection.selectionDeleteBtn):new zs(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)},this.listenerSetter=new B.Z,this.middleware=(0,As.k)(),ce.IS_TOUCH_SUPPORTED?(0,l.fc)(e,(e=>{if(t.selection.isSelecting)return;const s=e.target.className;s&&s.includes&&(t.log("touchend",e),["bubble","bubble-content-wrapper","bubble-content","message","time","inner"].find((e=>s.match(new RegExp(e+"($|\\s)"))))&&((0,d.d)(e),this.onContextMenu(e)))}),{listenerSetter:this.chat.bubbles.listenerSetter}):(0,J.Eo)(e,this.onContextMenu,this.chat.bubbles.listenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup()}filterButtons(e){return this.isSponsored?e.filter((e=>e.isSponsored)):e.filter((e=>{let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||ce.IS_TOUCH_SUPPORTED,t=e.verify()),t}))}setButtons(){this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,gs.Z)(this.message),this.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>this.chat.canSend()&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>this.appMessagesManager.canEditMessage(this.message,"text")&&!!this.chat.input.messageInput},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>{if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const s of t)if(this.appMessagesManager.getMessageByPeer(e,s).message)return!0;return!1},notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{st(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{st(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>this.appPeersManager.isChannel(this.peerId)&&!this.message.pFlags.is_outgoing},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)&&"scheduled"!==this.chat.type},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{this.appDocsManager.saveDocFile(this.message.media.document)},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let s=!!ce.IS_TOUCH_SUPPORTED;const i=!t.type||!["gif","video","sticker"].includes(t.type);return i&&(s=s||!!(0,Me.Z)(this.target,"document")||!!(0,Me.Z)(this.target,"audio")),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return this.appMessagesManager.canEditMessage(this.message,"poll")&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.pFlags.out||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new Va(this.peerId,[this.mid])},verify:()=>!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&this.appPeersManager.isChannel(this.peerId),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new Ka(this.appMessagesManager,this.message)}},verify:()=>{var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||this.appMessagesManager.canViewMessageReadParticipants(this.message))},notDirect:()=>!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>this.appMessagesManager.canDeleteMessage(this.message)},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new ja},verify:()=>!1,isSponsored:!0}]}init(){this.cleanup(),this.setButtons();const e=this.filterButtons(this.buttons),t=this.element=Ce(e,this.listenerSetter);t.id="bubble-contextmenu",t.classList.add("contextmenu");const s=e.find((e=>!e.icon));if(s){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,i=!!(null==t?void 0:t.length),n=this.appMessagesManager.canViewMessageReadParticipants(this.message)?this.appPeersManager.getPeer(this.peerId).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;s.element.classList.add("tgico-"+(i?"reactions":"checks"));const o=new k.default.IntlElement({key:i?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:i?void 0===n?[a]:[n,n]:void 0,element:s.textElement});let r;r=i?void 0===n?(0,k.i18n)("Chat.Context.ReactedFast",[a]):(0,k.i18n)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,k.i18n)("Loading"),r.classList.add("btn-menu-item-text-fake"),s.element.append(r);const l=3,d=.875;o.element.style.visibility="hidden",o.element.style.paddingRight=i?d*Math.min(l,t.length)+"rem":"1rem";const c=this.middleware.get();this.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!c())return;r&&r.remove();const a=e.combined,h=void 0===n?e.reactionsCount:i?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new St.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!i||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(i){const e=h===a.length||void 0===n;p=(0,k.i18n)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[h]:[h,a.length])}else a.length?p=(0,k.i18n)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=d*Math.min(l,h)+"rem",p.classList.add("btn-menu-item-text-fake"),s.element.append(p)),a.length){const e=new Dn({avatarSize:24});e.render(t?t.map((e=>this.appPeersManager.getPeerId(e.peer_id))):a.map((e=>e.peerId))),s.element.append(e.container),this.canOpenReactedList=!0}}))}let i,n;if("message"===this.message._&&!this.chat.selection.isSelecting&&!this.message.pFlags.is_outgoing&&!this.message.pFlags.is_scheduled){const e=ne.IS_APPLE||ce.IS_TOUCH_SUPPORTED?"horizontal":"vertical";n=this.reactionsMenu=new $a(this.appReactionsManager,e,this.middleware),n.init(this.appMessagesManager.getGroupsFirstMessage(this.message)),t.prepend(n.widthContainer);const s=50;i="vertical"===e?{top:24,left:s}:{top:s,right:36,left:24}}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove()},menuPadding:i}}}var Ya=s(4329),Xa=s.n(Ya),Ja=s(9043);class eo{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=Ce(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),(0,J.Eo)(e.onContextElement,(t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,d.d)(t),(0,J.YP)(this.sendMenu))}),e.listenerSetter)}setPeerId(e){this.type=e===a.default.myId?"reminder":"schedule"}}var to=s(3735),so=s(1293);class io extends pt.Z{constructor(e){if(super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,s=(0,ft.Z)(t,"LABEL"),i=(0,so.Z)(t);i||(t.parentElement.classList.add("is-filled"),s.classList.remove("hidden-widget"),s.firstElementChild.removeAttribute("disabled")),!s.nextElementSibling&&!i&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,s=(0,ft.Z)(t,"LABEL"),i=(0,_s.Z)(s);this.correctAnswers&&this.correctAnswers[0][0]===i&&(this.correctAnswers=void 0),s.remove(),this.optionInputFields.splice(i,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),k.default.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},(0,k._i18n)(this.title,"NewPoll"),this.questionInputField=new _.Z({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()})),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new eo({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const t=document.createElement("hr"),s=document.createElement("div");s.classList.add("caption"),(0,k._i18n)(s,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const n=document.createElement("div");n.classList.add("caption"),(0,k._i18n)(n,"Settings"),this.chat.appPeersManager.isBroadcast(this.chat.peerId)||(this.anonymousCheckboxField=new ut.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new ut.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new ut.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),(0,k._i18n)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),d=document.createElement("div");d.classList.add("poll-create-questions"),this.quizSolutionField=new _.Z({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const c=document.createElement("div");c.classList.add("subtitle"),(0,k._i18n)(c,"AddAnExplanationInfo"),d.append(this.quizSolutionField.container,c),a.push(r,o,d),a.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(t,this.body),this.body.append(s,this.questions,document.createElement("hr"),n,i,...a),(0,l.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new P.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const s=e.querySelector(".input-field-input");return s instanceof HTMLInputElement?s.value:(0,to.Z)(s,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const s=this.getFilledAnswers();if(s.length<2)return!1;if(s.find((e=>e.length>100)))return!1;const{value:i}=(0,to.Z)(this.quizSolutionField.input,!1);return!(i.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){const t=this.questionInputField.value,s=this.getFilledAnswers(),{value:i,entities:n}=(0,to.Z)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:s.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=this.chat.appPollsManager.getInputMediaPoll(o,this.correctAnswers,i,n);this.chat.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,s=new _.Z({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(s.input)("input",this.onInput);const i=new at({text:"",name:"question"});i.main.append(s.container),(0,l.fc)(s.input,d.d,{listenerSetter:this.listenerSetter}),i.label.classList.add("hidden-widget"),i.input.disabled=!0,this.quizCheckboxField.input.checked||i.label.classList.remove("radio-field"),this.listenerSetter.add(i.input)("change",(()=>{if(i.input.checked){const e=(0,_s.Z)(i.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),s.container.append(n),(0,l.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(i.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(s)}}var no=s(2398);function ao(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let s=0;for(let e=0,i=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),(0,no.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,s=this.shouldCompress(e.type),i={};i.file=e;const n=document.createElement("div");n.classList.add("popup-item"),i.itemDiv=n;const a=s?this.attachMedia(e,i,n):this.attachDocument(e,i,n);return t.sendFileDetails.push(i),a},this.willAttach={type:s,sendFileDetails:[],group:!1},(0,l.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new eo({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new P.ZP(null);i.container.append(this.mediaContainer),this.inputField=new _.Z({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:a.default.config.caption_length_max}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",(()=>{this.files=[],oo=void 0})),oo=this}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new ut.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>g.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new ut.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.inputField.value;if(t.length>a.default.config.caption_length_max)return void rt(k.default.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const s=this.willAttach;s.isMedia="media"===s.type||void 0;const{sendFileDetails:i,isMedia:n}=s,{peerId:o,input:r}=this.chat;i.forEach((e=>{e.itemDiv=void 0}));const{length:l}=i,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==l&&(this.chat.appMessagesManager.sendText(o,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const i=Object.assign(Object.assign({},s),{sendFileDetails:e});this.chat.appMessagesManager.sendAlbum(o,i.sendFileDetails.map((e=>e.file)),Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),i)),t=void 0})),r.replyToMsgId=this.chat.threadId,r.onMessageSent()}attachMedia(e,t,s){let i;if(s.classList.add("popup-item-media"),e.type.startsWith("video/")){const n=document.createElement("video"),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.setAttribute("playsinline","true"),n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),i=(0,he.xD)(n).then((()=>{t.width=n.videoWidth,t.height=n.videoHeight,t.duration=Math.floor(n.duration);const e=n.webkitAudioDecodedByteCount;return void 0!==e&&(t.noSound=!e),s.append(n),(0,he.il)(n).then((e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)}))})),n.append(a)}else{const n=new Image;i=new Promise((i=>{n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,s.append(n),"image/gif"===e.type?(t.noSound=!0,Promise.all([ao(n).then((e=>{t.duration=Math.ceil(e)})),(0,he.zr)(n).then((e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)}))]).then((()=>{i()}))):i()}})),n.src=t.objectURL=URL.createObjectURL(e)}return i}attachDocument(e,t,s){s.classList.add("popup-item-document");const i=e.type.startsWith("image/"),n=e.type.startsWith("audio/");(i||n)&&(t.objectURL=URL.createObjectURL(e));const a={_:"document",file:e,file_name:e.name||"",fileName:e.name?Q.Z.wrapEmojiText(e.name):"",size:e.size,type:i?"photo":"doc"},o=le.Z.getCacheContext(a);o.url=t.objectURL,o.downloaded=e.size;const r=ws({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}}});return new Promise((e=>{const n=()=>{s.append(r),e()};if(i){const e=new Image;e.src=t.objectURL,e.onload=()=>{t.width=e.naturalWidth,t.height=e.naturalHeight,n()},e.onerror=n}else n()}))}shouldCompress(e){return"media"===this.willAttach.type&&g.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:s}=this;let i;const n=[];if("document"===e.type)i="PreviewSender.SendFile",n.push(s.length);else{let e=0,t=0,a=0;s.forEach((s=>{s.type.startsWith("image/")?++e:s.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(i="PreviewSender.SendFile",n.push(s.length)):e?(i="PreviewSender.SendPhoto",n.push(e)):t&&(i="PreviewSender.SendVideo",n.push(t))}(0,T.Z)(t,(0,k.i18n)(i,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const s=(0,ra.Z)(t.width,t.height,380,320);e.style.width=s.width+"px",e.style.height=s.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const s=t.length;for(let i=0;i{s.innerHTML="",e.length&&(this.setTitle(),this.iterate((e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Ts({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),s.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e.itemDiv,e)}))})))})).then((()=>{this.onRender()}))}}const co="keydown",ho="active",po=["ArrowUp","ArrowDown"],uo=["ArrowLeft","ArrowRight"];class go extends R.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:s,resetTarget:i}=function({list:e,type:t,onSelect:s,once:i,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?po.concat(uo):"x"===t?uo:po);let r;const c=()=>r||e.querySelector(".active")||e.firstElementChild,h=(e,s)=>{if(r===e)return;let i=!1;r&&(i=!0,r.classList.remove(ho)),r=e,r&&(r.classList.add(ho),i&&m&&s&&(0,yt.Z)({container:m,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},p=(t,s)=>{let i;return i=s?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,i};let u;u="xy"===t?(t,s)=>"ArrowUp"===s||"ArrowDown"===s?((t,s)=>{const i=s?"nextElementSibling":"previousElementSibling",n=s?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[i]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[i]||e[n]}return o})(t,"ArrowDown"===s):p(t,"ArrowRight"===s):(e,t)=>p(e,"ArrowRight"===t||"ArrowDown"===t);let g=s=>{const i=s.key;if(o.has(i)){if((0,d.d)(s),e.childElementCount>1){let e=c();e=u(e,i),h(e,!0)}}else("Enter"===i||"xy"!==t&&"Tab"===i)&&((0,d.d)(s),b(c()))};const m=(0,Me.Z)(e,"scrollable");e.classList.add("navigable-list");const v=t=>{const s=(0,Ws.Z)(t.target,e);s&&h(s,!1)},f=t=>{(0,d.d)(t);const s=(0,Ws.Z)(t.target,e);s&&(h(s,!1),b(c()))},b=e=>{const t=s(e);(void 0!==t?!t:i)&&S()};let y=!1;const w=()=>{y||(y=!0,document.addEventListener(co,g,{capture:!0,passive:!1}),e.addEventListener("mousemove",v,{passive:!0}),(0,l.fc)(e,f))},S=()=>{y&&(y=!1,document.removeEventListener(co,g,{capture:!0}),e.removeEventListener("mousemove",v),(0,l.EN)(e,f))},C=()=>{a||h(e.firstElementChild,!1)};if(a){const e=g;g=t=>{a.has(t.key)&&((0,d.d)(t),document.removeEventListener(co,g,{capture:!0}),g=e,document.addEventListener(co,g,{capture:!0,passive:!1}),a=void 0,C())}}else C();return w(),{attach:w,detach:S,resetTarget:C}}({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=s,this.resetTarget=i,ne.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},F.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",s(),this.navigationItem&&(F.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,w.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,s){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(F.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const i=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,Jt.Z)(this.container,"is-visible",!e,a.default.settings.animationsEnabled&&!s?300:0,(()=>{this.hidden&&this.dispatchEvent("hidden")}),i)}}class mo extends go{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!wa.onMediaClick({target:e},!0),waitForKey:["ArrowUp","ArrowDown"]}),this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),a.default.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(v.ZP.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),a.default.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),ds.Z.preloadAnimatedEmojiSticker(e),ds.Z.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();let i;this.lazyLoadQueue.clear(),i=e.length?new Promise((t=>{const i=[];e.forEach((e=>{s.append(this.superStickerRenderer.renderSticker(e,void 0,i))})),Promise.all(i).finally(t)})):Promise.resolve(),i.then((()=>{this.list.replaceWith(s),this.list=s,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*v.ZP.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},v.ZP.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0}))}))}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new P.ZP(this.container),this.lazyLoadQueue=new X.ZP,this.superStickerRenderer=new ha(this.lazyLoadQueue,Bl)}}const vo=()=>{const e=new Date;return e.setHours(0,0,0,0),e},fo=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class bo extends _n{constructor(e,t,s){var i;if(super((i=e).getTime()>fo().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:vo(),maxDate:fo(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),s){const e=(0,U.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,l.fc)(e,(()=>{t(La),this.hide()}))}}}var yo=s(6299),wo=s(9041);function So(e,t=!0){const s=[],i=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),s=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&s==t.endOffset){const i=s-1,n=e.childNodes;if(t.startContainer===e&&n[i]){a=n[i],o=0;for(let e=0;e{s.onEmojiSelected(aa(e),!0)}}),this.appEmojiManager=i,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new P.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{na(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const s=this.controller.getMiddleware();this.appEmojiManager.getBothEmojiKeywords().then((()=>{if(!s())return;const i=e.replace(/^:/,""),n=this.appEmojiManager.searchEmojis(i);this.render(n,":"!==t)}))}}class Lo extends go{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Lo.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Lo.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new P.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=Lo.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=Lo.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const s=document.createElement("div");s.classList.add(t,e.className),s.dataset.peerId=""+e.peerId;const i=new Yl;i.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),i.setAttribute("dialog","0"),i.setAttribute("peer",""+e.peerId);const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?n.innerHTML=Q.Z.wrapEmojiText(e.name):n.append(new St.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),s.append(i,n),e.description){const i=document.createElement("div");i.classList.add(t+"-description",e.className+"-description"),i.innerHTML=Q.Z.wrapEmojiText(e.description),s.append(i)}return s}}function Io(e,t){const s=[].concat(e.bot_info);let i;void 0!==t&&(i=new $n.Z({ignoreCase:!0}));const n=new Map;let a;if(s.forEach((e=>{e.commands.forEach(((t,s)=>{const a="/"+t.command;n.set(t.command,{peerId:e.user_id.toPeerId(!1),command:t.command,name:a,description:t.description,index:s}),i&&i.indexObject(t.command,a)}))})),i){const e=i.search(t);a=Array.from(e).map((e=>n.get(e)))}else a=[...n.values()];return a=a.sort(((e,t)=>n.get(e.command).index-n.get(t.command).index)),a}Lo.BASE_CLASS="autocomplete-peer-helper",Lo.BASE_CLASS_LIST_ELEMENT=Lo.BASE_CLASS+"-list-element";class Mo extends Lo{constructor(e,t,s,i,n){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${Lo.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return s.getReadyToSend((()=>{s.messageInput.innerHTML=t,s.sendMessage(!0)}))})),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t){if(!this.appUsersManager.isBot(t))return!1;const s=this.controller.getMiddleware();return Promise.resolve(this.appProfileManager.getProfileByPeerId(t)).then((t=>{if(!s())return;const i=Io(t,e);this.render(i)})),!0}}class Eo{constructor(){this.helpers=new Set,this.middleware=(0,As.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}class Po extends Lo{constructor(e,t,s,i,n){super(e,t,"mentions-helper",(e=>{const t=n.getUser(e.dataset.peerId.toUserId());let i,a="";t.username?a="@"+t.username:(a=t.first_name||t.last_name,i={_:"messageEntityMentionName",length:a.length,offset:0,user_id:t.id}),a+=" ",s.insertAtCaret(a,i)})),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t,s){const i=e.trim();if(e.length!==i.length)return!1;const n=this.controller.getMiddleware();return this.appProfileManager.getMentions(t&&t.toChatId(),i,s).then((e=>{if(!n())return;const t=i.slice(1).toLowerCase();this.render(e.map((e=>{const s=this.appUsersManager.getUser(e);if(!s.username||s.username.toLowerCase()!==t)return{peerId:e,description:s.username?"@"+s.username:void 0}})).filter(Boolean))})),!0}}var To=s(5494);class ko extends ba{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Ws.Z)(t,this.element)||t===this.btnHover||((0,d.d)(e),this.toggle(!1))},(0,w.Z)(this,e),this.element.classList.add(ko.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(a.default)("history_reply_markup",(({peerId:e})=>{this.peerId===e&&(this.checkAvailability()&&this.isActive()&&this.render(),(0,xs.e9)().then((()=>{this.checkForceReply()})))}))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>{this.render(),ce.IS_TOUCH_SUPPORTED&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})),this.listenerSetter.add(this.element)("click",(e=>{const t=(0,Me.Z)(e.target,"btn");if(!t)return;const s=t.dataset.type,{peerId:i}=this;"keyboardButtonRequestPhone"===s?on({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.appMessagesManager.sendContact(i,a.default.myId)})):this.appMessagesManager.sendText(i,t.dataset.text),this.toggle(!1)})),super.init()}checkForceReply(){const e=this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}getReplyMarkup(){var e;return null!==(e=this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}render(e=this.getReplyMarkup()){this.element.innerHTML="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(ko.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add(ko.BASE_CLASS+"-button","btn"),t.innerHTML=Q.Z.wrapEmojiText(s.text),t.dataset.text=s.text,t.dataset.type=s._,e.append(t)}this.element.append(e)}}checkAvailability(e=this.getReplyMarkup()){var t;const s="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",s),s&&this.toggle(!1),!s}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}ko.BASE_CLASS="reply-keyboard";var xo=s(8678);const Ao="INLINE-HELPER";class _o extends go{constructor(e,t,s,i,n){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:s,queryId:i}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=this.appInlineBotsManager.generateQId(i,e.dataset.resultId);this.appInlineBotsManager.sendInlineResult(t.toPeerId(),s,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=s,this.appUsersManager=i,this.appInlineBotsManager=n,this._checkQuery=(e,t,s)=>{return i=this,n=void 0,o=function*(){const i=this.controller.getMiddleware(),n=yield this.appUsersManager.resolveUsername(t);if(!i())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.appInlineBotsManager.getInlineResults(e,n.id,s).then((t=>{if(!i())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();s.dataset.peerId=""+e,s.dataset.botId=""+n.id,s.dataset.queryId=""+t.query_id;const a=new da(null,Ao,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const o=[],r=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=r?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),s.append(t),r)t.classList.add("grid-item");else{n.classList.add("empty"),n.innerHTML=Q.Z.wrapEmojiText([...e.title.trim()][0]);const i=document.createElement("div");i.classList.add("inline-helper-result-title"),i.innerHTML=Q.Z.wrapEmojiText(e.title);const a=document.createElement("div");a.classList.add("inline-helper-result-description"),a.innerHTML=Q.Z.wrapRichText(e.description,{noCommands:!0,noLinks:!0}),t.append(i,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),s.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let s;n?(s=document.createElement("div"),n.append(s)):s=t,s.classList.add("media-container"),r&&s.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>le.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,xo.Z)(e).then((e=>{Cs(s,t,e,!0)}))}))})}}else{const s=e.document||e.photo;if(["sticker","gif"].includes(null==s?void 0:s.type)&&r)(0,gs.Z)(s),"gif"===s.type?a.add(s,t):"sticker"===s.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(s,t,o),2===s.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(s){const e=r?48:void 0;r&&t.classList.add("no-border-radius"),Ss({photo:s,container:r?t:n,boxWidth:e,boxHeight:e,middleware:i,lazyLoadQueue:this.lazyLoadQueue,loadPromises:o})}}}return Promise.all(o).then((()=>{if(!i())return void a.clear();s.classList.toggle("is-gallery",r),s.classList.toggle("super-stickers",r),this.container.classList.toggle("is-gallery",r);const o=this.list.parentElement;if(o.textContent="",t.switch_pm){const s=(0,U.Z)("btn-primary btn-secondary btn-primary-transparent primary");s.insertAdjacentHTML("beforeend",Q.Z.wrapEmojiText(t.switch_pm.text)),(0,l.fc)(s,(s=>{this.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),o.append(s)}o.append(this.list=s),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*v.ZP.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},v.ZP.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}));var i,n,a,o},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=dt(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(v.ZP.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new P.ZP(this.container),this.lazyLoadQueue=new X.ZP,this.superStickerRenderer=new ha(this.lazyLoadQueue,Ao)}}var Zo=s(8090);class Do extends Lo{constructor(e,t,s){super(e,void 0,"bot-commands",(e=>{const s=e.querySelector(`.${Lo.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=s,t.sendMessage(!0),this.toggle(!0)}))})),this.chatInput=t,this.appProfileManager=s}setUserId(e,t){var s;if(this.userId!==e||!(null===(s=this.list)||void 0===s?void 0:s.childElementCount))return this.userId=e,(0,Nt.Z)(this.appProfileManager.getProfile(e),(e=>{if(!t())return;const s=Io(e),i=50*s.length+8+24;this.container.style.setProperty("--height",i+"px"),this.render(s)}));this.toggle(!1)}}const Fo="Posting media content isn't allowed in this group.";class Ro{constructor(e,t,s,i,n,o,r,c,h,p,u,g,m,v,f){this.chat=e,this.appMessagesManager=t,this.appMessagesIdsManager=s,this.appDocsManager=i,this.appChatsManager=n,this.appPeersManager=o,this.appWebPagesManager=r,this.appImManager=c,this.appDraftsManager=h,this.serverTimeManager=p,this.appNotificationsManager=u,this.appEmojiManager=g,this.appUsersManager=m,this.appInlineBotsManager=v,this.appProfileManager=f,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,d.d)(e),this.recordCanceled=!0,this.recorder.stop(),Ja.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=ce.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=ce.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>{const{peerId:s}=this.chat,i=this.chat.bubbles.getMiddleware(),n=a.default.myId!==s&&s.isUser()&&this.appUsersManager.isUserOnlineVisible(s);new bo(t,(t=>{i()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{i()&&this.appImManager.openScheduled(s)}),0))}),n).show()},this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,s)=>{(0,d.d)(e);let i=this.messageInput.innerHTML;if(i&&i!==s){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const s=this.messageInput.innerHTML;if(i===s){if(++e>2)break}else e=0;i=s}while(i!==s);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const s=e.code,i=t[s];if(document.getSelection().toString().trim().length&&i&&("KeyK"===s?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(i),(0,d.d)(e)),"KeyZ"===s){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:s,entities:i,caretPos:n}=So(this.messageInputField.input),a=Q.Z.parseMarkdown(s,i,!0),o=Q.Z.mergeEntities(i,Q.Z.parseEntities(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=s.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=ct.Z.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.appWebPagesManager.saveWebPage(e),params:{url:t}}).then((s=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===s._?(this.setTopInfo("webpage",(()=>{}),s.site_name||s.title||"Webpage",s.description||s.url||""),delete this.noWebPage,this.willSendWebPage=s):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(s.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"})),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide();this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(s,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,Q.Z.getEmojiEntityFromEmoji(e),t)},this.onBtnSendClick=e=>{if((0,d.d)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!this.chat.canSend("send_media"))return void rt(Fo);this.chatInput.classList.add("is-locked"),(0,Gs.Z)(),this.recorder.start().then((()=>{this.releaseMediaPlayback=ve.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),Ja.Z.setKeepAlive(!0);const e=()=>{new gt("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,l.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,Me.Z)(t.target,"chat-input")||(0,Me.Z)(t.target,"popup-cancel-record")||((0,d.d)(t),e())}),{capture:!0,passive:!1}),F.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,s=t.context.createAnalyser();t.connect(s),s.fftSize=32;const i=new Uint8Array(s.frequencyBinCount),n=255*i.length;let a=()=>{if(!this.recording)return;s.getByteFrequencyData(i);let e=0;i.forEach((t=>{e+=t}));let t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;let o=Date.now()-this.recordStartTime,r=o%1e3,l=(""+o/1e3).toHHMMSS()+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,(0,De.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":rt("Please allow access to your microphone");break;case"NotReadableError":rt(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),rt(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}},this.onHelperCancel=(e,t)=>{if(e&&(0,d.d)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=Q.Z.parseMarkdown(this.messageInputField.value,[]);if(e.message!==t)return void new gt("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if((0,d.d)(e),(0,Me.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&ce.IS_TOUCH_SUPPORTED&&!e.container.classList.contains("active")&&(0,J.YP)(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new B.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input"),this.chatInput.style.display="none",this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Na();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const s=this.fakeSelectionWrapper=document.createElement("div");s.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,s),this.chatInput.append(this.inputContainer),this.goDownBtn=W({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,l.fc)(this.goDownBtn,(e=>{(0,d.d)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const i=this.controlContainer=document.createElement("div");i.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(i)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=N(""),this.replyElements.cancelBtn=N("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(i=!0,this.canToggleHideAuthor()),t=()=>{i=!1},s=this.forwardElements={};let i=!1;const n=[s.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new ut.Z({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new ut.Z({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new ut.Z({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new ut.Z({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Ce(n,this.listenerSetter),r=Array.from(o.children);[{elements:r.slice(0,2),onChange:(e,t)=>{const n=!!+e;i&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=k.default.weakMap.get(e),i=s.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=i,t.update()}}},{elements:r.slice(2,4),onChange:e=>{const t=!!+e;let i;i=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?s.hideSender:s.showSender:t?s.showSender:s.hideSender,i.checkboxField.checked=!0}}].forEach((e=>{const t=Je(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),s=document.createElement("hr");t.append(s),o.append(t)})),o.append(s.changePeer.element),ce.IS_TOUCH_SUPPORTED||(this.forwardHover=new ba({element:o})),s.modifyArgs=n.slice(0,-1),this.replyElements.container.append(o),s.modifyArgs.forEach(((e,t)=>{const{input:s}=e.checkboxField;s.type="radio",s.name=t<2?"author":"caption",s.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.sendAsContainer=document.createElement("div"),this.sendAsContainer.classList.add("new-message-send-as-container"),this.sendAsCloseBtn=document.createElement("div"),this.sendAsCloseBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const c=[{text:"SendMessageAsTitle",onClick:void 0}];let h;const p=e=>{e&&(h=this.sendAsAvatar);const t=this.sendAsAvatar!==h,s=!e&&t?2:0;(0,Jt.Z)(this.sendAsCloseBtn,"is-visible",e,300,void 0,s),t||(0,Jt.Z)(h,"is-visible",!e,300,void 0,s)};if(Ie({noRipple:!0,listenerSetter:this.listenerSetter,container:this.sendAsContainer},"top-right",c,(()=>{p(!0)}),(()=>{p(!1)})),c[0].element.classList.add("btn-menu-item-header"),this.sendAsBtnMenu=this.sendAsContainer.firstElementChild,this.sendAsBtnMenu.classList.add("scrollable","scrollable-y"),this.sendAsContainer.append(this.sendAsCloseBtn),this.btnToggleEmoticons=N("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type){this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=W({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,l.fc)(this.goMentionBtn,(e=>{(0,d.d)(e),this.appMessagesManager.goToNextMention(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.btnScheduled=N("scheduled btn-scheduled float hide",{noRipple:!0}),(0,l.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(a.default)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=N("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ko({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,appMessagesManager:this.appMessagesManager,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new Do(this.rowsWrapper,this,this.appProfileManager),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const e=document.createElement("div");e.classList.add("new-message-bot-commands-icon-scale");const t=this.botCommandsIcon=document.createElement("div");t.classList.add("animated-menu-icon","animated-menu-close-icon"),e.append(t),this.botCommandsToggle.append(e),(0,l.fc)(this.botCommandsToggle,(e=>{(0,d.d)(e),t.classList.contains("state-back")?(this.botCommands.toggle(!0),t.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),t.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{t.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{t.classList.remove("state-back")}))}this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...g].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{new io(this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=Ie({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.sendAsContainer,this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new Eo,this.stickersHelper=new mo(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new Co(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Mo(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new Po(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new _o(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.appUsersManager,this.appInlineBotsManager),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=N("delete btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=N("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new eo({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),Ca.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Ca)("open",this.onEmoticonsOpen),this.listenerSetter.add(Ca)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(a.default)("settings_updated",(()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()})),this.listenerSetter.add(a.default)("draft_updated",(({peerId:e,threadId:t,draft:s,force:i})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(s,!0,i)})),this.listenerSetter.add(a.default)("peer_changing",(e=>{this.chat===e&&this.saveDraft()})),this.listenerSetter.add(a.default)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.sendAsContainer&&this.listenerSetter.add(a.default)("peer_full_update",(e=>{e.isChannel()&&this.chat.peerId===e&&this.updateSendAs()})),"scheduled"===this.chat.type?this.listenerSetter.add(a.default)("scheduled_delete",(({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})):(this.listenerSetter.add(a.default)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(a.default)("dialogs_multiupdate",(e=>{e[this.chat.peerId]&&(this.startParam===Re.gZ?this.setStartParam():this.center(!0))})));try{this.recorder=new(Xa())({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",(e=>{let t=e.target.files;t.length&&(new lo(this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,l.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,l.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(F.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:s}=this.chat,i=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});Ja.Z.decode(e,!0).then((e=>{Ja.Z.setKeepAlive(!1),this.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:i,threadId:s,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,l.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,l.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=dt((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,U.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,k.i18n)("BotStart")),(0,l.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,mt.Z)([this.botStartBtn],!0),s=this.chat.peerId,i=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===s&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.appMessagesManager.startBot(s.toUserId(),void 0,e).then((()=>{i()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn)}constructPinnedHelpers(){this.pinnedControlBtn=(0,U.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new Oa(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))})),this.chatInput.classList.add("type-pinned")}center(e=!1){const t=this.getNeededFakeContainer();if(!t&&!this.inputContainer.classList.contains("is-centering"))return;if(t===this.fakeWrapperTo)return;const s=t||this.fakeWrapperTo,i=!!t,n=this.fakeWrapperTo;let a,o="",r="";const l=s.getBoundingClientRect(),d=this.fakeRowsWrapper.getBoundingClientRect(),c=d.width,h=l.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=l.left-d.left-t,i&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=t;const p=e?200:0;return(0,Jt.Z)(this.inputContainer,"is-centering",i,p),(0,Jt.Z)(this.rowsWrapperWrapper,"is-centering-to-control",!!(i&&t&&t.classList.contains("chat-input-control")),p),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(t&&t.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==this.startParam||!this.chat.canSend()||"pinned"===this.chat.type||this.chat.isStartButtonNeeded()?this.controlContainer:void 0}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){if(!this.goDownUnreadBadge)return;const e=this.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=(0,to.Z)(this.messageInputField.input);let s;(e.length||this.replyToMsgId)&&(s={_:"draftMessage",date:(0,ie.bz)(!0)+this.serverTimeManager.serverTimeOffset,message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,s)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.style.display="none",this.goDownBtn.classList.add("hide")),Ks(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,s=!1){return!(!s&&!(0,so.Z)(this.messageInput)||"scheduled"===this.chat.type||(e||(e=this.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId))?this.messageInputField.value===e.rMessage&&this.replyToMsgId===e.reply_to_msg_id||(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(e.rMessage,t,t),0):(s&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,De.T2)((()=>{this.onMessageSent()}))}))),1)))}finishPeerChange(e){const t=this.chat.peerId,{forwardElements:s,btnScheduled:i,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,sendAsContainer:l,botCommandsToggle:d}=this;r.style.display="";const c=this.appPeersManager.isBroadcast(t);if(o.classList.toggle("is-broadcast",c),o.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",this.appPeersManager.canPinMessage(t)),s&&(this.forwardWasDroppingAuthor=!1,s.showCaption.checkboxField.setValueSilently(!0),s.showSender.checkboxField.setValueSilently(!0)),i){i.classList.add("hide");const e=this.chat.bubbles.getMiddleware();this.appMessagesManager.getScheduledMessages(t).then((t=>{e()&&i.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),this.appPeersManager.isBot(t))){const e=t.toUserId(),s=this.chat.bubbles.getMiddleware(),i=this.appProfileManager.getProfile(e);(0,Nt.Z)(i,(e=>{s()&&this.updateBotCommands(e,!(i instanceof Promise))}))}l&&(this.sendAsAvatar&&(this.sendAsAvatar.remove(),this.sendAsAvatar=void 0),l.remove(),this.sendAsPeerId=void 0,this.updatingSendAsPromise=void 0,this.updateSendAs(!0)),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput():this.pinnedControlBtn&&this.pinnedControlBtn.append((0,k.i18n)(this.appPeersManager.canPinMessage(this.chat.peerId)?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this.center(!1)}updateOffset(e,t,s,i){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,Jt.Z)(this.newMessageWrapper,"has-offset",t,s?0:300,void 0,i)}updateBotCommands(e,t){this.hasBotCommands=e.bot_info&&e.bot_info.commands.length,this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:s}=this,i=s&&this.isInputEmpty();s||t.remove();const n=i,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}updateSendAsButtons(e){const t=e.map(((e,t)=>{const s=document.createElement("div"),i=document.createElement("div");return i.classList.add("btn-menu-item-subtitle"),e.isUser()?i.append((0,k.i18n)("Chat.SendAs.PersonalAccount")):e===this.chat.peerId?i.append((0,k.i18n)("VoiceChat.DiscussionGroup")):i.append(this.appProfileManager.getChatMembersString(e.toChatId())),s.append(new St.Z({peerId:e}).element,i),{onClick:t?()=>{const t=this.chat.peerId;if(t.isChannel()){const s=this.appProfileManager.getCachedFullChat(t.toChatId());if(s){s.default_send_as=this.appPeersManager.getOutputPeer(e),this.sendAsPeerId=e,this.updateSendAsAvatar(e),this.updateMessageInputPlaceholder();const t=this.chat.bubbles.getMiddleware(),i=()=>{if(this.sendAsPeerId!==e||!t())return;const s=this.sendAsPeerIds.slice();(0,z.Z)(s,e),s.unshift(e),this.updateSendAsButtons(s)};a.default.settings.animationsEnabled?setTimeout(i,250):i()}}ct.Z.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(t),send_as:this.appPeersManager.getInputPeerById(e)})}:void 0,textElement:s}})),s=Ce(t);t.forEach(((t,s)=>{const i=e[s],n=new Yl;n.classList.add("avatar-32","btn-menu-item-icon"),n.setAttribute("peer",""+i),s||n.classList.add("active"),t.element.prepend(n)})),Array.from(this.sendAsBtnMenu.children).slice(1).forEach((e=>e.remove())),this.sendAsBtnMenu.append(...Array.from(s.children))}updateSendAsAvatar(e,t){const s=this.sendAsAvatar;if(s&&+s.getAttribute("peer")===e)return;s||(t=!0);let i=t?0:2;const n=t?0:300,a=this.sendAsAvatar=new Yl;a.setAttribute("dialog","0"),a.setAttribute("peer",""+e),a.classList.add("new-message-send-as-avatar","avatar-30"),(0,Jt.Z)(a,"is-visible",!0,n,void 0,i),s&&(0,Jt.Z)(s,"is-visible",!1,n,(()=>{s.remove()}),i),this.sendAsContainer.append(a)}getDefaultSendAs(){return(0,Nt.Z)(this.appProfileManager.getChannelFull(this.chat.peerId.toChatId()),(e=>e.default_send_as?this.appPeersManager.getPeerId(e.default_send_as):void 0))}updateSendAs(e){const t=this.chat.peerId;if(!t.isChannel()||this.updatingSendAsPromise)return;const s=this.chat.bubbles.getMiddleware((()=>!this.updatingSendAsPromise||this.updatingSendAsPromise===r)),{sendAsContainer:i}=this,n=t.toChatId(),a=this.getDefaultSendAs();a instanceof Promise&&(e=void 0);const o=(0,Nt.Z)(a,(t=>{if(!s()||void 0===t)return;this.sendAsPeerId=t,this.updateSendAsAvatar(t,e),this.updateMessageInputPlaceholder(),this.appChatsManager.getSendAs(n).then((e=>{if(!s())return;const i=e.map((e=>this.appPeersManager.getPeerId(e)));this.sendAsPeerIds=i.slice(),(0,z.Z)(i,t),i.unshift(t),this.updateSendAsButtons(i)}));let a=0;i.parentElement||(this.newMessageWrapper.prepend(i),a=2),this.updateOffset("as",!0,e,a),this.updatingSendAsPromise=void 0})),r=this.updatingSendAsPromise=Promise.resolve(o);return r}updateMessageInputPlaceholder(){const e=k.default.weakMap.get(this.messageInput);if(e){const{peerId:t,threadId:s}=this.chat;let i;i=s?"Comment":this.appPeersManager.isBroadcast(t)?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==a.default.myId||this.appMessagesManager.isAnonymousSending(t)?"SendAnonymously":"Message",e.compareAndUpdate({key:i})}}updateMessageInput(){const{chatInput:e,attachMenu:t,messageInput:s}=this,{peerId:i,threadId:n}=this.chat,a=this.chat.canSend();e.classList.contains("is-hidden")!==!a&&(e.classList.add("no-transition"),e.classList.toggle("is-hidden",!a),e.offsetLeft,e.classList.remove("no-transition")),this.updateMessageInputPlaceholder();const o=this.attachMenuButtons.filter((e=>{const t=e.verify(i,n);return e.element.classList.toggle("hide",!t),t}));a?(s.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),s.innerHTML||this.messageInputField.onFakeInput()):s.removeAttribute("contenteditable"),t.toggleAttribute("disabled",!o.length),t.classList.toggle("btn-disabled",!o.length),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new _.Z({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),Zo.T&&(0,Zo.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,yo.Z)(e))(0,d.d)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,no.Z)(this.messageInput)})),ce.IS_TOUCH_SUPPORTED&&(0,l.fc)(this.messageInput,(e=>{this.appImManager.selectTab(1),Ca.toggle(!1)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",(()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const s={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"monospace"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!s[e])return!1;const i=s[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e||"spoiler"===e){let t=!1;const s=window.getSelection();if(!s.isCollapsed){const i=s.getRangeAt(0),n=wo.o[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(document.execCommand("fontName",!1,"Roboto")):a.push("function"==typeof i?i():document.execCommand(i,!1,null))}else a.push("function"==typeof i?i():document.execCommand(i,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=So(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),d=s?r.match(Ro.AUTO_COMPLETE_REG_EXP):null,c=d?d.index+(d[0].length-d[2].length):r.length,h=r.slice(0,c)+e+l,p=Q.Z.parseEntities(i);Q.Z.mergeEntities(a,p);const u=t?Math.max(t.length,e.length):e.length,g=[];t&&(g.push(t),t.offset=c);const m=d?u-d[2].length:u;a.forEach((e=>{e.offset>=c&&(e.offset+=m)})),Q.Z.mergeEntities(a,g);{const e={_:"messageEntityCaret",offset:c+u,length:0};let t=0;for(let s=a.length;te.offset);++t);a.splice(t,0,e)}const v=Q.Z.wrapDraftText(h,{entities:a});this.messageInputField.setValueSilently(v,!0);const f=this.messageInput.querySelector(".composer-sel");f&&(function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const s=document.createTextNode("");e.parentNode.insertBefore(s,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=s}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const s=window.getSelection();s.removeAllRanges(),s.addRange(t)}}(f),f.remove()),this.onMessageInput()}checkAutocomplete(e,t,s){if(void 0===e){const i=So(this.messageInputField.input,!0);e=i.value,t=i.caretPos,s=i.entities}if(-1===t&&(t=e.length),void 0===s){const t=Q.Z.parseMarkdown(e,s,!0);s=Q.Z.mergeEntities(s,Q.Z.parseEntities(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const i=e.match(Ro.AUTO_COMPLETE_REG_EXP);let n;if(i){const t=s[0];let o=i[2];const r=o[0];if(this.stickersHelper&&a.default.settings.stickers.suggest&&this.chat.canSend("send_stickers")&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?this.appMessagesIdsManager.getServerMessageId(this.chat.threadId):void 0;this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?Re.NM:this.chat.peerId,e)&&(n=this.mentionsHelper)}else i[1]||"/"!==r?a.default.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(n=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):this.commandsHelper.checkQuery(o,this.chat.peerId)&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}checkInlineAutocomplete(e,t){let s=!1;if(!t){const i=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(i){const n=i[1],a=e.slice(i[0].length);s=i[0].length===e.length,t=this.inlineHelper,this.btnPreloader?(0,Jt.Z)(this.btnPreloader,"show",!0,400):(this.btnPreloader=N("none btn-preloader float show disable-hover",{noRipple:!0}),(0,J.y7)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then((({user:e,renderPromise:t})=>{s&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{(0,Jt.Z)(this.btnPreloader,"show",!1,400)}))})).catch(_e.Z)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&(0,Jt.Z)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&((0,Jt.Z)(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=this.helperFunc;this.clearHelper(),this.updateSendBtn();let t=!1;new Hs((0,pe.Z)(this.forwarding),(()=>{t=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,t||e()}))}clearInput(e=!0,t=!0,s=""){if(document.activeElement===this.messageInput&&ne.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,To.Z)(e),this.messageInputField.setValueSilently(s),(0,To.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(s);ce.IS_TOUCH_SUPPORTED||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let i=!1;e&&(i=this.setDraft(void 0,!1)),!i&&t&&this.onMessageInput()}isInputEmpty(){return(0,so.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const s=this.messageInputField.value;Q.Z.parseEntities(s).filter((e=>"messageEntityEmoji"===e._)).forEach((e=>{const t=(0,te.zu)(e.unicode);this.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:s}=this;if("scheduled"===s.type&&!e&&!t)return void this.scheduleSending();const{peerId:i}=s,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,to.Z)(this.messageInputField.input);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new zs(i,[t],s.type);this.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.appMessagesManager.sendText(i,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,pe.Z)(this.forwarding);setTimeout((()=>{for(const t in e)this.appMessagesManager.forwardMessages(i,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()}));o||this.onMessageSent()}),0)}}sendMessageWithDocument(e,t=!1,s=!1){var i;const n="sticker"===(e=this.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!this.chat.canSend(n)?(rt(Fo),!1):"scheduled"!==this.chat.type||t?!!e&&(this.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:s||void 0})),this.onMessageSent(s,!0),"sticker"===e.type&&(null===(i=Ca.stickersTab)||void 0===i||i.pushRecentSticker(e)),!0):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,s))),!1)}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,ft.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=Q.Z.wrapDraftText(t.message,{entities:t.totalEntities});const i=()=>{const n=this.appMessagesManager.wrapMessageForReply(t,void 0,[t.mid]);this.setTopInfo("edit",i,(0,k.i18n)("AccDescrEditing"),n,s,t),this.editMsgId=e,this.editMessage=t,s=void 0};i()}initMessagesForward(e){const t=()=>{const s=Object.keys(e).map((e=>e.toPeerId())),i=new Set;let n=0,o=0;s.forEach((t=>{const s=e[t];s.forEach((e=>{var s;const n=this.appMessagesManager.getMessageByPeer(t,e);!(null===(s=n.fwd_from)||void 0===s?void 0:s.from_name)||n.fromId||n.fwdFromId?i.add("P"+n.fromId):i.add("N"+n.fwd_from.from_name),n.media&&n.message&&++o})),n+=s.length}));const r=i.size>2,l=[...i].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===a.default.myId?(0,k.i18n)("Chat.Accessory.Forward.You"):new St.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:d}=this;(0,ft.Z)(d.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const c=d.hideCaption.checkboxField.checked;o&&c?d.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?d.hideSender:d.showSender).checkboxField.setValueSilently(!0);const h=d.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,k.i18n)(h,[n]),u=document.createDocumentFragment();let g,m;if(l.length<3?u.append(...(0,k.join)(l,!1)):u.append(l[0],(0,k.i18n)("AndOther",[l.length-1])),1===s.length){const t=s[0],i=e[t];if(g=this.appMessagesManager.getMessageByPeer(t,i[0]),m=!!g.grouped_id,m){const e=this.appMessagesManager.getMidsByMessage(g);(e.length!==n||e.find((e=>!i.includes(e))))&&(m=!1)}}const v=document.createDocumentFragment();if(m||1===n){const t=e[s[0]],i=this.appMessagesManager.wrapMessageForReply(g,void 0,t);v.append(u,": ",i)}else v.append((0,k.i18n)("Chat.Accessory.Forward.From"),": ",u);let f=this.setTopInfo("forward",t,p,v);d.modifyArgs.forEach(((e,t)=>{const i=e.textElement,n=k.default.weakMap.get(i);n.args=[t<2?s.length:o],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(f,this.listenerSetter),this.forwarding=e};t()}initMessageReply(e){if(this.replyToMsgId===e)return;let t=this.chat.getMessage(e);const s=()=>{let i;"messageEmpty"===t._?(i=(0,k.i18n)("Loading"),this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then((i=>{this.replyToMsgId===e&&(t=i,"messageEmpty"===t._?this.clearHelper("reply"):s())}))):i=new St.Z({peerId:t.fromId,dialog:!1}).element,this.setTopInfo("reply",s,i,t&&t.message,void 0,t),this.replyToMsgId=e};s()}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(F.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,Jt.Z)(this.chat.container,e,!0,150,(()=>{this.chat.container.classList.remove(e)}))}setInputValue(e,t=!0,s=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,De.T2)((()=>{s&&(0,no.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,s="",i="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=N(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const d=Ps(s,i,a);return l?r.replaceWith(d):o.insertBefore(d,o.lastElementChild),"webpage"===e&&(d.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),ne.IS_MOBILE||F.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),d}}Ro.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;const Bo="pinned-container";class Uo{constructor(e){this.floating=!1,(0,w.Z)(this,e);const{divAndCaption:t,className:s}=this;t.container.classList.add(Bo,"hide"),t.title.classList.add(Bo+"-title"),t.subtitle.classList.add(Bo+"-subtitle"),t.content.classList.add(Bo+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(Bo+"-close",`pinned-${s}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(Bo+"-wrapper"),(0,ee.ripple)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(Bo+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,l.fc)(e,(e=>{(0,d.d)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const s=(this.floating||v.ZP.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",s),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",s),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}fill(e,t,s){this.divAndCaption.container.dataset.peerId=""+s.peerId,this.divAndCaption.container.dataset.mid=""+s.mid,this.divAndCaption.fill(e,t,s),this.topbar.setUtilsWidth()}}class No extends Uo{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new Ve("pinned-audio",((e,t)=>{(0,T.Z)(this.divAndCaption.title,e),(0,T.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{ve.stop()},floating:!0}),this.topbar=e,this.chat=t,this.appMessagesManager=s,this.onPlaybackRateChange=e=>{this.fasterEl.classList.toggle("active",e>1)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:s})=>{let i,n;"voice"===e.type||"round"===e.type?(i=new St.Z({peerId:t.fromId}).element,n=(0,ie.OD)(t.date),this.fasterEl.classList.remove("hide")):(i=e.audioTitle||e.fileName,n=e.audioPerformer||(0,k.i18n)("AudioUnknownArtist"),this.fasterEl.classList.add("hide")),this.progressLine.setMedia(s),this.fill(i,n,t),this.toggleEl.classList.toggle("flip-icon",!s.paused),this.toggle(!1)},this.divAndCaption.border.remove();const i=N("fast_rewind active",{noRipple:!0}),n=N("fast_forward active",{noRipple:!0}),o=(e,t)=>{(0,l.fc)(e,(e=>{(0,d.d)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};o(i,(()=>{ve.previous()})),o(n,(()=>{ve.next()})),this.toggleEl=N("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),o(this.toggleEl,(()=>{ve.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,i,this.toggleEl,n),this.volumeSelector=new ke(this.listenerSetter,!0);const r=document.createElement("div");r.classList.add("progress-line-container"),r.append(this.volumeSelector.container);const c=document.createElement("div");c.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(c),this.volumeSelector.btn.append(r);const h=this.fasterEl=N("playback_2x",{noRipple:!0});o(h,(()=>{ve.playbackRate=h.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,h);const p=document.createElement("div");p.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Te(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),p.append(this.progressLine.container),this.wrapper.insertBefore(p,this.wrapperUtils),this.topbar.listenerSetter.add(a.default)("media_play",this.onMediaPlay),this.topbar.listenerSetter.add(a.default)("media_pause",this.onPause),this.topbar.listenerSetter.add(a.default)("media_stop",this.onStop),this.topbar.listenerSetter.add(a.default)("media_playback_params",(({playbackRate:e})=>{this.onPlaybackRateChange(e)}));const u=ve.getPlayingDetails();u&&(this.onMediaPlay(u),this.onPlaybackRateChange(ve.playbackRate))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}var Oo;!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(Oo||(Oo={}));const Ho="pinned-message-border";class zo{constructor(){this.drawRect=(e,t,s,i,n)=>`M${e},${t+n}a${n},${n},0,0,1,${s},0v${i-2*n}a${n},${n},0,0,1,${-s},0Z`,this.getClipPath=(e,t,s)=>{let i="";if(2===s)i=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let s;return e<=1?s=Oo.ONE:2===e?s=Oo.TWO:3===e?s=Oo.THREE:4===e?s=Oo.FOUR:e>3&&(s=Oo.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=Oo.ONE:2===e?s=Oo.TWO:3===e?s=Oo.THREE:4===e?s=Oo.FOUR:e>3&&(s=Oo.MORE),s},this.getMarkTranslateY=(e,t,s)=>1===s?0:2===s?e?t+1:0:3===s?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,s,i)=>t<=4||e<=1?0:e>=t-2?i-Oo.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?Oo.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(Ho),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=Ho+"-wrapper-1",this.border.classList.remove(Ho+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const s=this.getBarHeight(e,t),i=this.getMarkHeight(e,t),n=this.getTrackHeight(e,s),a=`clipPath_${e}`,o=this.getClipPath(a,s,e),r=this.getMarkTranslateY(t,s,e),l=this.getTrackTranslateY(t,e,s,n);return this.border.classList.toggle(Ho+"-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className=Ho+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add(Ho+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${i}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Vo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class jo{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=jo.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const s=document.createElement("div"),i=!Object.keys(this.rows).length&&!t;return s.className=jo.BASE_CLASS+"-row"+(i?"":" is-hiding hide"),this.rows[e]={element:s,new:!0},this.container.append(s),s}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),jo.DURATION)}setNewRow(e,t=!1){const s=this.rows[e];s.new&&(t?(s.element.classList.remove("hide"),s.element.offsetLeft):s.element.classList.remove("is-hiding","hide"),delete s.new),this.clearRows(e)}animate(e,t,s=e>t,i=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!i)return this.setNewRow(e);const o=["from-top","from-bottom"];s||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}jo.DURATION=200,jo.BASE_CLASS="animated-super";class Go{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Go.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Go.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=Go.BASE_CLASS+"-decimal-placeholder";const i=new jo;return i.container.className=Go.BASE_CLASS+"-decimal-wrapper",t.append(s,i.container),this.container.append(t),this.decimals[e]={container:t,placeholder:s,animatedSuper:i}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),jo.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(Go.EMPTY_INDEX,!0),t.animatedSuper.animate(Go.EMPTY_INDEX,s,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((s,i)=>{var n;const a=this.getDecimal(i),o=a.animatedSuper.getRow(s,!0),r=null!==(n=t[i])&&void 0!==n?n:Go.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Go.EMPTY_INDEX=-1,Go.BASE_CLASS="animated-counter";class Ko{constructor(e,t,s,i){this.topbar=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.isStatic=!1,this.debug=!1,this.listenerSetter=new B.Z;const n=new Ke("pinned-message");this.pinnedMessageContainer=new Uo({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>Vo(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new Oa(this.topbar.peerId,this.pinnedMid,!0):new Oa(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new zo,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new jo,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new jo,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new Go(!0),n.title.append((0,k.i18n)("PinnedMessage")," ",this.animatedCounter.container);const o=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(o),n.container.prepend(o),this.btnOpen=N("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,l.fc)(this.btnOpen,(e=>{(0,d.d)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("peer_pinned_messages",(({peerId:e})=>{e===this.topbar.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(a.default)("peer_pinned_hidden",(({peerId:e})=>{e===this.topbar.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=dt((()=>this._setPinnedMessage()),100,!0,!0),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const s=t.dataset.mid;t&&void 0!==s&&this.testMid(+s,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let s=this.mids.findIndex((t=>t<=e));if(-1===s||this.isNeededMore(s)){if(!(this.loadedTop&&es))return;this.pinnedIndex=s,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>Ko.LOAD_COUNT&&(!this.loadedBottom&&e<=Ko.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=Ko.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Vo(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{let s=!1;const i=[this.appMessagesManager.getSearch({peerId:this.topbar.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:Ko.LOAD_COUNT,backLimit:Ko.LOAD_COUNT}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));i.push(e)}const n=(yield Promise.all(i))[0];let a=n.history.findIndex((t=>t.mid<=e));-1===a&&(a=n.history.length),this.offsetIndex=n.offset_id_offset?n.offset_id_offset-a:0,this.mids=n.history.map((e=>e.mid)).slice(),this.count=n.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,this.debug&&this.chat.log("[PM]: getCurrentIndex result:",e,n,a,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.chat.log.error("[PM]: getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new B.Z,function(e,t,s,i){if(ce.IS_TOUCH_SUPPORTED){let t;const n={passive:!0};i.add(e)("touchstart",(s=>{s.touches.length>1?o():(t=s.touches[0].clientY,i.add(e)("touchmove",a,n),i.add(e)("touchend",o,n))}),n);const a=e=>{const i=e.touches[0].clientY,n=i{i.removeManual(e,"touchmove",a,n),i.removeManual(e,"touchend",o,n)}}else i.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||s()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Vo(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,xs.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.chat.log.error("[PM]: handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Vo(this,void 0,void 0,(function*(){const t=this.chat.getMessage(e);t&&!t.deleted&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Vo(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,s=this.chat.getMessage(this.pinnedMid),i=0===t;this.animatedCounter.container.classList.toggle("is-last",i),i||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.chat.log("[PM]: setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=Ge({title:void 0,titleEl:null,subtitle:s.message,subtitleEl:a,message:s,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+s.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}Ko.LOAD_COUNT=50,Ko.LOAD_OFFSET=5;const Wo=Ma;var qo=s(7298);class $o extends gt{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{i.Z.mutePeer(e,-1===s?Re.rU:(0,qo.Z)(!0)+s)}}],body:!0});const t=[{time:3600,langKey:"ChatList.Mute.1Hour"},{time:14400,langKey:"ChatList.Mute.4Hours"},{time:28800,langKey:"ChatList.Mute.8Hours"},{time:86400,langKey:"ChatList.Mute.1Day"},{time:259200,langKey:"ChatList.Mute.3Days"},{time:-1,langKey:"ChatList.Mute.Forever"}].map((e=>new et({radioField:new at({langKey:e.langKey,name:"mute-time",value:""+e.time})})));let s;const n=tt(t,(e=>{s=+e}));t[t.length-1].radioField.checked=!0;const a=new Mn({noShadow:!0,noDelimiter:!0});a.content.append(n),this.body.append(a.container),this.show()}}class Qo{constructor(e,t,s,i,n,a,o,r,l){this.chat=e,this.appSidebarRight=t,this.appMessagesManager=s,this.appPeersManager=i,this.appChatsManager=n,this.appNotificationsManager=a,this.appProfileManager=o,this.appUsersManager=r,this.appGroupCallsManager=l,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,d.d)(e);const s=e=>{e.forEach((e=>{e.element.classList.toggle("hide",!e.verify())}))};t&&(s(this.menuButtons),this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith((0,k.i18n)(this.appPeersManager.getDeleteButtonText(this.peerId)))),s(this.buttonsToVerify)},this.verifyVideoChatButton=e=>{var t;if(!Wo||this.peerId.isUser())return!1;const s=this.appGroupCallsManager.groupCall,i=this.peerId.toChatId();return(null==s?void 0:s.chatId)!==i&&((!e||!(this.peerId.isBroadcast()&&"group"===e||this.peerId.isAnyGroup()&&"broadcast"===e))&&((null===(t=this.appChatsManager.getChatTyped(i).pFlags)||void 0===t?void 0:t.call_active)||this.appChatsManager.hasRights(i,"manage_call")))},this.verifyCallButton=e=>{if(!Ea||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),s=this.appProfileManager.getCachedFullUser(t);return!!s&&!!("voice"===e?s.pFlags.phone_calls_available:s.pFlags.video_calls_available)},this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new $o(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",v.ZP.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===v._G.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),ne.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{ne.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const s=t.divAndCaption.container.classList.contains("is-floating");return this.container.classList.toggle(`is-pinned-${t.className}-floating`,s),e+ +s}),0);this.container.dataset.floating=""+e},this.setPeerStatus=(e=!1)=>{if(!this.subtitle)return;const t=this.peerId;this.chat.appImManager.setPeerStatus(this.peerId,this.subtitle,e,!1,(()=>t===this.peerId))},this.listenerSetter=new B.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar"),this.container.dataset.floating="0",this.btnBack=N("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const s=document.createElement("div");s.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),s.append(this.title);const i=document.createElement("div");i.classList.add("bottom"),this.subtitle&&i.append(this.subtitle),t.append(s,i),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new No(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=Ie({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(v.ZP)("changeScreen",this.onChangeScreen),(0,l.fc)(this.container,(e=>{const t=(0,Me.Z)(e.target,"pinned-container");if((0,Gs.Z)(),t){if((0,d.d)(e),(0,Me.Z)(e.target,"progress-line"))return;const s=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(s);else{const e=t.dataset.peerId.toPeerId(),i=ve.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:s,type:i.isScheduled?"scheduled":i.threadId?"discussion":void 0,threadId:i.threadId})}}else v.ZP.activeScreen===v._G.medium&&document.body.classList.contains(Ln)?n():(0,ft.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains($t)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const n=e=>{if(e&&(0,d.d)(e),v.ZP.activeScreen===v._G.medium&&document.body.classList.contains(Ln))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);F.Z.back(e?"im":"chat")}};(0,l.fc)(this.btnBack,n,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>v.ZP.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&!this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.appMessagesManager.togglePeerMute(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>{const e=this.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),M.default.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{M.default.pushToState("chatContextMenuHintWasShown",!0),rt((0,k.i18n)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}}))},verify:()=>!this.chat.selection.isSelecting&&!!Object.keys(this.chat.bubbles.bubbles).length},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(Rt)){const e=new Rt(this.appSidebarRight);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>this.peerId.isUser()&&!this.appPeersManager.isContact(this.peerId)},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Et({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((s,i)=>{new gt("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new St.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{s(),this.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{i()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>a.default.myId!==this.peerId&&this.peerId.isUser()&&this.appPeersManager.isContact(this.peerId)&&!!this.appUsersManager.getUser(this.peerId.toUserId()).phone},{icon:"lock",text:"BlockUser",onClick:()=>{new gt("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new St.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&<({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>{var e;if(!this.peerId.isUser())return!1;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==a.default.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"lockoff",text:"Unblock",onClick:()=>{this.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&<({langPackKey:"UserUnblocked"})}))},verify:()=>{var e;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"delete danger",text:"Delete",onClick:()=>{new At(this.peerId)},verify:()=>"chat"===this.chat.type&&!!this.appMessagesManager.getDialogOnly(this.peerId)}],this.btnSearch=N("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,s){(0,l.fc)(e,(e=>{(0,d.d)(e),!s&&(0,Gs.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructPeerHelpers(){return this.avatarElement=new Yl,this.avatarElement.setAttribute("dialog","1"),this.avatarElement.classList.add("avatar-42","person-avatar"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new Ko(this,this.chat,this.appMessagesManager,this.appPeersManager),this.btnJoin=(0,U.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=N("phone"),this.btnGroupCall=N("videochat"),this.btnPinned=N("pinlist"),this.btnMute=N("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,(()=>{this.openPinned(!0)})),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>{const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let s;s=this.appChatsManager.isChannel(t)?this.appChatsManager.joinChannel(t):this.appChatsManager.addChatUser(t,a.default.myId),s.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})),this.listenerSetter.add(a.default)("chat_update",(e=>{var t;if(this.peerId===e.toPeerId(!0)){const s=this.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==s?void 0:s.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})),this.listenerSetter.add(a.default)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(a.default)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(a.default)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(a.default)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.pinnedMessage&&this.chat.addEventListener("setPeer",((e,t)=>{const s=this.chat.bubbles.getMiddleware();M.default.getState().then((i=>{s()&&(this.pinnedMessage.hidden=!!i.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",(({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()}))}constructDiscussionHelpers(){this.pinnedMessage=new Ko(this,this.chat,this.appMessagesManager,this.appPeersManager)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),this.chatAudio&&this.chatAudio.destroy(),delete this.chatAudio,delete this.pinnedMessage}setPeer(e){this.wasPeerId=this.peerId,this.peerId=e,this.container.style.display=e?"":"none"}finishPeerChange(e,t,s){var i,n;const a=this.peerId;this.avatarElement&&(this.avatarElement.setAttribute("peer",""+a),this.avatarElement.update());const o=this.appPeersManager.isBroadcast(a);if(this.btnMute&&this.btnMute.classList.toggle("hide",!o),this.btnJoin)if(this.appPeersManager.isAnyChat(a)){const e=a.toChatId();(0,T.Z)(this.btnJoin,(0,k.i18n)(this.appChatsManager.isBroadcast(e)?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(n=null===(i=this.appChatsManager.getChat(e))||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.left))}else this.btnJoin.classList.add("hide");this.setUtilsWidth(),this.verifyButtons();const r=this.chat.bubbles.getMiddleware();if(this.pinnedMessage)if("chat"===this.chat.type){if(void 0!==this.wasPeerId){const e=new Ko(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}M.default.getState().then((t=>{r()&&(this.pinnedMessage.hidden=!!t.hiddenPinnedMessages[a],e||this.pinnedMessage.setCorrectIndex(0))}))}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());(0,De.T2)((()=>{this.setTitle(),this.setPeerStatus(!0),this.setMutedState()}))}setTitle(e){var t;let s;if("pinned"===this.chat.type?(s=void 0===e?(0,k.i18n)("Loading"):(0,k.i18n)("PinnedMessagesCount",[e]),void 0===e&&this.appMessagesManager.getSearchCounters(this.peerId,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}))):"scheduled"===this.chat.type?(s=this.peerId===a.default.myId?(0,k.i18n)("Reminders"):(0,k.i18n)("ScheduledMessages"),void 0===e&&this.appMessagesManager.getScheduledMessages(this.peerId).then((e=>{this.setTitle(e.length)}))):"discussion"===this.chat.type?(s=void 0===e?(0,k.i18n)("Loading"):(0,k.i18n)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.appMessagesManager.getHistory(this.peerId,0,1,0,this.chat.threadId),Promise.resolve()]).then((()=>{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).count;null===e?setTimeout((()=>{this.setTitle()}),30):this.setTitle(e)}))):"chat"===this.chat.type&&(s=new St.Z({peerId:this.peerId,dialog:!0}).element),(0,T.Z)(this.title,s),"chat"===this.chat.type){const e=this.appPeersManager.getPeer(this.peerId);(null===(t=null==e?void 0:e.pFlags)||void 0===t?void 0:t.verified)&&this.title.append(Ot())}}setMutedState(){if(!this.btnMute)return;const e=this.peerId;let t=this.appNotificationsManager.isPeerLocalMuted(e,!1);this.appPeersManager.isBroadcast(e)?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}}class Yo extends O{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=N("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new A(e,this.inputSearch,{messages:new x("Chat.Search.PrivateSearch","messages")})}open(e,t,s,i){const n=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,i):(this.query=i,this.peerId=e,this.threadId=t,this.onDatePick=s,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,l.fc)(this.btnPickDate,(()=>{new _n(new Date,this.onDatePick).show()})),i&&this.appSearch.searchInput.inputField.setValueSilently(i),Yt.toggleSidebar(!0)),n}}class Xo{constructor(e,t,s){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,d.d)(e),new _n(new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,ft.Z)(e.target,"LI");t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.bubblesContainer.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,d.d)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,d.d)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,ee.ripple)(this.backBtn);const i=this.listenerSetter=new B.Z,n=(e,t)=>{(0,l.fc)(e,t,{listenerSetter:i})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new x(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new A(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,T.Z)(this.foundCountEl,this.inputSearch.value?(0,k.i18n)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.bubblesContainer.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,ee.ripple)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),s&&this.setQuery(s),ne.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},F.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.chat.search=void 0,F.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),s=+e.dataset.mid||void 0,i=(0,_s.Z)(e);i===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),i?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active");const n=this.chat.setPeer(t,s);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=i,(0,T.Z)(this.foundCountEl,(0,k.i18n)("Of",[i+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}class Jo{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,ue.Z)(t.options,e)));return t||(t=new Jo,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.createCanvasPattern(e).then((()=>this.fillCanvas(e)))}createCanvasPattern(e){return this.createCanvasPatternPromise?this.createCanvasPatternPromise:this.createCanvasPatternPromise=new Promise((t=>{const s=document.createElement("img");s.crossOrigin="anonymous",(0,rs.cj)(s,this.options.url,!1).then((()=>{let i;if(ne.IS_SAFARI){const e=i=document.createElement("canvas");e.width=s.naturalWidth,e.height=s.naturalHeight,e.getContext("2d").drawImage(s,0,0,e.width,e.height)}else i=s;this.pattern=e.getContext("2d").createPattern(i,"repeat-x"),t()}))}))}exportCanvasPatternToImage(e){return this.exportCanvasPatternToImagePromise?this.exportCanvasPatternToImagePromise:this.exportCanvasPatternToImagePromise=new Promise((t=>{e.toBlob((e=>{const s=this.objectUrl=URL.createObjectURL(e);t(s)}),"image/png")}))}cleanup(e){this.canvases.delete(e),this.canvases.size||((0,z.Z)(Jo.INSTANCES,this),this.objectUrl&&URL.revokeObjectURL(this.objectUrl))}fillCanvas(e){const t=e.getContext("2d");t.fillStyle=this.pattern,t.fillRect(0,0,e.width,e.height)}setCanvasDimensions(e){e.width=this.options.width*window.devicePixelRatio,e.height=this.options.height*window.devicePixelRatio*1.5}createCanvas(){const e=document.createElement("canvas");return this.canvases.add(e),this.setCanvasDimensions(e),e}}Jo.INSTANCES=[];class er extends R.Z{constructor(e,t,s,i,n,a,o,r,l,d,c,h,p,u,g,m,v,f,b,y,w){super(),this.appImManager=e,this.appChatsManager=t,this.appDocsManager=s,this.appInlineBotsManager=i,this.appMessagesManager=n,this.appPeersManager=a,this.appPhotosManager=o,this.appProfileManager=r,this.appStickersManager=l,this.appUsersManager=d,this.appWebPagesManager=c,this.appPollsManager=h,this.apiManager=p,this.appDraftsManager=u,this.serverTimeManager=g,this.storage=m,this.appNotificationsManager=v,this.appEmojiManager=f,this.appMessagesIdsManager=b,this.appGroupCallsManager=y,this.appReactionsManager=w,this.type="chat",this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,$.kg)("CHAT",$.v9.Log|$.v9.Warn|$.v9.Debug|$.v9.Error),this.peerId=Re.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0}setBackground(e,t){const s=a.default.getTheme();let i;if(s.background.color&&!s.background.slug&&!s.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=s.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const n=++this.backgroundTempId,o=this.gradientRenderer,r=this.patternRenderer,l=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const d=s.background.intensity&&s.background.intensity/100,c=!!d&&d<0;let h,p,u,g=null==i?void 0:i.firstElementChild;if(!i)if(i=document.createElement("div"),i.classList.add("chat-background-item"),e)if(d){i.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=Jo.getInstance({url:e,width:t.width,height:t.height}),g=this.patternCanvas=h.createCanvas(),g.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas")}else s.background.slug&&i.classList.add("is-image");else s.background.color&&i.classList.add("is-color");const m=s.background.color;if(m){const{canvas:e,gradientRenderer:t}=Oi.create(m);u=this.gradientRenderer=t,p=this.gradientCanvas=e,p.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),a.default.settings.animationsEnabled&&u.scrollAnimate(!0)}h&&(c?p:g).style.setProperty("--opacity-max",""+Math.abs(d));const v=new Promise((s=>{const a=()=>{if(this.backgroundTempId!==n)return h&&h.cleanup(g),void(u&&u.cleanup());const e=this.backgroundEl.lastElementChild;if(e===i)return void s();const a=[p,c?void 0:g].filter(Boolean);a.length&&i.append(...a),this.backgroundEl.append(i),(0,Jt.Z)(i,"is-visible",!0,t?0:200,e?()=>{r&&r.cleanup(l),o&&o.cleanup(),e.remove()}:null,2),s()};h?h.renderToCanvas(g).then((()=>{let e;e=c?h.exportCanvasPatternToImage(g).then((e=>{this.backgroundTempId===n&&(p.style.webkitMaskImage=`url(${e})`)})):Promise.resolve(),e.then(a)})):e?(0,rs.ZP)(i,e,a):a()}));return this.setBackgroundPromise=Promise.race([(0,Kn.w)(500),v])}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new Qo(this,Yt,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new Ua(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager,this.appChatsManager,this.appReactionsManager),this.input=new Ro(this,this.appMessagesManager,this.appMessagesIdsManager,this.appDocsManager,this.appChatsManager,this.appPeersManager,this.appWebPagesManager,this.appImManager,this.appDraftsManager,this.serverTimeManager,this.appNotificationsManager,this.appEmojiManager,this.appUsersManager,this.appInlineBotsManager,this.appProfileManager),this.selection=new Ys(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new Qa(this.bubbles.bubblesContainer,this,this.appMessagesManager,this.appPeersManager,this.appPollsManager,this.appDocsManager,this.appMessagesIdsManager,this.appReactionsManager),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),"scheduled"===this.type||ce.IS_TOUCH_SUPPORTED||this.bubbles.setReactionsHoverListeners(),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.bubblesContainer,this.input.chatInput),this.bubbles.listenerSetter.add(a.default)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)})),this.bubbles.listenerSetter.add(a.default)("dialog_drop",(e=>{e.peerId===this.peerId&&this.appImManager.setPeer()}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.selection.cleanup()}setPeer(e,t,s){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const i=this.peerId===e;if(i){if(this.setPeerPromise)return}else a.default.dispatchEvent("peer_changing",this),this.peerId=e||Re.NM;if(!e)return Yt.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.default.dispatchEvent("peer_changed",e);if(!i){const t=Yt.getTab(Yo);t&&t.close(),this.noForwards=this.appPeersManager.noForwards(e),this.isRestricted=this.appPeersManager.isRestricted(e),this.container.classList.toggle("no-forwards",this.noForwards),Yt.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=i,void 0===s&&this.isStartButtonNeeded()&&(s=Re.gZ);const n=this.bubbles.setPeer(e,t,s);if(!n)return;const{promise:o}=n,r=this.setPeerPromise=o.finally((()=>{this.setPeerPromise===r&&(this.setPeerPromise=null)}));return i||(Yt.sharedMediaTab.setLoadMutex(this.setPeerPromise),Yt.sharedMediaTab.loadSidebarMedia(!0)),n}setAutoDownloadMedia(){this.autoDownload=function(e){let t,s=0,i=0,n=0;const o=a.default.settings;return!o.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?e.isContact()?"contacts":"private":e.isBroadcast()?"channels":"groups",o.autoDownload.photo[t]&&(s=o.autoDownloadNew.photo_size_max),o.autoDownload.video[t]&&(i=o.autoDownloadNew.video_size_max),o.autoDownload.file[t]&&(n=o.autoDownloadNew.file_size_max)),{photo:s,video:i,file:n}}(this.peerId)}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,s,i){if(this.peerChanged)return;let n=this.peerId;this.peerChanged=!0,this.cleanup(!1),this.topbar.setPeer(n),this.topbar.finishPeerChange(e,t,s),this.bubbles.finishPeerChange(),this.input.finishPeerChange(i),Yt.sharedMediaTab.fillProfileElements(),this.log.setPrefix("CHAT-"+n+"-"+this.type),a.default.dispatchEvent("peer_changed",n),this.wasAlreadyUsed=!0}getMessagesStorage(){return this.appMessagesManager.getMessagesStorage(this.peerId)}getMessage(e){return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(),e)}getMidsByMid(e){return this.appMessagesManager.getMidsByMessage(this.getMessage(e))}isAnyGroup(){return this.peerId===a.default.myId||this.peerId===Re.hj||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(v.ZP.isMobile)this.search?this.search.setQuery(e):this.search=new Xo(this.topbar,this,e);else{let t=Yt.getTab(Yo);t||(t=new Yo(Yt)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return this.appPeersManager.isBot(this.peerId)&&!this.appMessagesManager.getDialogOnly(this.peerId)&&!this.appMessagesManager.getHistoryStorage(this.peerId).history.length}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,sendSilent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}}var tr=s(646);class sr{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,ce.IS_TOUCH_SUPPORTED){if(e&&(0,d.d)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const s=N(t,{noRipple:!0});e.append(this.buttons[t]=s),"link"!==t?s.addEventListener("mousedown",(e=>{(0,d.d)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,l.fc)(s,(e=>{(0,d.d)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=N("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,k._i18n)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!Q.Z.matchUrl(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,d.d)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=N("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const s=document.createElement("div");s.classList.add("markup-tooltip-link-apply-container");const i=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");i.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(i,this.buttons.link),s.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,s),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,d.d)(e),this.resetSelection();let t=this.linkInput.value;t&&!Q.Z.matchUrlProtocol(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!Q.Z.matchUrl(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,F.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let s=0;s!!e))}(),t=[...new Set(e.map((e=>e.parentNode)))],s=new Set;return t.forEach((e=>{for(const t in wo.o){const i=wo.o[t];e.closest(i.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&s.add(this.buttons[t])}})),[...s]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const s=this.buttons[t];s.classList.toggle("active",e.includes(s))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),s=document.body.getBoundingClientRect(),i=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=Pa(void 0,this.appImManager.chat.input.messageInput,!1,i).rect.top+-1*s.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,d=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,ye.Z)(e.left,l,d)}else{const e=i.left+(i.width-o.width)/2;c=(0,ye.Z)(e,l,d)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Ha())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),ne.IS_MOBILE||F.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){ce.IS_TOUCH_SUPPORTED&&!ne.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,d.d)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const s=document.getSelection();if(Ha(s))this.hide();else if(ce.IS_TOUCH_SUPPORTED)if(ne.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=s.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()})))}}function ir(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function nr(e,t,s,i,n,a,o,r){const l=[];return l.push("M"+(e+s/2)+","+t),l.push("H"+(e+s-a)),a>0&&l.push("A"+ir(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+ir(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+ir(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+ir(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}re.GO.generatePathData=nr;class ar{constructor(e,t){let s;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(s=document.createElement("div"),s.classList.add("drop-icon","tgico-"+t.icon));const i=document.createElement("div");let n;i.classList.add("drop-header"),i.append((0,k.i18n)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,k.i18n)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,s,i,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,s=nr(5,5,e.width-t,e.height-t,t,t,t,t);this.path.setAttributeNS(null,"d",s)}}function or(e){e.forEach((e=>e.classList.add("no-transition"))),(0,De.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var rr=s(490),lr=s(5228),dr=s(2459),cr=s(2207);class hr{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:s,minRadius:i,speed:n}=this,a=s-i;e[t]=i+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:s,N:i}=this;for(let n=0;n=1&&(i[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,s,i,n,a,o,r){if(n.getContext){const l=n.getContext("2d");l.beginPath(),l.moveTo(s,i),l.lineTo(e,i);const{radius:d,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const s=this.progress[n],i=(t-(d[n]*(1-s)+c[n]*s))*r+o*(1-r);l.lineTo(e,i)}else{const a=this.progress[n-1],p=d[n-1]*(1-a)+c[n-1]*a,u=this.progress[n],g=(s-e)/h*(n-1),m=(s-e)/h*n,v=g+(m-g)/2,f=(t-p)*r+o*(1-r),b=(t-(d[n]*(1-u)+c[n]*u))*r+o*(1-r);l.bezierCurveTo(v,f,v,b,m,b),n===h&&l.lineTo(s,i)}a(l),l.fill(),l.closePath()}}}class pr{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,s,i,n,a)=>{t.fillStyle=pr.getGradientFromType(t,e,s,i,n,a)}}static getGradientFromType(e,t,s,i,n,a){const o=e.createLinearGradient(s,i,n,a);return t===cr.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===cr.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===cr.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===cr.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,s,i){}}class ur{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:s,lbd2:i,scale:n,left:a,top:o,right:r,bottom:l,currentState:d,previousState:c,focused:h,resizing:p,canvas:u}=this;if(!h&&!p&&this.progressToState>=1)return;let g=Date.now()-this.lastUpdateTime;g>20&&(g=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*g,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:m,amplitude2:v,progressToState:f}=this,b=6*v*n,y=6*v*n;u.getContext("2d").clearRect(0,0,u.width,u.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,t.update(m,.3),s.update(m,.7),i.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-f,h=c):(n=c?f:1,d.update(l-o,r-a,g,m),h=d);const p=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},v=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};s.draw(a,o-b,r,l,u,p,o,1),i.draw(a,o-y,r,l,u,p,o,1),t.draw(a,o,r,l,u,v,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:s,states:i}=this;(null==s?void 0:s.stateId)!==e&&(this.previousState=t?s:null,this.currentState=i.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[cr.Z.UNMUTED,new pr(cr.Z.UNMUTED)],[cr.Z.MUTED,new pr(cr.Z.MUTED)],[cr.Z.MUTED_BY_ADMIN,new pr(cr.Z.MUTED_BY_ADMIN)],[cr.Z.CONNECTING,new pr(cr.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(cr.Z.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new hr(3),this.lbd1=new hr(7),this.lbd2=new hr(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const s=this.canvas=document.createElement("canvas");return s.classList.add(e+"-canvas"),t.append(s),t}}const gr=new class{constructor(){this.cache={},a.default.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let t in e)this.getProperty(t)}))}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}};class mr{constructor(e,t){this.item=e,(0,w.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class vr{constructor(e,t){this.icon=e,this.autoplay=!1,(0,w.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:s,canvas:i,width:n,height:a}=this.icon;return t=ae.Z.loadAnimationAsAsset({container:s,canvas:i,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>ae.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new mr(this,e)}getPart(e){return e instanceof mr?e:"string"==typeof e?this.parts.find((t=>t.name===e)):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class fr{constructor(e){(0,w.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:s}=this;this.container.style.width=t+"px",this.container.style.height=s+"px";const i=this.canvas=document.createElement("canvas");i.classList.add("rlottie"),i.width=t,i.height=s,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(_e.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new vr(this,e);return this.items.set(e.name,t),t}playPart(e,t,s){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,s)});const i=e.getPart(t);e.player.playPart({from:a.default.settings.animationsEnabled&&!this.skipAnimation?i.startFrame:i.endFrame,to:i.endFrame,callback:s})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,s)=>{const i=s*t;return{startFrame:i,endFrame:i+t-1}}))}}class br extends fr{constructor(e){super({width:e.width,height:e.height}),(0,w.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const s=this.getPart(e),i=void 0!==t&&this.getColor&&this.getColor(t),n=s.item;n.initFrame=s.endFrame,n.color=i;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(_e.Z)}setState(e,t,s){this.loaded||this.load(e,t);let i=!1,n=!1;return void 0!==e?i=this.setPartState(e,t,s):void 0!==t&&(n=this.setColorState(t)),i||n}setPartState(e,t,s){const{partState:i}=this;return i===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,i).play(s),!0)}setColorState(e,t=!0){const{colorState:s}=this;if(s===e||!this.getColor)return!1;this.colorState=e;const i=this.getItem(),n=this.getColor(e,s),a=()=>{i.player.setColor(n,t)};return i.player?a():i.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class yr extends br{constructor(){super({width:36,height:36,getPart:(e,t)=>{const s=Nr;let i;switch(e){case s.HAND:i=t===s.MUTED?"muted-to-hand":"unmuted-to-hand";break;case s.MUTED:i=t===s.HAND?"hand-to-muted":"mute";break;case s.UNMUTED:i="unmute"}return this.getItem().getPart(i)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}class wr extends br{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const s=Ur;let i;switch(e){case s.HAND:i=3;break;case s.MUTED:i=t===s.HAND?0:2;break;case s.UNMUTED:i=1}return this.getItem().getPart(i)},getColor:e?(e,t)=>function(e){const t=Ur;let s,i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}return s=Bi(gr.getProperty("gc-"+i+"-text-color")),s}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=fr.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=Ur;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const Sr="group-call-participant-status";class Cr{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(Sr+"-container")}setState(e,t){const s=Ur,i=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),s=document.createElement("i");return s.classList.add(Sr+"-icon",Sr+"-icon-"+e,t),s}));let n,a;if(e===s.MUTED_FOR_ME)n=(0,k.i18n)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===s.UNMUTED)n=(0,k.i18n)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===s.HAND)n=(0,k.i18n)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!i.length)return void m(this.container,Q.Z.wrapEmojiText(t.about));n=(0,k.i18n)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(Sr,a),o.append(...i,n),(0,T.Z)(this.container,o)}}class Lr extends Fs{constructor(e){super({getIndex:e=>e.participant.date,onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>{const{participant:t}=e,s=Vr(t);e.mutedIcon.setState(s),e.status.setState(s,t)},onSort:(e,t)=>{Zs(e.dom.listEl,this.list,t)},onElementCreate:t=>{const{dom:s}=pd.addDialogNew({dialog:t.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});s.listEl.classList.add("group-call-participant");const i=e.participants.get(t.id),n=Vr(i),a=new wr(!0),o=new Cr(["presentation","video"]);return a.setState(n),o.setState(n,i),(0,T.Z)(s.lastMessageSpan,o.container),s.listEl.append(a.container),t.dom=s,t.participant=i,t.mutedIcon=a,t.status=o,t},updateElementWith:De.T2}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=pd.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}function Ir(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const s=t.getContext("2d");s.filter="blur(2px)";const i=()=>{s.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Ue.jt)((()=>(i(),t.isConnected))),i(),t}const Mr="group-call-participant-video";class Er{constructor(e,t,s){this.appPeersManager=e,this.instance=t,this.source=s,this.container=document.createElement("div"),this.container.classList.add(Mr+"-container"),this.info=document.createElement("div"),this.info.classList.add(Mr+"-info"),this.left=document.createElement("div"),this.left.classList.add(Mr+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(Mr+"-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add(Mr+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,s){let i;e.pFlags.self?(i=(0,k.i18n)("VoiceChat.Status.You"),i.classList.add("peer-title")):(this.peerTitle=new St.Z({peerId:this.appPeersManager.getPeerId(e.peer)}),i=this.peerTitle.element),this.groupCallParticipantMutedIcon=new wr(!1),this.groupCallParticipantStatus=new Cr([t]),this.left.append(i,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),s.classList.add(Mr,"call-video"),s.paused&&s.play();const n=Ir(s);n.classList.add(Mr+"-blur"),this.container.prepend(n,s),this.updateParticipant(e)}updateParticipant(e){const t=Vr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Pr extends Ee{constructor(e){super(),(0,w.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:s}=this;s.add(a.default)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),s.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,l.fc)(this.container,(e=>{const t=(0,Me.Z)(e.target,"group-call-participant-video-container");if(!t)return;const s=this.containers.get(t);this.instance.pinnedSource!==s.source?this.instance.pinSource(s.source):this.instance.unpinAll()}),{listenerSetter:s}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:s,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const s=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!s);const i=e.source===t;e.setPinned(i)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=["video","presentation"],i=s.some((t=>!!e[t]));let n=this.participantsElements.get(t);(i||n)&&(n||this.participantsElements.set(t,n=new Map),s.forEach((s=>{let i=n.get(s);const a=e[s];if(!!a!=!!i){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,s);if(!t)return;const{video:a,source:o}=t;i=new Er(this.appPeersManager,this.instance,o),this.containers.set(i.container,i),this.setElementDisplay(i,this.instance.pinnedSource),n.set(s,i),i.setParticipant(e,s,a),this.container.prepend(i.container)}else n.delete(s),i.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(i.container),i.destroy());this._onLengthChange()}else i&&i.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){e.participants.forEach((e=>{this.updateParticipant(e)}))}destroy(){this.containers.forEach((e=>{e.destroy()}))}}class Tr{constructor(e){this.onOpenProfileClick=()=>{const e=pt.Z.getPopups(Kr)[0];e&&e.hide(),a.default.dispatchEvent("history_focus",{peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.appGroupCallsManager.editParticipant(this.instance.id,this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>{on({peerId:this.targetPeerId,title:new St.Z({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new St.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),_e.Z)}}];const{listenerSetter:t}=e;this.appChatsManager=e.appChatsManager,this.appPeersManager=e.appPeersManager,this.appGroupCallsManager=e.appGroupCallsManager,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=Ce(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),(0,J.Eo)(e.onContextElement,(e=>{const t=(0,Me.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==s&&s.append(this.element);const i=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=this.instance.getParticipantByPeerId(i),this.participant.pFlags.self||(this.canManageCall=this.appChatsManager.hasRights(this.chatId,"manage_call"),this.buttons.forEach((e=>{e.element.classList.toggle("hide",!e.verify(i))})),(0,d.d)(e),(0,J.oy)(e.touches?e.touches[0]:e,this.element,"right"),(0,J.YP)(this.element))}),t),t.add(a.default)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=this.appPeersManager.getPeerId(t.peer);this.targetPeerId===e&&(0,J.UR)()}}));let s=document.body;(0,Pe.Ms)(document.body,(()=>{const e=(0,Pe.rB)();s=e?pt.Z.getPopups(Kr)[0].getContainer():document.body,e||(0,J.UR)()}),t)}}class kr{constructor(e){(0,w.Z)(this,e);const t="group-call-participants",s=new P.ZP(void 0);s.container.classList.add(t+"-scrollable");const i=this.container=document.createElement("div");i.classList.add(t);const n=this.sortedList=new Lr(this.instance),{instance:o,listenerSetter:r}=this;this.contextMenu=new Tr(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:r,instance:o})),this.groupCallParticipantsVideo=new Pr(Object.assign(Object.assign({},e),{appendTo:s.container,displayPinned:!1})),s.append(n.list),i.append(s.container),e.appendTo.append(i),r.add(a.default)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new bt({scrollable:s,getPromise:()=>this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(o)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=this.sortedList.has(t);e.pFlags.left?s&&this.sortedList.delete(t):s?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){e.participants.forEach((e=>{this.updateParticipant(e)}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class xr{constructor(e){this.appendTo=e,this.descriptionIntl=new k.default.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let s,i;t===cr.Z.CONNECTING?s="VoiceChat.Status.Connecting":(s="VoiceChat.Status.Members",i=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:s,args:i}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class Ar{constructor(e){this.appendTo=e,this.peerTitle=new St.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?m(s,Q.Z.wrapEmojiText(i.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==s&&s.append(t.element))}}const _r=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}));function Zr(e,t,s){const i=e+"-button",n=document.createElement("div");n.classList.add(i,"call-button","rp-overflow"),s.icon&&n.classList.add("tgico-"+s.icon),s.noRipple||(0,ee.ripple)(n),s.isDanger&&n.classList.add(i+"-red"),s.isConfirm&&n.classList.add(i+"-green"),s.callback&&(0,l.fc)(n,s.callback,{listenerSetter:t});let a=n;if(s.text){const e=document.createElement("div");e.classList.add(i+"-container","call-button-container");const t="string"==typeof s.text?(0,k.i18n)(s.text):s.text;t.classList.add(i+"-text","call-button-text"),e.append(n,t),a=e}return a}const Dr="movable-element",Fr="movable-element-resize-handler";class Rr extends R.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,w.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(Dr),this.addResizeHandlers(),this.setSwipeHandler(),v.ZP.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(Dr),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){v.ZP.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(Fr,Fr+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,s,i,n;const a=this.swipeHandler=new jt({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,i=Math.abs(a)*(e?1:-1),o=n.includes("e")?Ct.Z.width-t:s+t;this.width=Math.min(o,s+i)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,s=Math.abs(o)*(t?1:-1),a=n.includes("s")?Ct.Z.height-e:i+e;this.height=Math.min(a,i+s)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+s-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+i-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const s=(0,Me.Z)(t,Fr);return s?(n=s.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,s=this.width,i=this.height}})}setPositionToCenter(){this.top=Ct.Z.height/2-this.height/2,this.left=Ct.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,ye.Z)(this.width,this.minWidth,Ct.Z.width),this.height=(0,ye.Z)(this.height,this.minHeight,Ct.Z.height)}fixPosition(){this.top=(0,ye.Z)(this.top,0,Ct.Z.height-this.height),this.left=(0,ye.Z)(this.left,0,Ct.Z.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:s,height:i}=this;return{top:e,left:t,width:s,height:i}}set state(e){const{top:t,left:s,width:i,height:n}=e;this.top=t,this.left=s,this.width=i,this.height=n,this.onResize()}}var Br,Ur,Nr,Or=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s};class Hr{constructor(e){Br.set(this,void 0),(0,w.Z)(this,e),this.toggleMovable(!ce.IS_TOUCH_SUPPORTED),this.listenerSetter.add(v.ZP)("changeScreen",((e,t)=>{t!==v._G.mobile&&e!==v._G.mobile||this.toggleMovable(!ce.IS_TOUCH_SUPPORTED)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)}(this,Br,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=Or(this,Br,new Rr(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),Or(this,Br,void 0,"f")}}}function zr(e,t,s){return t.forEach((t=>{t.classList.toggle(e,s)})),()=>zr(e,t,!s)}function Vr(e){const t=Ur;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}Br=new WeakMap,function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(Ur||(Ur={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(Nr||(Nr={}));let jr={width:420,height:640};const Gr="group-call";class Kr extends pt.Z{constructor(e){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{(0,Pe.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=zr.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{const e=e=>{this.instance.hangUp(e)};this.appChatsManager.hasRights(this.instance.chatId,"manage_call")?new gt("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Pe.rB)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(I.Z.checkAnimations(e),a.default.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Pe.rB)(),s=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,i=(t||!!(s&&s.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;i&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",i),this.btnInvite.classList.toggle("hide",i),this.btnShowColumn.classList.toggle("hide",!i),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},(0,w.Z)(this,e),this.videosCount=0,this.container.classList.add(Gr,"night");const t=this.instance=this.appGroupCallsManager.groupCall,{listenerSetter:s}=this;if(!ne.IS_APPLE_MOBILE){const e=this.btnFullScreen=N("fullscreen"),t=this.btnFullScreen2=N("fullscreen group-call-cfs"),i=this.btnExitFullScreen=N("smallscreen");(0,l.fc)(e,this.onFullScreenClick,{listenerSetter:s}),(0,l.fc)(t,this.onFullScreenClick,{listenerSetter:s}),(0,l.fc)(i,(()=>{(0,Pe.C8)()}),{listenerSetter:s}),(0,Pe.Ms)(this.container,this.onFullScreenChange,s)}this.btnInvite=N("adduser");const i=this.btnShowColumn=N("rightpanel group-call-only-big");(0,l.fc)(i,this.toggleRightColumn,{listenerSetter:s});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),n.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const r=this.header.cloneNode(!1),d=n.cloneNode(!1),c=this.title.cloneNode(!1);d.append(c);const h=N("rightpanel");r.append(...[h,d,this.btnFullScreen2].filter(Boolean)),(0,l.fc)(h,this.toggleRightColumn,{listenerSetter:s}),this.body.prepend(r);const p=new P.ZP(void 0);p.container.classList.add("group-call-big-video-container"),this.container.append(p.container),this.groupCallTitle=new Ar(this.title),this.groupCallDescription=new xr(o),this.groupCallBodyHeaderDescription=new xr(c),this.constructButtons(),this.groupCallParticipantsVideo=new Pr(Object.assign({appendTo:p.container,instance:t,listenerSetter:s,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()}},e)),this.groupCallParticipants=new kr(Object.assign({appendTo:this.body,instance:t,listenerSetter:s},e)),this.movablePanel=new Hr({listenerSetter:s,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,Me.Z)(t,"chatlist")||(0,Me.Z)(t,"group-call-button")||(0,Me.Z)(t,"btn-icon")||(0,Me.Z)(t,"group-call-participants-video-container")||(0,Pe.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:jr}),s.add(t)("state",(()=>{this.updateInstance()})),s.add(a.default)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),s.add(t)("pinned",(()=>{this.setHasPinned()})),s.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;jr=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()})),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add("group-call-buttons");const t=Zr.bind(null,Gr,this.listenerSetter),s=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),i=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});i.classList.toggle("hide",!_r);const n=t({noRipple:!0,callback:(0,ms.Z)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new yr;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!_r);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(s,i,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===cr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Pe.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const s=function(e,t){const s=Nr;return t.pFlags.can_self_unmute?t.pFlags.muted?s.MUTED:s.UNMUTED:s.HAND}(0,e);this.container.dataset.micState=s===Nr.HAND?"hand":s===Nr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(s)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var Wr,qr=s(9078);!function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(Wr||(Wr={}));const $r=Wr;class Qr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let s;if(this.state=t,t===$r.CONNECTED){s=document.createElement("span"),s.classList.add("call-description-duration");const t=()=>{s.innerText=(""+e.duration).toHHMMSS(!0)};this.interval=window.setInterval(t,1e3),t()}else{let i;switch(t){case $r.PENDING:i=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case $r.REQUESTING:i="Call.StatusRequesting";break;case $r.EXCHANGING_KEYS:i="VoipExchangingKeys";break;case $r.CLOSED:i=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:i="Call.StatusConnecting"}s=(0,k.i18n)(i),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===$r.CONNECTED),(0,T.Z)(this.container,s),this.container.parentElement||this.appendTo.append(this.container)}}class Yr extends br{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const Xr="call",Jr={width:400,height:580};let el=Object.assign({},Jr);class tl extends pt.Z{constructor(e){super("popup-call",void 0,{withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{(0,Pe.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Pe.rB)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(I.Z.checkAnimations(e),a.default.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},(0,w.Z)(this,e),this.videoContainers={};const{container:t,listenerSetter:s,instance:i}=this;t.classList.add(Xr,"night");const n=document.createElement("div");n.classList.add("call-avatar");const o=this.peerId=this.instance.interlocutorUserId.toPeerId(),r=new Yl;r.isBig=!0,r.setAttribute("peer",""+o),r.classList.add("avatar-full"),n.append(r);const d=new St.Z({peerId:o}).element;d.classList.add("call-title");const c=document.createElement("div");c.classList.add("call-subtitle"),this.description=new Qr(c);const h=this.emojisSubtitle=document.createElement("div");h.classList.add("call-emojis"),t.append(n,d,c),ne.IS_MOBILE?this.header.append(h):(this.btnFullScreen=N("fullscreen"),this.btnExitFullScreen=N("smallscreen hide"),(0,l.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:s}),(0,l.fc)(this.btnExitFullScreen,(()=>(0,Pe.C8)()),{listenerSetter:s}),(0,Pe.Ms)(this.container,this.onFullScreenChange,s),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(h)),this.partyStates=document.createElement("div"),this.partyStates.classList.add("call-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add("call-party-state");const p=(0,k.i18n)("VoipUserMicrophoneIsOff",[new St.Z({peerId:o,onlyFirstName:!0,limitSymbols:18}).element]);p.classList.add("call-party-state-text");const u=new Yr(!1,!0);u.setState(!1,!1),this.partyMutedState.append(u.container,p),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=Zr.bind(null,Xr,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),s.add(i)("state",(()=>{this.updateInstance()})),s.add(i)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new Hr({listenerSetter:s,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,Me.Z)(t,"call-button")||(0,Me.Z)(t,"btn-icon")||(0,Pe.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?el:Object.assign({},Jr)});const g=this.movablePanel.movable;g&&this.listenerSetter.add(g)("resize",(()=>{this.resizeVideoContainers()}));const m=this.controlsHover=new Ee;m.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),m.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;el=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-first");const t=zr.bind(null,"btn-disabled"),s=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([s,i],!0);this.instance.toggleVideoSharing().finally(e)}}),i=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([s,i],!0);this.instance.toggleScreenSharing().finally(e)}});_r||(i.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new k.default.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Yr(!0,!0);n.firstElementChild.append(a.container),e.append(s,i,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-second"),this.declineI18nElement=new k.default.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),s=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,s),this.container.append(e)}createVideoContainer(e){const t=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),(0,l.fc)(t,(()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()}));const s=Ir(e);return s.classList.add("call-video-blur"),t.append(s,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===$r.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Pe.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const s=!e.isOutgoing&&t===$r.PENDING;this.declineI18nElement.compareAndUpdate({key:t===$r.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!s),this.btnAccept.classList.toggle("hide-me",!s),this.container.classList.toggle("two-button-rows",s);const i=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",i)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!i,!i,n),a||n(),this.muteI18nElement.compareAndUpdate({key:i?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const l=e.getMediaState("output");(0,Jt.Z)(this.partyMutedState,"is-visible",!!(null==l?void 0:l.muted),300);const d=this.videoContainers,c=Object.assign({},d);["input","output"].forEach((t=>{const s=e.getMediaState(t),i=e.getVideoElement(t),n=!!(i&&i.videoWidth&&i.videoHeight);!i||n||i.dataset.hasPromise||(i.dataset.hasPromise="1",(0,he.xD)(i).then((()=>{delete i.dataset.hasPromise,this.updateInstance()})));const a=!!i&&n&&!(!s||"active"!==s.videoState&&"active"!==s.screencastState);let o=d[t];a&&i&&!o&&(o=d[t]=this.createVideoContainer(i),this.container.append(o)),!a&&o&&(o.remove(),delete d[t])}));{const e=d.input,t=d.output;Object.keys(c).length!==Object.keys(d).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(d).length),!this.emojisSubtitle.textContent&&t<$r.EXCHANGING_KEYS&&Promise.resolve(e.getEmojisFingerprint()).then((e=>{this.emojisSubtitle.innerHTML=Q.Z.wrapEmojiText(e.join(""))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),s=this.movablePanel.state,i=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:i,r=1/3*((0,Pe.rB)()?65535:a?s.height:s.width),l=a?t.videoWidth/t.videoHeight:1,d=a?1:t.videoHeight/t.videoWidth;e.style.width=r*l+"px",e.style.height=r*d+"px",e.style.maxWidth=o*l+"px",e.style.maxHeight=o*d+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var sl=s(3075),il=s(3773);function nl(e){const t=(0,il.Z)(e,e.media[0]),s={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},i=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=s["video"===n&&s.video?"screencast":n]={},o=(0,il.Z)(e,t);a.ssrc=i(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(i)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const l=new Map,d=e=>{let t=l.get(e);return t||l.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,s=d(t),i=e.value.split("/"),[n,a,o]=i;s.name=n,s.clockrate=+a,s.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;d(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[s,i]=t;return{type:s,subtype:i||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,s=d(t).parameters={},i=e.value.split(";");for(const e of i){const[t,i]=e.split("=");s[t]=i}})),a.payloadTypes=Array.from(l.values())}return s}var al=s(9124);class ol extends sl.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,i=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let s;if(t.offerReceived){t.offerReceived=!1;const i=s=yield e.createAnswer();this.log("[sdp] local",i.type,i.sdp),yield e.setLocalDescription(i),this.log("[InitialSetup] send 2")}else{const i=s=yield e.createOffer();this.log("[sdp] local",i.sdp),yield e.setLocalDescription(i),t.offerSent=!0,this.log("[InitialSetup] send 0")}const i=nl((0,al.DV)(s.sdp));t.sendCallSignalingData(i)},new((s=void 0)||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}));var e,t,s,i}}var rl=s(8500),ll=s(1677),dl=s(49),cl=s(6752),hl=s(4903);const pl="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var ul=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class gl{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,hl.Z)(...e),pl.digest("SHA-256",function(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return ul(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},s=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),i=this.p2pKey,n=yield this.concatSHA256([i.subarray(s+88,s+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(i,a,s),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,s=new ArrayBuffer(4);new DataView(s).setUint32(0,t>>>0,!1);const i=new Uint8Array([...new Uint8Array(s),...e]);return this.encryptPrepared(i)}prepareAesKeyIv(e,t,s){return ul(this,void 0,void 0,(function*(){const[i,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(s,s+36)]),this.concatSHA256([e.subarray(40+s,40+s+36),t.subarray(0,16)])]);return{key:new Uint8Array([...i.subarray(0,8),...n.subarray(8,24),...i.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...i.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,s,i=!0){return ul(this,void 0,void 0,(function*(){const t=yield pl.importKey("raw",s.key,{name:"AES-CTR"},!1,[i?"encrypt":"decrypt"]),n=yield pl[i?"encrypt":"decrypt"]({name:"AES-CTR",counter:s.iv,length:8*s.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,s){let i=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:s}=this,i=(t?8:0)+("Signaling"===s?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,l=yield this.prepareAesKeyIv(n,a,i),d=yield this.aesProcessCtr(o,r,l,!1),c=yield this.concatSHA256([n.subarray(88+i,88+i+32),d]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(d.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),d.slice(4))}))}}var ml=s(630);class vl{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new ml.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:s,setup:i}=e;r.add(`a=fingerprint:${t} ${s}`,`a=setup:${i}`)})),s&&i&&r.add(`a=ice-ufrag:${s}`,`a=ice-pwd:${i}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Sl(d)),i&&r.add(`a=msid:${l} audio${i}`),r.add("a=rtcp-mux",Cl(a),Ll(s,i,n,l));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Sl(d)),i&&r.add(`a=msid:${l} video${i}`),r.add("a=rtcp-mux","a=rtcp-rsize",Cl(a),Ll(s,i,n,l))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new ml.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:s,setup:i}=e;r.add(`a=fingerprint:${t} ${s}`,`a=setup:${i}`)})),s&&i&&r.add(`a=ice-ufrag:${s}`,`a=ice-pwd:${i}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Sl(d)),i&&r.add(`a=msid:${l} audio${i}`),r.add("a=rtcp-mux",Cl(a),Ll(s,i,n,l));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Sl(d)),i&&r.add(`a=msid:${l} video${i}`),r.add("a=rtcp-mux","a=rtcp-rsize",Cl(a),Ll(s,i,n,l))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class fl{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`})),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Sl(d),r+="\na=rtcp-mux",r+=Cl(a),r+=Ll(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Sl(d),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Cl(a),r+=Ll(s,i,n,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`})),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Sl(h),r+="\na=rtcp-mux",r+=Cl(d),r+=Ll(s,n,a,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${d.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Sl(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Cl(d),r+=Ll(s,n,a,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class bl{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`})),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Sl(d),i&&(r+=`\na=msid:${l} audio${i}`),r+="\na=rtcp-mux",r+=Cl(a),r+=Ll(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Sl(d),i&&(r+=`\na=msid:${l} video${i}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Cl(a),r+=Ll(s,i,n,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`})),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Sl(d),i&&(r+=`\na=msid:${l} audio${i}`),r+="\na=rtcp-mux",r+=Cl(a),r+=Ll(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Sl(d),i&&(r+=`\na=msid:${l} video${i}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Cl(a),r+=Ll(s,i,n,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function yl(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function wl(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function Sl(e){let t=[];for(let s=0;s{const{type:s,subtype:i}=e;t.push(`a=rtcp-fb:${n} ${[s,i].join(" ")}`)})),d){const e=[];Object.getOwnPropertyNames(d).forEach((t=>{e.push(`${t}=${d[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function Ll(e,t,s,i){let n=[];return s&&s.length>0?s.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${i} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${i} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class Il{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:s,sdpMid:i,foundation:n,component:a,protocol:o,priority:r,address:l,type:d,relAddress:c,generation:h,tcpType:p,networkId:u,networkCost:g,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:s,sdpMid:i};throw"no sdpString"}static generateOffer(e){return yl()?fl.generateOffer(e):wl()?bl.generateOffer(e):vl.generateOffer(e)}static generateAnswer(e){return yl()?fl.generateAnswer(e):wl()?bl.generateAnswer(e):vl.generateAnswer(e)}}var Ml=s(4081),El=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Pl extends rl.Z{constructor(e){super(),this.log=(0,$.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,w.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",$r[e]),e===$r.CLOSED&&this.cleanup()}));const t=this.streamManager=new Ml.Z(ll.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let s={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const i=this;s=new Proxy(s,{set:function(e,t,n){return e[t]=n,i.setMediaState(s),i.sendMediaState(),!0}}),this.mediaStates={input:s},this.sendMediaState=dt(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?$r.CLOSED:"connected"===e||ne.IS_SAFARI&&"completed"===e?$r.CONNECTED:$r.CONNECTING}return $r.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*($r.CLOSED-e+1);return t+=2147483647e3-(e===$r.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const s=this.description.findEntry((e=>e.type===t));if(!s)return;return this.elements.get(""+s.recvEntry.source)}}startScreenSharingInternal(){return El(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return El(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return El(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return El(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:s}=this,i=t.inputStream.getVideoTracks()[0];i&&((0,dl.Z)(i),t.appendToConference(s))}))}toggleVideoSharing(){return El(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===$r.CLOSING||e===$r.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=qi.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return El(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState($r.EXCHANGING_KEYS);const s=this.call;this.requestInputSource(!0,!!s.pFlags.video,!1);const i=s.g_a_hash;this.appCallsManager.generateDh().then((e=>(this.dh={g_a_hash:i,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.apiManager.invokeApi("phone.acceptCall",{peer:this.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})))).then((e=>{this.appCallsManager.savePhonePhoneCall(e)}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:s}=this,i=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:s,ipv6:i,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(s&&r.push(`turn:${s}:${n}`),i&&r.push(`turn:[${i}]:${n}`)):e.pFlags.stun&&(s&&r.push(`stun:${s}:${n}`),i&&r.push(`stun:[${i}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",i),!i)return;const n=this.connectionInstance=new ol({call:this,streamManager:s,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(i);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===$r.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new gl(e,t),this.decryptor=new gl(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return El(this,void 0,void 0,(function*(){const t=JSON.stringify(e),s=(new TextEncoder).encode(t),{bytes:i}=yield this.encryptor.encryptRawPacket(s);this.log("sendCallSignalingData",this.id,t),yield this.apiManager.invokeApi("phone.sendSignalingData",{peer:this.appCallsManager.getCallInput(this.id),data:i})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:s}=e;if(0!==s)return;const i=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[s,i,n,a,o,r,...l]=e.split(" "),d={sdpString:t,foundation:s,component:i,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,te.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return El(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const s=this.description;let i=s.entries.map((e=>e.mid));const n={type:"offer",sdp:s.generateSdp({bundle:i,entries:s.entries.filter((e=>i.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=nl((0,al.DV)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return El(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState($r.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const s=this.mediaStates[e];t="active"===s.videoState||"active"===s.screencastState||t}yield this.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,s=t.findIndex((e=>"VP8"===e.name)),i=t[s],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===i.id}));e.payloadTypes=[t[s],t[n]]}))}applyCallSignalingData(e){return El(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:s}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const i=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,cl.z_)("audio",+e.audio.ssrc),e.video?(0,cl.z_)("video",i(e.video.ssrcGroups)):void 0,e.screencast?(0,cl.z_)("screencast",i(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=s.getEntryBySource(e.source);if(t)return;const i=s.findFreeSendRecvEntry(e.type,!1);t=new cl.Lp(i.mid,e.type),t.setDirection("sendrecv"),i.recvEntry=t,s.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;let a=s.entries.map((e=>e.mid));const o={type:n?"answer":"offer",sdp:s.generateSdp({bundle:a,entries:s.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=Il.generateCandidate(t);e.sdpMLineIndex=0;const s=new RTCIceCandidate(e);this.candidates.push(s)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return El(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return El(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return El(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const s of t){const t=yield e.decryptRawPacket(s);if(!t)continue;const i=(new TextDecoder).decode(t);try{const e=JSON.parse(i);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",i),this.hangUp("phoneCallDiscardReasonDisconnect")}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e.data),this.processDecryptQueue()}}class Tl{constructor(e,t,s,i,n){this.appGroupCallsManager=e,this.appPeersManager=t,this.appChatsManager=s,this.appAvatarsManager=i,this.appCallsManager=n,this.onState=()=>{this.updateInstance(this.instance)};const o=this.listenerSetter=new B.Z;o.add(a.default)("call_instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),o.add(a.default)("call_accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),o.add(a.default)("group_call_instance",(e=>{this.updateInstance(e)})),o.add(a.default)("group_call_update",(e=>{const t=this.appGroupCallsManager.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),o.add(a.default)("group_call_amplitude",(({amplitudes:e,type:t})=>{const{weave:s}=this;if(!e.length||!s)return;let i=0;for(let t=0;ti?n:i}s.setAmplitude(i)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new B.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof qr.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof qr.Z)));const s=this.instance.isMuted;let i=e instanceof qr.Z?e.state:function(e,t){switch(e){case $r.CLOSING:case $r.CLOSED:return cr.Z.CLOSED;case $r.CONNECTED:return t?cr.Z.MUTED:cr.Z.UNMUTED;default:return cr.Z.CONNECTING}}(e.connectionState,s);const{weave:n}=this;n.componentDidMount();const a=i===cr.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,Jt.Z)(document.body,"is-calling",!a,250,a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0)),a||(n.setCurrentState(i,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!s))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof qr.Z)return this.groupCallTitle.update(e);(0,T.Z)(this.center,new St.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const s=document.createElement("div");s.classList.add("topbar-call-left");const i=this.groupCallMicrophoneIconMini=new Yr,n=N();n.append(i.container),s.append(n);const a=(0,ms.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,l.fc)(n,(e=>{(0,d.d)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new Ar(o),this.groupCallDescription=new xr(s),this.callDescription=new Qr(s);const r=document.createElement("div");r.classList.add("topbar-call-right");const c=N("endcall_filled");r.append(c),(0,l.fc)(c,(e=>{(0,d.d)(e);const{instance:t}=this;t&&(t instanceof qr.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,l.fc)(t,(()=>{if(this.instance instanceof qr.Z){if(pt.Z.getPopups(Kr).length)return;new Kr({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()}else if(this.instance instanceof Pl){if(pt.Z.getPopups(tl).find((e=>e.getCallInstance()===this.instance)))return;new tl({appCallsManager:this.appCallsManager,appAvatarsManager:this.appAvatarsManager,appPeersManager:this.appPeersManager,instance:this.instance}).show()}}),{listenerSetter:e}),t.append(s,o,r);const h=this.weave=new ur,p=h.render("topbar-call-weave");t.prepend(p),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var kl=s(5916),xl=s(4484),Al=s(3442),_l=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Zl=45e3,Dl=new class{constructor(){this.log=(0,$.kg)("CALLS"),this.tempId=0,this.calls=new Map,this.instances=new Map,this.sortedInstances=[],Ea&&(a.default.addMultipleEventsListeners({updatePhoneCall:e=>_l(this,void 0,void 0,(function*(){var t;const s=this.saveCall(e.phone_call);let i=this.instances.get(s.id);switch(s._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=s.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:s.admin_id}),i.overrideConnectionState($r.PENDING),i.setPhoneCall(s),i.setHangUpTimeout(Zl,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const e=i.dh.g_a=s.g_a_or_b,t=i.dh,n=yield ct.Z.invokeCrypto("sha256",e);if(!(0,xl.Z)(t.g_a_hash,n)){this.log.error("Incorrect g_a_hash",t.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.computeKey(e,t.b,t.p);if(s.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",s.key_fingerprint,o);break}i.encryptionKey=a,i.joinCall();break}}})),updatePhoneCallSignalingData:e=>{const t=this.instances.get(e.phone_call_id);(null==t?void 0:t.id)===e.phone_call_id&&t.onUpdatePhoneCallSignalingData(e)}}),this.audioAsset=new kl.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,s]of this.instances)if(s.interlocutorUserId===e)return s}computeKey(e,t,s){return _l(this,void 0,void 0,(function*(){return ct.Z.invokeCrypto("compute-dh-key",e,t,s)}))}saveCall(e){const t="phoneCallDiscarded"===e._,s=this.calls.get(e.id);return s?((0,Al.Z)(s,e),t&&this.calls.delete(e.id),e=s):t||this.calls.set(e.id,e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}createCallInstance(e){const t=new Pl(Object.assign({appCallsManager:this,apiManager:ct.Z,apiUpdatesManager:ni.Z},e));return t.addEventListener("state",(e=>{const s=this.currentCall;e===$r.CLOSED?(this.instances.delete(t.id),(0,z.Z)(this.sortedInstances,t)):(0,Ds.Z)(this.sortedInstances,t,"sortIndex"),e===$r.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const i=void 0!==t.connectedAt;e===$r.EXCHANGING_KEYS||e===$r.CONNECTING&&i?t.setHangUpTimeout(Zl,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),s!==t&&s||(e===$r.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!i?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===$r.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===$r.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===$r.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,s)=>{void 0!==s&&this.instances.delete(s);const i=!!this.currentCall;this.instances.set(e,t),void 0===s&&a.default.dispatchEvent("call_instance",{instance:t,hasCurrent:i})})),t}savePhonePhoneCall(e){return E.Z.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return ct.Z.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>_l(this,void 0,void 0,(function*(){return ct.Z.invokeCrypto("generate-dh",e)}))))}startCallInternal(e,t){this.log("p2pStartCallInternal",e,t);const s=n.default.getCachedFullUser(e);if(!s)return;const{video_calls_available:i}=s.pFlags,a=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});a.requestInputSource(!0,!(!t||!i),!1),a.overrideConnectionState($r.REQUESTING),a.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:Re.NM,date:(0,qo.Z)(!0),id:--this.tempId,participant_id:e,protocol:a.protocol,pFlags:{video:t||void 0}}),this.generateDh().then((s=>(a.dh=s,ct.Z.invokeApi("phone.requestCall",{user_id:E.Z.getUserInput(e),protocol:a.protocol,video:t&&i,random_id:(0,it.d)(32),g_a_hash:a.dh.g_a_hash})))).then((e=>{const t=this.savePhonePhoneCall(e);a.overrideConnectionState($r.PENDING),a.setPhoneCall(t),a.setHangUpTimeout(Zl,"phoneCallDiscardReasonHangup")}))}discardCall(e,t,s,i){return _l(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield ct.Z.invokeApi("phone.discardCall",{video:i,peer:this.getCallInput(e),duration:t,reason:{_:s},connection_id:"0"});ni.Z.processUpdateMessage(n)}))}};re.GO&&(re.GO.appCallsManager=Dl);const Fl=Dl;var Rl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Bl="chat",Ul=ce.IS_TOUCH_SUPPORTED?"touchstart":"mousemove",Nl=new class{constructor(){this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.onHashChange=()=>{const e=location.hash,t=e.split("?"),s=this.parseUriParams(e,t);if(this.log("hashchange",e,t[0],s),s.tgaddr){F.Z.replaceState();const{onclick:e}=Q.Z.wrapUrl(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else if("#/im"===t[0]){const e=s.p;let t=void 0!==s.post?f.Z.generateMessageId(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",a.default.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!a.default.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",a.default.settings.animationsEnabled),this.chatsSelectTabDebounced=dt((()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),ct.Z.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),a.default.settings.animationsEnabled?250:0,!1,!0),ae.Z.setLoop(a.default.settings.stickers.loop),I.Z.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();k.default.setTimeFormat(a.default.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>{const s=ro();if(this.canDrag()||s){if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,d.d)(e)}(0,he.nD)(e).then((e=>{if(e.length){if(s)return void s.addFiles(e);const i=this.chat.input;i.willAttachType=t||(g.has(e[0].type)?"media":"document"),new lo(this.chat,e,i.willAttachType)}}))}},ni.Z.attach(),Ft.Z.start(),this.log=(0,$.kg)("IM",$.v9.Log|$.v9.Warn|$.v9.Debug|$.v9.Error),this.backgroundPromises={},M.STATE_INIT.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg";this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(0),window.addEventListener("blur",(()=>{I.Z.checkAnimations(!0),this.offline=a.default.idle.isIDLE=!0,this.updateStatus(),clearInterval(this.updateStatusInterval),a.default.dispatchEvent("idle",a.default.idle.isIDLE),window.addEventListener("focus",(()=>{this.offline=a.default.idle.isIDLE=!1,this.updateStatus(),this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4),I.Z.checkAnimations(!1),a.default.dispatchEvent("idle",a.default.idle.isIDLE)}),{once:!0})})),window.addEventListener(Ul,(()=>{this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4),this.updateStatus(),this.offline=a.default.idle.isIDLE=!1,a.default.dispatchEvent("idle",a.default.idle.isIDLE)}),{once:!0,passive:!0}),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(v.ZP.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),F.Z.onHashChange=this.onHashChange,this.setSettings(),a.default.addEventListener("settings_updated",this.setSettings),(0,xs.ZP)((()=>{I.Z.setOnlyOnePlayableGroup("lock"),I.Z.checkAnimations(!0)}),(()=>{I.Z.setOnlyOnePlayableGroup(""),I.Z.checkAnimations(!1)})),this.applyCurrentTheme(),v.ZP.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(Ln)&&document.body.classList.contains($t)&&Yt.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)}));const e=dt((()=>{this.setBackground(this.lastBackgroundUrl,!1)}),200,!1,!0);v.ZP.addEventListener("resize",(()=>{e()})),a.default.addEventListener("history_focus",(e=>{let{peerId:t,threadId:s,mid:i,startParam:n}=e;s&&(s=f.Z.generateMessageId(s)),i&&(i=f.Z.generateMessageId(i)),this.setInnerPeer({peerId:t,lastMsgId:i,type:s?"discussion":void 0,threadId:s,startParam:n})})),a.default.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),a.default.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),a.default.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),a.default.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var s;const n=this.chat;if(!n||n.peerId!==e||a.default.overlaysActive||v.ZP.activeScreen===v._G.mobile&&1!==this.tabId)return;const o=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(s=null==o?void 0:o.action)||void 0===s?void 0:s._)){const t=o.action,s=n.bubbles.bubbles[f.Z.generateMessageId(o.action.msg_id)];if(s&&s.classList.contains("emoji-big")&&s.classList.contains("sticker")&&Pa(s,n.bubbles.scrollable.container)){const n=s.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,l.tH)(n)}),1e3*e.t)})),i.Z.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}})),a.default.addEventListener("instance_deactivated",(()=>{const e=new pt.Z("popup-instance-deactivated",void 0,{overlayClosable:!0}),t=document.createElement("div");t.classList.add("instance-deactivated-container"),e.container.replaceWith(t);const s=document.createElement("div");s.classList.add("header"),s.append((0,k.i18n)("Deactivated.Title"));const i=document.createElement("div");i.classList.add("subtitle"),i.append((0,k.i18n)("Deactivated.Subtitle")),t.append(s,i),document.body.classList.add("deactivated"),e.addEventListener("close",(()=>{document.body.classList.add("deactivated-backwards"),rr.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)})),e.show()})),a.default.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),Qn.Z.get("chatPositions").then((e=>{Qn.Z.setToCache("chatPositions",e||{})})),(Ea||Wo)&&(this.topbarCall=new Tl(dr.Z,o.Z,j.Z,c.Z,Fl)),Ea&&a.default.addEventListener("call_instance",(({instance:e})=>{const t=new tl({appCallsManager:Fl,appAvatarsManager:c.Z,appPeersManager:o.Z,instance:e});e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(a.default.dispatchEvent("call_accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Fl.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),rr.Z.activateInstance();const t=()=>{lr.default.setAuthorized(!0)};setInterval(t,ie.s2),t(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const s=t.href,i=t.cloneNode(!0);i.className="anchor-url",i.innerText=s,i.removeAttribute("onclick"),new gt("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[i],buttons:[{langKey:"Open",callback:()=>{i.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:s}=e;i.Z.sendText(this.chat.peerId,"/"+t+(s?"@"+s:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:Ta.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:Ta.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),Wo&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Ta.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>Rl(this,void 0,void 0,(function*(){let s;s="c"===e[0]?{_:Ta.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:Ta.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(s)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;"telegrampassport"===e.domain||(t=this.makeLink(Ta.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Ta.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Ta.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Ta.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(),this.attachKeydownListener()}get myId(){return a.default.myId}get chat(){return this.chats[this.chats.length-1]}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(a.default.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===v._G.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var s;const n=t.key;if(a.default.isOverlayActive||e.has(n))return;const o=t.target,r=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===o.tagName){if(!t.altKey||"ArrowUp"!==n&&"ArrowDown"!==n){if("ArrowUp"===n){if(r.input.editMsgId||!r.input.isInputEmpty())return;{const e=i.Z.getHistoryStorage(r.peerId,r.threadId).history.slice;if(e.isEnd(zn.D.Bottom)&&e.length){let s;for(const t of e){const e=r.getMessage(t);if((this.myId===r.peerId?e.fromId===this.myId:e.pFlags.out)&&i.Z.canEditMessage(r.getMessage(t),"text")){s=t;break}}s&&(r.input.initMessageEditing(s),(0,d.d)(t))}}}else if("ArrowDown"===n)return}else{const e=i.Z.dialogsStorage.getFolderDialogs(a.default.filterId,!0);let t;if(a.default.peerId){const s=e.findIndex((e=>e.peerId===a.default.peerId));-1!==s&&(t=e["ArrowUp"===n?s-1:s+1])}else"ArrowDown"===n&&(t=e[0]);t&&this.setPeer({peerId:t.peerId})}if((null===(s=null==r?void 0:r.input)||void 0===s?void 0:s.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==o.tagName&&!o.hasAttribute("contenteditable")&&!ce.IS_TOUCH_SUPPORTED&&(!v.ZP.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,no.Z)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return Rl(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case Ta.MESSAGE:{const t=e.post?f.Z.generateMessageId(+e.post):void 0,s=e.comment?f.Z.generateMessageId(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:s,startParam:e.start});break}case Ta.PRIVATE_POST:{const t=e.channel.toChatId(),s=t.toPeerId(!0);if(j.Z.getChat(t).deleted)try{yield j.Z.resolveChannel(t)}catch(e){throw lt({langPackKey:"LinkNotFound"}),e}const i=f.Z.generateMessageId(+e.post),n=e.thread?f.Z.generateMessageId(+e.thread):void 0;n?this.openThread(s,i,n):this.setInnerPeer({peerId:s,lastMsgId:i,threadId:n});break}case Ta.STICKER_SET:new Ki({id:e.set}).show();break;case Ta.JOIN_CHAT:ct.Z.invokeApi("messages.checkChatInvite",{hash:e.invite}).then((t=>{t.chat&&j.Z.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new xa(e.invite,t).show():this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&rt((0,k.i18n)("InviteExpired"))}));break;case Ta.VOICE_CHAT:Wo&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;default:this.log.warn("Not supported internal link:",e)}}))}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{(0,d.d)(null);const s=t.href;let i,n;e.noPathnameParams||(i=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(s));const a=e.callback({pathnameParams:i,uriParams:n},t);return void 0===a&&a}}parseUriParams(e,t=e.split("?")){const s={};return t[1]?(t[1].split("&").forEach((e=>{s[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),s):s}openUsername(e){const{userName:t,lastMsgId:s,threadId:i,commentId:n,startParam:a}=e;return E.Z.resolveUsername(t).then((e=>{const t="user"===e._,o=e.id.toPeerId(!t);return i?this.openThread(o,s,i):n?this.openComment(o,s,n):this.setInnerPeer({peerId:o,lastMsgId:s,startParam:a})}),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?lt({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&<({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e,t,s){return i.Z.wrapSingleMessage(e,s).then((()=>{const n=i.Z.getMessageByPeer(e,s);return"messageEmpty"===n._?t=void 0:i.Z.generateThreadServiceStartMessage(n),this.setInnerPeer({peerId:e,lastMsgId:t,threadId:s,type:"discussion"})}))}openComment(e,t,s){return i.Z.getDiscussionMessage(e,t).then((e=>this.openThread(e.peerId,s,e.mid)))}callUser(e,t){return Rl(this,void 0,void 0,(function*(){Fl.getCallByUserId(e)||((yield n.default.getProfile(e)).pFlags.phone_calls_private?on({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[new St.Z({peerId:e.toPeerId()}).element],button:{langKey:"OK",isCancel:!0}}):(yield this.discardCurrentCall(e.toPeerId()),Fl.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,s){return dr.Z.groupCall&&dr.Z.groupCall!==t?this.discardGroupCallConfirmation(e):Fl.currentCall&&Fl.currentCall!==s?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Rl(this,void 0,void 0,(function*(){const t=Fl.currentCall;t&&(yield on({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[new St.Z({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new St.Z({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Rl(this,void 0,void 0,(function*(){const t=dr.Z.groupCall;t&&(yield on({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new St.Z({peerId:t.chatId.toPeerId(!0)}).element,new St.Z({peerId:e}).element],button:{langKey:"OK"}}),dr.Z.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Rl(this,void 0,void 0,(function*(){const s=e.toChatId(),i=j.Z.hasRights(s,"manage_call");if(t&&"groupCallDiscarded"===(yield dr.Z.getGroupCallFull(t))._){if(!i)return void lt({langPackKey:"VoiceChat.Chat.Ended"});yield on({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}yield this.discardCurrentCall(e),(()=>{Rl(this,void 0,void 0,(function*(){const e=yield n.default.getChatFull(s);let t;if(e.call)t=dr.Z.saveGroupCall(e.call,s);else{if(!i)return;t=yield dr.Z.createGroupCall(s)}dr.Z.joinGroupCall(s,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=a.default.getTheme();if(t.background.slug){const s=M.AppStateManager.STATE_INIT.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,pe.Z)(s.background),this.setBackground("",!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=le.Z.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const s=this.chats.map((t=>t.setBackground(e)));return s[s.length-1].then((()=>{t&&a.default.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,s=t.scrollable.scrollTop,i=e.peerId+(e.threadId?"_"+e.threadId:""),n=Qn.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!Object.keys(t.bubbles).length)delete n[i],this.log("deleted chat position");else{const e={mids:(0,Xs.Z)(t.bubbles,"desc"),top:s};n[i]=e,this.log("saved chat position:",e)}Qn.Z.set({chatPositions:n},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),s=Qn.Z.getFromCache("chatPositions");return s&&s[t]}applyHighlightningColor(){let e;const t=a.default.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!ce.IS_TOUCH_SUPPORTED&&e&&(a.default.themeColor=function(e){return function(e){return Ui(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return Fi(i[0],i[1],i[2],s)}(e))}(e).slice(0,-2)}(e))}applyCurrentTheme(e,t,s){return this.applyHighlightningColor(),a.default.setTheme(),t&&(this.backgroundPromises[e]=Promise.resolve(t)),this.setCurrentBackground(void 0===s?!!e:s)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&or([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.default.settings.animationsEnabled&&!1!==t&&(0,xs.YW)((0,Kn.w)(400),400);const s=(0,_s.Z)(this.prevTab);(0,_s.Z)(e)>s&&F.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Gs.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),ce.IS_TOUCH_SUPPORTED||this.attachDragAndDropListeners(),this.markupTooltip=new sr(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>Rl(this,void 0,void 0,(function*(){if(l===s)return;const d=r.dataTransfer.types,c=d.contains?d.contains("Files"):d.indexOf("Files")>=0,h=ro();if(!c||!this.canDrag()&&!h)return void(n=0);const p=h?o:a,u=h?t:e;if(l&&!u.length){const e=yield(0,he.nD)(r,!0),t=c&&!e.length,s=e.filter((e=>g.has(e))).length;this.log("drag files",e),h?(h.appendDrops(p),(e.length||t)&&u.push(new ar(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),Nl.log("drop",e),Nl.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new ar(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),Nl.log("drop",e),Nl.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new ar(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),Nl.log("drop",e),Nl.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}(0,Jt.Z)(p,"is-visible",l,200,(()=>{l||(u.forEach((e=>{e.destroy()})),u.length=0)})),l?u.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",l),s=l}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{i(e,!0),(0,d.d)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&i(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||a.default.isOverlayActive||!e.canSend("send_media"))}selectTab(e,t){!1===t&&or([xn.sidebarEl,this.columnEl,Yt.sidebarEl]),document.body.classList.toggle(Ln,0===e);const s=this.tabId;this.log("selectTab",e,s);let i=a.default.settings.animationsEnabled?(0,De.d1)():Promise.resolve();if(-1!==s&&s!==e&&a.default.settings.animationsEnabled&&!1!==t){const e=100+(v.ZP.isMobile?250:200);i=(0,Kn.w)(e),(0,xs.YW)(i,e)}return this.tabId=e,(0,Gs.Z)(),v.ZP.isMobile&&2===s&&e<2&&document.body.classList.remove($t),-1!==s&&e>s&&(e<2||!F.Z.findItemByType("im"))&&F.Z.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}}),a.default.dispatchEvent("im_tab_change",e),i}updateStatus(){return this.myId?(E.Z.setUserStatus(this.myId,this.offline),ct.Z.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new er(this,j.Z,L.Z,ga,i.Z,o.Z,r.Z,n.default,ds.Z,E.Z,tr.Z,Qe.Z,ct.Z,xi.Z,Ye.Z,Qn.Z,Ft.Z,ea,f.Z,dr.Z,_t.Z);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,s,i){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&a.default.dispatchEvent("peer_changing",this.chat),i||(i=this.chats.splice(e,this.chats.length-e)),a.default.dispatchEvent("chat_changing",{from:n,to:this.chat});for(let e=0;e1&&i.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(this.chat.container,s),t){a.default.dispatchEvent("peer_changed",this.chat.peerId);const e=Yt.getTab(Yo);e&&e.close(),Yt.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(Yt.sharedMediaTab.loadSidebarMedia(!0),Yt.sharedMediaTab.fillProfileElements())}i.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{i.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var s;this.init&&(this.init(),this.init=null),null!==(s=e.peerId)&&void 0!==s||(e.peerId=Re.NM);const{peerId:i,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(i){if(o>0&&a.peerId&&a.peerId!==i){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===i)return void this.spliceChats(0,!0,!0,t);{const s=this.setPeer(e);return this.spliceChats(0,!1,!1,t),s}}}else{if(o>0)return void this.spliceChats(o,void 0,t);if(v.ZP.activeScreen===v._G.medium)return void this.selectTab(+!this.tabId,t)}if(i===a.peerId&&v.ZP.activeScreen<=v._G.medium&&document.body.classList.contains(Ln))return this.selectTab(1,t),!1;if(i||v.ZP.activeScreen!==v._G.mobile){const s=a.setPeer(i,n,e.startParam),o=(null==s?void 0:s.cached)?s.promise:Promise.resolve();i&&Promise.all([o,a.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(1,t)}),0)}))}return i?void 0:(this.selectTab(0,t),!1)}setInnerPeer(e){var t;const{peerId:s}=e;if(s===Re.NM||!s)return;const i=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex((e=>e.peerId===s&&e.type===i));if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const o=this.chat;let r=o;return o.inited&&(r=this.createNewChat()),i&&(r.setType(i),e.threadId&&(r.threadId=e.threadId)),a.default.dispatchEvent("chat_changing",{from:o,to:r}),this.setPeer(e)}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let s="peer-typing";switch(t.classList.add(s),t.dataset.action=e._,e._){case"sendMessageTypingAction":s+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=s+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":s+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":s+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":s+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=s+"-eye",t.append(e)}}return t.classList.add(s),t}getPeerTyping(e,t){if(!E.Z.isBot(e)){const s=n.default.getPeerTypings(e);if(!s||!s.length)return;const i=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=e.isUser()?a.private:s.length>1?a.multi:a.chat;let r=i.action;if(s.length>1){const e={};s.forEach((t=>{const s=t.action._;void 0===e[s]&&(e[s]=0),++e[s]})),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let d,c=t.firstElementChild;if(c?c.dataset.action!==r._&&c.replaceWith(this.getTypingElement(r)):(c=this.getTypingElement(r),t.prepend(c)),e.isAnyChat()&&(d=[new St.Z({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]),"sendMessageEmojiInteractionSeen"===r._){d?d.pop():d=[];const e=(0,Ze.Z)(Q.Z.wrapEmojiText(r.emoticon));d.push(e)}const h=(0,k.i18n)(l,d);return h.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(h):t.append(h),t}}getPeerStatus(e,t){var s;return Rl(this,void 0,void 0,(function*(){let i;if(e){if(e.isAnyChat()){let t=this.getPeerTyping(e);if(t)return t;const s=e.toChatId(),a=yield n.default.getChatFull(s);this.chat.log("chatInfo res:",a);const o=a.participants_count||a.participants&&a.participants.participants&&a.participants.participants.length||1;if(i=n.default.getChatMembersString(s),o<2)return i;const r=yield n.default.getOnlines(s);if(r>1){const e=document.createElement("span");e.append(...(0,k.join)([i,(0,k.i18n)("OnlineCount",[(0,ka.Z)(r)])],!1)),i=e}return i}{const n=E.Z.getUser(e);if(a.default.myId===e&&!t)return;if(n){if(i=E.Z.getUserStatusString(n.id),!E.Z.isBot(e)){let t=this.getPeerTyping(e);if(t||"userStatusOnline"!==(null===(s=n.status)||void 0===s?void 0:s._)||(t=document.createElement("span"),t.classList.add("online"),t.append(i)),t)return t}return i}}}}))}setPeerStatus(e,t,s,i,n,a){s&&(t.innerHTML=i?"‎":"");const o=t.querySelector(".peer-typing-container");o&&this.getPeerTyping(e,o)||this.getPeerStatus(e,a).then((e=>{n()&&(0,T.Z)(t,e||(i?"‎":""))}))}setChoosingStickerTyping(e){i.Z.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}};re.GO&&(re.GO.appImManager=Nl);const Ol=Nl;var Hl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class zl extends R.Z{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,d.d)(e),ce.IS_TOUCH_SUPPORTED)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const s=this.isZooming();let i=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];s&&n.push("media-viewer-movers"),n.find((e=>{try{if(i=(0,Me.Z)(t,e),i)return!0}catch(e){return!1}})),i&&(s||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(a.default.overlaysActive>1)return;const t=e.key;let s=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):s=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),s&&(0,d.d)(e)},this.onKeyUp=e=>{a.default.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(a.default.overlaysActive>1||(0,Me.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,d.d)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.log=(0,$.kg)("AMV"),this.preloader=new fe.Z,this.preloaderStreamable=new fe.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new X.lh,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const s=document.createElement("div");s.classList.add("media-viewer");const i=this.topbar=document.createElement("div");i.classList.add("media-viewer-topbar","media-viewer-appear");const n=document.createElement("div");n.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=N("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const o=document.createElement("div");this.author.avatarEl=new Yl,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const r=document.createElement("div");r.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=N(e,{noRipple:!0});this.buttons[e]=t,r.append(t)})),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=N("zoomout",{noRipple:!0}),(0,l.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=N("zoomin",{noRipple:!0}),(0,l.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new we({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),s.append(this.content.main),this.overlaysDiv.append(s),n.append(this.buttons["mobile-close"],this.author.container),i.append(n,r),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){(0,l.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,l.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,d.d)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,l.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},ce.IS_TOUCH_SUPPORTED&&new jt({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,Pe.rB)())return Math.abs(e)/Ct.Z.width>.2||e>125?(e<0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/Ct.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!(0,Me.Z)(e.target,"media-viewer-caption")})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const s=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(s),this.zoomElements.rangeSelector.setProgress(s),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const s=-1;this.zoomSwipeHandler=new jt({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(i,n)=>{[i,n]=[i*s,n*s],this.zoomSwipeX+=i-e,this.zoomSwipeY+=n-t,[e,t]=[i,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(s)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=Ie({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&(0,d.d)(e),this.setMoverAnimationPromise)return Promise.reject();F.Z.removeByType("media"),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer=void 0,this.zoomSwipeHandler&&(this.zoomSwipeHandler.removeListeners(),this.zoomSwipeHandler=void 0),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0}),s.finally((()=>{this.wholeDiv.remove(),a.default.isOverlayActive=!1,I.Z.checkAnimations(!1)})),s}setMoverToTarget(e,t=!1,s=0){return Hl(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const i=this.content.mover;t||(i.innerHTML="");const n=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(i);const o=0!==s,r=a.default.settings.animationsEnabled?o?350:200:0;let l,d;e&&(e instanceof Yl||e.classList.contains("grid-item")?(l=e,d=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=(0,Me.Z)(e,"attachment"),d=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=(0,Me.Z)(e,"profile-avatars-container"),d=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==d.left&&(e=l=d=void 0))),e||(e=this.content.media),d||(l=e.parentElement,d=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const s=Pa(l,(0,Me.Z)(l,"scrollable"),!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(l=(e=this.content.media).parentElement,d=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let p,u,g,m="";if(o?(p=1===s?Ct.Z.width:-h.width,u=h.top):(p=d.left,u=d.top),m+=`translate3d(${p}px,${u}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(i.firstElementChild&&i.firstElementChild.classList.contains("media-viewer-aspecter")){g=i.firstElementChild;const e=g.querySelector(".ckin__player");if(e){const t=e.firstElementChild;g.append(t),e.remove()}g.style.cssText||(i.classList.remove("active"),this.setFullAspect(g,h,d),i.offsetLeft,i.classList.add("active"))}else g=document.createElement("div"),g.classList.add("media-viewer-aspecter"),i.prepend(g);g.style.cssText=`width: ${d.width}px; height: ${d.height}px; transform: scale3d(${h.width/d.width}, ${h.height/d.height}, 1);`}i.style.width=h.width+"px",i.style.height=h.height+"px";const v=d.width/h.width,f=d.height/h.height;o||(m+=`scale3d(${v},${f},1) `);let b=window.getComputedStyle(l).getPropertyValue("border-radius");const y=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(b);if(b=y.map((e=>parseInt(e)/v+"px")).join(" "),o||(i.style.borderRadius=b),t&&1!==n){const e=Ct.Z.width/2-d.width/2,t=Ct.Z.height/2-d.height/2,s=d.left-e,i=d.top-t;this.moversContainer.style.transform=`matrix(${v}, 0, 0, ${f}, ${s}, ${i})`}else i.style.transform=m;let w;c&&(i.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,se.b)(),L={onAnimationEnd:C},I=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(I)})),t)return e instanceof SVGSVGElement&&(w=i.querySelector("path"),w&&this.sizeTailPath(w,h,v,r,!1,S,b)),e.classList.contains("media-viewer-media")&&i.classList.add("hiding"),this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0),setTimeout((()=>{i.style.borderRadius=b,i.firstElementChild&&(i.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{i.innerHTML="",i.classList.remove("moving","active","hiding"),i.style.cssText="display: none;",C.resolve()}),r),i.classList.remove("opening"),L;{let t,s;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const n=Array.from(e.querySelectorAll("img")).pop();n&&(t=new Image,s=n.src,i.append(t))}else if(e instanceof HTMLImageElement)t=new Image,s=e.src;else if(e instanceof HTMLVideoElement)t=document.createElement("video"),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,s=t+"-mv",{width:n,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+n),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${n} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,s)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,s));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,s,i,o)=>`translate(${t=2!=(t=+t)?n-2/v:2/v}, ${a}) scale(${+i/v}, ${+o/f})`)),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const s=b.split(" ").map((e=>parseInt(e)));e=S?nr(0,0,n-9/v,a,...s):nr(9/v,0,n-9/v,a,...s),w.setAttributeNS(null,"d",e)}const d=o.lastElementChild;d.setAttributeNS(null,"width",""+h.width),d.setAttributeNS(null,"height",""+h.height),i.prepend(o)}g&&(g.style.borderRadius=b,t&&g.append(t)),t=i.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),g||(t.style.width=h.width+"px",t.style.height=h.height+"px"),s&&(yield(0,rs.cj)(t,s))),i.style.display="",(0,De.T2)((()=>{i.classList.add(o?"moving":"active")}))}return i.classList.add("opening"),yield(0,De.d1)(),i.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(i.style.opacity=""),g&&this.setFullAspect(g,h,d),setTimeout((()=>{i.style.borderRadius="",i.firstElementChild&&(i.firstElementChild.style.borderRadius="")}),0),i.dataset.timeout=""+setTimeout((()=>{i.classList.remove("moving","opening"),g&&(i.querySelector("video"),i.classList.remove("active"),g.style.cssText="",i.offsetLeft),i.classList.add("center","no-transition"),i.classList.add("active"),delete i.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,v,r,!0,S,b),L}))}setFullAspect(e,t,s){const i=t.width/t.height;let{width:n,height:a}=s;i>0?n=a*i:a=n*i,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,s,i,n,a,o){const r=Date.now(),{width:l,height:d}=t;i/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=i?t/i:1;o>1&&(o=1),n&&(o=1-o);const p=c.map((e=>e*o));let u;u=a?nr(0,0,l-9/s*o,d,...p):nr(9/s*o,0,l,d,...p),e.setAttributeNS(null,"d",u),t{const a=t?-i.width:s;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,s){const i=e.tagName.toLowerCase()===s?e:e.querySelector(s);if(i&&!(0,Me.Z)(e,"document")){if((0,Me.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===s)return void(t.classList.contains("manual")&&t.click());t.remove()}}(0,rs.ZP)(i,t),i.classList.contains("thumbnail")&&i.parentElement.classList.contains("media-container-aspecter")&&i.classList.remove("thumbnail")}}setAuthorInfo(e,t){(0,T.Z)(this.author.date,(0,ie.OD)(t));const s=e.isPeerId();let i;s?i=new St.Z({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=Q.Z.wrapEmojiText(e),i.classList.add("peer-title")),(0,T.Z)(this.author.nameEl,i);let n=this.author.avatarEl;this.author.avatarEl=n.cloneNode(),s?this.author.avatarEl.removeAttribute("peer-title"):this.author.avatarEl.setAttribute("peer-title",""+e),this.author.avatarEl.setAttribute("peer",""+(e||Re.NM)),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,o=!1,l=[],c=[],h){return Hl(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const p="document"===e._,u=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(l,c,o),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,m=!n||n===g;m&&(n=g),this.target={element:n};const f=++this.tempId;if(g.firstElementChild&&(g.innerHTML=""),0!==i)this.moveTheMover(this.content.mover,1===i),this.setNewMover();else{a.default.isOverlayActive=!0,window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),ce.IS_TOUCH_SUPPORTED||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0});const e=document.getElementById("main-columns");this.pageEl.insertBefore(this.wholeDiv,e),this.wholeDiv.offsetLeft,this.wholeDiv.classList.add("active"),I.Z.checkAnimations(!0),ne.IS_MOBILE_SAFARI||F.Z.pushItem({type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}})}const b=this.content.mover,y=Ct.Z.width;let w=0;const S=Ct.Z.height;S<1e6&&!v.ZP.isMobile&&(w=120);const C=S-120-w;let M=Promise.resolve();const E=r.Z.setAttachmentSize(e,g,y,C,!v.ZP.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(m){const t=le.Z.getCacheContext(e,E.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.Z.getStrippedThumbIfNeeded(e,t,!0);i&&(M=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),g.append(s))}const P=!(!p||!e.supportsStreaming),T=P?this.preloaderStreamable:this.preloader;let k;if(u){const t=h&&"gif"!==e.type,s=document.createElement("video"),a=()=>this.setMoverToTarget(n,!1,i).then((({onAnimationEnd:i})=>{const a=b.firstElementChild&&b.firstElementChild.classList.contains("media-viewer-aspecter")?b.firstElementChild:b,o=b.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",(()=>{this.tempId!==f&&s.pause()})),s.addEventListener("error",(()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),T&&T.detach()}),{once:!0}),this.addEventListener("setMoverAfter",(()=>{s.src="",s.load()}),{once:!0}),ne.IS_SAFARI&&(s.autoplay=!0),"gif"===e.type?(s.muted=!0,s.autoplay=!0,s.loop=!0):e.duration<60&&(s.loop=!0),a.append(s);const r=new Promise((e=>{s.addEventListener("canplay",e,{once:!0})})),l=()=>{"gif"!==e.type&&(s.dataset.ckin="default",s.dataset.overlay="1",Promise.all([r,i]).then((()=>{this.tempId===f&&((this.videoPlayer=new xe({video:s,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.removeListeners(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){i.then((()=>{s.readyState{s.addEventListener("canplay",(()=>{T.detach(),s.parentElement.classList.remove("is-buffering")}),{once:!0})};s.addEventListener("waiting",(()=>{const t=s.networkState===s.NETWORK_LOADING,i=s.readyState{(0,d.d)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>{const o=le.Z.getCacheContext(e),r=P?Promise.resolve():L.Z.downloadDoc(e);return P||i.then((()=>{o.url||T.attach(b,!0,r)})),Promise.all([r,i]).then((()=>{if(this.tempId!==f)return void this.log.warn("media viewer changed video");const e=o.url;if(n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):(0,rs.ZP)(s,e),t){const e=ve.setSingleMedia(s,h);this.addEventListener("setMoverBefore",(()=>{e()}),{once:!0})}this.updateMediaSource(n,e,"video"),l()})),r}})}));k=M.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=le.Z.getCacheContext(e,E.type),i=p?L.Z.downloadDoc(e):r.Z.preloadPhoto(e,E);return t.then((()=>{s.url||this.preloader.attachPromise(i)})),Promise.all([t,i]).then((()=>{var e;if(this.tempId!==f)return void this.log.warn("media viewer changed photo");const t=s.url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(b,t,"img"),v.ZP.isMobile){const e=b.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const s=b.firstElementChild&&b.firstElementChild.classList.contains("media-viewer-aspecter")?b.firstElementChild:b,i="IMG"===(null===(e=s.firstElementChild)||void 0===e?void 0:e.tagName)?s.firstElementChild:null;if(!i||i.src!==t){let e=new Image;e.classList.add("thumbnail"),(0,rs.ZP)(e,t,(()=>{this.updateMediaSource(n,t,"img"),i&&(0,De.T2)((()=>{i.remove()})),s.append(e)}))}}})).catch((e=>{this.log.error(e),this.preloader.attach(b),this.preloader.setManual()})),i}})}));k=M.then(t)}return this.setMoverPromise=k.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}class Vl extends zl{constructor(){let e;super(new C({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.Z.getMediaFromMessage(e);if(a&&(!t||Vl.isMediaCompatibleForDocumentViewer(a)))return{element:null,mid:s,peerId:n}}}),["delete","forward"]),this.onPrevClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,-1)},this.onNextClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,1)},this.onDeleteClick=()=>{const e=this.target;new zs(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new Hs({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>{const{mid:t,peerId:s}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const i=this.searchContext.threadId,n=this.getMessageByPeer(s,t);this.close(e).then((()=>{if(v.ZP.isMobile){const e=Yt.getTab(qt);e&&e.close()}Ol.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:i?"discussion":void 0,threadId:i})}))}},this.onDownloadClick=()=>{const{peerId:e,mid:t}=this.target,s=this.getMessageByPeer(e,t);if(s.media.photo)r.Z.savePhotoFile(s.media.photo,Ol.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&L.Z.saveDocFile(e,Ol.chat.bubbles.lazyLoadQueue.queueId)}},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{v.ZP.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new P.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,l.fc)(this.buttons.delete,this.onDeleteClick);const s=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(s),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),(0,l.fc)(this.buttons.forward,this.onForwardClick),(0,l.fc)(this.author.container,this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const s=t.target.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,d.d)(t),this.close().then((()=>{(0,l.EN)(this.content.caption,e,{capture:!0}),t.target.click()})),!1}};(0,l.fc)(this.content.caption,e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?i.Z.getScheduledMessageByPeer(e,t):i.Z.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let s="";t&&(s=Q.Z.wrapRichText(t,{entities:e.totalEntities})),m(this.content.caption.firstElementChild,s),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,s=0,n=!1,a=[],o=[]){const r=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return l=this,d=void 0,h=function*(){if(this.setMoverPromise)return this.setMoverPromise;const l=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,c=i.Z.getMediaFromMessage(e),h="messageService"===e._||!i.Z.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach((e=>{e.classList.toggle("hide",h)})),this.wholeDiv.classList.toggle("no-forwards",h);const p=h;[this.buttons.download,this.btnMenuDownload.element].forEach((e=>{e.classList.toggle("hide",p)}));const u=i.Z.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach((e=>{e.classList.toggle("hide",!u)})),this.setCaption(e);const g=r._openMedia.call(this,c,e.date,d,s,t,n,a,o,e);return this.target.mid=l,this.target.peerId=e.peerId,g},new((c=void 0)||(c=Promise))((function(e,t){function s(e){try{n(h.next(e))}catch(e){t(e)}}function i(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(s,i)}n((h=h.apply(l,d||[])).next())}));var l,d,c,h}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||g.has(e.mime_type)}}class jl extends S{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var i;if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const n=(null==e?void 0:e.photoId)||(null===(i=this.current)||void 0===i?void 0:i.photoId);return r.Z.getUserPhotos(this.peerId,n,s).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}class Gl extends zl{constructor(e){super(new jl({peerId:e}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{r.Z.savePhotoFile(r.Z.getPhoto(this.target.photoId),Ol.chat.bubbles.lazyLoadQueue.queueId)},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,s=0,i,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return o=this,l=void 0,c=function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=r.Z.getPhoto(e),l=a._openMedia.call(this,o,o.date,this.peerId,s,t,!1,i,n);return this.target.photoId=o.id,l},new((d=void 0)||(d=Promise))((function(e,t){function s(e){try{n(c.next(e))}catch(e){t(e)}}function i(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(s,i)}n((c=c.apply(o,l||[])).next())}));var o,l,d,c}}var Kl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Wl=e=>{c.Z.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[peer="'+e+'"]')).forEach((e=>{e.update()}))};function ql(e,t,s,a,o,l){return Kl(this,void 0,void 0,(function*(){let d=yield n.default.getFullPhoto(t);if(!s()||!d)return;const c=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!a,n="inputMessagesFilterChatPhotos";if(!a&&(a=yield i.Z.getSearch({peerId:t,inputFilter:{_:n},maxId:0,limit:1}).then((e=>e.history[0])),!s()))return;if(a){a.action.photo.id!==d.id&&(e||(a=i.Z.generateFakeAvatarMessage(t,d)));const s=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new Vl).setSearchContext({peerId:t,inputFilter:{_:n}}).openMedia(a,c(),void 0,void 0,o?s(o):void 0,l?s(l):void 0)}}if(d){!(0,Wn.Z)(a)&&a&&(d=r.Z.getPhoto(a));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new Gl(t).openMedia(d.id,c(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.default.addEventListener("avatar_update",Wl),a.default.addEventListener("peer_title_edit",(e=>{c.Z.isAvatarCached(e)||Wl(e)}));const $l=new Map,Ql=new Set;class Yl extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}connectedCallback(){if(this.isDialog="1"===this.getAttribute("dialog"),""===this.getAttribute("clickable")){this.setAttribute("clickable","set");let e=!1;(0,l.fc)(this,(t=>Kl(this,void 0,void 0,(function*(){if((0,d.d)(t),e)return;const s=this.peerId;e=!0,yield ql(this,this.peerId,(()=>this.peerId===s)),e=!1}))))}}disconnectedCallback(){const e=$l.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||$l.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}static get observedAttributes(){return["peer","dialog","peer-title"]}attributeChangedCallback(e,t,s){if("peer"===e){const e=(s||"").toPeerId()||Re.NM;if(this.peerId===e)return;this.peerId=o.Z.getPeerMigratedTo(e)||e;const i=(t||"").toPeerId()||Re.NM;if(i){const e=$l.get(i);e&&(e.delete(this),e.size||$l.delete(i))}this.update()}else"peer-title"===e?this.peerTitle=s:"dialog"===e&&(this.isDialog="1"===s)}r(e=!1){const t=c.Z.putPhoto(this,this.peerId,this.isDialog,this.peerTitle,e,this.isBig),s=t?t.loadPromise:Promise.resolve();return this.loadPromises&&(t&&t.cached&&this.loadPromises.push(s),s.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!Ql.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=$l.get(this.peerId);return e||(e=new Set,$l.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(Ql.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}Ql.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally((()=>{this.addedToQueue=!1}));const s=$l.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);$l.delete(this.peerId);for(let t=0,s=e.length;t{let e=i.Z.getDialogOnly(this.selectedId);e&&i.Z.editPeerFolders([e.peerId],+!e.folder_id)},this.onPinClick=()=>{i.Z.toggleDialogPin(this.selectedId,this.filterId).catch((e=>{"PINNED_DIALOGS_TOO_MUCH"===e.type&&(this.filterId>=1?lt({langPackKey:"PinFolderLimitReached"}):new gt("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new sn(xn).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[(0,k.i18n)("Chats",[a.default.config.pinned_dialogs_count_max])]}).show())}))},this.onUnmuteClick=()=>{i.Z.togglePeerMute(this.selectedId,!1)},this.onMuteClick=()=>{new $o(this.selectedId)},this.onUnreadClick=()=>{const e=i.Z.getDialogOnly(this.selectedId);e&&(e.unread_count?(i.Z.readHistory(this.selectedId,e.top_message),i.Z.markDialogUnread(this.selectedId,!0)):i.Z.markDialogUnread(this.selectedId))},this.onDeleteClick=()=>{new At(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,ft.Z)(e.target,"LI")}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.filterId=pd.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=i.Z.getDialogOnly(this.selectedId),this.buttons.forEach((e=>{const t=e.verify();e.element.classList.toggle("hide",!t)})),this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,k.i18n)(o.Z.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),(0,J.oy)(e,this.element),(0,J.YP)(this.element,(()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0}))}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>!i.Z.isDialogUnread(this.dialog)},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>i.Z.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>{var e;return!(this.filterId>1?i.Z.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>{var e;return this.filterId>1?i.Z.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>this.selectedId!==a.default.myId&&!Ft.Z.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.default.myId&&Ft.Z.isPeerLocalMuted(this.dialog.peerId)},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==a.default.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==a.default.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Ce(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var Jl,ed;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(Jl||(Jl={}));class td{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{Sn.Z.get("dc").then((e=>{e||(e=wn.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.default.connectionStatus["NET-"+e],s=t&&t.status===Jl.Connected;this.connecting&&s&&ni.Z.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===Jl.TimedOut,this.connecting=!s,this.retryAt=t&&t.retryAt,re.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,T.Z)(this.statusEl,(0,k.i18n)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{const e=td.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>ct.Z.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,s=()=>{const s=Date.now();e.innerText=""+Math.round((t-s)/1e3),s>t&&clearInterval(i)},i=setInterval(s,1e3);s();const n=this.getA("ConnectionStatus.Reconnect",(()=>ct.Z.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");re.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,Jt.Z)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,re.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,$.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,U.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new fe.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),e.prepend(this.statusContainer),a.default.addEventListener("connection_status_change",(e=>{console.log(e),this.setConnectionStatus()})),a.default.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,re.ZP&&this.log("updating",this.updating),this.setState())})),a.default.addEventListener("state_synchronized",(e=>{re.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,re.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,td.CHANGE_STATE_DELAY+1e3)}getA(e,t){const s=document.createElement("a");return s.classList.add("force-reconnect"),s.append((0,k.i18n)(e)),(0,l.fc)(s,(e=>{(0,d.d)(e),t()})),s}}function sd(e,t,s,i,n,a,o,r){if("number"==typeof a)a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]||e[t]}e.beginPath(),e.moveTo(t+a.tl,s),e.lineTo(t+i-a.tr,s),e.quadraticCurveTo(t+i,s,t+i,s+a.tr),e.lineTo(t+i,s+n-a.br),e.quadraticCurveTo(t+i,s+n,t+i-a.br,s+n),e.lineTo(t+a.bl,s+n),e.quadraticCurveTo(t,s+n,t,s+n-a.bl),e.lineTo(t,s+a.tl),e.quadraticCurveTo(t,s,t+a.tl,s),e.closePath(),o&&e.fill(),r&&e.stroke()}td.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(ed||(ed={}));const id=window.devicePixelRatio,nd=20*id,ad=2.5*id,od=2*id,rd=1*id;var ld=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class dd extends Fs{constructor(e,t,s){super({getIndex:e=>i.Z.getDialogOnly(e.id)[this.indexKey],onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Zs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=hd.addListDialog({dialog:e.id,loadPromises:s,isBatch:t});return e.dom=i,(null==s?void 0:s.length)&&(e.loadPromises=s,Promise.all(s).finally((()=>{delete e.loadPromises}))),e},updateElementWith:De.TR}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class cd{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=(0,$.kg)("DIALOGS",$.v9.Log|$.v9.Error|$.v9.Warn|$.v9.Debug),this.contextMenu=new Xl,this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>{this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()},this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,s=e.parentElement.parentElement,i=e.parentElement.nextElementSibling,n=!!i.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;s.classList.add("with-contacts");const a=new Mn({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),E.Z.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const s=()=>{t&&a.container.classList.toggle("hide",!i.list.childElementCount),this.updateContactsLength(!0)},i=new Rs({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=Ct.Z.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach((e=>{i.add(e)})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),s=i.has(e);!s&&t?i.add(e):s&&!t&&i.delete(e)};const n=i.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,s()})),i.append(a.container)},this.verifyPeerIdForContacts=e=>e.isContact()&&!i.Z.getDialogOnly(e),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&(0,De.TR)((()=>{const e=performance.now(),t=this.scroll.scrollTop,s=this.chatList.firstElementChild,i=this.scroll.container.getBoundingClientRect(),n=s.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)})),this.setOffsets(),this.scroll.scrollTop=d.offsetTop-h,this.log("slice time",performance.now()-e)}))}),200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>this.scroll.loadedAll[e]?(this.loadContacts&&this.loadContacts(),Promise.resolve()):this.loadDialogsPromise?this.loadDialogsPromise:(this.log("onChatsScroll",e),this.loadDialogs(e)),this.chatsPreloader=(0,J.y7)(null,!0),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=dt(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),ce.IS_TOUCH_SUPPORTED&&Ns({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.allChatsIntlElement=new k.default.IntlElement({key:"FilterAllChatsShort"}),this.setFilterId(0),this.addFilter({id:this.filterId,title:"",titleEl:this.allChatsIntlElement.element,orderIndex:0}),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],a.default.addEventListener("state_cleared",(()=>{M.default.getState().then((e=>{this.loadedDialogsAtLeastOnce=!1,E.Z.clear(),j.Z.clear();const t=i.Z.filtersStorage.filters;for(const e in t)a.default.dispatchEvent("updateDialogFilter",{_:"updateDialogFilter",id:+e});i.Z.clear(),this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)}))}));const t=new P.v7(this.folders.menuScrollContainer);e.prepend(this.folders.menuScrollContainer);const s=(0,Y.X)(this.folders.menu,this.folders.container,((e,t)=>{e=+t.dataset.filterId||0,ne.IS_MOBILE_SAFARI||(e?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},F.Z.unshiftItem(this.filtersNavigationItem)):this.filtersNavigationItem&&(F.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),this.filterId!==e&&(this.sortedLists[e].clear(),this.setFilterId(e),this.onTabChange())}),(()=>{for(const e in this.sortedLists)+e!==this.filterId&&this.sortedLists[e].clear()}),void 0,t);this.folders.menu.firstElementChild.click(),i.Z.construct(),M.default.getState().then((e=>this.onStateLoaded(e))),v.ZP.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new td(this.chatsContainer),this.chatsContainer.append(e),setTimeout((()=>{ae.Z.loadLottieWorkers()}),200)}get chatList(){return this.sortedList.list}setFilterId(e){this.filterId=e,this.indexKey=i.Z.dialogsStorage?i.Z.dialogsStorage.getDialogIndexKey(this.filterId):"index",a.default.filterId=e}setOnlineStatus(e,t){const s="is-online",i=e.classList.contains(s);!i&&t&&e.classList.add(s),(0,Jt.Z)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove(s)},t&&!i?2:0)}initListeners(){a.default.addEventListener("user_update",(e=>{var t;const s=e.toPeerId(),i=this.getDialogDom(s);if(i&&!E.Z.isBot(e)&&s!==a.default.myId){const s="userStatusOnline"===(null===(t=E.Z.getUser(e).status)||void 0===t?void 0:t._);this.setOnlineStatus(i.avatarEl,s)}})),a.default.addEventListener("chat_update",(e=>{const t=e.toPeerId(!0),s=i.Z.getDialogOnly(t);s&&this.processDialogForCallStatus(s)})),a.default.addEventListener("folder_unread",(e=>{this.setFilterUnreadCount(e.id)})),a.default.addEventListener("contacts_update",(e=>{this.processContact&&this.processContact(e.toPeerId())})),a.default.addEventListener("dialog_flush",(({peerId:e})=>{const t=i.Z.getDialogOnly(e);t&&(this.setLastMessage(t,void 0,void 0,void 0,void 0,void 0,!0),this.validateDialogForFilter(t),this.setFiltersUnreadCount())})),a.default.addEventListener("dialogs_multiupdate",(e=>{for(const t in e){const s=e[t];this.updateDialog(s),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(s)}})),a.default.addEventListener("dialog_drop",(({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)})),a.default.addEventListener("dialog_unread",(({peerId:e})=>{const t=i.Z.getDialogOnly(e);t&&(this.setUnreadMessages(t),this.validateDialogForFilter(t))})),a.default.addEventListener("dialog_notify_settings",(e=>{this.validateDialogForFilter(e),this.setUnreadMessages(e),this.setFiltersUnreadCount()})),a.default.addEventListener("dialog_draft",(({dialog:e,drop:t,peerId:s})=>{t?this.sortedList.delete(s):this.updateDialog(e),this.processContact&&this.processContact(s)})),a.default.addEventListener("peer_changed",(e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] li[data-peer-id="${e}"]`)).forEach((e=>{this.setDialogActive(e,!0)}))})),a.default.addEventListener("filter_update",(e=>{if(this.filtersRendered[e.id]){if(e.id===this.filterId){const e=i.Z.dialogsStorage.getCachedDialogs(!0);this.validateListForFilter();for(let t=0,s=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange())})),a.default.addEventListener("filter_order",(e=>{const t=this.folders.menu;e.forEach((e=>{const s=i.Z.filtersStorage.getFilter(e),n=this.filtersRendered[e];this.sortedLists[e].indexKey=i.Z.dialogsStorage.getDialogIndexKey(e),Zs(n.menu,t,s.orderIndex),Zs(n.container,this.folders.container,s.orderIndex)})),this.indexKey=i.Z.dialogsStorage.getDialogIndexKey(this.filterId)})),a.default.addEventListener("peer_typings",(({peerId:e,typings:t})=>{const s=i.Z.getDialogOnly(e);s&&(t.length?this.setTyping(s):this.unsetTyping(s))}))}setDialogActive(e,t){const s=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return ld(this,void 0,void 0,(function*(){if(e.notifySettings)for(const t in e.notifySettings)(0,gs.Z)(t),Ft.Z.savePeerSettings({key:t,settings:e.notifySettings[t]});Ft.Z.getNotifyPeerTypeSettings(),this.initedListeners||(this.initListeners(),this.initedListeners=!0);const t=i.Z.filtersStorage.getDialogFilters().then((e=>{for(const t of e)this.addFilter(t)}));return e.filters&&Object.keys(e.filters).length&&(yield t,this.showFiltersPromise&&(yield this.showFiltersPromise)),M.default.storagesResults.dialogs.length&&xi.Z.addMissedDialogs(),this.onChatsScroll().then((()=>{i.Z.fillConversations()}))}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),s=this.getOffsetIndex("bottom");if(!t.index&&!s.index)return!0;const i=e[this.indexKey];return(!t.index||i<=t.index)&&(!s.index||i>=s.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessage(e,void 0,t,void 0,void 0,void 0,!0),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;const s=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!s)return;const n=i.Z.dialogsStorage.getFolder(e),a=0===e||!!n.dialogs.find((e=>(e.unread_count||e.pFlags.unread_mark)&&!Ft.Z.isPeerLocalMuted(e.peerId,!0)));s.classList.toggle("badge-gray",!a);const o=n.unreadDialogsCount;s.innerText=o?""+o:""}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}validateListForFilter(){const e=i.Z.filtersStorage.getFilter(this.filterId)||null;this.sortedList.getAll().forEach((t=>{const s=i.Z.getDialogOnly(t.id);this.testDialogForFilter(s,e)||this.deleteDialog(t.id)}))}validateDialogForFilter(e,t){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e,t)||this.deleteDialog(e.peerId))}testDialogForFilter(e,t=i.Z.filtersStorage.getFilter(this.filterId)){return!(!e||t&&!i.Z.filtersStorage.testDialogForFilter(e,t)||!t&&this.filterId!==e.folder_id)}generateScrollable(e,t){const s=new P.ZP(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+t,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new dd(e,i.Z.dialogsStorage?i.Z.dialogsStorage.getDialogIndexKey(t):"index",this.onListLengthChange);return this.scrollables[t]=s,this.sortedLists[t]=n,s}addFilter(e){if(this.filtersRendered[e.id])return;const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("span");i.classList.add("text-super"),e.titleEl?i.append(e.titleEl):i.innerHTML=Q.o.wrapEmojiText(e.title);const n=document.createElement("div");n.classList.add("badge","badge-20","badge-primary");const a=document.createElement("i");s.append(i,n,a),(0,ee.ripple)(t),t.append(s),Zs(t,this.folders.menu,e.orderIndex);const o=this.createChatList(),r=this.generateScrollable(o,e.id);r.container.classList.add("tabs-tab","chatlist-parts");const l=document.createElement("div");l.classList.add("chatlist-top");const d=document.createElement("div");d.classList.add("chatlist-bottom"),l.append(o),r.container.append(l,d);const c=r.container;Zs(r.container,this.folders.container,e.orderIndex),this.setListClickListener(o,null,!0),this.filtersRendered[e.id]={menu:t,container:c,unread:n,title:i},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise((e=>{window.setTimeout((()=>{const t=Object.keys(this.filtersRendered).length>1,s=!this.folders.menuScrollContainer.classList.contains("hide");t!==s&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!s&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0,e()}),0)}))),this.showFiltersPromise}loadDialogs(e){if(this.loadDialogsPromise)return this.loadDialogsPromise;const t=new Promise((s=>ld(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=Ct.Z.height/72*1.25|0,l=0;const{index:d}=this.getOffsetIndex(e);if(d)if("top"===e){const e=i.Z.dialogsStorage.getFolderDialogs(a,!0),t=e.findIndex((e=>e[o]<=d)),s=Math.max(0,t-r);r=t-s,l=e[s][o]+1}else l=d;try{const s=i.Z.getConversations("",l,r,a,!0);s.cached||n.childElementCount||n.parentElement.append(this.chatsPreloader);const d=yield s.promise;if(this.loadDialogsPromise!==t)return;if("bottom"===e?d.isEnd&&(this.scroll.loadedAll[e]=!0):d.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,d.dialogs.length){const t="top"===e?d.dialogs.slice().reverse():d.dialogs,s=[],n=[],a=e=>{n.push(e)};t.forEach((e=>{if(!i.Z.getDialogOnly(e.peerId))return;const t=this.sortedList.add(e.peerId,!0,a,!1);t.loadPromises&&s.push(...t.loadPromises)})),yield Promise.all(s).finally(),n.forEach((e=>e()))}else this.onListLengthChange();const c=d.dialogs["top"===e?0:d.dialogs.length-1];c&&(this.offsets[e]=c[o]),this.log.debug("getDialogs "+r+" dialogs by offset:",l,d,n.childElementCount),setTimeout((()=>{this.scroll.onScroll()}),0)}catch(e){this.log.error(e)}this.chatsPreloader.parentElement&&this.chatsPreloader.remove(),s()})))).finally((()=>{this.loadDialogsPromise=void 0}));return this.loadDialogsPromise=t}generateEmptyPlaceholder(e){const t="empty-placeholder",s=document.createElement("div");s.classList.add(t,t+"-"+e.classNameType);const i=document.createElement("div");i.classList.add(t+"-header"),(0,k._i18n)(i,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,k._i18n)(n,e.subtitle,e.subtitleArgs),s.append(i,n),{container:s,header:i,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let s=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const n=this.scroll.loadedAll.bottom&&!e.childElementCount;if(n&&s)return;if(!n)return void(s&&(t.classList.remove("with-placeholder"),s.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),s=a.container,s.prepend(function({emoji:e,width:t,height:s}){const i=document.createElement("div"),n=ds.Z.getAnimatedEmojiSticker(e);return n?Is({doc:n,div:i,loop:!1,play:!0,width:t,height:s,emoji:e}).then((()=>{})):i.classList.add("media-sticker-wrapper"),{container:i}}({emoji:"📂",width:128,height:128}).container);const e=(0,U.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,l.fc)(e,(()=>{new tn(xn).open(i.Z.filtersStorage.getFilter(this.filterId))})),s.append(e)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),s=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new k.default.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),(0,rs.cj)(e,"assets/img/EmptyChats.svg"),(0,De.AD)()]).then((([e])=>{s.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),s.prepend(e)}t.append(s),t.classList.add("with-placeholder"),t.dataset.placeholderType=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise:this.updateContactsLengthPromise=E.Z.getContacts().then((t=>{const s=this.emptyDialogsPlaceholderSubtitle;if(s){let e,i;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",i=[(0,k.i18n)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",i=[]),s.compareAndUpdate({key:e,args:i})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,s=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),s.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){const e=this.chatList,t=this.getDialogFromElement(e.firstElementChild),s=this.getDialogFromElement(e.lastElementChild),i=this.indexKey;this.offsets.top=t[i],this.offsets.bottom=s[i]}getDialogFromElement(e){return i.Z.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,s=!1,n=!1,a=!1){let o;const r=(a?Ol.setInnerPeer:Ol.setPeer).bind(Ol);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",(e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=(0,ft.Z)(s,"LI");if(i){if(n){const e=o===i;o&&!e&&o.classList.remove("active"),i&&(i.classList.add("active"),o=i,this.lastActiveElements.add(i))}if(i){t&&t();const e=i.dataset.peerId.toPeerId(),s=+i.dataset.mid||void 0;r({peerId:e,lastMsgId:s})}else r()}}),{capture:!0}),re.ZP&&e.addEventListener("dblclick",(e=>{const t=(0,ft.Z)(e.target,"LI");if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",i.Z.getDialogByPeerId(e))}})),s&&(0,J.Eo)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessage(e,t,s,n,l,d=!1,c=!1){if(!s&&!(s=this.getDialogDom(e.peerId)))return;let h;if(t||(e.draft&&"draftMessage"===e.draft._&&(h=e.draft),t=i.Z.getMessageByPeer(e.peerId,e.top_message)),"messageEmpty"===t._)return s.lastMessageSpan.innerHTML="",s.lastTimeSpan.innerHTML="",delete s.listEl.dataset.mid,void(c&&this.setUnreadMessages(e,s,d));const p=e.peerId,u=t&&i.Z.isRestricted(t);{let e;if(!t.deleted&&!h&&!u){const s=i.Z.getMediaFromMessage(t);if(s&&("photo"===s._||["video","gif"].includes(s.type))){const i=r.Z.choosePhotoSize(s,20,20);if("photoSizeEmpty"!==i._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),Ss({photo:s,message:t,container:e,withoutPreloader:!0,size:i,loadPromises:l}),"video"===s.type)){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}const d=!!e&&!!(null==t?void 0:t.message);let c;if(c=n&&t.message?i.Z.wrapMessageForReply(t,void 0,void 0,!1,n,d):h?i.Z.wrapMessageForReply(h):t.deleted?document.createDocumentFragment():i.Z.wrapMessageForReply(t,void 0,void 0,!1,void 0,d),e&&c.prepend(e),(0,T.Z)(s.lastMessageSpan,c),h){const e=document.createElement("b");e.classList.add("danger"),e.append((0,k.i18n)("Draft"),": "),s.lastMessageSpan.prepend(e)}else if(p.isAnyChat()&&p!==t.fromId&&!t.action){const e=o.Z.getPeer(t.fromId);if(e&&e.id){const i=document.createElement("b");e.id===a.default.myId?i.append((0,k.i18n)("FromYou")):i.append(new St.Z({peerId:t.fromId,onlyFirstName:!0}).element),i.append(": "),s.lastMessageSpan.prepend(i)}}}if(!t.deleted||h){const e=h?Math.max(h.date,t.date||0):t.date;(0,T.Z)(s.lastTimeSpan,(0,ie.zM)(new Date(1e3*e)))}else s.lastTimeSpan.textContent="";null!==c&&(c?this.setUnreadMessages(e,s,d):s.listEl.dataset.mid=t.mid)}setUnreadMessages(e,t=this.getDialogDom(e.peerId),s=!1){var n;if(!t)return;if(!s){const s=Ft.Z.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&(0,Jt.Z)(t.listEl,"is-muted",s,200)}let o;if("draftMessage"!==(null===(n=e.draft)||void 0===n?void 0:n._)){const t=i.Z.getMessageByPeer(e.peerId,e.top_message);!t.deleted&&t.pFlags.out&&t.peerId!==a.default.myId&&(o=t)}!function(e,t,s){let i;if((null==t?void 0:t.pFlags.out)&&(i=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!i)return void(e.textContent="");const n="tgico-"+i,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,o);const r=i.Z.filtersStorage.getFilter(this.filterId);let l;l=r?-1!==r.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const d=i.Z.isDialogUnread(e),c=l||d,h=(0,cs.Z)(t.unreadBadge);c&&!h&&t.subtitleEl.append(t.unreadBadge);const p=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),u=t.mentionsBadge&&(0,cs.Z)(t.mentionsBadge);p&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling)));const g=s?0:200;if((0,Jt.Z)(t.unreadBadge,"is-visible",c,g,c?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&(0,Jt.Z)(t.mentionsBadge,"is-visible",p,g,p?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},u?0:2),!c)return;l?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let m=!0,v=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",v=!0):d?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",m=!1),t.unreadBadge.classList.toggle("unread",m),t.unreadBadge.classList.toggle("mention",v)}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){if("object"!=typeof e){const t=i.Z.getDialogOnly(e);if(!t){const t=e||Re.NM;return{peerId:t,peer:o.Z.getOutputPeer(t),pFlags:{}}}return t}return e}setCallStatus(e,t){let{callIcon:s,listEl:i}=e;if(!s&&t){const{canvas:t,startAnimation:n}=e.callIcon=s=function(e=!1){const t=document.createElement("canvas");t.width=t.height=nd;const s=t.getContext("2d"),i=(nd-(3*od+2*ad))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=(r=(Date.now()-n)%1e3,-.5*(Math.cos(Math.PI*r/1e3)-1)+0);var r;s.clearRect(0,0,nd,nd),s.fillStyle=e&&!v.ZP.isMobile?gr.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=id,sd(s,i+e*od+e*ad,(nd-n)/2,od,n,rd,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,Ue.jt)(o),o()},setActive:t=>{e=t,o()}}}(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&(0,Jt.Z)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){const t=this.getDialog(e.dialog);e.autonomous=!1;const s=this.addDialogNew(e);if(s){const{peerId:i}=t;Ft.Z.isPeerLocalMuted(i,!0)&&s.dom.listEl.classList.add("is-muted"),i.isUser()||this.processDialogForCallStatus(t,s.dom),this.setLastMessage(t,void 0,s.dom,void 0,e.loadPromises,e.isBatch,!0)}return s}processDialogForCallStatus(e,t){if(!Wo)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const s=j.Z.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!s.pFlags.call_active||!s.pFlags.call_not_empty))}addDialogAndSetLastMessage(e){const{peerId:t,message:s,query:n}=e,a=hd.addDialogNew(Object.assign(Object.assign(Object.assign({},e),i.Z.getMessageSenderPeerIdOrName(s)),{dialog:this.getDialog(t)}));return this.setLastMessage(a.dialog,s,a.dom,n),s.peerId!==t&&(a.dom.listEl.dataset.peerId=""+s.peerId),a}addDialogNew(e){return this.addDialog(e.dialog,e.container,e.drawStatus,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName)}addDialog(e,t,s=!0,i=!0,n=!1,r=!0,l=!0,d=54,c=!!t,h,p,u){var g,m,v;const f=this.getDialog(e),b=f.peerId,y=new Yl;y.loadPromises=p,y.lazyLoadQueue=h,y.setAttribute("dialog",r?"1":"0"),void 0!==u&&y.setAttribute("peer-title",u),y.setAttribute("peer",""+b),y.classList.add("dialog-avatar","avatar-"+d),s&&b!==a.default.myId&&b.isUser()&&"userStatusOnline"===(null===(g=E.Z.getUser(b).status)||void 0===g?void 0:g._)&&this.setOnlineStatus(y,!0);const w=document.createElement("div");w.classList.add("user-caption");const S=document.createElement("span");S.classList.add("user-title");const C=new St.Z({peerId:b,fromName:u,dialog:r,onlyFirstName:n,plainText:!1});S.append(C.element),S.classList.add("tgico");const L=o.Z.getPeer(b);(null===(m=null==L?void 0:L.pFlags)||void 0===m?void 0:m.verified)&&S.append(Ot());const I=document.createElement("span");I.classList.add("user-last-message"),I.setAttribute("dir","auto");const M=document.createElement("li");M.classList.add("chatlist-chat"),i&&(0,ee.ripple)(M),M.append(y,w),M.dataset.peerId=""+b;const P=document.createElement("span");P.classList.add("message-status","sending-status");const T=document.createElement("span");T.classList.add("message-time");const k=document.createElement("div");k.className="dialog-subtitle-badge badge badge-24";const x=document.createElement("p");x.classList.add("dialog-title");const A=document.createElement("span");A.classList.add("dialog-title-details"),A.append(P,T),x.append(S,A);const _=document.createElement("p");_.classList.add("dialog-subtitle"),_.append(I),w.append(x,_);const Z={avatarEl:y,captionDiv:w,titleSpan:C.element,titleSpanContainer:S,statusSpan:P,lastTimeSpan:T,unreadBadge:k,lastMessageSpan:I,containerEl:M,listEl:M,subtitleEl:_};return t&&t[l?"append":"prepend"](M),c||(M.dialogDom=Z,(null===(v=Ol.chat)||void 0===v?void 0:v.peerId)===b&&this.setDialogActive(M,!0)),{dom:Z,dialog:f}}setTyping(e){const t=this.getDialogDom(e.peerId);if(!t)return;const s=t.lastMessageSpan.querySelector(".peer-typing-container"),i=Ol.getPeerTyping(e.peerId,s);!s&&i&&((0,T.Z)(t.lastMessageSpan,i),t.lastMessageSpan.classList.add("user-typing"))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessage(e,null,t,void 0,void 0,void 0,null))}}const hd=new cd;re.GO.appDialogsManager=hd;const pd=hd},634:(e,t,s)=>{"use strict";s.d(t,{Z:()=>o});var i=s(410),n=s(9518);const a=new class{getState(){return n.Z.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let s,i;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};s=e.currentPassword?n.Z.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=t.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,i=e.newPassword?n.Z.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([s,i]).then((e=>(a.password=e[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=e[1],n.Z.invokeApi("account.updatePasswordSettings",a))))}))}check(e,t,s={}){return n.Z.invokeCrypto("computeSRP",e,t,!1).then((e=>n.Z.invokeApi("auth.checkPassword",{password:e},s).then((e=>("auth.authorization"===e._&&n.Z.setUser(e.user),e)))))}confirmPasswordEmail(e){return n.Z.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.Z.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.Z.invokeApi("account.cancelPasswordEmail")}};i.GO.passwordManager=a;const o=a},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(i,n,function(t){return e[t]}.bind(null,n));return i},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";(function(t){var s=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return s&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],s=0;s{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,s)=>{var i=s=>{switch(s.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=s.data.samplePosition,e(s.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,s)=>{var i=s=>{"flushed"===s.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var s=i=>{"done"===i.data.message&&(e.removeEventListener("message",s),t())};e.addEventListener("message",s),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,s){return e.set(s,t),t+s.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,s(1))},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s}])}}]); -//# sourceMappingURL=664.22c6afb6ed739f8b3773.chunk.js.map \ No newline at end of file diff --git a/public/664.22c6afb6ed739f8b3773.chunk.js.map b/public/664.22c6afb6ed739f8b3773.chunk.js.map deleted file mode 100644 index ddf38c64..00000000 --- a/public/664.22c6afb6ed739f8b3773.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"664.22c6afb6ed739f8b3773.chunk.js","mappings":"yHAQe,MAAMA,UAAuB,IAC1CC,YAAYC,GAIVC,MAAM,OAAD,QACHC,WAAW,GACRF,IAGL,MAAMG,EAAQC,KAAKD,MACnBA,EAAME,KAAO,MACbF,EAAMG,aAAa,WAAY,IAC/BH,EAAMI,aAAe,MAErB,IAAIC,EAAa,EACjBJ,KAAKD,MAAMM,iBAAiB,SAAUC,IACpCN,KAAKD,MAAMQ,UAAUC,OAAO,SAC5BR,KAAKS,WAEL,MAAMC,EAAQV,KAAKU,MAAMC,QAAQ,MAAO,IAAIC,MAAM,EAAGhB,EAAQiB,QAC7Db,KAAKc,iBAAiBJ,GAEtB,MAAMG,EAASb,KAAKU,MAAMG,OAC1B,GAAGA,IAAWjB,EAAQiB,OACpBjB,EAAQmB,OAAOf,KAAKU,YACf,GAAGG,IAAWT,EACnB,OAGFA,EAAaS,Q,2DC5BJ,MAAMG,EAMnBrB,YAAsBsB,EAAkDC,GAAlD,KAAAD,mBAAAA,EAAkD,KAAAC,KAAAA,EAHjE,KAAAC,UAAY,EAIjBnB,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,yBAGxBC,OACL,OAAGxB,KAAKyB,YAAoBzB,KAAKyB,YAC1BzB,KAAKyB,YAAc,yBAAkC,CAC1DL,UAAWpB,KAAKoB,UAChBM,MAAM,EACNC,UAAU,EACVC,MAAO5B,KAAKkB,KACZW,OAAQ7B,KAAKkB,KACbY,SAAS,GAER,4BAA4BC,MAAKC,IAElChC,KAAKiC,UAAYD,EACjBhC,KAAKiC,UAAU5B,iBAAiB,cAAc6B,KAGX,IAA7BlC,KAAKiC,UAAUE,WAAmBD,GAAgBlC,KAAKmB,YAC1B,IAA9BnB,KAAKiC,UAAUE,WAAoBD,GAAgBlC,KAAKmB,aACvDnB,KAAKiC,UAAUG,SAAS,GACxBpC,KAAKiC,UAAUI,YAIrBrC,KAAKiB,mBAAmBqB,4BAA8B,KACjDtC,KAAKiB,mBAAmBsB,iBACzBvC,KAAKiC,UAAUO,aAAa,GAC5BxC,KAAKiC,UAAUQ,SAAW,EAC1BzC,KAAKmB,UAAY,GACjBnB,KAAKiC,UAAUS,SAEf1C,KAAKiC,UAAUO,cAAc,GAC7BxC,KAAKiC,UAAUQ,SAAW,GAC1BzC,KAAKmB,UAAY,EACjBnB,KAAKiC,UAAUS,SAIZ,sBAA+BV,MAInCxB,SACFR,KAAKiC,WACNjC,KAAKiC,UAAUzB,Y,2DCtDN,MAAMmC,EAWnBhD,YAAsBiD,EAAkC1B,GAAlC,KAAA0B,WAAAA,EAAkC,KAAA1B,KAAAA,EAR9C,KAAA2B,IAAM,GACN,KAAA1B,UAAY,EAQpBnB,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,yBAE7B,MAAMxB,EAAQ6C,EAAW7C,MAEzBA,EAAMM,iBAAiB,QAAQ,KAC7BL,KAAK8C,cAAc,MAGrB/C,EAAMM,iBAAiB,SAAUC,IAC/BN,KAAK8C,cAAcF,EAAWlC,MAAMG,WAUjCiC,cAAcjC,GACnB,IAAIb,KAAKiC,UAAW,OAGpB,IAAIc,GADJlC,EAASmC,KAAKC,IAAIpC,EAAQ,MAGxBkC,EAAQC,KAAKE,MAAMF,KAAKC,IAAIjD,KAAK6C,IAAKhC,IAAW,IAAMb,KAAK6C,KAAO,OAEhE7C,KAAKmD,gBACNnD,KAAKmD,cAAcC,MAAK,GACxBpD,KAAKmD,cAAcE,OAAOC,MAAMC,QAAU,QAG5CvD,KAAKiC,UAAUoB,OAAOC,MAAMC,QAAU,IAYtCR,EAAQ,EAIV,MAAMZ,EAAYnC,KAAKmB,UAAY4B,GAAS,EAAI,EAGhD/C,KAAKiC,UAAUO,aAAaL,GACN,IAAnBnC,KAAKmB,WAA6B,IAAV4B,GACzB/C,KAAKiC,UAAUG,SAAS,GAI1BpC,KAAKmB,UAAY4B,EAEjB/C,KAAKiC,UAAUS,OAMVlB,OACL,OAAGxB,KAAKyB,YAAoBzB,KAAKyB,YAC1BzB,KAAKyB,YAAc+B,QAAQC,IAAI,CACpC,yBAAkC,CAChCrC,UAAWpB,KAAKoB,UAChBM,MAAM,EACNC,UAAU,EACVC,MAAO5B,KAAKkB,KACZW,OAAQ7B,KAAKkB,MACZ,4BAA4Ba,MAAKE,IAClCjC,KAAKmD,cAAgBlB,EAGjBjC,KAAK4C,WAAWlC,MAAMG,QACxBoB,EAAUS,OAGL,sBAA+BT,MAGxC,yBAAkC,CAChCb,UAAWpB,KAAKoB,UAChBM,MAAM,EACNC,UAAU,EACVC,MAAO5B,KAAKkB,KACZW,OAAQ7B,KAAKkB,MACZ,gCAAgCa,MAAKC,IACtChC,KAAKiC,UAAYD,EAEbhC,KAAK4C,WAAWlC,MAAMG,SACxBb,KAAKiC,UAAUoB,OAAOC,MAAMC,QAAU,QAGxCvD,KAAKiC,UAAU5B,iBAAiB,cAAc6B,KAIX,IAA7BlC,KAAKiC,UAAUE,WAAmBD,GAAgBlC,KAAKmB,YAC1B,IAA9BnB,KAAKiC,UAAUE,WAAoBD,GAAgBlC,KAAKmB,aACzDnB,KAAKiC,UAAUG,SAAS,GACxBpC,KAAKiC,UAAUI,SAGG,IAAjBH,GAAyC,IAAnBlC,KAAKmB,WAGzBnB,KAAKmD,gBACNnD,KAAKmD,cAAcE,OAAOC,MAAMC,QAAU,GAC1CvD,KAAKmD,cAAcT,OACnB1C,KAAKiC,UAAUoB,OAAOC,MAAMC,QAAU,WAMrC,sBAA+BvB,QAKrCxB,SACFR,KAAKiC,WAAWjC,KAAKiC,UAAUzB,SAC/BR,KAAKmD,eAAenD,KAAKmD,cAAc3C,Y,oEC5I/B,MAAMkD,UAA2B,IAK9C/D,YAAYC,EAA6B,IACvCC,MAAM,OAAD,QACHC,WAAW,GACRF,IAPA,KAAA2C,iBAAkB,EAyClB,KAAAoB,kBAAqBrD,KAC1B,OAAYA,GACZN,KAAKuC,iBAAmBvC,KAAKuC,gBAE7BvC,KAAK4D,cAAcrD,UAAUsD,OAAO,aAAc7D,KAAKuC,iBACtDvC,KAAKD,MAA2BE,KAAOD,KAAKuC,gBAAkB,OAAS,WACxEvC,KAAKsC,6BAA+BtC,KAAKsC,+BArCzC,MAAMvC,EAAQC,KAAKD,MACnBA,EAAME,KAAO,WACbF,EAAMG,aAAa,WAAY,IAC/BH,EAAM+D,KAAO,qBACb/D,EAAMI,aAAe,MAUrB,MAAM4D,EAAW1C,SAASC,cAAc,SACxCyC,EAASxD,UAAUgB,IAAI,YACvBwC,EAASC,UAAY,EACrBD,EAAS9D,KAAO,WAChBF,EAAMkE,cAAcC,QAAQH,GAC5BhE,EAAMkE,cAAcE,aAAaJ,EAASK,YAAarE,EAAMsE,aAE7D,MAAMT,EAAgB5D,KAAK4D,cAAgBvC,SAASC,cAAc,QAClEsC,EAAcrD,UAAUgB,IAAI,iBAAkB,SAE9CvB,KAAKoB,UAAUb,UAAUgB,IAAI,wBAC7BvB,KAAKoB,UAAUkD,OAAOV,GAEtBA,EAAcvD,iBAAiB,QAASL,KAAK2D,mBAC7CC,EAAcvD,iBAAiB,WAAYL,KAAK2D,sB,4BCjDrC,SAASY,KAAiBC,GACvC,MAAM3D,EAAS2D,EAAKC,QAAO,CAACC,EAAKC,IAAMD,GAAQC,EAAkBC,YAAeD,EAAiB9D,SAAS,GAEpGgE,EAAM,IAAIC,WAAWjE,GAE3B,IAAIT,EAAa,EAMjB,OALAoE,EAAKO,SAAQC,IACXH,EAAII,IAAID,aAAaE,YAAc,IAAIJ,WAAWE,GAAKA,EAAG5E,GAC1DA,GAAe4E,EAAkBJ,YAAeI,EAAiBnE,UAG5DgE,E,8CCXM,SAASM,EAASC,EAA+BC,GAC9D,MAAMC,EAAMF,EAAOvE,OACnB,GAAGyE,IAAQD,EAAOxE,OAChB,OAAO,EAGT,IAAI,IAAI0E,EAAI,EAAGA,EAAID,IAAOC,EACxB,GAAGH,EAAOG,KAAOF,EAAOE,GACtB,OAAO,EAIX,OAAO,E,8MCTT,MAAMC,EAAM,IAAI,KAA4BC,OAAO,IAAI,MAIvD,EAFmC,IAAIC,IAAIF,GCC5B,SAASG,EAAaC,EAAeC,GAClDD,EAAK1F,aAAa,MAAO,QACzB0F,EAAKE,UAAYD,E,kCCEJ,SAASE,EAAyBrF,IAM/C,EAAAsF,EAAA,GAAetF,EAAMuF,SAAS,CAACC,EAASC,EAAKX,KACrCU,EAAmCE,OAAoDC,QAC3Fb,EAAIc,OAAOH,EAAK,QACGI,IAAhB7F,EAAM8F,SACL9F,EAAM8F,U,cCDD,MAAMC,EAoBnB9G,YAAYC,GAlBL,KAAA8G,SAAgB,GAChB,KAAAC,KAAY,GAEZ,KAAAC,SAAU,EAIP,KAAAC,UAAY,GACZ,KAAAC,aAAe,GAKf,KAAAC,aAAc,EACd,KAAAC,eAAgB,GAKxB,EAAAC,EAAA,GAAWjH,KAAMJ,GAGZsH,WAAWR,EAAeC,EAAWC,GAC1C5G,KAAK0G,SAAWA,EAChB1G,KAAK2G,KAAOA,EACZ3G,KAAK4G,QAAUA,EAGNO,YACT,YAAsBZ,IAAfvG,KAAKwG,MAAsBxG,KAAK0G,SAAS7F,QAAU,EAcrDuG,MAAMC,GAAY,GACvBrH,KAAKsH,aAAUf,EACfvG,KAAK0G,SAAW,GAChB1G,KAAK2G,KAAO,GACZ3G,KAAK+G,YAAc/G,KAAKgH,cAAgBK,EACxCrH,KAAKuH,cAAgBvH,KAAKwH,gBAAkB,KAGvCC,GAAG5G,EAAgB6G,GAAe,GACvC,IAAIC,EAAYC,EAChB,GAAG/G,EAAS,EAAG,CAGb,GAFA8G,EAAQ3H,KAAK2G,KAAKL,OAAO,EAAGzF,GAC5B+G,EAAOD,EAAME,OACTD,EACF,OAGF5H,KAAK0G,SAASoB,KAAK9H,KAAKsH,WAAYK,OAC/B,CAGL,GAFAA,EAAQ3H,KAAK0G,SAASJ,OAAOtG,KAAK0G,SAAS7F,OAASA,GAASA,GAC7D+G,EAAOD,EAAMI,SACTH,EACF,OAGF5H,KAAK2G,KAAKqB,WAAWL,EAAO3H,KAAKsH,SAanC,OAVGtH,KAAK2G,KAAK9F,OAASb,KAAK8G,cACzB9G,KAAKwB,MAAMxB,KAAK4G,SAGf5G,KAAK0G,SAAS7F,OAASb,KAAK8G,cAC7B9G,KAAKwB,KAAKxB,KAAK4G,SAGjB5G,KAAKsH,QAAUM,EACfF,GAAgB1H,KAAKiI,QAAUjI,KAAKiI,OAAOL,EAAM/G,EAAS,GACnDb,KAAKsH,QAIP9F,KAAK0G,GACV,GAAGA,GAASlI,KAAKgH,cAAe,OAAOxD,QAAQ2E,UAC1C,IAAID,GAASlI,KAAK+G,YAAa,OAAOvD,QAAQ2E,UAEnD,GAAGD,GAASlI,KAAKwH,gBAAiB,OAAOxH,KAAKwH,gBACzC,IAAIU,GAASlI,KAAKuH,cAAe,OAAOvH,KAAKuH,cAElD,IAAIa,EAEFA,EADCF,EACQlI,KAAK4G,QAAU5G,KAAK0G,SAAS,GAAK1G,KAAK2G,KAAK3G,KAAK2G,KAAK9F,OAAS,GAE/Db,KAAK4G,QAAU5G,KAAK2G,KAAK3G,KAAK2G,KAAK9F,OAAS,GAAKb,KAAK0G,SAAS,GAG1E,MAAM2B,EAAUrI,KAAKsI,SAASF,EAAQF,EAAOlI,KAAK6G,WAAW9E,MAAKwG,IAC5DL,GAASlI,KAAKwH,kBAAoBa,IAAcH,GAASlI,KAAKuH,gBAAkBc,IAIjFE,EAAOZ,MAAM9G,OAASb,KAAK6G,YACzBqB,EAAOlI,KAAKgH,eAAgB,EAC1BhH,KAAK+G,aAAc,QAGRR,IAAfvG,KAAKwG,QACNxG,KAAKwG,MAAQ+B,EAAO/B,OAAS+B,EAAOZ,MAAM9G,SAG7BqH,EAAQK,EAAOZ,MAAM5C,QAAQyD,KAAKD,EAAOZ,OAAS3B,EAAA,OAAoB,KAAMuC,EAAOZ,SAC1FC,IACN,MAAMa,EAAYzI,KAAK0I,YAAc1I,KAAK0I,YAAYd,GAAQA,EAE1Da,IAEDP,EACElI,KAAK4G,QAAS5G,KAAK0G,SAASsB,QAAQS,GAClCzI,KAAK2G,KAAKmB,KAAKW,GAEjBzI,KAAK4G,QAAS5G,KAAK2G,KAAKmB,KAAKW,GAC3BzI,KAAK0G,SAASsB,QAAQS,OAI/BzI,KAAK2I,cAAgB3I,KAAK2I,mBACzB,SAAU5G,MAAK,KACbmG,EAAOlI,KAAKwH,gBAAkB,KAC5BxH,KAAKuH,cAAgB,QAM5B,OAHGW,EAAOlI,KAAKwH,gBAAkBa,EAC5BrI,KAAKuH,cAAgBc,EAEnBA,GC9II,MAAMO,UAAqEnC,EAIxF9G,YAAYC,EAAiG,IAC3GC,MAAM,OAAD,wBACAD,GAAO,CACV0I,SAAU,CAACF,EAAQF,EAAOrB,K,MACxB,MAAMgC,EAAYX,EAAQ,EAAIrB,EAC9B,IAAIiC,EAAoB,QAAZ,EAAA9I,KAAKsH,eAAO,eAAEyB,IAK1B,OAHGX,IAAQU,EAAQV,EAAOW,KACtBb,IAAOY,EAAQE,EAAA,qBAAyCF,EAAO,IAE5DG,EAAA,YAA6B,OAAD,wBAC9BjJ,KAAKkJ,eAAa,CACrBC,OAAQnJ,KAAKkJ,cAAcC,SAAUf,MAAAA,OAAM,EAANA,EAAQe,QAC7CL,MAAAA,EACAM,MAAOP,EAAY,EAAIhC,EACvBgC,UAAAA,KACC9G,MAAKrB,IAKkC,kCAArCV,KAAKkJ,cAAcG,YAAYC,GAChCvD,EAAyBrF,GAGxBA,EAAM6I,YACPvJ,KAAKkJ,cAAcM,SAAW9I,EAAM6I,WAG/B,CAAC/C,MAAO9F,EAAM8F,MAAOmB,MAAOjH,EAAMuF,aAG7CyC,YAAcxC,IAEZ,GADiBlG,KAAKyJ,WAAW,CAACvD,EAAQ6C,MAC7BlI,OAIb,OAAOjB,EAAQ8I,YAAYxC,OAiBvB,KAAAwD,gBAAkB,EAAEP,OAAAA,EAAQQ,KAAAA,MACpC,MAAMC,EAAmBhC,GAAeA,EAAKuB,SAAWA,GAAUQ,EAAKE,IAAIjC,EAAKmB,KAC1Ee,EAAS,CAAClC,EAAYzB,EAAaX,KACpCoE,EAAgBhC,IACjBpC,EAAIc,OAAOH,EAAK,KAIpB,EAAAH,EAAA,GAAehG,KAAK0G,SAAUoD,IAC9B,EAAA9D,EAAA,GAAehG,KAAK2G,KAAMmD,GAEvB9J,KAAKsH,SAAWsC,EAAgB5J,KAAKsH,UAKzBtH,KAAK+J,WAChB/J,KAAK+J,aAKD,KAAAC,qBAAwBC,IAGhC,QAAmC1D,IAAhCvG,KAAKkJ,cAAcgB,SACpB,OAIF,IAAIlK,KAAK+G,aAAe/G,KAAKuH,cAC3B,OAGF,MAAM4C,EAAOF,EAAIjK,KAAKkJ,cAAcC,QACpC,IAAIgB,EACF,OAGF,MAAMC,EAASC,MAAMC,KAAKH,GAAMI,MAAK,CAACC,EAAGxF,IAAMwF,EAAIxF,IAE7CyF,EADWzK,KAAKyJ,WAAWW,GACRM,KAAIxE,GAAWlG,KAAK0I,YAAYxC,KAAU4D,OAAOa,SACvEF,EAAQ5J,QACTb,KAAK2G,KAAKmB,QAAQ2C,IAIZ,KAAAG,cAAgB,EAAE1E,QAAAA,MAC1BlG,KAAKgK,qBAAqB,CACxB,CAAC9D,EAAQiD,QAAS,IAAIzD,IAAI,CAACQ,EAAQ6C,SA9DrC8B,EAAA,yBAA2B,iBAAkB7K,KAAK0J,iBAClDmB,EAAA,yBAA2B,sBAAuB7K,KAAKgK,sBACvDa,EAAA,yBAA2B,eAAgB7K,KAAK4K,eAGxCnB,WAAWU,GACnB,MAAMW,EAAU9K,KAAKkJ,cAAc6B,YACjC9B,EAAA,8BAA+CjJ,KAAKkJ,cAAcC,QAClEF,EAAA,qBAAsCjJ,KAAKkJ,cAAcC,QAE1D,OADiBF,EAAA,8BAA+CjJ,KAAKkJ,cAAcG,YAAYC,EAAGa,EAAMW,EAASX,EAAKtJ,QAyDlHmK,iBAAiBC,GACtBjL,KAAKkJ,cAAgB+B,OAEc1E,IAAhCvG,KAAKkJ,cAAcgB,WACpBlK,KAAK+G,aAAc,OAEgBR,IAAhCvG,KAAKkJ,cAAcM,WACpBxJ,KAAKgH,eAAgB,IAIe,kCAArChH,KAAKkJ,cAAcG,YAAYC,IAChCtJ,KAAK+G,aAAc,GAGjB/G,KAAKkJ,cAAcgC,YACrBlL,KAAKgH,cAAgBhH,KAAK+G,aAAc,GAIrCK,QACLvH,MAAMuH,QACNpH,KAAKkJ,mBAAgB3C,EAGhB4E,UACLnL,KAAKoH,QACLyD,EAAA,4BAA8B,iBAAkB7K,KAAK0J,iBACrDmB,EAAA,4BAA8B,sBAAuB7K,KAAKgK,sBAC1Da,EAAA,4BAA8B,eAAgB7K,KAAK4K,eACnD5K,KAAK+J,eAAYxD,G,0ECjJd,MAAM6E,EAKXzL,YAAmBmE,EAAoC7D,EAAsBoL,GAAY,EAAMC,EAAoBC,GAAY,EAAaC,GAAa,EAAaC,GAAnJ,KAAA3H,KAAAA,EAAoC,KAAA7D,KAAAA,EAAsB,KAAAoL,UAAAA,EAA+D,KAAAG,WAAAA,EAA0B,KAAAC,QAAAA,EACpKzL,KAAK0L,KAAO,oBACZ1L,KAAKoB,UAAYC,SAASC,cAAc,OACrCgK,IAAWtL,KAAKoB,UAAUkK,UAAYA,GAEtCxH,IACD9D,KAAK2L,OAAStK,SAASC,cAAc,OACrCtB,KAAK2L,OAAOpL,UAAUgB,IAAI,sBACN,iBAAX,GACPvB,KAAK2L,OAAOrH,QAAO,IAAAsH,MAAK9H,IAE1B9D,KAAKoB,UAAUkD,OAAOtE,KAAK2L,SAG7B3L,KAAKoB,UAAUb,UAAUgB,IAAI,eAAgB,gBAAkBtB,GAC/DD,KAAKoB,UAAUkD,OAAOtE,KAAK0L,MAC3B1L,KAAKoB,UAAUkC,MAAMC,QAAU,OAE5BgI,GACD,wBAAuCvL,KAAK0L,KAAMD,OAASlF,EAAWiF,GAI1EK,QACE7L,KAAKoB,UAAUkC,MAAMC,QAAU,OAE5BvD,KAAKqL,YACNrL,KAAK0L,KAAK5F,UAAY,IAI1BgG,YACE9L,KAAKoB,UAAUkC,MAAMC,QAAU,GAGjCM,SACK7D,KAAK0L,KAAKK,kBACX/L,KAAK8L,YAEL9L,KAAK6L,SAOI,MAAMG,EAiBnBrM,YAAmByB,EAA+B6K,EAAiCC,EAAgEC,GAAhI,KAAA/K,UAAAA,EAA+B,KAAA6K,YAAAA,EAAiC,KAAAC,aAAAA,EAAgE,KAAAC,SAAAA,EAhB3I,KAAAC,SAAW,EACX,KAAAC,aAAe,EACf,KAAAC,YAAc,EAEd,KAAAC,cAA+B,KAC/B,KAAAC,cAAwB,EAExB,KAAAC,MAAQ,GAER,KAAAC,eAAiC,KAGjC,KAAAC,SAAW,EAKjB3M,KAAK4M,WAAa,IAAI,KAAW5M,KAAKoB,WACtCpB,KAAK0M,eAAiB1M,KAAK4M,WAAWxL,UACtC,IAAI,IAAImE,KAAKvF,KAAKkM,aAChBlM,KAAK0M,eAAepI,OAAOtE,KAAKkM,aAAa3G,GAAsBnE,WAGlEpB,KAAKkM,aAAaW,UACnB7M,KAAK4M,WAAWE,oBAAoB9M,KAAKkM,aAAaW,SAASnB,MAGjE1L,KAAKiM,YAAYc,SAAYrM,IAM3BV,KAAKyM,MAAQ/L,EACbV,KAAKoH,OAAM,GACXpH,KAAKgN,cAGPhN,KAAK4M,WAAWK,iBAAmB,KAC7BjN,KAAKyM,MAAMS,SAEXlN,KAAKwM,gBACPxM,KAAKwM,cAAgBW,OAAOC,YAAW,KACrCpN,KAAKgN,aACLhN,KAAKwM,cAAgB,IACpB,MAKFpF,MAAM3D,GAAM,GACdA,IACDzD,KAAKiM,YAAYvL,MAAQ,GACzBV,KAAKyM,MAAQ,GACbzM,KAAKmJ,YAAS5C,EACdvG,KAAK2M,SAAW,GAGlB3M,KAAKoM,SAAW,EAChBpM,KAAKqM,aAAe,EACpBrM,KAAKsM,YAAc,EAEnB,IAAI,IAAI/G,KAAKvF,KAAKkM,aAChBlM,KAAKkM,aAAa3G,GAAsBsG,QAG1C7L,KAAKuM,cAAgB,KAGhBc,YAAYlE,EAAiBwD,EAAW,EAAGF,EAAQ,IACxDzM,KAAKmJ,OAASA,EACdnJ,KAAK2M,SAAWA,EAEb3M,KAAKyM,QAAUA,IAChBzM,KAAKiM,YAAYrJ,WAAWlC,MAAQ+L,GAGtCzM,KAAKiM,YAAYlM,MAAMuN,QAGlBN,aACL,GAAGhN,KAAKuM,cAAe,OAAOvM,KAAKuM,cAEnC,MAAME,EAAQzM,KAAKyM,MAEnB,IAAIA,EAAMS,OAER,YADAlN,KAAKmM,UAAYnM,KAAKmM,SAAS,IAIjC,IAAwB,IAArBnM,KAAKsM,YAAqBtM,KAAKqM,aAAerM,KAAKsM,WACpD,OAAO9I,QAAQ2E,UAGjB,MAAMW,EAAQ9I,KAAKoM,UAAY,EAE/B,OAAOpM,KAAKuM,cAAgBtD,EAAA,YAA6B,CACvDE,OAAQnJ,KAAKmJ,OACbsD,MAAAA,EACApD,YAAa,CAACC,EAAG,4BACjBR,MAAAA,EACAM,MAAO,GACPuD,SAAU3M,KAAK2M,WACd5K,MAAKwL,IAGN,GAFAvN,KAAKuM,cAAgB,KAElBvM,KAAKiM,YAAYvL,QAAU+L,EAC5B,OAKF,MAAM,MAACjG,EAAK,QAAEP,GAAWsH,EAEtBtH,EAAQpF,QAAUoF,EAAQ,GAAG8C,MAAQ/I,KAAKoM,UAC3CnG,EAAQ8B,QAGV,MAAMyF,EAAcxN,KAAKkM,aAAaW,SAEtC5G,EAAQlB,SAASmB,IACf,IACE,MAAMiD,EAASnJ,KAAKmJ,OAASjD,EAAQuH,OAASvH,EAAQiD,OACtD,8BAA6C,CAC3CA,OAAAA,EACA/H,UAAWpB,KAAK4M,WAChBc,YAAY,EACZC,WAAY,GACZC,WAAW,EACX1H,QAAAA,EACAuG,MAAAA,IAEF,MAAMoB,GACNC,QAAQC,MAAM,mCAAoCF,OAItDL,EAAY3J,SAEZ7D,KAAKoM,SAAWnG,EAAQpF,QAAUoF,EAAQA,EAAQpF,OAAS,GAAGkI,KAErC,IAAtB/I,KAAKqM,cACNrM,KAAKqM,YAAc,GAErBrM,KAAKqM,aAAepG,EAAQpF,QAEJ,IAArBb,KAAKsM,aACNtM,KAAKsM,WAAa9F,EAEfgH,EAAY7B,SACb,EAAAqC,EAAA,GAAeR,EAAY7B,QAAQ,IAAAC,MAAKpF,EAAQ,4BAA8B,8BAA+B,CAACA,KAGhHxG,KAAKmM,UAAYnM,KAAKmM,SAASnM,KAAKsM,gBAErC2B,OAAMJ,IACPC,QAAQC,MAAM,eAAgBF,GAC9B7N,KAAKuM,cAAgB,S,aCpNZ,MAAM2B,EAWnBvO,YAAYwO,EAA0BpB,GAL/B,KAAAqB,UAAY,GACZ,KAAAC,QAAU,EA+BjB,KAAAC,QAAU,KACR,IAAItO,KAAK+M,SAAU,OAEnB,IAAIrM,EAAQV,KAAKU,MAIdA,IAAUV,KAAKoO,YAChBpO,KAAKoO,UAAY1N,EACjB6N,aAAavO,KAAKqO,SAClBrO,KAAKqO,QAAUlB,OAAOC,YAAW,KAC/BpN,KAAK+M,SAASrM,KACb,OAIP,KAAA8N,aAAe,KACbxO,KAAKU,MAAQ,GACbV,KAAK+M,UAAY/M,KAAK+M,SAAS,IAC/B/M,KAAKyO,SAAWzO,KAAKyO,WA7CrBzO,KAAK4C,WAAa,IAAI,IAAW,CAC/BuL,YAAAA,EACArO,WAAW,IAGbE,KAAKoB,UAAYpB,KAAK4C,WAAWxB,UACjCpB,KAAKoB,UAAUb,UAAUC,OAAO,eAChCR,KAAKoB,UAAUb,UAAUgB,IAAI,gBAE7BvB,KAAK+M,SAAWA,EAEhB/M,KAAKD,MAAQC,KAAK4C,WAAW7C,MAC7BC,KAAKD,MAAMQ,UAAUgB,IAAI,sBAEzB,MAAMmN,EAAarN,SAASC,cAAc,KAC1CoN,EAAWnO,UAAUgB,IAAI,QAAS,gBAElCvB,KAAK2O,SAAWtN,SAASC,cAAc,KACvCtB,KAAK2O,SAASpO,UAAUgB,IAAI,QAAS,WAAY,eAEjDvB,KAAKD,MAAMM,iBAAiB,QAASL,KAAKsO,SAC1CtO,KAAK2O,SAAStO,iBAAiB,QAASL,KAAKwO,cAE7CxO,KAAKoB,UAAUkD,OAAOoK,EAAY1O,KAAK2O,UAyBrCjO,YACF,OAAOV,KAAK4C,WAAWlC,MAGrBA,UAAMA,GACRV,KAAKoO,UAAY1N,EACjB6N,aAAavO,KAAKqO,SAClBrO,KAAK4C,WAAWlC,MAAQA,EAGnBF,SACL+N,aAAavO,KAAKqO,SAClBrO,KAAKD,MAAM6O,oBAAoB,QAAS5O,KAAKsO,SAC7CtO,KAAK2O,SAASC,oBAAoB,QAAS5O,KAAKwO,e,qDC3EpD,MASA,EATmB,CAAClD,EAAoB1L,EAAuE,MAC9F,OAAO,WAAY,OAAF,QAC9BiP,KAAMvD,QAAa/E,GAChB3G,ICiBQ,MAAMkP,EAcnBnP,YAAYoP,EAAuBC,GACjChP,KAAKiP,aAAaF,EAAQC,GAGrBC,aAAaF,EAAuBC,GAAc,GACvDhP,KAAK+O,OAASA,EACd/O,KAAKgP,YAAcA,EAEnBhP,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,WAAY,uBAGzCvB,KAAKkP,OAAS7N,SAASC,cAAc,OACrCtB,KAAKkP,OAAO3O,UAAUgB,IAAI,kBAE1BvB,KAAKmP,SAAW,EAAW,4BAA6B,CAACC,UAAU,IACnEpP,KAAKqP,MAAQhO,SAASC,cAAc,OACpCtB,KAAKqP,MAAM9O,UAAUgB,IAAI,yBACzBvB,KAAKkP,OAAO5K,OAAOtE,KAAKmP,SAAUnP,KAAKqP,OAGvCrP,KAAKsP,QAAUjO,SAASC,cAAc,OACtCtB,KAAKsP,QAAQ/O,UAAUgB,IAAI,mBAE3BvB,KAAK4M,WAAa,IAAI,KAAW5M,KAAKsP,aAAS/I,OAAWA,GAAW,GAErEvG,KAAKoB,UAAUkD,OAAOtE,KAAKkP,OAAQlP,KAAKsP,SAExCtP,KAAK+O,OAAOQ,OAAOvP,MAEnBA,KAAKwP,eAAiB,IAAI,IAGrBC,QACL,OAAOzP,KAAK+O,OAAOW,SAAS1P,MAGjB2P,QAAQnL,G,qCACnB,GAAGxE,KAAK4P,KACN,IACE,MAAMrH,EAASvI,KAAK4P,OACpB5P,KAAK4P,KAAO,KAETrH,aAAkB/E,gBACb+E,GAER,MAAMsF,GACNC,QAAQC,MAAM,iBAAkBF,GAIpC7N,KAAK+O,OAAOc,UAAU7P,O,+RAGd4P,QAIHE,sBACF9P,KAAKgP,cACNhP,KAAK+O,OAAOgB,KAAKC,OAAOhQ,MACxBA,KAAKoB,UAAUZ,UAGdR,KAAKwP,gBACNxP,KAAKwP,eAAeS,YAIdC,SAASC,GACjBnQ,KAAKqP,MAAMvJ,UAAY,GACvB9F,KAAKqP,MAAM/K,QAAO,IAAAsH,MAAKuE,KAIpB,MAAMC,UAAgCtB,EAK3CnP,YAAYoP,GACVlP,MAAMkP,GACN/O,KAAKqQ,cAAgB,IAAI,IAG3BP,sBAGE,OAFA9P,KAAKqQ,cAAcC,cAAc,WACjCtQ,KAAKqQ,cAAclF,UACZtL,MAAMiQ,uB,cC/GF,MAAMS,EASnB5Q,YAAYC,GAPL,KAAA4Q,cAA6C,GAI5C,KAAAC,cAAe,EA0BhB,KAAAC,gBAAkB,KACVC,EAAA,iBAAuC3Q,KAAK4Q,gBAEvDD,EAAA,OAA6B3Q,KAAK4Q,gBAC1B5Q,KAAKwQ,cAAc3P,QAC3Bb,KAAK0P,SAAS1P,KAAKwQ,cAAcxQ,KAAKwQ,cAAc3P,OAAS,KAK1D,KAAA6O,SAAW,CAACmB,EAA8BC,EAAmBC,KAClE,QAAUxK,IAAPsK,GAAoB7Q,KAAKwQ,cAAcxQ,KAAKwQ,cAAc3P,OAAS,KAAOgQ,EAC3E,OAAO,EAIT,MAAMG,EAAYhR,KAAKwQ,cAAc3I,MACrC7H,KAAKiR,WAAWD,EAAWF,EAASC,GAEpC,MAAMG,EAAMlR,KAAKwQ,cAAcxQ,KAAKwQ,cAAc3P,OAAS,GAE3D,OADAb,KAAKmR,gBAAmB5K,IAAR2K,EAAqBA,aAAepC,EAAiBoC,EAAI9P,UAAY8P,EAAQlR,KAAKyQ,cAAgB,EAAI,EAAIK,IACnH,IAtCP,EAAA7J,EAAA,GAAWjH,KAAMJ,GAEbI,KAAK+P,OACP/P,KAAK+P,KAAO,IAAIqB,KAGlBpR,KAAKqR,cAAgBrR,KAAKsR,UAAUC,cAAc,mBAClDvR,KAAKmR,YAAa,OAAiBnR,KAAKqR,cAAe,aA3BnC,KA4BhBrR,KAAKyQ,cACPzQ,KAAKmR,WAAW,GAGlB9G,MAAMC,KAAKtK,KAAKsR,UAAUE,iBAAiB,0BAAkDzM,SAAQ0M,KACnG,QAAiBA,EAAIzR,KAAK0Q,oBA4BvBb,UAAUgB,GAKf,GAAG7Q,KAAKwQ,cAAcxQ,KAAKwQ,cAAc3P,OAAS,KAAOgQ,EACvD,OAAO,EAGT,MAAMK,EAAiBL,aAAc/B,EAAiB+B,EAAK7Q,KAAK+P,KAAK2B,IAAIb,GAyBzE,OAxBGK,IACEA,EAAIS,QACLT,EAAIS,SAGHT,EAAIU,oBACLxE,YAAW,KACT8D,EAAIU,uBA9EU,MAoFlBjB,EAAA,WAAiC,CAC/B1Q,KAAMD,KAAK4Q,eACXiB,MAAQC,IACN9R,KAAK0P,cAASnJ,EAAWuL,GAAY,IAC9B,KAKb9R,KAAKwQ,cAAc1I,KAAK+I,GACxB7Q,KAAKmR,WAAWN,aAAc/B,EAAiB+B,EAAGzP,UAAYyP,IACvD,EAGFkB,qBAAqBlB,IAC1B,EAAAmB,EAAA,GAAiBhS,KAAKwQ,cAAeK,GACrC7Q,KAAKiR,WAAWJ,OAAItK,GAGf0L,kBAAkBC,EAA6CC,GACpE,IAAI,IAAI5M,EAAIvF,KAAKwQ,cAAc3P,OAAS,EAAG0E,GAAK,IAAKA,EAAG,CACtD,MAAM2L,EAAMlR,KAAKwQ,cAAcjL,GAC/B,GAAG2L,IAAQiB,EAAX,CACK,GAAGjB,aAAegB,EACrB,MAGFlS,KAAK+R,qBAAqBb,KAKvBkB,OAAOF,GACZ,OAAOlS,KAAKwQ,cAAc6B,MAAKC,GAAKA,aAAaJ,IAG5CK,YAAYL,GACjB,QAASlS,KAAKoS,OAAOF,GAGbjB,WAAWJ,EAA6BC,EAAkBC,GAC9DA,GACFJ,EAAA,eAAqC3Q,KAAK4Q,gBAAgB,GAG5D,MAAMM,EAAiBL,aAAc/B,EAAiB+B,EAAK7Q,KAAK+P,KAAK2B,IAAIb,GACtEK,IACEA,EAAIsB,SACLtB,EAAIsB,UAGHtB,EAAIpB,qBACL1C,YAAW,KACT8D,EAAIpB,wBAzIU,MA+IfP,OAAO2B,GACRA,EAAI9P,UAAU6C,gBAChBjE,KAAKqR,cAAc/M,OAAO4M,EAAI9P,WAE3B8P,EAAI/B,UACL+B,EAAI/B,SAAS9O,iBAAiB,QAASL,KAAK0Q,mB,wBCvJrC,MAAM+B,EAKnB9S,YAAYoN,GACV/M,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,eAE7BvB,KAAKqD,OAAShC,SAASC,cAAc,UACrCtB,KAAKqD,OAAO9C,UAAUgB,IAAI,sBAE1BvB,KAAK6O,KAAOxN,SAASC,cAAc,QACnCtB,KAAK6O,KAAKtO,UAAUgB,IAAI,QAAS,mBAEjCvB,KAAKoB,UAAUkD,OAAOtE,KAAKqD,OAAQrD,KAAK6O,OAExC,QAAiB7O,KAAKoB,WAAW,MAC/B,IAAI,KAAcuO,KAAK3P,KAAKqD,OAAQ0J,MAIjClB,QACO7L,KAAKqD,OAAOqP,WAAW,MAC/BC,UAAU,EAAG,EAAG3S,KAAKqD,OAAOzB,MAAO5B,KAAKqD,OAAOxB,SC3BvD,MAKA,EALqB,CAACjC,EAAwG,MAC7G,OAAO,mCAAqCA,EAAQ0L,UAAY,IAAM1L,EAAQ0L,UAAY,IAAK1L,GCoBjG,MAAMgT,UAAuB9D,EAA5C,c,oBAEU,KAAA+D,aAAyC,KAEzC,KAAAC,WAAqB,EAQnBlD,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,uBAC7BvB,KAAKkQ,SAAS,YAEdlQ,KAAK+S,WAAa,IAAIN,GAAYO,IAChChT,KAAK6S,aAAeG,KAGtB,MAAMC,EAAU,IAAIC,GAAe,IAE7BC,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3BvB,KAAKoT,oBAAsB,IAAI,IAAW,CACxCC,MAAO,yBACPC,UAAW,MAGbtT,KAAKuT,wBAA0B,IAAI,IAAW,CAC5CF,MAAO,eACPvP,KAAM,WACN0P,aAAa,IAGfL,EAAa7O,OACXtE,KAAKoT,oBAAoBhS,UACzBpB,KAAKuT,wBAAwBnS,WAG/BpB,KAAKoT,oBAAoBrT,MAAMM,iBAAiB,SAAS,KAEvD,IAAIoT,IADUzT,KAAKoT,oBAAoB1S,MACdG,SAAWb,KAAKoT,oBAAoBrT,MAAMQ,UAAUmT,SAAS,SACnF1T,KAAK8S,YAAWW,EAAaA,KAAgBzT,KAAK2T,sBAAwB3T,KAAK4T,qBAClF5T,KAAK6T,QAAQtT,UAAUsD,OAAO,eAAgB4P,MAGhDzT,KAAK6T,QAAU,EAAa,CAAChF,KAAM,eAEnC7O,KAAK6T,QAAQxT,iBAAiB,SAAS,KACrC,MAAMgP,EAAQrP,KAAKoT,oBAAoB1S,MAEvC,GAAGV,KAAK8S,UAAU,CAChB,IAAI9S,KAAK4T,sBAAwB5T,KAAK2T,mBAAoB,OAC1DG,EAAA,gBAA8B,CAC5BzE,MAAAA,EACA0E,MAAO,GACPC,UAAW,OAAF,QACP1K,EAAG,iBACAtJ,KAAK2T,oBAEVM,QAASjU,KAAK4T,oBACdM,WAAW,IACVnS,MAAMoS,IACJnU,KAAK6S,cACN7S,KAAK6S,eAAe9Q,MAAMqS,IACxBN,EAAA,YAA0BK,EAAQC,MAInCpU,KAAKqU,QAAQxT,QACdiT,EAAA,kBAAgCK,EAAQnU,KAAKqU,SAG/C,wBAAoCrU,MACpC,aAAyB,WAG3BA,KAAK6T,QAAQS,UAAW,EACxBR,EAAA,aAA2BzE,EAAOrP,KAAKqU,QAAQ3J,KAAIvB,GAAUA,EAAOoL,cAAaxS,MAAMoS,IAClFnU,KAAK6S,cACN7S,KAAK6S,eAAe9Q,MAAMqS,IACxBN,EAAA,YAA0BK,EAAQC,MAItC,wBAAoCpU,MACpC,aAAyB,SAK/B,MAAMwU,EAAe,IAAItB,GAAe,CACtCpP,KAAM,UACN2Q,SAAU,CAACzU,KAAKqU,QAAQxT,UAGpB6K,EAAO1L,KAAK0L,KAAO,kBAAiC,CACxDgJ,KAAK,IAGPF,EAAalF,QAAQhL,OAAOoH,GAE5BuH,EAAQ3D,QAAQhL,OAAOtE,KAAK+S,WAAW3R,UAAW+R,GAElDnT,KAAKsP,QAAQhL,OAAOtE,KAAK6T,SACzB7T,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,UAAWoT,EAAapT,WAGlD0O,sBACL9P,KAAK+S,WAAWlH,QAChB7L,KAAK6S,aAAe,KACpB7S,KAAKoT,oBAAoB1S,MAAQ,GACjCV,KAAKuT,wBAAwBnS,UAAUb,UAAUgB,IAAI,QACrDvB,KAAK6T,QAAQS,UAAW,EAGnB3E,KAAK0E,EAAmBvB,GAAqB,GAClD9S,KAAK8S,UAAYA,EACjB9S,KAAKqU,QAAUA,EACf,MAAM9L,EAAS1I,MAAM8P,OAwBrB,OAvBApH,EAAOxG,MAAK,KACP+Q,GACD9S,KAAKkQ,SAAS,qBACdlQ,KAAKuT,wBAAwBnS,UAAUb,UAAUC,OAAO,QACxDR,KAAKuT,wBAAwBzS,iBAAiB,iBAAY,WAAW,IACrEd,KAAK2U,iBAEL3U,KAAKuT,wBAAwBnS,UAAUb,UAAUgB,IAAI,QAGvDvB,KAAKqU,QAAQtP,SAAQ6P,IACnB,MAAM,IAACC,GAAO,gBAA+B,CAC3CC,OAAQF,EACRxT,UAAWpB,KAAK0L,KAChBgC,YAAY,EACZqH,eAAe,EACfpH,WAAY,KAGdkH,EAAIG,gBAAgB1Q,OAAO2Q,EAAA,sBAAoCL,UAI5DrM,EAGDoM,gBACNO,UAAUC,YAAYC,oBAAoBC,IACxCrV,KAAK2T,mBAAqB,CACxB2B,IAAKD,EAASE,OAAOC,SACrBC,KAAMJ,EAASE,OAAOG,WAGxB,IAAIC,EAAM,8CACVA,GAAO,QAAQN,EAASE,OAAOC,SAC/BG,GAAO,QAAQN,EAASE,OAAOG,UAC/BC,GAAO,eACPA,GAAO,oBACPA,GAAO,sBACPC,MAAMD,GACL5T,MAAM8T,GAAaA,EAASC,SAC5B/T,MAAM8T,IACL7V,KAAK4T,oBAAsBiC,EAASE,aACpC/V,KAAKuT,wBAAwBzS,iBAAiB+U,EAASE,oBAEvDhI,IACCA,aAAiBiI,yBAClBhW,KAAKuT,wBAAwBzS,iBAAiB,mDAE9Cd,KAAKuT,wBAAwBzS,iBAAiB,kD,6MCtKtD,MAAMmV,GAAwB,MAC5B,IACE,OAAO,GAAAC,YAAchB,UAAUiB,UAAUC,MAAM,mBAAmB,GAAK,GACvE,MAAMvI,GACN,OAAO,IAJmB,GAmvBxBwI,GAA6B,IAztBnC,MA8BE1W,cAME,GAlCM,KAAA2W,MAAoD,IAAIlF,IACxD,KAAAmF,UAAiD,IAAInF,IACrD,KAAAoF,aAAoD,IAAIpF,IAIxD,KAAAqF,oBAA0E,IAAIrF,IAC9E,KAAAsF,6BAAkF,IAAItF,IACtF,KAAAuF,wBAAoE,GAUpE,KAAAC,QAAU,EACV,KAAAC,QAAS,EACT,KAAAC,cAAgB,EAEhB,KAAAC,cAAmD,CACzDC,MAAO,EACPC,MAAO,EACPC,MAAO,GA+EF,KAAAC,aAAgBC,IACrB,MAAMd,EAAQtW,KAAKqX,aAChBf,IACDA,EAAMgB,YAActU,KAAKH,IAAI,EAAGyT,EAAMgB,aAAeF,EAAQG,YA/H/C,OAmIX,KAAAC,YAAeJ,IACpB,MAAMd,EAAQtW,KAAKqX,aAChBf,IACDA,EAAMgB,YAActU,KAAKC,IAAIqT,EAAMmB,SAAUnB,EAAMgB,aAAeF,EAAQG,YAtI5D,OA0IX,KAAAG,OAAUN,IACf,MAAMd,EAAQtW,KAAKqX,aAChBf,IACDA,EAAMgB,YAAcF,EAAQO,WA4GxB,KAAAC,oBAAuBtB,IAC7B,MAAMc,EAAUpX,KAAKwW,aAAa9E,IAAI4E,GAChCuB,EAAMC,EAAA,SAAsBV,EAAQW,OAC1B,UAAbF,EAAI5X,MAAoB4X,EAAIG,mBAAqB/B,IAClDjW,KAAKiY,uBAAuB3B,GAI9B,MAAM4B,EAAeC,GAAA,kBAAmCN,GACxDvB,EAAM8B,IAAMF,EAAaG,IAEtBrY,KAAKqX,eAAiBf,IACvBA,EAAMgC,aAAetY,KAAKsY,cAI5B,MAAMrT,EAAMjF,KAAK2W,wBAAwBkB,EAAIhH,IAC1C5L,IACDA,EAAI+K,OAAOsG,GAEPrR,EAAI/D,aACClB,KAAK2W,wBAAwBkB,EAAIhH,MA4KtC,KAAA0H,OAAUjY,IAChB,MAAMgW,EAAQhW,EAAEkY,OACVpB,EAAUpX,KAAKwW,aAAa9E,IAAI4E,IAChC,OAACnN,EAAM,IAAEJ,GAAOqO,EAIhBlR,EAAUlG,KAAKyY,kBAAkBnC,GAGvC,GADsBtW,KAAKqX,eACNf,EAAO,CAC1BtW,KAAKoD,OAEL,MAAMsV,EAAUC,GAAuBA,EAAQ5P,MAAQA,GAAO4P,EAAQxP,SAAWA,EACjF,IAAInJ,KAAK4Y,WAAWtR,UAAYoR,EAAO1Y,KAAK4Y,WAAWtR,SAAU,CAC/D,IACIuR,EADA1S,EAAMnG,KAAK4Y,WAAWlS,SAASoS,UAAUJ,IAEjC,IAATvS,EACD0S,IAAe7Y,KAAK4Y,WAAWlS,SAAS7F,OAASsF,IAEjDA,EAAMnG,KAAK4Y,WAAWjS,KAAKmS,UAAUJ,IACzB,IAATvS,IACD0S,EAAa1S,EAAM,KAIX,IAATA,EACE0S,GACD7Y,KAAK4Y,WAAWnR,GAAGoR,GAAY,GAGjC7Y,KAAKkH,WAAW,CAACiC,OAAAA,EAAQJ,IAAAA,IAI7B/I,KAAK+Y,SAASzC,EAAOpQ,GAIvBkH,YAAW,KACNpN,KAAKqX,eAAiBf,GAIzBzL,EAAA,sBAAwB,aAAc7K,KAAKgZ,uBAC1C,IAiBG,KAAAC,QAAW3Y,IAQjBuK,EAAA,sBAAwB,gBAGlB,KAAAqO,QAAW5Y,IACbA,EAAE6Y,YAINnZ,KAAKiZ,QAAQ3Y,GAITN,KAAK2G,SACP3G,KAAKoD,OACLyH,EAAA,sBAAwB,iBA0BrB,KAAAnI,KAAO,IACL1C,KAAK6D,QAAO,GAGd,KAAAxB,MAAQ,IACNrC,KAAK6D,QAAO,GAGd,KAAAT,KAAO,KACZ,MAAMkT,EAAQtW,KAAKqX,aACnB,IAAIf,EACF,OAAO,EAGLA,EAAM8C,QACR9C,EAAMjU,QAGRiU,EAAMgB,YAAc,GACpB,QAAchB,EAAO,SAErB,MAAMc,EAAUpX,KAAKwW,aAAa9E,IAAI4E,GACtC,GAAGc,MAAAA,OAAO,EAAPA,EAASiC,MAAO,CACjB/C,EAAM8B,IAAM,GACZ,MAAMjP,EAASiO,EAAQjO,OACjBmQ,EAAIlC,EAAQrM,YAAc/K,KAAKuW,UAAYvW,KAAKsW,MAChDxL,EAAUwO,EAAE5H,IAAIvI,GACnB2B,IACDA,EAAQkF,OAAOoH,EAAQrO,KAEnB+B,EAAQ5J,MACVoY,EAAEtJ,OAAO7G,IAIbmN,EAAM9V,SAENR,KAAKwW,aAAaxG,OAAOsG,GAM3B,OAHAtW,KAAKqX,kBAAe9Q,EACpBvG,KAAKuZ,sBAAmBhT,GAEjB,GAGF,KAAAiT,SAAY5R,IACjB,MAAM,OAACuB,EAAM,IAAEJ,GAAOnB,EAChBmD,EAAc/K,KAAKkJ,cAAc6B,YACzB/K,KAAKyZ,SAAStQ,EAAQJ,EAAKgC,GAMnCrI,OAEN0K,YAAW,KACTpN,KAAK0Z,2BAA2BvQ,EAAQJ,EAAKgC,KAC5C,IAGE,KAAApE,KAAO,KACJ3G,KAAK2Z,iBAAmB3Z,KAAK4Y,WAAWnR,GAAG,GAG9C,KAAAf,SAAW,KAChB,MAAM4P,EAAQtW,KAAKqX,aACnB,OAAGf,IAAUA,EAAMgB,YAAc,IAAMtX,KAAK4Y,WAAWlS,SAAS7F,SAC9DyV,EAAMgB,YAAc,OACpBtX,KAAK6D,QAAO,KAIN7D,KAAK2Z,iBAAmB3Z,KAAK4Y,WAAWnR,IAAI,IAjkBpDzH,KAAKoB,UAAYC,SAASC,cAAc,OAExCtB,KAAKoB,UAAUkC,MAAMsW,QAAU,iBAC/BvY,SAASwY,KAAKvV,OAAOtE,KAAKoB,WAEvB8T,UAAU4E,aAAc,CACzB,MAAMC,EAAwE,CAC5ErX,KAAM1C,KAAK0C,KACXL,MAAOrC,KAAKqC,MACZe,KAAMpD,KAAKoD,KACX4W,aAAcha,KAAKmX,aACnB8C,YAAaja,KAAKwX,YAClB0C,OAAQla,KAAK0X,OACbyC,cAAena,KAAK0G,SACpB0T,UAAWpa,KAAK2G,MAGlB,IAAI,MAAMP,KAAU2T,EAClB,IACE7E,UAAU4E,aAAaO,iBAAiBjU,EAA8B2T,EAAQ3T,IAC9E,MAAMyH,GACNC,QAAQwM,KAAK,wCAAyClU,IAK5DyE,EAAA,yBAA2B,uBAAwBgN,IACjD,MAAM5S,EAAMjF,KAAK2W,wBAAwBkB,EAAIhH,IAC7C,GAAG5L,EACD,IAAI,MAAMqR,KAASrR,EACjBjF,KAAK4X,oBAAoBtB,MAK/B,MAAMiE,EAAuD,GAChD,CACX,SACA,QACA,gBAEGxV,SAAQoL,IACX,MAAMqK,EAAQ,IAAMrK,EACpBoK,EAAWpK,GAAO,CAChBuB,IAAK,IAAM1R,KAAKwa,GAChBvV,IAAMvE,IACDV,KAAKwa,KAAU9Z,IAKlBV,KAAKwa,GAAQ9Z,EACVV,KAAKqX,eAENrX,KAAKqX,aAAalH,GAAOzP,GAGhB,iBAARyP,QAAoD5J,IAA1BvG,KAAKuZ,mBAChCvZ,KAAK+W,cAAc/W,KAAKuZ,kBAAoB7Y,GAG9CV,KAAKya,+BAIXC,OAAOC,iBAAiB3a,KAAMua,GAGxBE,yBACN,MAAM,OAACG,EAAM,MAAEC,EAAK,aAAEvC,GAAgBtY,KACtC6K,EAAA,sBAAwB,wBAAyB,CAC/C+P,OAAAA,EAAQC,MAAAA,EAAOvC,aAAAA,IAyBZwC,SAAS5U,EAA0B6U,EAAmB1B,GAC3D,MAAM,OAAClQ,EAAM,IAAEJ,GAAO7C,EAGhBoT,EADgBpT,EAAQ8U,OAAOC,aACbjb,KAAKuW,UAAYvW,KAAKsW,MAC9C,IAAIxL,EAAUwO,EAAE5H,IAAIxL,EAAQiD,QACxB2B,GACFwO,EAAErU,IAAIiB,EAAQiD,OAAQ2B,EAAU,IAAIsG,KAGtC,IAAIkF,EAAQxL,EAAQ4G,IAAI3I,GACxB,GAAGuN,EACD,OAAOA,EAGT,MAAMuB,EAAkB5O,EAAA,sBAAuC/C,GAC/D4E,EAAQ7F,IAAI8D,EAAKuN,EAAQjV,SAASC,cAA2B,UAAbuW,EAAI5X,MAAiC,UAAb4X,EAAI5X,KAAmB,QAAU,UAIzF,UAAb4X,EAAI5X,MACLqW,EAAMpW,aAAa,cAAe,QAIpC,MAAMkX,EAAwB,CAC5BjO,OAAAA,EACAJ,IAAAA,EACAgP,MAAOF,EAAIhH,GACXwI,MAAAA,EACAtO,YAAa7E,EAAQ8U,OAAOC,cAG9Bjb,KAAKwW,aAAavR,IAAIqR,EAAOc,GAG7Bd,EAAMsE,OAAS,EAGf5a,KAAKoB,UAAUkD,OAAOgS,GAEtBA,EAAMjW,iBAAiB,OAAQL,KAAKuY,QACpCjC,EAAMjW,iBAAiB,QAASL,KAAKiZ,SACrC3C,EAAMjW,iBAAiB,QAASL,KAAKkZ,SAErB,UAAbrB,EAAI5X,OAAoBiG,MAAAA,OAAO,EAAPA,EAAS8U,OAAOE,eAAgBhV,EAAQuH,SAAW5C,EAAA,cAC5EyL,EAAMjW,iBAAiB,cAAc,KACnC4I,EAAA,eAAgCE,EAAQ,CAACJ,MACxC,CAACoS,MAAM,IAiBZ,MAAMC,GAAW,UACjB,GAAGL,EACDK,EAASjT,cACJ,CACL,MAAMkT,EAAInV,EAAQ8U,OAAOC,aAAejb,KAAK0W,6BAA+B1W,KAAKyW,oBACjF,IAAI6E,EAAiBD,EAAE3J,IAAIvI,GACvBmS,GACFD,EAAEpW,IAAIkE,EAAQmS,EAAiB,IAAIlK,KAGrCkK,EAAerW,IAAI8D,EAAKqS,GAqB1B,OAlBAA,EAASrZ,MAAK,KAIZ,MAAMmW,EAAeC,GAAA,kBAAmCN,GACxD,GAAGA,EAAIG,mBAAqBE,EAAaG,IACvCrY,KAAK4X,oBAAoBtB,OACpB,CACL,IAAIrR,EAAMjF,KAAK2W,wBAAwBkB,EAAIhH,IACvC5L,IACFA,EAAMjF,KAAK2W,wBAAwBkB,EAAIhH,IAAM,IAAInL,KAGnDT,EAAI1D,IAAI+U,GACRwB,EAAA,cAA2BD,OAIxBvB,EAGFmD,SAAStQ,EAAgBJ,EAAagC,GAC3C,MAAMuO,GAAKvO,EAAc/K,KAAKuW,UAAYvW,KAAKsW,OAAO5E,IAAIvI,GAC1D,OAAOmQ,MAAAA,OAAC,EAADA,EAAG5H,IAAI3I,GA+BRkP,uBAAuB3B,GAC7BA,EAAMjW,iBAAiB,QAAQ,KAM7B,MAAMiX,EAAchB,EAAMgB,YAG1BhB,EAAMjW,iBAAiB,YAAY,KACjCiW,EAAMgB,YAAchB,EAAMmB,SAAW,EAErCnB,EAAMjW,iBAAiB,YAAY,KACjCiW,EAAMgB,YAAcA,EAIhBhB,EAAM8C,QACR9C,EAAM5T,SAEP,CAACyY,MAAM,MACT,CAACA,MAAM,OAIPzB,2BAA2BvQ,EAAgBJ,EAAagC,GAC7D,MAAMsQ,EAAItQ,EAAc/K,KAAK0W,6BAA+B1W,KAAKyW,oBAC3D3L,EAAUuQ,EAAE3J,IAAIvI,GACtB,IAAI2B,EACF,OAGF,MAAMzC,EAAUyC,EAAQ4G,IAAI3I,GACzBV,IACDA,EAAQF,UACR2C,EAAQkF,OAAOjH,GAEX+B,EAAQ5J,MACVma,EAAErL,OAAO7G,IAQRoS,kBAAkBjF,GAEvB,QAASA,EAAMkF,gBAGTC,mBAAmBnF,EAAyB5V,GAElD4V,EAAMkF,gBAAkB9a,EAGZgb,gBAAgBxV,EAA0BmR,EAAerX,KAAKqX,c,yDACpE,SAAYA,OAAc9Q,GAAW,GAE3C,MAAMsR,EAAM5O,EAAA,sBAAuC/C,GAE7CyV,EAAwB,GAExBC,EAAuB,UAAb/D,EAAI5X,MAAiC,UAAb4X,EAAI5X,KAC5C,IAAIoP,EAAQ,GAAIwM,EAAS,GAEzB,GAAa,QAAV,EAAAhE,EAAIiE,cAAM,eAAEjb,OAAQ,CACrB,MAAMK,EAAO2W,EAAIiE,OAAOjE,EAAIiE,OAAOjb,OAAS,GAC5C,IAAKK,EAAqC6a,MAAO,CAC/C,MAAM7D,EAAeC,GAAA,kBAAmCN,EAAK3W,EAAKjB,MAE/DiY,EAAaG,IACdsD,EAAQ7T,KAAK,CACXsQ,IAAKF,EAAaG,IAClB2D,MAAO,GAAI9a,EAA6Bma,KAAMna,EAA6B+a,IAC3Ehc,KAAM,eAGSic,EAAA,eAA8BrE,EAAK3W,GAC3Ca,MAAK,KACT/B,KAAKqX,eAAiBA,GAAiBa,EAAaG,KAIvDrY,KAAK0b,gBAAgBxV,YAItB,GAAG0V,EAAS,CACjB,MAAMzS,EAASjD,EAAQuH,QAAUvH,EAAQiD,OACnCgT,EAAYC,EAAA,eAA6BjT,GAC/C,GAAGgT,EAAW,CACZ,MAAM5T,EAAS8T,EAAA,aAA6BlT,EAAQgT,EAAW,eAC/D,GAAG5T,EAAO+T,OAAQ,CAChB,MAAMjE,QAAY9P,EAAO9G,YACzBka,EAAQ7T,KAAK,CACXsQ,IAAKC,EACL2D,MAAO,UACP/b,KAAM,oBAGRsI,EAAO9G,YAAYM,MAAMsW,IACpBrY,KAAKqX,eAAiBA,GAAiBgB,GAI1CrY,KAAK0b,gBAAgBxV,MAK3BmJ,EAAQ+M,EAAA,eAA6BjT,GAAQ,GAAM,GACnD0S,EAAS,iBAAyB,UAAbhE,EAAI5X,KAAmB,cAAgB,eAAe,GAG7E,IAAI2b,EAAS,CACX,MAAMW,EAAY1E,EAAI2E,WAAWnK,MAAKkK,GAA6B,2BAAhBA,EAAUjT,IAC7D+F,EAAQkN,GAAaA,EAAUlN,OAASwI,EAAI4E,UAC5CZ,EAASU,GAAaA,EAAUG,UAG9Bf,EAAQ9a,SACP,GAAA8b,SACE,GAAAC,mBACDjB,EAAQ7T,KAAK,CACXsQ,IAAK,8CACL4D,MAAO,UACP/b,KAAM,cAGR0b,EAAQ7T,KAAK,CACXsQ,IAAK,kCACL4D,MAAO,UACP/b,KAAM,cAIV,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAAK8E,SAAQ7D,IACxC,MAAM8a,EAAQ,GAAG9a,KAAQA,IACzBya,EAAQ7T,KAAK,CACXsQ,IAAK,6BAA6B4D,QAClCA,MAAAA,EACA/b,KAAM,kBAMd,MAAM4c,EAAW,IAAIC,cAAc,CACjCzN,MAAAA,EACAwM,OAAAA,EACAF,QAAAA,IAGFzG,UAAU4E,aAAa+C,SAAWA,G,mRAG5BpE,kBAAkBnC,GACxB,MAAMc,EAAUpX,KAAKwW,aAAa9E,IAAI4E,IAChC,OAACnN,EAAM,IAAEJ,GAAOqO,EAEtB,OADgBA,EAAQrM,YAAc9B,EAAA,4BAA6CE,EAAQJ,GAAOE,EAAA,mBAAoCE,EAAQJ,GAoDzIiQ,oBACL,MAAM,aAAC3B,GAAgBrX,KACvB,IAAIqX,EACF,OAGF,MAAMnR,EAAUlG,KAAKyY,kBAAkBpB,GACvC,MAAO,CACLQ,IAAK5O,EAAA,sBAAuC/C,GAC5CA,QAAAA,EACAoQ,MAAOe,GA8BJxT,OAAOnB,GACZ,QAAI1C,KAAKqX,oBAIG9Q,IAAT7D,IACDA,EAAO1C,KAAKqX,aAAa+B,QAGxBpZ,KAAKqX,aAAa+B,SAAW1W,IAI7BA,EACD1C,KAAKqX,aAAa3U,OAElB1C,KAAKqX,aAAahV,SAGb,IAgFF0a,aAAazG,GAClBtW,KAAKgd,kBAAoB1G,EAGpBtL,iBAAiBC,GACtB,QAAG,EAAAgS,GAAA,GAAUjd,KAAKkJ,cAAe+B,KAIjCjL,KAAKkJ,eAAgB,EAAAgU,GAAA,GAAKjS,IACnB,GAGFkS,mBACL,OAAOnd,KAAKkJ,cAGPhC,WAAWI,EAAoB8V,EAAoBzW,GACpD3G,KAAK4Y,WAiBP5Y,KAAK4Y,WAAWxR,QAhBhBpH,KAAK4Y,WAAa,IAAIhQ,EAAiB,CACrC/B,UAAW,GACXC,aAAc,EACd4B,YAAcxC,IACZlG,KAAK8a,SAAS5U,GAAS,GAChB,CAACiD,OAAQjD,EAAQiD,OAAQJ,IAAK7C,EAAQ6C,MAE/Cd,OAAQ,CAACL,EAAMM,KACblI,KAAKwZ,SAAS5R,IAEhBmC,UAAW,KACTc,EAAA,sBAAwB,cACxB7K,KAAKoD,UAOX,MAAMwD,OAA0CL,IAAhCvG,KAAKkJ,cAAcgB,SAChCkT,EACDpd,KAAK4Y,WAAW1R,WAAWkW,EAAMzW,EAAMC,GAEvC5G,KAAK4Y,WAAWhS,QAAUA,EAG5B5G,KAAK4Y,WAAW5N,iBAAiBhL,KAAKkJ,eACtClJ,KAAK4Y,WAAWtR,QAAUA,EAE1BtH,KAAK4Y,WAAWpX,MAAK,GACrBxB,KAAK4Y,WAAWpX,MAAK,GAGf6b,gCAAgCnX,GACtC,MAAM2R,EAAM5O,EAAA,sBAAuC/C,GACnD,IAAIoX,EAA+B,QASnC,OARGzF,MAAAA,OAAG,EAAHA,EAAK5X,QACU,UAAb4X,EAAI5X,MAAiC,UAAb4X,EAAI5X,KAC7Bqd,EAAY,QACS,UAAbzF,EAAI5X,OACZqd,EAAY,UAITA,EAGFvE,SAASzC,EAAyBpQ,GACvC,MAAMoX,EAAYtd,KAAKqd,gCAAgCnX,GAEvDlG,KAAK8W,cAAgB9W,KAAK+W,cAAcuG,GAExCtd,KAAKqX,aAAef,EACpBtW,KAAKuZ,iBAAmB+D,EACxBtd,KAAKqX,aAAauD,OAAS5a,KAAK4a,OAChC5a,KAAKqX,aAAawD,MAAQ7a,KAAK6a,MAC/B7a,KAAKqX,aAAaiB,aAAetY,KAAKsY,aAEnC,iBAAkBpD,WACnBlV,KAAK0b,gBAAgBxV,GAIlBqX,eAAejH,EAA0BpQ,GAC9C,MAAMmR,EAAerX,KAAKqX,aAEpBmG,EAAaxd,KAAKqC,QAOxB,OALArC,KAAK+c,kBAAaxW,GACf+P,EAAOtW,KAAK+Y,SAASzC,EAAOpQ,GAC1BlG,KAAKqX,kBAAe9Q,EACzBvG,KAAKyd,iBAAgB,GAEd,KACLzd,KAAKyd,iBAAgB,GAElBpG,IACErX,KAAKwW,aAAa9E,IAAI2F,GACvBrX,KAAK+Y,SAAS1B,EAAcrX,KAAKyY,kBAAkBpB,IAEnDrX,KAAK2G,QAAU3G,KAAK0G,YAIrB4P,GAAStW,KAAKqX,eAAiBf,GAChCtW,KAAKoD,OAGJoa,GACDxd,KAAK0C,QAKJ+a,gBAAgBC,GACrB1d,KAAK2Z,iBAAmB+D,IAK5B,iCAA4CrH,GAC5C,Y,eC/wBe,SAASsH,GAAoBhF,EAC1CiF,EACAC,EACAC,GAEA,MAAMC,EAAeC,IACnBH,EAAO,CAACI,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,MAAAA,KAGpCK,EAAaL,IACjB3c,SAASuN,oBAAoB,YAAamP,GAC1CpF,EAAQtY,iBAAiB,YAAaie,EAAa,CAACnD,MAAM,IAC1D2C,GAASA,EAAM,CAACG,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,MAAAA,KAG5CM,EAAeN,IACC,IAAjBA,EAAMO,QAKTX,EAAQ,CAACK,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,MAAAA,IACzCD,EAAYC,GAEZ3c,SAAShB,iBAAiB,YAAa0d,GACvC1c,SAAShB,iBAAiB,UAAWge,EAAW,CAAClD,MAAM,KARrDxC,EAAQtY,iBAAiB,YAAaie,EAAa,CAACnD,MAAM,KAW9DxC,EAAQtY,iBAAiB,YAAaie,EAAa,CAACnD,MAAM,IAG1D,MAAMqD,EAAeR,IACnBA,EAAMS,iBACNZ,EAAO,CAACI,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,MAAAA,KAG7Ec,EAAcd,IAClB3c,SAASuN,oBAAoB,YAAa4P,GAC1C7F,EAAQtY,iBAAiB,aAAc0e,EAAc,CAACC,SAAS,EAAO7D,MAAM,IAC5E2C,GAASA,EAAM,CAACG,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,MAAAA,KAGrFe,EAAgBf,IACpBJ,EAAQ,CAACK,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,MAAAA,IAClFQ,EAAYR,GAEZ3c,SAAShB,iBAAiB,YAAame,EAAa,CAACQ,SAAS,IAC9D3d,SAAShB,iBAAiB,WAAYye,EAAY,CAACE,SAAS,EAAO7D,MAAM,KAK3E,OAFAxC,EAAQtY,iBAAiB,aAAc0e,EAAc,CAACC,SAAS,EAAO7D,MAAM,IAErE,KACLxC,EAAQ/J,oBAAoB,YAAa0P,GACzCjd,SAASuN,oBAAoB,YAAamP,GAC1C1c,SAASuN,oBAAoB,UAAWyP,GAExC1F,EAAQ/J,oBAAoB,aAAcmQ,GAC1C1d,SAASuN,oBAAoB,YAAa4P,GAC1Cnd,SAASuN,oBAAoB,WAAYkQ,I,eCzD9B,MAAMG,GAyBnBtf,YACEC,EAQAc,EAAQ,GA7BH,KAAAwe,WAAY,EAIX,KAAAC,OAKH,GAOK,KAAAC,gBAAiB,EACjB,KAAAC,cAAe,EACf,KAAAC,UAAW,EA0DX,KAAAvB,YAAeC,IACvBhe,KAAKuf,MAAMvB,IAGH,KAAAM,YAAeN,I,MACvBhe,KAAKwf,KAAOxf,KAAKoB,UAAUqe,wBAC3Bzf,KAAKkf,WAAY,EACjBlf,KAAKuf,MAAMvB,GACXhe,KAAKoB,UAAUb,UAAUgB,IAAI,eAClB,QAAX,EAAAvB,KAAKmf,cAAM,eAAEb,cAAete,KAAKmf,OAAOb,YAAYN,IAG5C,KAAAK,UAAaL,I,MACrBhe,KAAKkf,WAAY,EACjBlf,KAAKoB,UAAUb,UAAUC,OAAO,eACrB,QAAX,EAAAR,KAAKmf,cAAM,eAAEd,YAAare,KAAKmf,OAAOd,UAAUL,IAQ3C,KAAA1P,QAAU,K,MACf,MAAM5N,GAASV,KAAK0f,KAAKhf,MACzBV,KAAK2f,UAAUjf,IACJ,QAAX,EAAAV,KAAKmf,cAAM,eAAES,UAAW5f,KAAKmf,OAAOS,QAAQlf,KAvE5C,EAAAuG,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,iBAG1BvB,KAAKqf,aACNrf,KAAKoB,UAAUb,UAAUgB,IAAI,iBACrBvB,KAAKof,gBACbpf,KAAKoB,UAAUb,UAAUgB,IAAI,mBAG/BvB,KAAK6f,OAASxe,SAASC,cAAc,OACrCtB,KAAK6f,OAAOtf,UAAUgB,IAAI,yBAE1B,MAAMme,EAAO1f,KAAK0f,KAAOre,SAASC,cAAc,SAChDoe,EAAKnf,UAAUgB,IAAI,uBAEnBme,EAAKzf,KAAO,QACZyf,EAAKI,KAAO,GAAK9f,KAAK8f,KACtBJ,EAAKzc,IAAM,GAAKjD,KAAKiD,IACrByc,EAAK7c,IAAM,GAAK7C,KAAK6C,IACrB6c,EAAKhf,MAAQ,GAAKA,EAEfA,GACDV,KAAK+f,YAAYrf,GAGnB,MAAMsf,EAAU,GAAKhgB,KAAK8f,KACpB3Y,EAAQ6Y,EAAQC,QAAQ,KAC9BjgB,KAAKkgB,UAAsB,IAAX/Y,EAAe,EAAI6Y,EAAQnf,OAASsG,EAAQ,EAI5DnH,KAAKoB,UAAUkD,OAAOtE,KAAK6f,OAAQH,GAGjChf,YACF,OAAQV,KAAK0f,KAAKhf,MAGbyf,YAAYhB,GACjBnf,KAAKmf,OAASA,EAqBTiB,eACLpgB,KAAK0f,KAAKrf,iBAAiB,QAASL,KAAKsO,SACzCtO,KAAKqgB,iBAAmB1C,GAAoB3d,KAAKoB,UAAWpB,KAAKse,YAAate,KAAK+d,YAAa/d,KAAKqe,WAShG0B,YAAYrf,GACjBV,KAAK0f,KAAKhf,MAAQ,GAAKA,EACvBV,KAAK2f,WAAW3f,KAAK0f,KAAKhf,OAGrB4f,YAAY5f,GACjBV,KAAK0f,KAAKhf,MAAQ,KAAOV,KAAK0f,KAAKhf,MAAQA,GAC3CV,KAAK2f,WAAW3f,KAAK0f,KAAKhf,OAGrBif,UAAUjf,GACf,IAAI6f,GAAY7f,EAAQV,KAAKiD,MAAQjD,KAAK6C,IAAM7C,KAAKiD,KACrDsd,GAAW,EAAAC,GAAA,GAAMD,EAAU,EAAG,GAG3BvgB,KAAKqf,aACNrf,KAAK6f,OAAOvc,MAAMmd,UAAY,UAAUF,KAExCvgB,KAAK6f,OAAOvc,MAAM1B,MAAoB,IAAX2e,EAAkB,IAIvChB,MAAMvB,G,MACd,MAAM0C,EAAU1gB,KAAKsf,SAAWtf,KAAKwf,KAAK3d,OAAS7B,KAAKwf,KAAK5d,MACvD+e,GAAkB,EAAAH,GAAA,GAAMxgB,KAAKsf,WAAatB,EAAMG,EAAIne,KAAKwf,KAAKoB,QAAU5C,EAAMC,EAAIje,KAAKwf,KAAKqB,KAAM,EAAGH,GAE3G,IAAIhgB,EAAQV,KAAKiD,IAAO0d,EAAkBD,GAAW1gB,KAAK6C,IAAM7C,KAAKiD,KAerE,OAbIvC,EAAQV,KAAKiD,KAASjD,KAAK6C,IAAM7C,KAAKiD,KAAO,IAC/CvC,GAASV,KAAK8f,KAAO,IAGvBpf,GAASA,EAAMogB,QAAQ9gB,KAAKkgB,UAC5Bxf,GAAQ,EAAA8f,GAAA,GAAM9f,EAAOV,KAAKiD,IAAKjD,KAAK6C,KAKpC7C,KAAK+f,YAAYrf,IACN,QAAX,EAAAV,KAAKmf,cAAM,eAAES,UAAW5f,KAAKmf,OAAOS,QAAQlf,GAErCA,EAGFqgB,kBACF/gB,KAAKqgB,mBACNrgB,KAAKqgB,mBACLrgB,KAAKqgB,iBAAmB,MAG1BrgB,KAAK0f,KAAK9Q,oBAAoB,QAAS5O,KAAKsO,SAE5CtO,KAAKmf,OAAS,IC/IlB,MAAM6B,GAAkBphB,IACtB,GAAGA,EAAQ+Y,QAAS,OAAO/Y,EAAQ+Y,QAEnC,MAAM,KAAC9J,EAAI,KAAEoS,EAAI,QAAEC,EAAO,cAAEC,EAAa,wBAAEC,GAA2BxhB,EAChE6R,EAAKpQ,SAASC,cAAc,OAClCmQ,EAAGnG,UAAY,6BAA+BuD,EAAO,UAAYA,EAAO,KACxE,EAAAwS,GAAAA,QAAO5P,GAEP,IAAI6P,EAAc1hB,EAAQ0hB,YACtBA,IACFA,EAAc1hB,EAAQ0hB,YAAcL,GAAO,IAAArV,MAAKqV,EAAMrhB,EAAQ2hB,UAAYlgB,SAASC,cAAc,QAC9F1B,EAAQ4hB,cAAaF,EAAYxb,UAAYlG,EAAQ4hB,cAG1DF,EAAY/gB,UAAUgB,IAAI,sBAC1BkQ,EAAGnN,OAAOgd,GAEV,MAAMG,IAAaN,KAAmBvhB,EAAQ6hB,SAwB9C,OArBAP,IAAW,QAAiBzP,GAAsDnR,KAChF,EAAAohB,EAAA,GAAYphB,IAGE,IAFC4gB,EAAQ5gB,KAMnBmhB,IACF,UAGCN,IAAkBC,IACnBD,EAAcQ,QAAuC,UAA7BR,EAAcphB,MAAME,OAA2BkhB,EAAcQ,YAEtE/hB,EAAQA,SAExBuhB,GACD1P,EAAGnN,OAAO6c,EAAc9N,OAGnBzT,EAAQ+Y,QAAUlH,GAwB3B,GArBmB,CAACmQ,EAAkCpS,KACpD,MAAMiC,EAAKpQ,SAASC,cAAc,OAClCmQ,EAAGlR,UAAUgB,IAAI,YAEdiO,GACDoS,EAAQ7c,SAAQC,IACXA,EAAEpF,QACHoF,EAAEpF,QAAQ4P,eAAiBA,EAE3BxK,EAAEpF,QAAU,CAAC4P,eAAAA,MAKnB,MAAM7H,EAAQia,EAAQlX,IAAIsW,IAI1B,OAFAvP,EAAGnN,UAAUqD,GAEN8J,GCrDHoQ,GAA0B,CAACpQ,EAAiBE,EAA6B/R,EAA8B4S,OAC/F5S,MAAAA,OAAO,EAAPA,EAAS4P,gBAAiB5P,EAAQ4P,eAAejO,IAAIkQ,GAAMA,EAAGpR,iBAAiBmI,KAAKiJ,IAG5F,MAAmBnR,IAErB,IAAImR,EAAGlR,UAAUmT,SAAS,mBAAoB,OAAO,EAGrD,MAAMoO,EAAarQ,EAAGF,cAAc,cACpC,EAAAmQ,EAAA,GAAYphB,GAETmR,EAAGlR,UAAUmT,SAAS,cACvB,WAEA/B,GAAUA,EAAOrR,IACjB,QAAYwhB,EAAYtP,QAM9B,GA/CyB,CACvB5S,EAMK,GACLuC,EACAyf,EACAjQ,EACAa,K,MAEA5S,EAAQmiB,OAAQ,EAChB,MAAMxD,EAA0B,QAAjB,EAAA3e,EAAQwB,iBAAS,QAAI,EAAW,OAAQxB,GACvD2e,EAAOhe,UAAUgB,IAAI,mBAErB,MAAMygB,EAAU,GAAWJ,EAAShiB,EAAQ4P,gBAI5C,OAHAwS,EAAQzhB,UAAUgB,IAAIY,GACtB0f,GAAwBtD,EAAQ5M,EAAQ/R,EAAS4S,GACjD+L,EAAOja,OAAO0d,GACPzD,G,eCtBM,MAAM0D,WAAsB,IAYzCtiB,cACEE,OAAM,GAqDD,KAAAqiB,aAAe,CAACC,GAAiB,KACtC,GAAGA,EAKD,YAJIniB,KAAKoiB,sBACPpiB,KAAKoiB,oBAAsBjV,OAAOC,WAAWpN,KAAKkiB,aAAc,OAMpE3T,aAAavO,KAAKoiB,qBAClBpiB,KAAKoiB,oBAAsB,EAE3B,MAAMC,EAAUriB,KAAK2Y,QAAQpY,UAAUmT,SAAS,iBAChD,IAA2B,IAAxB1T,KAAKsiB,gBACN,GAAItiB,KAAKuiB,kBAAmBviB,KAAKuiB,oBAA+BF,GAAWriB,KAAKsiB,eAC9E,YAEG,IAAID,EACT,OAGFriB,KAAKsQ,cAAc,kBAAkB,GACrCtQ,KAAK2Y,QAAQpY,UAAUC,OAAO,kBAGzB,KAAAgiB,aAAe,CAACL,GAAiB,KACnCniB,KAAKoiB,qBACN7T,aAAavO,KAAKoiB,qBAClBpiB,KAAKoiB,oBAAsB,GAClBpiB,KAAK2Y,QAAQpY,UAAUmT,SAAS,mBAA4C,IAAxB1T,KAAKsiB,iBAClEtiB,KAAKsQ,cAAc,kBAAkB,GACrCtQ,KAAK2Y,QAAQpY,UAAUgB,IAAI,kBAGzB4gB,IAAkBniB,KAAKsiB,iBAI3BtiB,KAAKoiB,oBAAsBjV,OAAOC,WAAWpN,KAAKkiB,aAAc,OAG3D,KAAAO,eAAkBC,IACvB,MAAML,EAAUriB,KAAK2Y,QAAQpY,UAAUmT,SAAS,iBAEhD,QAAYnN,IAATmc,EACEL,EAASriB,KAAKkiB,eACZliB,KAAKwiB,mBACL,IAAGE,IAASL,EAAS,QACX,IAATK,EAAgB1iB,KAAKkiB,eACxBliB,KAAKwiB,iBArGVxiB,KAAKoiB,oBAAsB,EAGtBO,MAAM/iB,IAOX,EAAAqH,EAAA,GAAWjH,KAAMJ,GAEjB,MAAM,eAAC4P,EAAc,QAAEmJ,GAAW3Y,KAE/B,GAAA4c,mBACDpN,EAAejO,IAAIoX,EAAnBnJ,CAA4B,SAAUlP,IACjCN,KAAK4iB,uBAAwB,EAAAC,GAAA,GAAgBviB,EAAEkY,OAAQxY,KAAK4iB,uBAI/D5iB,KAAKyiB,qBAaPjT,EAAejO,IAAIoX,EAAnBnJ,CAA4B,aAAa,KACvCxP,KAAKwiB,kBAGPhT,EAAejO,IAAIoX,EAAnBnJ,CAA4B,cAAc,KACxCxP,KAAKwiB,cAAa,MAGpBhT,EAAejO,IAAIoX,EAAnBnJ,CAA4B,cAAelP,IACtCA,EAAEwiB,eAAiB9iB,KAAK+iB,yBAA0B,EAAAF,GAAA,GAAgBviB,EAAEwiB,cAAe9iB,KAAK+iB,wBACzF/iB,KAAKwiB,cAAa,GAIpBxiB,KAAKkiB,mBAyDJc,aAAaC,GAClBjjB,KAAKsiB,eAAiBW,EAEtBjjB,KAAK2Y,QAAQpY,UAAUsD,OAAO,iBAA6B,IAAZof,GAC/CjjB,KAAKyiB,eAAeQ,I,eCjHjB,MAAMC,WAA0BjE,GAQrCtf,YAAY2W,EAA6C6M,EAAsB/D,EAA0BC,GACvGxf,MAAM,CACJigB,KAAM,IAAO,GAAK,IAClB7c,IAAK,EACLJ,IAAK,EACLuc,eAAAA,EACAC,aAAAA,GACC,GAZK,KAAA+D,YAAc,EAuDd,KAAAC,aAAe,KACvBrjB,KAAK6C,IAAM7C,KAAKsW,MAAMmB,SACtBzX,KAAK0f,KAAKxf,aAAa,MAAO,GAAKF,KAAK6C,MAGhC,KAAAqW,QAAU,KAClBlZ,KAAK+f,eAGG,KAAAxH,OAAS,KACjB,IAAI+K,EAAI,KACNtjB,KAAK+f,cAEL/f,KAAKojB,YAAcpjB,KAAKsW,MAAM8C,OAAS,EAAIjM,OAAOoW,sBAAsBD,IAGvEtjB,KAAKojB,aACNjW,OAAOqW,qBAAqBxjB,KAAKojB,aAGhCpjB,KAAKmjB,YACNnjB,KAAKyjB,kBAGPzjB,KAAKojB,YAAcjW,OAAOoW,sBAAsBD,IAGxC,KAAAI,aAAe,KACpB1jB,KAAKsW,MAAM8C,SACZpZ,KAAK+f,cAEF/f,KAAKmjB,YACNnjB,KAAKyjB,oBAKD,KAAAE,WAAcrjB,IACtBN,KAAKyjB,mBA/EFnN,GACDtW,KAAK+Y,SAASzC,EAAO6M,GAIlBpK,SAASzC,EAAyB6M,GAAa,GACjDnjB,KAAKsW,OACNtW,KAAK+gB,kBAGJoC,IAAenjB,KAAK4jB,YACrB5jB,KAAK4jB,WAAaviB,SAASC,cAAc,OACzCtB,KAAK4jB,WAAWrjB,UAAUgB,IAAI,wBAAyB,yBACvDvB,KAAKoB,UAAU8C,QAAQlE,KAAK4jB,aAEpB5jB,KAAK4jB,YACb5jB,KAAK4jB,WAAWrjB,UAAUsD,OAAO,QAASsf,GAG5CnjB,KAAKsW,MAAQA,EACbtW,KAAKmjB,WAAaA,IACd7M,EAAM8C,QAAU9C,EAAMgB,YAAc,IACtCtX,KAAKuY,SAGP,IAAIiF,GAAa,EACjBxd,KAAK6jB,aACL7jB,KAAKogB,eACLpgB,KAAKmgB,YAAY,CACf7B,YAAa,KACXd,GAAcxd,KAAKsW,MAAM8C,OACzBoE,GAAcxd,KAAKsW,MAAMjU,SAG3Bgc,UAAY/d,IAEVkd,GAAcxd,KAAKsW,MAAM5T,UA8CrB6c,MAAMjf,GACd,MAAMwjB,EAAYjkB,MAAM0f,MAAMjf,GAE9B,OADAN,KAAKsW,MAAMgB,YAAcwM,EAClBA,EAGCL,kBACR,GAAG,qBAA6CzjB,KAAKsW,OAAQ,OAC7D,MAAMyN,EAAM/jB,KAAKsW,MAAM0N,SACjBC,EAAYF,EAAIljB,OAEhByW,EAActX,KAAKsW,MAAMgB,YAC/B,IAAI4M,EAAe,EAAGC,EAAM,EAC5B,IAAI,IAAI5e,EAAI,EAAGA,EAAI0e,IAAa1e,EAAG,CACjC,MAAM6e,EAAQL,EAAIK,MAAM7e,GACrB+R,GAAe8M,GAASA,GAASF,IAClCA,EAAeE,EACfD,EAAMJ,EAAII,IAAI5e,IAQlB,MAAMgb,EAAWvgB,KAAKsW,MAAMmB,SAAW0M,EAAMnkB,KAAKsW,MAAMmB,SAAW,EACnEzX,KAAK4jB,WAAWtgB,MAAM1B,MAAoB,IAAX2e,EAAkB,IAIzCsD,aACR7jB,KAAK6C,IAAM7C,KAAKsW,MAAMmB,UAAY,EAC/BzX,KAAK6C,IAAM,EACZ7C,KAAKqjB,eAELrjB,KAAKsW,MAAMjW,iBAAiB,aAAcL,KAAKqjB,cAI5CtD,cACL,GAAG,qBAA6C/f,KAAKsW,OAAQ,OAC7D,MAAMgB,EAActX,KAAKsW,MAAMgB,YAE/BzX,MAAMkgB,YAAYzI,GAGb8I,eACLvgB,MAAMugB,eACNpgB,KAAKsW,MAAMjW,iBAAiB,QAASL,KAAKkZ,SAC1ClZ,KAAKsW,MAAMjW,iBAAiB,OAAQL,KAAKuY,QACzCvY,KAAKsW,MAAMjW,iBAAiB,aAAcL,KAAK0jB,cAC/C1jB,KAAKmjB,YAAcnjB,KAAKsW,MAAMjW,iBAAiB,WAAYL,KAAK2jB,YAG3D5C,kBACLlhB,MAAMkhB,kBAEH/gB,KAAKsW,QACNtW,KAAKsW,MAAM1H,oBAAoB,aAAc5O,KAAKqjB,cAClDrjB,KAAKsW,MAAM1H,oBAAoB,QAAS5O,KAAKkZ,SAC7ClZ,KAAKsW,MAAM1H,oBAAoB,OAAQ5O,KAAKuY,QAC5CvY,KAAKsW,MAAM1H,oBAAoB,aAAc5O,KAAK0jB,cAClD1jB,KAAKmjB,YAAcnjB,KAAKsW,MAAM1H,oBAAoB,WAAY5O,KAAK2jB,aAGlE3jB,KAAKojB,cACNjW,OAAOqW,qBAAqBxjB,KAAKojB,aACjCpjB,KAAKojB,YAAc,IAKlB,MAAMiB,WAAuBpF,GAKlCtf,YAAsB6P,EAA0C8P,GAAW,GACzEzf,MAAM,CACJigB,KAAM,IACN7c,IAAK,EACLJ,IAAK,EACLyc,SAAAA,GACC,GANiB,KAAA9P,eAAAA,EAA0C,KAAA8P,SAAAA,EAsCxD,KAAAgF,YAAehkB,IACrBA,IAAK,EAAAohB,EAAA,GAAYphB,GACjB,UAAoC,UAG9B,KAAAikB,UAAY,KAElB,MAAM,OAAC3J,EAAM,MAAEC,GAAS,GACxB,IACI2J,EAEFA,GADE5J,GAAUC,EACA,EACJD,EAAS,GACL,EACJA,EAAS,GAAKA,EAAS,IACnB,EAEA,EAGdyJ,GAAeI,MAAM1f,SAAQ8J,GAAQ7O,KAAK6O,KAAKtO,UAAUC,OAAO,SAAWqO,KAC3E7O,KAAK6O,KAAKtO,UAAUgB,IAAI,SAAW8iB,GAAeI,MAAMD,IAEpDxkB,KAAKkf,WACPlf,KAAK+f,YAAYlF,EAAQ,EAAID,IAtD/B5a,KAAKogB,eACLpgB,KAAKmgB,YAAY,CACfP,QAAStI,IACP,MAAM5W,EAAQsC,KAAKH,IAAIG,KAAKC,IAAIqU,EAAa,GAAI,GAIjD,UAAmC,EACnC,UAAoC5W,KAQxC,MAAM4K,EAAY,gBACZoZ,EAAM1kB,KAAK0kB,IAAMrjB,SAASC,cAAc,OAC9CojB,EAAInkB,UAAUgB,IAAI,WAAY+J,GAC9B,MAAMuD,EAAO7O,KAAK6O,KAAOxN,SAASC,cAAc,QAChDuN,EAAKtO,UAAUgB,IAAI+J,EAAY,UAE/BoZ,EAAIpgB,OAAOuK,EAAM7O,KAAKoB,YAEtB,QAAiByN,EAAM7O,KAAKskB,YAAa,CAAC9U,eAAgBxP,KAAKwP,iBAC/DxP,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,wBAAyBA,KAAKukB,WAEjEvkB,KAAKukB,aAvCQ,GAAAE,MAAQ,CAAC,aAAc,cAAe,cAAe,aAuEvD,MAAME,WAAoB1C,GAiBvCtiB,aAAY,MAACsX,EAAK,KAAEvU,GAAO,EAAK,WAAEygB,GAAa,EAAK,SAAE1L,EAAQ,yBAAEmN,IAmC9D,GA5BA/kB,QAEAG,KAAKiX,MAAQA,EACbjX,KAAK6kB,QAAUxjB,SAASC,cAAc,OACtCtB,KAAK6kB,QAAQtkB,UAAUgB,IAAI,gBAE3BvB,KAAK4kB,yBAA2BA,EAEhC5kB,KAAKwP,eAAiB,IAAI,IAE1BxP,KAAK2iB,MAAM,CACThK,QAAS3Y,KAAK6kB,QACdrV,eAAgBxP,KAAKwP,eACrB+S,gBAAiB,MACPviB,KAAKiX,MAAMmC,QAAYpZ,KAAK8kB,oBAAuB9kB,KAAK8kB,mBAAmBvkB,UAAUmT,SAAS,cAExGqP,uBAAwB,uBACxBH,qBAAsB,mBAGxB3L,EAAM8N,WAAW5gB,aAAanE,KAAK6kB,QAAS5N,GAC5CjX,KAAK6kB,QAAQG,YAAY/N,GAEzBjX,KAAKilB,KAAO,UAEZjlB,KAAKklB,YAAYzN,GACjBzX,KAAKmlB,mBAEY,YAAdnlB,KAAKilB,KAAoB,CAC1B,MAAMG,EAAWplB,KAAK6kB,QAAQtT,cAAc,qCAC5CvR,KAAKqlB,SAAW,IAAInC,GAAkBjM,EAAOkM,GAC7CiC,EAASlhB,QAAQlE,KAAKqlB,SAASjkB,WAG9BsB,GACeuU,EAAMvU,OACduL,OAAOJ,IACG,oBAAbA,EAAI/J,OACLmT,EAAM4D,OAAQ,EACd5D,EAAMtV,UAAW,EACjBsV,EAAMvU,WAEP4iB,SAAQ,KACTtlB,KAAK6kB,QAAQtkB,UAAUsD,OAAO,cAAe7D,KAAKiX,MAAMmC,WAMtD8L,YAAYK,GAClB,MAAM,QAACV,EAAO,MAAE5N,EAAK,KAAEgO,EAAI,eAAEzV,GAAkBxP,KAE/C6kB,EAAQtkB,UAAUgB,IAAI0jB,GAEtB,MAAMpf,EAAO7F,KAAKwlB,gBAElB,IAAIC,EAEJ,GAHAZ,EAAQa,mBAAmB,YAAa7f,GAG5B,YAATof,EAAoB,CACrBjlB,KAAK8kB,mBAAqB9kB,KAAK6kB,QAAQtT,cAAc,kBAErD,MAAM1N,EAASghB,EAAQrT,iBAAiB,WAClCmU,EAAmBd,EAAQtT,cAAc,eACzCqU,EAAcf,EAAQtT,cAAc,iBAC1CkU,EAAeZ,EAAQtT,cAAc,kBACrCkU,EAAa3f,UAAY+f,OAAwB,EAAjB5O,EAAMQ,UAAcqO,WAEpD,MAAMC,EAAiB,IAAI1B,GAAe7U,GAEpCwW,EAAenB,EAAQtT,cAAc,kBAC3CwU,EAAerB,IAAInkB,UAAUC,OAAO,YACpCwlB,EAAa7hB,aAAa4hB,EAAerB,IAAKkB,EAAY3hB,eAE1DoG,MAAMC,KAAKzG,GAAQkB,SAASwZ,IAC1B/O,EAAejO,IAAIgd,EAAnB/O,CAA2B,SAAS,KAClCxP,KAAKimB,mBAIL,GAAArJ,qBACFpN,EAAejO,IAAI0V,EAAnBzH,CAA0B,SAAS,KACjCxP,KAAKimB,gBAGPzW,EAAejO,IAAIF,SAAnBmO,CAA6B,WAAYlP,IACvC,GAAGuK,EAAA,uBAA2B,EAC5B,OAGF,MAAM,IAACsF,EAAG,KAAE+V,GAAQ5lB,EAEpB,IAAI6lB,GAAO,EACX,GAAY,SAATD,EACDlmB,KAAKomB,wBACA,GAAY,SAATF,EACR,UAAoC,cAC/B,GAAY,UAATA,EACRlmB,KAAKimB,kBACA,IAAG3lB,EAAE+lB,QAAoB,UAATH,GAA6B,UAATA,GAQjCrB,EAAQtkB,UAAUmT,SAAS,qBAAgC,cAARvD,GAA+B,eAARA,EAIlFgW,GAAO,EAHI,cAARhW,EAAqB,gBAAwC,CAAC/J,OAAQ,iBACpE,eAAuC,CAACA,OAAQ,oBAVO,CAC5D,MAAM7E,EAAe,UAAT2kB,EAAmB,GAAK,EAC9B5N,EAAe,gBAEfgO,EADM3B,GAAY4B,eAAetG,QAAQ3H,GACzB/W,EACnB+kB,GAAW,GAAKA,EAAU3B,GAAY4B,eAAe1lB,SACtD,gBAA0C8jB,GAAY4B,eAAeD,IASzE,OAAGH,IACD,EAAAzE,EAAA,GAAYphB,IACL,QAFT,MAkBJkP,EAAejO,IAAI0V,EAAnBzH,CAA0B,YAAY,KAChC,GAAAoN,oBACF5c,KAAKomB,sBAIT5W,EAAejO,IAAIokB,EAAnBnW,CAAqC,SAAS,KAC5CxP,KAAKomB,uBAGP,SAAsBvB,EAAS7kB,KAAKwmB,aAAahe,KAAKxI,KAAM2lB,GAAmBnW,GAE/EA,EAAejO,IAAI0V,EAAnBzH,CAA0B,cAAc,KACtCoW,EAAY9f,UAAY+f,OAA2B,EAApB5O,EAAMK,aAAiBwO,cAGxDtW,EAAejO,IAAI0V,EAAnBzH,CAA0B,QAAQ,KAChCqV,EAAQtkB,UAAUgB,IAAI,UAElB,GAAAqb,oBACFpN,EAAejO,IAAI0V,EAAnBzH,CAA0B,QAAQ,KAChCxP,KAAKkiB,cAAa,QAGrB,CAAC/G,MAAM,IAEV3L,EAAejO,IAAI0V,EAAnBzH,CAA0B,SAAS,KACjCxP,KAAKwiB,cAAa,MAGpBhT,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,yBAAyB,KACrDxP,KAAKymB,yBAITjX,EAAejO,IAAI0V,EAAnBzH,CAA0B,QAAQ,KAChCqV,EAAQtkB,UAAUgB,IAAI,iBAGxBiO,EAAejO,IAAI0V,EAAnBzH,CAA0B,SAAS,KACjCqV,EAAQtkB,UAAUC,OAAO,iBAGxByW,EAAMQ,UAAY8N,EACnBE,EAAa3f,UAAY+f,OAAO7iB,KAAKE,MAAM+T,EAAMQ,UAAY8N,IAAeO,YAE5E,SAAY7O,GAAOlV,MAAK,KACtB0jB,EAAa3f,UAAY+f,OAAO7iB,KAAKE,MAAM+T,EAAMQ,WAAWqO,cAKxDG,aACRjmB,KAAKiX,MAAMjX,KAAKiX,MAAMmC,OAAS,OAAS,WAGlCoM,gBACN,MAAMP,EAAOjlB,KAAKilB,KAClB,GAAY,YAATA,EACD,MAAO,0BACUA,iFACHA,gEACAA,mJAGkBA,oVAQAA,uHACAA,uHAO1BE,mBACR,MAAMvD,EAA4C+C,GAAY4B,eAAe7b,KAAI,CAACgc,EAAMvgB,KAC/E,CAELqb,YAAakF,EAAO,IACpBxF,QAAS,KACP,gBAA0CwF,OAI1C1E,EAAU,GAAWJ,GAC3BI,EAAQzhB,UAAUgB,IAAI,YACtBsgB,GACE7hB,KAAK8kB,mBACL9kB,KAAK4kB,yBAA2B,KAC9B5kB,KAAK4kB,0BAAyB,SAC5Bre,OACJA,EACAvG,KAAK4kB,yBAA2B,KAC9B5kB,KAAK4kB,0BAAyB,SAC5Bre,GAENvG,KAAK8kB,mBAAmBxgB,OAAO0d,GAE/BhiB,KAAKymB,sBAGGA,sBACR,MAAM3B,EAAqB9kB,KAAK8kB,mBAChCH,GAAYgC,qBAAqB5hB,SAASuG,IACxCA,EAAY,SAAWA,EACvBwZ,EAAmBvkB,UAAUC,OAAO8K,MAGtC,IAAInF,EAAMwe,GAAY4B,eAAetG,QAAQ,kBACjC,IAAT9Z,IAAYA,EAAMwe,GAAY4B,eAAetG,QAAQ,IAExD6E,EAAmBvkB,UAAUgB,IAAI,SAAWojB,GAAYgC,qBAAqBxgB,IAGrEigB,mBACR,MAAMQ,EAAS5mB,KAAK6kB,QAGpB,GAAG,GAAAgC,gBAAiB,CAClB,MAAM5P,EAAQjX,KAAKiX,MAGnB,OAFAA,EAAM6P,6BACN7P,EAAM8P,mBAIJ,YAyBF,YAdA,SAAkBH,GAkBZJ,aAAab,GACrB,MAAMqB,GAAS,WACfhnB,KAAK6kB,QAAQtkB,UAAUsD,OAAO,mBAAoBmjB,GAC9CA,GAKFrB,EAAiBplB,UAAUC,OAAO,oBAClCmlB,EAAiBplB,UAAUgB,IAAI,qBAC/BokB,EAAiBzlB,aAAa,QAAS,sBANvCylB,EAAiBplB,UAAUC,OAAO,qBAClCmlB,EAAiBplB,UAAUgB,IAAI,oBAC/BokB,EAAiBzlB,aAAa,QAAS,gBAQpC6gB,kBACLlhB,MAAMsL,UACNnL,KAAKwP,eAAeS,YACpBjQ,KAAKqlB,SAAStE,kBACd/gB,KAAK4kB,8BAA2Bre,GA7UnB,GAAAggB,eAAiB,CAAC,GAAK,EAAG,IAAK,GAC/B,GAAAI,qBAAuB,CAAC,cAAe,cAAe,cAAe,e,+CCpQvE,SAASM,GAA6CC,GACnE,OCHa,SAAmDC,EAAgCD,GAChG,IACI1iB,EADA4iB,GAAU,EAGd,MAAO,IAAIC,KACT7iB,EAAO6iB,EAEFD,IACHA,GAAU,EAEVD,GAAY,KACVC,GAAU,EAEVF,KAAM1iB,QDVL8iB,CAAa,MAASJ,G,eEChB,SAASK,GAAYxL,EAAemE,EAAW,GAC5D,GAAa,IAAVnE,EAAa,OAAO,IAAAnQ,MAAK,aAAc,CAAC,IAE3C,MACM4b,EAAKtH,EAAW,EAAI,EAAIA,EAGxB3a,EAAIvC,KAAKykB,MAAMzkB,KAAK0kB,IAAI3L,GAAS/Y,KAAK0kB,IAJlC,OAMV,OAAO,IAAA9b,MAJsB,CAAC,aAAc,cAAe,cAAe,eAIxDrG,GAAI,CAACoiB,YAAY5L,EAAQ/Y,KAAK4kB,IANtC,KAM6CriB,IAAIub,QAAQ0G,M,eC4UrE,SAASK,GAA2BC,GAAiB,GACnD,MAAMC,EAAY,IAAI,KAAqB,CAACC,YAAY,EAAMF,eAAAA,IAQ9D,OAPAC,EAAUE,YAENH,IACFC,EAAUG,OAAOC,eAAe,KAAM,IAAK,MAC3CJ,EAAUK,YAAc,cAGnBL,EApUTld,EAAA,yBAA2B,uBAAuB,EAAEV,KAAAA,EAAMhB,OAAAA,MACxDgB,EAAKpF,SAAQgE,IACX,MAAMsf,EAAO,cAActf,qBAAuBI,MACjDkB,MAAMC,KAAKjJ,SAASmQ,iBAAiB,0BAA0B6W,4BAA+BA,MAA4BtjB,SAAQa,IACjIA,EAAKrF,UAAUC,OAAO,sBAmUrB,MAAM8nB,GAAoBlgB,IAC/B,IAAIgV,EAAmBzW,EAErB,MAAM4hB,GAAangB,EAAO7H,UAAUmT,SAAS,qBACvCtS,GAAY,EAAAyhB,GAAA,GAAgBza,EAASmgB,EAAyB,gBAAb,YACvD,GAAGnnB,EAAW,CACZ,MAAMinB,EAAO,+BACPG,EAAoB,wBAAwBH,IAClD,IAAII,EAOJ,GAHEA,EAHErgB,EAAOsgB,QAAQF,GAGL,CAACA,GAFD,CAAC,kBAAkBH,IAAQ,eAAeA,KAKrDE,EAAW,CACZ,MAAMI,EAAS,yBACfF,EAAYA,EAAU/d,KAAI4O,GAAKqP,EAASrP,IAG1C,MAAMsP,EAAWH,EAAUI,KAAK,MAE1BC,EAAWze,MAAMC,KAAKlJ,EAAUoQ,iBAAiBoX,IACjDziB,EAAM2iB,EAAS7I,QAAQ7X,GAEvB2gB,EAA0BD,EAASpe,KAAIiO,IAAW,CAAExP,OAAQwP,EAAQqQ,QAAQ7f,OAAO8f,WAAYlgB,KAAM4P,EAAQqQ,QAAQjgB,QAE3HqU,EAAO2L,EAAWnoB,MAAM,EAAGuF,GAC3BQ,EAAOoiB,EAAWnoB,MAAMuF,EAAM,GAIlC,MAAO,CAACiX,EAAMzW,IAGD,MAAMuiB,WAAqBC,YAA1C,c,oBAIS,KAAAC,UAAW,EACX,KAAAC,cAAe,EAEf,KAAAC,YAAa,EAKZ,KAAA9Z,eAAiB,IAAI,IAKtB+Z,S,QACLvpB,KAAKO,UAAUgB,IAAI,SAEnBvB,KAAKgpB,QAAQjgB,IAAM,GAAK/I,KAAKkG,QAAQ6C,IACrC/I,KAAKgpB,QAAQ7f,OAAS,GAAKnJ,KAAKkG,QAAQiD,OAExC,MAAM0O,EAAkB5O,EAAA,sBAAuCjJ,KAAKkG,SAC9DsjB,EAA2B,UAAb3R,EAAI5X,KAClB2b,GAAW5b,KAAKqpB,cAAgBG,EAChCC,EAAazpB,KAAKkG,QAAQ8U,OAAO0O,YACjCC,EAAYF,GAAczpB,KAAK+nB,UAE/B6B,EAAc/D,OAAsB,EAAfhO,EAAIJ,UAAcqO,WAE7C9lB,KAAK8F,UAAY,wOAQjB,MAAMjC,EAAS7D,KAAK6pB,kBAEdC,EAAczoB,SAASC,cAAc,OAC3CwoB,EAAYvpB,UAAUgB,IAAI,kBAEI,UAAbsW,EAAI5X,MAAoBD,KAAKkG,SAAWlG,KAAKkG,QAAQ8U,OAAOE,cAE3Elb,KAAKO,UAAUgB,IAAI,aAGlBooB,IACD3pB,KAAKO,UAAUgB,IAAI,eACnBvB,KAAKsE,OAAOwlB,IAGd,MAAMC,EAAanO,EAjTvB,SAA0BoO,GACxBA,EAAQzpB,UAAUgB,IAAI,YAEtB,MAAM2E,EAAU8jB,EAAQ9jB,QAClB2R,EAAM5O,EAAA,sBAAuC/C,GAEhDA,EAAQ8U,OAAOiP,KAChBD,EAAQzpB,UAAUgB,IAAI,UAGxB,IAAI2oB,EAAYrS,EAAI2E,WAAWnK,MAAKkK,GAA6B,2BAAhBA,EAAUjT,IAA6E4gB,UAAY,IAAIplB,WAAW,IACnKolB,EAhHK,SAAwBA,GACxBA,aAAoBplB,aACvBolB,EAAW,IAAIplB,WAAWolB,IAG5B,MACMC,EAD6B,EAAlBD,EAASrpB,OACI,EAAI,EAClC,IAAIspB,EACF,OAAO,IAAIrlB,WAAW,IAGxB,IAAIyD,EACJ,IACE,MAAM6hB,EAAW,IAAIC,SAASH,EAASI,QACvC/hB,EAAS,IAAIzD,WAAWqlB,GACxB,IAAI,IAAI5kB,EAAI,EAAGA,EAAI4kB,EAAY5kB,IAAK,CAClC,MAAMglB,EAAgB,EAAJhlB,EAAQ,EAAI,EACxBilB,EAAe,EAAJjlB,EAAQ,EACnB7E,EAAQ0pB,EAASK,UAAUF,GAAW,GAC5ChiB,EAAOhD,GAAM7E,GAAS8pB,EAAY,IAEpC,MAAM3c,GACNtF,EAAS,IAAIzD,WAAW,IAY1B,OAAOyD,EA8EImiB,CAAeR,EAAStpB,MAAM,EAAG,KAE5C,MAAM,IAAC+pB,EAAKvpB,UAAWwpB,EAAY,OAAEC,GA7EvC,SAA4BX,EAAsBzS,GAChD,MAGMqT,EAAeC,EAAA,YAAsB,GAAK,GAG1CC,EAAOD,EAAA,YAAsB,IAAM,IACnCE,EAAOF,EAAA,YAAsB,IAAM,IACnCF,GAAS,EAAArK,GAAA,GAAM/I,EAAW,GAAKwT,EAAMD,EAAMC,GAE3CN,EAAMtpB,SAAS6pB,gBAAgB,6BAA8B,OACnEP,EAAIpqB,UAAUgB,IAAI,uBAClBopB,EAAIxC,eAAe,KAAM,QAAS,GAAK0C,GACvCF,EAAIxC,eAAe,KAAM,SAAU,GAAK2C,GACxCH,EAAIxC,eAAe,KAAM,UAAW,OAAO0C,KAAUC,KAIrD,MAAMK,EAAYnoB,KAAKH,OAAOqnB,GACxBkB,EAASlB,EAASrpB,OAASqpB,EAASrpB,OAAS,IAC7CwqB,EAAWroB,KAAKC,IAAK4nB,EAAS,EAA0B,EAAGO,GAEjE,IAAIE,EAAW,EACf,MAAMC,EAAWT,EArBI,EAuBrB,IAAIjlB,EAAO,GACX,IAAI,IAAIN,EAAI,EAAGimB,EAAO,EAAGC,EAAO,EAAGlmB,EAAI6lB,IAAU7lB,EAAG,CAClD,MAAM7E,EAAQwpB,EAAS3kB,IAAM,EAC7B,GAAIkmB,EAAOJ,GAAaD,EAAQ,CAC9BK,EAAOA,EAAOJ,EAAWD,EACzBK,GAAQJ,EAAW,GAAK,GACvBC,EAAW5qB,IAAO4qB,EAAW5qB,GAG9B,MAAMgrB,EAAY1oB,KAAKH,KAAMyoB,EAAWC,GAAcJ,EAAY,GAAK,IAAOA,EAAY,GAhCzE,GAqCjBtlB,GAHU,oBACC2lB,SAAYV,EAAeY,wBAA0CA,mCAIhFF,GAAQG,EAGNL,EADCG,GAAQJ,EAAW,GAAK,EACd,EAEA3qB,OAGV4qB,EAAW5qB,IAAO4qB,EAAW5qB,GAEhC+qB,GAAQJ,EAIZ,MAAMjqB,EAAYC,SAASC,cAAc,OAKzC,OAJAF,EAAUb,UAAUgB,IAAI,kBACxBH,EAAUkD,OAAOqmB,GAEjBA,EAAIjF,mBAAmB,YAAa7f,GAC7B,CAAC8kB,IAAAA,EAAKvpB,UAAAA,EAAWypB,OAAAA,GAgBuBe,CAAmB1B,EAAUrS,EAAIJ,UAE1EoU,EAAmBjB,EAAaxmB,WAAU,GAChDynB,EAAiBtrB,UAAUgB,IAAI,uBAC/BqpB,EAAarqB,UAAUgB,IAAI,6BAE3B,MAAMuqB,EAAoBzqB,SAASC,cAAc,OACjDwqB,EAAkBvrB,UAAUgB,IAAI,4BAChCuqB,EAAkBxnB,OAAOsmB,EAAciB,GAEvC,MAAME,EAAU1qB,SAASC,cAAc,OACvCyqB,EAAQxrB,UAAUgB,IAAI,cACtByoB,EAAQ1lB,OAAOwnB,EAAmBC,GAElC,IAAI1G,EAAWsF,EAgFf,MA9Ee,KACb,IAAIzT,EAAQ8S,EAAQ9S,MAEpB,MAOMwM,EAAe,KACnBmI,EAAiBvoB,MAAM1B,MAASsV,EAAMI,YAAcJ,EAAMO,SAAW,IAAO,OAG1EP,EAAMkC,QAAWlC,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMO,WACxEiM,IAGF,MAAMsI,EAAsB/E,GAAgBvD,GAqD5C,OApDAsG,EAAQiC,iBAAiB,aAAcD,GACvChC,EAAQiC,iBAAiB,QAASD,GAClChC,EAAQiC,iBAAiB,QAlBJ,MACnB,UAAc,KACZvI,KACQxM,EAAMkC,SACb4Q,MAgBLA,EAAQkC,aAAanqB,MAAK,KACxB,IAAImd,GAAY,EAAOiN,GAAY,EAiCnC,SAAS5M,EAAMjf,GACb,IAAI8rB,EACJ,GAAG9rB,aAAa+rB,WACdD,EAAU9rB,EAAE8rB,YACP,CACL,MAAM5M,EAAQlf,EAAEkY,OAAuBiH,wBACvC2M,EAAU9rB,EAAEgsB,cAAc,GAAGpO,MAAQsB,EAAKqB,KAG5C,MAAMiD,EAAYsI,EAAUvB,EAAqB3T,EAAMO,SACvDP,EAAMI,YAAcwM,EA1CtBuB,EAAShlB,iBAAiB,cAAeC,IACpC4e,IACDhI,EAAMxU,OACNwc,GAAY,GAEdiN,GAAY,KAEd9G,EAAShlB,iBAAiB,aAAcC,IACtC6rB,GAAY,EACTjN,GAAWK,EAAMjf,MAEtB+kB,EAAShlB,iBAAiB,aAAcC,IACtCA,EAAEme,iBACc,IAAbne,EAAEie,SACDrH,EAAMkC,QACRlC,EAAM7U,QAGRkd,EAAMjf,GACN4e,GAAY,MAEdmG,EAAShlB,iBAAiB,WAAYC,IACjC6rB,GAAajN,IACdhI,EAAMxU,OACNwc,GAAY,OAGhB,QAAiBmG,GAAW/kB,KAC1B,EAAAohB,EAAA,GAAYphB,GACR4W,EAAMkC,QAAQmG,EAAMjf,QAezBisB,GAAA,GAEI,KACLlH,EAAS7kB,SACT6kB,EAAW,KACXnO,EAAQ,OA0MmBsV,CAAiBxsB,MAnMlD,SAAmBgqB,GACjB,MAAMZ,EAAWY,EAAQZ,SAEnBljB,EAAU8jB,EAAQ9jB,QAClB2R,EAAkB5O,EAAA,sBAAuC/C,GAEzD0V,EAAuB,UAAb/D,EAAI5X,MAAiC,UAAb4X,EAAI5X,KACtCwsB,EAAgBprB,SAASC,cAAc,OAG7C,GAFAmrB,EAAclsB,UAAUgB,IAAI,sBAExBqa,EAAS,CACX,MAAM8Q,EAA2B,GAC9B7U,EAAI8U,gBACLD,EAAM5kB,MAAK,EAAA8kB,GAAA,GAAW/U,EAAI8U,iBAGzBvD,EACDsD,EAAM5kB,MAAK,SAAmB5B,EAAQ2mB,OAC7BH,EAAM7rB,QACf6rB,EAAM5kB,KAAKyf,GAAY1P,EAAI3W,OAG1B8oB,EAAQV,YACToD,EAAM5kB,KAAKmB,EAAA,mBAAoC/C,IAGjDumB,EAAcnoB,WAAU,IAAAwoB,kBAAiBJ,EAAO,QAQlD1C,EAAQtE,mBAAmB,YALd,wJAOb,MAAMqH,EAAU/C,EAAQzY,cAAc,gBAEhCyb,EAAmB,IAAI,KAC7BA,EAAiBhE,QAAQiE,WAAajD,EAAQhB,QAAQiE,WACnDrR,EACDoR,EAAiB1oB,OAAO2E,EAAA,mBAAoC/C,IAE5D8mB,EAAiBlnB,UAAY+R,EAAIqV,YAAcrV,EAAIsV,SAGrDJ,EAAQzoB,OAAO0oB,GAEZhD,EAAQV,YACTyD,EAAQzoB,OAAO2E,EAAA,eAAgC/C,IAGjD,MAAMknB,EAAcpD,EAAQzY,cAAc,mBAuC1C,OAtCA6b,EAAY9oB,OAAOmoB,GAEJ,KACb,IAAIY,GAAW,EAEXC,EAAe,IAAIpK,GAAkB8G,EAAQ9S,MAAOW,EAAIG,mBAE5DgS,EAAQiC,iBAAiB,SAAS,KAChCjC,EAAQzpB,UAAUC,OAAO,uBAEzB4sB,EAAYG,UAAUC,YAAYf,GAClCY,GAAW,KAGb,MAAM9U,EAAS,KACT8U,IACFrD,EAAQzpB,UAAUgB,IAAI,uBACtB8rB,GAAW,EAERC,GACDF,EAAYG,UAAUC,YAAYF,EAAalsB,aAWrD,OANA4oB,EAAQiC,iBAAiB,OAAQ1T,KAE7ByR,EAAQ9S,MAAMkC,QAAU4Q,EAAQ9S,MAAMI,YAAc,IACtDiB,IAGK,KACL+U,EAAavM,kBACbuM,EAAalsB,UAAUZ,SACvB8sB,EAAe,OA4GqCG,CAAUztB,MAE1D0tB,EAAe1tB,KAAKuR,cAAc,eACxCmc,EAAa5nB,UAAY8jB,EAEzB,MAAM+D,EAAS3tB,KAAK2tB,OAAU5S,IAC5B/a,KAAK2tB,YAASpnB,EAEd,MAAM2Q,EAAQlX,KAAKkX,MAAQ,YAAoClX,KAAKkG,QAAS6U,GAEvEmR,EAAelsB,KAAKksB,cAAe,UACtClsB,KAAKkX,MAAM0W,YAAc5tB,KAAKkX,MAAM2W,kBAAmB3B,EAAa/jB,UAErEnI,KAAKisB,iBAAiB,WAAW,IAAMC,EAAa/jB,WAAW,CAACgT,MAAM,IAGxEnb,KAAK8tB,iBAAmB/D,IAExB,MAAMgE,EAAa,IAAMlI,OAA2B,EAApB3O,EAAMI,aAAiBwO,YAAclK,EAAW,MAAQgO,EAAe,IAEjGrR,EAAS,KACbmV,EAAaM,UAAYD,IACzBlqB,EAAOtD,UAAUsD,OAAO,WAAYqT,EAAMkC,WAGxClC,EAAMkC,QAAWlC,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMO,WACxEc,IAGF,MAAM0N,EAAa,CAAC3lB,EAAW8Y,EAASlC,EAAMkC,UAG5C,GAFA9Y,IAAK,EAAAohB,EAAA,GAAYphB,GAEd8Y,EAAQ,CACT,MAAM6U,IAAqBjuB,KAAKkJ,cAChC,GAAG,oBAA4ClJ,KAAKkJ,eAAiB,CACnEC,OAAQ,MACRE,YAAa,CAACC,EAAG,4BACjB4B,WAAW,IACT,CACF,MAAOkS,EAAMzW,GAASsnB,EAAwB3F,GAAiBtoB,MAAtB,GACzC,cAAsC,CAACmJ,OAAQnJ,KAAKkG,QAAQiD,OAAQJ,IAAK/I,KAAKkG,QAAQ6C,KAAMqU,EAAMzW,GAGpGuQ,EAAMxU,OAAOuL,OAAM,cAEnBiJ,EAAM7U,SAsBV,OAlBA,QAAiBwB,GAASvD,GAAM2lB,EAAW3lB,IAAI,CAACkP,eAAgBxP,KAAKwP,iBAErExP,KAAKisB,iBAAiB,SAAS,KAC7BpoB,EAAOtD,UAAUC,OAAO,WACxBktB,EAAaM,UAAYpE,KAG3B5pB,KAAKisB,iBAAiB,cAAc,MAC7B/U,EAAMI,aAAeJ,EAAMkC,QAAW,qBAA6ClC,KACxFwW,EAAaM,UAAYD,QAG3B/tB,KAAKisB,iBAAiB,SAAS,KAC7BpoB,EAAOtD,UAAUC,OAAO,cAG1BR,KAAKisB,iBAAiB,OAAQ1T,GAEvB0N,GAGT,GAAa,QAAV,EAAApO,EAAIiE,cAAM,eAAEjb,OAAQ,CACrB,MAAMqtB,EAA2B,GAC3BC,EAAUC,GAAU,CACxB/nB,MAAOwR,EACP3R,QAAS,KACT9E,UAAWyC,EACXwqB,SAAU,GACVC,UAAW,GACXC,aAAcvuB,KAAKuuB,aACnBC,kBAAkB,EAClBC,cAAezuB,KAAKyuB,gBAEtB5qB,EAAOP,MAAM1B,MAAQiC,EAAOP,MAAMzB,OAAS,GACxCssB,EAAQO,OAAOC,OAAOT,EAAKpmB,KAAKqmB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAKpmB,KAAKqmB,EAAQO,OAAOE,MAEjD5uB,KAAKO,UAAUgB,IAAI,oBACnB2sB,EAAKnpB,SAAQ8pB,GAAOA,EAAItuB,UAAUgB,IAAI,iBAGxC,GAAIkoB,EA2HME,IACR3pB,KAAKgpB,QAAQS,WAAa,IAC1BzpB,KAAK+nB,UAAU+G,OAAOhF,GAAa,QA7HrB,CACd,IAAI/B,EAAkC/nB,KAAK+nB,UAE3C,MAAMgH,EAA4B,UAAblX,EAAI5X,KACzB0tB,EAAOoB,GAEP,MAAMzL,EAAK0L,IACT,GAAGhvB,KAAKkX,MAAMkB,IACZ,OAGF,8BAAsDpY,KAAKkG,QAAQiD,OAAQnJ,KAAKkG,QAAQ6C,IAAK/I,KAAKkG,QAAQ8U,OAAOC,cAEjH,MAAMgU,EAAiB,KAClBD,IACD,gBAAwChvB,KAAKkX,OAE1C,GAAAhB,YAAclW,KAAKkX,MAAMvV,WAC1B3B,KAAKkX,MAAMvV,UAAW,KAO5B,GAFAstB,KAEIlH,EACF,GAAGlQ,EAAIG,kBAAmB,CAGxB,IAAIkX,EAFJlvB,KAAKO,UAAUgB,IAAI,mBAGnB,MAAMgX,EAAS,KACb,MAAMwP,EAAYF,IAA2B,GACvCzM,GAAW,UACjBA,EAAS+T,UAAU,CAACC,KAAM,GAAIC,MAAO,MACrCjU,EAASnN,OAAM,KACbjO,KAAKkX,MAAM7U,QACX,qBAAwCkE,MAE1C6U,EAASkU,OAAS,KAChBlU,EAASkU,OAAS/C,GAAA,EAClB,MAAM1e,EAAM,IAAI0hB,MACf1hB,EAAY5N,KAAO,WACpBmb,EAASoU,OAAO3hB,IAElBka,EAAU+G,OAAOhF,GAAa,EAAO1O,GAErC8T,EAAgBlvB,KAAKisB,iBAAiB,SAAS,KAC7C7Q,EAASkU,WACR,CAACnU,MAAM,IAEV8T,KAOIQ,EAAoBzvB,KAAKisB,iBAAiB,OAAQ1T,GACxDvY,KAAKksB,aAAanqB,MAAK,KACrB/B,KAAKwP,eAAehP,OAAOivB,GAC3BzvB,KAAKwP,eAAehP,OAAO0uB,UAExB,CACLnH,EAAYF,KAERmH,IACFhvB,KAAKksB,cAAe,WAGtB,MAAM1qB,EAAO,KACXytB,IAEA,MAAMS,EAAW5X,EAAA,cAA2BD,GAS5C,OAPImX,GACFU,EAAS3tB,MAAK,KACZ/B,KAAKksB,aAAa/jB,aAItB4f,EAAU+G,OAAOhF,GAAa,EAAO4F,GAC9B,CAACA,SAAAA,IAGV3H,EAAU4H,oBAAoBnuB,GAC9BA,IAIDxB,KAAKO,UAAUmT,SAAS,mBACzB7P,EAAOS,OAAOwlB,GAEd9pB,KAAKsE,OAAOwlB,GAGd9pB,KAAKO,UAAUgB,IAAI,eAEnBvB,KAAKksB,aAAanqB,MAAK,KACrB/B,KAAKO,UAAUC,OAAO,eACtBspB,EAAYvpB,UAAUgB,IAAI,cAC1B6L,YAAW,KACT0c,EAAYtpB,WACX,KAIE,uBAAiDR,KAAKkX,QACvDlX,KAAKkX,MAAMxU,OACX,qBAAwC6D,SAMlC,QAAV,EAAAvG,KAAKkX,aAAK,eAAEkB,OACX2W,EACDzL,GAAE,IAEF,QAAiBzf,GAAQ,KACvByf,GAAE,KACD,CAACnI,MAAM,EAAMyU,SAAS,EAAM5Q,SAAS,EAAOxP,eAAgBxP,KAAKwP,mBAUxEyc,uBACF,OAAOjsB,KAAKwP,eAAejO,IAAIvB,KAAKkX,OAGtC2Y,uBACK7vB,KAAK8vB,cAIL9vB,KAAK8tB,mBACN9tB,KAAK8tB,mBACL9tB,KAAK8tB,iBAAmB,MAGvB9tB,KAAKksB,cACNlsB,KAAKksB,aAAasD,SAGpBxvB,KAAKwP,eAAeS,YACpBjQ,KAAKwP,eAAiB,KAEtBxP,KAAK+nB,UAAY,OAIrBgI,eAAeC,OAAO,gBAAiB9G,I,eCjrBxB,MAAM+G,GAOnBtwB,YAAsB2L,EAA0B4kB,GAA1B,KAAA5kB,UAAAA,EAA0B,KAAA4kB,KAAAA,EAC9ClwB,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUkK,UAAYA,EAE3BtL,KAAKmwB,OAAS9uB,SAASC,cAAc,OACrCtB,KAAKmwB,OAAO5vB,UAAUgB,IAAI+J,EAAY,WAEtCtL,KAAKsP,QAAUjO,SAASC,cAAc,OACtCtB,KAAKsP,QAAQ/O,UAAUgB,IAAI+J,EAAY,YAEvCtL,KAAKqP,MAAQhO,SAASC,cAAc,OACpCtB,KAAKqP,MAAM9O,UAAUgB,IAAI+J,EAAY,UACrCtL,KAAKqP,MAAMnP,aAAa,MAAO,QAE/BF,KAAKowB,SAAW/uB,SAASC,cAAc,OACvCtB,KAAKowB,SAAS7vB,UAAUgB,IAAI+J,EAAY,aACxCtL,KAAKowB,SAASlwB,aAAa,MAAO,QAElCF,KAAKsP,QAAQhL,OAAOtE,KAAKqP,MAAOrP,KAAKowB,UACrCpwB,KAAKoB,UAAUkD,OAAOtE,KAAKmwB,OAAQnwB,KAAKsP,UCjB5C,MAAM+gB,GAAa,GAEZ,SAASC,GAAuB1wB,G,QASrC,IAAI,MAACyP,EAAK,QAAE0d,EAAO,SAAEqD,EAAQ,WAAEG,EAAU,QAAEC,EAAO,QAAEtqB,EAAO,aAAEqoB,GAAgB3uB,OAChE2G,IAAV8I,IACoB,iBAAZ,IACPA,GAAQ,EAAAohB,GAAA,GAAaphB,EAAO,KAC5BA,EAAQ,kBAAgCA,KAG1C,EAAArB,EAAA,GAAe+e,EAAS1d,IAGtBkf,IACFA,EAAe,IAGjB,IAAIjY,EAAQpQ,GAAWA,EAAQoQ,MAC3ByC,GAAW,EAAO2X,GAAU,EAChC,MAAMC,EAAgBH,EAAUnmB,MAAMC,KAAKkmB,EAAQI,UAAUhwB,QAAU,GACvE,IAAIiwB,EACJ,GAAGva,GAASka,GAUV,GATAD,EAAWO,YAAc,GACzBP,EAAWjsB,OAAO2E,EAAA,sBAAuC/C,OAASK,OAAWA,OAAWA,OAAWA,GAAW,IAI3G+P,EAAMya,UACPza,EAAQA,EAAMya,SAGbza,EAAMjQ,OAAUiQ,EAAMjV,WAAiC,QAArB,EAAAiV,EAAMjV,SAASya,cAAM,eAAEjb,QAA0G,CACpKgwB,EAAa,gCACb,MAAMpC,EAAgB,8BAEtB,GAA4B,aAAX,QAAd,EAAAnY,EAAMjV,gBAAQ,eAAEpB,MACjB8Y,GAAW,EACXiY,GAAY,CACVnZ,IAAKvB,EAAMjV,SACX4vB,IAAKT,EACL/B,cAAAA,EACAyC,MAAOC,GAEPvvB,MAAOyuB,GACPxuB,OAAQwuB,GACRQ,WAAAA,EACAtC,aAAAA,QAEG,CACL,MAAMloB,EAAQiQ,EAAMjQ,OAASiQ,EAAMjV,SAEnCqvB,EAAyB,UAAfrqB,EAAMpG,KAEhB,IACEmuB,GAAU,CACR/nB,MAAAA,EACAjF,UAAWovB,EACXnC,SAAUgC,GACV/B,UAAW+B,GACXnvB,KAAMgb,EAAA,kBAAiC7V,EAAOgqB,GAAYA,IAC1DQ,WAAAA,EACApC,cAAAA,EACA2C,QAAQ,EACR5C,kBAAkB,EAClBD,aAAAA,IAEFxV,GAAW,EACX,MAAMlL,YAMT3H,GACDqqB,EAAWO,YAAc,GACzBP,EAAWjsB,OAAO2E,EAAA,sBAAuC/C,MAEjC,iBAAf,IACPkqB,GAAW,EAAAK,GAAA,GAAaL,EAAU,KAClCA,EAAW,kBAAgCA,KAG7C,EAAApiB,EAAA,GAAeuiB,EAAYH,GAAY,KAa3C,OATA5sB,QAAQC,IAAI8qB,GAAcxsB,MAAK,KAC1B8uB,IAAeA,MAClBF,EAAc5rB,SAAQssB,GAASA,EAAM7wB,WAElCgwB,GACDA,EAAQjwB,UAAUsD,OAAO,WAAY6sB,OAIlC3X,EAGM,MAAMuY,WAAuBrB,GAG1CtwB,YAAsB2L,GACpBzL,MAAMyL,GAAW,CAAC+D,EAAO+gB,EAAW,GAAIlqB,KAClClG,KAAKwwB,UACPxwB,KAAKwwB,QAAUnvB,SAASC,cAAc,OACtCtB,KAAKwwB,QAAQjwB,UAAUgB,IAAIvB,KAAKsL,UAAY,WAG9C,MAAMimB,EAAajB,GAAuB,CACxCjhB,MAAAA,EACA0d,QAAS/sB,KAAKqP,MACd+gB,SAAAA,EACAG,WAAYvwB,KAAKowB,SACjBI,QAASxwB,KAAKwwB,QACdtqB,QAAAA,IAGFlG,KAAKoB,UAAUb,UAAUsD,OAAO,WAAY0tB,GACzCA,EACDvxB,KAAKsP,QAAQpL,QAAQlE,KAAKwwB,SAE1BxwB,KAAKwwB,QAAQhwB,YApBG,KAAA8K,UAAAA,GC5HT,SAASkmB,GAAWhsB,EAAeisB,GAChD,OAAOjsB,EAAIf,QAAO,CAACC,EAAKhE,IAAUgE,EAAMhE,GAAO+wB,GCgC1C,MAAMC,GAOX/xB,YAAoBqc,EAAuB2V,EAA0BC,EAA0BC,EAAyBC,EAAYH,GAAhH,KAAA3V,MAAAA,EAAuB,KAAA2V,SAAAA,EAA0B,KAAAC,SAAAA,EAA0B,KAAAC,QAAAA,EAAyB,KAAAC,UAAAA,EACtH9xB,KAAKwG,MAAQwV,EAAMnb,OACnBb,KAAK+xB,OAASL,GAASM,YAAYhW,GACnChc,KAAKiyB,YAAcP,GAASQ,iBAAiBlyB,KAAK+xB,QAClD/xB,KAAKmyB,aAAeX,GAAWxxB,KAAK+xB,OAAQ,GAAK/xB,KAAKwG,MACtDxG,KAAKoyB,aAAeT,EAAW3xB,KAAK8xB,UAG/BO,SACL,OAAIryB,KAAKwG,MAGNxG,KAAKwG,OAAS,GAAKxG,KAAK+xB,OAAO1f,MAAKiR,GAAKA,EAAI,IACvC,IAAIgP,GAAgBtyB,KAAK+xB,OAAQ/xB,KAAKmyB,aAAcnyB,KAAK2xB,SAAU3xB,KAAK4xB,SAAU5xB,KAAK6xB,SAASQ,SAGvF,IAAfryB,KAAKwG,MAAoBxG,KAAKuyB,YACV,IAAfvyB,KAAKwG,MAAoBxG,KAAKwyB,cAC/BxyB,KAAKyyB,aATW,GAYjBF,YACN,MAAyB,OAArBvyB,KAAKiyB,aACHjyB,KAAKmyB,aAAe,IAAMnyB,KAAKoyB,cAC/BpyB,KAAK+xB,OAAO,GAAK/xB,KAAK+xB,OAAO,GAAK,GAC/B/xB,KAAK0yB,qBACiB,OAArB1yB,KAAKiyB,aAA6C,OAArBjyB,KAAKiyB,YACnCjyB,KAAK2yB,0BAEP3yB,KAAK4yB,qBAGNJ,cAEN,MAA2B,MAAxBxyB,KAAKiyB,YAAY,GACXjyB,KAAK6yB,0BAEP7yB,KAAK8yB,yBAGNL,aACN,MAA2B,MAAxBzyB,KAAKiyB,YAAY,GACXjyB,KAAK+yB,wBAEP/yB,KAAKgzB,yBAGNN,qBACN,MAAM9wB,EAAQ5B,KAAK2xB,SACb9vB,EAASmB,KAAKE,MAAMF,KAAKC,IAC7BrB,EAAQ5B,KAAK+xB,OAAO,GACpB/uB,KAAKC,IACHrB,EAAQ5B,KAAK+xB,OAAO,IACnB/xB,KAAK8xB,UAAY9xB,KAAK6xB,SAAW,KAEtC,MAAO,CACL,CACEoB,SAAU,CAAChV,EAAG,EAAGE,EAAG,EAAGvc,MAAAA,EAAOC,OAAAA,GAC9BqxB,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAG,EAAGE,EAAGtc,EAAS7B,KAAK6xB,QAASjwB,MAAAA,EAAOC,OAAAA,GAClDqxB,MAAOC,KAKLR,0BACN,MAAM/wB,GAAS5B,KAAK2xB,SAAW3xB,KAAK6xB,SAAW,EACzChwB,EAASmB,KAAKE,MAAMF,KAAKC,IAC7BrB,EAAQ5B,KAAK+xB,OAAO,GACpB/uB,KAAKC,IAAIrB,EAAQ5B,KAAK+xB,OAAO,GAAqB,EAAjB/xB,KAAK8xB,aAExC,MAAO,CACL,CACEmB,SAAU,CAAChV,EAAG,EAAGE,EAAG,EAAGvc,MAAAA,EAAOC,OAAAA,GAC9BqxB,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAGrc,EAAQ5B,KAAK6xB,QAAS1T,EAAG,EAAGvc,MAAAA,EAAOC,OAAAA,GACjDqxB,MAAOC,IAKLP,qBACN,MAAMQ,EAAepwB,KAAKE,MAAsB,IAAhBlD,KAAK4xB,UAC/ByB,EAAcrwB,KAAKC,IACvBD,KAAKE,MAAMF,KAAKH,IACd,IAAO7C,KAAK2xB,SAAW3xB,KAAK6xB,UAC3B7xB,KAAK2xB,SAAW3xB,KAAK6xB,SAAW7xB,KAAK+xB,OAAO,IACxC,EAAI/xB,KAAK+xB,OAAO,GAAK,EAAI/xB,KAAK+xB,OAAO,MAC5C/xB,KAAK2xB,SAAW3xB,KAAK6xB,QAAUuB,GAC3BE,EAAatzB,KAAK2xB,SACpB0B,EACArzB,KAAK6xB,QACHhwB,EAASmB,KAAKC,IAClBjD,KAAK8xB,UACL9uB,KAAKE,MAAMF,KAAKC,IACdqwB,EAAatzB,KAAK+xB,OAAO,GACzBsB,EAAcrzB,KAAK+xB,OAAO,MAE9B,MAAO,CACL,CACEkB,SAAU,CAAChV,EAAG,EAAGE,EAAG,EAAGvc,MAAO0xB,EAAYzxB,OAAAA,GAC1CqxB,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAGqV,EAAatzB,KAAK6xB,QAAS1T,EAAG,EAAGvc,MAAOyxB,EAAaxxB,OAAAA,GACnEqxB,MAAOC,IAKLN,0BACN,MAAMU,EAAcvzB,KAAK8xB,UACnB0B,EAAcxwB,KAAKE,MAAMF,KAAKC,KACjCjD,KAAK8xB,UAAY9xB,KAAK6xB,SAAW,EACjC7xB,KAAK+xB,OAAO,IAAM/xB,KAAK2xB,SAAW3xB,KAAK6xB,UACnC7xB,KAAK+xB,OAAO,GAAK/xB,KAAK+xB,OAAO,MAC9B0B,EAAeF,EACjBC,EACAxzB,KAAK6xB,QACH6B,EAAa1wB,KAAKH,IACtB7C,KAAK4xB,SACL5uB,KAAKE,MAAMF,KAAKC,KACbjD,KAAK2xB,SAAW3xB,KAAK6xB,SAAW,EACjC7uB,KAAKC,IACHuwB,EAAcxzB,KAAK+xB,OAAO,GAC1B0B,EAAezzB,KAAK+xB,OAAO,OAC3B4B,EAAY3wB,KAAKC,IACrBD,KAAKE,MAAMqwB,EAAcvzB,KAAK+xB,OAAO,IACrC/xB,KAAK2xB,SAAW3xB,KAAK6xB,QAAU6B,GAEjC,MAAO,CACL,CACET,SAAU,CAAChV,EAAG,EAAGE,EAAG,EAAGvc,MAAO+xB,EAAW9xB,OAAQ0xB,GACjDL,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAG0V,EAAY3zB,KAAK6xB,QAAS1T,EAAG,EAAGvc,MAAO8xB,EAAY7xB,OAAQ4xB,GACzEP,MAAOC,GAET,CACEF,SAAU,CAAChV,EAAG0V,EAAY3zB,KAAK6xB,QAAS1T,EAAGsV,EAAezzB,KAAK6xB,QAASjwB,MAAO8xB,EAAY7xB,OAAQ2xB,GACnGN,MAAOC,IAKLL,yBACN,MAAMQ,EAAatzB,KAAK2xB,SAClB4B,EAAcvwB,KAAKE,MAAMF,KAAKC,IAClCqwB,EAAatzB,KAAK+xB,OAAO,GACS,KAAjC/xB,KAAK8xB,UAAY9xB,KAAK6xB,WACnBwB,GAAerzB,KAAK2xB,SAAW3xB,KAAK6xB,SAAW,EAC/C4B,EAAezwB,KAAKC,IACxBjD,KAAK8xB,UAAYyB,EAAcvzB,KAAK6xB,QACpC7uB,KAAKE,MAAMF,KAAKC,IACdowB,EAAcrzB,KAAK+xB,OAAO,GAC1BsB,EAAcrzB,KAAK+xB,OAAO,MACxB6B,EAAaN,EAAaD,EAAcrzB,KAAK6xB,QAEnD,MAAO,CACL,CACEoB,SAAU,CAAChV,EAAG,EAAGE,EAAG,EAAGvc,MAAO0xB,EAAYzxB,OAAQ0xB,GAClDL,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAG,EAAGE,EAAGoV,EAAcvzB,KAAK6xB,QAASjwB,MAAOyxB,EAAaxxB,OAAQ4xB,GAC5EP,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAGoV,EAAcrzB,KAAK6xB,QAAS1T,EAAGoV,EAAcvzB,KAAK6xB,QAASjwB,MAAOgyB,EAAY/xB,OAAQ4xB,GACpGP,MAAOC,IAKLJ,wBACN,MAAM1X,EAAIrb,KAAK2xB,SACTkC,EAAK7wB,KAAKE,MAAMF,KAAKC,IACzBoY,EAAIrb,KAAK+xB,OAAO,GACkB,KAAjC/xB,KAAK8xB,UAAY9xB,KAAK6xB,WACnB5V,EAAIjZ,KAAKE,OACZlD,KAAK2xB,SAAW,EAAI3xB,KAAK6xB,UACrB7xB,KAAK+xB,OAAO,GAAK/xB,KAAK+xB,OAAO,GAAK/xB,KAAK+xB,OAAO,KAC/C+B,EAAK9wB,KAAKH,IACd7C,KAAK4xB,SACL5uB,KAAKE,MAAMF,KAAKC,IACuB,IAApCjD,KAAK2xB,SAAW,EAAI3xB,KAAK6xB,SAC1B5V,EAAIjc,KAAK+xB,OAAO,MACdgC,EAAK/wB,KAAKE,MAAMF,KAAKH,IACzBG,KAAKH,IACa,EAAhB7C,KAAK4xB,SACgC,KAApC5xB,KAAK2xB,SAAW,EAAI3xB,KAAK6xB,UAC5B5V,EAAIjc,KAAK+xB,OAAO,KACZiC,EAAK3Y,EAAIyY,EAAKC,EAAK,EAAI/zB,KAAK6xB,QAC5BoC,EAAKjxB,KAAKC,IACdjD,KAAK8xB,UAAY+B,EAAK7zB,KAAK6xB,QAC3B5V,GAEF,MAAO,CACL,CACEgX,SAAU,CAAChV,EAAG,EAAGE,EAAG,EAAGvc,MAAOyZ,EAAGxZ,OAAQgyB,GACzCX,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAG,EAAGE,EAAG0V,EAAK7zB,KAAK6xB,QAASjwB,MAAOkyB,EAAIjyB,OAAQoyB,GAC1Df,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAG6V,EAAK9zB,KAAK6xB,QAAS1T,EAAG0V,EAAK7zB,KAAK6xB,QAASjwB,MAAOoyB,EAAInyB,OAAQoyB,GAC1Ef,MAjOE,GAmOJ,CACED,SAAU,CAAChV,EAAG6V,EAAK9zB,KAAK6xB,QAAUmC,EAAKh0B,KAAK6xB,QAAS1T,EAAG0V,EAAK7zB,KAAK6xB,QAASjwB,MAAOmyB,EAAIlyB,OAAQoyB,GAC9Ff,MAAOC,IAKLH,yBACN,MAAM/W,EAAIjc,KAAK8xB,UACTgC,EAAK9wB,KAAKE,MAAMF,KAAKC,IACzBgZ,EAAIjc,KAAK+xB,OAAO,GACiB,IAAhC/xB,KAAK2xB,SAAW3xB,KAAK6xB,WAElBxW,EAAIrY,KAAKE,OACZlD,KAAK8xB,UAAY,EAAI9xB,KAAK6xB,UACtB,EAAK7xB,KAAK+xB,OAAO,GAAK,EAAK/xB,KAAK+xB,OAAO,GAAK,EAAK/xB,KAAK+xB,OAAO,KAE9D8B,EAAK7wB,KAAKE,MAAMmY,EAAIrb,KAAK+xB,OAAO,IAChCkC,EAAKjxB,KAAKE,MAAMmY,EAAIrb,KAAK+xB,OAAO,IAChCmC,EAAKjY,EAAI4X,EAAKI,EAAK,EAAIj0B,KAAK6xB,QAC5BmC,EAAKhxB,KAAKH,IACd7C,KAAK4xB,SACL5uB,KAAKC,IAAIjD,KAAK2xB,SAAWmC,EAAK9zB,KAAK6xB,QAASxW,IAE9C,MAAO,CACL,CACE4X,SAAU,CAAChV,EAAG,EAAGE,EAAG,EAAGvc,MAAOkyB,EAAIjyB,OAAQoa,GAC1CiX,MAAOC,IAET,CACEF,SAAU,CAAChV,EAAG6V,EAAK9zB,KAAK6xB,QAAS1T,EAAG,EAAGvc,MAAOoyB,EAAInyB,OAAQgyB,GAC1DX,MAAOC,GAET,CACEF,SAAU,CAAChV,EAAG6V,EAAK9zB,KAAK6xB,QAAS1T,EAAG0V,EAAK7zB,KAAK6xB,QAASjwB,MAAOoyB,EAAInyB,OAAQoyB,GAC1Ef,MAvQC,GAyQH,CACED,SAAU,CAAChV,EAAG6V,EAAK9zB,KAAK6xB,QAAS1T,EAAG0V,EAAKI,EAAK,EAAIj0B,KAAK6xB,QAASjwB,MAAOoyB,EAAInyB,OAAQqyB,GACnFhB,MAAOC,IAKLgB,mBAAmBnY,GACzB,OAAOA,EAAMtR,KAAIxJ,GAAQA,EAAKma,EAAIna,EAAK+a,IAGjCkY,wBAAwBpC,GAC9B,OAAOA,EAAOrnB,KAAI0pB,GAAUA,EAAQ,IAAO,IAAOA,EAAQ,GAAO,IAAM,MAAKvL,KAAK,KAIrF,MAAMyJ,GAIJ3yB,YAAYoyB,EAA0BI,EAA8BR,EAA0BC,EAA0BC,EAAyBC,EAAuB,EAAXH,EAAe,GAAtI,KAAAQ,aAAAA,EAA8B,KAAAR,SAAAA,EAA0B,KAAAC,SAAAA,EAA0B,KAAAC,QAAAA,EAAyB,KAAAC,UAAAA,EAC/I9xB,KAAK+xB,OAASO,GAAgB+B,WAAWtC,EAAQI,GACjDnyB,KAAKwG,MAAQurB,EAAOlxB,OAGdszB,kBAAkBpC,EAAkBI,GAG1C,OAAOJ,EAAOrnB,KAAI0pB,GACTjC,EAAe,KACrB,EAAA3R,GAAA,GAAM4T,EAAO,EAJE,OAKf,EAAA5T,GAAA,GAAM4T,EAJS,MAIS,KAItB/B,SACL,IAAI9pB,EAAS,IAAI8B,MAAwBrK,KAAKwG,OAE1C8tB,EAAsB,GAC1B,MAAMC,EAAc,CAACC,EAAgBhuB,KACnC,MACMiuB,EAAMjD,GADGxxB,KAAK+xB,OAAOnxB,MAAM4zB,EAAQA,EAAShuB,GACnB,GAC/B,OAAQxG,KAAK2xB,UAAYnrB,EAAQ,GAAKxG,KAAK6xB,SAAW4C,GAElDC,EAAeC,IACnB,IAAIC,EAAoB,GACpBJ,EAAS,EACb,IAAI,IAAIhuB,KAASmuB,EACfC,EAAQ9sB,KAAKysB,EAAYC,EAAQhuB,IACjCguB,GAAUhuB,EAEZ8tB,EAASxsB,KAAK,CAAC6sB,WAAAA,EAAYC,QAAAA,KAG7B,IAAI,IAAIC,EAAQ,EAAGA,IAAU70B,KAAKwG,QAASquB,EAAO,CAChD,MAAMC,EAAS90B,KAAKwG,MAAQquB,EACzBA,EAAQ,GAAKC,EAAS,GAGzBJ,EAAY,CAACG,EAAOC,IAEtB,IAAI,IAAID,EAAQ,EAAGA,IAAU70B,KAAKwG,MAAQ,IAAKquB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAW90B,KAAKwG,MAAQquB,IAASC,EAAQ,CAC3D,MAAMC,EAAQ/0B,KAAKwG,MAAQquB,EAAQC,EAC/BD,EAAQ,GACNC,GAAW90B,KAAKmyB,aAAe,IAAQ,EAAI,IAC3C4C,EAAQ,GAGdL,EAAY,CAACG,EAAOC,EAAQC,IAGhC,IAAI,IAAIF,EAAQ,EAAGA,IAAU70B,KAAKwG,MAAQ,IAAKquB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAW90B,KAAKwG,MAAQquB,IAASC,EACnD,IAAI,IAAIC,EAAQ,EAAGA,IAAU/0B,KAAKwG,MAAQquB,EAAQC,IAAUC,EAAO,CACjE,MAAMC,EAASh1B,KAAKwG,MAAQquB,EAAQC,EAASC,EAC1CF,EAAQ,GAAKC,EAAS,GAAKC,EAAQ,GAAKC,EAAS,GAGpDN,EAAY,CAACG,EAAOC,EAAQC,EAAOC,IAKzC,IAAIC,EAA0B,KAC1BC,EAAc,EAClB,IAAI,MAAMC,KAAWb,EAAU,CAC7B,MAAM,QAACM,EAASD,WAAYS,GAAUD,EAChCE,EAAYD,EAAOv0B,OACnBy0B,EAAc9D,GAAWoD,EAAS,GACpC50B,KAAK6xB,SAAWwD,EAAY,GAC1BE,EAAgBvyB,KAAKC,OAAO2xB,GAE5BY,GADgBxyB,KAAKH,OAAO+xB,GACpBW,EAAgBv1B,KAAK4xB,SAAY,IAAM,GAC/C6D,EAAO,MACX,IAAI,IAAIC,EAAO,EAAGA,IAASL,IAAaK,EACtC,GAAGN,EAAOM,EAAO,GAAKN,EAAOM,GAC3B,OAAO,IAGX,OAAO,GANI,GAQPC,EAAO3yB,KAAK4yB,IAAIN,EAAct1B,KAAK8xB,WAAa0D,EAAOC,IACzDR,GAAkBU,EAAOT,KAC3BD,EAAiBE,EACjBD,EAAcS,GAIlB,MAAME,EAAgBZ,EAAeN,WAChCmB,EAAiBb,EAAeL,QAC/BmB,EAAWF,EAAch1B,OAE/B,IAAIsG,EAAQ,EACRgX,EAAI,EACR,IAAI,IAAI6X,EAAM,EAAGA,IAAQD,IAAYC,EAAK,CACxC,MAAMC,EAAWJ,EAAcG,GACzBE,EAAaJ,EAAeE,GAC5Bn0B,EAASmB,KAAKE,MAAMgzB,GAE1B,IAAIjY,EAAI,EACR,IAAI,IAAIkY,EAAM,EAAGA,IAAQF,IAAYE,EAAK,CACxC,MAAMjD,EArYN,GAsYa,IAAR8C,EArYN,EADC,IAuYKA,IAAQD,EAAW,EApYtB,EAHF,IAwYa,IAARI,EApYL,EAJA,IAyYKA,IAAQF,EAAW,EAvYvB,EAFD,GA2YM7B,EAAQp0B,KAAK+xB,OAAO5qB,GACpBvF,EAASu0B,IAAQF,EAAW,EAC7Bj2B,KAAK2xB,SAAW1T,EACjBjb,KAAKE,MAAMkxB,EAAQ8B,GACvB3tB,EAAOpB,GAAS,CACd8rB,SAAU,CAAChV,EAAAA,EAAGE,EAAAA,EAAGvc,MAAAA,EAAOC,OAAAA,GACxBqxB,MAAAA,GAGFjV,GAAKrc,EAAQ5B,KAAK6xB,UAChB1qB,EAEJgX,GAAKtc,EAAS7B,KAAK6xB,QAGrB,OAAOtpB,G,0BCraI,MAAM6tB,GAenBz2B,YAAYC,GAHJ,KAAAy2B,WAAY,EACZ,KAAA1oB,WAAa,IAiEd,KAAA2oB,UAAY,KACjB,GAAGt2B,KAAK6S,aACN,OAAO,EAGT,IAAI0jB,EAAgB,EAAGC,EAAiB,EAAGC,EAAsB,EAiBjE,OAhBAz2B,KAAK02B,YAAY3xB,SAAQnC,IACpBA,EAAW+zB,YACT/zB,EAAW0zB,eACVC,EAGD3zB,EAAWg0B,YACVH,GAIH7zB,EAAWg0B,YACVJ,KAICA,IAAmBC,GAAuBF,EAAgB,GAG5D,KAAAM,aAAe,KACpB72B,KAAK6T,QAAQtT,UAAUsD,OAAO,aAAc7D,KAAKs2B,eAhFjD,EAAArvB,EAAA,GAAWjH,KAAMJ,GAEbI,KAAK6T,QAEE7T,KAAK6T,QAAQtT,UAAUmT,SAAS,gBACzC1T,KAAK62B,aAAe,KAClB72B,KAAK6T,QAAQijB,gBAAgB,YAAa92B,KAAKs2B,aAAet2B,KAAKsU,YAHrEtU,KAAK6T,QAAU,EAAa,CAAChF,KAAM,UAOjCjP,EAAQm3B,gBACV/2B,KAAKg3B,WAAa31B,SAASC,cAAc,kBACzCtB,KAAKg3B,WAAWz2B,UAAUgB,IAAI,qBAAsB,UAAYvB,KAAK2N,YACrE3N,KAAKg3B,WAAW92B,aAAa,OAAQ,GAAKF,KAAKmJ,QAE3CvJ,EAAQq3B,kBACVj3B,KAAK+S,WAAa,IAAIN,GAAYO,IAChChT,KAAK6S,aAAeG,EACpBhT,KAAK62B,eACL72B,KAAKg3B,WAAWx2B,YAGlBR,KAAK+S,WAAW3R,UAAUkD,OAAOtE,KAAKg3B,cAI1Ch3B,KAAK02B,YAAY3xB,SAAQnC,IACvB5C,KAAKwP,eAAejO,IAAIqB,EAAW7C,MAAnCC,CAA0C,QAASA,KAAK62B,iBAG1D72B,KAAK62B,eAGIviB,eACT,OAAOtU,KAAKq2B,UAGH/hB,aAAS5T,GAClBV,KAAKq2B,UAAY31B,EACjBV,KAAK02B,YAAY3xB,SAAQnC,GAAcA,EAAW7C,MAAM+2B,gBAAgB,WAAYp2B,KACpFV,KAAK62B,eAGAK,gBAAgB7uB,EAAuB8uB,GAAkB,GAC9Dn3B,KAAKsU,UAAW,EAChBjM,EAAQtG,MAAK,KACRo1B,IACDn3B,KAAKsU,UAAW,MAEjB,KACDtU,KAAKsU,UAAW,MClFP,SAAS8iB,GAAUC,EAA6DtqB,GAC7F,MAAMuqB,EAAOj2B,SAASC,cAAc,QAYpC,OAVA+1B,EAAOtyB,SAAQue,IACb,MAAM,UAACliB,EAAS,MAAErB,GAASujB,EAC3BgU,EAAKhzB,OAAOlD,GACZrB,EAAMM,iBAAiB,UAAWC,IAC7BP,EAAM4hB,SACP5U,EAAShN,EAAMW,MAAOJ,SAKrBg3B,ECJM,MAAMC,GAYnB53B,YAAYC,EAgBP,IAlBE,KAAA43B,SAAU,EAmBfx3B,KAAKoB,UAAYC,SAASC,cAAc1B,EAAQ63B,YAAc73B,EAAQuhB,cAAgB,QAAU,OAChGnhB,KAAKoB,UAAUb,UAAUgB,IAAI,OAE7BvB,KAAKowB,SAAW/uB,SAASC,cAAc,OACvCtB,KAAKowB,SAAS7vB,UAAUgB,IAAI,gBAC5BvB,KAAKowB,SAASlwB,aAAa,MAAO,QAC/BN,EAAQwwB,SACuB,iBAAtBxwB,EAAgB,SACxB+F,EAAa3F,KAAKowB,SAAUxwB,EAAQwwB,UAEpCpwB,KAAKowB,SAAS9rB,OAAO1E,EAAQwwB,UAEvBxwB,EAAQ83B,iBAChB13B,KAAKowB,SAAS9rB,QAAO,IAAAsH,MAAKhM,EAAQ83B,gBAAiB93B,EAAQ+3B,mBAE7D33B,KAAKoB,UAAUkD,OAAOtE,KAAKowB,UAE3B,IAAIwH,IAAgBh4B,EAAQg4B,YAC5B,GAAGh4B,EAAQ63B,YAAc73B,EAAQuhB,cAAe,CAO9C,GANGvhB,EAAQ63B,aACTz3B,KAAKy3B,WAAa73B,EAAQ63B,WAC1Bz3B,KAAKoB,UAAUkD,OAAOtE,KAAKy3B,WAAWpkB,OACtCukB,GAAc,GAGbh4B,EAAQuhB,cAAe,CACxBnhB,KAAKmhB,cAAgBvhB,EAAQuhB,cAE7B,MAAM0W,EAAWj4B,EAAQuhB,cAAc9N,MAAM9S,UAAUmT,SAAS,yBAC7DmkB,GACD73B,KAAKoB,UAAUb,UAAUgB,IAAI,mBAC7B3B,EAAQk4B,WAAa93B,KAAKmhB,cAAc9N,QAExCukB,GAAc,EACd53B,KAAKoB,UAAUkD,OAAOtE,KAAKmhB,cAAc9N,QAGvCzT,EAAQm4B,oBAAuBF,GACjC73B,KAAKmhB,cAAcphB,MAAMM,iBAAiB,UAAU,MAClD,EAAA2N,EAAA,GAAehO,KAAKowB,UAAU,IAAAxkB,MAAK5L,KAAKmhB,cAAcphB,MAAM4hB,QAAU,mBAAqB,0BAKvF/hB,EAAQ63B,YAAc73B,EAAQuhB,eACtC9N,MAAM9S,UAAUgB,IAAI,iBAGxB,GAAG3B,EAAQyP,OAASzP,EAAQo4B,aAAc,CACxC,IAAIC,EACJ,MAAMH,EAAal4B,EAAQk4B,YAAcl4B,EAAQs4B,oBAuBjD,GAtBGJ,GACDG,EAAI52B,SAASC,cAAc,OAC3B22B,EAAE13B,UAAUgB,IAAI,iBAChBvB,KAAKoB,UAAUkD,OAAO2zB,IAEtBA,EAAIj4B,KAAKoB,UAGXpB,KAAKqP,MAAQhO,SAASC,cAAc,OACpCtB,KAAKqP,MAAM9O,UAAUgB,IAAI,aACzBvB,KAAKqP,MAAMnP,aAAa,MAAO,QAC5BN,EAAQyP,MACoB,iBAAnBzP,EAAa,MACrBI,KAAKqP,MAAMvJ,UAAYlG,EAAQyP,MAE/BrP,KAAKqP,MAAM/K,OAAO1E,EAAQyP,OAG5BrP,KAAKqP,MAAM/K,QAAO,IAAAsH,MAAKhM,EAAQo4B,eAEjCC,EAAE3zB,OAAOtE,KAAKqP,OAEXyoB,EAAY,CACb,MAAMK,EAAen4B,KAAK83B,WAAaz2B,SAASC,cAAc,OAC9D62B,EAAa53B,UAAUgB,IAAI,YAAa,mBAErC3B,EAAQs4B,qBACTC,EAAa53B,UAAUgB,IAAI,6BAGH,iBAAjB,EACP42B,EAAaryB,UAAYgyB,EAEzBK,EAAa7zB,OAAOwzB,GAGtBG,EAAE3zB,OAAO6zB,IAIVv4B,EAAQiP,OACT+oB,GAAc,EACd53B,KAAKqP,MAAM9O,UAAUgB,IAAI,QAAS,SAAW3B,EAAQiP,MACrD7O,KAAKoB,UAAUb,UAAUgB,IAAI,kBAG5Bq2B,GACD53B,KAAKoB,UAAUb,UAAUgB,IAAI,oBAG5B3B,EAAQw4B,gBACTx4B,EAAQ2L,UAAY,IAAM3L,EAAQw4B,cAAczoB,SAG/C/P,EAAQ2L,WAAa3L,EAAQ63B,YAAc73B,EAAQuhB,iBACnB,mBAAvBvhB,EAAiB,WACzBI,KAAKoB,UAAUf,iBAAiB,SAAUC,IACrCN,KAAKw3B,SACP53B,EAAQ2L,UAAkBjL,MAI/BN,KAAKoB,UAAUb,UAAUgB,IAAI,gBAAiB,gBAE1C3B,EAAQwP,WACV,EAAAiS,GAAAA,QAAOrhB,KAAKoB,eAAWmF,OAAWA,GAAW,IAS5C8xB,YAAYn3B,GACjBlB,KAAKoB,UAAUb,UAAUgB,IAAI,oBAE7B,MAAM+U,EAAQtW,KAAKsW,MAAQjV,SAASC,cAAc,OASlD,OARAgV,EAAM/V,UAAUgB,IAAI,aAEjBL,GACDoV,EAAM/V,UAAUgB,IAAI,aAAeL,GAGrClB,KAAKoB,UAAUkD,OAAOgS,GAEfA,GAIJ,MAAMgiB,GAAoB,CAACC,EAAaxrB,IACtCqqB,GAAUmB,EAAK7tB,KAAI4Y,IAAK,CAAEliB,UAAWkiB,EAAEliB,UAAWrB,MAAOujB,EAAEmU,WAAW13B,UAAUgN,GC1JlF,SAASyrB,GAAoBvX,GAC9B/L,UAAUujB,UAKdvjB,UAAUujB,UAAUC,UAAUzX,GA/BhC,SAAqCA,GACnC,IAAI0X,EAAWt3B,SAASC,cAAc,YACtCq3B,EAASj4B,MAAQugB,EAGjB0X,EAASr1B,MAAMs1B,IAAM,IACrBD,EAASr1B,MAAMud,KAAO,IACtB8X,EAASr1B,MAAMu1B,SAAW,QAE1Bx3B,SAASwY,KAAKmL,YAAY2T,GAC1BA,EAASrrB,QACTqrB,EAASG,SAET,IACEz3B,SAAS03B,YAAY,QAIrB,MAAMlrB,IAIRxM,SAASwY,KAAKmf,YAAYL,GAKxBM,CAA4BhY,G,yBCxBjB,MAAMiY,GAKnBv5B,YAAYC,GAQV,MAAMyT,EAAQrT,KAAKqT,MAAQhS,SAASC,cAAc,SAClD+R,EAAM9S,UAAUgB,IAAI,eAEjB3B,EAAQu5B,YACT9lB,EAAM9S,UAAUgB,IAAI,qBAGtB,MAAMxB,EAAQC,KAAKD,MAAQsB,SAASC,cAAc,SAClDvB,EAAME,KAAO,QACIF,EAAM+D,KAAO,eAAiBlE,EAAQkE,KAEpDlE,EAAQc,QACTX,EAAMW,MAAQd,EAAQc,MAEnBd,EAAQw5B,WACTC,EAAA,mBAA2Bt3B,MAAKu3B,IAC9Bv5B,EAAM4hB,SAAU,EAAA4X,GAAA,GAAgBD,EAAO15B,EAAQw5B,YAAcx5B,EAAQc,SAGvEX,EAAMM,iBAAiB,UAAU,KAC/Bg5B,EAAA,iBAAyBz5B,EAAQw5B,SAAUx5B,EAAQc,YAKzD,MAAM84B,EAAOx5B,KAAKw5B,KAAOn4B,SAASC,cAAc,OAChDk4B,EAAKj5B,UAAUgB,IAAI,oBAEhB3B,EAAQqhB,KACTuY,EAAK1zB,UAAYlG,EAAQqhB,KAWjBrhB,EAAQ65B,UAChB,IAAAC,OAAMF,EAAM55B,EAAQ65B,SAGtBpmB,EAAM/O,OAAOvE,EAAOy5B,GAGlB7X,cACF,OAAO3hB,KAAKD,MAAM4hB,QAGhBA,YAAQA,GACV3hB,KAAKc,iBAAiB6gB,GAEtB,MAAM3D,EAAQ,IAAI2b,MAAM,SAAU,CAACC,SAAS,EAAM5R,YAAY,IAC9DhoB,KAAKD,MAAMuQ,cAAc0N,GAGpBld,iBAAiB6gB,GACtB3hB,KAAKD,MAAM4hB,QAAUA,GCzEzB,MAAMkY,GAAUx4B,SAASC,cAAc,OAEhC,SAASw4B,GAAMxqB,IACpB,EAAAtB,EAAA,GAAe6rB,GAASvqB,GACxBjO,SAASwY,KAAKvV,OAAOu1B,IAElBA,GAAQ7Q,QAAQ3a,SAASE,cAAcsrB,GAAQ7Q,QAAQ3a,SAC1DwrB,GAAQ7Q,QAAQ3a,QAAU,GAAKjB,YAAW,KACxCysB,GAAQr5B,gBACDq5B,GAAQ7Q,QAAQ3a,UACtB,KAGE,SAAS0rB,GAASn6B,GAGvBk6B,IAAM,IAAAluB,MAAKhM,EAAQo6B,cCrBN,SAASC,GACtB/S,EACAgT,EACAC,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EACAC,EAAiDnyB,EAAgCqnB,EACjF+K,GAAa,EAEjB,MAAO,IAAI/1B,KACL81B,IAAgBA,EAAiB,IAAI92B,SAAQ,CAACg3B,EAAUC,KAAatyB,EAAUqyB,EAAUhL,EAASiL,MAEnGJ,GACD9rB,aAAa8rB,GACbE,GAAa,EACb/K,IACA8K,EAAiB,IAAI92B,SAAQ,CAACg3B,EAAUC,KAAatyB,EAAUqyB,EAAUhL,EAASiL,MAC1EN,IAERhyB,EAAQ+e,KAAM1iB,IACd+1B,GAAa,GAGfF,EAAiBjtB,YAAW,MAEvBgtB,GAAmBD,IAAkBI,GAEtCpyB,EAAQ+e,KAAM1iB,IAGhB61B,EAAiBC,EAAiBnyB,EAAUqnB,OAASjpB,EACrDg0B,GAAa,IACZL,GAEHI,EAAersB,OAAM,SACdqsB,GD9BXT,GAAQt5B,UAAUgB,IAAI,S,eEIf,MAAMm5B,WAA2B,IAatC/6B,YAAYC,GACVC,MAAMD,GAENI,KAAK26B,uBAAyBV,GAASj6B,KAAK46B,cAAcpyB,KAAKxI,MAAO,KAAK,GAAO,GAElFJ,EAAQ4P,eAAejO,IAAIvB,KAAKD,MAAhCH,CAAuC,SAAS,KAC9C,MAAMc,EAAQV,KAAK66B,WAGnB,GAAGn6B,IAAUV,KAAK86B,gBAAkBp6B,EAAMG,OAGxC,OAFAb,KAAK+6B,SAAS,EAAAC,EAAA,QAAoBh7B,KAAKJ,QAAQyT,YAC/CrT,KAAKJ,QAAQmN,UAAY/M,KAAKJ,QAAQmN,YAE7B,oBAAkCrM,GAG3CV,KAAK+6B,SAAS,EAAAC,EAAA,SAFdh7B,KAAKi7B,SAASj7B,KAAKJ,QAAQs7B,aAK1Bl7B,KAAKD,MAAMQ,UAAUmT,SAAS,SAC/B1T,KAAKJ,QAAQmN,UAAY/M,KAAKJ,QAAQmN,WAIxC/M,KAAK26B,uBAAuBj6B,MAIzBm6B,WACL,IAAIn6B,EAAQV,KAAKU,MAMjB,OALGV,KAAKJ,QAAQu7B,OACdz6B,EAAQA,EAAME,MAAMZ,KAAKJ,QAAQu7B,KAAKt6B,QACtCb,KAAKc,iBAAiBd,KAAKJ,QAAQu7B,KAAOz6B,IAGrCA,EAGDk6B,cAAcQ,GACjBp7B,KAAKq7B,uBAELr7B,KAAKJ,QAAQuJ,OACdnJ,KAAKq7B,qBAAuB,eAAqB,yBAA0B,CACzEC,QAASxnB,EAAA,kBAAgC9T,KAAKJ,QAAQuJ,OAAOoyB,YAC7DH,SAAAA,IAGFp7B,KAAKq7B,qBAAuB,eAAqB,wBAAyB,CAACD,SAAAA,IAG7Ep7B,KAAKq7B,qBAAqBt5B,MAAKy5B,IAC1Bx7B,KAAK66B,aAAeO,IAEpBI,EACDx7B,KAAK+6B,SAAS,EAAAC,EAAA,MAAkBh7B,KAAKJ,QAAQ67B,eAE7Cz7B,KAAKi7B,SAASj7B,KAAKJ,QAAQ87B,eAE3B7tB,IACC7N,KAAK66B,aAAeO,GAGhB,qBADAvtB,EAAI5N,MAEPD,KAAKi7B,SAASj7B,KAAKJ,QAAQs7B,gBAI9Bn5B,MAAK,KACN/B,KAAKq7B,0BAAuB90B,EAC5BvG,KAAKJ,QAAQmN,UAAY/M,KAAKJ,QAAQmN,WAEtC,MAAMrM,EAAQV,KAAK66B,WAChBn6B,IAAU06B,GAAYp7B,KAAK27B,mBAAqB,oBAAkCj7B,IACnFV,KAAK46B,cAAcl6B,Q,0BCxEZ,MAAMk7B,WAAkB,KAGrCj8B,YAAoB2L,EAAmB1L,EAA4B,IAGjE,GAFAC,MAAM,cAAgByL,EAAY,IAAMA,EAAY,IAAK1L,EAAQgiB,UAAW,QAAgBhiB,EAAQgiB,SAAU,OAAF,QAAGia,iBAAiB,GAASj8B,IADvH,KAAA0L,UAAAA,EAGf1L,EAAQuJ,OAAQ,CACjB,IAAI2yB,EAAW,IAAIC,GACnBD,EAAS57B,aAAa,SAAU,KAChC47B,EAAS57B,aAAa,OAAQ,GAAKN,EAAQuJ,QAC3C2yB,EAASv7B,UAAUgB,IAAI,aACvBvB,KAAKkP,OAAOhL,QAAQ43B,GAGlBl8B,EAAQo8B,UACPp8B,EAAQo4B,eAAiBp4B,EAAQyP,MAAOrP,KAAKqP,MAAM/K,QAAO,IAAAsH,MAAKhM,EAAQo4B,cAAgB,UAAWp4B,EAAQq8B,gBACrGr8B,EAAQyP,iBAAiB8Z,YAC/BnpB,KAAKqP,MAAM/K,OAAO1E,EAAQyP,OACrBrP,KAAKqP,MAAM2e,UAAYpuB,EAAQyP,OAAS,IAGjD,MAAM6sB,EAAW76B,SAAS86B,yBAE1B,GAAGv8B,EAAQw8B,oBAAsBx8B,EAAQy8B,YAAa,CACpD,MAAMC,EAAIt8B,KAAKq8B,YAAch7B,SAASC,cAAc,KACpDg7B,EAAE/7B,UAAUgB,IAAI,qBACb3B,EAAQw8B,mBAAoBE,EAAEh4B,QAAO,IAAAsH,MAAKhM,EAAQw8B,mBAAoBx8B,EAAQ28B,sBACzE38B,EAAQy8B,cAAaC,EAAEx2B,UAAYlG,EAAQy8B,aAEnDH,EAAS53B,OAAOg4B,GAGf18B,EAAQ48B,aACTx8B,KAAKoB,UAAUb,UAAUgB,IAAI,iBAE7B3B,EAAQ48B,WAAWz3B,SAAQ03B,IACzBA,EAAEC,YAAa,EACf,MAAMvb,EAAgB,IAAI,KAAcsb,GACxCA,EAAEtb,cAAgBA,EAClB+a,EAAS53B,OAAO6c,EAAc9N,UAGhCzT,EAAQgiB,QAAQ7c,SAAQwZ,IACtB,GAAGA,EAAOoe,SAAU,CAClB,MAAMC,EAAWre,EAAOoe,SACxBpe,EAAOoe,SAAW,KAChB,MAAM1E,EAAsB,IAAIvyB,IAChC9F,EAAQ48B,WAAWz3B,SAAQ03B,IACtBA,EAAEtb,cAAcQ,SACjBsW,EAAE12B,IAAIk7B,EAAExb,SAGZ2b,EAAS3E,SAMjBj4B,KAAKoB,UAAU+C,aAAa+3B,EAAUl8B,KAAKkP,OAAO2tB,qB,eC3DvC,MAAMC,WAAuB1sB,EAIhCR,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,sBAAuB,wBAEpD,MAAMw7B,EAAcjpB,EAAA,cAA4B9T,KAAKmU,QAErDnU,KAAKkQ,SAAS6sB,EAAc,cAAgB,aAE5C,MAAM9pB,EAAU,IAAIC,GAAe,CACjCpP,KAAMi5B,EAAc,cAAgB,cAGhCC,GAAS,UACTC,EAAa,IAAI1F,GAAI,CACzBE,WAAY,IAAIyB,GAAW,CACzBO,QAASsD,EAAc,iBAAmB,cAC1Cj5B,KAAMk5B,EACNt8B,MAAO,YAETg3B,gBAAiBqF,EAAc,qBAAuB,oBAElDG,EAAY,IAAI3F,GAAI,CACxBE,WAAY,IAAIyB,GAAW,CACzBO,QAASsD,EAAc,gBAAkB,aACzCj5B,KAAMk5B,EACNt8B,MAAO,WAETg3B,gBAAiBqF,EAAc,oBAAsB,mBAEjDzF,EAAOgB,GAAkB,CAAC2E,EAAYC,IAAax8B,IACvD,MAAM8J,EAAI,CAAC2yB,EAAgBC,GACd,WAAV18B,GAAoB8J,EAAE5D,UAEzB4D,EAAE,GAAGpJ,UAAUb,UAAUC,OAAO,QAChCgK,EAAE,GAAGpJ,UAAUb,UAAUgB,IAAI,QAE7BwL,OAGIswB,EAAavpB,EAAA,UAAwB9T,KAAKmU,QAEhDlB,EAAQ3D,QAAQhL,OAAOgzB,GAEvB,MAAM6F,EAAiB,IAAIjqB,GAAe,IAGpCoqB,EAAU,IAAI/F,GAAI,CACtBloB,MAAQrP,KAAKu9B,SAASC,gBAA0DC,KAChF/F,gBAAiBqF,EAAc,yBAA2B,sBAC1DxxB,UAAW,KACTitB,GAAqBx4B,KAAKu9B,SAASC,gBAA0DC,MAC7F3D,GAAM,iBAAY,cAAc,OAI9B4D,GAAY,OAAO,qCAAsC,CAAC7uB,KAAM,SAAUoS,KAAM,gBAEtF,QAAiByc,GAAW,KAC1B,IAAI9B,GAAU,cAAe,CAC3Bha,QAAS,CAAC,CACR6X,QAAS,eACTkD,SAAU,KACR,MAAM94B,GAAS,EAAA85B,GAAA,GAAiB,CAACD,IAAY,GAE7CE,EAAA,0BAAoC59B,KAAKmU,QAAQ,GAAMpS,MAAK07B,IAC1D55B,IACAy5B,EAAQjuB,MAAMvJ,UAAY23B,QAMhCzF,aAAc,aACdoE,mBAAoB,gBACnB1Z,SACF,CAAClT,eAAgBxP,KAAKwP,iBAEzB2tB,EAAe7tB,QAAQhL,OAAOg5B,EAAQl8B,UAAWs8B,GAEjD,MAAMN,EAAgB,IAAIlqB,GAAe,CACvC2qB,QAASd,EAAc,+BAAiC,6BACxDe,aAAa,IAGT3qB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAM4M,EAAc,QAEdpB,EAAW,KACf,MAAMgxB,EAAWd,EAAWxF,WAAW9V,SAAYmZ,IAAkB3sB,GAC/D6vB,EAAerC,mBAAqBqC,EAAej+B,MAAMQ,UAAUmT,SAAS,SAClFuqB,EAAS19B,UAAUsD,OAAO,aAAck6B,IAGpCC,EAAiB,IAAItD,GAAmB,CAC5CrnB,MAAO,oBACPvP,KAAM,oBACNhE,WAAW,EACX0P,eAAgBxP,KAAKwP,eACrBisB,cAAe,iBACfP,YAAa,eACbQ,UAAW,aACX3uB,SAAUA,EACV5D,OAAQnJ,KAAKmU,OAAO8U,UAAS,GAC7BkS,KAAMhtB,IAGF2sB,EAAgB3sB,GAAgBkvB,EAAsBjC,UAAY,IAExEjoB,EAAa7O,OAAO05B,EAAe58B,WACnCg8B,EAAc9tB,QAAQhL,OAAO6O,GAE7B,MAAM8qB,EAAW,EAAa,CAACpvB,KAAM,QAASvD,UAAW,eACzDtL,KAAKsP,QAAQhL,OAAO25B,IAEpB,QAAiBA,GAAU,MACC,QAAgBA,GAC1C,MAAM7C,EAAW8B,EAAUzF,WAAW9V,QAAUqc,EAAenD,WAAa,GAC5E/mB,EAAA,cAA4B9T,KAAKmU,QAAQpS,MAAKm8B,GACrCpqB,EAAA,iBAA+BoqB,EAAW9C,KAChDr5B,MAAK,KAEN/B,KAAKyP,aAEN,CAACD,eAAgBxP,KAAKwP,kBAExBsrB,IAAkB3sB,EAAc+uB,EAAYD,GAAYxF,WAAW9V,SAAU,EAC9Eqc,EAAeG,iBAAiBrD,GAEhC96B,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,UAAW+7B,EAAe/7B,UAAWg8B,EAAch8B,WAElF,CACE,MAAM6R,EAAU,IAAIC,GAAe,CACjCpP,KAAM,qBACN+5B,QAASd,EAAc,mCAAqC,mCAGxD5b,EAAgB,IAAI,KAAc,CACtCF,KAAM,wBACNyb,YAAY,IAGd18B,KAAKwP,eAAejO,IAAI4f,EAAcphB,MAAtCC,CAA6C,UAAU,KACrD,MAAM6D,EAASsd,EAAcwc,kBAAiB,GAC9C7pB,EAAA,mBAAiC9T,KAAKmU,OAAQgN,EAAcQ,SAAS5f,MAAK,KACxE8B,UAIJ,MAAMu6B,EAAe,KACnBjd,EAAcrgB,mBAAoBu8B,EAAsBriB,OAAOqjB,aAGjEr+B,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,eAAgBmU,IAC9CnU,KAAKmU,SAAWA,GACjBiqB,OAIJA,IAEAnrB,EAAQ3D,QAAQhL,OAAO6c,EAAc9N,OAErCrT,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,a,eCzLtB,MAAMk9B,GAOnB3+B,YAAYC,GANL,KAAA2+B,SAAU,EAIT,KAAAC,QAAS,GAMf,EAAAv3B,EAAA,GAAWjH,KAAMJ,GAEjBA,EAAQgN,WAAWK,iBAAmB,KACpCjN,KAAKwB,QAIFA,OACL,OAAGxB,KAAKw+B,OACCh7B,QAAQ2E,UAGdnI,KAAKu+B,QACCv+B,KAAKqI,SAGdrI,KAAKu+B,SAAU,OACfv+B,KAAKqI,QAAUrI,KAAKy+B,aAAa18B,MAAKqtB,IACpCpvB,KAAKu+B,SAAU,EACfv+B,KAAKqI,aAAU9B,EAEZ6oB,GACDpvB,KAAKw+B,QAAS,EACdx+B,KAAK4M,WAAWK,iBAAmB,MAEnCjN,KAAK4M,WAAW8xB,sBAEjB,KACD1+B,KAAKqI,aAAU9B,EACfvG,KAAKu+B,SAAU,Q,iWCfN,MAAMI,GAmDnBh/B,YAAYC,GAlDL,KAAAwB,UAAYC,SAASC,cAAc,OACnC,KAAAoK,KAAO,oBAIN,KAAAkzB,eAAiBv9B,SAASC,cAAc,OAQzC,KAAAu9B,SAAW,IAAIn5B,IAEf,KAAA8xB,SAAU,EAET,KAAAttB,SAAW,EACX,KAAA40B,YAAc,EAGd,KAAAryB,MAAQ,GAGR,KAAAsyB,WAAkG,GAElG,KAAAC,gBAA+B,IAAIt5B,IAInC,KAAAu5B,SAAmC,CAAC,WAGpC,KAAAC,aAAc,EACd,KAAAnqB,eAAgB,EAChB,KAAApH,WAAa,GACb,KAAAwxB,YAAa,EAGb,KAAAC,QAA+D,GAK/D,KAAAC,aAA4B,oBAE5B,KAAAC,gBAAiB,EAgKjB,KAAAhxB,QAAU,KAChB,MAAM5N,EAAQV,KAAKD,MAAMW,MACzB,GAAGV,KAAKyM,QAAU/L,EAAO,EACpBV,KAAKi/B,SAASM,SAAS,aAAev/B,KAAKi/B,SAASM,SAAS,cAC9Dv/B,KAAKw/B,eAAiB,MAGrBx/B,KAAKi/B,SAASM,SAAS,aACxBv/B,KAAKkK,SAAW,EAChBlK,KAAK8+B,YAAc,GAGrB,IAAI,IAAIv5B,KAAKvF,KAAKo/B,UAEdp/B,KAAKo/B,QAAQ75B,GAGjBvF,KAAK0L,KAAO,oBAEZ1L,KAAKqI,QAAU,KACfrI,KAAK++B,WAAa,GAClB/+B,KAAKyM,MAAQ/L,EACbV,KAAKg/B,gBAAgBnzB,QACrB7L,KAAKs/B,gBAAiB,EAGtBt/B,KAAKy/B,mBAiLT,KAAAf,iBAAmB,KACjB1+B,KAAK4M,WAAW8xB,qBAvVhB,EAAAz3B,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKoB,UAAUb,UAAUgB,IAAI,YAE7B,MAAMm+B,GAAK1/B,KAAK2/B,mBAAqB3/B,KAAK4/B,eAAep3B,KAAKxI,MAwC9D,GAvCAA,KAAK2/B,kBAAqBtrB,IACrBrU,KAAKs/B,iBACNt/B,KAAK4M,WAAWizB,QAAQrS,YAAYxtB,KAAK0L,MACzC1L,KAAK4M,WAAWE,oBAAoB9M,KAAK0L,MACzC1L,KAAKs/B,gBAAiB,GAGxBjrB,EAAUA,EAAQvK,QAAOX,IACvB,MAAM22B,GAAe9/B,KAAKg/B,gBAAgBn1B,IAAIV,GAE9C,OADG22B,GAAa9/B,KAAKg/B,gBAAgBz9B,IAAI4H,GAClC22B,KAGN9/B,KAAK+/B,mBACN1rB,EAAUA,EAAQvK,QAAOX,KACpBA,EAAO62B,aACK5jB,EAAA,UAAwBjT,GAC5B82B,UACAjgC,KAAK+/B,iBAAiB1tB,MAAK6tB,GAAU9jB,EAAA,EAAgB8jB,GAAQ/2B,QAQrEu2B,EAAErrB,IAGXrU,KAAKD,MAAQsB,SAASC,cAAc,SACpCtB,KAAKD,MAAMQ,UAAUgB,IAAI,yBACtBvB,KAAKmO,aACN,IAAAurB,OAAM15B,KAAKD,MAAOC,KAAKmO,iBAAa5H,EAAW,gBAE/C,IAAAmzB,OAAM15B,KAAKD,MAAO,qBAAiBwG,EAAW,eAGhDvG,KAAKD,MAAME,KAAO,OAEfD,KAAKk/B,YAAa,CACnB,MAAMjsB,EAAU,IAAIC,GAAe,IACnCD,EAAQktB,eAAe5/B,UAAUgB,IAAI,2BACrC,IAAI6+B,EAAe/+B,SAASC,cAAc,OAC1C8+B,EAAa7/B,UAAUgB,IAAI,6BAE3BvB,KAAKqgC,kBAAoBh/B,SAASC,cAAc,OAChDtB,KAAKqgC,kBAAkB9/B,UAAUgB,IAAI,mBAErCvB,KAAKqgC,kBAAkB/7B,OAAOtE,KAAKD,OACnCqgC,EAAa97B,OAAOtE,KAAKqgC,mBACzBrgC,KAAKsgC,mBAAqB,IAAI,KAAWF,IAIzC,QAAiBpgC,KAAKqgC,mBAAoB//B,IACxC,GAAGN,KAAKw3B,QAAS,OACjB,IAAIhf,EAASlY,EAAEkY,OAGf,GAFAA,GAAS,EAAAqK,GAAA,GAAgBrK,EAAQ,kBAE7BA,EAAQ,OAEZ,MAAMrP,EAASqP,EAAOwQ,QAAQ7Y,IACxBowB,EAAKvgC,KAAK4+B,eAAertB,cAAc,kBAAoBpI,EAAS,MACtEo3B,EAGFA,EAAGC,QAFHxgC,KAAKQ,OAAO2I,EAAO8f,eAMvBhW,EAAQ3D,QAAQhL,OAAO87B,GACvBpgC,KAAKoB,UAAUkD,OAAO2O,EAAQ7R,WAGhCpB,KAAK4+B,eAAer+B,UAAUgB,IAAI,sBAElC,MAAM0R,EAAU,IAAIC,GAAe,CACjCpP,KAAM9D,KAAKygC,uBACXC,UAAU,IAEZztB,EAAQ3D,QAAQhL,OAAOtE,KAAK0L,MAC5B1L,KAAK4+B,eAAet6B,OAAO2O,EAAQ7R,WACnCpB,KAAK4M,WAAa,IAAI,KAAW5M,KAAK4+B,gBACtC5+B,KAAK4M,WAAWE,oBAAoB9M,KAAK0L,OAEzC,QAAiB1L,KAAK4+B,gBAAiBt+B,IACrC,MAAMkY,GAAS,EAAAmoB,GAAA,GAAgBrgC,EAAEkY,OAAQ,gBAGzC,IAFA,EAAAkJ,EAAA,GAAYphB,IAERkY,EAAQ,OACZ,GAAGxY,KAAKw3B,QAAS,OAEjB,IAAIrnB,EAAuBqI,EAAOwQ,QAAQ7f,OAG1C,GAFAgH,EAAMA,EAAI6vB,WAAa7vB,EAAI8Y,WAAa9Y,GAEpCnQ,KAAKk/B,YAEP,YADAl/B,KAAKuB,IAAI4O,GAKRnQ,KAAK6+B,SAASh1B,IAAIsG,GACnBnQ,KAAKQ,OAAO2P,GAEZnQ,KAAKuB,IAAI4O,GAGX,MAAMywB,EAAWpoB,EAAOjH,cAAc,SACtCqvB,EAASjf,SAAWif,EAASjf,WAG/B,MAAMkf,EAAiB5G,GAASj6B,KAAKsO,QAAS,KAAK,GAAO,GAC1DtO,KAAKD,MAAMM,iBAAiB,QAASwgC,GAErC7gC,KAAK4M,WAAWK,iBAAmB,KACjCjN,KAAKy/B,kBAGPz/B,KAAK4M,WAAWxL,UAAU8C,QAAQ48B,MAElC9gC,KAAKoB,UAAUkD,OAAOtE,KAAK4+B,gBAC3B5+B,KAAK+gC,SAASz8B,OAAOtE,KAAKoB,WAG1BgM,YAAW,KACT,IAAI4zB,EAAoBhhC,KAAKy/B,iBAC1B7/B,EAAQqhC,eACTD,EAAkBj/B,MAAK,KACrBnC,EAAQqhC,qBAGX,GAiCGC,cACFlhC,KAAKm/B,YACNn/B,KAAK8+B,aACY,IAAlB9+B,KAAKkK,WACLlK,KAAKi/B,SAASM,SAAS,YACrBv/B,KAAKyM,QAASwI,EAAA,iBAA+BjV,KAAKyM,QACpDzM,KAAK2/B,kBAAkB,CAAC90B,EAAA,eAIpBs2B,UAAUlhC,GAKhB,YAJ0BsG,IAAvBvG,KAAKo/B,QAAQn/B,KACdD,KAAKo/B,QAAQn/B,GAAQ,KAGdD,KAAKo/B,QAAQn/B,GAGVmhC,iB,0CACZ,GAAGphC,KAAKqI,QAAS,OAAOrI,KAAKqI,QAE7B,GAAGrI,KAAK++B,WAAWsC,SAAWrhC,KAAK++B,WAAWuC,SAC5C,OAIF,MAAMC,EAAYC,GAAA,SAAoB,GAAK,KAAO,EAE5CC,EAASzhC,KAAKmhC,UAAU,WACxB94B,EAAUY,EAAA,mBAAoCjJ,KAAKyM,MAAOzM,KAAK8+B,YAAayC,EAAWvhC,KAAKkK,UAAU,GAAM7B,QAClHrI,KAAKqI,QAAUA,EACf,MAAM3H,QAAc2H,EACpB,GAAGrI,KAAKo/B,QAAQiC,UAAYI,EAC1B,OAGFzhC,KAAKqI,QAAU,KAEf,IAAIg5B,EAAU3gC,EAAM2gC,QACpB,GAAGA,EAAQxgC,OAAQ,CACjB,MAAM6gC,EAAiBL,EAAQA,EAAQxgC,OAAS,GAAGsG,OAAS,EAE5Dk6B,EAAUA,EAAQzgC,QAClBygC,EAAQM,eAAcC,GAAKA,EAAEz4B,SAAW0B,EAAA,eAErC7K,KAAK6hC,mBACNR,EAAUA,EAAQv3B,QAAO83B,GAAK5hC,KAAK8hC,eAAeF,EAAEz4B,WAGtDnJ,KAAKkhC,cAELlhC,KAAK8+B,YAAc4C,EAKrB,GAFA1hC,KAAK2/B,kBAAkB0B,EAAQ32B,KAAIoK,GAAUA,EAAO3L,UAEjDzI,EAAMqhC,MAAO,CACd,IAAI/hC,KAAK++B,WAAWsC,QAOlB,OANArhC,KAAKkhC,cAELlhC,KAAK++B,WAAWsC,SAAU,EAC1BrhC,KAAK8+B,YAAc,EACnB9+B,KAAKkK,SAAW,EAETlK,KAAKohC,iBAIZ,GAFAphC,KAAK++B,WAAWuC,UAAW,GAEvBthC,KAAK++B,WAAWiD,SAClB,OAAOhiC,KAAKiiC,sBAMZH,eAAe34B,GACrB,OACEA,EAAO+4B,WACoB,kBAA1BliC,KAAK6hC,kBAAwC5sB,EAAA,gBAA8B9L,KACzE2K,EAAA,YAA0B3K,EAAOoyB,WAAYv7B,KAAK6hC,kBAG3CI,kB,0CACZ,GAAGjiC,KAAKqI,QAAS,OAAOrI,KAAKqI,QAE7B,GAAGrI,KAAK++B,WAAWiD,SACjB,OAGF,MAAMG,EAAiBniC,KAAKi/B,SAASM,SAAS,YAE9C,IAAIv/B,KAAKw/B,eAAgB,CAQvB,MAAMiC,EAASzhC,KAAKmhC,UAAU,YACxB94B,EAAU7E,QAAQC,IAAI,CAC1B0+B,EAAiBltB,EAAA,qBAAmCjV,KAAKyM,OAAS,GAClEzM,KAAKyM,MAAQwI,EAAA,iBAA+BjV,KAAKyM,YAASlG,IAG5DvG,KAAKqI,QAAUA,EACf,IAAKm3B,EAAgB4C,SAAsB/5B,EAC3C,GAAGrI,KAAKo/B,QAAQ4C,WAAaP,EAC3B,OAGF,GAAGW,EAAc,CAEf,IAAIC,EAAgBF,EAAiBC,EAAaE,WAAW78B,OAAO28B,EAAaG,SAAWH,EAAaE,WAEtGtiC,KAAK6hC,mBACNQ,EAAgBA,EAAcv4B,QAAOX,GAAUnJ,KAAK8hC,eAAe34B,MAGjEnJ,KAAKi/B,SAASM,SAAS,aACzB8C,EAAgBA,EAAcv4B,QAAOX,GAAUA,EAAO+4B,YAGxDliC,KAAKw/B,gBAAiB,EAAAgD,GAAA,GAAahD,EAAe/5B,OAAO48B,SACpDriC,KAAKw/B,eAAiBA,EAAe5+B,SAE5C,EAAAoR,EAAA,GAAiBhS,KAAKw/B,eAAgB30B,EAAA,cACtC7K,KAAKqI,QAAU,KAIf,MAAMk5B,EAAYC,GAAA,SAAoB,GAAK,KAAO,EAC5Ch8B,EAAMxF,KAAKw/B,eAAel5B,OAAO,EAAGi7B,GAC1CvhC,KAAK2/B,kBAAkBn6B,GAGrBxF,KAAKw/B,eAAe3+B,SACtBb,KAAK++B,WAAWiD,UAAW,MASjBS,6B,0CACZ,GAAGziC,KAAKqI,QAAS,OAAOrI,KAAKqI,QAE7B,GAAGrI,KAAK++B,WAAW2D,oBACjB,OAGF,MAEMjB,EAASzhC,KAAKmhC,UAAU,uBACxB94B,EAAUu1B,EAAA,+BAAyC59B,KAAKmJ,OAAOoyB,WAAY,CAACjyB,EAAG,4BAA6Bq5B,EAAG3iC,KAAKyM,OAHxG,GAG2HzM,KAAK0L,KAAKK,mBACjJ62B,QAAqBv6B,EAC3B,GAAGrI,KAAKo/B,QAAQsD,sBAAwBjB,EACtC,OAGF,MAAMptB,EAAUuuB,EAAaA,aAAal4B,KAAIm4B,GACrC/uB,EAAA,uBAAqC+uB,MAE9C,EAAA7wB,EAAA,GAAiBqC,EAASxJ,EAAA,cAC1B7K,KAAK2/B,kBAAkBtrB,IAEpBrU,KAAK0L,KAAKK,mBAAqB62B,EAAap8B,OAASo8B,EAAaA,aAAa/hC,OAfhE,MAgBhBb,KAAK++B,WAAW2D,qBAAsB,MAQlCjD,iBACN,MAmCMqD,EAnCM,MACV,MAAMA,EAA2B,GAejC,OAAI9iC,KAAKi/B,SAASM,SAAS,YAAkDv/B,KAAK++B,WAAWuC,WAC3FwB,EAASh7B,KAAK9H,KAAKohC,kBAEfphC,KAAK++B,WAAWuC,YAKlBthC,KAAKi/B,SAASM,SAAS,cAAev/B,KAAKi/B,SAASM,SAAS,YAAgBv/B,KAAK++B,WAAWiD,UAC/Fc,EAASh7B,KAAK9H,KAAKiiC,mBAGlBjiC,KAAKi/B,SAASM,SAAS,yBAA2Bv/B,KAAK++B,WAAW2D,qBACnEI,EAASh7B,KAAK9H,KAAKyiC,8BAGdK,GAZIA,GAeIpxB,GACXrJ,EAAU7E,QAAQC,IAAIq/B,GAK5B,OAJGA,EAASjiC,QACVwH,EAAQtG,KAAK/B,KAAK0+B,kBAGbr2B,EAGDu3B,cAAcvrB,IAIhBrU,KAAKi/B,SAASM,SAAS,YAAcv/B,KAAK++B,WAAWiD,WACvD3tB,EAAUA,EAAQvK,QAAOX,GAChB8L,EAAA,mBAAiC9L,MAI5CkL,EAAQtP,SAAQoE,IACd,MAAM,IAAC0L,GAAO,gBAA+B,CAC3CC,OAAQ3L,EACR/H,UAAWpB,KAAK4M,WAChBc,YAAY,EACZqH,cAAe/U,KAAK+U,cACpBpH,WAAY3N,KAAK2N,aAGnB,GAAG3N,KAAKk/B,YAAa,CACnB,MAAML,EAAW7+B,KAAK6+B,SAASh1B,IAAIV,GAC7BgY,EAAgB,IAAI,KAEvB0d,IAED1d,EAAcphB,MAAM4hB,SAAU,GAGhC9M,EAAIkuB,YAAY7+B,QAAQid,EAAc9N,OAGxC,IAAIkd,EAEFA,EADCpnB,EAAO65B,YACKpF,EAAA,6BAAuCz0B,EAAOoyB,YACnDpyB,IAAW0B,EAAA,cACN,IAAAe,MAAK5L,KAAKq/B,cAEVpqB,EAAA,sBAAoC9L,GAGnD0L,EAAIG,gBAAgB1Q,OAAOisB,MAIxBhvB,IAAI4O,EAAsBd,EAA8B4zB,GAAS,GAItE,GAFAjjC,KAAK6+B,SAASt9B,IAAI4O,IAEdnQ,KAAKk/B,YAEP,YADAl/B,KAAK+M,SAAS/M,KAAK6+B,SAAS39B,MAI3BlB,KAAKyM,MAAMS,SACZlN,KAAKD,MAAMW,MAAQ,GACnBV,KAAKsO,WAGP,MAAM2iB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,gBAAiB,YAEnC,MAAMu6B,EAAWz6B,SAASC,cAAc,kBAoCxC,OAnCAw6B,EAASv7B,UAAUgB,IAAI,uBAAwB,SAC/Cu6B,EAAS57B,aAAa,SAAU,KAChC47B,EAASv7B,UAAUgB,IAAI,aAEvB0vB,EAAIjI,QAAQ7Y,IAAM,GAAKA,EACpBA,EAAI6vB,kBACQz5B,IAAV8I,IACDA,EAAQ,IAAI,KAAU,CAAClG,OAAQgH,EAAI8Y,WAAYnU,QAAQ,IAAO6D,SAGhEmjB,EAAS57B,aAAa,OAAQ,GAAKiQ,IAGlCd,IACoB,iBAAZ,EACP4hB,EAAInrB,UAAYuJ,IAEhB,EAAArB,EAAA,GAAeijB,EAAK5hB,GACpB4hB,EAAI3sB,OAAO+K,KAIf4hB,EAAIiS,sBAAsB,aAAcpH,GAExC97B,KAAKqgC,kBAAkBl8B,aAAa8sB,EAAKjxB,KAAKD,OAE9CC,KAAK+M,UAAY/M,KAAK+M,SAAS/M,KAAK6+B,SAAS39B,MAE1C+hC,GACDjjC,KAAKsgC,mBAAmB6C,kBAAkB,CACxCxqB,QAAS3Y,KAAKD,MACd84B,SAAU,WAIP5H,EAGFzwB,OAAO2P,GACZ,IAAInQ,KAAKk/B,YAAa,OAEtB,MAAMjO,EAAMjxB,KAAKqgC,kBAAkB9uB,cAAc,cAAcpB,OAC/D8gB,EAAI1wB,UAAUC,OAAO,YAChBywB,EAAImS,YACTnS,EAAI1wB,UAAUgB,IAAI,aAElB,MAAM8hC,EAAiB,KACrBrjC,KAAK6+B,SAAS7uB,OAAOG,GACrB8gB,EAAIzwB,SACJR,KAAK+M,UAAY/M,KAAK+M,SAAS/M,KAAK6+B,SAAS39B,OAG5C2J,EAAA,mCACDomB,EAAI5wB,iBAAiB,eAAgBgjC,EAAgB,CAACloB,MAAM,IAE5DkoB,IAIGC,cACL,MAAO,IAAItjC,KAAK6+B,UAGX0E,WAAWC,GAChBA,EAAOz+B,SAAQrE,IACbV,KAAKuB,IAAIb,OAAO6F,GAAW,MAG7B4G,OAAOoW,uBAAsB,KAC3BvjB,KAAKsgC,mBAAmB6C,kBAAkB,CACxCxqB,QAAS3Y,KAAKD,MACd84B,SAAU,SACV4K,eAAgB,kBCxmBT,MAAMC,WAAsB,KAGzC/jC,YAAYC,GAQVC,MAAM,gBAAiB,KAAM,CAAC8jC,UAAU,EAAM9H,iBAAiB,EAAMhiB,MAAM,IAE3E7Z,KAAK4oB,SAAW,IAAI+V,GAAe,CACjCoC,SAAU/gC,KAAK6Z,KACf9M,SAAU,KAAW,O,EAAA,K,OAAA,E,EAAA,YACnB,MAAM8xB,EAAW7+B,KAAK4oB,SAAS0a,cACzBn6B,EAAS01B,EAASA,EAASh+B,OAAS,GAAGooB,WAE7C,GAAGrpB,EAAQgkC,SAAU,CACnB,MAAMr2B,EAAM3N,EAAQgkC,SAASz6B,GAC7B,GAAGoE,aAAe/J,QAChB,UACQ+J,EACN,MAAMM,GACN,QAKN7N,KAAK4oB,SAAW,KAChB5oB,KAAK6jC,Q,YAhBc,K,+QAkBrB5E,SAAUr/B,EAAQkkC,UAClB7C,cAAe,KACbjhC,KAAK0iB,OACL1iB,KAAK4oB,SAAS8V,mBAEV,GAAA9hB,oBACF5c,KAAK4oB,SAAS7oB,MAAMuN,SAGxBu0B,iBAAkBjiC,EAAQiiC,iBAC1B3C,aAAa,EACbnqB,eAAe,EACfpH,WAAY,GACZxE,OAAQvJ,EAAQuJ,OAChBgF,YAAavO,EAAQuO,YACrBkxB,aAAcz/B,EAAQy/B,eAKxBr/B,KAAKqP,MAAM/K,OAAOtE,KAAK4oB,SAAS7oB,QC9CrB,MAAMgkC,WAA8B3zB,EAKvCR,OAIR,IAAIo0B,EAHJhkC,KAAKoB,UAAUb,UAAUgB,IAAI,sBAAuB,8BACpDvB,KAAKkQ,SAAS,oBAId,CACE,MAAM+C,EAAU,IAAIC,GAAe,CACjCpP,KAAM,0BAGFmtB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,sBAClB0R,EAAQ3D,QAAQnL,aAAa8sB,EAAKhe,EAAQ5D,OAE1C,MAAM3D,EAAO,kBAAiC,CAACgJ,KAAK,IACpDuc,EAAI3sB,OAAOoH,GAEX,MAAM,IAACmJ,GAAO,gBAA+B,CAC3CC,OAAQ9U,KAAK4U,OAAOqU,UAAS,GAC7B7nB,UAAWsK,EACXgC,YAAY,EACZqH,eAAe,EACfpH,WAAY,KAGdkH,EAAIG,gBAAgB1Q,OAAO2Q,EAAA,sBAAoCjV,KAAK4U,SAEpE,MAAM0nB,EAAI,IAAI2H,GAAgB,CAC5B9vB,OAAQnU,KAAKmU,OACb3E,eAAgBxP,KAAKwP,eACrBuxB,SAAU9tB,EAAQ3D,QAClBuzB,YAAoC,6BAAvB7iC,KAAK6iC,YAAYv5B,EAAmCtJ,KAAK6iC,iBAAct8B,IAGtFy9B,EAAkB,KAEhB,MAAME,EAAS5H,EAAE6H,UACS,6BAAvBnkC,KAAK6iC,YAAYv5B,IAAoC,EAAA2T,GAAA,GAAUjd,KAAK6iC,YAAYuB,cAAcppB,OAAQkpB,EAAOlpB,SAIhHlH,EAAA,aAA2B9T,KAAKmU,OAAQnU,KAAK6iC,YAAaqB,IAG5DlkC,KAAKqQ,cAAchQ,iBAAiB,UAAW2jC,EAAiB,CAAC7oB,MAAM,IAEvEnb,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAGjC,CACE,MAAM6R,EAAU,IAAIC,GAAe,IAEnC,GAA0B,6BAAvBlT,KAAK6iC,YAAYv5B,EAAkC,CACpD,MAAM+6B,GAAqB,OAAO,qCAAsC,CAACx1B,KAAM,SAAUoS,KAAM,4BAE/F,QAAiBojB,GAAoB,KACnC,MAAMxgC,GAAS,EAAA85B,GAAA,GAAiB,CAAC0G,IAAqB,GACtDvwB,EAAA,sCAAoD9T,KAAKmU,OAAQnU,KAAK6iC,aAAa9gC,MAAK,KACtF/B,KAAKqQ,cAAczB,oBAAoB,UAAWo1B,GAClDhkC,KAAKyP,WACJ,KACD5L,SAED,CAAC2L,eAAgBxP,KAAKwP,iBAEzByD,EAAQ3D,QAAQhL,OAAO+/B,GAGzB,MAAMC,GAAY,OAAO,qCAAsC,CAACz1B,KAAM,aAAcoS,KAAM,2BAE1F,QAAiBqjB,GAAW,MACX,EAAA3G,GAAA,GAAiB,CAAC2G,IAAY,GAC7CxwB,EAAA,kBAAgC9T,KAAKmU,OAAQnU,KAAK6iC,aAAa9gC,MAAK,KAClE/B,KAAKqQ,cAAczB,oBAAoB,UAAWo1B,GAClDhkC,KAAKyP,aAqBN,CAACD,eAAgBxP,KAAKwP,iBAEzByD,EAAQ3D,QAAQhL,OAAOggC,GAEvBtkC,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,a,2SCjG9B,MAAM6iC,GASXtkC,YAAYC,GAMVI,KAAK2E,EAAI,CACP,CAAC4/B,MAAO,CAAC,iBAAkBtjB,KAAM,uBAAwBujB,cAAe,0BACxE,CAACD,MAAO,CAAC,cAAetjB,KAAM,4BAA6BujB,cAAe,+BAC1E,CAACD,MAAO,CAAC,gBAAiB,aAActjB,KAAM,+BAAgCujB,cAAe,kCAC7F,CAACD,MAAO,CAAC,cAAetjB,KAAM,4BAA6BujB,cAAe,+BAC1E,CAACD,MAAO,CAAC,eAAgBtjB,KAAM,6BAA8BujB,cAAe,gCAC5E,CAACD,MAAO,CAAC,gBAAiBtjB,KAAM,8BAA+BujB,cAAe,iCAC9E,CAACD,MAAO,CAAC,gBAAiBtjB,KAAM,8BAA+BujB,cAAe,iCAC9E,CAACD,MAAO,CAAC,eAAgBtjB,KAAM,6BAA8BujB,cAAe,iCAG9ExkC,KAAKykC,WAAa,CAChB,cAAiB,CAAC,aAAc,gBAAiB,aAAc,gBAGjE,MAAMpH,EAAiCvpB,EAAA,UAAwBlU,EAAQuU,QACjEuwB,EAAsBrH,EAAKsH,sBAC3BT,EAAStkC,EAAQijC,YAAc/uB,EAAA,iCAA+ClU,EAAQuU,OAAQvU,EAAQijC,YAAYuB,eAAiBM,EAEnIE,EAA+BhlC,EAAQijC,YAAc,2BAA6B,gCACxF,IAAI,MAAMgC,KAAQ7kC,KAAK2E,EAAG,CACxB,MAAMmgC,EAAWD,EAAKN,MAAM,GAC5BM,EAAK1jB,cAAgB,IAAI,KAAc,CACrCF,KAAM4jB,EAAK5jB,KACXU,QAAS7N,EAAA,YAA0BlU,EAAQuU,OAAQ2wB,EAAUZ,GAC7Da,aAAa,EACbrI,YAAY,KAIV98B,EAAQijC,aACR6B,EAAoB1pB,OAAO8pB,IAE1BzH,EAAsBjC,WAErByJ,EAAKN,MAAMhF,SAAS,iBACpBsF,EAAKN,MAAMhF,SAAS,mBAIxBsF,EAAK1jB,cAAcphB,MAAMuU,UAAW,GAYpC,QAAiBuwB,EAAK1jB,cAAc9N,OAAQ/S,IAC1Cw5B,GAAM,iBAAY8K,GAAiB,MAClC,CAACp1B,eAAgB5P,EAAQ4P,kBAG3BxP,KAAKykC,WAAWK,IACjBllC,EAAQ4P,eAAejO,IAAIsjC,EAAK1jB,cAAcphB,MAA9CH,CAAqD,UAAU,KACzDilC,EAAK1jB,cAAcQ,SACP3hB,KAAK2E,EAAEmF,QAAOvE,GAAKvF,KAAKykC,WAAWK,GAAUvF,SAASh6B,EAAEg/B,MAAM,MACtEx/B,SAAQ8/B,IACZA,EAAK1jB,cAAcQ,SAAU,QAMrC/hB,EAAQmhC,SAASz8B,OAAOugC,EAAK1jB,cAAc9N,QAIxC8wB,UACL,MAAMD,EAA2B,CAC/B56B,EAAG,mBACH07B,WAAY,WACZhqB,OAAQ,IAGV,IAAI,MAAM6pB,KAAQ7kC,KAAK2E,GACLkgC,EAAK1jB,cAAcQ,SAEjCkjB,EAAKN,MAAMx/B,SAAQkgC,IAEjBf,EAAOlpB,OAAOiqB,IAAQ,KAK5B,OAAOf,GAII,MAAMgB,WAA+B90B,EAGlCR,O,0CAId,IAAIu1B,EAHJnlC,KAAKoB,UAAUb,UAAUgB,IAAI,sBAAuB,+BACpDvB,KAAKkQ,SAAS,sBAGd,CACE,MAAM+C,EAAU,IAAIC,GAAe,CACjCpP,KAAM,6BAGRqhC,EAAkB,IAAIlB,GAAgB,CACpC9vB,OAAQnU,KAAKmU,OACb3E,eAAgBxP,KAAKwP,eACrBuxB,SAAU9tB,EAAQ3D,UAGpBtP,KAAKqQ,cAAchQ,iBAAiB,WAAW,KAC7CyT,EAAA,8BAA4C9T,KAAKmU,OAAQgxB,EAAgBhB,aACxE,CAAChpB,MAAM,IAEVnb,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAGjC,CACE,MAAM6R,EAAU,IAAIC,GAAe,CACjCpP,KAAM,sBAGFshC,EAAkB,IAAI7N,GAAI,CAC9BS,aAAc,sBACdN,gBAAiB,UACjB7oB,KAAM,UACNtD,UAAW,KACT,IAAIm4B,GAAc,CAChBI,UAAW,CAAC,uBACZF,SAAWz6B,IACTiE,YAAW,KACTi4B,EAAgBl8B,KACf,IAELgF,YAAa,oCACbhF,QAASnJ,KAAKmU,YAKdkxB,EAAwBl8B,GAAmB,mCAC/C,IAAI05B,EACJ,IACEA,QAAoBjF,EAAA,8BAAwC59B,KAAKmU,OAAQhL,GACzE,MAAM0E,GAEN,YADAisB,GAAM,iCAIR,MAAM5oB,EAAM,IAAI6yB,GAAsB/jC,KAAK+O,QAC3CmC,EAAI2xB,YAAcA,EAClB3xB,EAAIiD,OAASnU,KAAKmU,OAClBjD,EAAI0D,OAASzL,EACb+H,EAAIvB,UAGNsD,EAAQ3D,QAAQhL,OAAO8gC,EAAgBhkC,WAWvC,MAAM62B,EAAIhlB,EAAQqyB,yBAClBrN,EAAE13B,UAAUgB,IAAI,sBAEhB,MAAMmK,EAAO,kBAAiC,CAACgJ,KAAK,IACpDujB,EAAE3zB,OAAOoH,IAET,QAAiBA,GAAOpL,IACtB,MAAMkY,GAAS,EAAA+sB,GAAA,GAAUjlC,EAAEkY,OAAQ,MACnC,IAAIA,EAAQ,OAEZ,MAAMrP,EAASqP,EAAOwQ,QAAQ7f,OAAO8f,WACrCoc,EAAgBl8B,KACf,CAACqG,eAAgBxP,KAAKwP,iBAEzB,MAAMg2B,EAAc,CAACjF,EAAasC,KAChC,MAAM4C,EAAe5C,EAAYuB,cAC3BM,EAAuB5wB,EAAA,UAAwB9T,KAAKmU,QAAyBwwB,sBAG7Ee,EAA0B,GAChCP,EAAgBxgC,EAAEI,SAAQ8/B,IACxB,MAAMC,EAAWD,EAAKN,MAAM,GAEzBkB,EAAazqB,OAAO8pB,KAAcJ,EAAoB1pB,OAAO8pB,IAC9DY,EAAS59B,KAAK+8B,EAAKL,kBAOvB,MAAM/yB,EAAK8uB,EAAGhvB,cAAc,sBAEzBm0B,EAAS7kC,SACV4Q,EAAG3L,UAAY,GACf2L,EAAGnN,WAAU,IAAAukB,MAAK6c,EAASh7B,KAAI4H,IAAK,IAAA1G,MAAK0G,MAAK,KAKhDb,EAAGlR,UAAUsD,OAAO,QAAS6hC,EAAS7kC,SAGlCU,EAAM,CAACshC,EAA0Dv+B,KACrE,MAAM,IAACuQ,GAAO,gBAA+B,CAC3CC,OAAQsH,EAAA,YAA0BymB,EAAY8C,MAC9CvkC,UAAWsK,EACXgC,YAAY,EACZqH,eAAe,EACfpH,WAAY,GACZrJ,OAAAA,IAGFkhC,EAAY3wB,EAAI+wB,OAAQ/C,IAM1B7iC,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,4BAA6B6lC,I,UAC9D,MAAMC,EAAwC,8BAAR,QAAtB,EAAAD,EAAOE,uBAAe,eAAEz8B,KAAqCu8B,EAAOE,gBAAgB3B,cAAcppB,OAAOgrB,cACnHzF,EAAK70B,EAAK6F,cAAc,kBAAkBs0B,EAAOI,aACpDH,GACGvF,EAGFiF,EAAYjF,EAAIsF,EAAOE,iBAFvBxkC,EAAIskC,EAAOE,iBAAgE,GAK3C,8BAAR,QAAvB,EAAAF,EAAOK,wBAAgB,eAAE58B,MACxB68B,IAGD5F,GACDA,EAAG//B,SAG6B,8BAAR,QAAvB,EAAAqlC,EAAOK,wBAAgB,eAAE58B,MACxB68B,GAINC,OAGF,MAAMA,EAAY,MAChB,EAAAp4B,EAAA,GAAeo3B,EAAgBhV,UAAU,IAAAxkB,MAAKu6B,EAAkB,8BAAgC,2BAA4B,CAACA,MAG/H,IACIE,EADAF,EAAkB,EAEtB,MAAMG,EAAY,KAEhBD,EAAS,IAAI/H,GAAiB,CAC5B1xB,WAAY5M,KAAK4M,WACjB6xB,WAAY,IACHb,EAAA,+BAAyC59B,KAAKmU,OAAQ,CAAC7K,EAAG,4BAA6Bq5B,EAAG,IAJlF,GAImGj3B,EAAKK,mBAAmBhK,MAAKwL,IAC7I,IAAI,MAAMs1B,KAAet1B,EAAIq1B,aAC3BrhC,EAAIshC,GAA4D,GAMlE,OAHAsD,EAAkB54B,EAAI/G,MACtB4/B,IAEO74B,EAAIq1B,aAAa/hC,OAZX,IAYkC0M,EAAI/G,QAAUkF,EAAKK,uBAKjEs6B,EAAO7kC,QAGhBxB,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAE5B0S,EAAA,YAA0B9T,KAAKmU,cAC1BmyB,KAENF,IAEApmC,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,kBAAkB,EAAEumC,YAAAA,EAAaC,UAAAA,MAC/DxmC,KAAKmU,SAAWoyB,IACjBvmC,KAAKmU,OAASqyB,EACdF,aAOV10B,qBACE5R,KAAK4M,WAAW65B,YCvUL,MAAMC,GACnB/mC,YACEwJ,EAEA81B,EAAqB7iB,EAAA,gBAA8BjT,GACnDy6B,GAEA,MAAM+C,EAAmB,IAAI,KAAU,CAACx9B,OAAAA,IAASwP,QAO3CiuB,EAAgB,CAACjlB,EAA4CklB,EAAQrK,KAAgB7a,EAAQzgB,QACjG,IAAImH,EAAUyL,EAAA,QAAsB3K,EAAOoyB,YAExCsL,IACDx+B,EAAUA,EAAQid,SAAQ,IACjBrc,EAAA,eAAgCE,MAI3Cy6B,GAAYA,EAASv7B,IAGjBy+B,EAAkBnlB,IACtB,IAAItZ,EAEJ,GAAGc,EAAO+4B,SACR75B,EAAUY,EAAA,eAAgCE,GAAQ,EAAOqzB,IAAe7a,EAAQzgB,UAAOqF,OAClF,CACL,IAAGob,EAAQzgB,KAGT,OAAO0lC,EAAcjlB,GAFrBtZ,EAAUyL,EAAA,SAAuB3K,EAAOoyB,YAM5CqI,GAAYA,EAASv7B,IAGvB,IAAIgH,EAAoBgtB,EAA0B0K,EAAwBnlB,EAAsC4a,EAChH,OAAOyC,GACL,IAAK,UACiCnrB,EAAA,YAA0B3K,EAAOoyB,WAAY,gBAC/EznB,EAAA,gBACAzE,EAAQ,oBACRgtB,EAAc,iCACdza,EAAU,CAAC,CACT6X,QAAS,oBACTuN,UAAU,EACVrK,SAAUmK,IAGZtK,EAAa,CAAC,CACZvb,KAAM,0BAGR5R,EAAQ,mBACRgtB,EAAc,4BACd0K,EAAkB,CAACJ,GACnB/kB,EAAU,CAAC,CACT6X,QAAS,eACTuN,UAAU,EACVrK,SAAUiK,KAId,MAeF,IAAK,OACHv3B,EAAQ,iBACRgtB,EAAc,mCACd0K,EAAkB,CAACJ,GAEnB/kB,EAAU,CAAC,CACT6X,QAAS,iBACTuN,UAAU,EACVrK,SAAUmK,IAGZtK,EAAa,CAAC,CACZvb,KAAM,2BACNM,SAAU,CACR,IAAI,KAAU,CAACpY,OAAAA,IAASwP,WAI5B,MAGF,IAAK,QACHtJ,EAAQ,iBACRgtB,EAAc,wCACdza,EAAU,CAAC,CACT6X,QAAS,iBACTuN,UAAU,EACVrK,SAAUmK,IAGZ,MAGF,IAAK,YACL,IAAK,QACiChzB,EAAA,YAA0B3K,EAAOoyB,WAAY,gBAC/ElsB,EAAQ,iBACRgtB,EAAc,0BACdza,EAAU,CAAC,CACT6X,QAAS,iBACTuN,UAAU,EACVrK,SAAUmK,IAGZtK,EAAa,CAAC,CACZvb,KAAM,mCAGR5R,EAAQ,gBACRgtB,EAAc,8BACd0K,EAAkB,CAACJ,GACnB/kB,EAAU,CAAC,CACT6X,QAAS,iBACTuN,UAAU,EACVrK,SAAWH,GAAeoK,EAAcpK,GAAY,MAQ5D,IAAIZ,GAAU,oBAAqB,CACjCzyB,OAAAA,EACA6uB,aAAc3oB,EACd+sB,mBAAoBC,EACpBE,oBAAqBwK,EACrBnlB,QAAAA,EACA4a,WAAAA,IACC9Z,Q,eCtJQ,MAAMukB,WAA4B72B,EAG/BR,O,mDACd5P,KAAKkQ,SAAS,aAEd,MAAMg3B,QAA2BC,GAAA,gCAC3B5J,QAAiBK,EAAA,oBAA8B59B,KAAKmU,QAC1D,IAAIizB,EAAgD,QAA5B,EAAA7J,EAAS8J,2BAAmB,QAAI,GACxD,MAAMC,EAAmB,IAAI5hC,IAAI0hC,GAE3BG,EAAgB,IAAIr0B,GAAe,CACvC2qB,QAAS/pB,EAAA,cAA4B9T,KAAKmU,QAAU,6BAA+B,6BAG/EqzB,EAAsB,IAAI,KAAc,CAAC3jC,QAAQ,EAAM8d,UAAW2lB,EAAiBpmC,OACnFumC,EAAY,IAAIlQ,GAAI,CACxBpW,cAAeqmB,EACfxP,aAAc,oBAGhBuP,EAAcj4B,QAAQhL,OAAOmjC,EAAUrmC,WAEvC,MAAMsmC,EAAmB,IAAIx0B,GAAe,CAC1CpP,KAAM,uBAGF6jC,EAAiBT,EAAmBx8B,KAAIk9B,IAC5C,MAAMzmB,EAAgB,IAAI,KAAc,CACtCtd,QAAQ,EACR8d,QAAS2lB,EAAiBz9B,IAAI+9B,EAAkBC,YAGlD7nC,KAAKwP,eAAejO,IAAI4f,EAAcphB,MAAtCC,CAA6C,UAAU,KAClDmhB,EAAcQ,SACf2lB,EAAiB/lC,IAAIqmC,EAAkBC,UAEnCL,EAAoB7lB,SACtB6lB,EAAoB1mC,kBAAiB,KAGvCwmC,EAAiBt3B,OAAO43B,EAAkBC,WAEtCP,EAAiBpmC,MAAQsmC,EAAoB7lB,SAC/C6lB,EAAoB1mC,kBAAiB,IAIzCgnC,OAGF,MAAM9R,EAAM,IAAIuB,GAAI,CAClBpW,cAAAA,EACA9R,MAAOu4B,EAAkBv4B,MACzBuoB,aAAa,IAWf,OARAmQ,GAAiB,CACf/R,IAAAA,EACAne,IAAK+vB,EAAkBI,YACvB9mC,KAAM,UAGRwmC,EAAiBp4B,QAAQhL,OAAO0xB,EAAI50B,WAE7B+f,KAGTnhB,KAAKwP,eAAejO,IAAIkmC,EAAUtmB,cAAcphB,MAAhDC,CAAuD,UAAU,KAC3DwnC,EAAoB7lB,QAGdgmB,EAAeM,OAAM9mB,IAAkBA,EAAcQ,YAC7DgmB,EAAe5iC,SAAQoc,GAAiBA,EAAcQ,SAAU,IAChEmmB,MAJAH,EAAe5iC,SAAQoc,GAAiBA,EAAcQ,SAAU,IAChEmmB,QAOJ,MAAMI,EAAgB,KACpB,MAAMC,EAAe99B,MAAMC,KAAKg9B,GAChC,GAAG,IAAIa,GAAc59B,OAAOse,SAAW,IAAIue,GAAmB78B,OAAOse,OACnE,OAGF,MAAM0U,EAAWK,EAAA,0BAAoC59B,KAAKmU,QACvDopB,IACDA,EAAS8J,oBAAsBc,GAGjCr0B,EAAA,4BAA0C9T,KAAKmU,OAAQg0B,GACvDf,EAAoBe,GAGhBL,EAAyB7N,GAASiO,EAAe,KAAM,GAAO,GAEpEloC,KAAKqQ,cAAchQ,iBAAiB,UAAW6nC,EAAe,CAAC/sB,MAAM,IAErEnb,KAAK4M,WAAWtI,OAAOijC,EAAcnmC,UAAWsmC,EAAiBtmC,Y,oRCvFtD,MAAMgnC,WAAuBt5B,EAO1Bu5B,Q,mDAEdroC,KAAKwP,eAAeS,YACpBjQ,KAAK4M,WAAWxL,UAAU0E,UAAY,GAC3B,QAAX,EAAA9F,KAAKyhC,cAAM,QAAXzhC,KAAKyhC,OAAW,GAChB,MAAMA,IAAWzhC,KAAKyhC,OAEtBzhC,KAAKoB,UAAUb,UAAUgB,IAAI,sBAAuB,wBACpDvB,KAAKkQ,SAAS,QAEd,IAAIqtB,QAAiBK,EAAA,oBAA8B59B,KAAKmU,QAAQ,GAEhE,MAAMkpB,EAAiCvpB,EAAA,UAAwB9T,KAAKmU,QAC9D4oB,EAAcjpB,EAAA,cAA4B9T,KAAKmU,QAC/Cm0B,EAAYx0B,EAAA,YAA0B9T,KAAKmU,QAE3Co0B,EAAsC,GACtCC,EAAyB7L,IAC7B4L,EAAoBzgC,KAAK60B,IAG3B38B,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,eAAgBmU,IAC9CnU,KAAKmU,SAAWA,GACjBo0B,EAAoBxjC,SAAQ43B,GAAYA,SAI5C38B,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAqBmU,IACnDnU,KAAKmU,SAAWA,IACjBopB,EAAWK,EAAA,0BAAoCzpB,IAAWopB,MAI9D,MAAMp0B,EAASnJ,KAAKmU,OAAO8U,UAAS,GAC9Bwf,EAAgB30B,EAAA,YAA0B9T,KAAKmU,OAAQ,eACvDu0B,EAAuB50B,EAAA,YAA0B9T,KAAKmU,OAAQ,sBAEpE,CACE,MAAMlB,EAAU,IAAIC,GAAe,CAAC4qB,aAAa,IAC3CpH,EAA4B,GAE5BvjB,EAAe9R,SAASC,cAAc,OA+B5C,GA9BA6R,EAAa5S,UAAUgB,IAAI,iBAE3BvB,KAAK2oC,mBAAqB,IAAI,IAAW,CACvCt1B,MAAO0pB,EAAc,mBAAqB,yBAC1Cj5B,KAAM,YACNwP,UAAW,IACXsjB,UAAU,IAEZ52B,KAAK4oC,sBAAwB,IAAI,IAAW,CAC1Cv1B,MAAO,yBACPvP,KAAM,mBACNwP,UAAW,MAGbtT,KAAK2oC,mBAAmBxK,iBAAiBd,EAAKhuB,OAC9CrP,KAAK4oC,sBAAsBzK,iBAAiBZ,EAASxpB,OAErDZ,EAAa7O,OAAOtE,KAAK2oC,mBAAmBvnC,UAAWpB,KAAK4oC,sBAAsBxnC,WAElFs1B,EAAY5uB,KAAK9H,KAAK2oC,mBAAoB3oC,KAAK4oC,uBAE/C5oC,KAAK6oC,SAAW,IAAIzS,GAAS,CAC3BjtB,OAAAA,EACAutB,YAAAA,EACAlnB,eAAgBxP,KAAKwP,iBAEvBxP,KAAKsP,QAAQhL,OAAOtE,KAAK6oC,SAASh1B,SAElCZ,EAAQ3D,QAAQhL,OAAOtE,KAAK6oC,SAAS91B,WAAW3R,UAAW+R,GAExDs1B,EAAe,CAChB,MAAMK,EAAc,IAAIvR,GAAI,CAC1BS,aAAc+E,EAAc,cAAgB,YAC5CxxB,UAAW,KACT,MAAM2F,EAAM,IAAI4rB,GAAe98B,KAAK+O,QACpCmC,EAAIiD,OAASnU,KAAKmU,OAClBjD,EAAIqsB,SAAWA,EACfrsB,EAAIvB,OAEJ3P,KAAKwP,eAAejO,IAAI2P,EAAIb,cAA5BrQ,CAA2C,UAAW+oC,IAExDl6B,KAAM,SAGFk6B,EAAsB,KAG1B,IAAI54B,EAFJ24B,EAAY1Y,SAASU,YAAc,GAIjC3gB,EADC4sB,EACMM,EAAsBjC,SAAW,aAAe,cAEhDiC,EAAsBjC,SAAW,kBAAoB,mBAG9D0N,EAAY1Y,SAAS9rB,QAAO,IAAAsH,MAAKuE,KAGnC44B,IACA91B,EAAQ3D,QAAQhL,OAAOwkC,EAAY1nC,WAGrC,GAAGqnC,GAAiBC,EAAsB,CACxC,MAAMM,EAAe,IAAIzR,GAAI,CAC3BS,aAAc,YACdnpB,KAAM,YACNtD,UAAW,KACT,MAAM2F,EAAM,IAAI+1B,GAAoBjnC,KAAK+O,QACzCmC,EAAIiD,OAASnU,KAAKmU,OAClBjD,EAAIvB,OAAO5N,MAAK,KACX/B,KAAKyhC,SAAWA,GAInBzhC,KAAKwP,eAAejO,IAAI2P,EAAIb,cAA5BrQ,CAA2C,UAAWipC,SAMtDC,SAD2B/B,GAAA,2BACmBr9B,QAAO89B,IAAsBA,EAAkB5sB,OAAOmuB,WAAUtoC,OAC9GooC,EAAqB,K,MACzB,MAAMG,EAAwC,QAA5B,EAAA7L,EAAS8J,2BAAmB,QAAI,GAClD2B,EAAa5Y,SAAStqB,UAAYsjC,EAAUvoC,OAAS,IAAMqoC,GAG7DD,IAEAh2B,EAAQ3D,QAAQhL,OAAO0kC,EAAa5nC,WAGtC,GAAGsnC,IAAyB3L,EAAa,CACvC,MAAMwH,EAAQ,CACZ,gBACA,aACA,gBACA,aACA,cACA,eACA,eACA,eAGI8E,EAAiB,IAAI9R,GAAI,CAC7BS,aAAc,qBACdzsB,UAAW,KACT,MAAM2F,EAAM,IAAIg0B,GAAuBllC,KAAK+O,QAC5CmC,EAAIiD,OAASnU,KAAKmU,OAClBjD,EAAIvB,QAENd,KAAM,gBAGFy6B,EAAuB,KAC3BD,EAAejZ,SAAStqB,UAAYy+B,EAAM9/B,QAAO,CAACC,EAAKg7B,IAAMh7B,IAAOoP,EAAA,YAA0B9T,KAAKmU,OAAQurB,EAAGrC,EAAKsH,wBAAwB,GAAK,IAAMJ,EAAM1jC,QAG9JyoC,IACAr2B,EAAQ3D,QAAQhL,OAAO+kC,EAAejoC,WAEtCpB,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,eAAgBmU,IAC9CnU,KAAKmU,SAAWA,GACjBm1B,OA+DN,GAjDAtpC,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,YAE/B,QAAiBpB,KAAK6oC,SAASh1B,SAAS,KACtC7T,KAAK6oC,SAASh1B,QAAQS,UAAW,EAEjC,IAAIwuB,EAA2B,GAE/B,MAAMjyB,EAAK7Q,KAAKmU,OACbnU,KAAK2oC,mBAAmBhN,mBACzBmH,EAASh7B,KAAKgM,EAAA,YAA0BjD,EAAI7Q,KAAK2oC,mBAAmBjoC,QAGnEV,KAAK4oC,sBAAsBjN,mBAC5BmH,EAASh7B,KAAKgM,EAAA,YAA0BjD,EAAI7Q,KAAK4oC,sBAAsBloC,QAGtEV,KAAK6oC,SAASh2B,cACfiwB,EAASh7B,KAAK9H,KAAK6oC,SAASh2B,eAAe9Q,MAAKqS,GACvCN,EAAA,YAA0BjD,EAAIuD,MAIzC5Q,QAAQ+lC,KAAKzG,GAAUxd,SAAQ,KAC7BtlB,KAAK6oC,SAASh1B,QAAQ21B,gBAAgB,YACtCxpC,KAAKyP,aAEN,CAACD,eAAgBxP,KAAKwP,iBAuBtButB,GAAejpB,EAAA,YAA0B9T,KAAKmU,OAAQ,eAAgB,CACvE,MAAMs1B,EAA4B,IAAI,KAAc,CAClDxoB,KAAM,wBACNU,UAAY0b,EAAsBriB,OAAO0uB,WACzChN,YAAY,IAGd18B,KAAKwP,eAAejO,IAAIkoC,EAA0B1pC,MAAlDC,CAAyD,UAAU,KACjE,MAAM6D,EAAS4lC,EAA0B9L,kBAAiB,GAC1D7pB,EAAA,mBAAiC9T,KAAKmU,OAAQs1B,EAA0B9nB,SAAS5f,MAAK,KACpF8B,UAIJ2kC,GAAsB,KACpBiB,EAA0B3oC,mBAAoBu8B,EAAsBriB,OAAO0uB,eAG7Ez2B,EAAQ3D,QAAQhL,OAAOmlC,EAA0Bp2B,QAIrD,IAAI0pB,EAAa,CACf,MAAM9pB,EAAU,IAAIC,GAAe,IAcnC,IAAI6pB,GAAe0L,EAAe,CAChC,MAAMkB,EAA+B,IAAI,KAAc,CACrD1oB,KAAM,cACNyb,YAAY,IAGd18B,KAAKwP,eAAejO,IAAIooC,EAA6B5pC,MAArDC,CAA4D,UAAU,KACpE,MAAM6D,EAAS8lC,EAA6BhM,kBAAiB,GAC7D7pB,EAAA,yBAAuC9T,KAAKmU,QAASw1B,EAA6BhoB,SAAS5f,MAAK,KAC9F8B,UAKJ,MAAMu6B,EAAe,KACnBuL,EAA6B7oC,iBAAiBwnC,IAAe/K,EAAkCviB,OAAO4uB,oBAGxGxL,IACAoK,EAAsBpK,GAEtBnrB,EAAQ3D,QAAQhL,OAAOqlC,EAA6Bt2B,OAGnDJ,EAAQ3D,QAAQvD,mBACjB/L,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAInC,GAAG0S,EAAA,YAA0B9T,KAAKmU,OAAQ,eAAgB,CACxD,MAAMlB,EAAU,IAAIC,GAAe,IAE7BoxB,GAAY,OAAO,qCAAsC,CAACz1B,KAAM,SAAUoS,KAAM8b,EAAc,yBAA2B,yBAE/H,QAAiBuH,GAAW,KAC1B,IAAIoC,GAAkBv9B,OAAwB5C,GAAY8B,IACxD,MAAMxE,GAAS,EAAA85B,GAAA,GAAiB,CAAC2G,IAAY,GAC7Cj8B,EAAQtG,MAAK,KACX/B,KAAKyP,WACJ,KACD5L,YAGH,CAAC2L,eAAgBxP,KAAKwP,iBAEzByD,EAAQ3D,QAAQhL,OAAOggC,GAEvBtkC,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAG7BknC,GAEFtoC,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,kBAAkB,EAAEumC,YAAAA,EAAaC,UAAAA,MAC/Dr9B,IAAWo9B,IACZvmC,KAAKmU,OAASqyB,EAAUjL,WACxBv7B,KAAKqoC,a,mRAMHz4B,OACR,OAAO5P,KAAKqoC,S,eC7UD,MAAMwB,WAA0B/6B,EAMnCc,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,sBAAuB,0BACpD,MAAMuoC,GAAS70B,EAAA,YAA0BjV,KAAKmJ,OAAOoL,YACrDvU,KAAKkQ,SAAS45B,EAAQ,kBAAoB,QAE1C,CACE,MAAM72B,EAAU,IAAIC,GAAe,CAAC4qB,aAAa,IAC3CpH,EAA4B,GAE5BvjB,EAAe9R,SAASC,cAAc,OAe5C,GAdA6R,EAAa5S,UAAUgB,IAAI,iBAE3BvB,KAAK+pC,eAAiB,IAAI,IAAW,CACnC12B,MAAO,YACPvP,KAAM,eACNwP,UAAW,GACXsjB,UAAU,IAEZ52B,KAAKgqC,mBAAqB,IAAI,IAAW,CACvC32B,MAAO,WACPvP,KAAM,mBACNwP,UAAW,KAGVtT,KAAKmJ,OAAQ,CACd,MAAM8gC,EAAOh1B,EAAA,UAAwBjV,KAAKmJ,QAEvC2gC,GACD9pC,KAAK+pC,eAAeG,cAAcD,EAAKE,YACvCnqC,KAAKgqC,mBAAmBE,cAAcD,EAAKG,aAE3CpqC,KAAK+pC,eAAe5L,iBAAiB8L,EAAKE,YAC1CnqC,KAAKgqC,mBAAmB7L,iBAAiB8L,EAAKG,YAelD,GAXAj3B,EAAa7O,OAAOtE,KAAK+pC,eAAe3oC,UAAWpB,KAAKgqC,mBAAmB5oC,WAC3Es1B,EAAY5uB,KAAK9H,KAAK+pC,eAAgB/pC,KAAKgqC,oBAE3ChqC,KAAK6oC,SAAW,IAAIzS,GAAS,CAC3BjtB,OAAQnJ,KAAKmJ,OACbutB,YAAAA,EACAlnB,eAAgBxP,KAAKwP,eACrBynB,iBAAiB,IAEnBj3B,KAAKsP,QAAQhL,OAAOtE,KAAK6oC,SAASh1B,SAE/B7T,KAAKmJ,OAAQ,CACd,MAAM8nB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,eAClB0vB,EAAI3sB,OAAOtE,KAAK6oC,SAAS7R,YAEzB,MAAMqT,EAA6B,IAAI,KAAc,CACnDppB,KAAM,kBAGRopB,EAA2BtqC,MAAMM,iBAAiB,UAAWC,IACvDA,EAAE6Y,WAINlQ,EAAA,iBAAkCjJ,KAAKmJ,WAGzCnJ,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,mBAAoB6lC,IACrD,GAAqB,eAAlBA,EAAOF,KAAKr8B,EAAoB,OACnC,MAAMH,EAASiT,EAAA,YAA0BypB,EAAOF,KAAKA,MACrD,GAAG3lC,KAAKmJ,SAAWA,EAAQ,CACzB,MAAMuU,GAAW4sB,GAAA,UAAgCzE,EAAO0E,iBACrD7sB,IAAY2sB,EAA2B1oB,UACxC0oB,EAA2B1oB,QAAUjE,OAK3C,MAAM8sB,EAAiBnpC,SAASC,cAAc,OAC9CkpC,EAAejqC,UAAUgB,IAAI,gBAC7BipC,EAAelmC,OAAO,IAAI,KAAU,CAClC6E,OAAQnJ,KAAKmJ,SACZwP,SAGH,MAAM8xB,EAAqBppC,SAASC,cAAc,OAMlD,GALAmpC,EAAmBlqC,UAAUgB,IAAI,oBACjCkpC,EAAmBnmC,QAAO,IAAAsH,MAAK,6BAE/BqH,EAAQ3D,QAAQhL,OAAO2sB,EAAKuZ,EAAgBC,EAAoBt3B,GAE5D22B,EASG,CACL,MAAMG,EAAOh1B,EAAA,UAAwBjV,KAAKmJ,QAEpCuhC,EAAW,IAAInT,GAAI,CACvB1oB,KAAM,QACNmpB,aAAciS,EAAKU,WAAQpkC,EAAY,eACvC8I,MAAO46B,EAAKU,MAAQ11B,EAAA,kBAAgCg1B,EAAKU,YAASpkC,EAClEmxB,gBAAiBuS,EAAKU,MAAQ,QAAU,4BACxChT,iBAAkBsS,EAAKU,WAAQpkC,EAAY,CAAC,IAAI,KAAU,CAAC4C,OAAQnJ,KAAKmJ,SAASwP,WAGnF1F,EAAQ3D,QAAQhL,OAAOomC,EAAStpC,eApBvB,CACT,MAAMwpC,EAAmB,IAAIrT,GAAI,CAC/BpW,cAAekpB,IAGX3sB,GAAW4sB,GAAA,mBAAyCtqC,KAAKmJ,QAAQ,GACvEkhC,EAA2B1oB,QAAUjE,EAErCzK,EAAQ3D,QAAQhL,OAAOsmC,EAAiBxpC,iBAe1C6R,EAAQ3D,QAAQhL,OAAO6O,GAGzBnT,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,YAE/B,QAAiBpB,KAAK6oC,SAASh1B,SAAS,KACtC7T,KAAK6oC,SAASh1B,QAAQS,UAAW,EAEjCW,EAAA,aAA2BjV,KAAKmJ,OAAQnJ,KAAK+pC,eAAerpC,MAAOV,KAAKgqC,mBAAmBtpC,MAAOuU,EAAA,UAAwBjV,KAAKmJ,QAAQwhC,OACtIrlB,SAAQ,KACPtlB,KAAK6oC,SAASh1B,QAAQ21B,gBAAgB,YACtCxpC,KAAKyP,aAEN,CAACD,eAAgBxP,KAAKwP,iBAG3B,IAAIs6B,EAAO,CACT,MAAM72B,EAAU,IAAIC,GAAe,IAI7BoxB,GAAY,OAAO,qCAAsC,CAACz1B,KAAM,SAAUoS,KAAM,4BAEtF,QAAiBqjB,GAAW,KAC1B,IAAI1I,GAAU,uBAAwB,CACpCzyB,OAAQnJ,KAAKmJ,OACb6uB,aAAc,gBACdoE,mBAAoB,0BACpBxa,SAAS,QAAgB,CAAC,CACxB6X,QAAS,SACTkD,SAAU,KACR,MAAM94B,GAAS,EAAA85B,GAAA,GAAiB,CAAC2G,IAAY,GAE7CrvB,EAAA,iBAA+B,CAACjV,KAAKmJ,SAASpH,MAAK,KACjD/B,KAAKyP,WACJ,KACD5L,QAGJmjC,UAAU,OAEXtkB,SACF,CAAClT,eAAgBxP,KAAKwP,iBAEzByD,EAAQ3D,QAAQhL,OAAOggC,GAEvBtkC,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,aChLtB,MAAMypC,WAAyB/7B,EAOlCc,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,yBAC7BvB,KAAK6T,QAAU,EAAa,CAAChF,KAAM,eACnC7O,KAAKsP,QAAQhL,OAAOtE,KAAK6T,SACzB7T,KAAK4M,WAAWxL,UAAUZ,SAE1BR,KAAK6T,QAAQxT,iBAAiB,SAAS,KACrC,MAAMgU,EAAUrU,KAAK4oB,SAAS0a,cAAc54B,KAAIogC,GAAOA,EAAI7hB,aAE3D,GAAGjpB,KAAK+qC,UACN/qC,KAAKmkC,QAAQ9vB,GACbrU,KAAKyP,YACA,CACL,MAAMpH,EAAUrI,KAAKmkC,QAAQ9vB,GAE1BhM,aAAmB7E,QACpBxD,KAAKgrC,gBAAgB3iC,QACD9B,IAAZ8B,GACRrI,KAAKyP,YAMNu7B,gBAAgB3iC,GACrB,MAAM4iC,GAAe,QAAgBjrC,KAAK6T,QAAS,cAEnDxL,EAAQtG,MAAK,KACX/B,KAAKyP,WACJ,KACDw7B,OAIGt7B,KAAK/P,GAQV,MAAMsrC,EAAMrrC,MAAM8P,OAElB3P,KAAKkQ,SAAStQ,EAAQyP,OACtBrP,KAAKi/B,SAAWr/B,EAAQK,KACxBD,KAAKmkC,QAAUvkC,EAAQukC,QACvBnkC,KAAK+qC,UAAYnrC,EAAQmrC,UAEzB,MAAMI,EAA8B,YAAlBnrC,KAAKi/B,SAqBvB,OApBAj/B,KAAK4oB,SAAW,IAAI+V,GAAe,CACjCoC,SAAU/gC,KAAKsP,QACfvC,SAAU/M,KAAK+qC,UAAY,KAAQlqC,IACjCb,KAAK6T,QAAQtT,UAAUsD,OAAO,eAAgBhD,IAEhDo+B,SAAU,CAACkM,EAAY,UAAY,YACnCh9B,YAAavO,EAAQuO,YACrBgxB,WAAYgM,EACZpL,iBAAkBoL,EAAY,CAAC,aAAc,eAAY5kC,IAGxD3G,EAAQwrC,iBACTprC,KAAK4oB,SAAS2a,WAAW3jC,EAAQwrC,iBAGnCprC,KAAK6T,QAAQtT,UAAUgB,IAAI,oBAC3BvB,KAAK6T,QAAQ/N,UAAY,GACzB9F,KAAK6T,QAAQS,UAAW,EACxBtU,KAAK6T,QAAQtT,UAAUsD,OAAO,aAAc7D,KAAK+qC,WAE1CG,GCvFX,MAEA,IAF+B,GAAAG,aAAc,E,eCF9B,SAASC,KACtB,MAAM3gB,EAAMtpB,SAAS6pB,gBAAgB,6BAA8B,OACnEP,EAAIxC,eAAe,KAAM,UAAW,aACpCwC,EAAIxC,eAAe,KAAM,QAAS,MAClCwC,EAAIxC,eAAe,KAAM,SAAU,MACnCwC,EAAIpqB,UAAUgB,IAAI,iBAElB,MAAMgqC,EAAMlqC,SAAS6pB,gBAAgB,6BAA8B,OACnEqgB,EAAIpjB,eAAe,KAAM,OAAQ,wBACjCojB,EAAIhrC,UAAUgB,IAAI,uBAElB,MAAMiqC,EAAOnqC,SAAS6pB,gBAAgB,6BAA8B,OAMpE,OALAsgB,EAAKrjB,eAAe,KAAM,OAAQ,mBAClCqjB,EAAKjrC,UAAUgB,IAAI,kBAEnBopB,EAAIrmB,OAAOinC,EAAKC,GAET7gB,ECNT,MAAM8gB,GAAYnrC,GACRA,EAAiBoe,QAAWpe,EAAiBoe,QAAQ,GAAKpe,EAG9DorC,GAAyBv+B,OAE/B,IAAIw+B,IAAe,EACnB9gC,EAAA,yBAA2B,uBAAwBoY,IACjD0oB,GAAe1oB,KAcF,MAAM2oB,GAenBjsC,YAAYC,GATJ,KAAAisC,OAA6M,WAC7M,KAAAnqB,aAAc,EACd,KAAAoqB,iBAAqD,EAGrD,KAAAC,SAAU,EACV,KAAAC,MAAgB,KAChB,KAAAC,MAAgB,KAsCxB,KAAA7kC,MAAS9G,IAKJ,GAAAsc,mBACD8uB,GAAuB98B,oBAAoB,YAAa5O,KAAKksC,WAAY,CAACtc,SAAS,KAEnF8b,GAAuB98B,oBAAoB,YAAa5O,KAAKksC,YAC7DlsC,KAAKmsC,YAAY7oC,MAAMuoC,OAAS,IAG/B7rC,KAAKosC,SAAWpsC,KAAK+rC,SACtB/rC,KAAKosC,UAGPpsC,KAAKgsC,MAAQhsC,KAAKisC,MAAQ,KAC1BjsC,KAAK+rC,SAAU,GAGjB,KAAAM,YAAeC,IACb,MAAMhsC,EAAImrC,GAASa,GACnB,GAAGtsC,KAAKusC,oBAAsBvsC,KAAKusC,kBAAkBD,GACnD,OAAOtsC,KAAKoH,QAGdpH,KAAKgsC,MAAQ1rC,EAAEqe,QACf3e,KAAKisC,MAAQ3rC,EAAEse,QAEZ,GAAAhC,mBACD8uB,GAAuBrrC,iBAAiB,YAAaL,KAAKksC,WAAY,CAACltB,SAAS,EAAO4Q,SAAS,IAEhG8b,GAAuBrrC,iBAAiB,YAAaL,KAAKksC,YAAY,IAI1E,KAAAA,WAAcI,IACZ,GAAkB,OAAftsC,KAAKgsC,OAAiC,OAAfhsC,KAAKisC,OAAkBN,GAE/C,YADA3rC,KAAKoH,QAIJpH,KAAK0hB,cACN,EAAAA,EAAA,GAAY4qB,GAGd,MAAMhsC,EAAImrC,GAASa,GACbE,EAAMlsC,EAAEqe,QACR8tB,EAAMnsC,EAAEse,QAER8tB,EAAQ1sC,KAAKgsC,MAAQQ,EACrBG,EAAQ3sC,KAAKisC,MAAQQ,EAE3B,IAAIzsC,KAAK+rC,QAAS,CAChB,IAAIW,IAAUC,EACZ,OAGF3sC,KAAK+rC,SAAU,EAEX,GAAAnvB,oBACF5c,KAAKmsC,YAAY7oC,MAAMspC,YAAY,SAAU5sC,KAAK6rC,OAAQ,aAGzD7rC,KAAK6sC,cACN7sC,KAAK6sC,eAmBT,MAAMC,EAAgB9sC,KAAK+sC,QAAQL,EAAOC,EAAOL,QAC5B/lC,IAAlBumC,GAA+BA,GAChC9sC,KAAKoH,UAzHP,EAAAH,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKmsC,YAAcnsC,KAAK2Y,QAExB3Y,KAAKogB,eAGAA,eACD,GAAAxD,oBAIF5c,KAAK2Y,QAAQtY,iBAAiB,aAAcL,KAAKqsC,YAAarsC,KAAK8rC,iBACnEJ,GAAuBrrC,iBAAiB,WAAYL,KAAKoH,SAJzDpH,KAAK2Y,QAAQtY,iBAAiB,YAAaL,KAAKqsC,YAAarsC,KAAK8rC,iBAClEJ,GAAuBrrC,iBAAiB,UAAWL,KAAKoH,QAOrD2Z,kBACD,GAAAnE,oBAIF5c,KAAK2Y,QAAQ/J,oBAAoB,aAAc5O,KAAKqsC,YAAarsC,KAAK8rC,iBACtEJ,GAAuB98B,oBAAoB,WAAY5O,KAAKoH,SAJ5DpH,KAAK2Y,QAAQ/J,oBAAoB,YAAa5O,KAAKqsC,YAAarsC,KAAK8rC,iBACrEJ,GAAuB98B,oBAAoB,UAAW5O,KAAKoH,QAOxD4lC,UAAUnB,GACf7rC,KAAK6rC,OAASA,GAEV,GAAAjvB,oBAAsB5c,KAAK+rC,SAC7B/rC,KAAKmsC,YAAY7oC,MAAMspC,YAAY,SAAU5sC,KAAK6rC,OAAQ,cCpDjD,MAAMoB,GAkBnBttC,YAAmBiN,GAAA,KAAAA,WAAAA,EAwSZ,KAAAlE,YAAewkC,IACpB,MAAMC,EAAS9rC,SAASC,cAAc,OAGtC,IAAI+E,EAFJ8mC,EAAO5sC,UAAUgB,IAAI0rC,GAAmBG,WAAa,UAAW,mBAG7DF,IACD7mC,EAA4B,iBAAd,EACZ6V,EAAA,WAA0BgxB,GACzBA,EAAQ9mC,OAAuDC,OAGpE,MAAMwoB,EAAM,IAAIwe,MAChBxe,EAAItuB,UAAUgB,IAAI,gBAClBstB,EAAIye,WAAY,EAEhB,MAAMC,EAAe,KACnB,GAAGlnC,EAAO,CACR,MAAMkH,EAAM6gB,GAAU,CACpBhtB,UAAW+rC,EACX9mC,MAAAA,EACAnF,KAAMgb,EAAA,kBAAiC7V,EAAO,IAAK,KAAK,GACxDmoB,kBAAkB,IAGpB,CAACjhB,EAAImhB,OAAOC,MAAOphB,EAAImhB,OAAOE,MAAM9kB,OAAOa,SAAS5F,SAAQ8pB,IAC1DA,EAAItuB,UAAUgB,IAAI,uBAEf,CACL,MAAM8E,EAAQ+V,EAAA,eAA6Bpc,KAAKmJ,QAChDkT,EAAA,YAA4B8wB,EAAQntC,KAAKmJ,OAAQ9C,EAAO,YAAawoB,KAezE,OAXG7uB,KAAKwtC,QAAQzhC,mBA7VC,EA8VfwhC,KAEAvtC,KAAKytC,qBAAqBC,QAAQP,GAClCntC,KAAK2tC,cAAc1oC,IAAIkoC,EAAQI,IAGjCvtC,KAAKwtC,QAAQlpC,OAAO6oC,GAEpBntC,KAAKuP,SAEE29B,GAnVPltC,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI0rC,GAAmBG,WAAa,cAE7DptC,KAAKwtC,QAAUnsC,SAASC,cAAc,OACtCtB,KAAKwtC,QAAQjtC,UAAUgB,IAAI0rC,GAAmBG,WAAa,YAE3DptC,KAAK4tC,SAAWvsC,SAASC,cAAc,OACvCtB,KAAK4tC,SAASrtC,UAAUgB,IAAI0rC,GAAmBG,WAAa,aAE5DptC,KAAK6kC,KAAOxjC,SAASC,cAAc,OACnCtB,KAAK6kC,KAAKtkC,UAAUgB,IAAI0rC,GAAmBG,WAAa,SAExDptC,KAAK+P,KAAO1O,SAASC,cAAc,OACnCtB,KAAK+P,KAAKxP,UAAUgB,IAAI0rC,GAAmBG,WAAa,SAExDptC,KAAK6tC,cAAgBxsC,SAASC,cAAc,OAC5CtB,KAAK6tC,cAActtC,UAAUgB,IAAI0rC,GAAmBG,WAAa,SAAU,wBAM3EptC,KAAK8tC,UAAYzsC,SAASC,cAAc,OACxCtB,KAAK8tC,UAAUvtC,UAAUgB,IAAI0rC,GAAmBG,WAAa,SAAUH,GAAmBG,WAAa,cAAe,oBAMtHptC,KAAKoB,UAAUkD,OAAOtE,KAAKwtC,QAASxtC,KAAK4tC,SAAU5tC,KAAK6kC,KAAM7kC,KAAK+P,KAAM/P,KAAK6tC,cAAe7tC,KAAK8tC,WAElG9tC,KAAK2tC,cAAgB,IAAIv8B,IACzBpR,KAAKwP,eAAiB,IAAI,IAE1B,MAAMu+B,EAAiB,IACY,IAA9B/tC,KAAK4M,WAAWohC,YACjBhuC,KAAK4M,WAAWu2B,kBAAkB,CAChCxqB,QAAS3Y,KAAK4M,WAAWxL,UAAUyoB,kBACnCgP,SAAU,WAEL,GAMLoV,EAAc,EAAI,EACxB,IAAI3e,GAAS,EACT4e,GAAS,GACb,QAAiBluC,KAAKoB,WAAiBkrC,IAAO,O,EAAA,K,OAAA,E,EAAA,YAC5C,GAAG4B,EAED,YADA,EAAAxsB,EAAA,GAAY4qB,GAId,GAAGhd,EAED,YADAA,GAAS,GAIX,IAAIye,IACF,OAGF,MAAMvuB,EAAOxf,KAAKoB,UAAUqe,wBAItBxB,EADIquB,EACEpuB,MAENiwB,EAASlwB,EAAIuB,EAAKqB,KACxB,IAAK7gB,KAAK4Y,WAAWlS,SAAS7F,SAAWb,KAAK4Y,WAAWjS,KAAK9F,QACxDstC,EAAU3uB,EAAK5d,MAAQqsC,GAAgBE,EAAU3uB,EAAK5d,MAAQ4d,EAAK5d,MAAQqsC,EAAe,CAC9F,MAAM9kC,EAASnJ,KAAKmJ,OAEdsB,EAAsF,GAC5FzK,KAAK4Y,WAAWlS,SAASjB,OAAOzF,KAAK4Y,WAAWtR,QAAStH,KAAK4Y,WAAWjS,MAAM5B,SAAQ,CAAC6C,EAAMzB,KAC5FsE,EAAQ3C,KAAK,CACX6Q,QAAmB3Y,KAAKwtC,QAAQ5c,SAASzqB,GACzCyB,KAAAA,OAIJ,MAAMwmC,EAAc3jC,EAAQ7J,MAAM,EAAGZ,KAAK4Y,WAAWlS,SAAS7F,QACxDwtC,EAAc5jC,EAAQ7J,MAAMZ,KAAK4Y,WAAWlS,SAAS7F,OAAS,GAE9D2X,EAASxY,KAAKwtC,QAAQ5c,SAAS5wB,KAAK4Y,WAAWlS,SAAS7F,QAC9DqtC,GAAS,EACTI,GAAiB91B,EAAQrP,GAAQ,IAAMA,IAAWnJ,KAAKmJ,QAAQnJ,KAAK4Y,WAAWtR,QAAS8mC,EAAaC,GACrGH,GAAS,MACJ,CACL,MACMK,EAAUtwB,EADAuB,EAAKgvB,MAAShvB,EAAK5d,MAAQ,EAQzC,IAAI6sC,EAHJzuC,KAAKwtC,QAAQjtC,UAAUgB,IAAI,iBACtBvB,KAAKwtC,QAAQkB,WAIwDD,EAD7C,IAA1BzuC,KAAK4Y,WAAWzR,OAAgBonC,EAC3BvuC,KAAK4Y,WAAWzR,QAAWnH,KAAK4Y,WAAWpS,MAAQ,GAAM+nC,IAAsBvuC,KAAK4Y,WAAWpS,MAAQ,GAC/F+nC,EAAU,GAAK,EAFwBvuC,KAAK4Y,WAAWpS,MAAQ,EAG/ExG,KAAK4Y,WAAWnR,GAAGgnC,IAEnB,UAAQ,KACNzuC,KAAKwtC,QAAQjtC,UAAUC,OAAO,sB,YAzDQ,K,gRA6D3C,CAACgP,eAAgBxP,KAAKwP,iBAEzB,MAAMm/B,EAAkB,KACtBrf,GAAS,EACTjuB,SAASwY,KAAKxZ,iBAAiB,GAAAuc,mBAAqB,WAAa,SAAUtc,IACzEgvB,GAAS,IACR,CAACnU,MAAM,KAGZ,IAAIvZ,EAAQ,EAAGqc,EAAI,EAAG2wB,EAAY,EAAkBC,EAAO,EACtC7uC,KAAK8uC,aAAe,IAAIlD,GAAa,CACxDjzB,QAAS3Y,KAAKwtC,QACdT,QAAS,CAACL,EAAOC,KACfiC,EAAYlC,EACZ,IAAIqC,EAAQ9wB,EAAIyuB,GAASO,GAAmB+B,MAM5C,OALGD,EAAQ,EAAGA,EAAQ,EACdA,EAAQF,IAAME,EAAQF,GAE9B7uC,KAAKwtC,QAAQlqC,MAAMmd,UAAYwsB,GAAmBgC,mBAAmBtuC,QAAQ,MAAOouC,EAAQ,OAErF,GAETxC,kBAAoBjsC,GACdytC,KAIM/tC,KAAKoB,UAAUb,UAAUmT,SAAS,eAAgBw6B,GAH1DS,KACA,EAAAjtB,EAAA,GAAYphB,IACL,GAOXusC,aAAc,KACZ,MAAMrtB,EAAOxf,KAAKwtC,QAAQ/tB,wBAC1B7d,EAAQ4d,EAAK5d,MACbitC,GAAQjtC,GAAS5B,KAAK+P,KAAKhE,kBAAoB,GAI/CkS,EAAIuB,EAAKqB,KAAO7gB,KAAKoB,UAAUqe,wBAAwBoB,KAEvD7gB,KAAKwtC,QAAQlqC,MAAMmd,UAAYwsB,GAAmBgC,mBAAmBtuC,QAAQ,MAAOsd,EAAI,MAExFje,KAAKoB,UAAUb,UAAUgB,IAAI,cAC7BvB,KAAKwtC,QAAQjtC,UAAUgB,IAAI,iBACtBvB,KAAKwtC,QAAQkB,YAEpBtC,QAAS,KACP,MAAM8C,EAAWlsC,KAAKmsC,KAAKnsC,KAAK4yB,IAAIgZ,IAAchtC,EAAQqrC,GAAmB+B,SAAWJ,GAAa,EAAI,GAAK,GAC9GD,IAIA3uC,KAAKwtC,QAAQjtC,UAAUC,OAAO,kBAC9B,UAAQ,KACNR,KAAK4Y,WAAWnR,GAAGynC,GACnBlvC,KAAKoB,UAAUb,UAAUC,OAAO,oBAKtCR,KAAKytC,qBAAuB,IAAI2B,sBAAqBC,IACnDA,EAAQtqC,SAAQuqC,IACVA,EAAMC,gBAIVvvC,KAAKwvC,oBAAoBF,EAAM92B,cAmB9Bi3B,QAAQtmC,GACbnJ,KAAKmJ,OAASA,EAEd,MAAM9C,EAAQ+V,EAAA,eAA6BjT,GAC3C,IAAI9C,EACF,OAGF,MAAMuS,EAA+C5Y,KAAK4Y,WAAa,IAAInS,EAAW,CACpFI,UAAW,GACXyB,SAAU,CAACF,EAAQF,EAAOrB,KACxB,IAAIqB,EAAO,OAAO1E,QAAQ2E,QAAQ,CAAC3B,WAAOD,EAAWoB,MAAO,KAE5D,GAAGwB,EAAO+4B,SAAU,CAClB,MAAMp5B,EAA4BV,GAAUwQ,EAAWtR,QACvD,OAAO4U,EAAA,gBAA+B/S,EAAQL,EAAOjC,GAAW9E,MAAKrB,IAC5D,CACL8F,MAAO9F,EAAM8F,MACbmB,MAAOjH,EAAMgvC,WAGZ,CACL,MAAM5M,EAA6E,GAenF,OAdIlqB,EAAWtR,SACbw7B,EAASh7B,KAAKtE,QAAQ2E,QAAQy1B,EAAA,oBAA8Bz0B,EAAOoyB,cAGrEuH,EAASh7B,KAAKmB,EAAA,YAA6B,CACzCE,OAAAA,EACAL,MAAO6mC,OAAOC,iBACdvmC,YAAa,CACXC,EAAG,iCAELF,MAAOvC,EACPgC,UAAW,KAGNrF,QAAQC,IAAIq/B,GAAU/gC,MAAMwG,IACjC,MAAM7H,EAAQ6H,EAAOV,MAIrB,GAFA9B,EAAyBrF,IAErBkY,EAAWtR,QAAS,CACtB,MAAMi2B,EAAWh1B,EAAO,GAClBrC,EAAUxF,EAAMuF,QAAQ07B,eAAckO,GACjCA,EAA6BzpC,OAAuDC,MAAMwK,KAAO0sB,EAASuS,WAAWj/B,KAGhI+H,EAAWtR,QAAUpB,GAAW+C,EAAA,4BAA6CjJ,KAAKmJ,OAAQo0B,EAASuS,YAIrG,MAAO,CACLtpC,MAAO9F,EAAM8F,MACbmB,MAAOjH,EAAMuF,cAKrByC,YAAa1I,KAAK0I,YAClBT,OAAQ,CAACL,EAAMM,KACb,MAAM2I,EAAK7Q,KAAK4Y,WAAWzR,MAErB8W,EAAI,IAAMgvB,GAAmB+B,MAAQn+B,EAC3C7Q,KAAKwtC,QAAQlqC,MAAMmd,UAAYwsB,GAAmBgC,mBAAmBtuC,QAAQ,MAAO,IAAIsd,MAExF,MAAM8xB,EAAY/vC,KAAK+P,KAAKwB,cAAc,WACvCw+B,GAAWA,EAAUxvC,UAAUC,OAAO,UAE7BR,KAAK+P,KAAK6gB,SAAS/f,GAC3BtQ,UAAUgB,IAAI,UAElBvB,KAAKwvC,oBAAoBxvC,KAAKwtC,QAAQ5c,SAAS/f,OAIpC,qBAAZxK,EAAMiD,IACPsP,EAAWtR,QAAUjB,EAAM2pC,UAG7BhwC,KAAK0I,YAAYkQ,EAAWtR,SAG5BsR,EAAWpX,MAAK,GAGX+N,SACL,MAAM2B,EAAM7P,SAASC,cAAc,OACnC4P,EAAI3Q,UAAUgB,IAAI0rC,GAAmBG,WAAa,QAClDptC,KAAK+P,KAAKzL,OAAO4M,GAEkB,IAAhClR,KAAK+P,KAAKhE,mBACXmF,EAAI3Q,UAAUgB,IAAI,UAGpBvB,KAAKoB,UAAUb,UAAUsD,OAAO,YAAa7D,KAAK+P,KAAKhE,mBAAqB,GAkDtEyjC,oBAAoBh3B,GAC1B,MAAMoY,EAAWvmB,MAAMC,KAAKkO,EAAOvU,cAAc2sB,UAC3CzqB,EAAMyqB,EAAS3Q,QAAQzH,GACfoY,EAAShwB,MAAMoC,KAAKH,IAAI,EAAGsD,EA9WxB,GA8W6CnD,KAAKC,IAAI2tB,EAAS/vB,OAAQsF,EA9WvE,IAgXXpB,SAAQyT,IACZ,MAAMmkB,EAAW38B,KAAK2tC,cAAcj8B,IAAI8G,GACrCmkB,IACDA,IACA38B,KAAK2tC,cAAc39B,OAAOwI,GAC1BxY,KAAKytC,qBAAqBwC,UAAUz3B,OAKnCrN,UACLnL,KAAKwP,eAAeS,YACpBjQ,KAAK8uC,aAAa/tB,mBAzXL,GAAAqsB,WAAa,kBACb,GAAA4B,MAAQ,GAAwB,EAAI,EACpC,GAAAC,mBAAqB,GAAwB,mCAAmChC,GAAmB+B,SAAW,oBCE/H,IAAIkB,GAAU,CAACjvB,EAAc+U,KAEzBA,EAAI3mB,MAAMvJ,UAAYmb,GAAQ,GAC9B+U,EAAI50B,UAAUkC,MAAMC,QAAU0d,EAAO,GAAK,QAI/B,MAAMkvB,GAqBnBxwC,YACSiN,EACC4C,EACA4gC,GAAW,GAFZ,KAAAxjC,WAAAA,EACC,KAAA4C,eAAAA,EACA,KAAA4gC,SAAAA,EAkLH,KAAAC,cAAgB,CAACC,GAAY,KAClC,MAAMnnC,EAASnJ,KAAKmJ,QAChBA,GAAW0B,EAAA,eAAmB1B,GAAUnJ,KAAKowC,UAEjD,iBAA2BpwC,KAAKmJ,OAAQnJ,KAAKowB,SAAUkgB,GAAW,GAAM,IAAMnnC,IAAWnJ,KAAKmJ,SAASnJ,KAAKowC,WApLxG,IACFpwC,KAAK4M,WAAWxL,UAAUb,UAAUgB,IAAI,eAGtCiO,IACFxP,KAAKwP,eAAiB,IAAI,KAIvBI,OACL5P,KAAK4P,KAAO,KAGZ5P,KAAK2Y,QAAUtX,SAASC,cAAc,OACtCtB,KAAK2Y,QAAQpY,UAAUgB,IAAI,mBAE3BvB,KAAKiT,QAAU,IAAIC,GAAe,CAChC4qB,aAAa,IAGf99B,KAAKmtC,OAAS,IAAIpR,GAClB/7B,KAAKmtC,OAAO5sC,UAAUgB,IAAI,iBAAkB,cAC5CvB,KAAKmtC,OAAOjtC,aAAa,SAAU,KAAMF,KAAKowC,UAC9CpwC,KAAKmtC,OAAOjtC,aAAa,YAAa,IAEtCF,KAAK8D,KAAOzC,SAASC,cAAc,OACnCtB,KAAK8D,KAAKvD,UAAUgB,IAAI,gBAExBvB,KAAKowB,SAAW/uB,SAASC,cAAc,OACvCtB,KAAKowB,SAAS7vB,UAAUgB,IAAI,oBAE5BvB,KAAKuwC,IAAM,IAAIhZ,GAAI,CACjBloB,MAAO,IACPqoB,gBAAiB,UACjB7oB,KAAM,OACNtD,UAAYjL,IAC+B,MAArCA,EAAEkY,OAAuBg4B,SAI7BhtC,QAAQ2E,QAAQy1B,EAAA,2BAAqC59B,KAAKmJ,SAASpH,MAAK6sB,IACtE4J,GAAoB5J,EAAK7a,OACzB+lB,GAAM,iBAAY,aAAa,UAKrC95B,KAAKuwC,IAAIlhC,MAAM9O,UAAUgB,IAAI,YAE7BvB,KAAKo7B,SAAW,IAAI7D,GAAI,CACtBloB,MAAO,IACPqoB,gBAAiB,WACjB7oB,KAAM,WACNtD,UAAW,KAETitB,GAAoB,IADcpc,EAAA,UAAwBpc,KAAKmJ,QAChCiyB,UAC/BtB,GAAM,iBAAY,kBAAkB,OAIxC95B,KAAK2qC,MAAQ,IAAIpT,GAAI,CACnBloB,MAAO,IACPqoB,gBAAiB,QACjB7oB,KAAM,QACNtD,UAAW,KAETitB,GAAoB,IADDvjB,EAAA,UAAwBjV,KAAKmJ,QACjBwhC,OAC/B7Q,GAAM,iBAAY,eAAe,OAIrC95B,KAAKy9B,KAAO,IAAIlG,GAAI,CAClBloB,MAAO,IACPqoB,gBAAiB,oBACjB7oB,KAAM,OACNtD,UAAW,KACTitB,GAAoBx4B,KAAKy9B,KAAKpuB,MAAMyhB,aAGlCgJ,GAAM,iBAAY,cAAc,OAKtC95B,KAAKqV,SAAW,IAAIkiB,GAAI,CACtBloB,MAAO,IACPqoB,gBAAiB,eACjB7oB,KAAM,aAGR7O,KAAKiT,QAAQ3D,QAAQhL,OACnBtE,KAAK2qC,MAAMvpC,UACXpB,KAAKo7B,SAASh6B,UACdpB,KAAKqV,SAASjU,UACdpB,KAAKuwC,IAAInvC,UACTpB,KAAKy9B,KAAKr8B,WAGZ,MAAM,eAACoO,GAAkBxP,KACtBA,KAAKowC,WACNpwC,KAAKywC,cAAgB,IAAIlZ,GAAI,CAC3BpW,cAAe,IAAI,KAAc,CAACtd,QAAQ,IAC1Cm0B,aAAc,gBACdnpB,KAAM,WAGRW,EAAejO,IAAIvB,KAAKywC,cAActvB,cAAcphB,MAApDyP,CAA2D,UAAWlP,IAChEA,EAAE6Y,WAKNlQ,EAAA,iBAAkCjJ,KAAKmJ,WAGzCqG,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,0BAA2BsF,IACvD,GAAG9U,KAAKmJ,SAAW2L,EAAO3L,OAAQ,CAChC,MAAM0R,EAAQyvB,GAAA,mBAAyCtqC,KAAKmJ,QAAQ,GACpEnJ,KAAKywC,cAActvB,cAAcQ,SAAW9G,MAIhD7a,KAAKiT,QAAQ3D,QAAQhL,OAAOtE,KAAKywC,cAAcrvC,YAGjDpB,KAAK2Y,QAAQrU,OAAOtE,KAAKiT,QAAQ7R,WAE9B,IACDpB,KAAK2Y,QAAQrU,OAAOw8B,MAGtBtxB,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,gBAAgB,EAAErG,OAAAA,MAC3CnJ,KAAKmJ,SAAWA,GACjBnJ,KAAKqwC,mBAIT7gC,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,iBAAkBrG,IAC3CA,IAAWnJ,KAAKmJ,QACjBnJ,KAAK0wC,gBAAe,MAIxBlhC,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,mBAAoBrG,IAC7CA,IAAWnJ,KAAKmJ,QACjBnJ,KAAK2wC,kBAITnhC,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,eAAgBoF,IACzC5U,KAAKmJ,SAAWyL,EAAOqU,YACxBjpB,KAAKqwC,mBAIT7gC,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,mBAAoBoF,IAC7C5U,KAAKmJ,SAAWyL,EAAOqU,aACXhU,EAAA,UAAwBL,GAC5BoG,OAAO41B,MAAS5wC,KAAKowC,UAC5BpwC,KAAK6wC,oBAKXrhC,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,iBAAkBrG,IAC3CnJ,KAAKmJ,SAAWA,GAGfnJ,KAAK8wC,eAKX9wC,KAAK+wC,sBAAwB5jC,OAAO6jC,YAAYhxC,KAAKqwC,cAAe,KAU/DY,cACL,CACEjxC,KAAKuwC,IACLvwC,KAAK2qC,MACL3qC,KAAKo7B,SACLp7B,KAAKqV,SACLrV,KAAKy9B,MACL14B,SAAQixB,IACRA,EAAI50B,UAAUkC,MAAMC,QAAU,UAG7BvD,KAAKywC,gBACNzwC,KAAKywC,cAAcrvC,UAAUkC,MAAMC,QAAU,GAC7CvD,KAAKywC,cAActvB,cAAcQ,SAAU,GAG1C3hB,KAAKkxC,wBACN/jC,OAAOoB,aAAavO,KAAKkxC,uBACzBlxC,KAAKkxC,sBAAwB,GAIzBC,gBACN,OAAOnxC,KAAKmJ,SAAW0B,EAAA,eAAmB7K,KAAKowC,SAG1CU,YACL,GAAG9wC,KAAKmxC,iBACQ/0B,EAAA,eAA6Bpc,KAAKmJ,QAEtC,CACR,MAAMioC,EAAapxC,KAAKwtC,QAcxB,OAbAxtC,KAAKwtC,QAAU,IAAIP,GAAmBjtC,KAAK4M,YAC3C5M,KAAKwtC,QAAQiC,QAAQzvC,KAAKmJ,QAC1BnJ,KAAKwtC,QAAQ3I,KAAKvgC,OAAOtE,KAAK8D,KAAM9D,KAAKowB,UAEzCpwB,KAAKmtC,OAAO3sC,SAET4wC,EAAYA,EAAWhwC,UAAUosB,YAAYxtB,KAAKwtC,QAAQpsC,WACxDpB,KAAK2Y,QAAQzU,QAAQlE,KAAKwtC,QAAQpsC,gBAEpC,IACDpB,KAAK4M,WAAWxL,UAAUb,UAAUgB,IAAI,aAO3C,IACDvB,KAAK4M,WAAWxL,UAAUb,UAAUC,OAAO,YAG1CR,KAAKwtC,UACNxtC,KAAKwtC,QAAQpsC,UAAUZ,SACvBR,KAAKwtC,QAAQriC,UACbnL,KAAKwtC,aAAUjnC,GAGjBvG,KAAKmtC,OAAOjtC,aAAa,OAAQ,GAAKF,KAAKmJ,QAE3CnJ,KAAKiT,QAAQ3D,QAAQpL,QAAQlE,KAAKmtC,OAAQntC,KAAK8D,KAAM9D,KAAKowB,UAGpDugB,eACN,MAAM,OAACxnC,GAAUnJ,KACjB,GAAGmJ,EAAO+4B,UAAYliC,KAAKmxC,gBAAiB,CAC1C,MAAM/V,EAAWhf,EAAA,kBAAgCjT,GACjD+mC,GAAQ9U,EAAUp7B,KAAKo7B,WAInByV,gBACN,MAAM,OAAC1nC,GAAUnJ,KACjB,GAAGmJ,EAAO+4B,UAAYliC,KAAKmxC,gBAAiB,CAC1C,MAAMlH,EAAOh1B,EAAA,UAAwB9L,GACrC+mC,GAAQjG,EAAKU,MAAQ11B,EAAA,kBAAgCg1B,EAAKU,YAASpkC,EAAWvG,KAAK2qC,QAI/E0G,oBACN,MAAMzG,EAAmB5qC,KAAKywC,cAC9B,GAAI7F,EAIJ,GAAG5qC,KAAKmxC,gBAAiB,CACvB,MAAMt2B,EAAQyvB,GAAA,mBAAyCtqC,KAAKmJ,QAAQ,GACpEyhC,EAAiBzpB,cAAcQ,SAAW9G,OAE1C,UAAQ,KACN+vB,EAAiBxpC,UAAUkC,MAAMC,QAAU,UAKzC+tC,W,MACN,MAAMnoC,EAASnJ,KAAKmJ,OAEpBnJ,KAAK2wC,eACL3wC,KAAK6wC,gBACL7wC,KAAKqxC,oBACLrxC,KAAK0wC,kBAEL,EAAA1iC,EAAA,GAAehO,KAAK8D,KAAM,IAAI,KAAU,CACtCqF,OAAAA,EACA2L,OAAQ9U,KAAKowC,WACZz3B,SAEH,MAAMgtB,EAAOvpB,EAAA,UAAwBjT,IACtB,QAAZ,EAAAw8B,MAAAA,OAAI,EAAJA,EAAM3qB,cAAM,eAAEu2B,WACfvxC,KAAK8D,KAAKQ,OAAOgnC,MAGnBtrC,KAAKqwC,eAAc,GAGdmB,sBACDxxC,KAAKyxC,UACTzxC,KAAKyxC,SAAU,EAEfzxC,KAAKixC,cACLjxC,KAAK8wC,YACL9wC,KAAKsxC,YAGAZ,eAAegB,GACjB1xC,KAAKkxC,wBACN/jC,OAAOoB,aAAavO,KAAKkxC,uBACzBlxC,KAAKkxC,sBAAwB,GAG/B,MAAM/nC,EAASnJ,KAAKmJ,OACdwD,EAAW3M,KAAK2M,SAElBxD,IAAUiT,EAAA,eAA6BjT,IAAYnJ,KAAKmxC,kBAI5D,EAAAQ,GAAA,GAAY/T,EAAA,2BAAqCz0B,EAAQuoC,IAAYE,IACnE,GAAG5xC,KAAKmJ,SAAWA,GAAUnJ,KAAK2M,WAAaA,GAAYyP,EAAA,eAA6BjT,GAEtF,OASF,GAHE+mC,GAAQ0B,EAAS79B,MAAQ,iBAA+B69B,EAAS79B,YAASxN,EAAWvG,KAAKuwC,MAGxFpnC,EAAO+4B,SAAU,CACnB,MAAM7E,EAAqBvpB,EAAA,UAAwB3K,EAAOoyB,YAC1D,GAAG8B,EAAKjC,SACN8U,GAAQ,gBAAkB7S,EAAKjC,SAAUp7B,KAAKy9B,UACzC,CACL,MAAMoU,EAAkBD,EAAkCpU,gBACvDqU,GACD3B,GAAQ2B,EAAepU,KAAMz9B,KAAKy9B,OAKxC,MAAMpoB,EAAYu8B,EAAkCv8B,SAClC,oBAAfA,MAAAA,OAAQ,EAARA,EAAU/L,IACX4mC,GAAQ76B,EAASpB,QAASjU,KAAKqV,UAGjCrV,KAAKkxC,sBAAwB/jC,OAAOC,YAAW,IAAMpN,KAAK0wC,gBAAe,IAAO,QAI7EjB,QAAQtmC,EAAgBwD,EAAW,GACrC3M,KAAKmJ,SAAWA,GAAUnJ,KAAK2M,WAAaA,IAE5C3M,KAAK4P,MACN5P,KAAK4P,OAGP5P,KAAKmJ,OAASA,EACdnJ,KAAK2M,SAAWA,EAEhB3M,KAAKyxC,SAAU,ICnZJ,MAAMK,WAA0BhjC,EAiB7CnP,YAAYoP,GACVlP,MAAMkP,GAAQ,GAdR,KAAApC,SAAW,EAEX,KAAAolC,iBAIJ,GAWGniC,OAGL5P,KAAKoB,UAAUb,UAAUgB,IAAI,yBAA0B,qBAGvD,MAAMywC,GAAc,OAAO,gCAAiC,CAAC5iC,UAAU,IACvEpP,KAAKmP,SAASqe,YAAYwkB,GAC1BhyC,KAAKmP,SAAW6iC,EAEhB,MAAMC,EAAoB5wC,SAASC,cAAc,OACjD2wC,EAAkB1xC,UAAUgB,IAAI,uBAChCywC,EAAY1tC,OAAO2tC,GAEnB,MAAMC,EAAsB7wC,SAASC,cAAc,OACnD4wC,EAAoB5mC,UAAY,wBAEhC,MAAM6mC,EAAsB9wC,SAASC,cAAc,OACnD6wC,EAAoB5xC,UAAUgB,IAAI,mBAElCvB,KAAKqP,MAAM/K,QAAO,IAAAsH,MAAK,YACvB5L,KAAKoyC,QAAU,EAAW,QAG1BD,EAAoB7tC,OAAOtE,KAAKqP,MAAOrP,KAAKoyC,SAE5C,MAAMC,EAAqBhxC,SAASC,cAAc,OAClD+wC,EAAmB9xC,UAAUgB,IAAI,mBAEjC,MAAM+wC,EAA2BtyC,KAAKqP,MAAMjL,YAC5CkuC,EAAYhuC,QAAO,IAAAsH,MAAK,yBAExBymC,EAAmB/tC,OAAOguC,GAE1BJ,EAAoB5tC,OAAO6tC,EAAqBE,GAEhDryC,KAAKkP,OAAO5K,OAAO4tC,GAInBlyC,KAAKuyC,QAAU,IAAIpC,GAAYnwC,KAAK4M,YACpC5M,KAAKuyC,QAAQ3iC,OAEb5P,KAAK4M,WAAWtI,OAAOtE,KAAKuyC,QAAQ55B,SAGpC3Y,KAAK4M,WAAW4lC,mBAAqB,KACnC,MAAMhzB,EAAOxf,KAAKyyC,YAAYC,IAAIjzB,wBAClC,IAAID,EAAK5d,MAAO,OAEhB,MACM+wC,EADMnzB,EAAKoZ,IAAM,GALH,GAOpBqZ,EAAkB1xC,UAAUsD,OAAO,aAAc8uC,GACjD3yC,KAAKyyC,YAAYrxC,UAAUb,UAAUsD,OAAO,mBAAoB8uC,GAChEC,GAAYD,GAERA,GACF3yC,KAAKyyC,YAAYI,wBAIrB,MAAMD,GAAa,OAAiBV,EAAqB,aAAc,IAAK,MAAM,GAElFU,EAAW,IAEX,QAAiB5yC,KAAKmP,UAAW7O,IAC5BN,KAAKmP,SAAS0a,kBAAkBtpB,UAAUmT,SAAS,eACpD1T,KAAK4M,WAAWu2B,kBAAkB,CAChCxqB,QAAS3Y,KAAK4M,WAAWxL,UAAUyoB,kBACnCgP,SAAU,UAEZ+Z,EAAW,GACXX,EAAkB1xC,UAAUC,OAAO,eAC1BR,KAAK4M,WAAWkmC,4BACzB9yC,KAAK+O,OAAO2B,sBAIhB,QAAiB1Q,KAAKoyC,SAAU9xC,IAC9B,IAAI4Q,EAEFA,EADClR,KAAKmJ,OAAO65B,YACP,IAAIoF,GAAepoC,KAAK+O,QAExB,IAAI86B,GAAkB7pC,KAAK+O,QAGhCmC,IACEA,aAAek3B,GAChBl3B,EAAIiD,OAASnU,KAAKmJ,OAAOoyB,WAEzBrqB,EAAI/H,OAASnJ,KAAKmJ,OAGpB+H,EAAIvB,WAIR9E,EAAA,yBAA2B,mBAAoB+J,IAC1C5U,KAAKmJ,SAAWyL,GACjB5U,KAAK+yC,mBAITloC,EAAA,yBAA2B,eAAgBsJ,IACtCnU,KAAKmJ,SAAWgL,EAAO8U,UAAS,IACjCjpB,KAAK+yC,mBAITloC,EAAA,yBAA2B,uBAAwBmoC,IACjD,IAAI,MAAM7pC,KAAU6pC,EAClBhzC,KAAKizC,kBAAkB9pC,EAAO8f,WAAY5e,MAAMC,KAAK0oC,EAAa7pC,QAItE0B,EAAA,yBAA2B,kBAAkB,EAAE1B,OAAAA,EAAQQ,KAAAA,MACrD3J,KAAKkzC,sBAAsB/pC,EAAQkB,MAAMC,KAAKX,OAIhDkB,EAAA,yBAA2B,gBAAgB,EAAE3E,QAAAA,MAC3ClG,KAAKizC,kBAAkB/sC,EAAQiD,OAAQ,CAACjD,EAAQ6C,SAKlD/I,KAAKyyC,YAAc,IAAIU,GAAe,CACpCC,UAAW,CAAC,CACV/pC,YAAa,2BACbvF,KAAM,oBACN7D,KAAM,WACL,CACDoJ,YAAa,gCACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,8BACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,yBACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,2BACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,gCACbvF,KAAM,kBACN7D,KAAM,UAER2M,WAAY5M,KAAK4M,WACjBymC,YAAcC,IACZ,IAAIjlC,EAA4B,YAAlBilC,EAASrzC,MAAsB4K,EAAA,mCAAuC,IAAM,EAC1FuC,YAAW,KACTmmC,EAAchzC,UAAUsD,OAAO,YAA+B,YAAlByvC,EAASrzC,QACpDoO,MAIPrO,KAAKuyC,QAAQ55B,QAAQrU,OAAOtE,KAAKyyC,YAAYrxC,WAE7C,MAAMmyC,EAAgB,EAAa,CAAC1kC,KAAM,qBAC1C7O,KAAKsP,QAAQhL,OAAOivC,GAEpBA,EAAclzC,iBAAiB,SAAS,KACtC,MAAM8I,EAASnJ,KAAKmJ,OACd0H,EAAK7Q,KAAKmJ,OAAOoyB,WACjB+M,EAAYx0B,EAAA,YAA0BjD,GAEtC2iC,EAAmB,CAACn/B,EAAmBsoB,KAC3C,IAAI3E,EAA2BiE,EAC7BG,EAAiCG,EACjCC,EAEF,GAAGnoB,EAAQxT,OAAS,EAClBm3B,EAAe,uBACfiE,EAAgB,EAAC,IAAArwB,MAAK,UAAW,CAACyI,EAAQxT,UAC1Cu7B,EAAqB,2BACrBG,EAAsBloB,EAAQ3J,KAAIvB,IAChC,MAAMnE,EAAI3D,SAASC,cAAc,KAEjC,OADA0D,EAAEV,OAAO,IAAI,KAAU,CAAC6E,OAAAA,IAASwP,SAC1B3T,KAGLsjC,IACF9L,EAAa,CAAC,CACZvb,KAAM,4BACNU,SAAS,SAGR,CACLqW,EAAe,yBACfoE,EAAqB,2BACrB,MAAMp3B,EAAI3D,SAASC,cAAc,KACjC0D,EAAEV,OAAO,IAAI,KAAU,CACrB6E,OAAQkL,EAAQ,KACfsE,SACH4jB,EAAsB,CAACv3B,GAEnBsjC,IACF9L,EAAa,CAAC,CACZvb,KAAM,8BACNM,SAAU,CAAC,IAAI,KAAU,CAACpY,OAAQkL,EAAQ,KAAKsE,SAC/CgJ,SAAS,KAKf4a,EAAoBz0B,KAAK,IAAI,KAAU,CACrCqB,OAAAA,IACCwP,SAEH,IAAIijB,GAAU,oBAAqB,CACjCzyB,OAAAA,EACA6uB,aAAAA,EACAoE,mBAAAA,EACAG,oBAAAA,EACA3a,QAAS,CAAC,CACR6X,QAAS,MACTkD,SAAAA,IAEFH,WAAAA,IACC9Z,QAGC+wB,EAAW5lC,IACC,4BAAbA,EAAI5N,MACL85B,GAAS,CAACC,YAAa,wBAI3B,GAAGsO,EAAW,CACZ,MAAMp3B,EAAM,IAAI25B,GAAiB7qC,KAAK+O,QACtCmC,EAAIvB,KAAK,CACP1P,KAAM,UACN8qC,WAAW,EACX5G,QAAU9vB,IACRm/B,EAAiBn/B,GAAS,KACxB,MAAMhM,EAAUyL,EAAA,kBAAgCjD,EAAIwD,GACpDhM,EAAQ4F,MAAMwlC,GACdviC,EAAI85B,gBAAgB3iC,OAGf,GAETgH,MAAO,kBACPlB,YAAa,uBAGf,IAAIu1B,GAAc,CAChBI,UAAW,CAAC,YACZ31B,YAAa,SACby1B,SAAWz6B,IACTiE,YAAW,KACTomC,EAAiB,CAACrqC,IAAUwY,IAC1B7N,EAAA,cAA4BjD,EAAI1H,EAAQwY,EAAQzgB,UAAOqF,EAAY,GAClE0H,MAAMwlC,QAER,SASNR,kBAAkB9pC,EAAgBgB,GACvC,IAAGnK,KAAK4P,MAEJ5P,KAAK+xC,iBAAiB5oC,GAA1B,CAEAgB,EAAOA,EAAKvJ,QAAQgG,UACpB,IAAI,MAAM0sC,KAAYtzC,KAAKyyC,YAAYW,UAAW,CAChD,MAAM/pC,EAAciqC,EAASjqC,YACvBqqC,EAAW1zC,KAAKyyC,YAAYkB,qBAAqBxpC,EAAKO,KAAI3B,GAAOE,EAAA,mBAAoCE,EAAQJ,KAAOM,GAC1H,GAAGqqC,EAAS7yC,OAAQ,CAClB,MAAMoF,EAAUjG,KAAK+xC,iBAAiB5oC,GAAQE,GAC3CpD,GACDA,EAAQ+B,WAAW0rC,EAAShpC,KAAIxE,IAAW,CAAE6C,IAAK7C,EAAQ6C,IAAKI,OAAQjD,EAAQiD,YAG9EnJ,KAAKmJ,SAAWA,IAA6D,IAAnDnJ,KAAKyyC,YAAYmB,gBAAgBvqC,KAC5DrJ,KAAKyyC,YAAYmB,gBAAgBvqC,IAAgBqqC,EAAS7yC,OAC1Db,KAAKyyC,YAAYoB,oBAAoBH,EAAUJ,GAAU,OAM1DJ,sBAAsB/pC,EAAgBgB,GAC3C,IAAGnK,KAAK4P,MAEJ5P,KAAK+xC,iBAAiB5oC,GAA1B,CAEA,IAAI,MAAMJ,KAAOoB,EACf,IAAI,MAAMlK,KAAQD,KAAKyyC,YAAYW,UAAW,CAC5C,MAAM/pC,EAAcpJ,EAAKoJ,YAEnBpD,EAAUjG,KAAK+xC,iBAAiB5oC,GAAQE,GAC9C,IAAIpD,EAAS,SAEb,MAAME,EAAMF,EAAQ6S,WAAU+2B,GAAKA,EAAE9mC,MAAQA,IAC7C,IAAY,IAAT5C,EAAY,CAGb,GAFAF,EAAQK,OAAOH,EAAK,GAEjBnG,KAAKmJ,SAAWA,EAAQ,CACzB,MACM8nB,EADYjxB,KAAKyyC,YAAY1iC,KAAK1G,GAClBkI,cAAc,iBAAiBxI,qBAAuBI,OACzE8nB,IACEjxB,KAAKyyC,YAAYqB,UAAUC,aAC5B/zC,KAAKyyC,YAAYqB,UAAUE,gBAAgB/iB,GAG7CA,EAAIzwB,UAGHR,KAAKyyC,YAAYmB,gBAAgBvqC,IAAiBlD,EAAM,GACzDnG,KAAKyyC,YAAYmB,gBAAgBvqC,KAIrC,OAKNrJ,KAAK4M,WAAW65B,YAGXwK,cAELjxC,KAAKuyC,QAAQtB,cAEbjxC,KAAKoyC,QAAQ7xC,UAAUgB,IAAI,QAE3BvB,KAAKyyC,YAAYxB,aAAY,GAE7BjxC,KAAKoB,UAAUb,UAAUsD,OAAO,kBAAmB7D,KAAKyyC,YAAYwB,kBAAoBngC,EAAA,YAA0B9T,KAAKmJ,OAAOoyB,WAAY,iBAKrI2Y,aAAa7rC,GAClBrI,KAAKyyC,YAAY0B,UAAY9rC,EAGxBonC,QAAQtmC,EAAgBwD,EAAW,G,MACxC,OAAG3M,KAAKmJ,SAAWA,GAAUnJ,KAAK2M,WAAaA,KAE/C3M,KAAKmJ,OAASA,EACdnJ,KAAK2M,SAAWA,EAChB3M,KAAKo0C,aAAc,EAEhBp0C,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd5P,KAAKyyC,YAAY4B,SAAS,CACxBlrC,OAAAA,EAEAmrC,eAA6C,QAA7B,EAAAt0C,KAAK+xC,iBAAiB5oC,UAAO,QAAKnJ,KAAK+xC,iBAAiB5oC,GAAU,KAGpFnJ,KAAKuyC,QAAQ9C,QAAQtmC,EAAQwD,IAEtB,GAGF6kC,sBACDxxC,KAAKo0C,cAITp0C,KAAKo0C,aAAc,EAEnBp0C,KAAKixC,cAELjxC,KAAKuyC,QAAQf,sBAEbxxC,KAAK+yC,iBAGCA,gBACN,IAAIrwB,EAEFA,EADC1iB,KAAKmJ,OAAO+4B,SACNliC,KAAKmJ,SAAW0B,EAAA,cAAkBoK,EAAA,YAA0BjV,KAAKmJ,OAAOoL,YAExET,EAAA,YAA0B9T,KAAKmJ,OAAOoyB,WAAY,eAG3Dv7B,KAAKoyC,QAAQ7xC,UAAUsD,OAAO,QAAS6e,GAGlC6xB,iBAAiBC,EAAiBC,GAAW,GAClDz0C,KAAKyyC,YAAYjxC,KAAKgzC,EAAQC,GAGhC7iC,qBACE5R,KAAK4M,WAAW65B,YCvbb,MAAMiO,GAAgC,wBA+HvCC,GAAkB,IA7HjB,cAA8BpkC,EAInC5Q,cACEE,MAAM,CACJyR,UAAWjQ,SAASuzC,eAAe,gBACnCnkC,cAAc,EACdG,eAAgB,UANZ,KAAAikC,uBAAwB,EAS9B9pB,EAAA,oBAA4B,gBAAgB,CAACzgB,EAAMwqC,KAC9CA,IAAO,aAAqBxqC,IAAS,aACtCtK,KAAK+0C,eAAc,MAIvBhqB,EAAA,oBAA4B,UAAU,KACpC/qB,KAAKg1C,yBAGPh1C,KAAKi1C,eAAiB,IAAInD,GAAkB9xC,MAGvCiR,WAAWJ,EAAYC,EAAkBC,GAC1C/Q,KAAKwQ,cAAc3P,QACrBb,KAAK+0C,eAAc,EAAOjkC,GAG5BjR,MAAMoR,WAAWJ,EAAIC,EAASC,GAaxBikC,sBACN,MAAME,EAAal1C,KAAKsR,UAAU6jC,YAAcn1C,KAAKsR,UAAU8jC,uBAAuBD,YACtF9zC,SAASg0C,gBAAgB/xC,MAAMspC,YAAY,4BAA6B,GAAKsI,GAGxEH,cAAcO,EAAkBxkC,GAGrC,MAAMykC,EAASl0C,SAASwY,KAAKtZ,UAAUmT,SAASghC,IAChD,IAAIc,EAaJ,QAZcjvC,IAAX+uC,EACEA,EACGC,IACFC,GAAa,GAEPD,IACRC,GAAa,GAGfA,GAAa,GAGXA,EAAY,OAAOhyC,QAAQ2E,UAE3BotC,GAAWv1C,KAAKwQ,cAAc3P,QAChCb,KAAKi1C,eAAetlC,OAIlB3P,KAAK60C,wBACP70C,KAAKg1C,sBACLh1C,KAAK60C,uBAAwB,GAG/B,MAAMY,EAAmB,aAAuBF,EAAS,EAAI,EAAGzkC,GAEhE,OADAzP,SAASwY,KAAKtZ,UAAUsD,OAAO6wC,GAA+BY,GACvDG,IAgDX,sBAAiCd,GACjC,YC9He,MAAMe,WAA0B5mC,EAGnCc,OACR5P,KAAKoB,UAAUyP,GAAK,yBACpB7Q,KAAKoB,UAAUb,UAAUgB,IAAI,sBAE7BvB,KAAK21C,WAAat0C,SAASC,cAAc,OACzCtB,KAAK21C,WAAWp1C,UAAUgB,IAAI,gBAC9BvB,KAAK4M,WAAWtI,OAAOtE,KAAK21C,YAGvBhmC,KAAKzJ,GACV,MAAMglC,EAAMrrC,MAAM8P,OACZimC,EAAOC,GAAA,UAAwB3vC,EAAQoQ,MAAMs/B,KAAK/kC,IAExD7Q,KAAKkQ,SAAS0lC,EAAKA,KAAK56B,OAAO86B,KAAO,yBAA2B,0BAEjE,MAAMzmC,EAAQhO,SAASC,cAAc,MACrC+N,EAAMvJ,UAAY8vC,EAAKA,KAAKG,UAE5B,MAAMx1B,EAAWq1B,EAAKrT,QAAQA,QAAQ73B,KAAI/F,GAAKA,EAAEqxC,OAASJ,EAAKrT,QAAQ0T,aAAe,MACtFC,GAAc31B,GAEd,MAAM2b,EAAW76B,SAAS86B,yBAyF1B,OAxFAyZ,EAAKrT,QAAQA,QAAQx9B,SAAQ,CAACwD,EAAQpC,KACpC,IAAIoC,EAAOytC,OAAQ,OAEnB,MAAMG,EAAK90C,SAASC,cAAc,MAE5B80C,EAASR,EAAKA,KAAKS,QAAQlwC,GAG3BmwC,EAAWj1C,SAASC,cAAc,OACxCg1C,EAAS/1C,UAAUgB,IAAI,uBAEvB,MAAMg1C,EAAcl1C,SAASC,cAAc,OAC3Ci1C,EAAYzwC,UAAY,kBAAgCswC,EAAOn1B,MAE/D,MAAMu1B,EAAiBn1C,SAASC,cAAc,OAC9Ck1C,EAAexoB,UAAYhrB,KAAKE,MAAMqd,EAASpa,IAAQ,IAEvDmwC,EAAShyC,OAAOiyC,EAAaC,GAG7B,MAAM9qC,EAAO,oBACbA,EAAKnL,UAAUgB,IAAI,uBAEnB,wBAAuCmK,GAAM,KAC3C,4BACCnF,GAAW,GAEdmF,EAAKpI,MAAMmzC,UAAyC,GAA7BzzC,KAAKC,IAAIsF,EAAOytC,OAAQ,GAAU,KAEzD9Z,EAAS53B,OAAO6xC,EAAIG,EAAU5qC,GAE9B,IAAI8oB,EAAgBprB,EAAQ,EAAGm1B,GAAU,EAAO1d,EAAOtY,EAAOytC,OAAS,EACvE,MAAMx0C,EAAO,KACR+8B,IACHA,GAAU,EAEVsX,GAAA,WAAyB3vC,EAASkwC,EAAOM,OAAQliB,EAAQprB,GAAOrH,MAAK40C,IACnEA,EAAUC,MAAM7xC,SAAQ8xC,IACtB,MAAM,IAAChiC,GAAO,gBAA+B,CAC3CC,OAAQ+hC,EAAK5Q,QAAQhd,UAAS,GAC9B7nB,UAAWsK,EACXgC,YAAY,EACZqH,eAAe,EACfnH,WAAW,EACXD,WAAY,KAEdkH,EAAIG,gBAAgB/Q,cAAczD,YAGjCg0B,IACD3T,GAAQ81B,EAAUC,MAAM/1C,OACvBi2C,EAASC,iBAAiCvpB,aAAY,IAAA5hB,MAAK,uBAAwB,CAAC5I,KAAKC,IAAI,GAAI4d,OAGpG2T,EAASmiB,EAAUK,YACnB5tC,EAAQ,GAEJyX,GAAS81B,EAAUC,MAAM/1C,QAC3Bi2C,EAASt2C,YAEV8kB,SAAQ,KACTiZ,GAAU,OAMd,GAFA/8B,IAEGqf,GAAQ,EAAG,OAEd,MAAMi2B,EAAWz1C,SAASC,cAAc,OACxCw1C,EAASv2C,UAAUgB,IAAI,oBAAqB,YAAa,eACzDu1C,EAASz2C,iBAAiB,QAASmB,IACnC,EAAA6f,GAAAA,QAAOy1B,GACP,MAAMG,EAAO51C,SAASC,cAAc,OACpC21C,EAAK12C,UAAUgB,IAAI,cACnBu1C,EAASxyC,OAAO2yC,GAAM,IAAArrC,MAAK,uBAAwB,CAAC5I,KAAKC,IAAI,GAAI4d,MAEjEqb,EAAS53B,OAAOwyC,MAGlB92C,KAAK21C,WAAWrxC,OAAO+K,EAAO6sB,GAE9B,kBAA8B,GAAMn6B,MAAK,SAMlCmpC,G,eCtGX,IAAIgM,GAAkB,EACtB,MAKahB,GAAiB31B,IAG5B,MAAMkU,EAAMlU,EAAS9b,QAAO,CAACC,EAAK43B,IAAM53B,EAAM1B,KAAKE,MAAMo5B,IAAI,GAC7D,GAAG7H,EAAM,IAAK,CACZ,MAAMkB,EAAOlB,EAAM,IACb5zB,EAAS0f,EAAS1f,OACxB,IAAI,IAAI0E,EAAI,EAAGA,EAAIowB,IAAQpwB,EAAG,CAC5B,IAAI4xC,GAAY,EAAGC,EAAe,EAClC,IAAI,IAAIC,EAAI,EAAGA,EAAIx2C,IAAUw2C,EAAG,CAC9B,IAAIC,EAAY/2B,EAAS82B,GAAK,EAC3BC,GAAa,IAAOA,EAAYF,IACjCA,EAAeE,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGF52B,EAAS42B,IAAaC,QAEnB,GAAG3iB,EAAM,IAAK,CACnB,MAAMkB,EAAO,IAAMlB,EACb5zB,EAAS0f,EAAS1f,OACxB,IAAI,IAAI0E,EAAI,EAAGA,EAAIowB,IAAQpwB,EAAG,CAC5B,IAAI4xC,GAAY,EAAGI,EAAe,EAClC,IAAI,IAAIF,EAAI,EAAGA,EAAIx2C,IAAUw2C,EAAG,CAC9B,IAAIC,EAAY/2B,EAAS82B,GAAK,EAC3BC,EAAY,IAAOA,EAAYC,IAChCA,EAAeD,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGF52B,EAAS42B,IAAa,EAAII,KAqBhC1sC,EAAA,yBAA2B,eAAe,EAAE+qC,KAAAA,EAAMrT,QAAAA,MAC3Bl4B,MAAMC,KAAKjJ,SAASmQ,iBAAiB,yBAAyBokC,EAAK/kC,SAC3E9L,SAAQyyC,IAEnBA,EAAYC,WAAa7B,EAAK56B,OAAO08B,OACrCF,EAAYG,eAAepV,EAASqT,EAAKgC,qBAI7C/sC,EAAA,yBAA2B,gBAAgB,KACtCgtC,IACDC,GAAaD,GAAcE,GAAoBC,OAInDjtB,EAAA,oBAA4B,UAAU,KACpCktB,GAAYC,eACZD,GAAYE,iBAGdptB,EAAA,oBAA4B,gBAAgB,KAC1CktB,GAAYC,kBAGd,MAAMJ,GAAe,CAACn/B,EAAsBy/B,EAAoB/pC,KAC9DsK,EAAQpY,UAAUC,OAAO,UAEzB+N,aAAaF,GACbjB,YAAW,KACTgrC,IACAz/B,EAAQnY,SAELq3C,KAAiBl/B,GAAWo/B,KAAuBK,GAAUJ,KAAwB3pC,IACtFwpC,GAAeE,GAAqB,KACpCC,GAAsB,KAEvB,MAGL,IAAIH,GAA2BE,GAAgCC,GA+BhD,MAAMC,WAAoB9uB,YAmCvCxpB,cACEE,QApBK,KAAA43C,UAAW,EACV,KAAAY,QAAS,EACT,KAAAC,aAAc,EACd,KAAAC,UAAW,EACX,KAAAC,YAAa,EACb,KAAAZ,cAA0B,GAS1B,KAAAa,eAA2B,GAG3B,KAAAC,UAAW,EAOZvkB,sBACL,MAAMvyB,EAAQ4/B,GAAA,SAAoB,IAAMA,GAAA,QAAmB,IAAMzW,EAAA,qBACjE/qB,KAAK24C,WAAa/2C,EApLH,EAoLwB5B,KAAK44C,YAAc,KAGrDzkB,qBACDn0B,KAAK24C,YACYtuC,MAAMC,KAAKjJ,SAASmQ,iBAAiB,0BAC7CzM,SAAQyyC,IACnBA,EAAYqB,SAAS9zC,SAAQ,CAAC4lB,EAAKxkB,KAEjCqxC,EAAYsB,gBAAgB3yC,EAAK,SAKhCojB,SAID2tB,KACFA,GAAmB71C,SAASuzC,eAAe,aAAuCmE,iBAElFd,GAAYC,gBAGd,MAAMc,EAASh5C,KAAKkG,QAAQoQ,MAAMs/B,KAAK/kC,IACjC,KAAC+kC,EAAI,QAAErT,GAAWsT,GAAA,UAAwBmD,GAUhD,IAAIC,EANDj5C,KAAKkG,QAAQ8U,OAAOC,cACrBjb,KAAKO,UAAUgB,IAAI,iBAMlBq0C,EAAK56B,SACNhb,KAAKu4C,WAAa3C,EAAK56B,OAAOk+B,cAC9Bl5C,KAAKq4C,SAAWzC,EAAK56B,OAAO86B,KAC5B91C,KAAKy3C,WAAa7B,EAAK56B,OAAO08B,OAC9B13C,KAAKw4C,aAAe5C,EAAK56B,OAAOm+B,gBAE7Bn5C,KAAKy3C,UACNwB,EAAU,wBACVj5C,KAAKO,UAAUgB,IAAI,cAEnB03C,EADQj5C,KAAKq4C,OACHr4C,KAAKu4C,SAAW,sBAAwB,+BAExCv4C,KAAKu4C,SAAW,wBAA0B,4BAIxDv4C,KAAKO,UAAUsD,OAAO,cAAe7D,KAAKw4C,YAE1C,MAAMY,EAAiBp5C,KAAKw4C,WAAa,yDAA2D,GAC9F5B,EAAQhB,EAAKS,QAAQ3rC,KAAI,CAAC0rC,EAAQjwC,IAC/B,kDACkCA,4PAMjCizC,oHAG4B,kBAAgChD,EAAOn1B,mWAO1E4H,KAAK,IAkBR,GAhBA7oB,KAAK8F,UAAY,mCACW8vC,EAAKG,wJAK7Ba,IAEJ52C,KAAKq5C,QAAUr5C,KAAK6pB,kBAAkBgT,mBACtC78B,KAAKs5C,QAAUt5C,KAAKq5C,QAAQxvB,kBAC5B7pB,KAAKu5C,WAAav5C,KAAKq5C,QAAQtC,iBAE5BkC,GACDj5C,KAAKs5C,QAAQh1C,QAAO,IAAAsH,MAAKqtC,IAGxBj5C,KAAKq4C,SACNr4C,KAAKO,UAAUgB,IAAI,WAEhBq0C,EAAK4D,cAAgB5D,EAAK6D,YAAY,CACvC,MAAMC,EAAcr4C,SAASC,cAAc,OAC3Co4C,EAAYn5C,UAAUgB,IAAI,aAC1BvB,KAAKq5C,QAAQ/0C,OAAOo1C,GAEpB,MAAM/uB,EAAMtpB,SAAS6pB,gBAAgB,6BAA8B,OAEnEP,EAAIpqB,UAAUgB,IAAI,mBAElBvB,KAAK25C,UAAYhvB,EAEjB,MAAMivB,EAAc,EACdC,EAAS,EACTC,EAAgB,EAAI92C,KAAK+2C,GAAKF,EAE9B3xB,EAAS7mB,SAAS6pB,gBAAgB,6BAA8B,UACtEhD,EAAO3nB,UAAUgB,IAAI,0BACrB2mB,EAAOC,eAAe,KAAM,KAAM,MAClCD,EAAOC,eAAe,KAAM,KAAM,MAClCD,EAAOC,eAAe,KAAM,IAAK,GAAK0xB,GACtC3xB,EAAOC,eAAe,KAAM,eAAgB,GAAKyxB,GAEjDjvB,EAAIrmB,OAAO4jB,GACXloB,KAAKq5C,QAAQ/0C,OAAOqmB,GAEpB,MAAMqvB,EAA6B,IAApBpE,EAAK4D,aACdS,EAAqE,KAAxDrE,EAAK6D,WAAaS,GAAA,oBAarCl6C,KAAKm6C,aAAehtC,OAAO6jC,aAAY,KACrC,MAAMoJ,EAAOC,KAAKC,MACZ/5B,GAAY05B,EAAYG,GAAQJ,EAChCO,GAAYN,EAAYG,GAAQ,IAAO,EAAI,EACjDV,EAAY5zC,UAAY+f,OAAO00B,GAAUz0B,WAErCy0B,GAAY,IACdb,EAAYp2C,MAAMk3C,MAAQ,UAC1BtyB,EAAO5kB,MAAMm3C,OAAS,WAKxBvyB,EAAO5kB,MAAMo3C,iBAAmBZ,EAAgBv5B,EAAWu5B,EAC3D5xB,EAAO5kB,MAAMq3C,gBAAkB,GAAGb,KAAiBA,IAEhDM,GAAQH,IACTW,cAAc56C,KAAKm6C,cACnBT,EAAY5zC,UAAY,GAExBoiB,EAAO5kB,MAAMo3C,iBAAmBZ,EAChC95C,KAAKm6C,aAAe,EAEpB/sC,YAAW,KAETyoC,GAAA,aAA2B71C,KAAKkG,WAC/B,QAEJ,KAIPlG,KAAK66C,WAAaxwC,MAAMC,KAAKtK,KAAKwR,iBAAiB,iBACnDxR,KAAK64C,SAAWxuC,MAAMC,KAAKtK,KAAKwR,iBAAiB,eACjDxR,KAAK86C,WAAazwC,MAAMC,KAAKtK,KAAKwR,iBAAiB,0BAEnD,MAAMupC,EAAY15C,SAASC,cAAc,OACzCy5C,EAAUx6C,UAAUgB,IAAI,eAExBvB,KAAKg7C,YAAc35C,SAASC,cAAc,OAC1CtB,KAAKg7C,YAAY1vC,UAAY,4CAC7BtL,KAAKg7C,YAAY12C,QAAO,IAAAsH,MAAK,0BAE7B5L,KAAKi7C,eAAiB55C,SAASC,cAAc,OAC7CtB,KAAKi7C,eAAe3vC,UAAY,mBAEhCyvC,EAAUz2C,OAAOtE,KAAKg7C,YAAah7C,KAAKi7C,gBACxCj7C,KAAKsE,OAAOy2C,GAEZ/6C,KAAKg7C,YAAY36C,iBAAiB,SAAUC,KAC1C,EAAAohB,EAAA,GAAYphB,GAER,eAA4Bo1C,KAC9B,IAAIA,GAAkB,IAAiB/lC,KAAK3P,KAAKkG,aAGrD,EAAAmb,GAAAA,QAAOrhB,KAAKg7C,aAETh7C,KAAKw4C,aACNx4C,KAAKk7C,YAAc75C,SAASC,cAAc,OAC1CtB,KAAKk7C,YAAY36C,UAAUgB,IAAI,qBAAsB,kBACrDvB,KAAKk7C,YAAY52C,QAAO,IAAAsH,MAAK,0BAC7B,EAAAyV,GAAAA,QAAOrhB,KAAKk7C,aAERtF,EAAKgC,cAAc/2C,QACrBb,KAAKi7C,eAAe16C,UAAUgB,IAAI,SAGpC,QAAiBvB,KAAKk7C,aAAc56C,KAClC,EAAAohB,EAAA,GAAYphB,GAKTN,KAAKy4C,eAAe53C,QACrBb,KAAKm7C,UAAUn7C,KAAKy4C,gBAAgB12C,MAAK,KACvC/B,KAAKy4C,eAAe53C,OAAS,EAC7Bb,KAAK66C,WAAW91C,SAAQ0M,IACtBA,EAAGlR,UAAUC,OAAO,uBAM5Bu6C,EAAUz2C,OAAOtE,KAAKk7C,cAOxB,MAAME,IAAYxF,EAAKgC,cAAc/2C,QAAUb,KAAKy3C,UAChD2D,IAAWp7C,KAAKu4C,UAClBv4C,KAAK23C,eAAepV,EAASqT,EAAKgC,eAAe,GAGhDwD,IACDp7C,KAAKq7C,eAAe9Y,IACpB,QAAiBviC,KAAMA,KAAKs7C,eAIhCC,aAAahZ,GACX,GAAGA,EAAQiZ,UAAYjZ,EAAQkZ,kBAAmB,CAChD,MAAMC,EAAar6C,SAASC,cAAc,OAgB1C,GAfAo6C,EAAWn7C,UAAUgB,IAAI,YAAa,aACtCvB,KAAKq5C,QAAQ/0C,OAAOo3C,IAGpB,QAAiBA,GAAap7C,KAC5B,EAAAohB,EAAA,GAAYphB,GAGZo7C,EAAWn7C,UAAUgB,IAAI,UA9Tb,EAACi6C,EAAkBC,EAA0BrD,KAC5DP,IACDC,GAAaD,GAAcE,GAAoBC,IAGjD,MAAMr/B,EAAUtX,SAASC,cAAc,OACvCqX,EAAQpY,UAAUgB,IAAI,aAEtB,MAAMH,EAAYC,SAASC,cAAc,OACzCF,EAAUb,UAAUgB,IAAI,YAAa,SAErC,MAAMo6C,EAASt6C,SAASC,cAAc,OACtCq6C,EAAOp7C,UAAUgB,IAAI,QAErBH,EAAUkD,OAAOq3C,GACjBhjC,EAAQrU,OAAOlD,GAEfu6C,EAAO71C,UAAY,iBAA+B01C,EAAU,CAACI,SAAUH,IACvE,wCAAkD9iC,GAE7CA,EAAQ+1B,WACb/1B,EAAQpY,UAAUgB,IAAI,UAEtBs2C,GAAel/B,EACfo/B,GAAqBK,EACrBJ,GAAsB7qC,OAAOC,YAAW,KACtC0qC,GAAan/B,EAASy/B,EAAQJ,MAC7B,GAAAp7B,mBAAqB,IAAO,MAoSzBi/B,CAAYtZ,EAAQiZ,SAAUjZ,EAAQkZ,mBAAmB,KAEvDC,EAAWn7C,UAAUC,OAAO,gBAI7BR,KAAK04C,SAAU,CAChB,MAAMoD,EAAgBvZ,EAAQA,QAAQlwB,MAAKiR,GAAKA,EAAEtI,OAAO+gC,UACtDD,IAAkBA,EAAc9gC,OAAOghC,QACxCN,EAAWlb,UAMnB8a,aAAah7C,GACX,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,eACzC,IAAIA,EACF,QAGF,EAAAkJ,EAAA,GAAYphB,GACZ,MAAM27C,GAAezjC,EAAOwQ,QAAQ7hB,MACpC,GAAGnH,KAAKw4C,WAAY,CAClBhgC,EAAOjY,UAAUsD,OAAO,cAExB,MAAMq4C,EAAal8C,KAAKy4C,eAAex4B,QAAQg8B,IAC5B,IAAhBC,EACDl8C,KAAKy4C,eAAenyC,OAAO41C,EAAY,GAEvCl8C,KAAKy4C,eAAe3wC,KAAKm0C,QAG3Bj8C,KAAKm7C,UAAU,CAACc,IAUpBd,UAAUgB,GACR,GAAGn8C,KAAKo8C,gBAAiB,OAAOp8C,KAAKo8C,gBAErC,MAAM3xC,EAAUzK,KAAK66C,WAAW/wC,QAAO,CAACR,EAAGnD,IAAQg2C,EAAQ5c,SAASp5B,KAOpE,OANAsE,EAAQ1F,SAAQyT,IACdA,EAAOjY,UAAUgB,IAAI,gBAGvBvB,KAAKO,UAAUgB,IAAI,iBACnBvB,KAAK04C,UAAW,EACT14C,KAAKo8C,gBAAkBvG,GAAA,WAAyB71C,KAAKkG,QAASi2C,GAASp6C,MAAK,KACjF0I,EAAQ1F,SAAQyT,IACdA,EAAOjY,UAAUC,OAAO,gBAG1BR,KAAKO,UAAUC,OAAO,oBACrByN,OAAM,KACPjO,KAAK04C,UAAW,KACfpzB,SAAQ,KACTtlB,KAAKo8C,gBAAkB,QAI3BzE,eAAepV,EAAsBqV,EAAyB9mC,GAAU,G,QAKtE,GAJIjG,EAAA,qCACFiG,GAAU,GAGT9Q,KAAKq4C,UAA0B,QAAf,EAAA9V,EAAQA,eAAO,eAAE1hC,SAAUb,KAAKy3C,UAAW,CAC5Dz3C,KAAK66C,WAAW91C,SAAQ,CAAC0M,EAAItL,KAC3BsL,EAAGlR,UAAUsD,OAAO,eAAgB0+B,EAAQA,QAAQp8B,GAAK6U,OAAO+gC,YAG/D/7C,KAAKu7C,eACNv7C,KAAKu7C,aAAahZ,GAClBviC,KAAKu7C,aAAe,MAGnBv7C,KAAKm6C,eACNS,cAAc56C,KAAKm6C,cACnBn6C,KAAKm6C,aAAe,IAGL,QAAd,EAAAn6C,KAAK25C,iBAAS,eAAE11C,gBACjBjE,KAAK25C,UAAUn5C,SAGjB,MAAM67C,EAASr8C,KAAKq5C,QAAQ9nC,cAAc,cACvC8qC,GACDA,EAAO77C,SAsBX,GAlBGR,KAAKy3C,WACNz3C,KAAKO,UAAUgB,IAAI,cACnB,EAAAyM,EAAA,GAAehO,KAAKs5C,SAAS,IAAA1tC,MAAK,4BAIjC5L,KAAK43C,cAAc/2C,SAAW+2C,EAAc/2C,QAAUb,KAAKy3C,YAC5Dz3C,KAAKs4C,YAAct4C,KAAK43C,cAAc/2C,SAAW+2C,EAAc/2C,OAC/Db,KAAK43C,cAAgBA,EAAch3C,QAEhCZ,KAAKs4C,aACN,QAAiBt4C,KAAMA,KAAKs7C,eAE5B,QAAiBt7C,KAAMA,KAAKs7C,eAK7Bt7C,KAAK43C,cAAc/2C,QAAUb,KAAKs4C,aAAet4C,KAAKy3C,SAAU,CACjE,MAAMl3B,EAAWgiB,EAAQA,QAAQ73B,KAAI/F,GAAK49B,EAAQ0T,aAAetxC,EAAEqxC,OAASzT,EAAQ0T,aAAe,IAAM,IAEzGj2C,KAAKO,UAAUsD,OAAO,iBAAkBiN,GACrCA,IACD,QAAc9Q,KAAM,IAAKA,KAAKs4C,YAAa,MAG7C,UAAQ,KACNt4C,KAAKs8C,WAAWt8C,KAAKs4C,YAAct4C,KAAKugB,SAAWA,EAAUvgB,KAAK43C,cAAe9mC,GACjF9Q,KAAKugB,SAAWA,EAChBvgB,KAAKs4C,aAAc,KAMvB,GAFAt4C,KAAKq7C,eAAe9Y,GAEjBviC,KAAKu4C,SAAU,CACZv4C,KAAKw4C,aACPx4C,KAAKg7C,YAAYz6C,UAAUsD,OAAO,QAAS0+B,EAAQ0T,eAAiBj2C,KAAK43C,cAAc/2C,QACvFb,KAAKi7C,eAAe16C,UAAUsD,OAAO,SAAU7D,KAAK43C,cAAc/2C,SAGpE,IAAIgF,EAAO,IAMV08B,EAAQga,eAAiB,IAA4Bx3C,SAAQ,CAAC6P,EAAQzO,KACrE,MAAM7C,EAAgB,IAAR6C,EAAY,GAAK,iCAAuC,EAANA,SAChEN,GAAQ,kEAAkE+O,EAAOqU,eAAe3lB,yBAElGtD,KAAKu5C,WAAWzzC,UAAYD,EAG9B,GAAG7F,KAAKw4C,WAAY,CAClB,MAAMgE,IAAYx8C,KAAK43C,cAAc/2C,OAE/B47C,EAAkBz8C,KAAKy3C,UAAY+E,EACnCE,GAAsB18C,KAAKu4C,WAAahW,EAAQ0T,eAAkBuG,IAAYx8C,KAAKy3C,SACzFz3C,KAAKk7C,YAAY36C,UAAUsD,OAAO,OAAQ44C,GAC1Cz8C,KAAKg7C,YAAYz6C,UAAUsD,OAAO,OAAQ64C,GAC1C18C,KAAKi7C,eAAe16C,UAAUsD,OAAO,QAAS44C,IAAoBC,IAItEJ,WAAW/7B,EAAoBq3B,EAAyB9mC,GACtD9Q,KAAK64C,SAAS9zC,SAAQ4lB,GAAOA,EAAIrnB,MAAMC,QAAU,KAEjDvD,KAAK66C,WAAW91C,SAAQ,CAAC0M,EAAItL,KAC3BsL,EAAGlR,UAAUsD,OAAO,YAAa+zC,EAAcrY,SAASp5B,OAG1D,MAAMmlB,EAAWtoB,KAAKH,OAAO0d,GAK7B,GAHAvgB,KAAK28C,YAAcp8B,EAAS7V,KAAI4xB,GAAKA,EAAIhR,IAGtCtrB,KAAKs4C,YACNt4C,KAAK64C,SAAS9zC,SAAQ,CAAC4lB,EAAKxkB,KAC1BnG,KAAK84C,gBAAgB3yC,GAAM,UAExB,CACL,MAAMy2C,EAAK,KACT58C,KAAK64C,SAAS9zC,SAAQ,CAAC4lB,EAAKxkB,KAE1BnG,KAAK84C,gBAAgB3yC,EAAK,OAI9B2K,GAAU,SAAQ8rC,GAAMA,IAK1B,IAAIC,EAFJt8B,EAAWA,EAAS3f,QACpBs1C,GAAc31B,GAEd,MAAMu8B,EAAWv3C,IACfgb,EAASxb,SAAQ,CAACwb,EAAUpa,KAC1B,MAAMzF,EAAQm8C,EAAgBt8B,EAAUhb,GACxCvF,KAAK86C,WAAW30C,GAAK6nB,UAAYttB,EAAQ,QAI7C,GAAGV,KAAKs4C,YAGN,GAFAuE,EAAkB,CAACt8B,EAAUpZ,IAAUnE,KAAKE,MAAMqd,EAjnB1C,GAinB6DpZ,GAElE2J,EACD,IAAI,IAAIvL,EAAI,EAAa8xC,EAAI,EAAG9xC,GAAK,IAAKA,IAAK8xC,EAC7CjqC,YAAW,KACT0vC,EAAQv3C,KApnBJw3C,GAqnBO1F,QAGfyF,EAAQ,QAKV,GAFAD,EAAkB,CAACt8B,EAAUpZ,IAAUnE,KAAKE,MAAMqd,EA7nB1C,IA6nB8DpZ,EAAQ,IAE3E2J,EACD,IAAI,IAAIvL,EAAI,EAAGA,EAhoBT,KAgoBsBA,EAC1B6H,YAAW,KACT0vC,EAAQv3C,KAhoBJw3C,GAioBOx3C,QAGfu3C,EAAQE,GAIZ,GAAGh9C,KAAKs4C,YAAa,CAChBxnC,GACD9Q,KAAKO,UAAUgB,IAAI,iBAGrBvB,KAAKO,UAAUC,OAAO,YACtB,MAAMo8C,EAAK,KACT58C,KAAK64C,SAAS9zC,SAAQ4lB,GAAOA,EAAIrnB,MAAMC,QAAU,UAGhDuN,EACD1D,YAAW,KACTpN,KAAKO,UAAUC,OAAO,iBACtBo8C,MAtpBO,KAypBTA,SAGF58C,KAAKO,UAAUgB,IAAI,YAIvB85C,eAAe9Y,GACb,MAAM0a,EAAc1a,EAAQ0T,cAAgB,EAC5C,IAAI9lC,EAAkB3L,EAAO,CAACy4C,GAEZ9sC,EADfnQ,KAAKy3C,SACHz3C,KAAKq4C,OAAc4E,EAAc,uBAAyB,kCAClDA,EAAc,wBAA0B,kCAEhDj9C,KAAKq4C,OAAc4E,EAAc,uBAAyB,4BAClDA,EAAc,wBAA0B,6BAGrD,EAAAjvC,EAAA,GAAehO,KAAKi7C,gBAAgB,IAAArvC,MAAKuE,EAAK3L,IAGhDs0C,gBAAgB3xC,EAAe+1C,GAC7B,MAAMvyB,EAAM3qB,KAAK64C,SAAS1xC,IAEP,IAAhB+1C,GACDvyB,EAAIrnB,MAAMq3C,gBAAkB,GAC5BhwB,EAAIrnB,MAAMo3C,iBAAmB,KAG7B/vB,EAAIrnB,MAAMq3C,gBAAmBuC,EAAal9C,KAAK28C,YAAYx1C,GAAS8wC,GAAYU,WAAc,UAE9FhuB,EAAIrnB,MAAMo3C,iBAAmB,GAAKwC,EAAajF,GAAYW,aA/iBjD,GAAAA,YAAc,KACd,GAAAD,WAAa,EAqjB7B5oB,eAAeC,OAAO,eAAgBioB,I,wZC9pBtC,IAAIkF,GAA0B,EAuBvB,SAASC,IAAU,IAACvlC,EAAG,UAAEzW,EAAS,QAAE8E,EAAO,SAAEmoB,EAAQ,UAAEC,EAAS,SAAE+uB,EAAQ,MAAEC,EAAK,WAAEzsB,EAAU,cAAEpC,EAAa,OAAE8uB,EAAM,MAAErsB,EAAK,YAAEssB,EAAW,iBAAEhvB,EAAgB,aAAED,EAAY,aAAEkvB,EAAY,KAAEv8C,EAAI,cAAEgI,EAAa,aAAE6lB,I,QAoBlN,MAAM2uB,EAAmB3uB,MAAAA,OAAY,EAAZA,EAAc9X,MACvC,IAAI0mC,EAAsC,IAArBD,EACrB,MAAME,IAAgBvvB,GAAYC,GAC5BuvB,GAEW,UAAbhmC,EAAI5X,MACF4X,EAAI3W,MAnDoB,WAoDvB08C,KAEc,QAAb/lC,EAAI5X,KAAiB4K,EAAA,+BAAmCA,EAAA,kCAEhE,IAAIizC,EAAuBC,EAE3B,IAAIR,EAAQ,CACVO,EAAWz8C,SAASC,cAAc,QAClCw8C,EAASv9C,UAAUgB,IAAI,cACvBH,EAAUkD,OAAOw5C,GAEjB,IAAIE,GAAiB,EACL,QAAbnmC,EAAI5X,MACL69C,EAAS9vB,WAAanW,EAAIJ,SAAW,IAAIqO,UAAS,GAE9C23B,GAA6B,UAAb5lC,EAAI5X,OACnB49C,IAAgBF,EACjBG,EAASv9C,UAAUgB,IAAI,QAAS,gBAEhCy8C,GAAiB,KAIrBF,EAAS9vB,UAAY,MAEjB6vB,GAAgBJ,IAClBO,GAAiB,EACjBL,OAAiBp3C,IAIlBy3C,IACDD,EAAW18C,SAASC,cAAc,QAClCy8C,EAASx9C,UAAUgB,IAAI,aAAc,kBAAmB,aAAc,mBACtEH,EAAUkD,OAAOy5C,IAIrB,IAgCIh2B,EAhCAxa,EAGA,GAEJ,GAAqB,cAAlBsK,EAAIomC,UAA2B,CAChC,MAAMC,EAAW9vB,GAAU,CACzB/nB,MAAOwR,EACP3R,QAAAA,EACA9E,UAAAA,EACAitB,SAAAA,EACAC,UAAAA,EACA+uB,SAAAA,EACAC,MAAAA,EACA7uB,cAAAA,EACAoC,WAAAA,EACArC,iBAAAA,EACAD,aAAAA,EACAmvB,iBAAAA,EACAx8C,KAAAA,IAKF,OAFAqM,EAAIohB,MAAQuvB,EACZ3wC,EAAI9L,YAAcy8C,EAAS3vB,aAAaK,KACjCrhB,EAUT,MAAM0J,EAAQ5V,SAASC,cAAc,SAIrC,GAHA2V,EAAM1W,UAAUgB,IAAI,eACpB0V,EAAM/W,aAAa,cAAe,QAClC+W,EAAM4D,OAAQ,EACE,UAAbhD,EAAI5X,KAAkB,CACvB,MAAMk+C,EAAW98C,SAASC,cAAc,OACxC68C,EAAS59C,UAAUgB,IAAI,cAAe,aACtC48C,EAASn1B,QAAQjgB,IAAM,GAAK7C,EAAQ6C,IACpCo1C,EAASn1B,QAAQ7f,OAAS,GAAKjD,EAAQiD,OACtCg1C,EAAiBj4C,QAAUA,EAE5B,MAAMhF,EAAO6pB,EAAA,gBACPqzB,EAAWl9C,EAAKU,MAAQ,EACxBg4C,EAAc,IACdC,EAASuE,EAA0B,EAAdxE,EAC3BuE,EAASr4C,UAAY,qCAAqC5E,EAAKU,kBAAkBV,EAAKU,6IACMg4C,UAAoBwE,UAAiBA,SAAgBvE,sCAGjJ,MAAM3xB,EAASi2B,EAASt0B,kBAAkBA,kBACtCszB,KACFA,GAA0B,EAAIn6C,KAAK+2C,GAAKF,GAE1C3xB,EAAO5kB,MAAMq3C,gBAAkBwC,GAA0B,IAAMA,GAC/Dj1B,EAAO5kB,MAAMo3C,iBAAmB,GAAKyC,GAErCW,EAASv9C,UAAUgB,IAAI,SAEN2E,EAAQ8U,OAAOE,cAE9BijC,EAAS59C,UAAUgB,IAAI,aAGzB,MAAM8B,EAAShC,SAASC,cAAc,UACtC+B,EAAOzB,MAAQyB,EAAOxB,OAASgW,EAAIwD,EAEnC8iC,EAASj6C,QAAQb,EAAQy6C,GACzBK,EAAS75C,OAAO2S,GAChB7V,EAAUkD,OAAO65C,GAEjB,MAAME,EAAMh7C,EAAOqP,WAAW,MAKxBib,EAAS,KACb,MAAMznB,EAA4Bi4C,EAAiBj4C,QAC7Co4C,EAAc,YAAoCp4C,GAAUy3C,GAC5D9xC,EAAQ,MACX,wBAAoCrI,QAAQ2E,WAAWmd,SAAQ,MAC3D,EAAAi5B,GAAA,GAAQD,KAIXA,EAAY1vC,oBAAoB,OAAQ2J,GACxC+lC,EAAY1vC,oBAAoB,aAAcod,GAC9CsyB,EAAY1vC,oBAAoB,QAAS4vC,GACzCF,EAAY1vC,oBAAoB,QAASsK,QAIvCulC,EAAU,KACdJ,EAAIK,UAAUJ,EAAa,EAAG,GAE9B,MAAM9pB,EAAS2oB,GAA0BmB,EAAYhnC,YAAcgnC,EAAY7mC,SAAW0lC,GAG1F,OAFAj1B,EAAO5kB,MAAMo3C,iBAAmB,GAAKlmB,GAE7B8pB,EAAYllC,QAGhBsK,EAAe,KACf46B,EAAY7mC,YAIZ,EAAA8mC,GAAA,GAAQD,IAKTA,EAAYllC,QACbqlC,IAGFX,EAAS9vB,WAAaswB,EAAY7mC,SAAW6mC,EAAYhnC,YAAc,IAAIwO,UAAS,IARlFja,MAWEmgB,EAAsB/E,GAAgBvD,GAEtCnL,EAAS,KACbtB,EAAM1W,UAAUgB,IAAI,QACpB48C,EAAS59C,UAAUC,OAAO,cAC1B,SAAci+C,EAASp7C,GAEpB0kB,GAAaA,EAAUA,WAAaA,EAAUA,UAAUxnB,UAAUmT,SAAS,WAC5EqU,EAAU7G,WAIRs9B,EAAW,MACX,EAAAD,GAAA,GAAQD,GAKZH,EAAS59C,UAAUgB,IAAI,aAJrBsK,KAOEqN,EAAU,KACdjC,EAAM1W,UAAUC,OAAO,QACvB29C,EAAS59C,UAAUgB,IAAI,aAEvB0V,EAAMK,YAAc,EACpBwmC,EAAS9vB,WAAa,GAAKswB,EAAY7mC,UAAUqO,UAAS,GAEvDw4B,EAAYhnC,cACbgnC,EAAYhnC,YAAc,IAI9BgnC,EAAYj+C,iBAAiB,OAAQkY,GACrC+lC,EAAYj+C,iBAAiB,aAAc2rB,GAC3CsyB,EAAYj+C,iBAAiB,QAASm+C,GACtCF,EAAYj+C,iBAAiB,QAAS6Y,IAEtC,QAAiB7V,GAAS/C,IAaxB,IAZA,EAAAohB,EAAA,GAAYphB,GAGTynB,IAAcA,EAAU42B,UACzB52B,EAAU7G,UAQTo9B,EAAYllC,OAAQ,CACrB,MAAM6U,IAAqB/kB,EAC3B,GAAG,oBAA4CA,GAAiB,CAC9DC,OAAQ,MACRE,YAAa,CAACC,EAAG,4BACjB4B,WAAW,IACT,CACF,MAAOkS,EAAMzW,GAASsnB,EAAwB3F,GAAiB61B,GAAtB,GACzC,cAAsC,CAACh1C,OAAQjD,EAAQiD,OAAQJ,IAAK7C,EAAQ6C,KAAMqU,EAAMzW,GAG1F23C,EAAY57C,YAEZ47C,EAAYj8C,WAIbi8C,EAAYllC,OACVklC,EAAY7mC,UAAY6mC,EAAYhnC,cAAgBgnC,EAAY7mC,UAAY6mC,EAAYhnC,YAAc,GACvGmnC,IACA/6B,IACAzM,EAAM1W,UAAUgB,IAAI,SAEpBi9C,IAGFjmC,KAIDrS,EAAQ8U,OAAO0O,aACfy0B,EAAiBxwB,OAASA,EAC3BwwB,EAASn1B,QAAQS,WAAa,KAE9BkE,SAGF1W,EAAMtV,UAAW,EAGnB,IAAIu8C,EACJ,GAAGh4C,EAAS,CAmBV,GAlBAg4C,EAAW9vB,GAAU,CACnB/nB,MAAOwR,EACP3R,QAAAA,EACA9E,UAAAA,EACAitB,SAAAA,EACAC,UAAAA,EACA+uB,SAAAA,EACAC,MAAAA,EACA7uB,cAAAA,EACAoC,WAAAA,EACArC,kBAAkB,EAClBD,aAAAA,EACAmvB,iBAAkB3uB,MAAAA,OAAY,EAAZA,EAAc1oB,MAChCnF,KAAAA,IAGFqM,EAAIohB,MAAQuvB,GAEPL,GAA4B,QAAbhmC,EAAI5X,MAAmBu9C,EAEzC,OADAjwC,EAAI9L,YAAcy8C,EAAS3vB,aAAaK,KACjCrhB,EAGT,GAAG8vC,EAAU,CACX,MAAMuB,GAAiBV,EAASxvB,OAAOC,OAASuvB,EAASxvB,OAAOE,MAAM3qB,cACtEgT,EAAMrV,OAASg9C,EAAcC,eAAe,KAAM,SAClD5nC,EAAMpV,QAAU+8C,EAAcC,eAAe,KAAM,UACnDD,EAAct6C,OAAO2S,QAElB,CACL,MAAM6nC,EAAWhnC,EAAA,WAAwBD,GAAK,GAC3CinC,GACDA,EAASz2C,QAAQtG,MAAK,KACpBkV,EAAM8nC,OAASD,EAAS5mC,aAAaG,QAKvCpB,EAAMhT,eAAiB7C,KACxB88C,MAAAA,OAAQ,EAARA,EAAUc,WAAY59C,GAAWkD,OAAO2S,GAG3C,MAAMiB,EAAeC,GAAA,kBAAmCN,GAElDonC,KAAoC,QAAvB,EAAC/4C,MAAAA,OAAO,EAAPA,EAASoQ,aAAa,eAAEyR,WACzCk3B,GACDl3B,EAAa7hB,EAAQoQ,MAAcyR,UACnCA,EAAU+G,OAAO1tB,GAAW,GAC5Bu8C,OAAiBp3C,GACR2R,EAAagnC,YAAernC,EAAIG,mBAAsBwW,EAIvD3W,EAAIG,oBACZ+P,EAAY,IAAI,KAAqB,CACnCC,YAAY,EACZm3B,aAAc,aANhBp3B,EAAY,IAAI,KAAqB,CACnCo3B,aAAc,YASlB,MAAMC,GAAiB,UACvBnoC,EAAM5W,iBAAiB,SAAUC,IACP,IAArB2W,EAAMlJ,MAAMmY,MACbpY,QAAQC,MAAM,SAAWkJ,EAAMlJ,MAAMmY,KAAO,cAAgBjP,EAAMlJ,MAAM7H,SAGvE6hB,IAAck3B,GACfl3B,EAAUs3B,SAGRD,EAAeE,aACjBF,EAAej3C,YAEhB,CAACgT,MAAM,KAEV,SAAYlE,GAAOlV,MAAK,KACnBmvB,GACDquB,EAAA,eAAkCtoC,EAAOia,GAGxCnJ,IAAck3B,GACfl3B,EAAUs3B,SAGZD,EAAej3C,aAGD,UAAb0P,EAAI5X,OACLgX,EAAM5W,iBAAiB,cAAc,KACnCy9C,EAAS9vB,WAAa/W,EAAMQ,SAAWR,EAAMK,YAAc,IAAIwO,UAAS,MAGvEi4B,GACD9mC,EAAM5W,iBAAiB,cAAc,KACnC09C,EAASv9C,WACR,CAAC2a,MAAM,KAIdlE,EAAM4D,OAAQ,EACd5D,EAAMvV,MAAO,EAEbuV,EAAMtV,UAAW,EAEjB,IAAI69C,EAAqB7B,IAAqC,QAAnB,EAAAO,MAAAA,OAAQ,EAARA,EAAUn2B,iBAAS,eAAE03B,UAChE,MAAMj+C,EAAO,KACRumB,GAAa41B,IAAmBnvB,IACjCzG,EAAUE,YACVF,EAAU23B,aAGZ,IAAIj+C,EAA4B+B,QAAQ2E,UACxC,GAAI4f,IAAck3B,GAAazwB,EAC7B,GAAItW,EAAagnC,YAAernC,EAAIG,kBAK1BH,EAAIG,oBACT2lC,EACDl8C,EAAc+B,QAAQgsB,UACbtX,EAAagnC,YAAcn3B,IACpCA,EAAU+G,OAAO1tB,GAAW,EAAO,MACnC6V,EAAM5W,iBAAiB,GAAA6V,UAAY,aAAe,WAAW,KAC3D6R,EAAUs3B,WACT,CAAClkC,MAAM,UAZyC,CACrD,MAAM9S,EAAU5G,EAAcqW,EAAA,cAA2BD,EAAK4W,MAAAA,OAAa,EAAbA,EAAekxB,QAAShC,GACnF51B,GACDA,EAAU+G,OAAO1tB,GAAW,EAAOiH,GAkCzC,OApBIs1C,GAAkB6B,IACpBA,IACAA,EAAqB,MAGvB7B,OAAiBp3C,EAEjB9E,EAAYM,MAAK,MACZ8uB,GAAeA,KAKF,UAAbhZ,EAAI5X,MACL,8BAAsDiG,EAAQiD,OAAQjD,EAAQ6C,IAAK7C,EAAQ8U,OAAOC,eAGpG,EAAA2kC,GAAA,IAAmB3oC,EAAOiB,EAAaG,MARrC+mC,EAAej3C,aAShB,SAEI,CAACunB,SAAUjuB,EAAa8nB,OAAQ61B,IAmCzC,OAhCGr3B,IAAck3B,GACfl3B,EAAU4H,oBAAoBnuB,GAqBhB,QAAbqW,EAAI5X,MAAmB49C,EAOxBtwC,EAAI9L,YAAegtB,GAAiCA,EAAc3mB,KAAK,CAACmpB,IAAK7vB,EAAWI,KAAM,IAAMA,IAAO+nB,SAAU/lB,QAAQ2E,WAA1F3G,IAAO+nB,QAN1C,QAAiBnoB,GAAYd,KAC3B,EAAAohB,EAAA,GAAYphB,GACZy9C,EAASv9C,SACTgB,MACC,CAACouB,SAAS,EAAMzU,MAAM,IAKpB5N,EAYF,SAASsyC,IAAa,QAAC35C,EAAO,SAAEkjB,EAAQ,WAAE6D,EAAU,aAAE5D,EAAY,WAAEC,EAAU,cAAEpgB,EAAa,aAAEqlB,EAAY,iBAAEmvB,EAAgB,cAAEjvB,I,QAWhIxB,IAAYA,EAAa,KAC7B,MAAM0wB,EAAsC,IAArBD,EAEjB7lC,EAAO3R,EAAQoQ,MAAMjV,UAAY6E,EAAQoQ,MAAMya,QAAQ1vB,SACvDsoB,EAAYzjB,EAAQ8U,OAAO0O,cAA4B,QAAb,EAAAxjB,EAAQoQ,aAAK,eAAEyR,WAC/D,GAAgB,UAAblQ,EAAI5X,MAAiC,UAAb4X,EAAI5X,MAAiC,UAAb4X,EAAI5X,KAAkB,CACvE,MAAM6/C,EAAe,IAAI52B,GAczB,OAbA42B,EAAa12B,SAAWA,EACxB02B,EAAa55C,QAAUA,EACvB45C,EAAanC,eAAiBA,EAC9BmC,EAAarxB,cAAgBA,EAC7BqxB,EAAavxB,aAAeA,EAEzBlF,IAAcy2B,EAAaz2B,aAAeA,GAC1CngB,IAAe42C,EAAa52C,cAAgBA,GAC5CogB,IAAYw2B,EAAax2B,WAAaA,GACtCK,IAAWm2B,EAAa/3B,UAAY7hB,EAAQoQ,MAAMyR,WAErD+3B,EAAa92B,QAAQiE,WAAa,GAAKA,EACvC6yB,EAAav2B,SACNu2B,EAGT,IAAIC,EAAcloC,EAAI4E,UAAY5E,EAAI4E,UAAUujC,MAAM,KAAO,GACzDC,EAAM,GACVA,EAAMF,EAAYl/C,OAAS,GAAKwJ,MAAM61C,QAAQH,IAC5C,SAAqBA,EAAYl4C,MAAMm4C,MAAM,IAAK,GAAG,GAAGG,eACxD,OAEF,IAAIC,EAAS/+C,SAASC,cAAc,OACpC8+C,EAAO7/C,UAAUgB,IAAI,WAAY,OAAO0+C,KACxCG,EAAOp3B,QAAQjR,MAAQ,GAAKF,EAAIhH,GAEhC,MAAMwvC,EAASh/C,SAASC,cAAc,OACtC++C,EAAO9/C,UAAUgB,IAAI,gBAErB,MAAM2W,EAAeC,GAAA,kBAAmCN,GACxD,IAAc,QAAV,EAAAA,EAAIiE,cAAM,eAAEjb,SAAWqF,EAAQ8U,OAAO0O,aAAexR,EAAaG,KAAoB,UAAbR,EAAI5X,KAA2D,CAC1ImgD,EAAO7/C,UAAUgB,IAAI,uBAErB,IAAI2sB,EAA2B,GAC/B,GAAGhoB,EAAQ8U,OAAO0O,YAChB22B,EAAOv6C,UAAY,aAAaoS,EAAaG,QAC7C6V,EAAKpmB,KAAKu4C,EAAOx2B,uBACZ,CACL,MAAMsE,EAAUC,GAAU,CACxB/nB,MAAOwR,EACP3R,QAAS,KACT9E,UAAWi/C,EACXhyB,SAAU,GACVC,UAAW,GACXC,aAAAA,EACAC,kBAAkB,EAClBC,cAAAA,EACAvtB,KAAMgb,EAAA,kBAAiCrE,EAAK,GAAI,IAAI,KAEtDwoC,EAAO/8C,MAAM1B,MAAQy+C,EAAO/8C,MAAMzB,OAAS,GACxCssB,EAAQO,OAAOC,OAAOT,EAAKpmB,KAAKqmB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAKpmB,KAAKqmB,EAAQO,OAAOE,MAGnDV,EAAKnpB,SAAQ8pB,GAAOA,EAAItuB,UAAUgB,IAAI,yBAEtC8+C,EAAOryB,UAAYiyB,EAIrB,IAAI9yB,EAAWtV,EAAIsV,UAAY,eACT9rB,SAASC,cAAc,OAC/Bf,UAAUgB,IAAI,wBAC5B,MAAM++C,EAAgE,CAAC/4B,GAAY1P,EAAI3W,OAEpFkoB,GACDk3B,EAAiBx4C,MAAK,SAAmB5B,EAAQ2mB,OAGhDvD,GACDg3B,EAAiBx4C,KAAKmB,EAAA,mBAAoC/C,IAG5Dk6C,EAAOt6C,UAAY,OACjBoS,EAAagnC,aAAev1B,EAAY,GAAK,wHAK/C,MAAM42B,EAAUH,EAAO7uC,cAAc,kBAC/Byb,EAAmB,IAAI,KAe7B,GAdAA,EAAiBhE,QAAQiE,WAAa,GAAKA,EAC3CD,EAAiBlnB,UAAYqnB,EAE7BozB,EAAQj8C,OAAO0oB,GAEZ1D,GACDi3B,EAAQj8C,OAAO2E,EAAA,eAAgC/C,IAGjCk6C,EAAO7uC,cAAc,kBAC7BjN,WAAU,IAAAwoB,kBAAiBwzB,EAAkB,QAErDF,EAAOl8C,QAAQm8C,IAEX12B,GAAazjB,EAAQ8U,OAAO0O,YAC9B,OAAO02B,EAGT,IAAIt2B,EAA0B/B,EAAkC,KAChE,MAAM4F,EAAS,KACb,GAAG7D,EAAa,CACdA,EAAYvpB,UAAUgB,IAAI,cAC1B,MAAMi/C,EAAe12B,EACrB1c,YAAW,KACTozC,EAAahgD,WACZ,KACHspB,EAAc,KAGb/B,IACDA,EAAY,OAIVvmB,EAAQlB,I,MACZ,MAAMmgD,GAAQngD,GAAKA,EAAE6Y,UACftB,EAAMC,EAAA,SAAsBsoC,EAAOp3B,QAAQjR,OACjD,IAAI2X,EACJ,MAAMiwB,EAAU,gBAA4B,2CAAkDp5C,EAC9F,GAAIk6C,EAEG,GAAgB,QAAb5oC,EAAI5X,KAAgB,CAC5B,MAAMygD,EAAe5oC,EAAA,kBAA+BD,EAAIhH,KAAOqH,EAAagnC,WAC5ExvB,EAAW5X,EAAA,cAA2BD,EAAK8nC,GACxCe,GACDhxB,EAAS3tB,MAAK,KACZqL,YAAW,KACT,MAAMiL,EAAMF,GAAA,kBAAmCN,GAAKQ,IACpDlL,OAAOwC,KAAK0I,KACXxN,EAAA,mCAAuC,IAAM,WAIpD6kB,EADQ,MAA+B7X,EAAIomC,aAAwB,QAAV,EAAApmC,EAAIiE,cAAM,eAAEjb,QAC1DiX,EAAA,cAA2BD,EAAK8nC,GAEhC7nC,EAAA,cAA2BD,EAAK8nC,QAf3CjwB,EAAW5X,EAAA,cAA2BD,EAAK8nC,GAuB7C,OALG71B,IACD4F,EAAS3tB,KAAK4rB,GACd5F,EAAU+G,OAAOhF,GAAa,EAAM4F,IAG/B,CAACA,SAAAA,IAoCV,OAjCG5X,EAAA,kBAA+BD,EAAIhH,KACpCiZ,EAAcs2B,EAAO7uC,cAAc,sBACnCwW,EAAY,IAAI,KAChBA,EAAU+G,OAAOhF,GAAa,EAAOhS,EAAA,kBAA+BD,EAAIhH,MAC/DqH,EAAagnC,aAAcv1B,IACpCG,EAAcs2B,EAAO7uC,cAAc,sBACnCwW,EAAY7hB,EAAQoQ,MAAMyR,UAEtBA,GAYFA,EAAU+G,OAAOhF,GACjB5jB,EAAQoQ,MAAMjO,QAAQtG,KAAK4rB,KAZ3B5F,EAAY,IAAI,KAEhBA,EAAUE,YACVF,EAAU23B,YACV33B,EAAU+G,OAAOhF,GACjB/B,EAAU4H,oBAAoBnuB,QAEN+E,IAArBm3C,GAAkCA,GAAoB7lC,EAAI3W,OAC3D,QAAmB6mB,EAAUA,cAQnC,QAAiBq4B,GAAS9/C,IACrBynB,EACDA,EAAU7G,QAAQ5gB,GAElBkB,EAAKlB,MAIF8/C,EA8DF,SAAShyB,IAAU,MAAC/nB,EAAK,QAAEH,EAAO,UAAE9E,EAAS,SAAEitB,EAAQ,UAAEC,EAAS,SAAE+uB,EAAQ,MAAEC,EAAK,cAAE7uB,EAAa,WAAEoC,EAAU,KAAE3vB,EAAI,iBAAEstB,EAAgB,aAAED,EAAY,iBAAEmvB,EAAgB,OAAEtsB,EAAM,QAAEuvB,EAAO,SAAEC,EAAQ,UAAEC,I,MAmBxM,IAAMx6C,EAAkB2V,QAAU3V,EAAqByV,OAKrD,OAJGuS,GAAYC,IAAcptB,GAAoB,aAAZmF,EAAMiD,GACzC4S,EAAA,oBAAmC7V,EAAOjF,EAAWitB,EAAUC,OAAW/nB,EAAWL,GAGhF,CACLqoB,aAAc,CACZI,MAAOnrB,QAAQ2E,UACfymB,KAAMprB,QAAQ2E,WAEhBumB,OAAQ,CACNC,MAAO,KACPC,KAAM,MAER7G,UAAW,KACXi3B,SAAU,MAId,IAAIrB,EAAsC,IAArBD,EAEjBx8C,SACcqF,IAAb8nB,IAAwBA,EAAWtD,EAAA,8BACrBxkB,IAAd+nB,IAAyBA,EAAYvD,EAAA,2BAG1C3pB,EAAUb,UAAUgB,IAAI,mBACxB,IAIIu/C,EACAC,EACA7oC,EANA8mC,EAAW59C,EAEX4/C,GAAQ,EACRC,EAAiCz9C,QAAQ2E,UAI7C,MAAM+4C,EAAoB,aAAZ76C,EAAMiD,GAAwC,cAApBjD,EAAM43C,YAA8B/8C,EAM1E,GAFA6/C,EAAQ,IAAI1T,MAEThf,GAAYC,IAAcptB,EAAM,CACjC,MAAM+D,EAAMiX,EAAA,oBAAmC7V,EAAOjF,EAAWitB,EAAUC,OAAW/nB,EAAWL,OAASK,EAAW26C,EAAQ,CAC3H53C,EAAG,YACH+R,EAAGhV,EAAMgV,EACTY,EAAG5V,EAAM4V,EACT/a,KAAMmF,EAAMnF,KACZjB,KAAM,aACJsG,GAKJ,GAJArF,EAAO+D,EAAIk8C,UACXH,EAAQ/7C,EAAI+7C,MACZ9oC,EAAeC,GAAA,kBAAmC9R,EAAOnF,EAAKjB,OAE1D+gD,EAAO,CACThC,EAAW39C,SAASC,cAAc,OAClC09C,EAASz+C,UAAUgB,IAAI,4BACvBy9C,EAAS17C,MAAM1B,MAAQqD,EAAI/D,KAAKU,MAAQ,KACxCo9C,EAAS17C,MAAMzB,OAASoD,EAAI/D,KAAKW,OAAS,KAE1C,MAAMi9C,EAAW5iC,EAAA,2BAA0C7V,EAAO6R,GAAekZ,GAAQ,GACzF,GAAG0tB,EAAU,CACXmC,EAAmBnC,EAASr9C,YAC5B,MAAMq/C,EAAahC,EAASiC,MAC5BD,EAAWvgD,UAAUgB,IAAI,eACzBH,EAAUkD,OAAOw8C,QAEL1yB,GAAU,CACpBhtB,UAAAA,EACA8E,QAAAA,EACAG,MAAAA,EACAgoB,SAAU,EACVC,UAAW,EACXptB,KAAAA,EACAutB,cAAAA,EACA6uB,MAAAA,EACA/uB,aAAAA,EACAsC,WAAAA,EACArC,iBAAAA,EACA6uB,SAAAA,EACAK,iBAAAA,EACAtsB,OAAAA,EACAuvB,SAAS,EACTE,WAAW,IAGUnyB,OAAOE,KACnBruB,UAAUgB,IAAI,cAAe,aAI1CH,EAAUb,UAAUgB,IAAI,0BACxBH,EAAUkD,OAAO06C,SAGf99C,IACFA,EAAOgb,EAAA,kBAAiC7V,EAAOgoB,EAAUC,GAAW,IAGtEpW,EAAeC,GAAA,kBAAmC9R,EAAOnF,MAAAA,OAAI,EAAJA,EAAMjB,MAGjE,IAAI0gD,EAAS,CACX,MAAM7B,EAAW5iC,EAAA,2BAA0C7V,EAAO6R,GAAekZ,GAC9E0tB,IACDmC,EAAmBz9C,QAAQC,IAAI,CAACw9C,EAAkBnC,EAASr9C,cAC3Dq/C,EAAahC,EAASiC,MACtBD,EAAWvgD,UAAUgB,IAAI,eACzBy9C,EAAS16C,OAAOw8C,IAKtBC,EAAMxgD,UAAUgB,IAAI,eAIpB,MAAM6/C,GAAcN,IAAe5oC,EAAagnC,aAAer0C,EAAA,qCAAyC+1C,EAExG,IAAI74B,GACa,QAAd,EAAA7hB,MAAAA,OAAO,EAAPA,EAASoQ,aAAK,eAAEyR,aAAcyG,GAC/BzG,EAAY7hB,EAAQoQ,MAAMyR,UAC1BA,EAAU+G,OAAO1tB,GACjBu8C,OAAiBp3C,GACR2R,EAAagnC,aACtBn3B,EAAY,IAAI,KAAqB,CACnCo3B,aAAc,aAIlB,MAQMkC,EAAgBhpC,GACbipC,GAAsBlgD,EAAW2/C,EAAO1oC,EAAK+oC,EAAYpC,EAAU8B,GAGtEnzB,EAAS,IACVkD,IAAeA,IAAqBrtB,QAAQ2E,UAE5C04C,GACM,QAAK3oC,EAAaG,IAAK,IAAItW,MAAKsW,GAC9BgpC,EAAahpC,KAIjBgpC,EAAanpC,EAAaG,KAGnC,IAAI5W,EACJ,MAAM8/C,EACHrgD,EAA6Bma,GAAK,KAClCna,EAA6B+a,GAAK,KAC9B0hC,EACDn8C,EAAO,KACRm8C,IAAmBnvB,GAAoBzG,IACxCA,EAAUE,YACVF,EAAU23B,aAGZ,MAAMr3C,EAlCU64C,IAAUhgD,EACxB4W,EAAA,cAA2BzR,EAAwBooB,MAAAA,OAAa,EAAbA,EAAekxB,SAClEzjC,EAAA,eAA8B7V,EAAOnF,EAAMutB,MAAAA,OAAa,EAAbA,EAAekxB,QAAShC,GAkClE51B,IACA7P,EAAagnC,aACb1wB,GACD+yB,GAEAx5B,EAAU+G,OAAO1tB,GAAW,EAAOiH,GAGrCs1C,OAAiBp3C,EAEjB,MAAMi7C,EAAgBn5C,EAAQtG,KAAK4rB,GAEnC,OADA6zB,EAAcvzC,OAAM,SACb,CAACyhB,SAAUrnB,EAASkhB,OAAQi4B,IAsBrC,OAnBGz5B,GACDA,EAAU4H,oBAAoBnuB,GAG7B0W,EAAagnC,WACd+B,EAAmBx/C,EAAcD,IAAO+nB,OAEpCkF,EAKMA,EAAc3mB,KAAK,CAACmpB,IAAK7vB,EAAWI,KAAM,IAAMA,IAAOkuB,WAL9CjuB,EAAcD,IAAO+nB,OAQvCgF,GAAgB0yB,GACjB1yB,EAAazmB,KAAKm5C,GAGb,CACL1yB,aAAc,CACZI,MAAOsyB,EACPryB,KAAMntB,GAAe+B,QAAQ2E,WAE/BumB,OAAQ,CACNC,MAAOmyB,EACPlyB,KAAMmyB,GAERh5B,UAAAA,EACAi3B,SAAAA,GAIG,SAASsC,GAAsBlgD,EACpC2/C,EACA1oC,EACA+oC,EACApC,EAAW59C,EACX0/C,GAMA,OAJGM,GACDL,EAAMxgD,UAAUgB,IAAI,WAGf,IAAIiC,SAAe2E,KAMxB,EAAAy3C,GAAA,IAAmBmB,EAAO1oC,GAAK,KAC7BopC,GAAA,gBAA4BrgD,GAAW,KACrC49C,EAAS16C,OAAOy8C,IAEhB,UAAQ,KACN54C,OAGCi5C,GACDL,EAAM1gD,iBAAiB,gBAAgB,KACrCohD,GAAA,UAAqB,KACnBV,EAAMxgD,UAAUC,OAAO,WAEpBsgD,GACDA,EAAWtgD,cAGd,CAAC2a,MAAM,aA4Db,SAASumC,IAAqB,KACnCxgD,EAAI,IACJ2W,EAAG,WACHgZ,EAAU,OACVrY,EAAM,KACNmpC,EAAI,UACJC,EAAS,KACTl/C,IAUA,MAAMm/C,EAAexgD,SAASC,cAAc,OAC5CugD,EAAathD,UAAUgB,IAAI,mBAG3BsgD,EAAav+C,MAAM1B,MAAQV,EAAO,KAClC2gD,EAAav+C,MAAMzB,OAASX,EAAO,KAEnC,MAAM4gD,EAAiB9wB,GAAY,CACjCC,IAAK4wB,EACLhqC,IAAAA,EACAgZ,WAAAA,EACAkxB,WAAW,EACXX,YAAY,EACZ1/C,MAAM,EACNE,MAAOV,EACPW,OAAQX,EACRwB,KAAAA,EACAwuB,MAAO,OACP0wB,UAAAA,IACC7/C,MAAKE,KACN,EAAA+/C,GAAA,GAA0B//C,GAC1BA,EAAU5B,iBAAiB,cAAe4hD,IACrCA,IAAYhgD,EAAUigD,WACvBjgD,EAAUzB,SACVqhD,EAAarhD,SACb,yDAAmE,SAAUimC,OAI9E,MACDxkC,EAAU5B,iBAAiB,cAAc,KACvC6U,UAAUitC,QAAQ,OACjB,CAAChnC,MAAM,IAGLlZ,KAGHmgD,EAAwBv/C,IAC5B,MAAMygB,EAAItgB,KAAKg6B,SAAWn6B,EAAM,EAChC,OAAOygB,EAAIzgB,GAAOygB,EAAIzgB,EAAMygB,GAGxB++B,EAAgBD,EAAqB,IACrCE,EAAgBF,EAAqB,GACrCG,EAAgBrhD,EAAO,GAAc,UAATygD,EAAmB,GAAK,GACpDa,EAAc,KAClB,KAAI,EAAAjE,GAAA,GAAQ/lC,GACV,OAGF,MAAMgH,EAAOhH,EAAOiH,wBASdxB,GAHiB,UAAT0jC,EAAmBniC,EAAKgvB,MAAQhvB,EAAKqB,OAEvB,WAAT8gC,GAAqBniC,EAAK5d,MAAQV,GAAQ,GAAc,UAATygD,GAAoBzgD,EAAO,GAAKqhD,EAAgBF,GAG5GlkC,EAAIqB,EAAKoZ,KAAQpZ,EAAK3d,OAASX,GAAQ,GAAe,WAATygD,EAAoB,EAAIW,GAE3ET,EAAav+C,MAAMs1B,IAAMza,EAAI,KAC7B0jC,EAAav+C,MAAMud,KAAO5C,EAAI,MAG1BwoB,EAAWxf,GAAgBu7B,GAQjC,OANA,sDAAgE,SAAU/b,GAE1E+b,IAEA,kCAA4CX,GAErC,CAACA,aAAAA,EAAcC,eAAAA,GAGjB,SAAS9wB,IAAY,IAACnZ,EAAG,IAAEoZ,EAAG,WAAEJ,EAAU,cAAEpC,EAAa,MAAEyC,EAAK,KAAExuB,EAAI,UAAE+/C,EAAS,MAAEC,EAAK,MAAE9gD,EAAK,OAAEC,EAAM,UAAEkgD,EAAS,KAAErgD,EAAI,aAAE6sB,EAAY,WAAE6yB,EAAU,YAAEuB,EAAW,UAAEf,EAAWztB,OAAQyuB,I,MAmBzL,MAAMC,EAAchrC,EAAIirC,QAkBxB,GAjBmB,IAAhBD,IACDD,GAAW,GAGThhD,IACFA,EAAS8gD,OAAcn8C,EAAN,KAGf1E,IACFA,EAAU6gD,OAAcn8C,EAAN,KAGD,IAAhBs8C,GAED,0BAGEA,EAEF,MADA/0C,QAAQC,MAAM,6BAA8B8J,GACtC,IAAI0X,MAAM,8BAoClB,IAAIrX,EACJ,GAlCA+Y,EAAIjI,QAAQjR,MAAQ,GAAKF,EAAIhH,GAC7BogB,EAAI1wB,UAAUgB,IAAI,yBAiCfqhD,GAA4B,IAAhBC,EAAmB,CAChC,MAAMl0B,EAAQzS,EAAA,kBAAiCrE,EAAKjW,EAAOC,GAAQ,GACnEqW,EAAeC,GAAA,kBAAmCN,EAAK8W,EAAM1uB,WAE7DiY,EAAeC,GAAA,kBAAmCN,GAGpD,MAAMkrC,EAAYL,GAAQ,SAAkBA,IAAU,EAChDxD,EAAahnC,EAAagnC,aAAekC,EAEzC4B,GAAcJ,IAA6B,IAAhBC,GAAqC,IAAhBA,GAChDI,EAAuBD,EAE7B,IAAI/B,GAAmB,UACnBiC,GAAkB,EACtB,KACc,QAAV,EAAArrC,EAAIiE,cAAM,eAAEjb,SACZgX,EAAIsrC,uBAELlyB,EAAIpH,qBACFq1B,GACD+D,GACAR,KACiB,IAAdV,EACL,CACA,IAIIjB,EAJAnyB,EAAQ9W,EAAIsrC,qBAAuBtrC,EAAIsrC,oBAAoBJ,IAAclrC,EAAIiE,OAAO,GAKxF,MAAMsnC,EAAc,KACdnyB,EAAIllB,oBACN+0C,EAAWvgD,UAAUgB,IAAI,gBAAiB,aAE1CkgD,GAAA,gBAA4BxwB,GAAK,KAC/BA,EAAI3sB,OAAOw8C,GACXG,EAAiB94C,eAKvB,GAAG,QAASwmB,EACVmyB,EAAa,IAAIzT,OACjB,EAAAuS,GAAA,IAAmBkB,EAAYnyB,EAAMtW,IAAK+qC,GAC1CF,GAAkB,OACb,GAAG,UAAWv0B,EAAO,CAC1B,GAAe,kBAAZA,EAAMrlB,EACP,GAAGqlB,EAAM5S,MAAMlb,OAAQ,CACrB,MAAM+gC,EAAI1lB,EAAA,2BAA0CyS,GACpDsC,EAAInrB,UAAY,gKAAgK+R,EAAIwD,GAAK,OAAOxD,EAAIoE,GAAK,oDAC5L2lB,8BAGbjT,EAAQ9W,EAAIiE,OAAOzJ,MAAKC,IAAI,MAAC,OAAwC,QAAxC,EAACA,EAAkCyJ,aAAK,eAAElb,WAAW8tB,EAInFA,GAAqB,kBAAZA,EAAMrlB,GAAyBy5C,GAAa,IACtDjC,EAAa,IAAIzT,MAEb,MAAqBx1B,EAAImD,OAAOqoC,uBAAyBnrC,EAAaG,MACxE,EAAAunC,GAAA,IAAmBkB,EAAY5kC,EAAA,yBAAwCrE,EAAK8W,GAAsC,GAAOy0B,GACzHF,GAAkB,GAElBI,GAAA,UAA6B,GAAKzrC,EAAIhH,GAAK8d,EAAsC5S,OAAqBha,MAAKga,IACxG4S,EAAsC5S,MAAQA,EAC/ClE,EAAImD,OAAOqoC,uBAAwB,EAEhCxyB,IAAeA,KAEdI,EAAIllB,oBACN,EAAA6zC,GAAA,IAAmBkB,EAAY5kC,EAAA,yBAAwCrE,EAAK8W,GAAsC,GAAOy0B,MAE1Hn1C,OAAM,eAGR,IAAqB,IAAhB40C,GAAqBE,GAAa,GAAsB,IAAhBF,KAAuBd,GAAaU,GAAY,CAClG3B,EAAa,IAAIzT,MAEjB,MAAM7rC,EAAO,KACX,GAAGyvB,EAAIllB,mBAAsB8kB,IAAeA,IAAe,OAE3D,MAAMvN,EAAI,KACL2N,EAAIllB,mBAAsB8kB,IAAeA,MAC5C,EAAA+uB,GAAA,IAAmBkB,EAAY5oC,EAAaG,IAAK+qC,IAGnD,OAAGlrC,EAAaG,KACdiL,IACO9f,QAAQ2E,WAER2P,EAAA,cAA2BD,EAAK8W,GAAsCtmB,QAAQtG,KAAKuhB,IAI9F,GAAGmL,GAAiBg0B,EAElB,OADAh0B,EAAc3mB,KAAK,CAACmpB,IAAAA,EAAKzvB,KAAAA,IAClBgC,QAAQ2E,UAEf3G,IAEImtB,EAActW,MAChB6qC,GAAkB,IAU1B,GAJG30B,GAAgB20B,GACjB30B,EAAazmB,KAAKm5C,GAGjBwB,EACD,OAAOj/C,QAAQ2E,UAGjB,MAAM3G,EAAO,IAAW,mCACtB,IAAGqvB,GAAeA,IAAlB,CAEA,GAAmB,IAAhBgyB,IAAsBD,EAYvB,aAAa9qC,EAAA,cAA2BD,EAAsB4W,MAAAA,OAAa,EAAbA,EAAekxB,SAC5E59C,MAAWwhD,GAAS,mCAGnB,GAAG1yB,IAAeA,IAChB,MAAM,IAAItB,MAAM,4BAGlB,IAAIttB,QAAkB,yBAAiC,CACrDb,UAAW6vB,EACXvvB,KAAMA,IAASghD,EACf/gD,SAAUe,EACV8gD,cAAeD,EACf3hD,MAAAA,EACAC,OAAAA,EACAiC,KAAM,MAAQ+T,EAAIhH,GAClB8xC,YAAAA,EACAf,UAAAA,EACAmB,UAAAA,GACC7xB,EAAOL,GA2CV,GAvCA5uB,EAAU5B,iBAAiB,cAAc,KACvC,MAAMsY,EAAUsY,EAAIpH,mBACF,IAAfu3B,IACDA,GAAcA,IAAezoC,GAA+B,QAApBA,EAAQ63B,UAAsB3lC,EAAA,oCAGxE,MAAM+xC,EAAK,KACNjkC,GAAWA,IAAY1W,EAAUoB,QAClCsV,EAAQnY,UAIR4gD,EAKFK,GAAA,UAAqB,KACnBx/C,EAAUoB,OAAO9C,UAAUgB,IAAI,WAC5BoX,GACDA,EAAQpY,UAAUgB,IAAI,YAGxBU,EAAUoB,OAAOhD,iBAAiB,gBAAgB,KAChDohD,GAAA,UAAqB,KACnBx/C,EAAUoB,OAAO9C,UAAUC,OAAO,WAClCo8C,SAED,CAACzhC,MAAM,OAfTxC,GACD8oC,GAAA,SAAqB7E,IAkBR,IAAdmF,GACDjqC,EAAA,oBAAiCD,EAAK5V,EAAUoB,OAAQ0/C,KAIzD,CAAC5nC,MAAM,IAEPunC,EAAO,CACR,MAAMe,EAAwC,CAC5Cj5C,EAAG,GACH7F,EAAG,GAGL,IAAI++C,EAEJC,GAAA,uCAAwDjB,IAExD,QAAiBzxB,GAAW3wB,GAAM,oCAChC,EAAAohB,EAAA,GAAYphB,GACZ,MAAM2B,EAAY,kBAA0BgvB,GAE5C,GAAGhvB,EAAUmX,OAAQ,CACnB,MAAMvB,EAAM8rC,GAAA,gCAAiDjB,GAC7D,GAAG7qC,EAAK,CACN,MAAMX,EAAQ7V,SAASC,cAAc,SACrC4V,EAAM5T,MAAMC,QAAU,OACtB0tB,EAAIhtB,cAAcK,OAAO4S,GAEzB,UACQY,EAAA,cAA2BD,GAEjC,MAAMK,EAAeC,GAAA,kBAAmCN,GACxDX,EAAMkB,IAAMF,EAAaG,IACzBnB,EAAMxU,aACA,SAAYwU,OAAO3Q,GAAW,GAEpC2Q,EAAM7W,iBAAiB,SAAS,KAC9B6W,EAAMkB,IAAM,GACZlB,EAAM1W,WACL,CAAC2a,MAAM,IACV,MAAMtN,KAKV5L,EAAUN,UAAW,EACrBM,EAAU2hD,UAIZ,IADe,eACJ1hB,SACT,OAGF,MAAMrqB,EAAM8rC,GAAA,0BAA2CjB,GAAO,GAC9D,IAAI7qC,EACF,OAGF,MAAMgsC,GAAS,EAAAhhC,GAAA,GAAgBoO,EAAK,UAC9BqsB,EAAQuG,EAAOtjD,UAAUmT,SAAS,WAElC,aAACmuC,GAAgBH,GAAqB,CAC1C7pC,IAAAA,EACAgZ,WAAAA,EACA8wB,KAAMrE,EAAQ,QAAU,OACxBp8C,KAAM,IACNsX,OAAQyY,EACRvuB,MAAM,IAGLmhD,IACEvG,EACDuE,EAAathD,UAAUgB,IAAI,UAE3BsgD,EAAathD,UAAUgB,IAAI,UAI3BmiD,IACFA,GAA2B,EAAAI,GAAA,IAAS,KAElC,IADeL,EAAKj5C,EAAE3J,OAEpB,OAGF,MAAMkjD,EAAYN,EAAKj5C,EAAE,GAAG8H,EAE5BmxC,EAAKj5C,EAAEzF,SAASyF,IACdA,EAAE8H,GAAK9H,EAAE8H,EAAIyxC,GAAa,OAG5B,MAAMF,GAAS,EAAAhhC,GAAA,GAAgBoO,EAAK,UACpChoB,EAAA,YAA6B,eAA0B,CACrDK,EAAG,8BACH06C,OAAQh7C,EAAA,sBAA0C66C,EAAO76B,QAAQjgB,KACjEk7C,SAAUvB,EACVwB,YAAa,CACX56C,EAAG,WACHm6C,KAAMU,KAAKC,UAAUX,MAEtB,GAEHA,EAAKj5C,EAAE3J,OAAS,IACf,KAAM,IAIRP,EAAE6Y,YACHsqC,EAAKj5C,EAAE1C,KAAK,CACVvC,EAAG,EACH+M,EAAG+nC,KAAKC,QAGVoJ,UAKN,OAAOzhD,OAOJ,GAAG2gD,GAA4B,IAAhBC,EAAmB,CACvC,IAAIvsC,EACDssC,EACDtsC,EAAQ,IAAI+2B,OAEZ/2B,EAAQjV,SAASC,cAAc,SAC/BgV,EAAMpW,aAAa,cAAe,QACjCoW,EAA2BuE,OAAQ,EAEjCnY,IACA4T,EAA2B3U,UAAW,EACtC2U,EAA2B5U,MAAO,IAIvC,MAAMo/C,EAAa7vB,EAAIpH,oBAAsBvT,GAAS2a,EAAIpH,kBAW1D,OAVkB,IAAfu3B,IACDA,GAAcA,IAAelC,IAAe0D,EAAW9B,GAAeA,GAAqC,QAAvBA,EAAWtQ,WAAwB3lC,EAAA,oCAGzHyL,EAAM/V,UAAUgB,IAAI,iBAEjB6/C,GACD9qC,EAAM/V,UAAUgB,IAAI,WAGf,IAAIiC,SAAc,CAAC2E,EAASqnB,KACjC,MAAMlM,EAAI,KACR,GAAGuN,IAAeA,IAAc,OAAO1oB,IAEvC,MAAMwlB,EAAS,KACb8zB,GAAA,gBAA4BxwB,GAAK,KAM/B,GALAA,EAAI3sB,OAAOgS,GACRwqC,GACDA,EAAWvgD,UAAUgB,IAAI,YAGR,IAAhBshD,IAAsB/qC,EAAA,wBAAqCD,EAAKkrC,GAAY,EAE7E,EAAAf,GAAA,GAA6B1rC,GAC7B,MAAMjT,EAAShC,SAASC,cAAc,UACtC+B,EAAOzB,MAAQA,EAAQuL,OAAOk3C,iBAC9BhhD,EAAOxB,OAASA,EAASsL,OAAOk3C,iBACpBhhD,EAAOqP,WAAW,MAC1BgsC,UAAUpoC,EAAO,EAAG,EAAGjT,EAAOzB,MAAOyB,EAAOxB,QAChDiW,EAAA,oBAAiCD,EAAKxU,EAAQ0/C,GAI7B,IAAhBF,GAAqB3xB,GACtBquB,EAAA,eAAkCjpC,EAA2B4a,GAG/D/oB,IAEGi5C,GACD9qC,EAAMjW,iBAAiB,gBAAgB,KACrCiW,EAAM/V,UAAUC,OAAO,WACpBsgD,GACDA,EAAWtgD,WAEZ,CAAC2a,MAAM,QAKbynC,GACD,EAAAhD,GAAA,IAAmBtpC,EAAO4B,EAAaG,IAAKsV,IAE3CrX,EAA2B8B,IAAMF,EAAaG,KAC/C,SAAY/B,GAA2BvU,KAAK4rB,KAIhD,GAAGzV,EAAaG,IAAKiL,QAChB,CACH,IAAIjb,EACJ,GAAmB,IAAhBw6C,GAAqBD,EAAU,CAChC,MAAMj0B,EAAQzS,EAAA,kBAAiCrE,EAAKjW,EAAOC,GAAQ,GACnEwG,EAAUyP,EAAA,cAA2BD,EAAK8W,GAAOtmB,aAEjDA,EAAUyP,EAAA,cAA2BD,EAAsB4W,MAAAA,OAAa,EAAbA,EAAekxB,SAG5Et3C,EAAQtG,KAAKuhB,EAAGnb,YAMlB1G,GAA6CgtB,GAAmBywB,IAAc8D,EAElFxhD,KADCitB,EAAc3mB,KAAK,CAACmpB,IAAAA,EAAKzvB,KAAAA,IAAQgC,QAAQ2E,WAU5C,OAPG+2C,GAAc,IACf+B,EAAmBx/C,EAChB8sB,GACDA,EAAazmB,KAAKm5C,IAIfx/C,EAGF,SAAe6iD,IAAoB,IAACr/C,EAAG,cAAEwpB,EAAa,UAAErtB,EAAS,MAAE8vB,EAAK,SAAEvvB,EAAQ,MAAEC,EAAK,OAAEC,I,gDAShG,GAAa,QAAV,EAAAoD,EAAI6W,cAAM,eAAEjb,OA6Cb,OA5CAO,EAAUb,UAAUgB,IAAI,8BACxBktB,EAAc3mB,KAAK,CACjBmpB,IAAK7vB,EACLI,KAAM,KACJ,MAAM+iD,EAAkBZ,GAAA,oCAAqD1+C,GACvEoD,EAAU8P,GAAA,WAA4BosC,GAE5C,GAAGt/C,EAAI+V,OAAOwpC,WAAav/C,EAAI+V,OAAOypC,OACpC,OAAOp8C,EACNtG,MAAMwhD,IACLmB,GAAA,sBAAiC,CAC/BtjD,UAAAA,EACAM,MAAM,EACNC,SAAAA,EACA6hD,cAAeD,EACf3hD,MAAAA,EACAC,OAAAA,EACA8gD,aAAa,EACb7+C,KAAM,WAAamB,EAAI4L,IACtBqgB,MAEA,CACL,IAAI5a,EAaJ,OAZGrR,EAAI+V,OAAOypC,QACZnuC,EAAQjV,SAASC,cAAc,SAC/BgV,EAAMpW,aAAa,cAAe,QACjCoW,EAA2B3U,UAAW,EACtC2U,EAA2BuE,OAAQ,EACnCvE,EAA2B5U,MAAO,GAEnC4U,EAAQ,IAAI+2B,MAGd/2B,EAAM/V,UAAUgB,IAAI,iBAEb8G,EAAQtG,MAAKwhD,KAClB,EAAA3D,GAAA,IAAmBtpC,EAAOquC,IAAIC,gBAAgBrB,IAAO,KACnDniD,EAAUkD,OAAOgS,aAU7B,MAAMjO,EAAUs7C,GAAA,gBAAiC1+C,GAC3C4/C,QAAmBx8C,EACQ,kBAA9Bw8C,EAAWC,UAAU,GAAGx7C,GACzB0nB,GAAY,CACVnZ,IAAKgtC,EAAWC,UAAU,GAC1B7zB,IAAK7vB,EACL8vB,MAAOA,EACPzC,cAAAA,OAKC,SAASsZ,IAAiB,IAAClwB,EAAG,IAAEme,EAAG,KAAE90B,IAK1C,MAAM6jD,EAAgB/uB,EAAI1f,MACpBA,EAAQ0f,EAAIqC,YAAY,SAE3B0sB,GACDzuC,EAAM/V,UAAUgB,IAAI,QAGtB,MAAMgtB,EAA+Bw2B,EAAgB,QAAKx+C,EAEpDy+C,EAAiB,UAAT9jD,EAAmB,GAAK,GAChCqH,EAASyoB,GAAY,CACzBC,IAAK3a,EACLuB,IAAKA,EACLjW,MAAOojD,EACPnjD,OAAQmjD,EACRz2B,aAAAA,IAQF,OALAA,GAAgB/qB,QAAQC,IAAI8qB,GAAcxsB,MAAK,KAC7CuU,EAAM/V,UAAUC,OAAO,QACvBukD,EAAcvkD,YAGT+H,EAgCF,SAAS08C,GAAU51C,EAA8C+gB,EAAiDlqB,GACvH,MAAMg/C,EAAiB,IAAI5zB,GAAe,SAG1C,OAFA4zB,EAAeh1B,KAAK7gB,EAAO+gB,EAAUlqB,GAE9Bg/C,EAAe9jD,UAGjB,SAAS+jD,GAAavlD,GAS3B,MACMyyB,EADW,IAAIX,GAAS9xB,EAAQ+H,MAAO/H,EAAQ+xB,SAAU/xB,EAAQgyB,SAAUhyB,EAAQiyB,QAASjyB,EAAQkyB,WAClFO,SAElB+yB,EAAY/yB,EAAOhgB,MAAKzK,G9Bh0DvB,E8Bg0D+BA,EAAKsrB,QACrCtxB,EAAQwjD,EAAUnyB,SAASrxB,MAAQwjD,EAAUnyB,SAAShV,EAEtDonC,EAAahzB,EAAOhgB,MAAKzK,G9Bl0DvB,E8Bk0D+BA,EAAKsrB,QACtCrxB,EAASwjD,EAAWpyB,SAASpxB,OAASwjD,EAAWpyB,SAAS9U,EAE1D/c,EAAYxB,EAAQwB,UAC1BA,EAAUkC,MAAM1B,MAAQA,EAAQ,KAChCR,EAAUkC,MAAMzB,OAASA,EAAS,KAClC,MAAM+uB,EAAWxvB,EAAUwvB,SAE3ByB,EAAOttB,SAAQ,EAAEkuB,SAAAA,EAAUC,MAAAA,GAAQ/sB,KACjC,IAAI8qB,EA8BJ,GA7BAA,EAAML,EAASzqB,GACX8qB,IACFA,EAAM5vB,SAASC,cAAc,OAC7BF,EAAUkD,OAAO2sB,IAGnBA,EAAI1wB,UAAUgB,IAAI,aAAc,gBAEhC0vB,EAAI3tB,MAAM1B,MAASqxB,EAASrxB,MAAQA,EAAQ,IAAO,IACnDqvB,EAAI3tB,MAAMzB,OAAUoxB,EAASpxB,OAASA,EAAS,IAAO,IACtDovB,EAAI3tB,MAAMs1B,IAAO3F,EAAS9U,EAAItc,EAAS,IAAO,IAC9CovB,EAAI3tB,MAAMud,KAAQoS,EAAShV,EAAIrc,EAAQ,IAAO,I9Bt1D1C,E8Bw1DDsxB,G9B31DA,E8B21DyBA,IAC1BjC,EAAI3tB,MAAMgiD,oBAAsB,W9Bz1D9B,E8B41DDpyB,G9B71DG,E8B61DsBA,IAC1BjC,EAAI3tB,MAAMiiD,uBAAyB,W9B/1DhC,E8Bk2DFryB,G9Bn2DA,E8Bm2D0BA,IAC3BjC,EAAI3tB,MAAMkiD,qBAAuB,W9Bn2D9B,E8Bs2DFtyB,G9Br2DG,E8Bq2DuBA,IAC3BjC,EAAI3tB,MAAMmiD,wBAA0B,WAGnC7lD,EAAQ8lD,SAAU,CACnB,MAAMC,EAAWtkD,SAASC,cAAc,OACxCqkD,EAASplD,UAAUgB,IAAI,oBAEvB0vB,EAAI3sB,OAAOqhD,OAiBV,SAASC,IAAU,QAACC,EAAO,cAAEC,EAAa,WAAEj1B,EAAU,UAAElH,EAAS,cAAE8E,EAAa,MAAE6uB,EAAK,KAAEjgB,EAAI,aAAE9O,EAAY,aAAEQ,IAWlH,MAAMpnB,EAAiE,GAGjEmD,EAAU7B,EAAA,iBAAkC48C,GAClD,IAAI,MAAM98C,KAAO+B,EAAS,CACxB,MAAM+kC,EAAIxS,EAAK0oB,WAAWh9C,GACpBuN,EAAQu5B,EAAEv5B,MAAMjQ,OAASwpC,EAAEv5B,MAAMjV,SAEjCH,EAAwB,UAAZoV,EAAMhN,EAAgB4S,EAAA,kBAAiC5F,EAAO,IAAK,KAAO,CAAC+E,EAAG/E,EAAM+E,EAAGY,EAAG3F,EAAM2F,GAClHtU,EAAMG,KAAK,CAAC5G,KAAAA,EAAMoV,MAAAA,EAAOpQ,QAAS2pC,IAQpCsV,GAAa,CACX/jD,UAAW0kD,EACXn+C,MAAOA,EAAM+C,KAAInF,IAAK,CAAE8V,EAAG9V,EAAErE,KAAKma,EAAGY,EAAG1W,EAAErE,KAAK+a,MAC/C0V,SAAU5G,EAAA,sBACV6G,SAAU,IACVC,QAAS,EACT6zB,UAAU,IAGZ/9C,EAAM5C,SAAQ,CAAC6C,EAAMzB,KACnB,MAAM,KAACjF,EAAI,MAAEoV,EAAK,QAAEpQ,GAAW0B,EAEzBqpB,EAAM60B,EAAcl1B,SAASzqB,GACnC8qB,EAAIjI,QAAQjgB,IAAM,GAAK7C,EAAQ6C,IAC/BkoB,EAAIjI,QAAQ7f,OAAS,GAAKjD,EAAQiD,OAClC,MAAMw8C,EAAW10B,EAAIpH,kBACO,UAAZvT,EAAMhN,EAEpB8kB,GAAU,CACR/nB,MAAOiQ,EACPpQ,QAAAA,EACA9E,UAAWukD,EACXt3B,SAAU,EACVC,UAAW,EACXgvB,MAAAA,EACA7uB,cAAAA,EACAoC,WAAAA,EACA3vB,KAAAA,EACAqtB,aAAAA,EACAmvB,iBAAkB3uB,EAAa1oB,QAGjC+2C,GAAU,CACRvlC,IAAK3R,EAAQoQ,MAAMjV,SACnBD,UAAWukD,EACXz/C,QAAAA,EACAmoB,SAAU,EACVC,UAAW,EACX+uB,UAAU,EACVC,MAAAA,EACA7uB,cAAAA,EACAoC,WAAAA,EACAtC,aAAAA,EACAQ,aAAAA,OAl6DRhE,EAAA,oBAA4B,gBAAgB,CAACzgB,EAAMwqC,KACjD,GAAGA,IAAO,aAAqBxqC,IAAS,YAAmB,CACzD,MAAMwe,EAAWze,MAAMC,KAAKjJ,SAASmQ,iBAAiB,gCAChD5P,EAAQmpB,EAAA,sBACRqzB,EAAWx8C,EAAQ,EACnBi4C,EAASuE,EAAW,EAC1BjB,GAA0B,EAAIn6C,KAAK+2C,GAAKF,EACxC/wB,EAAS/jB,SAAQ4T,IACfA,EAAQwP,eAAe,KAAM,QAAS,GAAKvmB,GAC3C+W,EAAQwP,eAAe,KAAM,SAAU,GAAKvmB,GAE5C,MAAMsmB,EAASvP,EAAQkR,kBACvB3B,EAAOC,eAAe,KAAM,KAAM,GAAKi2B,GACvCl2B,EAAOC,eAAe,KAAM,KAAM,GAAKi2B,GACvCl2B,EAAOC,eAAe,KAAM,IAAK,GAAK0xB,GAEtC3xB,EAAO5kB,MAAMq3C,gBAAkBwC,GAA0B,IAAMA,GAC/Dj1B,EAAO5kB,MAAMo3C,iBAAmB,GAAKyC,UAwd3CtyC,EAAA,yBAA2B,kBAAmBkN,IAC3B1N,MAAMC,KAAKjJ,SAASmQ,iBAAiB,0BAA0BuG,QACvEhT,SAAQ4T,IACZA,EAAQpH,cAAc,iCACvB,QAAmBoH,S,qCCpiBV,SAASqtC,GAAuBrtC,EAAsBvX,EAAwB6kD,EAAaC,GAKxG,YAJe3/C,IAAZ2/C,IACDA,EAAUvtC,EAAQ1U,gBAAkB7C,GAAY,EAAA+kD,GAAA,GAAWxtC,IAAY,GAGtEutC,IAAYD,KAEQ,IAAbC,GAAkBA,EAAUD,IACpCA,GAAO,GAGLA,EAEM7kD,EAAU2K,kBAAoBk6C,EACtC7kD,EAAU+C,aAAawU,EAASvX,EAAUwvB,SAASq1B,IAEnD7kD,EAAUkD,OAAOqU,GAJjBvX,EAAU8C,QAAQyU,IAOb,G,eCXM,MAAMytC,GAenBzmD,YAAYC,GALF,KAAAymD,kBAAqB1pB,GAAyBA,IAC9C,KAAA2pB,eAAkB3pB,GAAuDA,GAAS,GAElF,KAAA9L,YAAa,WAYrB,EAAA5pB,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAK8oB,SAAW,IAAI1X,IACpBpR,KAAKoK,OAAS,GAGTyB,QACL7L,KAAK6wB,WAAWxX,QAChBrZ,KAAK8oB,SAASjd,QACd7L,KAAKoK,OAAOvJ,OAAS,EAGb0lD,cACRvmD,KAAK8oB,SAAS/jB,SAAQ4T,IACpB3Y,KAAK6lC,OAAOltB,EAAQ9H,IAAI,MAGvB7Q,KAAKwmD,QACNxmD,KAAKoK,OAAOrF,SAAQ,CAAC4T,EAASxS,KAC5BnG,KAAKwmD,OAAO7tC,EAASxS,MAKpBsgD,WAAW9pB,GAChB,MAAM9L,EAAa7wB,KAAK6wB,WAAWnf,MACnC1R,KAAKsmD,gBAAgBI,IACnB,IAAI71B,UAA+BtqB,IAAdmgD,IAA4BA,EAC/C,OAAO/pB,GAAS,GAGlB38B,KAAKumD,cAEL5pB,GAAS,MAIN9yB,IAAIgH,GACT,OAAO7Q,KAAK8oB,SAASjf,IAAIgH,GAGpBa,IAAIb,GACT,OAAO7Q,KAAK8oB,SAASpX,IAAIb,GAGpB81C,SACL,OAAO3mD,KAAK8oB,SAGPvnB,IAAIsP,EAAqB+1C,GAAQ,EAAOP,EAAoEQ,EAAcD,GAC/H,IAAIjuC,EAAU3Y,KAAK0R,IAAIb,GACvB,GAAG8H,EACD,OAAOA,EAGT,MAAMmuC,EAA0B,CAC9Bj2C,GAAAA,EACA1J,MAAO,GAOT,OAJAwR,EAAU3Y,KAAK+mD,gBAAgBD,EAAMF,GACrC5mD,KAAK8oB,SAAS7jB,IAAI4L,EAAI8H,GACtB3Y,KAAK6lC,OAAOh1B,EAAIg2C,EAAaluC,EAAS0tC,GAE/B1tC,EAGF3I,OAAOa,EAAqBm2C,GACjC,MAAMruC,EAAU3Y,KAAK8oB,SAASpX,IAAIb,GAClC,IAAI8H,EACF,OAAO,EAGT3Y,KAAK8oB,SAAS9Y,OAAOa,GAErB,MAAM1K,EAAMnG,KAAKoK,OAAO6V,QAAQtH,GAKhC,IAJY,IAATxS,GACDnG,KAAKoK,OAAO9D,OAAOH,EAAK,GAGvBnG,KAAKinD,SACN,GAAGD,EACDhnD,KAAKinD,SAAStuC,OACT,CACL,MAAMkY,EAAa7wB,KAAK6wB,WAAWnf,MACnC1R,KAAKqmD,mBAAkB,KACjBx1B,KAIJ7wB,KAAKinD,SAAStuC,MAKpB,OAAO,EAGFktB,OAAOh1B,EAAqB+1C,GAAQ,EAAOjuC,EAAU3Y,KAAK0R,IAAIb,GAAKw1C,GACxE,IAAI1tC,EACF,OAGFA,EAAQxR,MAAQnH,KAAKknD,SAASvuC,GAC9B3Y,KAAKmnD,UAAYnnD,KAAKmnD,SAASxuC,GAE/B,MAAMxS,GAAM,EAAAihD,GAAA,GAA2BpnD,KAAKoK,OAAQuO,EAAS,SAC7D,IAAIiuC,GAAS5mD,KAAKwmD,OAAQ,CACxB,MAAM31B,EAAa7wB,KAAK6wB,WAAWnf,OAClC20C,GAAqBrmD,KAAKqmD,oBAAmB,KACxCx1B,KAKJ7wB,KAAKwmD,OAAO7tC,EAASxS,QCvId,MAAMkhD,WAAuBjB,GAa1CzmD,YAAYC,EASP,IAsDH,IAAIyO,EArDJxO,MAAM,CACJqnD,SAAUtnD,EAAQsnD,UAAY,CAAEvuC,GAAY1D,EAAA,uBAAqC0D,EAAQ9H,KACzFo2C,SAAWtuC,IACTA,EAAQ9D,IAAI+wB,OAAOplC,SACnBR,KAAKsnD,oBAAsBtnD,KAAKsnD,sBAElCH,SAAUvnD,EAAQunD,UAAY,CAAExuC,IAC9B,MAAM4uC,EAAStyC,EAAA,sBAAoC0D,EAAQ9H,KAC3D,EAAA7C,EAAA,GAAe2K,EAAQ9D,IAAIG,gBAAiBuyC,KAE9Cf,OAAQ,CAAC7tC,EAASxS,KAChB,MAAMqhD,EAAmB7uC,EAAQ9D,IAAI+wB,OAAO3hC,gBAAkBjE,KAAK0L,KACnEs6C,GAAuBrtC,EAAQ9D,IAAI+wB,OAAQ5lC,KAAK0L,KAAMvF,GAEnDqhD,GAAoBxnD,KAAKsnD,oBAC1BtnD,KAAKsnD,sBAGTP,gBAAkBD,IAChB,MAAM,IAACjyC,GAAO,gBAA+B,CAC3CC,OAAQgyC,EAAKj2C,GACbzP,WAAW,EACXsM,YAAY,EACZC,WAAY3N,KAAK2N,WACjBnC,WAAYxL,KAAKwL,WACjBoC,WAAW,EACXmH,cAAe/U,KAAK+U,cACpB0Z,cAAezuB,KAAKyuB,gBAItB,OADCq4B,EAAoBjyC,IAAMA,EACpBiyC,GAETT,kBAAmB,MACnBC,eAAsB3pB,IAAa,O,EAAA,K,OAAA,E,EAAA,YACjC,OAAI,EAAA4hB,GAAA,GAAQv+C,KAAK0L,aAIX,YAEF,EAAA6yC,GAAA,GAAQv+C,KAAK0L,WAIjBixB,GAAS,GAHAA,GAAS,IANTA,GAAS,I,YAFe,K,iRApD7B,KAAAhvB,WAAa,GACb,KAAAoH,eAAgB,EAChB,KAAAvJ,YAAa,GAiErB,EAAAvE,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAK0L,KAAO,kBAAiC1L,KAAKynD,uBAGlD,MAAMC,EAAY,KAChBr5C,EAAUlB,OAAOC,YAAW,KAC1BpN,KAAKymD,YAAYtgC,IACZA,GACDuhC,SAGHL,GAAeM,gBAGpBD,KAtFe,GAAAC,cAAgB,I,eCPpB,SAASC,GAAsBhoD,GAC5C,IAAIioD,GAAU,EACd,OAAO,IAAIjc,GAAa,OAAD,wBAClBhsC,GAAO,CACV2sC,kBAAoBjsC,KACV,EAAAuiB,GAAA,GAAgBviB,EAAEkY,OAAQ,oBAC/B,EAAAsvC,GAAA,GAAoBxnD,MACpBV,EAAQ2sC,mBAAoB3sC,EAAQ2sC,kBAAkBjsC,IAE3DysC,QAAS,CAACL,EAAOC,EAAOrsC,KACtB,IAAIunD,GAAW7kD,KAAK4yB,IAAI+W,GAAS,GAC/B,OAAO,EAGT,GAAG3pC,KAAK4yB,IAAI8W,GAAS1pC,KAAK4yB,IAAI+W,IAC5B,EAAAjrB,EAAA,GAAYphB,GACZunD,GAAU,OACL,IAAIA,GAAW7kD,KAAK4yB,IAAI+W,GAAS3pC,KAAK4yB,IAAI8W,GAC/C,OAAO,EAOT,OAAO9sC,EAAQmtC,QAAQL,EAAOC,EAAOrsC,IAEvC8rC,QAAS,KACPyb,GAAU,EACVjoD,EAAQwsC,SAAWxsC,EAAQwsC,WAE7B1qB,aAAa,KCrCF,SAASqmC,GAAenoD,GACrC,OAAOgoD,GAAsB,OAAD,wBACvBhoD,GAAO,CACVmtC,QAAS,CAACL,EAAOC,EAAOrsC,KACtB,GAAG0C,KAAK4yB,IAAI8W,GAAS,GAInB,OAHA9sC,EAAQmtC,QAAQL,EAAOC,EAAOrsC,IAC9B,WAEO,M,eCRA,MAAM0nD,WAAqBtkB,GACxC/jC,YACEsoD,EACArkB,EACAskB,GAAmB,GAEnBroD,MAAM,CACJikC,UAAW,CAAC,UAAW,YACvBF,SAAUskB,EAAmBtkB,EAAiBz6B,IAAW,O,EAAA,K,OAAA,E,EAAA,YACvD,GAAGy6B,EAAU,CACX,MAAMr2B,EAAMq2B,EAASz6B,GAClBoE,aAAe/J,gBACV+J,GAIV,gBAA0B,CAACpE,OAAAA,IAC3B,kCAA4C8+C,I,YATW,K,+QAWzD95C,YAAa,uCACb0zB,iBAAkB,gBAClBxC,aAAc,kBCdL,MAAM8oB,GACnBxoD,YAAYwJ,EAAgBgB,EAAgBlK,EAAgBmoD,GAC1D,MAAMzhB,EAAmB,IAAI,KAAU,CAACx9B,OAAAA,IAASwP,QAEjDxO,EAAOA,EAAKvJ,QACZ,MAAM+7B,EAAW,CAAChb,EAA4C0mC,KAC5DD,GAAaA,IACD,cAATnoD,EACDgJ,EAAA,0BAA2CE,EAAQgB,GAEnDlB,EAAA,iBAAkCE,EAAQgB,IAAQwX,EAAQzgB,MAAQmnD,IAItE,IAAIh5C,EAAoBi5C,EAAkBjsB,EAA0B0K,EAAwBnlB,EAAsC4a,EAA6C,GAoB/K,GAnBmB,IAAhBryB,EAAKtJ,OACNwO,EAAQ,6BAERA,EAAQ,sBACRi5C,EAAY,EAAC,IAAA18C,MAAK,WAAY,CAACzB,EAAKtJ,WAIpCw7B,EADCjgB,EAAA,cAA4BjT,GACC,IAAhBgB,EAAKtJ,OAAe,oCAAsC,kCAE1C,IAAhBsJ,EAAKtJ,OAAe,gCAAkC,8BAGtE+gB,EAAU,CAAC,CACT6X,QAAS,SACTuN,UAAU,EACVrK,SAAAA,IAGCxzB,IAAW0B,EAAA,cAA2B,cAAT5K,QAG9B,GAAGkJ,EAAO+4B,SACR1F,EAAW10B,KAAK,CACdmZ,KAAM,2BACNM,SAAU,CAAColB,SAER,CACL,MAAMtJ,EAAOvpB,EAAA,UAAwB3K,EAAOoyB,YAEtCgtB,EAAYz0C,EAAA,YAA0B3K,EAAOoyB,WAAY,mBAC/D,GAAc,SAAX8B,EAAK/zB,EAAc,CACpB,MAAMk/C,EAAYD,EAAYp+C,EAAKvJ,QAAUuJ,EAAKL,QAAOf,GACvCE,EAAA,mBAAoCE,EAAQJ,GAC7C0E,SAAW5C,EAAA,eAGzB29C,EAAU3nD,SACR2nD,EAAU3nD,SAAWsJ,EAAKtJ,OAC3B27B,EAAW10B,KAAK,CACdmZ,KAAM,kBAGRub,EAAW10B,KAAK,CACdmZ,KAAM,yBAGRob,EAAc,0BACd0K,EAAkB,EAAC,IAAAn7B,MAAK,WAAY,CAAC48C,EAAU3nD,iBAKnD+gB,EAAQ,GAAG+a,SAAYhb,GAAYgb,EAAShb,GAAS,IAK3D,QAAgBC,GAEF,IAAIga,GAAU,oBAAqB,CAC/CzyB,OAAAA,EACA6uB,aAAc3oB,EACd4sB,cAAeqsB,EACflsB,mBAAoBC,EACpBE,oBAAqBwK,EACrBnlB,QAAAA,EACA4a,WAAAA,IAGI9Z,Q,eC3FK,MAAM+lC,GACnB9oD,YAAYwJ,EAAgBgB,EAAgBi+C,GAC1C,IAAI/4C,EAAegtB,EAAqBza,EAAyB,GAEjEvS,EAAQ,eAAelF,EAAKtJ,OAAS,EAAI,IAAM,SAC/Cw7B,EAAclyB,EAAKtJ,OAAS,EAAI,QAAUsJ,EAAKtJ,OAAS,iBAAmB,oBAO3E+gB,EAAQ9Z,KAAK,CACX2xB,QAAS,OACTkD,SAPe,KACfyrB,GAAaA,IACbn/C,EAAA,wBAAyCE,EAAQgB,MAQrC,IAAIyxB,GAAU,oBAAqB,CAC/CzyB,OAAAA,EACAkG,MAAAA,EACAgtB,YAAAA,EACAza,QAAAA,IAGIc,Q,eC5BK,SAASgmC,KACnBv7C,OAAOw7C,aACLx7C,OAAOw7C,eAAeC,MACvBz7C,OAAOw7C,eAAeC,QACdz7C,OAAOw7C,eAAeE,iBAC9B17C,OAAOw7C,eAAeE,kBAGhBxnD,SAASyyC,WAEjBzyC,SAASyyC,UAAU8U,Q,eCwBvB,MAAME,GAAoBp+C,GACjB,IAAIA,EAAI84B,UAAU/+B,QAAO,CAACC,EAAKC,IAAMD,EAAMC,EAAEzD,MAAM,GAK5D,MAAM6nD,WAAqB,IA+BzBppD,YAAYC,GAmBV,GANAC,OAAM,GAzCD,KAAAmpD,aAAyC,IAAI53C,IAC7C,KAAA2iC,aAAc,EAiXd,KAAA2U,gBAAmBO,IACrBA,IAAcjpD,KAAKipD,cAAe,GACrCjpD,KAAKkpD,mBAAqBlpD,KAAKkpD,oBAC/BlpD,KAAKgpD,aAAan9C,QAClB7L,KAAKmpD,kBACLT,KACGO,IAAcjpD,KAAKipD,kBAAe1iD,KA7UrC,EAAAU,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAK4Q,eAAiB,gBAAiB,UAEpC,GAAAgM,mBA0BD,OAzBA5c,KAAKwP,eAAejO,IAAIvB,KAAKopD,cAA7BppD,CAA4C,YAAY,KAClDA,KAAK+zC,cACT/zC,KAAKqpD,aC5FRl8C,OAAOw7C,aACDx7C,OAAOw7C,eAAeW,WAErBjoD,SAASyyC,UAEVzyC,SAASyyC,UAAUyV,cAActoC,KAGnC,YDuFH,QAA0BjhB,KAAKopD,eAAgB9oD,IAC7C,GAAGN,KAAK+zC,aAAgB/zC,KAAKwpD,uBAAyBxpD,KAAKwpD,uBAAyB,OAGpFnoD,SAASwY,KAAKtZ,UAAUgB,IAAI,aAC5BvB,KAAKopD,cAAc/oD,iBAAiB,YAAaC,KAC/C,EAAAohB,EAAA,GAAYphB,GACZe,SAASwY,KAAKtZ,UAAUC,OAAO,eAG9B,CAAC2a,MAAM,EAAMyU,SAAS,IAEzB84B,KAEA,MAAM/vC,EAAU3Y,KAAKypD,qBAAqBnpD,EAAEkY,QACzCG,GACD3Y,KAAKg0C,gBAAgBr7B,KAEtB3Y,KAAKwP,gBAKV,MAAMk6C,EAAqB,CAAC70B,EAAoB80B,KAC9C,GAAG90B,IAAU80B,EACX,MAAO,GAGT,MAAMC,EAAY/0B,EAAMpV,wBAClBoqC,EAAWF,EAAKlqC,wBAEhBqqC,GADcF,EAAUhxB,IAAMixB,EAASjxB,KAASgxB,EAAU/oC,KAAOgpC,EAAShpC,MAClD,EAExBkpC,GAAS,EAAAlnC,GAAA,GAAgBgS,EAAO70B,KAAKgqD,8BAC3C,IAAID,EACF,MAAO,GAGT,MAAMjhC,EAAWze,MAAMC,KAAKy/C,EAAOv4C,iBAAiBxR,KAAKiqD,6BACzD,IAAIC,EAAaphC,EAAS7I,QAAQ4U,GAC9Bs1B,EAAYrhC,EAAS7I,QAAQ0pC,GAUjC,OARIG,KACDK,EAAWD,GAAc,CAACA,EAAYC,IAG3BrhC,EAASloB,MAAMspD,EAAa,EAAGC,IAO/CnqD,KAAKwP,eAAejO,IAAIvB,KAAKopD,cAA7BppD,CAA4C,aAAcM,IAExD,MAAMqY,GAAU,EAAAkK,GAAA,GAAgBviB,EAAEkY,OAAQxY,KAAKoqD,uBAC/C,GAAgB,IAAb9pD,EAAEie,OACH,OAGF,GAAGve,KAAKqqD,eAAiBrqD,KAAKqqD,aAAa/pD,EAAGqY,GAC5C,OAGF,MAAM2xC,EAAqC,IAAIl5C,IAC/C,IAAIm5C,EAaAC,EAAc7xC,EAElB,MAAM8xC,EAAiB,CAAC9xC,EAAsB+xC,GAAe,KAC3D,MAAM3hD,GAAO4P,EAAQqQ,QAAQjgB,IAC7B,IAAIA,IAAQ4P,EAAQqQ,QAAQ7f,OAAQ,OACpC,MAAMA,EAASwP,EAAQqQ,QAAQ7f,OAAO8f,YAElC,EAAAs1B,GAAA,GAAQiM,KACVA,EAAc7xC,GAGhB,IAAIgyC,EAAUL,EAAK54C,IAAIvI,GAKvB,GAJIwhD,GACFL,EAAKrlD,IAAIkE,EAAQwhD,EAAU,IAAIjlD,MAG7BilD,EAAQ9gD,IAAId,GAAM,CACpB,MAAM6hD,EAAa5qD,KAAK6qD,cAAc1hD,EAAQJ,GAQ9C,QAPiBxC,IAAdgkD,IAEDA,GAAaK,GAGfD,EAAQppD,IAAIwH,GAERwhD,IAAcK,IAAiBL,GAAaK,EAAa,CAC3D,MAAME,EAAahC,GAAiBwB,GACpC,GAAGtqD,KAAKg0C,iBAAmB0W,EAAc,CACpCI,EAAa,IACX,EAAAC,GAAA,GAAcpyC,EAAS6xC,KACxBA,EAAc7xC,GAIlB,MAAMqyC,EAAkBtB,EAAmBc,EAAa7xC,GAErDqyC,EAAgBnqD,QACjBmqD,EAAgBjmD,SAAQ4T,IACtB8xC,EAAe9xC,GAAS,MAK9B,GAAI3Y,KAAKgpD,aAAa9nD,KAQZlB,KAAKg0C,iBACbh0C,KAAKg0C,gBAAgBr7B,QARrB,GAAkB,IAAfmyC,GAAoB9qD,KAAKirD,YAC1B,IAAI,MAAO9hD,EAAQgB,KAASmgD,EAC1B,IAAI,MAAMvhD,KAAOoB,EACfnK,KAAKirD,YAAY9hD,EAAQJ,MAYvC,IAAImiD,GAAoB,EACxB,MAAMntC,EAAezd,IACf4qD,IACFxC,KACAwC,GAAoB,GAYtB,MAAMvyC,EAAU3Y,KAAKypD,qBAAqBnpD,EAAEkY,QAC5C,GAAIG,EAKJ,OAAG3Y,KAAKmrD,wBAA0BnrD,KAAKmrD,sBAAsB7qD,EAAGqY,EAAS4xC,IACvEvqD,KAAKwP,eAAe47C,aAAaprD,KAAKopD,cAAe,YAAarrC,QAClE/d,KAAKwP,eAAe47C,aAAa/pD,SAAU,UAAWgd,EAAWgtC,SAInEZ,EAAe9xC,IAGX0F,EAAa/d,IACdgqD,EAAKppD,OACN,QAAiBiM,OAAQuU,EAAA,EAAa,CAACkO,SAAS,EAAMzU,MAAM,EAAM6D,SAAS,IAG7Ehf,KAAKwP,eAAe47C,aAAaprD,KAAKopD,cAAe,YAAarrC,GAIlE2qC,MAGI2C,EAA0B,CAAClwC,MAAM,GACvCnb,KAAKwP,eAAejO,IAAIvB,KAAKopD,cAA7BppD,CAA4C,YAAa+d,GACzD/d,KAAKwP,eAAejO,IAAIF,SAAxBrB,CAAkC,UAAWqe,EAAWgtC,MAIlDC,0BAA0B3yC,GAClC,OAAO3Y,KAAK6qD,cAAclyC,EAAQqQ,QAAQ7f,OAAO8f,YAAatQ,EAAQqQ,QAAQjgB,KAGtEwiD,eAAe5yC,EAAsBwI,GAC7CxI,EAAQzU,QAAQid,EAAc9N,OAGzBm4C,sBAAsB7yC,EAAsB+J,GACjD,MAAM+oC,IAAgBzrD,KAAK0rD,4BAA4B/yC,GACvD,GAAG+J,EAAM,CACP,GAAG+oC,EACD,OAAO,EAGT,MAAMtqC,EAAgB,IAAI,KAAc,CACtCrd,KAAM6U,EAAQqQ,QAAQjgB,IACtB7F,OAAO,IAINlD,KAAK+zC,aACH/zC,KAAKsrD,0BAA0B3yC,KAChCwI,EAAcphB,MAAM4hB,SAAU,EAC9BhJ,EAAQpY,UAAUgB,IAAI,gBAI1BvB,KAAKurD,eAAe5yC,EAASwI,QACrBsqC,GACRzrD,KAAK0rD,4BAA4B/yC,GAAS1U,cAAczD,SAG1D,OAAO,EAGCkrD,4BAA4B/yC,G,MACpC,MAA8C,WAAd,QAAzB,EAAAA,EAAQkR,yBAAiB,eAAE2mB,UAChC73B,EAAQkR,kBAAkBA,kBAGpB8hC,gBAAgBC,GAAiB,GACzC,MAAM1qD,EAAOlB,KAAKgpD,aAAa9nD,KAC/B,IAAIA,IAAS0qD,EAAgB,OAE7B,IAAIC,GAAe3qD,EACjB4qD,GAAc5qD,EACd6qD,GAAY7qD,EACd,IAAI,MAAOiI,EAAQgB,KAASnK,KAAKgpD,aAAc,CAC7C,MAAMl+C,EAAU9K,KAAK+K,YAAc/K,KAAKiJ,mBAAmB+iD,4BAA4B7iD,GAAUnJ,KAAKiJ,mBAAmBgjD,mBAAmB9iD,GAC5I,IAAI,MAAMJ,KAAOoB,EAAM,CACrB,MAAMjE,EAAUlG,KAAKiJ,mBAAmBijD,sBAAsBphD,EAAS/B,GASvE,GARI8iD,IACFA,GAAe7rD,KAAKiJ,mBAAmBkjD,WAAWjmD,IAGhD4lD,IACFA,GAAc9rD,KAAKiJ,mBAAmBmjD,iBAAiBlmD,IAGtD2lD,GAAeC,EAAY,MAGhC,GAAGD,GAAeC,EAAY,MAGhC9rD,KAAKqsD,mBAAqBrsD,KAAKqsD,kBAAkBR,EAAaC,EAAYC,GAGrE5C,gBAAgBmD,GAAmB,EAAMV,GAAiB,GAC/D,MAAMW,EAAevsD,KAAK+zC,YACpB7yC,EAAOlB,KAAKgpD,aAAa9nD,KAG/B,GAFAlB,KAAK+zC,cAAgB7yC,GAAQ0qD,EAE1BW,IAAiBvsD,KAAK+zC,YAAa,OAAO,EAE7C/zC,KAAKsQ,cAAc,SAAUtQ,KAAK+zC,aAY9B,GAAAn3B,qBACF5c,KAAKopD,cAAc7oD,UAAUsD,OAAO,YAAa7D,KAAK+zC,aAEnDwY,GAED7D,OAaJ,EAAA8D,GAAA,KAEA,MAAMC,IAAavrD,GAAQ0qD,EAoB3B,OAnBA5rD,KAAK0sD,mBAAqB1sD,KAAK0sD,kBAAkBD,GAAWzsD,KAAKipD,cAE7D,GAAA0D,mBACCF,EACD97C,EAAA,WAAiC,CAC/B1Q,KAAMD,KAAK4Q,eACXiB,MAAO,KACL7R,KAAK0oD,qBAIT/3C,EAAA,eAAqC3Q,KAAK4Q,iBAI3Cg7C,GACD5rD,KAAK2rD,gBAAgBC,IAGhB,EAYFzgD,UACLnL,KAAKipD,cAAe,EACpBjpD,KAAKgpD,aAAan9C,QAClB7L,KAAKmpD,iBAAgB,GACrBnpD,KAAKipD,kBAAe1iD,EAGZqmD,uBAAuBj0C,EAAsBiyC,GACrD5qD,KAAKwrD,sBAAsB7yC,GAAS,GACtB3Y,KAAK0rD,4BAA4B/yC,GACzCgJ,QAAUipC,EAEhB5qD,KAAKmpD,kBACLnpD,KAAK2rD,mBACL,QAAchzC,EAAS,cAAeiyC,EAAY,KAG7CC,cAAc1hD,EAAgBJ,GACnC,MAAM9D,EAAMjF,KAAKgpD,aAAat3C,IAAIvI,GAClC,OAAOlE,MAAAA,OAAG,EAAHA,EAAK4E,IAAId,GAGXlI,SACL,OAAOioD,GAAiB9oD,KAAKgpD,cAGrB6D,UAAU1jD,EAAgBJ,EAAa+jD,GAC/C,IAAI7nD,EAAMjF,KAAKgpD,aAAat3C,IAAIvI,GAChC,GAAG2jD,QAA0BvmD,IAAbumD,IAA0B7nD,MAAAA,OAAG,EAAHA,EAAK4E,IAAId,IAC9C9D,IACDA,EAAI+K,OAAOjH,GAEP9D,EAAI/D,MACNlB,KAAKgpD,aAAah5C,OAAO7G,QAGxB,CAEL,GADa0B,EAAA,mCAAuC7K,KAAKa,SAAW,EAC1D,EAER,OADAi5B,GAAM,iBAAY,6BAA6B,KACxC,EAgBL70B,IACFA,EAAM,IAAIS,IACV1F,KAAKgpD,aAAa/jD,IAAIkE,EAAQlE,IAGhCA,EAAI1D,IAAIwH,GAGV,OAAO,EAMFgkD,mBAAmB5jD,EAAgBgB,GACxC,MAAMlF,EAAMjF,KAAKgpD,aAAat3C,IAAIvI,GAC9BlE,IAIJkF,EAAKpF,SAAQgE,IACX9D,EAAI+K,OAAOjH,MAGT9D,EAAI/D,MACNlB,KAAKgpD,aAAah5C,OAAO7G,GAG3BnJ,KAAK2rD,kBACL3rD,KAAKmpD,oBAIF,MAAM6D,WAAwBjE,GASnCppD,YAAoB8yC,EAA6BxpC,GAC/CpJ,MAAM,CACJoJ,mBAAAA,EACAmgD,cAAe3W,EAAYrxC,UAC3BoO,eAAgB,IAAI,IACpB66C,aAAc,CAAC/pD,EAAGkY,MAAaA,GAAUxY,KAAK+zC,YAC9C0V,qBAAuBjxC,IAAW,EAAAqK,GAAA,GAAgBrK,EAAQ,qBAC1D4xC,sBAAuB,oBACvBJ,6BAA8B,WAC9BC,2BAA4B,uBATZ,KAAAxX,YAAAA,EAsCb,KAAAuB,gBAAmBr7B,IACxB,MAAM5P,GAAO4P,EAAQqQ,QAAQjgB,IACvBI,EAASwP,EAAQqQ,QAAQ7f,OAAO8f,WAElCjpB,KAAK6sD,UAAU1jD,EAAQJ,IAI3B/I,KAAK4sD,uBAAuBj0C,EAAS3Y,KAAK6qD,cAAc1hD,EAAQJ,KAG3D,KAAAkiD,YAAc,CAAC9hD,EAAgBJ,KACpC,MAAM4P,EAAU3Y,KAAKyyC,YAAYa,SAAS2Z,WAAW17C,cAAc,oCAAoCpI,iBAAsBJ,OAC7H/I,KAAKg0C,gBAAgBr7B,IAGb,KAAA0zC,kBAAoB,CAACR,EAAsBC,EAAqBC,KACxE,MAAMlrD,EAASb,KAAKa,UACpB,EAAAmN,EAAA,GAAehO,KAAKktD,kBAAkB,IAAAthD,MAAK,WAAY,CAAC/K,KACxDb,KAAKmtD,iBAAiB5sD,UAAUsD,OAAO,OAAmB,IAAXhD,GAC/Cb,KAAKotD,oBAAoB7sD,UAAUsD,OAAO,OAAQgoD,GAClD7rD,KAAKqtD,oBAAsBrtD,KAAKqtD,mBAAmB9sD,UAAUsD,OAAO,OAAQioD,IAGpE,KAAAY,kBAAoB,CAACD,EAAmB37C,KAchD,IAbA,QAAc9Q,KAAKyyC,YAAY6a,uBAAwB,eAAgBb,EAAU37C,EAAU,IAAM,GAAG,KAC9F9Q,KAAK+zC,cACP/zC,KAAKutD,mBAAmB/sD,SACxBR,KAAKutD,mBACHvtD,KAAKotD,oBACLptD,KAAKqtD,mBACL,KACFrtD,KAAKqpD,kBAAe9iD,OAIxB,QAAcvG,KAAKyyC,YAAYrxC,UAAW,eAAgBqrD,EAAU,KAEjEzsD,KAAK+zC,cACF/zC,KAAKutD,mBAAoB,CAC3B,MAAMngB,EAAa,yBACnBptC,KAAKutD,mBAAqBlsD,SAASC,cAAc,OACjDtB,KAAKutD,mBAAmBhtD,UAAUgB,IAAI6rC,EAAa,cAEnD,MAAMogB,EAAY,EAAW,SAASpgB,WAAqB,CAACh+B,UAAU,IACtEpP,KAAKwP,eAAejO,IAAIisD,EAAxBxtD,CAAmC,SAAS,IAAMA,KAAK0oD,mBAAmB,CAACvtC,MAAM,IAEjFnb,KAAKktD,iBAAmB7rD,SAASC,cAAc,OAC/CtB,KAAKktD,iBAAiB3sD,UAAUgB,IAAI6rC,EAAa,UAEjDptC,KAAKmtD,iBAAmB,EAAW,WAAW/f,UAE9C,MAAMqgB,EAAyC,CAACj+C,eAAgBxP,KAAKwP,iBACrE,QAAiBxP,KAAKmtD,kBAAkB,KACtC,MAAMhkD,EAAS,IAAInJ,KAAKgpD,aAAa0E,QAAQ,GACvC3kD,EAAM,IAAI/I,KAAKgpD,aAAat3C,IAAIvI,IAAS,GAC/CnJ,KAAK0oD,kBAEL79C,EAAA,sBAAwB,gBAAiB,CACvC1B,OAAAA,EACAJ,IAAAA,MAED0kD,GAEHztD,KAAKotD,oBAAsB,EAAW,WAAWhgB,cACjD,QAAiBptC,KAAKotD,qBAAqB,KACzC,MAAMnjD,EAAwC,GAC9C,IAAI,MAAO0jD,EAAYxjD,KAASnK,KAAKgpD,aACnC/+C,EAAI0jD,GAActjD,MAAMC,KAAKH,GAAMI,MAAK,CAACC,EAAGxF,IAAMwF,EAAIxF,IAGxD,IAAIgjD,GAAa/9C,GAAK,KACpBjK,KAAK0oD,uBAEN+E,GAEAztD,KAAK4tD,YACN5tD,KAAKqtD,mBAAqB,EAAW,iBAAiBjgB,aACtD,QAAiBptC,KAAKqtD,oBAAoB,KACxC,MAAMlkD,EAAS,IAAInJ,KAAKgpD,aAAa0E,QAAQ,GAC7C,IAAIvF,GAAoBh/C,EAAQ,IAAInJ,KAAKgpD,aAAat3C,IAAIvI,IAAU,QAAQ,KAC1EnJ,KAAK0oD,uBAEN+E,IAGLztD,KAAKutD,mBAAmBjpD,UAAU,CAChCkpD,EACAxtD,KAAKktD,iBACLltD,KAAKmtD,iBACLntD,KAAKotD,oBACLptD,KAAKqtD,oBACLvjD,OAAOa,UAET,MAAMkjD,EAAoB7tD,KAAKutD,mBAC/BM,EAAkBvqD,MAAMwqD,QAAU,IAClC9tD,KAAKyyC,YAAY6a,uBAAuBhpD,OAAOupD,GAE1CA,EAAkBnf,WACvBmf,EAAkBvqD,MAAMwqD,QAAU,KA7HtC9tD,KAAK4tD,WAAanb,EAAYnpB,WAazB6/B,gBAAgBmD,GAAmB,EAAMV,GAAiB,GAC/D,MAAM1gB,EAAMrrC,MAAMspD,gBAAgBmD,EAAkBV,GASpD,OAPG1gB,GAAOohB,GACSjiD,MAAMC,KAAKtK,KAAKyyC,YAAYphC,cAAcG,iBAAiB,uBACnEzM,SAAQ4T,IACf3Y,KAAKwrD,sBAAsB7yC,EAAS3Y,KAAK+zC,gBAItC7I,GA4GI,MAAM6iB,WAAsBhF,GAUzCppD,YAAoB09B,EAAoBzD,EAA8B75B,EAAkBkJ,GACtFpJ,MAAM,CACJoJ,mBAAAA,EACAmgD,cAAexvB,EAAQo0B,iBACvBx+C,eAAgBoqB,EAAQpqB,eACxBi6C,qBAAuBjxC,IAAW,EAAAqK,GAAA,GAAgBrK,EAAQ,kBAAmB,EAAAqK,GAAA,GAAgBrK,EAAQ,UACrG6xC,aAAc,CAAC/pD,EAAGkY,OAGHxY,KAAKgpD,aAAa9nD,OACxBZ,EAAEkY,OAAuBjY,UAAUmT,SAAS,YAC5CpT,EAAEkY,OAAuBjY,UAAUmT,SAAS,uBAC9C8E,GAIP2yC,sBAAuB,CAAC7qD,EAAGqY,EAAS4xC,MACtBjqD,EAAEkY,SAAWG,IACrBrY,EAAEkY,OAAuBjY,UAAUmT,SAAS,4BAChCnN,IAAdgkD,IACCvqD,KAAKgpD,aAAa9nD,MAGvBsoD,qBAAsB,KAAOxpD,KAAKq9B,KAAKt9B,MAAMkuD,UAC7C7D,sBAAuB,SACvBJ,6BAA8B,gBAC9BC,2BAA4B,qDAC5Bl/C,YAA2B,cAAdsyB,EAAKp9B,OA3BF,KAAAo9B,KAAAA,EAAoB,KAAAzD,QAAAA,EAA8B,KAAA75B,MAAAA,EAoE/D,KAAAi0C,gBAAmB6P,IACxB,IAAI7jD,KAAKkuD,gBAAgBrK,GAAS,OAElC,MAAM96C,GAAO86C,EAAO76B,QAAQjgB,IAG5B,GADkB86C,EAAOtjD,UAAUmT,SAAS,cAC5C,CACE,IAAI1T,KAAKmuD,wBAAwBtK,GAAS,CACxC,MAAM5+C,EAAMjF,KAAKgpD,aAAat3C,IAAI1R,KAAK45B,QAAQzwB,QAC5ClE,GACYjF,KAAKq9B,KAAK+wB,aAAarlD,GAC/BhE,SAAQgE,GAAO9D,EAAI+K,OAAOjH,KAInC/I,KAAK45B,QAAQy0B,sBAAsBxK,GAAQ9+C,QAAQ/E,KAAKg0C,sBAI1D,GAAIh0C,KAAK6sD,UAAU7sD,KAAK45B,QAAQzwB,OAAQJ,GAAxC,CAKA,GADsB86C,EAAOtjD,UAAUmT,SAAS,gBAC9B,CAChB,MAAM46C,GAAiB,EAAAzrC,GAAA,GAAgBghC,EAAQ,UACzC0K,EAAoBvuD,KAAKmuD,wBAAwBG,GACjDE,EAAwBxuD,KAAKwuD,sBAAsBzlD,IAEtCylD,GAAyBD,IAE1CvuD,KAAK4sD,uBAAuB0B,EAAgBE,GAIhDxuD,KAAK4sD,uBAAuB/I,EAAQ7jD,KAAK6qD,cAAc7qD,KAAK45B,QAAQzwB,OAAQJ,MAGpE,KAAAkiD,YAAc,CAAC9hD,EAAgBJ,KACvC,MAAM0lD,EAAUzuD,KAAK45B,QAAQ80B,iBAAiB3lD,GAC3C0lD,GACDzuD,KAAKg0C,gBAAgBya,EAAQ5K,SAgDvB,KAAA6I,kBAAoB,CAACD,EAAmB37C,KAChD,MAAM,eAAC69C,EAAc,UAAEC,EAAS,QAAEC,GAAW7uD,KAAKq9B,KAAKt9B,MAAM+uD,OAAOh+C,IAEpE,QAAc9Q,KAAKopD,cAAe,eAAgBqD,EAAU37C,EAAU,IAAM,GAAG,KACzE9Q,KAAK+zC,cACP/zC,KAAK+uD,sBAAsBvuD,SAC3BR,KAAK+uD,sBACH/uD,KAAKutD,mBACLvtD,KAAKgvD,oBACLhvD,KAAKotD,oBACLptD,KAAKqtD,mBACLrtD,KAAKivD,cACLjvD,KAAKkvD,eACL,KACFlvD,KAAKqpD,kBAAe9iD,MAUxB,MAAM4oD,EAAoBP,EAAYC,OAAUtoD,EAA6B,EAAjBooD,EAC5D,GAAG3uD,KAAK+zC,aACN,IAAI/zC,KAAKutD,mBAAoB,CAC3BvtD,KAAK+uD,sBAAwB1tD,SAASC,cAAc,OACpDtB,KAAK+uD,sBAAsBxuD,UAAUgB,IAAI,qBAAsB,qBAK/DvB,KAAKutD,mBAAqBlsD,SAASC,cAAc,OACjDtB,KAAKutD,mBAAmBhtD,UAAUgB,IAAI,uBAEtC,MAAMksD,EAAyC,CAACj+C,eAAgBxP,KAAKwP,gBAC/Dg+C,EAAY,EAAW,QAAS,CAACp+C,UAAU,KACjD,QAAiBo+C,GAAW,IAAMxtD,KAAK0oD,mBAAmB,CAACvtC,MAAM,EAAM3L,eAAgBxP,KAAKwP,iBAE5FxP,KAAKktD,iBAAmB7rD,SAASC,cAAc,OAC/CtB,KAAKktD,iBAAiB3sD,UAAUgB,IAAI,6BAEd,cAAnBvB,KAAKq9B,KAAKp9B,MACXD,KAAKgvD,qBAAsB,OAAO,2EAA4E,CAACngD,KAAM,UACrH7O,KAAKgvD,oBAAoB1qD,QAAO,IAAAsH,MAAK,yBACrC,QAAiB5L,KAAKgvD,qBAAqB,KACzC,IAAIvG,GAAazoD,KAAK45B,QAAQzwB,OAAQ,IAAInJ,KAAKgpD,aAAat3C,IAAI1R,KAAK45B,QAAQzwB,UAAU,KACrFnJ,KAAK0oD,uBAEN+E,KAEHztD,KAAKotD,qBAAsB,OAAO,oEAAqE,CAACv+C,KAAM,YAC9G7O,KAAKotD,oBAAoB9oD,QAAO,IAAAsH,MAAK,aACrC,QAAiB5L,KAAKotD,qBAAqB,KACzC,MAAMnjD,EAAwC,GAC9C,IAAI,MAAO0jD,EAAYxjD,KAASnK,KAAKgpD,aACnC/+C,EAAI0jD,GAActjD,MAAMC,KAAKH,GAAMI,MAAK,CAACC,EAAGxF,IAAMwF,EAAIxF,IAGxD,IAAIgjD,GAAa/9C,GAAK,KACpBjK,KAAK0oD,uBAEN+E,IAGLztD,KAAKqtD,oBAAqB,OAAO,0EAA2E,CAACx+C,KAAM,WACnH7O,KAAKqtD,mBAAmB/oD,QAAO,IAAAsH,MAAK,YACpC,QAAiB5L,KAAKqtD,oBAAoB,KACxC,IAAIlF,GAAoBnoD,KAAK45B,QAAQzwB,OAAQ,IAAInJ,KAAKgpD,aAAat3C,IAAI1R,KAAK45B,QAAQzwB,SAAUnJ,KAAKq9B,KAAKp9B,MAAM,KAC5GD,KAAK0oD,uBAEN+E,GAEH,MAAM5sC,EAAO7gB,KAAKivD,cAAgB5tD,SAASC,cAAc,OACzDuf,EAAKtgB,UAAUgB,IAAI,4BACnBsf,EAAKvc,OAAOkpD,EAAWxtD,KAAKktD,kBAE5B,MAAM1e,EAAQxuC,KAAKkvD,eAAiB7tD,SAASC,cAAc,OAC3DktC,EAAMjuC,UAAUgB,IAAI,6BACpBitC,EAAMlqC,UAAU,CACdtE,KAAKgvD,oBACLhvD,KAAKotD,oBACLptD,KAAKqtD,oBACLvjD,OAAOa,eAEgBpE,IAAtB4oD,IACDtuC,EAAKvd,MAAMmd,UAAY,eAAe0uC,OACtC3gB,EAAMlrC,MAAMmd,UAAY,cAAc0uC,QAGxCnvD,KAAKutD,mBAAmBjpD,OAAOuc,EAAM2tB,GAGrCxuC,KAAK+uD,sBAAsBzrD,MAAMwqD,QAAU,IAC3C9tD,KAAK+uD,sBAAsBzqD,OAAyBtE,KAAKutD,oBACzDvtD,KAAKD,MAAMqvD,eAAe9qD,OAAOtE,KAAK+uD,uBAEjC/uD,KAAK+uD,sBAAsBrgB,WAEhC1uC,KAAK+uD,sBAAsBzrD,MAAMwqD,QAAU,GAC3CjtC,EAAKvd,MAAMmd,UAAY,GACvB+tB,EAAMlrC,MAAMmd,UAAY,SAElBzgB,KAAKivD,oBAAuC1oD,IAAtB4oD,IAC9BnvD,KAAKivD,cAAc3rD,MAAMmd,UAAY,eAAe0uC,OACpDnvD,KAAKkvD,eAAe5rD,MAAMmd,UAAY,cAAc0uC,SAI9C,KAAA9C,kBAAoB,CAACR,EAAsBC,EAAqBC,MACxE,EAAA/9C,EAAA,GAAehO,KAAKktD,kBAAkB,IAAAthD,MAAK,WAAY,CAAC5L,KAAKa,YAC7Db,KAAKgvD,qBAAuBhvD,KAAKgvD,oBAAoBl4B,gBAAgB,WAAYi1B,GACjF/rD,KAAKotD,qBAAuBptD,KAAKotD,oBAAoBt2B,gBAAgB,WAAY+0B,GACjF7rD,KAAKqtD,mBAAmBv2B,gBAAgB,WAAYg1B,IAG5C,KAAA5C,kBAAoB,KAC5B,IAAI,MAAO//C,EAAQgB,KAASnK,KAAKgpD,aAC/B,IAAI,MAAMjgD,KAAOoB,EAAM,CACrB,MAAMskD,EAAUzuD,KAAK45B,QAAQ80B,iBAAiB3lD,GAC3C0lD,GAEDzuD,KAAKg0C,gBAAgBya,EAAQ5K,UAzP9B0H,eAAe1H,EAAqB1iC,GACzCA,EAAc9N,MAAM9S,UAAUgB,IAAI,0BAE/BsiD,EAAOtjD,UAAUmT,SAAS,sBAC3BmwC,EAAOtyC,cAAc,4BAA4BjN,OAAO6c,EAAc9N,OAEtExT,MAAM0rD,eAAe1H,EAAQ1iC,GAI1BgoC,gBAAgBmD,GAAmB,EAAMV,GAAiB,GAC/D,MAAM1gB,EAAMrrC,MAAMspD,gBAAgBmD,EAAkBV,GAEpD,GAAG1gB,GAAOohB,EACR,IAAI,MAAMvjD,KAAO/I,KAAK45B,QAAQA,QAAS,CACrC,MAAMiqB,EAAS7jD,KAAK45B,QAAQA,QAAQ7wB,GACpC/I,KAAKwrD,sBAAsB3H,EAAQ7jD,KAAK+zC,aAI5C,OAAO7I,EAGFsgB,sBAAsB3H,EAAqBnhC,GAChD,IAAI1iB,KAAKkuD,gBAAgBrK,GAAS,OAElC,MAAM3Y,EAAMrrC,MAAM2rD,sBAAsB3H,EAAQnhC,GAQhD,OAPGwoB,GACiB2Y,EAAOtjD,UAAUmT,SAAS,eAE1C1T,KAAK45B,QAAQy0B,sBAAsBxK,GAAQ9+C,SAAQ6C,GAAQ5H,KAAKwrD,sBAAsB5jD,EAAM8a,KAIzFwoB,EAgDFogB,0BAA0B3yC,GAC/B,MAAM02C,EAAY12C,EAAQpY,UAAUmT,SAAS,cAC7C,OAAO7T,MAAMyrD,0BAA0B3yC,MAAc02C,GAAarvD,KAAKwuD,uBAAuB71C,EAAQqQ,QAAQjgB,MAGtGolD,wBAAwBtK,GAChC,MAAMyL,EAAuBtvD,KAAK0rD,4BAA4B7H,GAC9D,OAAOyL,MAAAA,OAAoB,EAApBA,EAAsB3tC,QAGrB6sC,sBAAsBzlD,GAC9B,MAAMoB,EAAOnK,KAAKq9B,KAAK+wB,aAAarlD,GAC9BigD,EAAe7+C,EAAKL,QAAOf,GAAO/I,KAAK6qD,cAAc7qD,KAAK45B,QAAQzwB,OAAQJ,KAChF,OAAOoB,EAAKtJ,SAAWmoD,EAAanoD,OAG5B6qD,4BAA4B7H,GAgBpC,OAAOA,EAAOtjD,UAAUmT,SAAS,sBAC/BmwC,EAAOtyC,cAAc,eACrB1R,MAAM6rD,4BAA4B7H,GAG/BqK,gBAAgBrK,GACrB,QAAQA,EAAOtjD,UAAUmT,SAAS,YAC/BmwC,EAAOtjD,UAAUmT,SAAS,gBAC1BmwC,EAAOtjD,UAAUmT,SAAS,iBAC1BmwC,EAAOtjD,UAAUmT,SAAS,qB,iUE9uBjC,MAAM67C,GAQJ5vD,YACU6vD,EACA/c,GADA,KAAA+c,SAAAA,EACA,KAAA/c,YAAAA,EAmGF,KAAAgd,YAAc,KACpB5kD,EAAA,sBAAwB,gBAAiB,CACvC1B,OAAQnJ,KAAKmJ,OACbJ,IAAK/I,KAAK+I,IACV4D,SAAU3M,KAAKyyC,YAAYvpC,cAAcyD,YAIrC,KAAA+iD,eAAiB,KACpB1vD,KAAKyyC,YAAYqB,UAAUC,aAC5B,QAAmB/zC,KAAKyyC,YAAYqB,UAAUsZ,qBAE9C,IAAIpF,GAAa,CACf,CAAChoD,KAAKmJ,QAAS,CAACnJ,KAAK+I,QAKnB,KAAA4mD,cAAgB,KACtB3vD,KAAKyyC,YAAYqB,UAAUE,gBAAgBh0C,KAAKwY,SAG1C,KAAAo3C,sBAAwB,KAC9B5vD,KAAKyyC,YAAYqB,UAAU4U,mBAGrB,KAAAmH,cAAgB,KACnB7vD,KAAKyyC,YAAYqB,UAAUC,aAC5B,QAAmB/zC,KAAKyyC,YAAYqB,UAAUuZ,oBAE9C,IAAIlF,GAAoBnoD,KAAKmJ,OAAQ,CAACnJ,KAAK+I,KAAM,SAnFhD,GAAA6T,qBAGD,QAA0B4yC,GA/CLlvD,IAMrB,IAAIsH,EALD5H,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAId,IACEhI,GAAO,EAAAib,GAAA,GAAgBviB,EAAEkY,OAAQ,qBACjC,MAAMlY,IAER,GAAIsH,EAAJ,CAGA,GADGtH,aAAa+rB,YAAY/rB,EAAEme,iBAC3Bze,KAAK2Y,QAAQpY,UAAUmT,SAAS,UACjC,OAAO,EAENpT,aAAa+rB,aAAY/rB,EAAEwvD,cAAe,GAE7C9vD,KAAKwY,OAAS5Q,EACd5H,KAAKmJ,OAASvB,EAAKohB,QAAQ7f,OAAO8f,WAClCjpB,KAAK+I,KAAOnB,EAAKohB,QAAQjgB,IACzB/I,KAAK4qD,WAAanY,EAAYqB,UAAU+W,cAAc7qD,KAAKmJ,OAAQnJ,KAAK+I,KAExE/I,KAAK4hB,QAAQ7c,SAAQwZ,IACnB,IAAI4H,EAGFA,IADCnmB,KAAK4qD,aAAersC,EAAOwxC,kBAGrBxxC,EAAO7F,QAAS6F,EAAO7F,UAGhC6F,EAAO5F,QAAQpY,UAAUsD,OAAO,QAASsiB,MAG3Cve,EAAKrH,UAAUgB,IAAI,cAEnB,QAAajB,EAAGN,KAAK2Y,UACrB,QAAY3Y,KAAK2Y,SAAS,KACxB/Q,EAAKrH,UAAUC,OAAO,oBAWpBoP,OACN5P,KAAK4hB,QAAU,CAAC,CACd/S,KAAM,UACNoS,KAAM,UACNC,QAASlhB,KAAK0vD,eACdh3C,OAAQ,IAAMzP,EAAA,aAA8BA,EAAA,mBAAoCjJ,KAAKmJ,OAAQnJ,KAAK+I,OACjG,CACD8F,KAAM,UACNoS,KAAM,oCACNC,QAASlhB,KAAK0vD,eACdh3C,OAAQ,IAAM1Y,KAAK4qD,aAChB5qD,KAAKyyC,YAAYqB,UAAUsZ,oBAAoB7sD,UAAUmT,SAAS,QACrEq8C,eAAe,GACd,CACDlhD,KAAM,UACNoS,KAAM,uBACNC,QAASlhB,KAAKyvD,YACdM,eAAe,GACd,CACDlhD,KAAM,SACNoS,KAAM,yBACNC,QAASlhB,KAAK2vD,eACb,CACD9gD,KAAM,SACNoS,KAAM,kCACNC,QAASlhB,KAAK4vD,sBACdl3C,OAAQ,IAAM1Y,KAAK4qD,WACnBmF,eAAe,GACd,CACDlhD,KAAM,gBACNoS,KAAM,SACNC,QAASlhB,KAAK6vD,cACdn3C,OAAQ,IAAMzP,EAAA,mBAAoCA,EAAA,mBAAoCjJ,KAAKmJ,OAAQnJ,KAAK+I,OACvG,CACD8F,KAAM,gBACNoS,KAAM,mCACNC,QAASlhB,KAAK6vD,cACdn3C,OAAQ,IAAM1Y,KAAK4qD,aAAe5qD,KAAKyyC,YAAYqB,UAAUuZ,mBAAmB9sD,UAAUmT,SAAS,QACnGq8C,eAAe,IAGjB/vD,KAAK2Y,QAAU,GAAW3Y,KAAK4hB,SAC/B5hB,KAAK2Y,QAAQpY,UAAUgB,IAAI,qBAAsB,eACjDF,SAASuzC,eAAe,cAActwC,OAAOtE,KAAK2Y,UA+CvC,MAAMw6B,GA8DnBxzC,YAAYC,GA7DL,KAAAmQ,KAAiD,GAUhD,KAAAigD,WAAa,EAEb,KAAAvhC,cAAgB,IAAI,KACrB,KAAAoC,YAAa,UAEb,KAAAyjB,eAAwF,GACxF,KAAAV,gBAAgE,GAChE,KAAAqc,aAAyB,GAGzB,KAAA9b,UAA0B3wC,QAAQ2E,UAEjC,KAAA+nD,UAA0D,GAC1D,KAAA3hC,aAAoE,GACpE,KAAAiQ,OAAwD,GACxD,KAAA2xB,aAAc,EACd,KAAAC,WAAY,EAEZ,KAAA1oC,KAAM,EAAA2oC,EAAA,IAAO,gBAGb,KAAAC,gBAOH,GAIE,KAAAC,aAA+D,IAAIn/C,IAUnE,KAAAo/C,YAAc,EACd,KAAAC,cAAgB,EAChB,KAAAC,eAAiB,EAEjB,KAAApnC,YAAc,EAwQb,KAAAqnC,kBAAoB,KAC1B3wD,KAAKoB,UAAUb,UAAUgB,IAAI,YAGvB,KAAAqvD,gBAAkB,KACxB5wD,KAAKoB,UAAUb,UAAUC,OAAO,aAvQhC,EAAAyG,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,gBAE7BvB,KAAK6wD,kBAAoB,IAAItB,GAAkBvvD,KAAKoB,UAAWpB,MAC/DA,KAAK8zC,UAAY,IAAIkZ,GAAgBhtD,KAAMiJ,EAAA,GAE3C,MAAMqkD,EAAyBttD,KAAKstD,uBAAyBjsD,SAASC,cAAc,OACpFgsD,EAAuB/sD,UAAUgB,IAAI,+BAAgC,6BAA8B,UAEnG,MAAMuvD,EAAgB9wD,KAAK8wD,cAAgB,IAAI,KAAYxD,GAC3DwD,EAAc1vD,UAAUb,UAAUgB,IAAI,+BAEtC,MAAMmxC,EAAM1yC,KAAK0yC,IAAMrxC,SAASC,cAAc,OAC9CoxC,EAAInyC,UAAUgB,IAAI,oBAAqB,uBACvCvB,KAAK+wD,SAAWre,EAEhBoe,EAAc1vD,UAAUkD,OAAOouC,GAE/B,IAAI,MAAMY,KAAYtzC,KAAKozC,UAAW,CACpC,MAAM4d,EAAU3vD,SAASC,cAAc,OACvC0vD,EAAQzwD,UAAUgB,IAAI,4BACtB,MAAM0vD,EAAO5vD,SAASC,cAAc,QAC9BiE,EAAIlE,SAASC,cAAc,KAEjC2vD,EAAK3sD,QAAO,IAAAsH,MAAK0nC,EAASxvC,OAC1BmtD,EAAK3sD,OAAOiB,GAEZyrD,EAAQ1sD,OAAO2sD,IAEf,EAAA5vC,GAAAA,QAAO2vC,GAEPhxD,KAAK+wD,SAASzsD,OAAO0sD,GAErBhxD,KAAKuwD,aAAatrD,IAAIquC,EAASrzC,KAAMqzC,GAErCA,EAAS0d,QAAUA,EAMrB,IAAIE,EAHJlxD,KAAKqR,cAAgBhQ,SAASC,cAAc,OAC5CtB,KAAKqR,cAAc9Q,UAAUgB,IAAI,8BAA+B,kBAG7D,GAAAqb,oBACDmrC,GAAe,CACbpvC,QAAS3Y,KAAKqR,cACd07B,QAAS,CAACL,EAAOC,EAAOrsC,KACtB,MAAM6wD,EAASnxD,KAAK6P,UAAUshD,SACxBvgC,EAAWvmB,MAAMC,KAAKtK,KAAK+wD,SAASngC,UAC1C,IAAIzqB,EACJ,GAAGumC,EAAQ,GACT,IAAI,IAAInnC,EAAI4rD,EAAS,EAAG5rD,EAAIqrB,EAAS/vB,SAAU0E,EAC7C,IAAIqrB,EAASrrB,GAAGhF,UAAUmT,SAAS,QAAS,CAC1CvN,EAAMZ,EACN,YAIJ,IAAI,IAAIA,EAAI4rD,EAAS,EAAG5rD,GAAK,IAAKA,EAChC,IAAIqrB,EAASrrB,GAAGhF,UAAUmT,SAAS,QAAS,CAC1CvN,EAAMZ,EACN,WAKKgB,IAARJ,IACD+qD,ECvWG,SAAyB9vD,GACtC,MAAMod,EAAele,KACnB,EAAAohB,EAAA,GAAYphB,IAGd,IAAI8wD,EAAU,EACd,MAAMxU,EAAK,OACHwU,GACJhwD,EAAUwN,oBAAoB,YAAa4P,EAAa,CAACoR,SAAS,KAOtE,OAHAxuB,EAAUf,iBAAiB,YAAame,EAAa,CAACoR,SAAS,EAAM5Q,SAAS,IAC9E5d,EAAUf,iBAAiB,WAAYu8C,EAAI,CAACzhC,MAAM,IAE3CyhC,EDwVkByU,CAAgBrxD,KAAKqR,eACpCrR,KAAK6P,UAAU1J,OAMvB,IAAI,MAAMmtC,KAAYtzC,KAAKozC,UAAW,CACpC,MAAMhyC,EAAYC,SAASC,cAAc,OACzCF,EAAUb,UAAUgB,IAAI,0BAA4B+xC,EAASrzC,KAAM,YAEnE,MAAMqP,EAAUjO,SAASC,cAAc,OACvCgO,EAAQ/O,UAAUgB,IAAI,wBAA0B+xC,EAASrzC,MAEzDmB,EAAUkD,OAAOgL,GAEjBtP,KAAKqR,cAAc/M,OAAOlD,GAE1BpB,KAAK+P,KAAKujC,EAASjqC,aAAeiG,EAElCgkC,EAAS2Z,WAAa39C,EAGxBtP,KAAKoB,UAAUkD,OAAOgpD,EAAwBttD,KAAKqR,eAInDrR,KAAKsxD,iBAAmB,IAAIlmD,GAAY,EAAO,YAAY,GAE3DpL,KAAK4M,WAAWK,iBAAmB,KAC9BjN,KAAKszC,SAAS2Z,aAAejtD,KAAKw+B,OAAOx+B,KAAKszC,SAASjqC,cAExDrJ,KAAKwB,MAAK,IAKdxB,KAAK6P,WAAY,EAAA0hD,EAAA,GAAevxD,KAAK+wD,SAAU/wD,KAAKqR,eAAe,CAACR,EAAI2gD,EAAY1gD,KAClF,GAAG9Q,KAAKgwD,YAAcn/C,IAAO7Q,KAAKyxD,WAKhC,YAJAzxD,KAAK4M,WAAWu2B,kBAAkB,CAChCxqB,QAAS3Y,KAAKoB,UACdy3B,SAAU,UAKd,MAAM64B,EAAc1xD,KAAKozC,UAAUviC,GAChC7Q,KAAKqzC,aACNrzC,KAAKqzC,YAAYqe,GAGnB,MAAMC,EAAe3xD,KAAKszC,SAO1B,GANAtzC,KAAKszC,SAAWoe,GAEO,IAApB1xD,KAAKgwD,WAAoBl/C,GAC1B9Q,KAAK2wD,oBAGJ3wD,KAAKyxD,WACNzxD,KAAKyxD,YAAa,MACb,CACL,MAAMG,EAAY5xD,KAAKoB,UAAUwwD,UACjC,IAAI5jB,EAAYhuC,KAAK4M,WAAWohC,UAWhC,GAVGA,EAAY4jB,IACb5xD,KAAK4M,WAAWu2B,kBAAkB,CAChCxqB,QAAS3Y,KAAKoB,UACdy3B,SAAU,UAEZmV,EAAY4jB,GAGdD,EAAa1uB,OAAS,CAAC+K,UAAWA,EAAW6jB,aAAc7xD,KAAK4M,WAAWilD,mBAEjDtrD,IAAvBmrD,EAAYzuB,OAAsB,CACnC,MAAMzjB,EAAOxf,KAAKoB,UAAUqe,wBACtBqyC,EAAQ9xD,KAAKoB,UAAU6C,cAAcwb,wBACrCkW,EAAOnW,EAAKrB,EAAI2zC,EAAM3zC,EAEzB6vB,EAAYrY,IACb+7B,EAAYzuB,OAAS,CAAC+K,UAAWrY,EAAMk8B,aAAc,IAIzD,GAAGH,EAAYzuB,OAAQ,CACrB,MAAMtN,EAAOg8B,EAAa1uB,OAAO+K,UAAY0jB,EAAYzuB,OAAO+K,UAI7DrY,IAKC+7B,EAAYzE,WAAW3pD,MAAMmd,UAAY,cAAckV,UAaxC,IAApB31B,KAAKgwD,WAAqB0B,EAAYzE,WAAWlhD,mBAElD/L,KAAKwB,MAAK,GAGZxB,KAAKgwD,UAAYn/C,KAChB,KACD7Q,KAAK4M,WAAW65B,gBAGYlgC,IAAzBvG,KAAKszC,SAASrQ,SACfjjC,KAAKszC,SAAS2Z,WAAW3pD,MAAMmd,UAAY,GAC3CzgB,KAAK4M,WAAWohC,UAAYhuC,KAAKszC,SAASrQ,OAAO+K,WAGhDkjB,IACDA,IACAA,OAAe3qD,GAGjBvG,KAAK4wD,yBACJrqD,EAAWuqD,IAEd,QAAiB9wD,KAAKqR,eAAgB/Q,IACjCN,KAAK8zC,UAAUC,eAChB,EAAAryB,EAAA,GAAYphB,GACZN,KAAK8zC,UAAUE,iBAAgB,EAAAnxB,GAAA,GAAgBviB,EAAEkY,OAAQ,yBAE1D,CAACoX,SAAS,EAAM5Q,SAAS,IAE5B,MAAM+yC,EAAe,CAACzmD,EAAmB0mD,EAAyB3oD,EAAoC/I,KACpG,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAA0BlN,GAC3D,IAAIkN,EAAQ,OAEZ,MAAMzP,GAAOyP,EAAOwQ,QAAQjgB,IAC5B,IAAIA,EAEF,YADA/I,KAAK0nB,IAAIpN,KAAK,mCAAoC9B,GAIpD,MAAMrP,EAASqP,EAAOwQ,QAAQ7f,OAAO8f,WAE/Bxe,EAAWJ,MAAMC,KAAKtK,KAAK+P,KAAK1G,GAAamI,iBAAiB,IAAMwgD,IAAoCtnD,KAAI+G,IAChH,MAAMsxB,GAAc,EAAAlgB,GAAA,GAAgBpR,EAAInG,GACxC,MAAO,CACLqN,QAASlH,EACT1I,KAAMg6B,EAAY/Z,QAAQjgB,IAC1BI,OAAQ45B,EAAY/Z,QAAQ7f,OAAO8f,eAKjC9iB,EAAMsE,EAAQqO,WAAUlR,GAAQA,EAAKmB,MAAQA,GAAOnB,EAAKuB,SAAWA,IAEpEjD,EAAU+C,EAAA,mBAAoCE,EAAQJ,IAC5D,IAAIkpD,IACHjnD,iBAAiBhL,KAAKkyD,kBAAkB7oD,IACxC8oD,UAAUjsD,EAASuE,EAAQtE,GAAKwS,QAAS,GAAG,EAAOlO,EAAQ7J,MAAM,EAAGuF,GAAMsE,EAAQ7J,MAAMuF,EAAM,MAGjG,QAAiBnG,KAAK+P,KAAKqiD,8BAA+BL,EAAavpD,KAAK,KAAM,YAAa,YAAa,mCAC5G,QAAiBxI,KAAK+P,KAAKsiD,4BAA6BN,EAAavpD,KAAK,KAAM,sBAAuB,kBAAmB,gCAc1HxI,KAAKszC,SAAWtzC,KAAKozC,UAAU,IAE/B,EAAAkf,GAAA,KAAuB,KACrBtyD,KAAKyuB,cAAc8jC,UAClB,KACDvyD,KAAKyuB,cAAc+jC,sBAYhB7e,qBAAqB9mC,EAAiB5M,GAC3C,GAAY,6BAATA,EAAqC,OAAO4M,EAEnC,2BAAT5M,IACD4M,EAAWA,EAAS/C,QAAO5D,KAAaA,EAAQoQ,SAclD,IAAIo9B,EAAkB,GAEtB,OAAOzzC,GACL,IAAK,gCACH,IAAI,IAAIiG,KAAW2G,EAAU,CAC3B,IAAIyJ,EAAQpQ,EAAQoQ,MAAMjQ,OAASH,EAAQoQ,MAAMjV,UAAa6E,EAAQoQ,MAAMya,SAAW7qB,EAAQoQ,MAAMya,QAAQ1vB,SACzGiV,IAKW,aAAZA,EAAMhN,GAAmC,UAAfgN,EAAMrW,MAKnCyzC,EAAS5rC,KAAK5B,IAGhB,MAGF,IAAK,8BACH,IAAI,IAAIA,KAAW2G,EACb3G,EAAQoQ,MAAMjV,WAAY,CAAC,QAAS,QAAS,MAAO,UAAW,SAASk+B,SAASr5B,EAAQoQ,MAAMjV,SAASpB,OAI5GyzC,EAAS5rC,KAAK5B,GAEhB,MAGF,IAAK,yBAEH,IAAI,IAAIA,KAAW2G,EAEf6mC,EAAS5rC,KAAK5B,GAIlB,MAGF,IAAK,2BACH,IAAI,IAAIA,KAAW2G,EACb3G,EAAQoQ,MAAMjV,UAA4C,UAAhC6E,EAAQoQ,MAAMjV,SAASpB,MAIrDyzC,EAAS5rC,KAAK5B,GAGhB,MAGF,IAAK,2BACH,IAAI,IAAIA,KAAW2G,EACb3G,EAAQoQ,MAAMjV,UAA4C,UAAhC6E,EAAQoQ,MAAMjV,SAASpB,MAIrDyzC,EAAS5rC,KAAK5B,GAGhB,MAGF,IAAK,gCACH,IAAI,IAAIA,KAAW2G,EACb3G,EAAQoQ,MAAMjV,UAAc,CAAC,QAAS,SAAkCk+B,SAASr5B,EAAQoQ,MAAMjV,SAASpB,OAI5GyzC,EAAS5rC,KAAK5B,GAUpB,OAAOwtC,EAGD+e,oBAAmB,QAACvsD,EAAO,YAAEsH,IACnC,MAAM,OAACsH,EAAM,IAAED,GAAO,gBAA+B,CACnDC,OAAQ5O,EAAQiD,OAChB/H,UAAWoM,EAAY9B,KACvBgC,YAAY,EACZC,WAAY,KAGd,kBAAiCmH,EAAQ5O,EAAS2O,EAAK7U,KAAKkJ,cAAcuD,OAGpEimD,yBAAwB,QAACxsD,EAAO,SAAE48B,EAAQ,WAAEjS,EAAU,cAAE8hC,IAC9D,MAAMr8C,EAAQrN,EAAA,sBAAuC/C,GAE/C+qB,EAAM5vB,SAASC,cAAc,OAInC,IAAI6sB,EAHJ8C,EAAI1wB,UAAUgB,IAAI,aAIlB,MAAML,EAAOgb,EAAA,kBAAiC5F,EAAO,IAAK,KAExD6X,EADa,UAAZ7X,EAAMhN,EACG8zC,GAAU,CAClBvlC,IAAKvB,EACLpQ,QAAAA,EACA9E,UAAW6vB,EACX5C,SAAU,EACVC,UAAW,EACXG,cAAezuB,KAAKyuB,cACpBoC,WAAAA,EACA2sB,aAAa,EACbhvB,kBAAkB,EAClBivB,cAAc,EACdv8C,KAAAA,IACCytB,MAEOP,GAAU,CAClB/nB,MAAOiQ,EACPpQ,QAAAA,EACA9E,UAAW6vB,EACX5C,SAAU,EACVC,UAAW,EACXG,cAAezuB,KAAKyuB,cACpBoC,WAAAA,EACArC,kBAAkB,EAClB4C,QAAQ,EACRlwB,KAAAA,IAIJ,CAACitB,EAAQO,OAAOC,MAAOR,EAAQO,OAAOE,MAAM9kB,OAAOa,SAAS5F,SAAQg8C,IAClEA,EAAMxgD,UAAUgB,IAAI,sBAGtBuhC,EAASh7B,KAAKqmB,EAAQI,aAAaI,OAEnCgkC,EAAc7qD,KAAK,CAAC6Q,QAASsY,EAAK/qB,QAAAA,IAG5B0sD,uBAAsB,QAAC1sD,EAAO,cAAEysD,EAAa,YAAEtpD,IACrD,MAAMhI,EAAW4H,EAAA,sBAAuC/C,GAClDojB,EAAatpB,KAAKspB,YAAe,CAAC,QAAS,SAAkCiW,SAASl+B,EAASpB,MAC/FgxB,EAAM4uB,GAAa,CACvB35C,QAAAA,EACAkjB,UAAWE,EACX2D,WAAY,IACZ5D,cAAc,EACdC,WAAAA,EACApgB,cAAelJ,KAAKkyD,kBAAkB7oD,GACtColB,cAAezuB,KAAKyuB,cACpBivB,iBAAkB,IAGhB,CAAC,QAAS,QAAS,SAAkCne,SAASl+B,EAASpB,OACzEgxB,EAAI1wB,UAAUgB,IAAI,YAGpBoxD,EAAc7qD,KAAK,CAAC6Q,QAASsY,EAAK/qB,QAAAA,IAG5B2sD,kBAAiB,QAAC3sD,EAAO,SAAE48B,EAAQ,WAAEjS,EAAU,cAAE8hC,I,MACvD,IAAI5hC,EAA6D,QAAlD,EAAA7qB,EAAQoQ,aAA0C,eAAEya,QAEnE,IAAIA,EAAS,CACX,MAAM+hC,EAAS5sD,EAAQ6sD,cAAgB7sD,EAAQ6sD,cAAc1gD,MAAM/R,GAAmB,qBAARA,EAAEgJ,GAAoC,yBAARhJ,EAAEgJ,IAAgC,KAC9I,IAAI+O,EAAa26C,EAAqBC,EAEtC,GAAIH,EAUFG,EAAS/sD,EAAQA,QAAQtF,MAAMkyD,EAAOt+B,OAAQs+B,EAAOt+B,OAASs+B,EAAOjyD,YAV3D,CAEV,MAAMuV,EAAQ,aAA2BlQ,EAAQA,SACjD,IAAIkQ,EAEF,OAGFiC,EAAMjC,EAAM,GAMZiC,EADe,0BAAdy6C,MAAAA,OAAM,EAANA,EAAQxpD,GACHwpD,EAAOz6C,IAGPA,GAAO46C,EAGfD,EAAc36C,EAEd,MAAM66C,EAAOhtD,EAAQA,UAAYmS,EAC7BA,EAAIjC,MAAM,4BACZ48C,EAAc,WAAa36C,EAC3BA,EAAMA,EAAIknB,SAAS,KAAOlnB,EAAM,WAAaA,GAG/C26C,EAAc,IAAIrO,IAAIqO,GAAaG,SAEnCpiC,EAAU,CACRznB,EAAG,UACH+O,IAAAA,EACA26C,YAAAA,EACAniD,GAAI,GACJuiD,KAAM,GAGJF,IACFniC,EAAQsL,YAAcn2B,EAAQA,QAC9B6qB,EAAQsiC,aAAe,kBAA+B,EAAA5iC,GAAA,GAAavqB,EAAQA,QAAS,IAAK,OAI7F,IAAIotD,EAAajyD,SAASC,cAAc,OACxCgyD,EAAW/yD,UAAUgB,IAAI,UAAW,aAIjCwvB,EAAQ1qB,MACG+nB,GAAU,CACpBhtB,UAAWkyD,EACXptD,QAAS,KACTG,MAAO0qB,EAAQ1qB,MACfgoB,SAAU,EACVC,UAAW,EACXE,kBAAkB,EAClBC,cAAezuB,KAAKyuB,cACpBoC,WAAAA,EACA3vB,KAAMgb,EAAA,kBAAiC6U,EAAQ1qB,MAAsB,GAAI,IAAI,GAC7EkoB,aAAcuU,EACd1R,QAAQ,KAGVkiC,EAAW/yD,UAAUgB,IAAI,SACzB+xD,EAAWxtD,UAAY,oBAAkCirB,EAAQ1hB,OAAS0hB,EAAQiiC,aAAejiC,EAAQsL,aAAetL,EAAQ1Y,KAAK,IAGvI,IAAIhJ,EAAQ0hB,EAAQwiC,QAAU,GAC1BnjC,EAAWW,EAAQsiC,cAAgB,GAEvC,MAAMG,GAAmB,EAAAC,GAAA,GAAuBrjC,GAE1C5lB,GADY,EAAAipD,GAAA,GAAuB,iBAA+B1iC,EAAQ1Y,KAAO,KACnEwR,kBACpB,GAAGrf,aAAakpD,kBACd,IACElpD,EAAEwjB,UAAY2lC,mBAAmBnpD,EAAEopD,MACnC,MAAM/lD,IAKP2lD,EAAiBK,YAClBL,EAAiBlvD,OAAO,MAG1BkvD,EAAiBlvD,OAAOkG,GAErBxK,KAAKspB,YACNkqC,EAAiBlvD,OAAO,KAAM2E,EAAA,mBAAoC/C,IAGhEmJ,IAEFA,EAAQ,kBAAgC0hB,EAAQiiC,YAAYhT,MAAM,IAAK,GAAG,KAG5E,MAAMhqB,EAAM,IAAIuB,GAAI,CAClBloB,MAAAA,EACAyoB,WAAY7uB,EAAA,eAAgC/C,GAC5CkqB,SAAUojC,EACV57B,aAAa,EACbrsB,WAAW,EACX6D,UAAU,IAMZ4mB,EAAI50B,UAAUkD,OAAOgvD,GAWlBt9B,EAAI50B,UAAU4sB,UAAU9gB,OAAOrM,QAChC8xD,EAAc7qD,KAAK,CAAC6Q,QAASqd,EAAI50B,UAAW8E,QAAAA,IAInC2tC,oBAAoBhnC,EAAiBymC,EAA+BhvC,GAAS,G,0CACxF,MAAMquD,EAAwD,GACxDmB,EAA8BxgB,EAAS2Z,WACvCnqB,EAA2B,GAC3BjS,EAAa7wB,KAAK6wB,WAAWnf,MACnC,IAIIlE,EAJAnE,EAAciqC,EAASjqC,kBAErB,WAGa,kCAAhBA,GAAqDrJ,KAAKkJ,cAAcuD,MAAMS,QAC/E7D,EAAc,2BACdmE,EAAcxN,KAAKsxD,iBACnBwC,EAAexvD,OAAOkJ,EAAYpM,YACV,6BAAhBiI,IACRmE,EAAcxN,KAAKkM,aAAaW,UAGlC,MAAMjN,EAAoC,CACxC+yD,cAAAA,EACAtpD,YAAAA,EACAnD,aAASK,EACTsqB,WAAAA,EACAiS,SAAAA,EACAt1B,YAAAA,GAGF,IAAIumD,EAGJ,OAAO1qD,GACL,IAAK,2BACH0qD,EAAkB/zD,KAAKyyD,mBACvB,MAGF,IAAK,gCACHsB,EAAkB/zD,KAAK0yD,wBACvB,MAGF,IAAK,2BACL,IAAK,gCACL,IAAK,2BACL,IAAK,8BACHqB,EAAkB/zD,KAAK4yD,sBACvB,MAGF,IAAK,yBACHmB,EAAkB/zD,KAAK6yD,iBAS3B,GAAGkB,EAAiB,CAClBA,EAAkBA,EAAgBvrD,KAAKxI,MAEvC,IAAI,MAAMkG,KAAW2G,EACnB,IACEjN,EAAQsG,QAAUA,EAClB6tD,EAAgBn0D,GAChB,MAAMiO,GACN7N,KAAK0nB,IAAI3Z,MAAM,yBAA0B1E,EAAazJ,EAASsG,EAAS2H,IAa9E,GARGL,GAAeA,EAAY9B,KAAKK,mBACjCyB,EAAY1B,YAGX9L,KAAKm0C,WACNrR,EAASh7B,KAAK9H,KAAKm0C,YAGlBrR,EAASjiC,eACJ2C,QAAQC,IAAIq/B,GACdjS,KAFN,CAQA,GAAG8hC,EAAc9xD,OAAQ,CACvB,MAAMq/B,EAAS57B,EAAS,SAAW,UACnCquD,EAAc5tD,SAAQqS,IACpB,MAAM,QAACuB,EAAO,QAAEzS,GAAWkR,EACrB48C,EAAiBh0D,KAAKi0D,6BAA6Bj0D,KAAKywD,aAAevqD,EAAQ2mB,KAAO,EAAGxjB,GAC/FsP,EAAQpY,UAAUgB,IAAI,qBACtBoX,EAAQqQ,QAAQjgB,IAAM,GAAK7C,EAAQ6C,IACnC4P,EAAQqQ,QAAQ7f,OAAS,GAAKjD,EAAQiD,OACtC6qD,EAAersD,MAAMu4B,GAAQvnB,GAE1B3Y,KAAK8zC,UAAUC,aAChB/zC,KAAK8zC,UAAU0X,sBAAsB7yC,GAAS,MAMlD3Y,KAAKk0D,gBAAgC,6BAAhB7qD,EAA6C,EAAIwD,EAAShM,OAAQizD,OAInFI,gBAAgBrzD,EAAgBosD,GACtC,GAAGA,EAAY,CACb,MAAMlD,EAASkD,EAAWhpD,cAO1B,GANAoG,MAAMC,KAAKy/C,EAAOn5B,UAAUhwB,MAAM,GAAGmE,SAAQssB,IAC3CA,EAAM7wB,aAKJK,IAAWosD,EAAWlhD,kBAAmB,CAC3C,MAAMklB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAIjD,UAAY,kCAChBiD,EAAI1wB,UAAUgB,IAAI,kBAAmB,cAAe,gBAAiB,aAErEwoD,EAAOzlD,OAAO2sB,KAKZkjC,YACN,MAAMn1B,EAA+B,IAAIt5B,IACnCmrB,EAAa7wB,KAAK6wB,WAAWnf,MAEnC,IAAI,IAAInM,KAAKvF,KAAKkM,aAAc,CAC9B,MAAMglB,EAAQlxB,KAAKkM,aAAa3G,GAChCvF,KAAK+P,KAAKqkD,yBAAyB9vD,OAAO4sB,EAAM9vB,WAChD8vB,EAAMrlB,QAGR,MAAMY,EAAQzM,KAAKkJ,cAAcuD,MACjC,GAAGA,EAAO,CACR,MAAM6vC,EAAa,CAAC/Z,EAAmBrR,EAAoBmjC,GAAmB,KAC5E9xB,EAAQx9B,SAASoE,IACf,GAAG61B,EAAgBn1B,IAAIV,GACrB,OAGF61B,EAAgBz9B,IAAI4H,GAEpB,MAAMw8B,EAAOvpB,EAAA,UAAwBjT,IAI/B,IAAC0L,GAAO,gBAA+B,CAC3CC,OAAQ3L,EACR/H,UAAW8vB,EAAMxlB,KACjBgC,YAAY,EACZC,WAAY,GACZnC,WAAY0lB,EAAM1lB,aAGpB,GAAG6oD,IAAqB1uB,EAAK2uB,oBAAsB3uB,EAAK/C,cAAe,CACrE,MAAM2xB,EAAS,IAAIC,OAAO,KAAI,EAAAC,GAAA,GAAahoD,OAAU,EAAAgoD,GAAA,IAAa,EAAAC,GAAA,IAAgBjoD,OAAY,MAC9FoI,EAAI8/C,UAAU7uD,UAAY+O,EAAI8/C,UAAU7uD,UAAUnF,QAAQ4zD,EAAQ,aAClE1/C,EAAIG,gBAAgB1Q,OAAOs5B,EAAA,6BAAuCz0B,EAAOoyB,kBACpE,GAAGpyB,IAAW0B,EAAA,aACnBgK,EAAIG,gBAAgB1Q,QAAO,IAAAsH,MAAK,0BAC3B,CACL,IAAIwvB,EAAWhf,EAAA,kBAAgCjT,GAC/C,GAAIiyB,EAMFA,EAAW,IAAMA,MANL,CACZ,MAAM6O,EAAOh1B,EAAA,UAAwB9L,GAClC8gC,GAAQA,EAAKU,QACdvP,EAAW,KAAM,EAAAw5B,GAAA,GAAkB3qB,EAAKU,OAAOkqB,WAMnDhgD,EAAIG,gBAAgBlP,UAAY,MAAQs1B,EAAW,WAIvDlK,EAAMrtB,UAGF8pB,EAAamnC,IACjB,GAAIjkC,IAMJ,OAAOikC,GAGT,OAAOtxD,QAAQC,IAAI,CACjBwR,EAAA,qBAAmCxI,GAAO,GACzC1K,KAAK4rB,GACL5rB,MAAMigC,IACFA,GACDsa,EAAWta,EAAUhiC,KAAKkM,aAAa81B,UAAU,MAIrD/sB,EAAA,iBAA+BxI,EAAO,IACrC1K,KAAK4rB,GACL5rB,MAAMigC,IACL,GAAGA,IACDsa,EAAWta,EAASM,WAAYtiC,KAAKkM,aAAa81B,UAAU,GAC5Dsa,EAAWta,EAASO,QAA4EviC,KAAKkM,aAAa6oD,gBAElH/0D,KAAKkM,aAAa6oD,eAAe3zD,UAAUb,UAAUgB,IAAI,YAEtDvB,KAAKkM,aAAa6oD,eAAeppD,OAAOorC,mBAAqB/2C,KAAKkM,aAAa6oD,eAAeppD,OAAOke,mBACtG7pB,KAAKkM,aAAa6oD,eAAeppD,OAAOorC,iBAAiBv2C,SAGxDR,KAAKkM,aAAa6oD,eAAerpD,KAAKK,kBAAoB,GAAG,CAC9D,MAAM+qC,EAAWz1C,SAASC,cAAc,OACxCw1C,EAASv2C,UAAUgB,IAAI,2BACvB,MAAMyzD,EAAc,IAAI,sBAAiB,CACvC7kD,IAAK,uBAEP2mC,EAASxyC,OAAO0wD,EAAYr8C,SAC5B3Y,KAAKkM,aAAa6oD,eAAeppD,OAAOrH,OAAOwyC,IAC/C,QAAiBA,GAAU,KACzB,MAAMme,EAAUj1D,KAAKkM,aAAa6oD,eAAe3zD,UAAUb,UAAUsD,OAAO,YAC5EmxD,EAAY7kD,IAAM8kD,EAAU,qBAAuB,qBACnDD,EAAYnvB,gBAMpB58B,EAAA,mBAAoCwD,EAAO,EAAG,GAAI,GAAGpE,QACpDtG,KAAK4rB,GACL5rB,MAAKrB,IACDA,GACD47C,EAAW57C,EAAM2gC,QAAQ32B,KAAIk3B,GAAKA,EAAEz4B,SAASnJ,KAAKkM,aAAa81B,UAAU,QAI1E,GAAIhiC,KAAKkJ,cAAcC,QAAWnJ,KAAKkJ,cAAcgsD,QA0DrD,OAAO1xD,QAAQ2E,UA1D+C,CACnE,MAAMgtD,EAAqB,CAACrpD,GAAY,IAC/ButB,EAAA,mBAA2Bt3B,MAAKu3B,IACjCzI,MAIJ7wB,KAAKkM,aAAakpD,OAAO1pD,KAAK5F,UAAY,GAE1CwzB,EAAM+7B,aAAaz0D,MAAM,EAAG,IAAImE,SAAQoE,IACtC,IAAI,OAAC2L,EAAM,IAAED,GAAO,gBAA+B,CACjDC,OAAQ3L,EACR/H,UAAWpB,KAAKkM,aAAakpD,OAAO1pD,KACpCgC,YAAY,EACZE,WAAW,EACXD,WAAY,GACZnC,YAAY,IAGdqJ,EAAIG,gBAAgB1Q,OAAO6E,EAAO+4B,SAAWjtB,EAAA,sBAAoC9L,GAAUy0B,EAAA,6BAAuCz0B,EAAOoyB,gBAGvIjC,EAAM+7B,aAAax0D,OAEbiL,GACR9L,KAAKkM,aAAakpD,OAAOtpD,YAFzB9L,KAAKkM,aAAakpD,OAAOvpD,YAO/B,OAAOrI,QAAQC,IAAI,CACjBwR,EAAA,cAA4B,kBAAkBlT,MAAKuzD,IACjD,IAAIzkC,IAAc,OAElB,MAAM1qB,EAAMmvD,EAAMx8C,WAAU6sB,GAAQA,EAAK90B,KAAOhG,EAAA,gBACpC,IAAT1E,IACDmvD,EAAQA,EAAM10D,SACR0F,OAAOH,EAAK,GAGjBmvD,EAAMz0D,QACPy0D,EAAMvwD,SAAS4gC,IACb,gBAA+B,CAC7B7wB,OAAQ6wB,EAAK90B,GACbzP,UAAWpB,KAAKkM,aAAaqpD,OAAO7pD,KACpCgC,YAAY,EACZ8nD,eAAe,EACf7nD,WAAY,GACZnC,YAAY,OAKlBxL,KAAKkM,aAAaqpD,OAAOzpD,eAG3BqpD,OAKEM,YAAYniB,GAClB,MAAMziC,EAAK7Q,KAAKkJ,cAAcC,OAAOoyB,WAC/B1K,EAAa7wB,KAAK6wB,WAAWnf,MACnC,IAAIrJ,EAEJ,MAAMqtD,EAA2B9yB,GAA2D,mCACvF5iC,KAAKm0C,kBACAn0C,KAAKm0C,WAEPtjB,OAKF7wB,KAAK21D,cACP31D,KAAK21D,YAAc,IAAItO,GAAe,CAAC54B,cAAezuB,KAAKyuB,cAAe1Z,eAAe,KACzF,QAAiB/U,KAAK21D,YAAYjqD,MAAOpL,IACvC,MAAMigC,GAAK,EAAAgF,GAAA,GAAUjlC,EAAEkY,OAAQ,MAC/B,IAAI+nB,EACF,OAGF,MAAMp3B,EAASo3B,EAAGvX,QAAQ7f,OAAO8f,WACjC,IAAI5gB,EAAwB7E,QAAQ2E,UACjC4iB,EAAA,cACD1iB,EAAU,kBAA8B,IAG1CA,EAAQtG,MAAK,KACX,gBAA0B,CAACoH,OAAAA,UAG/BmqC,EAAS2Z,WAAW3oD,OAAOtE,KAAK21D,YAAYjqD,MAC5C1L,KAAKk0D,gBAAgB,EAAG5gB,EAAS2Z,aAGnCrqB,EAAa79B,SAAQ89B,IACnB,MAAM15B,EAAS2K,EAAA,uBAAqC+uB,GACjD15B,EAAO65B,aAIG/tB,EAAA,UAAwB9L,GAC7B6R,OAAOilB,SAIfjgC,KAAK21D,YAAYp0D,IAAI4H,UAIzB,GAAG2K,EAAA,YAA0BjD,GAAK,CAChC,MAAM+kD,EAAc51D,KAAK21D,YAAmB,IAAL,GACvCttD,EAAUu1B,EAAA,+BAAyC/sB,OAAItK,EAAWqvD,EAAY51D,KAAKkwD,UAAU5c,EAASjqC,cAActH,MAAK6gC,IACvH,IAAI/R,IACF,OAGF,IAAInlB,EAAO4nC,EAAS2Z,WAAWpjC,kBAO/B,OANA7pB,KAAKkwD,UAAU5c,EAASjqC,cAAgBqC,EAAOA,EAAKK,kBAAoB,GAAK62B,EAAaA,aAAa/hC,OAEpG+hC,EAAaA,aAAa/hC,OAAS+0D,IACpC51D,KAAKw+B,OAAO8U,EAASjqC,cAAe,GAG/BqsD,EAAmB9yB,EAAaA,sBAGzCv6B,EAAU7E,QAAQ2E,QAAQy1B,EAAA,oBAA8B/sB,IAAK9O,MAAKw7B,IAChE,IAAI1M,IACF,OAIF7wB,KAAKw+B,OAAO8U,EAASjqC,cAAe,EACpC,MAAMu5B,EAAgBrF,EAA+BqF,aACrD,MAAsB,8BAAnBA,EAAat5B,EAITosD,EAAmB9yB,EAAaA,mBAJvC,KAQJ,OAAO5iC,KAAKuuB,aAAa+kB,EAASjqC,aAAehB,EAAQid,SAAQ,KAC3DuL,MAIJ7wB,KAAKuuB,aAAa+kB,EAASjqC,aAAe,SAItCwsD,SAASviB,EAA+BmB,EAAmB5tC,EAAmBgqB,G,QACpF,MAAM5wB,EAAOqzC,EAASjqC,YAEtB,GAAGrJ,KAAKuuB,aAAatuB,GACnB,OAAOD,KAAKuuB,aAAatuB,GAG3B,GAAqB,YAAlBqzC,EAASrzC,KACV,OAAOD,KAAKy1D,YAAYniB,GAG1B,MAAMrtC,EAAmC,QAAzB,EAAAjG,KAAKs0C,eAAer0C,UAAK,QAAKD,KAAKs0C,eAAer0C,GAAQ,GAE1E,KAAY,6BAATA,GAAwCgG,EAAQpF,SAC7Cb,KAAKmwD,cACPnwD,KAAKm0D,YACLn0D,KAAKmwD,aAAc,GAGjBnwD,KAAKkJ,cAAcuD,MAAMS,QAAWlN,KAAKkJ,cAAcC,QAAWnJ,KAAKkJ,cAAcgsD,UAEvF,OADAl1D,KAAKw+B,OAAOv+B,IAAQ,EACbuD,QAAQ2E,UAInB,MAAM2tD,EAAS,SAAW71D,EAAO,MAGjC,GAAGgG,EAAQpF,QAAUb,KAAK4zC,gBAAgB3zC,GAAQgG,EAAQpF,SAAW4zC,EAAU,CAC7E,IAAI5nC,EAAkB,GAClBkpD,EAAO/yD,KAAKH,IAAI,EAAG7C,KAAK4zC,gBAAgB3zC,IACxC+1D,EAAe,EAEnB,EAAG,CACD,IAAIC,EAAMhwD,EAAQrF,MAAMm1D,EAAMA,EAAOlvD,GAErCkvD,GAAQE,EAAIp1D,OACZm1D,GAAgBC,EAAIp1D,OAEpBgM,EAAS/E,QAAQ9H,KAAK2zC,qBAAqBsiB,EAAIvrD,KAAImlC,GAAK5mC,EAAA,mBAAoC4mC,EAAE1mC,OAAQ0mC,EAAE9mC,OAAO9I,UACzG+1D,EAAenvD,GAAakvD,EAAO9vD,EAAQpF,QAWjD,OAFFb,KAAK4zC,gBAAgB3zC,GAAQ81D,EAEpB/1D,KAAK6zC,oBAAoBhnC,EAAUymC,GAAUhuB,SAAQ,KAC1DlY,YAAW,KACTpN,KAAK4M,WAAW8xB,qBACf,MAOT,IAAI51B,EAAQ7C,EAAQpF,OAASoF,EAAQA,EAAQpF,OAAS,GAAGkI,IAAM,EAK/D,OAAO/I,KAAKuuB,aAAatuB,GAAQgJ,EAAA,YAA6B,OAAD,wBACxDjJ,KAAKkJ,eAAa,CACrBG,YAAa,CAACC,EAAGrJ,GACjB6I,MAAAA,EACAM,MAAOvC,EACP2C,SAA8B,QAApB,EAAAxJ,KAAKkwD,UAAUjwD,UAAK,QAAKD,KAAKkwD,UAAUjwD,GAAQ,KACzD8B,MAAKrB,IAKN,GAJAuF,EAAQ6B,QAAQpH,EAAMuF,QAAQyE,KAAImlC,IAAK,CAAE9mC,IAAK8mC,EAAE9mC,IAAKI,OAAQ0mC,EAAE1mC,YAE/DnJ,KAAK0nB,IAAIouC,EAAS,wBAAyB71D,EAAMS,GAE7CmwB,IAcJ,OARGnwB,EAAMuF,QAAQpF,OAASgG,QAA8CN,IAAhCvG,KAAKkJ,cAAcgB,WAA2BxJ,EAAM6I,WAAc7I,EAAMuF,QAAQpF,SAAWH,EAAM8F,SAGvIxG,KAAKw+B,OAAOv+B,IAAQ,GAGtBD,KAAKkwD,UAAUjwD,GAAQS,EAAM6I,UAE1BkrC,EACMjxC,QAAQ2E,WAGjBnI,KAAK4zC,gBAAgB3zC,GAAQgG,EAAQpF,OAEjCb,KAAKw+B,OAAOv+B,KACbD,KAAKuuB,aAAatuB,IAASuD,QAAQ2E,WAAWpG,MAAK,KAClDqL,YAAW,KACT,GAAIyjB,KAED7wB,KAAKszC,WAAaA,EAAU,CAC7B,MAAMjrC,EAAUrI,KAAKwB,MAAK,GAAM,GAC7B6G,GACDA,EAAQtG,MAAK,KACP8uB,KAEJzjB,YAAW,KACTpN,KAAK4M,WAAW8xB,qBACf,SAIR,MAKE1+B,KAAK6zC,oBAAoB7zC,KAAK2zC,qBAAqBjzC,EAAMuF,QAAShG,GAAOqzC,OAEjFrlC,OAAMJ,IACP7N,KAAK0nB,IAAI3Z,MAAM,cAAeF,MAC7ByX,SAAQ,KACTtlB,KAAKuuB,aAAatuB,GAAQ,QAIjBuB,KAAKgzC,GAAS,EAAOC,GAAW,G,0CAO3C,MAAMtrC,EAASnJ,KAAKkJ,cAAcC,OAClCnJ,KAAK0nB,IAAI,OAAQ8sB,EAAQrrC,EAAQnJ,KAAKuuB,cACtC,MAAMsC,EAAa7wB,KAAK6wB,WAAWnf,MAEnC,GAAG1R,KAAKowD,UAAW,CACjB,GAAGpwD,KAAK0wD,cAAe,CACrB,MAAMtd,EAAYpzC,KAAKozC,UAAUtpC,QAAOwpC,GAAqC,6BAAzBA,EAASjqC,cACvD6sD,EAAU9iB,EAAU1oC,KAAI4oC,IAAY,CAAEhqC,EAAGgqC,EAASjqC,gBAElD8sD,QAAiBltD,EAAA,oBAAqCE,EAAQ+sD,GACpE,IAAIrlC,IACF,OAGF,GAAG7wB,KAAKm0C,kBACAn0C,KAAKm0C,WAEPtjB,KACF,OAIJ,IAAIulC,EACA5vD,EAAQ,EACZ4sC,EAAUruC,SAAQuuC,IAChB,MAAM+iB,EAAUF,EAAS9jD,MAAK4lB,GAAKA,EAAEnuB,OAAOR,IAAMgqC,EAASjqC,cAE3DiqC,EAAS0d,QAAQzwD,UAAUsD,OAAO,QAASwyD,EAAQ7vD,OACnD8sC,EAAS0d,QAAQzwD,UAAUC,OAAO,UAG/B61D,EAAQ7vD,YAA2BD,IAAlB6vD,IAClBA,EAAgB9iB,GAGf+iB,EAAQ7vD,SAASA,KAGtB,MAAM8vD,EAAat2D,KAAKuwD,aAAa7+C,IAAI,WACnCuiC,EAAiBj0C,KAAKi0C,iBAC5BqiB,EAAWtF,QAAQzwD,UAAUsD,OAAO,QAASowC,GAE1CA,IACDmiB,EAAgBE,GAGlBt2D,KAAKoB,UAAUb,UAAUsD,OAAO,QAASuyD,GACzCp2D,KAAKoB,UAAU6C,cAAc1D,UAAUsD,OAAO,gBAAiBuyD,GAC5DA,IACDp2D,KAAKyxD,YAAa,EAClBzxD,KAAK6P,UAAU7P,KAAKozC,UAAUnzB,QAAQm2C,IAAgB,GACtDA,EAAcpF,QAAQzwD,UAAUgB,IAAI,UAEpCvB,KAAKstD,uBAAuB/sD,UAAUsD,OAAO,OAAQ2C,GAAS,IAIlExG,KAAKowD,WAAY,EAGnB,IAAImG,EAAS/hB,EAAS,CAACx0C,KAAKszC,UAAYtzC,KAAKozC,UAAUtpC,QAAOwI,GAAKA,IAAMtS,KAAKszC,WAU9E,GATAijB,EAASA,EAAOzsD,QAAOwpC,IACrB,MAAMjqC,EAAciqC,EAASjqC,YAC7B,OAAQrJ,KAAKw+B,OAAOn1B,IAAiBrJ,KAAKs0C,eAAejrC,IAAgBrJ,KAAK4zC,gBAAgBvqC,GAAerJ,KAAKs0C,eAAejrC,GAAaxI,UAG7IsI,EAAO+4B,UACRq0B,EAAO50B,eAAc2R,GAA8B,YAAlBA,EAASrzC,QAGxCs2D,EAAO11D,OACT,OAGF,MAAMgG,EAAY4tC,EAAW,GAAKzxC,KAAKE,MAAsC,GAA/Bs+B,GAAA,SAAoB,IAAM,GAAS,MAE3EsB,EAA2ByzB,EAAO7rD,KAAI4oC,GACnCtzC,KAAK61D,SAASviB,EAAUmB,EAAU5tC,EAAWgqB,KAGtD,OAAOrtB,QAAQC,IAAIq/B,GAAU70B,OAAMJ,IACjC7N,KAAK0nB,IAAI3Z,MAAM,2BAA4BF,SAIxComD,6BAA6BuC,EAAmBv2D,G,MACrD,MAAM4sB,EAAO,IAAIwtB,KAAiB,IAAZmc,GACtB3pC,EAAK4pC,SAAS,EAAG,EAAG,GACpB5pC,EAAK6pC,QAAQ,GACb,MAAMC,EAAgB9pC,EAAK+pC,UACrBC,EAAuC,QAA1B,EAAA72D,KAAKswD,gBAAgBrwD,UAAK,QAAKD,KAAKswD,gBAAgBrwD,GAAQ,GAC/E,KAAK02D,KAAiBE,GAAa,CACjC,MAAMz1D,EAAYC,SAASC,cAAc,OACzCF,EAAUkK,UAAY,qBAEtB,MAAMxH,EAAOzC,SAASC,cAAc,OACpCwC,EAAKvD,UAAUgB,IAAI,2BAEnB,MAAM3B,EAAsC,CAC1Ck3D,MAAO,QAGNjqC,EAAKkqC,iBAAkB,IAAI1c,MAAO0c,gBACnCn3D,EAAQo3D,KAAO,WAGjB,MAAMC,EAAc,IAAI,0BAAqB,CAC3CpqC,KAAAA,EACAjtB,QAAAA,IACC+Y,QACH7U,EAAKQ,OAAO2yD,GAEZ71D,EAAUkD,OAAOR,GAEjB,MAAM6D,EAAQtG,SAASC,cAAc,OACrCqG,EAAMpH,UAAUgB,IAAI,4BAEpBH,EAAUkD,OAAOR,EAAM6D,GAEvB,MAAMuvD,GAAiB,EAAAC,GAAA,GAAqBN,EAAY,QACxD,IAAItxD,EAAI,EACR,KAAMA,EAAI2xD,EAAer2D,UAEpB81D,EADOO,EAAe3xD,MADQA,GAOnCsxD,EAAWF,GAAiB,CAACv1D,UAAAA,EAAWuG,MAAAA,GACxCq+C,GAAuB5kD,EAAWpB,KAAK+P,KAAK9P,GAAOsF,GAGrD,OAAOsxD,EAAWF,GAGb1iB,iBACL,OAAOj0C,KAAKkJ,cAAcC,OAAO65B,cAAgBlvB,EAAA,cAA4B9T,KAAKkJ,cAAcC,OAAOoyB,aAAeznB,EAAA,YAA0B9T,KAAKkJ,cAAcC,OAAOoyB,WAAY,qBAGjLpwB,UACLnL,KAAKuuB,aAAe,GACpBvuB,KAAKw+B,OAAS,GACdx+B,KAAKmwD,aAAc,EACnBnwD,KAAKkwD,UAAY,GACjBlwD,KAAKowD,WAAY,EAEjBpwD,KAAKyuB,cAAc5iB,QAEnB7L,KAAKozC,UAAUruC,SAAQuuC,IACrBtzC,KAAK4zC,gBAAgBN,EAASjqC,cAAgB,KAG7CrJ,KAAK8zC,UAAUC,aAChB/zC,KAAK8zC,UAAU4U,kBAUjB1oD,KAAK6wB,WAAWxX,QAChBrZ,KAAK6yC,uBACL7yC,KAAK21D,iBAAcpvD,EAGdssC,uBACL7yC,KAAKozC,UAAUruC,SAAQuuC,IACrBA,EAASrQ,YAAS18B,KAIf0qC,YAAYmmB,GAAU,GACxBp3D,KAAKiwD,aAAapvD,SACnBb,KAAKiwD,aAAalrD,SAAQsT,IACxBssC,IAAI0S,gBAAgBh/C,MAEtBrY,KAAKiwD,aAAapvD,OAAS,GAG7Bb,KAAKozC,UAAUruC,SAASmM,IAStB,GARAA,EAAI+7C,WAAWnnD,UAAY,GAExB9F,KAAK0wD,gBAEN1wD,KAAKoB,UAAUb,UAAUgB,IAAI,QAC7BvB,KAAKoB,UAAU6C,cAAc1D,UAAUgB,IAAI,iBAG7B,UAAb2P,EAAIjR,OAIHD,KAAKs0C,eAAepjC,EAAI7H,aAAc,CACxC,MAAM0gD,EAAS74C,EAAI+7C,WAAWhpD,cAExB8lD,EAAOx4C,cAAc,gBACvB,QAAaw4C,GAAQ,GAIzB,MAAMnB,EAAQmB,EAAOx4C,cAAc,kBAChCq3C,GACDA,EAAMpoD,aAiBZR,KAAKswD,gBAAkB,GACvBtwD,KAAKsxD,iBAAiBzlD,QACtB7L,KAAK4M,WAAWohC,UAAY,EActBkkB,kBAAkBoF,GACxB,MAAMrsD,GAAU,EAAAiS,GAAA,GAAKld,KAAKkJ,eAG1B,OAFA+B,EAAQ5B,YAAc,CAACC,EAAGguD,GAC1BrsD,EAAQzB,SAAWxJ,KAAKkwD,UAAUoH,GAC3BrsD,EAGFopC,UAAS,OAAClrC,EAAM,MAAEsD,EAAK,SAAEE,EAAQ,eAAE2nC,EAAc,SAAEpqC,EAAQ,QAAEgrD,EAAO,QAAEqC,IAS3Ev3D,KAAKkJ,cAAgB,CACnBC,OAAAA,EACAsD,MAAOA,GAAS,GAChBpD,YAAa,CAACC,EAAGtJ,KAAKszC,SAASjqC,aAC/BsD,SAAAA,EACAzC,SAAAA,EACAgrD,QAAAA,EACAqC,QAAAA,GAGFv3D,KAAKs0C,eAAiBA,MAAAA,EAAAA,EAAkB,GAExCt0C,KAAKmL,W,IE9nDGqsD,G,uBAAZ,SAAYA,GACV,6BACA,2BACA,uBAHF,CAAYA,KAAAA,GAAW,KA6GvB,MAAMC,GAAoB,IAvGnB,MAKL93D,cAJQ,KAAA+3D,QAEH,GAGH7sD,EAAA,mCAAqC,CACnC8sD,cAAgB9xB,IACd,MAAM11B,EAAM01B,EAAO11B,IAAI7G,EACvBtJ,KAAK03D,QAAQvnD,GAAO01B,EAAO+xB,MAC3B/sD,EAAA,sBAAwB,iBAAkBg7B,MAKzCgyB,WAAWC,EAAgCF,GAChD,OAAO,eAAqB,qBAAsB,CAChDznD,IAAK,CACH7G,EAAGwuD,GAELF,MAAAA,IACC71D,MAAKg2D,IACN9iD,EAAA,eAA6B8iD,EAAaC,OAC1ClkD,EAAA,eAA6BikD,EAAaE,OAE1CC,GAAA,qBAAqC,CACnC5uD,EAAG,gBACH6G,IAAK,CACH7G,GAAG,EAAA6uD,GAAA,GAAqBL,IAE1BF,MAAOA,EAAMltD,KAAI0tD,IACf,MAAMC,EAAoB,GAG1B,OAFA39C,OAAO49C,OAAOD,EAAMD,GACpBC,EAAK/uD,GAAI,EAAA6uD,GAAA,GAAqBE,EAAK/uD,GAC5B+uD,OAMJN,EAAaH,SAIjBW,WAAWT,GAChB,MAAMU,GAA8B,EAAAL,GAAA,GAAqBL,GACnDF,EAAQ53D,KAAK03D,QAAQc,GAC3B,OAAGZ,EACMp0D,QAAQ2E,QAAQyvD,GAGlB53D,KAAK03D,QAAQc,GAAc,eAAqB,qBAAsB,CAC3EroD,IAAK,CACH7G,EAAGwuD,KAEJ/1D,MAAKg2D,IACN9iD,EAAA,eAA6B8iD,EAAaC,OAC1ClkD,EAAA,eAA6BikD,EAAaE,OAInCj4D,KAAK03D,QAAQc,GAAcT,EAAaH,SAI5Ca,uBAAuBb,GAC5B,MAAMc,EAAuB,GAG7B,IAAIC,EAAoB,CAACX,MAAO,GAAIC,MAAO,IAAKW,EAAuB,CAACZ,MAAO,GAAIC,MAAO,IA8B1F,OA7BAL,EAAM7yD,SAAQszD,IACZ,OAAOA,EAAK/uD,GACV,IAAK,uBACHovD,EAAM5wD,KAAK,GACX,MACF,IAAK,0BACH4wD,EAAM5wD,KAAK,GACX,MACF,IAAK,4BACH4wD,EAAM5wD,KAAK,GACX,MAIF,IAAK,oCACH6wD,EAAWV,MAAMnwD,QAAQuwD,EAAKJ,OAC9B,MACF,IAAK,yBACHU,EAAWX,MAAMlwD,QAAQuwD,EAAKL,OAC9B,MACF,IAAK,uCACHY,EAAcX,MAAMnwD,QAAQuwD,EAAKJ,OACjC,MACF,IAAK,4BACHW,EAAcZ,MAAMlwD,QAAQuwD,EAAKL,WAKhC,CAAC/3D,KAAMy4D,EAAM,GAAIE,cAAAA,EAAeD,WAAAA,KAK3C,wBAAmClB,GACnC,YC3Ge,MAAMoB,GAiBnBl5D,YAAmBC,GAAA,KAAAA,QAAAA,EA8KX,KAAAk5D,cAAiBp4D,IACvBA,GAASA,EACTV,KAAKC,KAAOS,EAEZ,MAAMm9B,EAAU79B,KAAKJ,QAAQm5D,SAAS/4D,KAAKC,MACrC+4D,EAAiBh5D,KAAKi5D,aAAap7B,QACrCA,GAGF,IAAAnE,OAAMs/B,EAAgBn7B,GAFtBm7B,EAAelzD,UAAY,GAI7BkzD,EAAez4D,UAAUsD,OAAO,QAASg6B,GAEtC79B,KAAKk5D,aACNl5D,KAAKk5D,WAAWxnD,IAAI,SAASskB,IAAI50B,UAAUb,UAAUsD,OAAO,OAAQ7D,KAAKC,OAASu3D,GAAY2B,WAC9Fn5D,KAAKk5D,WAAWxnD,IAAI,YAAYskB,IAAI50B,UAAUb,UAAUsD,OAAO,OAAQ7D,KAAKC,OAASu3D,GAAY4B,SAGnGp5D,KAAKJ,QAAQk5D,eAAiB94D,KAAKJ,QAAQk5D,cAAcp4D,IArLtDd,EAAQm5D,UACTn5D,EAAQm5D,SAASnyD,UAGnB5G,KAAKi5D,aAAe,IAAI/lD,GAAe,CAACpP,KAAMlE,EAAQyP,MAAOwuB,SAAS,IAEtE79B,KAAKq5D,UAAY,IAAIjoD,IAErB,IAAIkS,EAAsD,CAAC,CACzDrjB,KAAMu3D,GAAY2B,UAClB1/B,QAAS,sCACR,CACDx5B,KAAMu3D,GAAY8B,SAClB7/B,QAAS,wCACR,CACDx5B,KAAMu3D,GAAY4B,OAClB3/B,QAAS,qCAGR75B,EAAQ25D,YACTj2C,EAAIA,EAAExZ,QAAOwZ,IAAM1jB,EAAQ25D,UAAUh6B,SAASjc,EAAErjB,SAGlD,MAAM+8B,GAAS,UACf1Z,EAAEve,SAAQ,EAAE9E,KAAAA,EAAMw5B,QAAAA,MAChB,MAAMzD,EAAM,IAAIuB,GAAI,CAClBE,WAAY,IAAIyB,GAAW,CACzBO,QAAAA,EACA31B,KAAMk5B,EACNt8B,MAAO,GAAKT,MAIhBD,KAAKq5D,UAAUp0D,IAAIhF,EAAM+1B,MAG3B,MAAMsB,EAAOgB,GAAkB,IAAIt4B,KAAKq5D,UAAU71B,UAAWxjC,KAAK84D,eAOlE,GALA94D,KAAKi5D,aAAa3pD,QAAQhL,OAAOgzB,GAC9B13B,EAAQmhC,UACTnhC,EAAQmhC,SAASz8B,OAAOtE,KAAKi5D,aAAa73D,YAGxCxB,EAAQ45D,aAAc,CACxB,MAAMp4D,EAAYq4D,GAAgB75D,EAAQmhC,SAAU,oBAAqB,sCAEzE/gC,KAAKk5D,WAAa,IAAI9nD,IAAI,CAAC,CACzB,WACA,CACE4mB,aAAcp4B,EAAQ85D,eAAe,GACrCvpD,IAAK,WACL6lB,IAAK,KACLnnB,KAAM,aACN6oB,gBAAiB,qCACjBnsB,WAAW,IAEZ,CACD,QACA,CACEysB,aAAcp4B,EAAQ85D,eAAe,GACrCvpD,IAAK,QACL6lB,IAAK,KACLnnB,KAAM,UACN6oB,gBAAiB,qCACjBnsB,WAAW,MAIfvL,KAAKk5D,WAAWn0D,SAAS40D,IACvBA,EAAU3jC,IAAM,IAAIuB,GAAIoiC,GAExBA,EAAU3jC,IAAI50B,UAAUf,iBAAiB,SAAS,KAChDgI,EAAQtG,MAAK,KACX,MAAM63D,EAAW55D,KAAKqU,QAAQslD,EAAUxpD,KACxC,IAAI06B,GAAiBjrC,EAAQsR,IAAInC,QAAQY,KAAK,CAC5C1P,KAAM,UACN8qC,WAAW,EACX17B,MAAOsqD,EAAU3hC,aACjB7pB,YAAa,kCACbg2B,QAAU01B,IACRD,EAAS/4D,OAAS,EAClB+4D,EAAS9xD,QAAQ+xD,GACjBF,EAAU3jC,IAAI5F,SAAStqB,UAAY,GACnC6zD,EAAU3jC,IAAI5F,SAAS9rB,UAAUtE,KAAK85D,YAAY95D,KAAK+5D,iBAAiBF,MAE1EzuB,gBAAiBwuB,UAKvBx4D,EAAUkD,OAAOq1D,EAAU3jC,IAAI50B,cAQnC,MAAMiH,EAAU,cAA6BzI,EAAQk4D,UAAU/1D,MAAK61D,IAClE,MAAMxgD,EAAU,0BAAyCwgD,GACzD53D,KAAKg6D,SAAS5iD,EAAQnX,MAEnBD,KAAKk5D,aACNl5D,KAAKqU,QAAU,GACf,CAAC,QAAkB,YAAqBtP,SAAQsyC,IAC9C,MAAM7xC,EAAM,GACN8E,EAAa,UAAN+sC,EAAgBjgC,EAAQuhD,WAAavhD,EAAQwhD,cAC1DpzD,EAAIsC,QAAQwC,EAAK0tD,MAAMttD,KAAImG,GAAMA,EAAGoY,cACpCzjB,EAAIsC,QAAQwC,EAAK2tD,MAAMvtD,KAAImG,GAAMA,EAAGoY,UAAS,MAC7CjpB,KAAKqU,QAAQgjC,GAAK7xC,EAClB,MAAM8T,EAAItZ,KAAKk5D,WAAWxnD,IAAI2lC,GAAGrhB,IAAI5F,SACrC9W,EAAExT,UAAY,GACdwT,EAAEhV,UAAUtE,KAAK85D,YAAYxvD,QAIjC1K,EAAQsR,IAAIb,cAAchQ,iBAAiB,WAAW,KACpD,MAAMu3D,EAA4B,GAElC,OAAO53D,KAAKC,MACV,KAAKu3D,GAAY2B,UACfvB,EAAM9vD,KAAK,CAACwB,EAAG,8BACf,MACF,KAAKkuD,GAAY8B,SACf1B,EAAM9vD,KAAK,CAACwB,EAAG,mCACf,MACF,KAAKkuD,GAAY4B,OACfxB,EAAM9vD,KAAK,CAACwB,EAAG,iCAIhBtJ,KAAKk5D,YACL,CACC,CAAC,QAAa,yCAA8C,+BAC5D,CAAC,WAAa,4CAA8C,mCAK1Dn0D,SAAQ,EAAEsyC,EAAG4iB,EAASC,GAAW/zD,KACnC,GAAGnG,KAAKk5D,WAAWxnD,IAAI2lC,GAAGrhB,IAAI50B,UAAUb,UAAUmT,SAAS,QACzD,OAGF,MAAMkmD,EAAW55D,KAAKqU,QAAQgjC,GAC9B,GAAGuiB,EAAU,CACX,MAAMO,EAAWn6D,KAAK+5D,iBAAiBH,GACpCO,EAASlC,MAAMp3D,QAChB+2D,EAAM9vD,KAAK,CAACwB,EAAG2wD,EAAShC,MAAOkC,EAASlC,QAGvCkC,EAASnC,MAAMn3D,QAChB+2D,EAAM9vD,KAAK,CAACwB,EAAG4wD,EAAUlC,MAAOmC,EAASnC,MAAMttD,KAAImG,GAAMoE,EAAA,eAA6BpE,WAM9F,cAA6BjR,EAAQk4D,SAAUF,KAC9C,CAACz8C,MAAM,OAyBP6+C,SAAS/5D,GACd,MAAM+1B,EAAMh2B,KAAKq5D,UAAU3nD,IAAIzR,GAC/BD,KAAK84D,cAAc74D,GACnB+1B,EAAIyB,WAAW13B,MAAM4hB,SAAU,EAGzBo4C,iBAAiB1lD,GACvB,MAAMihD,EAAQ,CAAC0C,MAAO,GAAgBC,MAAO,IAK7C,OAJA5jD,EAAQtP,SAAQoE,IACdmsD,EAAMnsD,EAAO65B,YAAc,QAAU,SAASl7B,KAAKqB,EAAO65B,YAAc75B,EAAOoyB,WAAapyB,MAGvFmsD,EAGDwE,YAAYxE,GAClB,OAAIA,EAAM0C,MAAMn3D,QAAWy0D,EAAM2C,MAAMp3D,QAIhC,IAAAgoB,MAAK,CACVysC,EAAM0C,MAAMn3D,QAAS,IAAA+K,MAAK,QAAS,CAAC0pD,EAAM0C,MAAMn3D,SAAW,KAC3Dy0D,EAAM2C,MAAMp3D,QAAS,IAAA+K,MAAK,QAAS,CAAC0pD,EAAM2C,MAAMp3D,SAAW,MAC3DiJ,OAAOa,UAAU,GANV,EAAC,IAAAiB,MAAK,wCC7OJ,MAAMwuD,WAAiChqD,EAC1CR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,cAAe,wBAC5CvB,KAAKkQ,SAAS,gBAEd,MAAMmqD,EAA4B,mBAC5BC,EAAe,IAAIzB,GAAe,CACtC3nD,IAAKlR,KACLqP,MAAO,oBACPyoD,SAAU,6BACViB,SAAU,CAACsB,EAAcA,EAAc,IACvCX,eAAgB,CAAC,uCAAwC,yCACzD34B,SAAU/gC,KAAK4M,WACfksD,cAAgB74D,IACdqZ,EAAE0gD,SAASxC,GAAY2B,WACvB7/C,EAAE2/C,aAAa73D,UAAUb,UAAUsD,OAAO,OAAQ5D,IAASu3D,GAAY4B,WAIrEmB,EAAwB,oBACxBjhD,EAAI,IAAIu/C,GAAe,CAC3B3nD,IAAKlR,KACLqP,MAAO,qBACPyoD,SAAU,8BACViB,SAAU,CAACwB,EAAUA,EAAU,IAC/Bf,cAAc,EACdD,UAAW,CAAC/B,GAAY4B,UAG1Bp5D,KAAK4M,WAAWxL,UAAU+C,aAAamV,EAAE2/C,aAAa73D,UAAWk5D,EAAarB,aAAa73D,UAAUiD,c,cC3B1F,MAAMm2D,WAAqC1rD,EAC9Cc,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,wBAAyB,6BACtDvB,KAAKkQ,SAAS,kCAEd,MAAM+C,EAAU,IAAIC,GAAe,CACjC2qB,QAAS,qCACTC,aAAa,IAITjmB,EAAM8rC,GAAA,0BADE,MAER8W,EAAmBp5D,SAASC,cAAc,OAE7CuW,EACDmZ,GAAY,CACVnZ,IAAAA,EACAoZ,IAAKwpC,EACL/4D,MAAM,EACNgB,MAAM,EACNd,MAAO,IACPC,OAAQ,MACPE,MAAK,SAIR04D,EAAiBl6D,UAAUgB,IAAI,yBAGjC0R,EAAQ3D,QAAQhL,OAAOm2D,GAEvB,MAAMC,EAAeznD,EAAQqyB,yBAEvBnyB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAMo5D,GAAY,OAAO,gCAAiC,CAAC15C,KAAM,+CAEjE,QAAiB05C,GAAYr6D,IAC3BN,KAAKyP,WAGPzP,KAAK+O,OAAOkD,kBAAkB2oD,GAAgB56D,MAE9CmT,EAAa7O,OAAOq2D,GAEpBD,EAAap2D,OAAO6O,GAEpBnT,KAAK4M,WAAWxL,UAAUkD,OAAO2O,EAAQ7R,Y,eCtDtC,SAASy5D,GAASC,GACvB,OAAQ,GAAAnO,mBAAqBmO,ECchB,MAAMC,WAAmDjsD,EAAxE,c,oBAKS,KAAAksD,SAAU,EAEPprD,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,wBAAyB,4CACtDvB,KAAKkQ,SAAS,6BAEd,MAAM+C,EAAU,IAAIC,GAAe,CACjC2qB,SAAS,EACTC,aAAa,KAGf,IAAApE,OAAMzmB,EAAQ4qB,QAAS,mCAAoC,CAAC79B,KAAKi7D,QAEjE,MACMpjD,EAAM8rC,GAAA,0BADE,MAER8W,EAAmBp5D,SAASC,cAAc,OAE7CuW,EACDmZ,GAAY,CACVnZ,IAAAA,EACAoZ,IAAKwpC,EACL/4D,MAAM,EACNgB,MAAM,EACNd,MAAO,IACPC,OAAQ,IACR6gD,MAZU,OAaT3gD,MAAK,SAIR04D,EAAiBl6D,UAAUgB,IAAI,yBAGjC0R,EAAQ3D,QAAQhL,OAAOm2D,GAEvB,MAAMC,EAAeznD,EAAQqyB,yBAEvBnyB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAMqB,EAAa5C,KAAKk7D,eAAiB,IAAI,KAAe,CAC1Dp3D,KAAM,sBACNuP,MAAO,2BACPxS,OAAQb,KAAKa,OACbE,OAASmlB,IACPgoB,GAAO,GAEPitB,GAAA,uBAAqC,GAAKj1C,GACzCnkB,MAAKrB,IAKJ06D,OAEDntD,OAAMJ,IACL,OAAOA,EAAI5N,MACT,IAAK,eACH2C,EAAW7C,MAAMQ,UAAUgB,IAAI,UAC/B,EAAAyM,EAAA,GAAepL,EAAWyQ,OAAO,IAAAzH,MAAK,oCACtC,MAEF,IAAK,qBACHhJ,EAAW7C,MAAMQ,UAAUgB,IAAI,UAC/B,EAAAyM,EAAA,GAAepL,EAAWyQ,OAAO,IAAAzH,MAAK,oCACtC,MAEF,QACEkC,QAAQC,MAAM,gBAAiBF,GAInCqgC,GAAO,SAKPmtB,GAAY,OAAO,8CAA+C,CAACp6C,KAAM,qCACzEq6C,GAAY,OAAO,4DAA6D,CAACr6C,KAAM,eAEvFm6C,EAAS,KACb,IAAIZ,GAA6Bx6D,KAAK+O,QAAQY,QAG1Cu+B,EAAUqtB,KACd,EAAA59B,GAAA,GAAiB,CAAC/6B,EAAW7C,MAAOs7D,EAAWC,GAAYC,KAG7D,QAAiBF,GAAY/6D,IAC3B4tC,GAAO,GACPitB,GAAA,wBAAsCp5D,MAAKrB,IACzCV,KAAK+O,OAAOkD,kBAAkBupD,GAAgCx7D,MAC9DA,KAAKyP,WACJ,KACDy+B,GAAO,UAIX,QAAiBotB,GAAYh7D,IAC3B4tC,GAAO,GACP,MAAMtM,GAAI,QAAa05B,GACvBH,GAAA,wBAAsCp5D,MAAKrB,IACzCkhC,EAAEphC,SACF0tC,GAAO,SAIX/6B,EAAa7O,OAAO1B,EAAWxB,UAAWi6D,EAAWC,GAErDZ,EAAap2D,OAAO6O,GAEpBnT,KAAK4M,WAAWxL,UAAUkD,OAAO2O,EAAQ7R,WAG3CwQ,qBACMipD,GAAS76D,KAAKg7D,UAClBh7D,KAAKk7D,eAAen7D,MAAMuN,SCzHf,MAAMkuD,WAAuC1sD,EAA5D,c,oBAMS,KAAAksD,SAAU,EAEPprD,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,wBAAyB,+BACtDvB,KAAKkQ,SAAS,sBAEd,MAAM+C,EAAU,IAAIC,GAAe,CACjC2qB,SAAS,EACTC,aAAa,IAITjmB,EAAM8rC,GAAA,0BADE,MAER8W,EAAmBp5D,SAASC,cAAc,OAE7CuW,EACDmZ,GAAY,CACVnZ,IAAAA,EACAoZ,IAAKwpC,EACL/4D,MAAM,EACNgB,MAAM,EACNd,MAAO,IACPC,OAAQ,IACR6gD,MAZU,OAaT3gD,MAAK,SAIR04D,EAAiBl6D,UAAUgB,IAAI,yBAGjC0R,EAAQ3D,QAAQhL,OAAOm2D,GAEvB,MAAMC,EAAeznD,EAAQqyB,yBAEvBnyB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAMqB,EAAa5C,KAAK4C,WAAa,IAAI,IAAW,CAClDkB,KAAM,iBACNuP,MAAO,gBACPvT,WAAW,IAGb8C,EAAW7C,MAAMM,iBAAiB,YAAaC,IAC7C,GAAa,UAAVA,EAAE6P,IAEH,OADA,EAAAuR,EAAA,GAAYphB,GACLm7D,OAIX74D,EAAW7C,MAAMM,iBAAiB,SAAUC,IAC1CsC,EAAW7C,MAAMQ,UAAUC,OAAO,YAGpC,MAAMk7D,GAAc,OAAO,gCAAiC,CAACz6C,KAAM,aAC7D06C,GAAU,OAAO,4DAA6D,CAAC16C,KAAM,kBAErFm6C,EAAS,KACb,IAAIZ,GAA6Bx6D,KAAK+O,QAAQY,QAG1C8rD,EAAkB,KACtB,MAAMR,EAAQr4D,EAAWlC,MAAMwM,OACzBkJ,EAAQ,eAA6B6kD,GAC3C,IAAI7kD,GAASA,EAAM,GAAGvV,SAAWo6D,EAAMp6D,OAErC,YADA+B,EAAW7C,MAAMQ,UAAUgB,IAAI,SAIjCq6D,GAAc,GACd,MAAMh6B,GAAI,QAAa85B,GAEvBP,GAAA,iBAA+B,CAC7BU,KAAM77D,KAAK67D,KACXC,gBAAiB97D,KAAK+7D,cACtBC,YAAah8D,KAAKg8D,YAClBf,MAAAA,IACCl5D,MAAMrB,IACP06D,OACEvtD,IACF,GAAGA,EAAI5N,KAAKs/B,SAAS,qBAAsB,CACzC,MAAM08B,GAAWpuD,EAAI5N,KAAKmW,MAAM,4BAA4B,GAEtDlF,EAAM,IAAI6pD,GAA2C/6D,KAAK+O,QAChEmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAI+pD,MAAQA,EACZ/pD,EAAIrQ,OAASo7D,EACb/qD,EAAIvB,YAEJ7B,QAAQ4Z,IAAI,qBAAsB7Z,GAGpC+tD,GAAc,GACdh6B,EAAEphC,cAGN,QAAiBk7D,EAAaD,GAE9B,MAAMG,EAAiB1tB,IAClBA,GACDwtB,EAAYx7D,aAAa,WAAY,QACrCy7D,EAAQz7D,aAAa,WAAY,UAEjCw7D,EAAYlyB,gBAAgB,YAC5BmyB,EAAQnyB,gBAAgB,eAI5B,QAAiBmyB,GAAUr7D,IACX,IAAIs7B,GAAU,mBAAoB,CAC9Cha,QAAS,CAAC,CACR6X,QAAS,SACTyiC,UAAU,GACT,CACDziC,QAAS,gBACTkD,SAAU,KAERi/B,GAAc,IACd,QAAaD,GACbR,GAAA,iBAA+B,CAC7BU,KAAM77D,KAAK67D,KACXC,gBAAiB97D,KAAK+7D,cACtBC,YAAah8D,KAAKg8D,YAClBf,MAAO,KACNl5D,MAAK,KACNq5D,OACEvtD,IACF+tD,GAAc,OAGlB50B,UAAU,IAEZhP,aAAc,uBACdoE,mBAAoB,6BAGhB1Z,UAGRvP,EAAa7O,OAAO1B,EAAWxB,UAAWs6D,EAAaC,GAEvDjB,EAAap2D,OAAO6O,GAEpBnT,KAAK4M,WAAWxL,UAAUkD,OAAO2O,EAAQ7R,WAG3CwQ,qBACMipD,GAAS76D,KAAKg7D,UAClBh7D,KAAK4C,WAAW7C,MAAMuN,S,qCC/JX,MAAM6uD,WAAsCrtD,EAM/Cc,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,wBAAyB,8BACtDvB,KAAKkQ,SAAS,8BAEd,MAAM+C,EAAU,IAAIC,GAAe,CACjC4qB,aAAa,IAITjmB,EAAM8rC,GAAA,0BADE,MAER8W,EAAmBp5D,SAASC,cAAc,OAE7CuW,EACDmZ,GAAY,CACVnZ,IAAAA,EACAoZ,IAAKwpC,EACL/4D,MAAM,EACNgB,MAAM,EACNd,MAAO,IACPC,OAAQ,IACR6gD,MAZU,OAaT3gD,MAAK,SAIR04D,EAAiBl6D,UAAUgB,IAAI,yBAGjC0R,EAAQ3D,QAAQhL,OAAOm2D,GAEvB,MAAMtnD,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAMqB,EAAa5C,KAAK4C,WAAa,IAAI,IAAW,CAClDkB,KAAM,OACNuP,MAAO,qCAGTzQ,EAAW7C,MAAMM,iBAAiB,YAAaC,IAC7C,GAAa,UAAVA,EAAE6P,IAEH,OADA,EAAAuR,EAAA,GAAYphB,GACLsC,EAAWlC,MAAQ+6D,IAAoBW,OAIlD,MAAMhB,EAAS,CAAC96D,EAAW+7D,KACtB/7D,IACD,EAAAohB,EAAA,GAAYphB,GAGd,MAAMu7D,EAAOQ,EAAWz5D,EAAWlC,WAAQ6F,EAC3C,GAAGs1D,GAAQ77D,KAAKg8D,cAAgBH,EAE9B,YADA/hC,GAAM,iBAAY,uBAAuB,IAI3C,MAAM5oB,EAAM,IAAIsqD,GAA+Bx7D,KAAK+O,QACpDmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAI6qD,cAAgB/7D,KAAK+7D,cACzB7qD,EAAI8qD,YAAch8D,KAAKg8D,YACvB9qD,EAAI2qD,KAAOA,EAEX3qD,EAAIvB,QAGA+rD,GAAc,OAAO,gCAAiC,CAACz6C,KAAM,aAC7D06C,GAAU,OAAO,4DAA6D,CAAC16C,KAAM,kBAErFw6C,EAAmBn7D,GAAc86D,EAAO96D,GAAG,GAC3C87D,EAAe97D,GAAc86D,EAAO96D,GAAG,IAC7C,QAAiBo7D,EAAaD,IAC9B,QAAiBE,EAASS,GAE1BjpD,EAAa7O,OAAO1B,EAAWxB,UAAWs6D,EAAaC,GAEvD1oD,EAAQ3D,QAAQhL,OAAO6O,GAEvBnT,KAAK4M,WAAWxL,UAAUkD,OAAO2O,EAAQ7R,WAG3CwQ,qBACE5R,KAAK4C,WAAW7C,MAAMuN,SCzFX,MAAMgvD,WAAiDxtD,EAM1Dc,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,wBAAyB,uCAAwC,2CAC9FvB,KAAKkQ,SAAS,yBAEd,MAAM+C,EAAU,IAAIC,GAAe,CACjC4qB,aAAa,IAGT3qB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAMN,EAAqBjB,KAAKiB,mBAAqB,IAAI,KAAmB,CAC1E6C,KAAM,oBACNuP,MAAO,0BAGHkpD,EAAS,IAAI,KAAet7D,EAAoB,KAEhDy6D,GAAc,OAAO,gCAAiC,CAACz6C,KAAM,aAEnE9N,EAAa7O,OAAOrD,EAAmBG,UAAWs6D,GAClDzoD,EAAQ3D,QAAQhL,OAAOi4D,EAAOn7D,UAAW+R,GAEzCnT,KAAK4M,WAAWxL,UAAUkD,OAAO2O,EAAQ7R,WAEzCH,EAAmBlB,MAAMM,iBAAiB,YAAaC,IAKrD,GAJGW,EAAmBlB,MAAMQ,UAAUmT,SAAS,UAC7CzS,EAAmB85B,SAAS,EAAAC,EAAA,SAGjB,UAAV16B,EAAE6P,IACH,OAAOsrD,OAIX,MAAMe,EAAc,IACfx8D,KAAKg8D,cAAgB/6D,EAAmBP,QACzCO,EAAmBg6B,YACZ,GAMLwgC,EAAmBn7D,IAKvB,GAJGA,IACD,EAAAohB,EAAA,GAAYphB,IAGVk8D,IAAe,OAEnB,MAAMtrD,EAAM,IAAIirD,GAA8Bn8D,KAAK+O,QACnDmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAI6qD,cAAgB/7D,KAAK+7D,cACzB7qD,EAAI8qD,YAAch8D,KAAKg8D,YACvB9qD,EAAIvB,QAIN,OAFA,QAAiB+rD,EAAaD,GAEvBc,EAAO/6D,OAGhBoQ,qBACE5R,KAAKiB,mBAAmBlB,MAAMuN,SC/DnB,MAAMmvD,WAA+C3tD,EAApE,c,oBAIS,KAAAksD,SAAU,EAEPprD,OACR,MAAMk6B,GAAS9pC,KAAKs5B,MAAMte,OAAO0hD,cAAgB18D,KAAK+7D,cACtD/7D,KAAKoB,UAAUb,UAAUgB,IAAI,wBAAyB,wCACtDvB,KAAKkQ,SAAS45B,EAAQ,2BAA6B,8BAEnD,MAAM72B,EAAU,IAAIC,GAAe,CACjC4qB,aAAa,IAGT3qB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAMN,EAAqBjB,KAAKiB,mBAAqB,IAAI,KAAmB,CAC1E6C,KAAM,iBACNuP,MAAOy2B,EAAQ,2BAA8B9pC,KAAKs5B,MAAMuiC,UAAOt1D,EAAY,gBAC3Eo2D,WAAY7yB,GAAS9pC,KAAKs5B,MAAMuiC,KAAO,kBAAgC77D,KAAKs5B,MAAMuiC,WAAQt1D,IAGtFg2D,EAAS,IAAI,KAAet7D,EAAoB,KAEhDy6D,GAAc,OAAO,iCACrB/f,EAAS,IAAI,sBAAiB,CAACxrC,IAAK,aAE1CurD,EAAYp3D,OAAOq3C,EAAOhjC,SAE1BxF,EAAa7O,OAAOrD,EAAmBG,UAAWs6D,GAClDzoD,EAAQ3D,QAAQhL,OAAOi4D,EAAOn7D,UAAW+R,GAEzCnT,KAAK4M,WAAWxL,UAAUkD,OAAO2O,EAAQ7R,WAEzCH,EAAmBlB,MAAMM,iBAAiB,YAAaC,IAOrD,GANGW,EAAmBlB,MAAMQ,UAAUmT,SAAS,WAC7CzS,EAAmBlB,MAAMQ,UAAUC,OAAO,SAC1Cm7C,EAAOxrC,IAAM,WACbwrC,EAAO9V,UAGI,UAAVvlC,EAAE6P,IACH,OAAOsrD,OAIX,MAAMe,EAAc,MACdv7D,EAAmBP,MAAMG,SAC3BI,EAAmBlB,MAAMQ,UAAUgB,IAAI,UAChC,GAMX,IAAIk6D,EACJ,GAAI3xB,EAkEF2xB,EAAmBn7D,IAKjB,GAJGA,IACD,EAAAohB,EAAA,GAAYphB,IAGVk8D,IAAe,OAEnB,MAAMtrD,EAAM,IAAIorD,GAAyCt8D,KAAK+O,QAC9DmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAI8qD,YAAc/6D,EAAmBP,MACrCwQ,EAAI6qD,cAAgB/7D,KAAK+7D,cACzB7qD,EAAIvB,YA7EG,CACT,IAAIitD,EAEAC,EAAW,KAETD,IACFA,EAAmBzvD,OAAO6jC,YAAY6rB,EAAU,MAG3C1B,GAAA,aAA2Bp5D,MAAK+6D,IACrC98D,KAAKs5B,MAAQwjC,EAEV98D,KAAKs5B,MAAMuiC,KACZ56D,EAAmBoS,MAAMvN,UAAY,kBAAgC9F,KAAKs5B,MAAMuiC,OAEhF,EAAA7tD,EAAA,GAAe/M,EAAmBoS,OAAO,IAAAzH,MAAK,sBA+CpD6vD,EA1CgBn7D,IACd,IAAIk8D,IAEF,YADA,EAAA96C,EAAA,GAAYphB,GAIdo7D,EAAYx7D,aAAa,WAAY,QACrCy7C,EAAOxrC,IAAM,aACbwrC,EAAO9V,SACP,MAAM9d,GAAY,QAAa2zC,GAEzBK,EAAgB96D,EAAmBP,MACzCy6D,GAAA,QAAsBl6D,EAAmBP,MAAOV,KAAKs5B,OAAOv3B,MAAKg7D,IAG/D,GAFAjvD,QAAQ4Z,IAAIq1C,GAEE,uBAAXA,EAAKzzD,EAA4B,CAClCsxC,cAAcgiB,GACXL,GAAQA,EAAO/7D,SAClB,MAAM0Q,EAAM,IAAI8rD,GAA0Bh9D,KAAK+O,QAC/CmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAI6qD,cAAgBA,EACpB7qD,EAAIvB,OACJ3P,KAAK+O,OAAOgD,qBAAqB/R,UAEjC6N,IACF6tD,EAAYlyB,gBAAgB,YAC5BvoC,EAAmBlB,MAAMQ,UAAUgB,IAAI,SAEhCsM,EAAI5N,KAGP07C,EAAOxrC,IAAM,8BACbwrC,EAAO9V,SACP9d,EAAUvnB,SACVS,EAAmB63B,SAIvB+jC,QAMJA,IAmBF,OAFA,QAAiBnB,EAAaD,GAEvBc,EAAO/6D,OAGhBoQ,qBACMipD,GAAS76D,KAAKg7D,UAClBh7D,KAAKiB,mBAAmBlB,MAAMuN,SCrJnB,MAAM0vD,WAAkCluD,EAI3Cc,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,wBAAyB,8BACtDvB,KAAKkQ,SAAS,4BAEd,MAAM+C,EAAU,IAAIC,GAAe,CACjC2qB,SAAS,EACTC,aAAa,IAITjmB,EAAM8rC,GAAA,0BADE,MAER8W,EAAmBp5D,SAASC,cAAc,OAE7CuW,EACDmZ,GAAY,CACVnZ,IAAAA,EACAoZ,IAAKwpC,EACL/4D,MAAM,EACNgB,MAAM,EACNd,MAAO,IACPC,OAAQ,IACR6gD,MAZU,OAaT3gD,MAAK,SAIR04D,EAAiBl6D,UAAUgB,IAAI,yBAGjC0R,EAAQ3D,QAAQhL,OAAOm2D,GAEvB,MAAMxiC,EAAIhlB,EAAQqyB,yBAClB,GAAGtlC,KAAKs5B,MAAMte,OAAO0hD,aAAc,EACjC,IAAAhjC,OAAMzmB,EAAQ4qB,QAAS,2BAEvB,MAAMo/B,GAAoB,OAAO,8BAA+B,CAACpuD,KAAM,OAAQoS,KAAM,+BAC/Ei8C,GAAqB,OAAO,8BAA+B,CAACruD,KAAM,cAAeoS,KAAM,+BACvFk8C,GAAsB,OAAO,8BAA+B,CAACtuD,KAAM,QAASoS,KAAMjhB,KAAKs5B,MAAMte,OAAOoiD,aAAe,0BAA4B,4BAErJ,QAAiBH,GAAmB,KAClC,MAAM/rD,EAAM,IAAIurD,GAAuCz8D,KAAK+O,QAC5DmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAI6qD,cAAgB/7D,KAAK+7D,cACzB7qD,EAAIvB,WAGN,QAAiButD,GAAoB,KACrB,IAAIthC,GAAU,yBAA0B,CACpDha,QAAS,CAAC,CACR6X,QAAS,UACTkD,SAAU,KACRw+B,GAAA,iBAA+B,CAACW,gBAAiB97D,KAAK+7D,gBAAgBh6D,MAAK,KACzE/B,KAAK+O,OAAOkD,kBAAkB2oD,GAAgB56D,MAC9CA,KAAKyP,YAGTu3B,UAAU,IAEZhP,aAAc,+BACdoE,mBAAoB,4BAGhB1Z,WAGR,QAAiBy6C,GAAqB,KACpC,MAAMjsD,EAAM,IAAIsqD,GAA+Bx7D,KAAK+O,QACpDmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAI2qD,KAAO77D,KAAKs5B,MAAMuiC,KACtB3qD,EAAI6qD,cAAgB/7D,KAAK+7D,cACzB7qD,EAAI8qD,YAAch8D,KAAK+7D,cACvB7qD,EAAI8pD,SAAU,EACd9pD,EAAIvB,UAGNsoB,EAAE3zB,OAAO24D,EAAmBC,EAAoBC,OAC3C,EACL,IAAAzjC,OAAMzmB,EAAQ4qB,QAAS,+BAEvB,MAAM1qB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3B,MAAM87D,GAAiB,OAAO,gCAAiC,CAACp8C,KAAM,mCAEtE9N,EAAa7O,OAAO+4D,GACpBplC,EAAE3zB,OAAO6O,IAET,QAAiBkqD,GAAiB/8D,IAChC,MAAM4Q,EAAM,IAAIurD,GAAuCz8D,KAAK+O,QAC5DmC,EAAIooB,MAAQt5B,KAAKs5B,MACjBpoB,EAAIvB,UAIR3P,KAAK4M,WAAWxL,UAAUkD,OAAO2O,EAAQ7R,YC5G9B,MAAMk8D,WAA8BltD,EACvCR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,cAAe,qBAC5CvB,KAAKkQ,SAAS,mBAEd,MAAM2tB,EAAuB,gDAC7B,IAAIg7B,GAAe,CACjB3nD,IAAKlR,KACLqP,MAAO,gBACPyoD,SAAU,iCACViB,SAAU,CAACl7B,EAASA,EAASA,GAC7B67B,eAAgB,CAAC,uCAAwC,yCACzD34B,SAAU/gC,KAAK4M,cCZN,MAAM2wD,WAAkCntD,EAC3CR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,cAAe,yBAC5CvB,KAAKkQ,SAAS,uBAEd,MAAM2tB,EAAuB,oDAC7B,IAAIg7B,GAAe,CACjB3nD,IAAKlR,KACLqP,MAAO,2BACPyoD,SAAU,8BACViB,SAAU,CAACl7B,EAASA,EAASA,GAC7B67B,eAAgB,CAAC,uCAAwC,yCACzD34B,SAAU/gC,KAAK4M,WACf2sD,UAAW,CAAC/B,GAAY4B,WCff,MAAMoE,WAAqCptD,EAC9CR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,cAAe,4BAC5CvB,KAAKkQ,SAAS,4BAEd,MAAM2tB,EAAuB,gDAC7B,IAAIg7B,GAAe,CACjB3nD,IAAKlR,KACLqP,MAAO,uBACPyoD,SAAU,0BACViB,SAAU,CAACl7B,EAASA,EAASA,GAC7B67B,eAAgB,CAAC,uCAAwC,yCACzD34B,SAAU/gC,KAAK4M,cCZN,MAAM6wD,WAAiCrtD,EAC1CR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,cAAe,yBAC5CvB,KAAKkQ,SAAS,0BAEd,MAAM2tB,EAAuB,6CAC7B,IAAIg7B,GAAe,CACjB3nD,IAAKlR,KACLqP,MAAO,cACPyoD,SAAU,4BACViB,SAAU,CAACl7B,EAASA,EAASA,GAC7B67B,eAAgB,CAAC,uCAAwC,yCACzD34B,SAAU/gC,KAAK4M,WACf2sD,UAAW,CAAC/B,GAAY4B,WCff,MAAMsE,WAA2BttD,EACpCR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,cAAe,iBAC5CvB,KAAKkQ,SAAS,8BAEd,MAAM2tB,EAAuB,iDAC7B,IAAIg7B,GAAe,CACjB3nD,IAAKlR,KACLqP,MAAO,eACPyoD,SAAU,2BACViB,SAAU,CAACl7B,EAASA,EAASA,GAC7B67B,eAAgB,CAAC,uCAAwC,yCACzD34B,SAAU/gC,KAAK4M,aAGjB,CACE,MAAMixB,EAAuB,qCAC7B,IAAIg7B,GAAe,CACjB3nD,IAAKlR,KACLqP,MAAO,mBACPyoD,SAAU,0BACViB,SAAU,CAACl7B,EAASA,EAASA,GAC7B67B,eAAgB,CAAC,uCAAwC,yCACzD34B,SAAU/gC,KAAK4M,eCVR,MAAM+wD,WAA6BvtD,EAItCR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,6BAC7BvB,KAAKkQ,SAAS,iBAEd,MAAM0tD,EAAWb,IACf,MAAM/mC,EAAM,IAAIuB,GAAI,CAClBloB,MAAO,CAAC0tD,EAAKc,SAAUd,EAAKe,aAAaj1C,KAAK,KAC9CuH,SAAU,CAAC2sC,EAAKgB,GAAIhB,EAAKiB,SAASn1C,KAAK,OACvCtd,WAAW,EACXusB,WAAYilC,EAAK/hD,OAAO1T,aAAUf,GAAY,SAA8B,IAAI8zC,KAAqD,IAAhDr3C,KAAKH,IAAIk6D,EAAKkB,YAAalB,EAAKmB,kBAGvHloC,EAAI50B,UAAU4nB,QAAQoqC,KAAO,GAAK2J,EAAK3J,KAEvC,MAAM+K,EAAW98D,SAASC,cAAc,OAMxC,OALA68D,EAAS59D,UAAUgB,IAAI,gBACvB48D,EAASr4D,UAAY,CAACi3D,EAAKqB,aAAcrB,EAAKsB,gBAAkBtB,EAAKuB,UAAUx0D,OAAOa,SAASke,KAAK,MAEpGmN,EAAI5F,SAASnsB,cAAcE,aAAag6D,EAAUnoC,EAAI5F,UAE/C4F,GAGHuoC,EAAiBv+D,KAAKu+D,eAAe39D,QAE3C,CACE,MAAMqS,EAAU,IAAIC,GAAe,CACjCpP,KAAM,iBACN+5B,QAAS,2BAGLk/B,EAAOwB,EAAe58B,eAAco7B,GAAQA,EAAK/hD,OAAO1T,UACxDk3D,EAAUZ,EAAQb,GAIxB,GAFA9pD,EAAQ3D,QAAQhL,OAAOk6D,EAAQp9D,WAE5Bm9D,EAAe19D,OAAQ,CACxB,MAAM49D,GAAe,OAAO,qCAAsC,CAAC5vD,KAAM,OAAQoS,KAAM,0BACvF,QAAiBw9C,GAAen+D,IAC9B,IAAIs7B,GAAU,iBAAkB,CAC9Bha,QAAS,CAAC,CACR6X,QAAS,YACTuN,UAAU,EACVrK,SAAU,KACR,MAAM94B,GAAS,EAAA85B,GAAA,GAAiB,CAAC8gC,IAAe,GAChD,eAAqB,4BAA4B18D,MAAKrB,IAEpD+9D,EAAaj+D,SACbk+D,EAAat9D,UAAUZ,WACtBizC,GAASnuB,SAAQ,KAClBzhB,UAINm0B,aAAc,0BACdoE,mBAAoB,uBACnB1Z,UAGLzP,EAAQ3D,QAAQhL,OAAOm6D,GAGzBz+D,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAGjC,IAAIm9D,EAAe19D,OACjB,OAGF,MAAM69D,EAAe,IAAIxrD,GAAe,CACtCpP,KAAM,gBACN+5B,QAAS,qBAGX0gC,EAAex5D,SAAQg4D,IACrB2B,EAAapvD,QAAQhL,OAAOs5D,EAAQb,GAAM37D,cAG5CpB,KAAK4M,WAAWtI,OAAOo6D,EAAat9D,WAEpC,MAAMqyC,EAAW5lC,IACC,wCAAbA,EAAI5N,MACL65B,GAAM,iBAAY,mCAAmC,KAIzD,IAAIthB,EACJ,MAAMmmD,EAAmB,KACvB,MAAMvL,EAAO56C,EAAOwQ,QAAQoqC,KAE5B,IAAIx3B,GAAU,iBAAkB,CAC9Bha,QAAS,CAAC,CACR6X,QAAS,YACTuN,UAAU,EACVrK,SAAU,KACR,eAAqB,6BAA8B,CAACy2B,KAAAA,IACnDrxD,MAAKrB,IACDA,GACD8X,EAAOhY,WAERizC,MAGPzb,aAAc,yBACdoE,mBAAoB,yBACnB1Z,QAGC/J,EAAU3Y,KAAK4+D,YAAc,GAAW,CAAC,CAC7C/vD,KAAM,OACNoS,KAAM,YACNC,QAASy9C,KAEXhmD,EAAQ9H,GAAK,8BACb8H,EAAQpY,UAAUgB,IAAI,eAEtBF,SAASuzC,eAAe,cAActwC,OAAOqU,IAE7C,QAA0B3Y,KAAK4M,WAAWxL,WAAYd,IACpDkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOwQ,QAAQoqC,OAI1B9yD,aAAa+rB,YAAY/rB,EAAEme,iBAE3Bne,aAAa+rB,aAAY/rB,EAAEwvD,cAAe,IAE7C,QAAaxvD,EAAGqY,IAChB,QAAYA,QAGd,QAAiB3Y,KAAK4M,WAAWxL,WAAYd,IAC3CkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOwQ,QAAQoqC,MAI7BuL,OAIJ7uD,sBAKE,OAJG9P,KAAK4+D,aACN5+D,KAAK4+D,YAAYp+D,SAGZX,MAAMiQ,uBC9JF,MAAM+uD,WAA2B/vD,EAIpCc,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,2BAC7BvB,KAAKkQ,SAAS,gBAEd,CACE,MAAM+C,EAAU,IAAIC,GAAe,CACjC2qB,QAAS,qBAGX79B,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAGjC,MAAM09D,EAAS,EAAa,CAACjwD,KAAM,MAAOvD,UAAW,eACrDtL,KAAKsP,QAAQhL,OAAOw6D,IAEpB,QAAiBA,GAASx+D,IACxB,IAAIojC,GAAc,CAChBI,UAAW,CAAC,YACZ31B,YAAa,gCACby1B,SAAWz6B,IAET8L,EAAA,cAA4B9L,GAAQ,QAGvC,CAACqG,eAAgBxP,KAAKwP,iBAEzB,MAAM9D,EAAO,oBACb1L,KAAK4M,WAAWxL,UAAUb,UAAUgB,IAAI,sBACxCvB,KAAK4M,WAAWtI,OAAOoH,GAEvB,MAAMnK,EAAM,CAAC4H,EAAgB7E,KAC3B,MAAM,IAACuQ,GAAO,gBAA+B,CAC3CC,OAAQ3L,EACR/H,UAAWsK,EACXgC,YAAY,EACZqH,eAAe,EACfpH,WAAY,GACZrJ,OAAAA,IAGI2lC,EAAOh1B,EAAA,UAAwB9L,GAClC8gC,EAAKjvB,OAAO+jD,IACblqD,EAAIG,gBAAgB1Q,OAAO,IAAM2lC,EAAK7O,UAEnC6O,EAAKU,MAAO91B,EAAIG,gBAAgBlP,UAAYmP,EAAA,kBAAgCg1B,EAAKU,OAC/E91B,EAAIG,gBAAgB1Q,OAAO2lC,EAAK7O,SAAW,IAAM6O,EAAK7O,SAAWnmB,EAAA,sBAAoC9L,KAO9G,IAAI,MAAMA,KAAUnJ,KAAKqU,QACvB9S,EAAI4H,GAAQ,GAGd,IAAIqP,EACJ,MAKMG,EAAU3Y,KAAK4+D,YAAc,GAAW,CAAC,CAC7C/vD,KAAM,UACNoS,KAAM,UACNC,QARgB,KAChB,MAAM/X,EAASqP,EAAOwQ,QAAQ7f,OAAO8f,WACrChU,EAAA,cAA4B9L,GAAQ,IAOpCvJ,QAAS,CAAC4P,eAAgBxP,KAAKwP,mBAEjCmJ,EAAQ9H,GAAK,4BACb8H,EAAQpY,UAAUgB,IAAI,eAEtBF,SAASuzC,eAAe,cAActwC,OAAOqU,IAE7C,QAA0B3Y,KAAK4M,WAAWxL,WAAYd,IACpDkY,GAAS,EAAA+sB,GAAA,GAAUjlC,EAAEkY,OAAQ,MACzBA,IAIDlY,aAAa+rB,YAAY/rB,EAAEme,iBAE3Bne,aAAa+rB,aAAY/rB,EAAEwvD,cAAe,IAE7C,QAAaxvD,EAAGqY,IAChB,QAAYA,MACX3Y,KAAKwP,gBAERxP,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,cAAe6lC,IAChD,MAAM,OAAC18B,EAAM,QAAE61D,GAAWn5B,EACpBtF,EAAK70B,EAAK6F,cAAc,kBAAkBpI,OAC7C61D,EACGz+B,GACFh/B,EAAI4H,GAAQ,GAGXo3B,GACDA,EAAG//B,YAMT,IAAI+9B,GAAU,EACdv+B,KAAK4M,WAAWK,iBAAmB,KAC9BsxB,IAIHA,GAAU,EACVtpB,EAAA,aAA2BvJ,EAAKK,kBARf,IAQ8ChK,MAAKwL,IAClE,IAAI,MAAMpE,KAAUoE,EAAI8G,QACtB9S,EAAI4H,GAAQ,IAGXoE,EAAI8G,QAAQxT,OAbA,IAauB6K,EAAKK,oBAAsBwB,EAAI/G,SACnExG,KAAK4M,WAAWK,iBAAmB,MAGrCjN,KAAK4M,WAAW8xB,sBACfpZ,SAAQ,KACTiZ,GAAU,OAKhB3sB,qBACE5R,KAAK4M,WAAW65B,WAGlB32B,sBAKE,OAJG9P,KAAK4+D,aACN5+D,KAAK4+D,YAAYp+D,SAGZX,MAAMiQ,uB,eC7JF,SAASmvD,GAAqB9uD,GAG3C,MADM,SADAA,EAAI,GAAG+uD,cAAgB/uD,EAAIvP,MAAM,ICkC1B,MAAMu+D,WAAiC/uD,EAI1CR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,wBAC7BvB,KAAKkQ,SAAS,mBAEd,MAAMkvD,EAAwB,UAE9B,CACE,MAAMnsD,EAAU,IAAIC,GAAe,CAAC4qB,aAAa,EAAMD,QAAS,iBAEhE,IAAIwhC,EACJ,MAAMC,EAAkB,IAAI/nC,GAAI,CAC9B1oB,KAAM,aACNmpB,aAAc,eACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,MAAM2F,EAAM,IAAI2tD,GAAmB7+D,KAAK+O,QACxCmC,EAAImD,QAAUgrD,EACdnuD,EAAIvB,UAKR,IAAI4vD,EAFJD,EAAgB9nC,SAAU,EAG1B,MAuBMgoC,EAAe,IAAIjoC,GAvBG,CAC1B1oB,KAAM,OACNmpB,aAAc,sBACdN,gBAAiB0nC,EACjB7zD,UAAYjL,IACV,IAAI4Q,EACDquD,EAAcvkD,OAAO0hD,aACtBxrD,EAAM,IAAIurD,GAAuCz8D,KAAK+O,QAC9CwwD,EAAcE,2BACtBvuD,EAAM,IAAI6pD,GAA2C/6D,KAAK+O,QAC1DmC,EAAI+pD,MAAQsE,EAAcE,0BAC1BvuD,EAAIrQ,OAAS,EACbqQ,EAAI8pD,SAAU,EACdG,GAAA,yBAEAjqD,EAAM,IAAI8rD,GAA0Bh9D,KAAK+O,QAG3CmC,EAAIooB,MAAQimC,EACZruD,EAAIvB,UAKR6vD,EAAahoC,SAAU,EAEvB,MAAMkoC,EAAoB1/D,KAAK0/D,kBAAoB,IAAInoC,GAAI,CACzD1oB,KAAM,iBACNmpB,aAAc,gBACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,MAAM2F,EAAM,IAAIysD,GAAqB39D,KAAK+O,QAC1CmC,EAAIqtD,eAAiBv+D,KAAKu+D,eAC1BrtD,EAAIb,cAAchQ,iBAAiB,WAAW,KAC5CL,KAAK2/D,yBACJ,CAACxkD,MAAM,IACVjK,EAAIvB,UAGR+vD,EAAkBloC,SAAU,EAE5BvkB,EAAQ3D,QAAQhL,OAAOg7D,EAAgBl+D,UAAWo+D,EAAap+D,UAAWs+D,EAAkBt+D,WAC5FpB,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAE/B,MAAMw+D,EAAmBp5D,IACpBA,GACD,EAAAwH,EAAA,GAAesxD,EAAgBlvC,UAAU,IAAAxkB,MAAK,sCAAuC,CAACpF,MAEtF,EAAAwH,EAAA,GAAesxD,EAAgBlvC,UAAU,IAAAxkB,MAAK,eAAgB,CAACpF,MAInExG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,cAAc,KAM/C6/D,OAGF,MAAMA,EAAgB,KACpB5qD,EAAA,eAA6BlT,MAAKwL,IAChC+xD,EAAgB9nC,SAAU,EAC1BooC,EAAgBryD,EAAI/G,OACpB64D,EAAiB9xD,EAAI8G,YAIzBwrD,IAEA1E,GAAA,aAA2Bp5D,MAAKu3B,IAC9BimC,EAAgBjmC,GAChB,EAAAtrB,EAAA,GAAewxD,EAAapvC,UAAU,IAAAxkB,MAAK0tB,EAAMte,OAAO0hD,aAAe,6BAA+B,gCACtG8C,EAAahoC,SAAU,KAKzBx3B,KAAK2/D,uBAGP,CACE,MAAM1sD,EAAU,IAAIC,GAAe,CAACpP,KAAM,eAAgB+5B,QAAS,0BAEnE5qB,EAAQ3D,QAAQ/O,UAAUgB,IAAI,gCAE9B,MAAMu+D,EAED,GAECC,EAAsBD,EAAuC,2BAAI,IAAIvoC,GAAI,CAC7ES,aAAc,oBACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,IAAI6uD,GAAyBp6D,KAAK+O,QAAQY,UAIxCqwD,EAAkBF,EAA2C,+BAAI,IAAIvoC,GAAI,CAC7ES,aAAc,gBACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,IAAI+xD,GAAsBt9D,KAAK+O,QAAQY,UAIrCswD,EAAqBH,EAAwC,4BAAI,IAAIvoC,GAAI,CAC7ES,aAAc,2BACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,IAAIgyD,GAA0Bv9D,KAAK+O,QAAQY,UAIzCuwD,EAAUJ,EAAqC,yBAAI,IAAIvoC,GAAI,CAC/DS,aAAc,eACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,IAAImyD,GAAmB19D,KAAK+O,QAAQY,UAIlCwwD,EAAiBL,EAAoC,wBAAI,IAAIvoC,GAAI,CACrES,aAAc,uBACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,IAAIiyD,GAA6Bx9D,KAAK+O,QAAQY,UAI5CywD,EAAmBN,EAAsC,0BAAI,IAAIvoC,GAAI,CACzES,aAAc,cACdN,gBAAiB0nC,EACjB7zD,UAAW,KACT,IAAIkyD,GAAyBz9D,KAAK+O,QAAQY,UAIxC0wD,EAAoBlwD,IACxB,MAAM6lB,EAAM8pC,EAAW3vD,GACnB6lB,GAIJ,cAA6B7lB,GAAKpO,MAAK61D,IACrC,MAAMxgD,EAAU,0BAAyCwgD,GACnDn+B,EAAUriB,EAAQnX,OAASu3D,GAAY2B,UAAY,qCAAwC/hD,EAAQnX,OAASu3D,GAAY8B,SAAW,uCAAyC,mCAC5KgH,EAAiBlpD,EAAQwhD,cAAcZ,MAAMn3D,OAASuW,EAAQwhD,cAAcX,MAAMp3D,OAClF0/D,EAAcnpD,EAAQuhD,WAAWX,MAAMn3D,OAASuW,EAAQuhD,WAAWV,MAAMp3D,OAE/Em1B,EAAI5F,SAAStqB,UAAY,GACzB,MAAMwT,GAAI,IAAA1N,MAAK6tB,GACfzD,EAAI5F,SAAS9rB,OAAOgV,IACjBgnD,GAAkBC,IACnBvqC,EAAI5F,SAAS9rB,OAAO,KAAK,EAAEg8D,EAAgBC,EAAc,IAAMA,EAAc,GAAGz2D,OAAOa,SAASke,KAAK,cAK3G5V,EAAQ3D,QAAQhL,OACdy7D,EAAoB3+D,UACpB4+D,EAAgB5+D,UAChB6+D,EAAmB7+D,UACnB8+D,EAAQ9+D,UACR++D,EAAe/+D,UACfg/D,EAAiBh/D,WAEnBpB,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAE/B,IAAI,MAAM+O,KAAO2vD,EACfO,EAAiBlwD,GAGnBtF,EAAA,yBAA2B,kBAAmBg7B,IAC5Cw6B,EAAiBpB,GAAqBp5B,EAAO11B,IAAI7G,OAIrD,MAAMw5B,EAA2B,GACjC,CACE,MAAM7vB,EAAU,IAAIC,GAAe,CAACpP,KAAM,6BAC1CmP,EAAQ7R,UAAUb,UAAUgB,IAAI,QAEhCuhC,EAASh7B,KAAK,eAAqB,8BAA8B/F,MAAKy+D,IACpE,IAAIA,EAASxlD,OAAOylD,qBAClB,OAGF,MAAM/iD,EAAU8iD,EAASxlD,OAAO0lD,kBAE1BC,EAAe,IAAIppC,GAAI,CAC3BpW,cAAe,IAAI,KAAc,CAACF,KAAM,mCAAoCU,QAASjE,IACrFga,gBAAiB,mCACjBK,oBAAoB,IAGtB9kB,EAAQ3D,QAAQhL,OAAOq8D,EAAav/D,WACpC6R,EAAQ7R,UAAUb,UAAUC,OAAO,QAEnCR,KAAKqQ,cAAchQ,iBAAiB,WAAW,KAC7C,MAAMugE,EAAWD,EAAax/C,cAAcQ,QAC1Bi/C,IAAaljD,GAK/B,eAAqB,6BAA8B,CACjDgjD,kBAAmBE,MAEpB,CAACzlD,MAAM,QAGZnb,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAGjC,CACE,MAAM6R,EAAU,IAAIC,GAAe,CAACpP,KAAM,gBAEpC+rD,EAAgB,KACN,IAAIj0B,GAAU,sBAAuB,CACjDha,QAAS,CAAC,CACR6X,QAAS,SACTkD,SAAU,KACR,MAAM94B,GAAS,EAAA85B,GAAA,GAAiB,CAACkjC,IAAe,GAChDC,GAAA,mBAAkC/+D,MAAK,KACrC8B,QAGJmjC,UAAU,IAEZhP,aAAc,6BACdoE,mBAAoB,0BAGhB1Z,QAGFm+C,GAAe,OAAO,8BAA+B,CAAChyD,KAAM,SAAUoS,KAAM,6BAClFjhB,KAAKwP,eAAejO,IAAIs/D,EAAxB7gE,CAAsC,QAAS6vD,GAC/C58C,EAAQ3D,QAAQhL,OAAOu8D,GAcvB7gE,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAGjC,OAAOoC,QAAQC,IAAIq/B,GAGd68B,uBACL,eAAqB,6BAA6B59D,MAAKg/D,IACrD/gE,KAAK0/D,kBAAkBloC,SAAU,EACjCx3B,KAAKu+D,eAAiBwC,EAAMxC,gBAC5B,IAAA7kC,OAAM15B,KAAK0/D,kBAAkBtvC,SAAU,kBAAmB,CAACpwB,KAAKu+D,eAAe19D,aC/T9E,SAASmgE,GAAuB39D,GACrC,MAAM4H,EAAU5H,EAAOqP,WAAW,MAE5BuuD,EAAQ,IAAI52D,MAAM,GAAG6lB,KAAK,GAC1BgxC,EAASj2D,EAAQk2D,aAAa,EAAG,EAAG99D,EAAOzB,MAAOyB,EAAOxB,QAAQ4hD,KACvE,IAAI,IAAIl+C,EAAI,EAAGA,EAAI27D,EAAOrgE,OAAQ0E,GAAK,EACrC07D,EAAM,IAAMC,EAAO37D,GACnB07D,EAAM,IAAMC,EAAO37D,EAAI,GACvB07D,EAAM,IAAMC,EAAO37D,EAAI,GACvB07D,EAAM,IAAMC,EAAO37D,EAAI,GAGzB,MAAM67D,EAAeF,EAAOrgE,OAAS,EAC/BwgE,EAAW,IAAIC,kBAAkB,GAKvC,OAJAD,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EAClBC,ECPF,SAASE,GAAWj+C,EAAWk+C,EAAWx8D,EAAWwF,EAAY,GACtE8Y,GAAK,IAAKk+C,GAAK,IAAKx8D,GAAK,IACzB,MAAMnC,EAAMG,KAAKH,IAAIygB,EAAGk+C,EAAGx8D,GACrB/B,EAAMD,KAAKC,IAAIqgB,EAAGk+C,EAAGx8D,GAC3B,IAAIiX,EAAG3C,EAAGmoD,GAAK5+D,EAAMI,GAAO,EAE5B,GAAGJ,IAAQI,EACTgZ,EAAI3C,EAAI,MACH,CACL,IAAIsoB,EAAI/+B,EAAMI,EAEd,OADAqW,EAAImoD,EAAI,GAAM7/B,GAAK,EAAI/+B,EAAMI,GAAO2+B,GAAK/+B,EAAMI,GACvCJ,GACN,KAAKygB,EACHrH,GAAKulD,EAAIx8D,GAAK48B,GAAK4/B,EAAIx8D,EAAI,EAAI,GAC/B,MACF,KAAKw8D,EACHvlD,GAAKjX,EAAIse,GAAKse,EAAI,EAClB,MACF,KAAK58B,EACHiX,GAAKqH,EAAIk+C,GAAK5/B,EAAI,EAGtB3lB,GAAK,EAGP,MAAO,CACLA,EAAO,IAAJA,EACH3C,EAAO,IAAJA,EACHmoD,EAAO,IAAJA,EACHj3D,EAAAA,GAgBG,SAASk3D,GAAWzlD,EAAW3C,EAAWmoD,EAAWj3D,GAE1D,IAAI8Y,EAAWk+C,EAAWx8D,EAE1B,GAHAiX,GAAK,IAAewlD,GAAK,IAGhB,IAHCnoD,GAAK,KAIbgK,EAAIk+C,EAAIx8D,EAAIy8D,MACP,CACL,MAAME,EAAU,SAAiBrlC,EAAWqG,EAAWrwB,GAGrD,OAFGA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAE,EAAUgqB,EAAc,GAATqG,EAAIrG,GAAShqB,EAClCA,EAAI,GAAYqwB,EAChBrwB,EAAI,EAAE,EAAUgqB,GAAKqG,EAAIrG,IAAM,EAAE,EAAIhqB,GAAK,EACtCgqB,GAGHqG,EAAI8+B,EAAI,GAAMA,GAAK,EAAInoD,GAAKmoD,EAAInoD,EAAImoD,EAAInoD,EACxCgjB,EAAI,EAAImlC,EAAI9+B,EAClBrf,EAAIq+C,EAAQrlC,EAAGqG,EAAG1mB,EAAI,EAAE,GACxBulD,EAAIG,EAAQrlC,EAAGqG,EAAG1mB,GAClBjX,EAAI28D,EAAQrlC,EAAGqG,EAAG1mB,EAAI,EAAE,GAG1B,MAAO,CAACjZ,KAAKE,MAAU,IAAJogB,GAAUtgB,KAAKE,MAAU,IAAJs+D,GAAUx+D,KAAKE,MAAU,IAAJ8B,GAAUhC,KAAKE,MAAU,IAAJsH,IAiB7E,SAASo3D,GAAWC,GACzB,MAAMr8D,EAAiB,GACjBgvB,EAAqB,MAAZqtC,EAAK,GAAa,EAAI,EAKrC,GAJGA,EAAKhhE,SAAY,EAAI2zB,IACtBqtC,GAAQrtC,EAAS,IAAM,IAAM,IAAMqtC,EAAKjhE,MAAM4zB,IAG7CqtC,EAAKhhE,SAAY,EAAI2zB,EACtB,IAAI,IAAIjvB,EAAIivB,EAAQjvB,EAAIs8D,EAAKhhE,SAAU0E,EACrCC,EAAIsC,KAAKg6D,SAASD,EAAKt8D,GAAKs8D,EAAKt8D,GAAI,UAElC,GAAGs8D,EAAKhhE,SAAY,EAAI2zB,EAAS,CACtC,IAAI,IAAIjvB,EAAIivB,EAAQjvB,EAAKs8D,EAAKhhE,OAAS,IAAM0E,EAC3CC,EAAIsC,KAAKg6D,SAASD,EAAKt8D,GAAKs8D,EAAKt8D,GAAI,KAGvCC,EAAIsC,KAAKg6D,SAASD,EAAKA,EAAKhhE,OAAS,GAAI,UAEzC,IAAI,IAAI0E,EAAIivB,EAAQjvB,EAAIs8D,EAAKhhE,OAAQ0E,GAAK,EACxCC,EAAIsC,KAAKg6D,SAASD,EAAKjhE,MAAM2E,EAAGA,EAAI,GAAI,KAI5C,OAAOC,EAGF,SAASu8D,GAASC,GACvB,OAAOJ,GAAWI,EAAIphE,MAAM,EAAG,IAQ1B,SAASqhE,GAAWC,GACzB,MAAO,IAAMA,EAAKx3D,KAAI/F,IAAM,IAAMA,EAAE2kD,SAAS,KAAK1oD,OAAO,KAAIioB,KAAK,ICzIrD,SAASs5C,GAAmBD,GACzC,IAAI,EAACjmD,EAAC,EAAG,EAAEwlD,GAAKF,GAAWW,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAOlD,OANG5oD,EAAI,IACLA,EAAItW,KAAKC,IAAI,IAAKqW,EAAI,EAAI,IAAO,IAAMA,KAEzCmoD,EAAIz+D,KAAKH,IAAI,EAAO,IAAJ4+D,GAEH,QAAQxlD,MAAM3C,OAAOmoD,UCErB,MAAMW,GAkDnBziE,cAjDiB,KAAA0iE,OAJL,GAKK,KAAAC,QALL,GAQK,KAAAC,OAAS,GACT,KAAAC,aAAe,GAUf,KAAAC,OAAS,CACxB,EAAI,IAAO,GAAO,IAAO,EAAI,IAAM,EAAI,IAAM,EAAI,IAAM,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,GAAK,GACzF,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KACtF,GAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,GAAO,KAAO,KACpF,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,IAGrE,KAAAC,WAAa,CAC5B,CAAEzkD,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,IAAME,EAAG,KACd,CAAEF,EAAG,IAAME,EAAG,IACd,CAAEF,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,IAAME,EAAG,KACd,CAAEF,EAAG,IAAME,EAAG,KAEC,KAAAwkD,QAAU3iE,KAAK0iE,WAAW7hE,OAiGnC,KAAA+hE,QAAWtiE,IACdN,KAAK6iE,2BAIR7iE,KAAK8iE,cAAgBxiE,EAAEyiE,YACCx8D,IAArBvG,KAAKgjE,cACNhjE,KAAKgjE,YAAcz/C,sBAAsBvjB,KAAKijE,gBAI1C,KAAAA,YAAc,KACpB,IAAIttC,EAAO31B,KAAK8iE,aAAe9iE,KAAKwiE,aAGpC,GAFAxiE,KAAK8iE,cAAgB9iE,KAAKwiE,aAC1B7sC,EAAOA,EAAO,EAAI3yB,KAAKykB,MAAMkO,GAAQ3yB,KAAKmsC,KAAKxZ,GAC5CA,EAAM,CACP31B,KAAKkjE,WAAWvtC,GAChB,MAAMwtC,EAASnjE,KAAKojE,YAAYpjE,KAAKqjE,OAAQrjE,KAAKsjE,OAClDtjE,KAAKujE,aAAaJ,GAEpBnjE,KAAKgjE,iBAAcz8D,GAGb,KAAAi9D,yBAA2B,KACjC,MAAMC,EAASzjE,KAAK0jE,QACd7yD,EAAK4yD,EAAO17D,QACf8I,GACD7Q,KAAK2jE,cAAc9yD,GAGrB,MAAM+yD,EAAaH,EAAO5iE,OAK1B,OAJI+iE,IACF5jE,KAAK6iE,8BAA2Bt8D,KAGzBq9D,GAlHT,MAAMjuC,EAAO31B,KAAKuiE,OAASviE,KAAKyiE,OAAOziE,KAAKyiE,OAAO5hE,OAAS,GAE5D,IAAI,IAAI0E,EAAI,EAAG1E,EAASb,KAAKyiE,OAAO5hE,OAAQ0E,EAAI1E,IAAU0E,EACxDvF,KAAKyiE,OAAOl9D,GAAKvF,KAAKyiE,OAAOl9D,GAAKowB,EAGpC31B,KAAK6jE,kBAAoB7jE,KAAKyiE,OAAO/3D,KAAI,CAAC/F,EAAGY,EAAGC,K,MAC9C,OAAOb,GAAe,QAAV,EAAAa,EAAID,EAAI,UAAE,QAAI,MAItBw8D,SAASC,GACf,MAAMz5D,EAASw5D,GAASC,GACxB,MAAO,CAAC1+C,EAAG/a,EAAO,GAAIi5D,EAAGj5D,EAAO,GAAIvD,EAAGuD,EAAO,IAGxCu7D,aAAa/7D,GACnB,MAAMg8D,EAAY/jE,KAAK0iE,WAAW9hE,QAClC,KAAMmH,EAAQ,GACZg8D,EAAUj8D,KAAKi8D,EAAUh8D,WACvBA,EAGJ,MAAMQ,EAA2B,GACjC,IAAI,IAAIhD,EAAI,EAAGA,EAAIw+D,EAAUljE,OAAQ0E,GAAK,EACxCgD,EAAOT,KAAKi8D,EAAUx+D,IAExB,OAAOgD,EAGDy7D,iBAAiBC,EAAeC,EAAkBC,GACxD,MAAMle,EAAMjmD,KAAK8jE,aAAaG,GAC9B,IAAIE,EAAM,IAAuB,IAAjBA,EAAMtjE,OACpB,MAAO,CAAColD,GAGV,MACMme,EADUpkE,KAAK8jE,eAAeG,EAAQjkE,KAAK2iE,SACvBj4D,KAAI,CAAC25D,EAASl+D,KAC/B,CACL8X,GAAIomD,EAAQpmD,EAAIgoC,EAAI9/C,GAAK8X,GAAKimD,EAC9B/lD,GAAIkmD,EAAQlmD,EAAI8nC,EAAI9/C,GAAKgY,GAAK+lD,MAalC,OATkBC,EAAMz5D,KAAKhK,GACpB0jE,EAAU15D,KAAI,CAAC+jC,EAAUtoC,KACvB,CACL8X,EAAGgoC,EAAI9/C,GAAK8X,EAAIwwB,EAASxwB,EAAIvd,EAC7Byd,EAAG8nC,EAAI9/C,GAAKgY,EAAIswB,EAAStwB,EAAIzd,QAQ7B0iE,YAAYa,EAAeK,GAEjC,OADkBtkE,KAAKgkE,iBAAiBC,EAAOjkE,KAAKuiE,OAAQ,CAAC+B,IAC5C,GAGXpB,WAAWvtC,GAGjB,IAFA31B,KAAKsjE,OAAS3tC,EAER31B,KAAKsjE,OAAStjE,KAAKuiE,QACvBviE,KAAKsjE,OAAStjE,KAAKuiE,SACdviE,KAAKqjE,QAAUrjE,KAAK2iE,UACvB3iE,KAAKqjE,QAAUrjE,KAAK2iE,SAIxB,KAAM3iE,KAAKsjE,MAAQ,GACjBtjE,KAAKsjE,OAAStjE,KAAKuiE,SACdviE,KAAKqjE,OAAS,IACjBrjE,KAAKqjE,QAAUrjE,KAAK2iE,SA2ClB4B,qBAAqBR,GAC3B,MAAMlzD,EAAK7Q,KAAKwkE,MAAMC,gBAAgBzkE,KAAKqiE,OAAQriE,KAAKsiE,SAClDpB,EAASrwD,EAAG4yC,KAElB,IAAIjvB,EAAS,EACb,IAAI,IAAIrW,EAAI,EAAGA,EAAIne,KAAKsiE,UAAWnkD,EAAG,CACpC,MACMumD,EADevmD,EAAIne,KAAKsiE,QACS,GACjCqC,EAAmBD,EAAkBA,EAE3C,IAAI,IAAIzmD,EAAI,EAAGA,EAAIje,KAAKqiE,SAAUpkD,EAAG,CACnC,MAEM2mD,EAFe3mD,EAAIje,KAAKqiE,OAES,GAGjCwC,EAAc,IAFG7hE,KAAK8hE,KAAKF,EAAkBA,EAAkBD,GAG/DI,EAAQF,EAAcA,EAAc,GAAM,EAC1CG,EAAWhiE,KAAKiiE,IAAIF,GACpBG,EAAWliE,KAAKmiE,IAAIJ,GAEpBK,EAASpiE,KAAKH,IAAI,EAAKG,KAAKC,IAAI,EAAK,GAAM2hE,EAAkBM,EAAWR,EAAkBM,IAC1FK,EAASriE,KAAKH,IAAI,EAAKG,KAAKC,IAAI,EAAK,GAAM2hE,EAAkBI,EAAWN,EAAkBQ,IAEhG,IAAII,EAAc,EAEdhiD,EAAI,EACJk+C,EAAI,EACJx8D,EAAI,EAER,IAAI,IAAIO,EAAI,EAAGA,EAAIvF,KAAKulE,QAAQ1kE,OAAQ0E,IAAK,CAC3C,MAGMigE,EAAYJ,EAHHrB,EAAUx+D,GAAG0Y,EAItBwnD,EAAYJ,EAHHtB,EAAUx+D,GAAG4Y,EAK5B,IAAIswB,EAAWzrC,KAAKH,IAAI,EAAK,GAAMG,KAAK8hE,KAAKU,EAAYA,EAAYC,EAAYA,IACjFh3B,GAAWA,EAAWA,EAAWA,EACjC62B,GAAe72B,EAEfnrB,GAAKmrB,EAAWzuC,KAAKulE,QAAQhgE,GAAG+d,EAAI,IACpCk+C,GAAK/yB,EAAWzuC,KAAKulE,QAAQhgE,GAAGi8D,EAAI,IACpCx8D,GAAKypC,EAAWzuC,KAAKulE,QAAQhgE,GAAGP,EAAI,IAGtCk8D,EAAO1sC,KAAYlR,EAAIgiD,EAAc,IACrCpE,EAAO1sC,KAAYgtC,EAAI8D,EAAc,IACrCpE,EAAO1sC,KAAYxvB,EAAIsgE,EAAc,IACrCpE,EAAO1sC,KAAY,KAGvB,OAAO3jB,EAGD8yD,cAAc9yD,GACpB7Q,KAAKwkE,MAAMkB,aAAa70D,EAAI,EAAG,GAC/B7Q,KAAK2lE,KAAKjnB,UAAU1+C,KAAK4lE,IAAK,EAAG,EAAG5lE,KAAKqiE,OAAQriE,KAAKsiE,SAGhDiB,aAAaQ,GACnB/jE,KAAK2jE,cAAc3jE,KAAKukE,qBAAqBR,IAyBxCn0D,KAAK6B,GACVzR,KAAK0jE,QAAU,GACf1jE,KAAKqjE,OAAS,EACdrjE,KAAKsjE,MAAQ,EACbtjE,KAAK8iE,aAAe,OACIv8D,IAArBvG,KAAKgjE,cACNx/C,qBAAqBxjB,KAAKgjE,aAC1BhjE,KAAKgjE,iBAAcz8D,GAGrB,MAAMs/D,EAASp0D,EAAGq0D,aAAa,eAAe9lB,MAAM,KAAKp5C,UACzD5G,KAAKulE,QAAUM,EAAOn7D,KAAI8vC,GACjBx6C,KAAK+hE,SAASvnB,KAGnBx6C,KAAK4lE,MACP5lE,KAAK4lE,IAAMvkE,SAASC,cAAc,UAClCtB,KAAK4lE,IAAIhkE,MAAQ5B,KAAKqiE,OACtBriE,KAAK4lE,IAAI/jE,OAAS7B,KAAKsiE,QACvBtiE,KAAKwkE,MAAQxkE,KAAK4lE,IAAIlzD,WAAW,OAGnC1S,KAAK+lE,QAAUt0D,EACfzR,KAAK2lE,KAAO3lE,KAAK+lE,QAAQrzD,WAAW,MACpC1S,KAAK6lC,SAGAA,SACL,GAAG7lC,KAAKulE,QAAQ1kE,OAAS,EAAG,CAC1B,MAAM25C,EAAQx6C,KAAKulE,QAAQ,GAG3B,OAFAvlE,KAAK2lE,KAAKK,UAAY,OAAOxrB,EAAMl3B,MAAMk3B,EAAMgnB,MAAMhnB,EAAMx1C,UAC3DhF,KAAK2lE,KAAKM,SAAS,EAAG,EAAGjmE,KAAKqiE,OAAQriE,KAAKsiE,SAI7C,MAAMrc,EAAMjmD,KAAKojE,YAAYpjE,KAAKqjE,OAAQrjE,KAAKsjE,OAC/CtjE,KAAKujE,aAAatd,GAGbigB,iB,MACL,GAAGlmE,KAAKulE,QAAQ1kE,OAAS,EACvB,OAGF,MAAMyjE,EAAOtkE,KAAKsjE,MACZ6C,EAAQnmE,KAAKuiE,OAEnB,IAAI6D,EAEJ,MAAMjC,EAAkB,GACxB,IAAI,IAAI5+D,EAAI,EAAG1E,EAASb,KAAK6jE,kBAAkBhjE,OAAQ0E,EAAI1E,IAAU0E,EAAG,CACtE,MAAM8gE,EAAMrmE,KAAK6jE,kBAAkBt+D,GACnC,IAAI7E,GAAqB,QAAZ,EAAAyjE,EAAM5+D,EAAI,UAAE,QAAI++D,GAAQ+B,GAEjC3lE,EAAMogB,QAAQ,GAAKqlD,QAA4B5/D,IAAnB6/D,IAC9BA,EAAiB7gE,EACjB7E,GAASylE,GAGXhC,EAAMr8D,KAAKpH,GAMb,CAH0ByjE,EAAMvjE,MAAM,EAAGwlE,QACC7/D,IAAnB6/D,EAA+BjC,EAAMvjE,MAAMwlE,GAAkB,IAEhDrhE,SAAQ,CAACo/D,EAAOh+D,EAAKmgE,KACvD,MAAM3c,EAAOwa,EAAMA,EAAMtjE,OAAS,GAOlC,QANY0F,IAATojD,GAAsBA,EAAOwc,IAC9BhC,EAAMA,EAAMtjE,OAAS,IAAM8oD,EAAK7oC,QAAQ,IAG1C9gB,KAAKsjE,MAAQ3Z,MAAAA,EAAAA,EAAQ,GAEjBwa,EAAMtjE,OACR,OAGF,MAAMkjE,EAAY/jE,KAAKgkE,iBAAiBhkE,KAAKqjE,OAAQ8C,EAAOhC,GACzDh+D,IAASmgE,EAAOzlE,OAAS,KACrBb,KAAKqjE,QAAUrjE,KAAK2iE,UACvB3iE,KAAKqjE,QAAUrjE,KAAK2iE,SAIxB,MAAM1M,EAAM8N,EAAUr5D,KAAKu7C,GAClBjmD,KAAKukE,qBAAqBte,KAGnCjmD,KAAK0jE,QAAQ57D,QAAQmuD,MAGvBj2D,KAAK6iE,0BAA2B,GAChC,SAAQ7iE,KAAKwjE,0BAGR+C,cAAcniD,GAChBpkB,KAAKulE,QAAQ1kE,OAAS,GAAKujB,IAI3BA,IAAUpkB,KAAKwmE,sBAChBnlE,SAAShB,iBAAiB,QAASL,KAAK4iE,SACxC5iE,KAAKwmE,sBAAuB,IACnBpiD,GAASpkB,KAAKwmE,uBACvBnlE,SAASuN,oBAAoB,QAAS5O,KAAK4iE,SAC3C5iE,KAAKwmE,sBAAuB,IAIzBr7D,UACLnL,KAAKumE,eAAc,GAIdpyC,oBAAoB0xC,GACzB,MAAMxiE,EAAShC,SAASC,cAAc,UAOtC,OANA+B,EAAOzB,MArXG,GAsXVyB,EAAOxB,OAtXG,QAuXI0E,IAAXs/D,IACDxiE,EAAO2lB,QAAQ68C,OAASA,GAGnBxiE,EAGF8wB,cAAc0xC,GACnB,MAAMxiE,EAASrD,KAAKymE,aAAaZ,GAC3Ba,EAAmB,IAAItE,GAG7B,OAFAsE,EAAiB92D,KAAKvM,GAEf,CAACqjE,iBAAAA,EAAkBrjE,OAAAA,IC7Xf,MAAMsjE,GAyBnBhnE,cAhBO,KAAAinE,IAAM,EACN,KAAAC,WAAa,IACb,KAAAC,UAAY,GACZ,KAAAC,MAAQ,EACP,KAAAj+C,SAOJ,GAoGI,KAAAk+C,YAAc,KACpB3lE,SAASg0C,gBAAgB/xC,MAAMuoC,OAAS7rC,KAAK8oB,SAASm+C,WAAW3jE,MAAMuoC,OAAS,YAG1E,KAAAq7B,UAAY,KAClB7lE,SAASg0C,gBAAgB/xC,MAAMuoC,OAAS7rC,KAAK8oB,SAASm+C,WAAW3jE,MAAMuoC,OAAS,IAnGhF7rC,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAIolE,GAAYv5B,YAEzC,MAAMvnC,EAAO,uBACG8gE,GAAYv5B,WAAa,g+BAgBvBu5B,GAAYv5B,WAAa,cAAcu5B,GAAYv5B,WAAa,mKAIlEu5B,GAAYv5B,WAAa,qCACvBu5B,GAAYv5B,WAAa,6tBAavBu5B,GAAYv5B,WAAa,cAAcu5B,GAAYv5B,WAAa,mLAOpFptC,KAAKoB,UAAU0E,UAAYD,EAE3B7F,KAAK8oB,SAASq+C,IAAMnnE,KAAKoB,UAAUyoB,kBACnC7pB,KAAK8oB,SAASm+C,WAAajnE,KAAK8oB,SAASq+C,IAAIpwB,iBAC7C/2C,KAAK8oB,SAAS+9C,WAAa7mE,KAAK8oB,SAASq+C,IAAIt9C,kBAAkBA,kBAE/D7pB,KAAK8oB,SAASs+C,QAAUpnE,KAAK8oB,SAASq+C,IAAItqC,mBAE1C78B,KAAK8oB,SAAS89C,IAAM5mE,KAAK8oB,SAASs+C,QAAQv9C,kBAC1C7pB,KAAK8oB,SAASu+C,WAAarnE,KAAK8oB,SAAS89C,IAAI7vB,iBAE7C/2C,KAAKsnE,cAAgB,IAAI,IAAW,CAACxnE,WAAW,EAAMuT,MAAO,yBAC7DrT,KAAKunE,cAAgB,IAAI,IAAW,CAACznE,WAAW,EAAMuT,MAAO,yBAE7D,MAAMm0D,EAASnmE,SAASC,cAAc,OACtCkmE,EAAOl8D,UAAYq7D,GAAYv5B,WAAa,UAC5Co6B,EAAOljE,OAAOtE,KAAKsnE,cAAclmE,UAAWpB,KAAKunE,cAAcnmE,WAC/DpB,KAAKoB,UAAUkD,OAAOkjE,GAEtBxnE,KAAKsnE,cAAcvnE,MAAMM,iBAAiB,SAAS,KACjD,IAAIK,EAAQV,KAAKsnE,cAAc5mE,MAAMC,QAAQ,KAAM,IAAIC,MAAM,EAAG,GAEhE,MAAMwV,EAAQ1V,EAAM0V,MAAM,iBACpBqxD,EAAQrxD,GAASA,EAAM,GAAGvV,SAAWH,EAAMG,QAAU,CAAa,GAAG0+B,SAAS7+B,EAAMG,QAC1Fb,KAAKsnE,cAAcvsC,SAAS0sC,EAAQ,EAAAzsC,EAAA,QAAqB,EAAAA,EAAA,OAEzDt6B,EAAQ,IAAMA,EACdV,KAAKsnE,cAAcxmE,iBAAiBJ,GAEjC+mE,GACDznE,KAAK0nE,SAAShnE,GAAO,GAAO,MAKhC,MAAMinE,EAAY,wHAClB3nE,KAAKunE,cAAcxnE,MAAMM,iBAAiB,SAAS,KACjD,MAAM+V,EAAQpW,KAAKunE,cAAc7mE,MAAM0V,MAAMuxD,GAC7C3nE,KAAKunE,cAAcxsC,SAAS3kB,EAAQ,EAAA4kB,EAAA,QAAqB,EAAAA,EAAA,OAEtD5kB,GACDpW,KAAK0nE,SAASnG,IAAYnrD,EAAM,IAAKA,EAAM,IAAKA,EAAM,KAAK,GAAM,MAIrEpW,KAAK4nE,qBACL5nE,KAAK6nE,qBAWCD,qBACNjqD,GAAoB3d,KAAK8oB,SAASq+C,KAAY,KAC5CnnE,KAAKgnE,cACLhnE,KAAK8nE,QAAU9nE,KAAK8oB,SAASq+C,IAAI1nD,2BAE/BwmC,IACFjmD,KAAK+nE,kBAAkB9hB,EAAIhoC,EAAGgoC,EAAI9nC,MACjC,KACDne,KAAKknE,eAIDW,qBACNlqD,GAAoB3d,KAAK8oB,SAAS89C,KAAY,KAC5C5mE,KAAKgnE,cACLhnE,KAAKgoE,QAAUhoE,KAAK8oB,SAAS89C,IAAInnD,2BAE/BwmC,IACFjmD,KAAKioE,WAAWhiB,EAAIhoC,MACnB,KACDje,KAAKknE,eAIFQ,SAASltB,EAA2B0tB,GAAiB,EAAMC,GAAiB,GACjF,QAAa5hE,IAAVi0C,EACDA,EAAQ,CACNv+B,EAAG,EACH3C,EAAG,IACHmoD,EAAG,GACHj3D,EAAG,QAEA,GAAqB,iBAAZ,EACd,GAAgB,MAAbgwC,EAAM,GACPA,EH3CD,SAAoBqnB,GACzB,MAAMK,EAAON,GAAWC,GACxB,OAAON,GAAWW,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IGyCpCkG,CAAW5tB,OACd,CACL,MAAM6tB,EAAM7tB,EAAMpkC,MAAM,YACxBokC,EAAQ+mB,IAAY8G,EAAI,IAAKA,EAAI,IAAKA,EAAI,QAAe9hE,IAAX8hE,EAAI,GAAmB,GAAKA,EAAI,IAKlFroE,KAAK8nE,QAAU9nE,KAAK8oB,SAASq+C,IAAI1nD,wBAEjC,MAAM6oD,EAAOtoE,KAAK8nE,QAAQlmE,MAAQ,IAAM44C,EAAMlhC,EACxCivD,EAAW,IAAO/tB,EAAMinB,GAAK,IAAMjnB,EAAMlhC,EAAI,GAAM,IACnDkvD,EAAOxoE,KAAK8nE,QAAQjmE,OAAS,IAAM0mE,EAEzCvoE,KAAK+nE,kBAAkB/nE,KAAK8nE,QAAQjnD,KAAOynD,EAAMtoE,KAAK8nE,QAAQlvC,IAAM4vC,GAAM,GAG1ExoE,KAAKgoE,QAAUhoE,KAAK8oB,SAAS89C,IAAInnD,wBAEjC,MAAMgpD,EAAajuB,EAAMv+B,EAAI,IACvBysD,EAAO1oE,KAAKgoE,QAAQnnD,KAAO7gB,KAAKgoE,QAAQpmE,MAAQ6mE,EAEtDzoE,KAAKioE,WAAWS,GAAM,GAGtB1oE,KAAK4mE,IAAMpsB,EAAMv+B,EACjBjc,KAAK6mE,WAAarsB,EAAMlhC,EACxBtZ,KAAK8mE,UAAYtsB,EAAMinB,EACvBzhE,KAAK+mE,MAAQvsB,EAAMhwC,EAEnBxK,KAAK2oE,aAAaT,EAAgBC,GAG7BS,kBACL,MAAMC,EAAYnH,GAAW1hE,KAAK4mE,IAAK5mE,KAAK6mE,WAAY7mE,KAAK8mE,UAAW9mE,KAAK+mE,OACvElF,EAAOI,GAAW4G,GAClB7G,EAAMH,EAAKjhE,MAAM,GAAI,GAE3B,MAAO,CACLkoE,IAAK,OAAO9oE,KAAK4mE,QAAQ5mE,KAAK6mE,gBAAgB7mE,KAAK8mE,cACnDuB,IAAK,OAAOQ,EAAU,OAAOA,EAAU,OAAOA,EAAU,MACxD7G,IAAKA,EACL+G,KAAM,QAAQ/oE,KAAK4mE,QAAQ5mE,KAAK6mE,gBAAgB7mE,KAAK8mE,eAAe9mE,KAAK+mE,SACzE7E,KAAM,QAAQ2G,EAAU,OAAOA,EAAU,OAAOA,EAAU,OAAOA,EAAU,MAC3EhH,KAAMA,EACNgH,UAAWA,GAIRF,aAAaT,GAAiB,EAAMC,GAAiB,GAC1D,MAAM3tB,EAAQx6C,KAAK4oE,kBACnB5oE,KAAK8oB,SAASm+C,WAAW9+C,eAAe,KAAM,OAAQqyB,EAAMwnB,KAEzDkG,IACDloE,KAAKsnE,cAAcxmE,iBAAiB05C,EAAMwnB,KAC1ChiE,KAAKsnE,cAAcvsC,SAAS,EAAAC,EAAA,UAG3BmtC,IACDnoE,KAAKunE,cAAczmE,iBAAiB05C,EAAMquB,UAAUjoE,MAAM,GAAI,GAAGioB,KAAK,OACtE7oB,KAAKunE,cAAcxsC,SAAS,EAAAC,EAAA,UAG3Bh7B,KAAK+M,UACN/M,KAAK+M,SAASytC,GAIVytB,WAAW/pD,EAAe2nB,GAAS,GACzC,MAEMtlB,GAFS,EAAAC,GAAA,GAAMtC,EAAQle,KAAKgoE,QAAQnnD,KAAM,EAAG7gB,KAAKgoE,QAAQpmE,OAEtC5B,KAAKgoE,QAAQpmE,MACvC5B,KAAK4mE,IAAM5jE,KAAKE,MAAM,IAAMqd,GAE5B,MAAMwoD,EAAO,QAAQ/oE,KAAK4mE,mBAAmB5mE,KAAK+mE,SAElD/mE,KAAK8oB,SAASu+C,WAAWl/C,eAAe,KAAM,IAAiB,IAAX5H,EAAkB,KACtEvgB,KAAK8oB,SAASu+C,WAAWl/C,eAAe,KAAM,OAAQ4gD,GAEtD/oE,KAAK8oB,SAAS+9C,WAAW9vB,iBAAiB5uB,eAAe,KAAM,aAAc4gD,GAE1EljC,GACD7lC,KAAK2oE,eAIDZ,kBAAkB7pD,EAAeE,EAAeynB,GAAS,GAC/D,MAAMmjC,EAAOhpE,KAAK8nE,QAAQlmE,MACpBqnE,EAAOjpE,KAAK8nE,QAAQjmE,OAKpBqnE,GAHS,EAAA1oD,GAAA,GAAMtC,EAAQle,KAAK8nE,QAAQjnD,KAAM,EAAGmoD,GAG7BA,EAAO,IACvBG,GAHS,EAAA3oD,GAAA,GAAMpC,EAAQpe,KAAK8nE,QAAQlvC,IAAK,EAAGqwC,GAG5BA,EAAO,IAEvBhC,EAAajnE,KAAK8oB,SAASm+C,WACjCA,EAAW9+C,eAAe,KAAM,IAAK+gD,EAAO,KAC5CjC,EAAW9+C,eAAe,KAAM,IAAKghD,EAAO,KAE5C,MAAMtC,GAAa,EAAArmD,GAAA,GAAM0oD,EAAM,EAAG,KAE5BE,EAAa,IAAMvC,EAAa,EAChCwC,EAAa,KAAM,EAAA7oD,GAAA,GAAM2oD,EAAM,EAAG,KAElCrC,GAAY,EAAAtmD,GAAA,GAAM6oD,EAAa,IAAMD,EAAY,EAAG,KAE1DppE,KAAK6mE,WAAaA,EAClB7mE,KAAK8mE,UAAYA,EAEdjhC,GACD7lC,KAAK2oE,gBAhRM,GAAAv7B,WAAa,eCEf,MAAMk8B,WAA8Bx6D,EAAnD,c,oBA2FU,KAAAy6D,YAAc,CAACvH,EAAawH,GAAoB,KACtD,GAAGA,EACDxpE,KAAKypE,YAAY/B,SAAS1F,OACrB,CACL,MAAME,EAAON,GAAWI,GAClB0H,EAAa1pE,KAAK2pE,MAAMD,WACxBX,EAAO5G,GAAmBD,GAEhCwH,EAAW74D,GAAK,IAChB64D,EAAWE,UAAY,EACvBF,EAAWG,KAAO,GAClBH,EAAWlvB,MAAQwnB,EAAI7hB,cACvBupB,EAAWvH,mBAAqB4G,EAChC1vC,EAAA,oBAA4B,WAAYxuB,EAAA,kBAExC,0BAA+BtE,OAAWA,GAAW,GACrDvG,KAAK8L,cAID,KAAAg+D,cAAiBtvB,IACvBx6C,KAAK+pE,WAAWvvB,EAAMwnB,KAAK,IA1G7BpyD,OACE5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,uBAAwB,8BACrDvB,KAAKkQ,SAAS,YAEdlQ,KAAK2pE,MAAQ9+D,EAAA,mBAEb,MAAMoI,EAAU,IAAIC,GAAe,IACnClT,KAAKypE,YAAc,IAAI9C,GAEvB1zD,EAAQ3D,QAAQhL,OAAOtE,KAAKypE,YAAYroE,WAExCpB,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAE/B,MAAM4oE,EAAc,IAAI92D,GAAe,IAEjC+2D,EAAOjqE,KAAKiqE,KAAO5oE,SAASC,cAAc,OAChD2oE,EAAK1pE,UAAUgB,IAAI,QAEJ,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGKwD,SAAQy1C,IACb,MAAM5yC,EAAOvG,SAASC,cAAc,OACpCsG,EAAKrH,UAAUgB,IAAI,aACnBqG,EAAKohB,QAAQwxB,MAAQA,EAAM2F,cAG3B,MAAM7pC,EAAQjV,SAASC,cAAc,OACrCgV,EAAM/V,UAAUgB,IAAI,mBACpB+U,EAAMhT,MAAM4mE,gBAAkB1vB,EAE9B5yC,EAAKtD,OAAOgS,GACZ2zD,EAAK3lE,OAAOsD,OAGd,QAAiBqiE,GAAO3pE,IACtB,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,aACzC,IAAIA,GAAUA,EAAOjY,UAAUmT,SAAS,UACtC,OAGF,MAAM8mC,EAAQhiC,EAAOwQ,QAAQwxB,MACzBA,GAIJx6C,KAAK+pE,WAAWvvB,KACf,CAAChrC,eAAgBxP,KAAKwP,iBAEzBw6D,EAAY16D,QAAQhL,OAAO2lE,GAC3BjqE,KAAK4M,WAAWtI,OAAO0lE,EAAY5oE,WAEnCpB,KAAK+pE,YAAa,EAAAjmB,GAAA,GAAS9jD,KAAKupE,YAAa,IAAI,GAG3Cz9D,YACN,MAAMypC,EAASv1C,KAAKiqE,KAAK14D,cAAc,WACjCm4D,EAAa1pE,KAAK2pE,MAAMD,WACxBlxD,EAASkxD,EAAWlvB,MAAQx6C,KAAKiqE,KAAK14D,cAAc,0BAA0Bm4D,EAAWlvB,WAAa,KACzGjF,IAAW/8B,IAIX+8B,GACDA,EAAOh1C,UAAUC,OAAO,UAGvBgY,GACDA,EAAOjY,UAAUgB,IAAI,WA4BzBoQ,SACEvE,YAAW,KACT,MAAMs8D,EAAa1pE,KAAK2pE,MAAMD,WAExBlvB,GAASkvB,EAAWlvB,OAAS,IAAIwF,MAAM,KAAK,GAC5CmqB,IAAc3vB,IAAUkvB,EAAWG,KAGtCM,IACDnqE,KAAKypE,YAAY18D,SAAW/M,KAAK8pE,eAGnC9pE,KAAKypE,YAAY/B,SAASltB,GAAS,WAE/B2vB,IACFnqE,KAAKypE,YAAY18D,SAAW/M,KAAK8pE,iBAElC,GAGLh6D,sBAIE,OAHA9P,KAAKypE,YAAY18D,cAAWxG,EAC5BvG,KAAKypE,iBAAcljE,EAEZ1G,MAAMiQ,uBC7HjB,IAAIs6D,GAAe,EAEJ,MAAMC,WAAyBv7D,EAA9C,c,oBAEU,KAAA2yB,OAAS,EAET,KAAA6oC,QAAsB,IAAI5kE,IAG1B,KAAA6kE,oBAAmD,IAAIn5D,IACvD,KAAAo5D,cAA0C,IAAIp5D,IAsE9C,KAAAq5D,cAAgB,MACtB,SAAY,oCAAoC1oE,MAAK2oE,IACnD,MAAM75D,EAAK,uBAAwBu5D,GAE7Bz7C,EAAQ,CACZrlB,EAAG,YACH2S,EAAG,EACHZ,EAAG,EACHhG,SAAU,GACVnU,KAAMwpE,EAAKxpE,KACXjB,KAAM,QAER,IAAIoB,EAAuB,CACzBiI,EAAG,WACHqhE,YAAa,GACbnuD,WAAY,GACZouD,MAAO,EACPC,eAAgB,GAChBh6D,GAAAA,EACAotC,UAAWysB,EAAKzqE,KAChBiB,KAAMwpE,EAAKxpE,KACX2rB,KAAMwtB,KAAKC,MAAQ,IACnBt/B,OAAQ,GACRc,OAAQ,CAAC6S,GACTlS,UAAWiuD,EAAK5mE,MAGlBzC,EAAWyW,EAAA,UAAuBzW,GAElC,MAAM6W,EAAeC,GAAA,kBAAmC9W,GACxD6W,EAAagnC,WAAawrB,EAAKxpE,KAC/BgX,EAAaG,IAAMssC,IAAIC,gBAAgB8lB,GAEvC,IAAII,EAAiC,CACnCxhE,EAAG,YACHqhE,YAAa,GACbtpE,SAAUA,EACVwP,GAAAA,EACAg5D,KAAMh5D,EACNmK,OAAQ,IAGV,MAAM+vD,EAAS5yD,GAAA,SAA0BuyD,EAAMA,EAAK5mE,MAE9CsX,GAAW,UACjBA,EAAS4vD,kBAAoBD,EAAOC,kBACpC5vD,EAASkU,OAASy7C,EAAOz7C,OAEzBy7C,EAAOhpE,MAAKqS,IACV,eAAqB,0BAA2B,CAC9Cs2D,KAAMt2D,EACN6pC,UAAWysB,EAAKzqE,KAChBugE,SAAU,CACRl3D,EAAG,uBAEJvH,MAAKkpE,IACN,MAAMC,EAAUD,EAAmC5pE,SAC7C8pE,EAAkBhzD,GAAA,kBAAmC+yD,GAC3DxwD,OAAO49C,OAAO6S,EAAiBjzD,GAE/B4yD,EAAYG,EACZH,EAAUzpE,SAAWyW,EAAA,UAAuBgzD,EAAUzpE,UAEtDrB,KAAKorE,sBAAsBN,GAAW/oE,KAAKqZ,EAASjT,QAASiT,EAASoU,UACrEpU,EAASoU,UACXpU,EAASoU,QAEZ,MAAMrf,EAAMnQ,KAAKqrE,gBAAgBP,GACjC1vD,EAASrZ,MAAK,KACZ/B,KAAKsqE,QAAQt6D,OAAOG,MAClBtC,IACFzM,EAAUZ,YAIZ,MAAMunB,EAAY,IAAI,KAAqB,CACzCk3B,UAAU,EACVj3B,YAAY,EACZF,gBAAgB,IAGZ1mB,EAAYpB,KAAKsrE,aAAaR,GAAW,GAC/C9qE,KAAKsqE,QAAQ/oE,IAAI4O,GAEjB4X,EAAU+G,OAAO1tB,GAAW,EAAOga,OAI/B,KAAAmwD,aAAe,KACrB,MAAMC,EAAe,EAAAC,WAAA,sBAAgCn5D,GAAKA,EAAExO,OAAS9D,KAAK2pE,MAAM7lE,OAC7E0nE,MACCxrE,KAAKyhC,OACPzhC,KAAK2pE,MAAMD,YAAa,EAAAxsD,GAAA,GAAKsuD,EAAa9B,YAC1CrwC,EAAA,oBAA4B,WAAYxuB,EAAA,kBACxC,0BAA+BtE,OAAWA,GAAW,GACrDvG,KAAK0rE,kBAAkB5qE,iBAAiBd,KAAK2pE,MAAMD,WAAWiC,QAwG1D,KAAAC,YAAetrE,IACrB,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,aACzC,IAAIA,EAAQ,OAEZ,MAAMsyD,EAAY9qE,KAAKuqE,oBAAoB74D,IAAI8G,GAC/C,GAAmB,oBAAhBsyD,EAAUxhE,EAEX,YADAtJ,KAAKorE,sBAAsBN,GAI7B,MAAM36D,EAAMnQ,KAAKqrE,gBAAgBP,GACjC,GAAG9qE,KAAKsqE,QAAQzgE,IAAIsG,GAAM,OAC1BnQ,KAAKsqE,QAAQ/oE,IAAI4O,GAEjB,MAAM0H,EAAMizD,EAAUzpE,SAChB0mB,EAAY,IAAI,KAAqB,CACzCC,YAAY,EACZF,gBAAgB,IAGZtmB,EAAO,KACX,MAAM6G,EAAUrI,KAAKorE,sBAAsBN,GACtB3yD,GAAA,kBAAmCN,GACvCQ,MAAOrY,KAAK2pE,MAAMD,WAAWiC,MAC5C5jD,EAAU+G,OAAOtW,GAAQ,EAAMnQ,IAInC0f,EAAUE,aAEV,QAAiBzP,GAASlY,IACrBynB,EAAUA,UAAU9jB,eACrB8jB,EAAU7G,QAAQ5gB,GAClBynB,EAAUs3B,UAEV79C,MAED,CAACgO,eAAgBxP,KAAKwP,iBAEzBhO,KAKM,KAAAqqE,YAAc,CAAChC,EAAcxxD,KACnCzC,MAAMyC,GAAKtW,MAAK8T,IACdsC,GAAA,oBAAqC,eAAiB0xD,EAAMh0D,OAIxD,KAAAu1D,sBAAyBN,IAC/B,IAAIgB,IAAY9rE,KAAKyhC,OACrB,MAAM5Q,EAAa,IAAMi7C,IAAY9rE,KAAKyhC,OAEpC5pB,EAAOizD,EAAkCzpE,SACzC+Z,GAAW,UACjB,IAAIsU,EA2EJ,OA1EG7X,GACD6X,EAAW5X,EAAA,cAA2BD,EAAK,gBAA4B,sCAAkD,GACzHuD,EAAS4vD,kBAAoBt7C,EAASs7C,kBACtC5vD,EAASkU,OAASI,EAASJ,QAE3BI,EAAWlsB,QAAQ2E,UAGrBunB,EAAS3tB,MAAK,KACZ,IAAI8uB,IAEF,YADAzV,EAASjT,UAIX,MAAMuhE,EAAa1pE,KAAK2pE,MAAMD,WACxBqC,EAAW1zD,IAEf,IAAI2zD,EACJ,GAAG3zD,IAAQrY,KAAK2pE,MAAMD,WAAWlvB,MAC/BwxB,ENtWH,SAAsBC,GAC3B,MAAMp9C,EAAMxtB,SAASC,cAAc,OACnC,OAAO,IAAIkC,SAA4B2E,KACrC,EAAAy3C,GAAA,IAAmB/wB,EAAKo9C,GAAU,KAChC,MAAM5oE,EAAShC,SAASC,cAAc,UAChC8yB,EAAQvF,EAAIq9C,aAAer9C,EAAIs9C,cAExB,IAAV/3C,GACD/wB,EAAOzB,MAFU,GAGjByB,EAAOxB,OAASwB,EAAOzB,MAAQwyB,GACvBA,EAAQ,GAChB/wB,EAAOxB,OALU,GAMjBwB,EAAOzB,MAAQyB,EAAOxB,OAASuyB,GAE/B/wB,EAAOzB,MAAQyB,EAAOxB,OARL,GAWHwB,EAAOqP,WAAW,MAC1BgsC,UAAU7vB,EAAK,EAAG,EAAGA,EAAIq9C,aAAcr9C,EAAIs9C,cAAe,EAAG,EAAG9oE,EAAOzB,MAAOyB,EAAOxB,QAC7FsG,EAAQ64D,GAAuB39D,UMmVT+oE,CAAa/zD,OAC1B,CACL,MAAM,OAAChV,GAAU++D,GAA+BiK,OAAOrsE,KAAKssE,uBAAuBxB,IACnFkB,EAAkBxoE,QAAQ2E,QAAQ64D,GAAuB39D,IAG3D2oE,EAAgBjqE,MAAMk/D,I,UACpB,IAAIpwC,IAEF,YADAzV,EAASjT,UAIX,MAAM4gE,EAAO5G,GAAmB93D,MAAMC,KAAK22D,IAIrC4I,EAA8C,QAAtC,EAAAiB,EAAkCjB,YAAI,QAAI,GACxDH,EAAW74D,GAAKi6D,EAAUj6D,GAC1B64D,EAAWE,UAAyC,QAA7B,EAAkB,QAAlB,EAAAkB,EAAUtK,gBAAQ,eAAEoJ,iBAAS,QAAI,EACxDF,EAAWlvB,MAAQx6C,KAAKssE,uBAAuBxB,GAC/CpB,EAAWG,KAAOA,EAClBH,EAAWvH,mBAAqB4G,EAChC1vC,EAAA,oBAA4B,WAAYxuB,EAAA,kBAErCg/D,GACD7pE,KAAK6rE,YAAYhC,EAAMxxD,GAGzB,qBAA+BwxD,EAAMxxD,GAAK,GAAMtW,KAAKqZ,EAASjT,aAIlE,IAAI0P,EAEF,YADAk0D,IAIF,MAAM7zD,EAAeC,GAAA,kBAAmCN,GACrD6xD,EAAWiC,KACZv+D,YAAW,MACT,QAAK8K,EAAaG,IAAK,GAAI,GAC1BtW,MAAKsW,IACAwY,IAKJk7C,EAAQ1zD,GAJN+C,EAASjT,eAMZ,KAEH4jE,EAAQ7zD,EAAaG,QAIlB+C,GAGD,KAAAtP,UAAY,KAClB,MAAMypC,EAASv1C,KAAKiqE,KAAK14D,cAAc,WACjCiH,EAASxY,KAAKwqE,cAAc94D,IAAI1R,KAAKusE,yBAAyBvsE,KAAK2pE,QACtEp0B,IAAW/8B,IAIX+8B,GACDA,EAAOh1C,UAAUC,OAAO,UAGvBgY,GACDA,EAAOjY,UAAUgB,IAAI,YA7ZzBqO,OACE5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,uBAAwB,8BACrDvB,KAAKkQ,SAAS,kBAEdlQ,KAAK2pE,MAAQ9+D,EAAA,mBAEb,CACE,MAAMzJ,EAAYq4D,GAAgBz5D,KAAK4M,YAEjC4/D,GAAe,OAAO,8BAA+B,CAAC39D,KAAM,YAAaoS,KAAM,mCAC/EwrD,GAAc,OAAO,8BAA+B,CAAC59D,KAAM,WAAYoS,KAAM,aAC7EyrD,GAAc,OAAO,8BAA+B,CAAC79D,KAAM,aAAcoS,KAAM,sBAErF,QAAiBurD,EAAcxsE,KAAKyqE,cAAe,CAACj7D,eAAgBxP,KAAKwP,kBAEzE,QAAiBi9D,GAAa,KAC5B,IAAInD,GAAsBtpE,KAAK+O,QAAQY,SACtC,CAACH,eAAgBxP,KAAKwP,kBAEzB,QAAiBk9D,EAAa1sE,KAAKurE,aAAc,CAAC/7D,eAAgBxP,KAAKwP,iBAEvE,MAAMk8D,EAAoB1rE,KAAK0rE,kBAAoB,IAAI,KAAc,CACnEzqD,KAAM,sBACNnd,KAAM,OACN6d,QAAS3hB,KAAK2pE,MAAMD,WAAWiC,KAC/BjvC,YAAY,IAGd18B,KAAKwP,eAAejO,IAAImqE,EAAkB3rE,MAA1CC,CAAiD,UAAU,KACzDA,KAAK2pE,MAAMD,WAAWiC,KAAOD,EAAkB3rE,MAAM4hB,QACrD0X,EAAA,oBAA4B,WAAYxuB,EAAA,kBAGxCuC,YAAW,KACT,MAAMmoC,EAAS00B,EAAK14D,cAAc,WAClC,IAAIgkC,EAAQ,OAEZ,MAAMu1B,EAAY9qE,KAAKuqE,oBAAoB74D,IAAI6jC,GAC3Cu1B,EAAkC9vD,OAAO2xD,SAA2B,oBAAhB7B,EAAUxhE,GAIlEtJ,KAAKorE,sBAAsBN,KAC1B,QAGL1pE,EAAUkD,OAAOkoE,EAAcC,EAAaC,EAAahB,EAAkBr4D,OAG7ExI,EAAA,yBAA2B,oBAAqB7K,KAAK8L,WAErD,uBAA6B,CAACo0B,OAAQ,0BAA0Bn+B,MAAM6qE,IAChDA,EAA0DC,WACnE9nE,SAAS+lE,IAClB9qE,KAAKsrE,aAAaR,SAMtB,MAAMgC,EAAgBrT,GAAgBz5D,KAAK4M,YACrCq9D,EAAOjqE,KAAKiqE,KAAO5oE,SAASC,cAAc,OAChD2oE,EAAK1pE,UAAUgB,IAAI,SACnB,QAAiB0oE,EAAMjqE,KAAK4rE,YAAa,CAACp8D,eAAgBxP,KAAKwP,iBAC/Ds9D,EAAcxoE,OAAO2lE,GAsGfqC,uBAAuBxB,GAC7B,OAAOA,EAAUtK,SAAW,CAC1BsK,EAAUtK,SAASuM,iBACnBjC,EAAUtK,SAASwM,wBACnBlC,EAAUtK,SAASyM,uBACnBnC,EAAUtK,SAAS0M,yBACnBpjE,OAAOa,SAASD,KAAI8vC,GAAS,IAAMA,EAAM8O,SAAS,MAAKzgC,KAAK,KAAO,GAG/DwiD,gBAAgBP,GACtB,MAAO,GAAKA,EAAUj6D,GAGhB07D,yBAAyB5C,GAC/B,MAAO,GAAKA,EAAMD,WAAW74D,GAGvBy6D,aAAaR,EAAsBxmE,GAAS,G,MAClD,MAAMuhE,EAAS7lE,KAAKssE,uBAAuBxB,GACrCqC,EAA0B,cAAhBrC,EAAUxhE,EAC1B,GAAI6jE,GAAWrC,EAAU9vD,OAAO2xD,UAAY9G,EAE1C,OAGF,MAAMuH,IAAWtC,EAAU9vD,OAAOqyD,KAE5Bx1D,EAAkBs1D,EAAWrC,EAAUzpE,SAAWyW,EAAA,UAAuBgzD,EAAUzpE,eAAakF,EAEhGnF,EAAYC,SAASC,cAAc,OACzCF,EAAUb,UAAUgB,IAAI,aAExBH,EAAU4nB,QAAQnY,GAAK,GAAKi6D,EAAUj6D,GAEtC,MAAMV,EAAMnQ,KAAKqrE,gBAAgBP,GACjC9qE,KAAKuqE,oBAAoBtlE,IAAI7D,EAAW0pE,GACxC9qE,KAAKwqE,cAAcvlE,IAAIkL,EAAK/O,GAE5B,MAAMkV,EAAQjV,SAASC,cAAc,OAGrC,IAAI6sB,EAAuCjtB,EAkC3C,GApCAoV,EAAM/V,UAAUgB,IAAI,mBAGjB4rE,GACDjsE,EAAOgb,EAAA,kBAAiCrE,EAAK,IAAK,KAClDsW,EAAUC,GAAU,CAClB/nB,MAAOwR,EACP3R,QAAS,KACT9E,UAAWkV,EACXkY,kBAAkB,EAClBttB,KAAMA,EACN0/C,SAAUkqB,EAAU9vD,OAAO2xD,WAG5Bx+C,EAAQI,aAAaI,OAASR,EAAQI,aAAaK,MAAM7sB,MAAK,KAC7D0/C,GAAA,UAAqB,KACnBrgD,EAAUkD,OAAOgS,SAIlBw0D,EAAU9vD,OAAO2xD,UAClBr2D,EAAM/V,UAAUgB,IAAI,cAEjB6rE,GACDj/C,EAAQO,OAAOE,KAAKtrB,MAAMC,QAAU,OACjC4qB,EAAQO,OAAOC,QAChBR,EAAQO,OAAOC,MAAMrrB,MAAMC,QAAU,UAEb,QAAlB,EAAAunE,EAAUtK,gBAAQ,eAAEoJ,aAC5Bz7C,EAAQO,OAAOE,KAAKtrB,MAAMwqD,QAAU,GAAK9qD,KAAK4yB,IAAIk1C,EAAUtK,SAASoJ,WAAa,OAItFxoE,EAAUkD,OAAOgS,GAGhBw0D,EAAUtK,eAAoDj6D,IAAxCukE,EAAUtK,SAASuM,iBAAgC,CAC1E,MAAM,OAAC1pE,GAAU++D,GAA+BiK,OAAOxG,GAGvD,GAFAxiE,EAAO9C,UAAUgB,IAAI,4BAElB6rE,GAAUD,EAAS,CACpB,MAAMj1D,EAAeC,GAAA,kBAAmCN,EAAK3W,EAAKjB,MAClEkuB,EAAQI,aAAaK,KAAK7sB,MAAK,KAC7BsB,EAAOC,MAAMgqE,gBAAkB,OAAOp1D,EAAaG,OACnDhV,EAAOC,MAAMwqD,QAAU,GAAK9qD,KAAK4yB,IAAIk1C,EAAUtK,SAASoJ,WAAa,IACrEtzD,EAAMhS,OAAOjB,WAGfiT,EAAMhS,OAAOjB,GAUjB,OANGrD,KAAKusE,yBAAyBvsE,KAAK2pE,SAAWx5D,GAC/C/O,EAAUb,UAAUgB,IAAI,UAG1BvB,KAAKiqE,KAAK3lE,EAAS,SAAW,WAAWlD,GAElCA,GC5RX,MAAMmsE,GAAkB,iBAET,MAAMC,WAAsB,KAOzC7tE,YAAoB8tE,GAClB5tE,MAAM,iBAAkB,KAAM,CAAC8jC,UAAU,EAAM9H,iBAAiB,EAAMhiB,MAAM,IAD1D,KAAA4zD,gBAAAA,EA0CZ,KAAAC,gBAAmBptE,IACzB,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,uBACzC,IAAIA,EAAQ,OAEZ,MAAMm1D,EAASn1D,EAAOwQ,QAAQjR,MAC3B,sCAAgD41D,GACjD3tE,KAAK6jC,OAEL/1B,QAAQwM,KAAK,oBAAqBqzD,IA/CpC3tE,KAAK4tE,GAAKvsE,SAASC,cAAc,MACjCtB,KAAK4tE,GAAGtpE,QAAO,IAAAsH,MAAK,YAEpB5L,KAAKkP,OAAO5K,OAAOtE,KAAK4tE,IAExB5tE,KAAKK,iBAAiB,SAAS,KAC7Bk/C,EAAA,0BAA6C,OAG/C,MAAMtuB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,eAElBvB,KAAK6tE,YAAcxsE,SAASC,cAAc,OAC1CtB,KAAK6tE,YAAYttE,UAAUgB,IAAI,uBAAwB,eAEvD,QAAiBvB,KAAK6tE,YAAa7tE,KAAK0tE,gBAAiB,CAACl+D,eAAgBxP,KAAKwP,kBAE/E,QAAaxP,KAAK6tE,aAAa,GAE/B7tE,KAAK8tE,eAAiBzsE,SAASC,cAAc,OAC7CtB,KAAK8tE,eAAevtE,UAAUgB,IAAI,sBAElC0vB,EAAI3sB,OAAOtE,KAAK6tE,aAEhB,MAAMnpD,GAAM,OAAO,oDAAqD,CAACtV,UAAU,EAAM6R,KAAM,YAC/FjhB,KAAK8tE,eAAexpE,OAAOogB,GAE3B1kB,KAAK6Z,KAAKvV,OAAO2sB,GACE,IAAI,KAAWjxB,KAAK6Z,MACvC7Z,KAAK6Z,KAAKvV,OAAOtE,KAAK8tE,gBAOtB9tE,KAAK+tE,iBAeCA,iBACN,OAAOpqB,GAAA,gBAAiC3jD,KAAKytE,iBAAiB1rE,MAAKkD,IACjE,IAAIA,EAGF,OAFA80B,GAAS,CAACC,YAAa,8BACvBh6B,KAAK6jC,OAYP,IAAItlB,EAPJve,KAAKiF,IAAMA,EAAIA,IAEfs6C,EAAA,0BAA6CguB,IAE7CvtE,KAAK4tE,GAAG9nE,UAAY,kBAAgCb,EAAIA,IAAIoK,OAC5DrP,KAAK8tE,eAAevtE,UAAUsD,OAAO,OAAQoB,EAAIA,IAAI+oE,gBAGlD/oE,EAAIA,IAAI+oE,gBACTzvD,GAAS,OAAO,6CAA8C,CAACnP,UAAU,IACzEmP,EAAOja,QAAO,IAAAsH,MAAK,sBAAuB,EAAC,IAAAA,MAAK,WAAY,CAAC3G,EAAIA,IAAIuB,aAErE+X,GAAS,OAAO,gCAAiC,CAACnP,UAAU,IAC5DmP,EAAOja,QAAO,IAAAsH,MAAK,mBAAoB,EAAC,IAAAA,MAAK,WAAY,CAAC3G,EAAIA,IAAIuB,YAGpExG,KAAK8tE,eAAeh9C,YAAc,GAClC9wB,KAAK8tE,eAAexpE,OAAOia,IAE3B,QAAiBA,GAAQ,KACvB,MAAM1a,GAAS,EAAA85B,GAAA,GAAiB,CAACpf,IAAS,GAE1ColC,GAAA,mBAAoC3jD,KAAKiF,KAAKlD,MAAK,KACjD/B,KAAK6jC,UACJ51B,OAAM,KACPpK,UAIJ,MAAM4qB,EAAgB,IAAI,KAE1BzuB,KAAK6tE,YAAYttE,UAAUC,OAAO,cAClCR,KAAK6tE,YAAY/nE,UAAY,GAC7B,IAAI,IAAI+R,KAAO5S,EAAI6/C,UAAW,CAC5B,GAAa,kBAAVjtC,EAAIvO,EACL,SAGF,MAAM2nB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,uBAElB,MAAML,EAAO6pB,EAAA,2BAEbiG,GAAY,CACVnZ,IAAAA,EACAoZ,IAAAA,EACAxC,cAAAA,EACAyC,MAAOq8C,GACP7qE,MAAM,EACNhB,MAAM,EACNE,MAAOV,EACPW,OAAQX,IAGVlB,KAAK6tE,YAAYvpE,OAAO2sB,Q,kBCtJhC,MAEA,MAFyD,QAAtB,GAAS,OAAT/b,gBAAS,IAATA,eAAS,EAATA,UAAWC,mBAAW,iBAAEC,sBAAsB,ECalE,MAAM64D,WAA4Bn/D,EACrCc,OAKR,OAJA5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKkQ,SAAS,oBACdlQ,KAAKoB,UAAUb,UAAUgB,IAAI,4BAEtBiC,QAAQC,IAAI,CACjB0jC,GAAA,qBACAA,GAAA,4BACCplC,MAAK,EAAEmsE,EAAehnC,MACvBA,EAAqBA,EAAmBp9B,QAAO+9B,IAAaA,EAAS7sB,OAAOmuB,WAE5E,MAAMl2B,EAAU,IAAIC,GAGdqlB,EAAO2O,EAAmBx8B,KAAKk9B,IACnC,MAAMnQ,EAAa,IAAIyB,GAAW,CAChCp1B,KAHS,iBAITmd,KAAM2mB,EAAkBv4B,MACxB3O,MAAOknC,EAAkBC,SACzB1O,YAAY,IAGRnD,EAAM,IAAIuB,GAAI,CAClBE,WAAAA,EACAG,aAAa,IAef,OAZAH,EAAW+B,KAAKj5B,UAAUgB,IAAI,wBAE9BwmC,GAAiB,CACf/R,IAAAA,EACAne,IAAK+vB,EAAkBI,YACvB9mC,KAAM,UAGL0mC,IAAsBsmC,GACvBz2C,EAAW32B,kBAAiB,GAGvBk1B,KAGHsB,EAAOgB,GAAkBC,GAAO73B,IACpCymC,GAAA,qBAAuCzmC,MAGzCuS,EAAQ3D,QAAQhL,OAAOgzB,GACvBt3B,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,eC9B9B,MAAM+sE,GAOXxuE,YACEmE,EACAgc,EACA2R,EACA28C,EACA9iD,EACA+iD,GAAa,GAEb,MAAMjhC,EAAa,yBACnBptC,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI6rC,GAE7B,MAAMh2B,EAAU/V,SAASC,cAAc,OACvC8V,EAAQ7W,UAAUgB,IAAI6rC,EAAa,YAEnC,MAAMmT,EAAUl/C,SAASC,cAAc,OACvCi/C,EAAQhgD,UAAUgB,IAAI6rC,EAAa,UACnC,IAAA1T,OAAM6mB,EAASz8C,GAEf,MAAMwqE,EAAWtuE,KAAKuuE,eAAiBltE,SAASC,cAAc,OAC9DgtE,EAAS/tE,UAAUgB,IAAI6rC,EAAa,UAEjCihC,IACDC,EAASxoE,UAAY,GAAK2rB,GAG5Bra,EAAQ9S,OAAOi8C,EAAS+tB,GAExBtuE,KAAKwuE,MAAQ,IAAIvvD,GAAc,CAC7Ba,KAAAA,EACA7c,IAAKmrE,EACLvrE,IAAKyoB,GACJmG,GACHzxB,KAAKwuE,MAAMpuD,eACXpgB,KAAKwuE,MAAMruD,YAAY,CACrBP,QAASlf,IACJV,KAAK+M,UACN/M,KAAK+M,SAASrM,GAGb2tE,IAEDC,EAAStgD,UAAY,GAAKttB,MAKhCV,KAAKoB,UAAUkD,OAAO8S,EAASpX,KAAKwuE,MAAMptE,YAI/B,MAAMqtE,WAA8Br+D,EACjDR,OACE5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,8BAC7BvB,KAAKkQ,SAAS,WAEd,MAAM+C,EAAUwmD,GAAgBjxD,KAAK,KAAMxI,KAAK4M,YAEhD,CACE,MAAMxL,EAAY6R,EAAQ,YAEpBu7D,EAAQ,IAAIL,GAAqB,WAAY,EAAGtjE,EAAA,kCAAqC,GAAI,IAC/F2jE,EAAMzhE,SAAYrM,IAChB24B,EAAA,iBAAyB,4BAA6B34B,IAGxD,MAAMguE,GAAuB,OAAO,8BAA+B,CAAC7/D,KAAM,QAASoS,KAAM,oBAEzF,QAAiBytD,GAAsB,KACrC,IAAIrE,GAAiBrqE,KAAK+O,QAAQY,UAGpC,MAAMg/D,EAA0B,IAAI,KAAc,CAChD1tD,KAAM,mBACNnd,KAAM,aACNs1B,SAAU,6BACVsD,YAAY,IAGdt7B,EAAUkD,OAAOkqE,EAAMptE,UAAWstE,EAAsBC,EAAwBt7D,OAGlF,CACE,MAAMjS,EAAY6R,EAAQ,oBAEpBqkB,EAAOj2B,SAASC,cAAc,QAE9BwC,EAAO,gBACPs1B,EAAW,wBAEXw1C,EAAW,IAAIr3C,GAAI,CACvBE,WAAY,IAAIyB,GAAW,CACzBO,QAAS,6BACT31B,KAAAA,EACApD,MAAO,QACP04B,SAAAA,IAEF1B,gBAAiB,4CAGbm3C,EAAe,IAAIt3C,GAAI,CAC3BE,WAAY,IAAIyB,GAAW,CACzBp1B,KAAAA,EACApD,MAAO,YACP04B,SAAAA,IAEF1B,gBAAiB,wCAEnB,IAAAgC,OAAMm1C,EAAap3C,WAAW+B,KAAM,iCAAkC,CAAC,GAAA7c,SAAW,IAAM,SAExF2a,EAAKhzB,OAAOsqE,EAASxtE,UAAWytE,EAAaztE,WAC7CA,EAAUkD,OAAOgzB,GAGnB,GAAG,GAA0B,CAC3B,MAAMl2B,EAAY6R,EAAQ,sBAEpBqkB,EAAOj2B,SAASC,cAAc,QAE9BwC,EAAO,gBACPs1B,EAAW,wBAEX01C,EAAgB,IAAIv3C,GAAI,CAC5BE,WAAY,IAAIyB,GAAW,CACzBO,QAAS,0BACT31B,KAAAA,EACApD,MAAO,aACP04B,SAAAA,MAIE21C,EAAW,IAAIx3C,GAAI,CACvBE,WAAY,IAAIyB,GAAW,CACzBO,QAAS,qBACT31B,KAAAA,EACApD,MAAO,QACP04B,SAAAA,MAIJ9B,EAAKhzB,OAAOwqE,EAAc1tE,UAAW2tE,EAAS3tE,WAC9CA,EAAUkD,OAAOgzB,GAGnB,CACE,MAAMl2B,EAAY6R,EAAQ,sBAEpBqkB,EAAOj2B,SAASC,cAAc,QAE9BwC,EAAO,cACPs1B,EAAW,sBAEX41C,EAA4D,CAChE,CAAC,MAAO,0BACR,CAAC,MAAO,2BAGJz2C,EAAOy2C,EAAQtkE,KAAI,EAAEukE,EAAQj1C,KACrB,IAAIzC,GAAI,CAClBE,WAAY,IAAIyB,GAAW,CACzBO,QAASO,EACTl2B,KAAAA,EACApD,MAAOuuE,EACP71C,SAAAA,QAOA9J,ECxMG,SAAoBqN,EAAqBuyC,GAAW,GACjE,OCAa,SAAqBvyC,EAAqBwyC,EAA8BD,GAAW,GAChG,MAKME,EAAYzyC,EAKlB,IAAItuB,EAQJ,OAZI6gE,IACFvyC,EAAWpQ,GAAA,GAIb,SAAU8iD,IACR1yC,IACAtuB,EAAUgwC,GAAA,aAAegxB,EAAKF,KAFhC,GAKAxyC,EAAWyyC,EAhBI,KACb7gE,aAAaF,IDFRihE,CAAY3yC,GAAU,IAAuC,KAAhC,IAAK,IAAI0d,MAAOk1B,eAAsBL,GDuMvDM,EAAW,KACxB,MAAM3iD,EAAO,IAAIwtB,KAEjB20B,EAAQjqE,SAAQ,EAAEkqE,GAAS9oE,KACzB,MAAMspE,EAAM5iD,EAAK6iD,mBAAmB,cAAgBT,EAAQ,CAC1DU,KAAM,UACNC,OAAQ,YAGVr3C,EAAKpyB,GAAKiqB,SAASU,YAAc2+C,QAIrCzvE,KAAKqQ,cAAchQ,iBAAiB,UAAWivB,GAE/CgI,EAAKhzB,UAAUi0B,EAAK7tB,KAAIsrB,GAAOA,EAAI50B,aACnCA,EAAUkD,OAAOgzB,GAGnB,CACE,MAAMl2B,EAAY6R,EAAQ,SAEpB48D,EAAuB,IAAI,KAAc,CAC7C5uD,KAAM,kCACNnd,KAAM,gBACNs1B,SAAU,yBACVsD,YAAY,IAERozC,EAAmB,IAAI,KAAc,CACzC7uD,KAAM,2BACNnd,KAAM,YACNs1B,SAAU,qBACVsD,YAAY,IAGdt7B,EAAUkD,OAAOurE,EAAqBx8D,MAAOy8D,EAAiBz8D,OAGhE,CACE,MAAMJ,EAAU,IAAIC,GAAe,CAACpP,KAAM,2CAA4C+5B,QAAS,oBAEzFmL,EAAe,IAAIzR,GAAI,CAC3BS,aAAc,mBACdJ,aAAa,EACbrsB,UAAW,KACT,IAAI0iE,GAAoBjuE,KAAK+O,QAAQY,UAInCogE,EAAsB,KAC1BvsE,QAAQ2E,QAAQg/B,GAAA,sBAAwCplC,MAAK8lC,IAC3DE,GAAiB,CACf/R,IAAKgT,EACLnxB,IAAKgwB,EAASG,YACd9mC,KAAM,cAKZ6uE,IAEA/vE,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAkB+vE,GAErD,MAAMF,EAAuB,IAAI,KAAc,CAC7C5uD,KAAM,2BACNnd,KAAM,UACNs1B,SAAU,4BACVsD,YAAY,IAERszC,EAAoB,IAAI,KAAc,CAC1C/uD,KAAM,iCACNnd,KAAM,OACNs1B,SAAU,yBACVsD,YAAY,IAGRuzC,EAAmC,GAEnCC,EAAkBj9D,EAAQqyB,yBAE1B7W,EAAgB,IAAI,KACpB0hD,EAAmB,CAACtrB,EAAmC3kB,EAA+B,YAC1F,MAAMlK,EAAM,IAAIuB,GAAI,CAClBloB,MAAO,kBAAgCw1C,EAAWx1C,OAClDqoB,gBAAiB,WACjBC,iBAAkB,CAACktB,EAAWr+C,OAC9BoxB,aAAa,EACbrsB,UAAW,KACT,IAAIiiE,GAAc,CAAC38D,GAAIg0C,EAAWh0C,GAAI85D,YAAa9lB,EAAW8lB,cAAcjoD,UAIhFutD,EAAYprB,EAAWh0C,IAAMmlB,EAE7B,MAAM/E,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,aAElB+iD,GAAoB,CAClBr/C,IAAK4/C,EACLzjD,UAAW6vB,EACXC,MAAO,mBACPzC,cAAAA,EACA7sB,MAAO,GACPC,OAAQ,GACRF,UAAU,IAGZq0B,EAAI50B,UAAUkD,OAAO2sB,GAErBi/C,EAAgBhwC,GAAQlK,EAAI50B,YAG9BuiD,GAAA,mBAAoC5hD,MAAKquE,KACvC,EAAApuB,GAAA,GAAoDouB,GACpD,IAAI,MAAMvrB,KAAcurB,EAAYC,KAClCF,EAAiBtrB,MAIrB7kD,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,sBAAuBM,IACxD,MAAM2E,EAA6B3E,EAE/B2vE,EAAYhrE,EAAI4L,KAClBs/D,EAAiBlrE,EAAK,cAI1BjF,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAqBM,IACtD,MAAM2E,EAA6B3E,EAEhC2vE,EAAYhrE,EAAI4L,MACjBo/D,EAAYhrE,EAAI4L,IAAIzP,UAAUZ,gBACvByvE,EAAYhrE,EAAI4L,QAI3BoC,EAAQ3D,QAAQhL,OAAO0kC,EAAa5nC,UAAWyuE,EAAqBx8D,MAAO28D,EAAkB38D,OAC7FrT,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,YAInCuQ,SACK3R,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,OG9UH,MAAM0gE,WAA0BxhE,EAW7Bc,O,qCACd5P,KAAKoB,UAAUb,UAAUgB,IAAI,0BAC7BvB,KAAKkQ,SAAS,qBAEd,MAAMwmB,EAA4B,GAElC,CACE,MAAMzjB,EAAUwmD,GAAgBz5D,KAAK4M,gBAAYrG,EAAW,mBACtD4M,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3BvB,KAAKuwE,oBAAsB,IAAI,IAAW,CACxCl9D,MAAO,6BACPvP,KAAM,aACNwP,UAAW,KAEbtT,KAAKgqC,mBAAqB,IAAI,IAAW,CACvC32B,MAAO,sCACPvP,KAAM,YACNwP,UAAW,KAEbtT,KAAKwwE,cAAgB,IAAI,IAAW,CAClCn9D,MAAO,uBACPvP,KAAM,MACNwP,UAAW,KAGbH,EAAa7O,OAAOtE,KAAKuwE,oBAAoBnvE,UAAWpB,KAAKgqC,mBAAmB5oC,UAAWpB,KAAKwwE,cAAcpvE,WAE9G,MAAMy8B,EAAUx8B,SAASC,cAAc,OACvCu8B,EAAQt9B,UAAUgB,IAAI,YACtB,IAAAkvE,OAAM,CAAC93D,QAASklB,EAAS1tB,IAAK,oBAE9BumB,EAAY5uB,KAAK9H,KAAKuwE,oBAAqBvwE,KAAKgqC,mBAAoBhqC,KAAKwwE,eAEzExwE,KAAK6oC,SAAW,IAAIzS,GAAS,CAC3BjtB,OAAQ0B,EAAA,aACR6rB,YAAAA,EACAlnB,eAAgBxP,KAAKwP,iBAGvBxP,KAAKsP,QAAQhL,OAAOtE,KAAK6oC,SAASh1B,SAElCZ,EAAQ3O,OAAOtE,KAAK6oC,SAAS91B,WAAW3R,UAAW+R,GAGrD,CACE,MAAMF,EAAU,IAAIC,GAAe,CACjCpP,KAAM,uBACN+5B,SAAS,IAGL1qB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3BvB,KAAK0wE,mBAAqB,IAAIh2C,GAAmB,CAC/CrnB,MAAO,6BACPvP,KAAM,WACNhE,WAAW,EACX0P,eAAgBxP,KAAKwP,eACrBzC,SAAU,KACR/M,KAAK6oC,SAAShS,eACd72B,KAAK2wE,iBAEPl1C,cAAe,iCACfC,UAAW,6BACXR,YAAa,iCAGf/nB,EAAa7O,OAAOtE,KAAK0wE,mBAAmBtvE,WAE5C,MAAMy8B,EAAU5qB,EAAQ4qB,QACxBA,EAAQv5B,QAAO,IAAAsH,MAAK,uCACpBiyB,EAAQv5B,OAAOjD,SAASC,cAAc,MAAOD,SAASC,cAAc,OAEpE,MAAMsvE,EAAsB5wE,KAAK4wE,oBAAsBvvE,SAASC,cAAc,OAC9EsvE,EAAoBrwE,UAAUgB,IAAI,yBAElC,MAAMsvE,EAAmB7wE,KAAK6wE,iBAAmBxvE,SAASC,cAAc,KACxEuvE,EAAiBtwE,UAAUgB,IAAI,eAC/BsvE,EAAiBjd,KAAO,IACxBid,EAAiBr4D,OAAS,SAE1Bo4D,EAAoBtsE,QAAO,IAAAsH,MAAK,mBAAoB,CAACilE,KAErDhzC,EAAQv5B,OAAOssE,GAEfl6C,EAAY5uB,KAAK9H,KAAK0wE,oBACtBz9D,EAAQ3D,QAAQhL,OAAO6O,GACvBnT,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,YAGjC,QAAiBpB,KAAK6oC,SAASh1B,SAAS,KACtC7T,KAAK6oC,SAASh1B,QAAQS,UAAW,EAEjC,IAAIwuB,EAA2B,GAE/BA,EAASh7B,KAAK81B,EAAA,sBAAgC59B,KAAKuwE,oBAAoB7vE,MAAOV,KAAKgqC,mBAAmBtpC,MAAOV,KAAKwwE,cAAc9vE,OAAOqB,MAAK,KAC1I/B,KAAKyP,WACH5B,IACFC,QAAQC,MAAM,uBAAwBF,OAGrC7N,KAAK6oC,SAASh2B,cACfiwB,EAASh7B,KAAK9H,KAAK6oC,SAASh2B,eAAe9Q,MAAKqS,GACvCwpB,EAAA,2BAAqCxpB,MAI7CpU,KAAK0wE,mBAAmB/0C,mBACzBmH,EAASh7B,KAAKmN,EAAA,iBAA+BjV,KAAK0wE,mBAAmBhwE,QAGvE8C,QAAQ+lC,KAAKzG,GAAUxd,SAAQ,KAC7BtlB,KAAK6oC,SAASh1B,QAAQ21B,gBAAgB,iBAEvC,CAACh6B,eAAgBxP,KAAKwP,iBAEzB,MAAMy6B,EAAOh1B,EAAA,YAEP67D,QAAiBlzC,EAAA,mBAA6BqM,EAAKp5B,IAAI,GAE7D7Q,KAAKuwE,oBAAoBpyC,iBAAiB8L,EAAKE,YAAY,GAC3DnqC,KAAKgqC,mBAAmB7L,iBAAiB8L,EAAKG,WAAW,GACzDpqC,KAAKwwE,cAAcryC,iBAAiB2yC,EAAS/8D,OAAO,GACpD/T,KAAK0wE,mBAAmBvyC,iBAAiB8L,EAAK7O,UAAU,GAExDp7B,KAAK2wE,gBACL3wE,KAAK6oC,SAAShS,gB,+RAGR85C,gBACN,GAAG3wE,KAAK0wE,mBAAmB3wE,MAAMQ,UAAUmT,SAAS,WAAa1T,KAAK0wE,mBAAmBhwE,MAAMG,OAC7Fb,KAAK4wE,oBAAoBttE,MAAMC,QAAU,WACpC,CACLvD,KAAK4wE,oBAAoBttE,MAAMC,QAAU,GACzC,IAAI8U,EAAM,gBAAkBrY,KAAK0wE,mBAAmBhwE,MACpDV,KAAK6wE,iBAAiB7iD,UAAY3V,EAClCrY,KAAK6wE,iBAAiBjd,KAAOv7C,IChJpB,MAAM04D,WAA4BjiE,EAAjD,c,oBAwGE,KAAA8wB,cAAsBvrB,IAAsB,O,EAAA,K,OAAA,E,EAAA,kBAGpCY,EAAA,gBACNZ,EAAQtP,SAAQoE,IAGd,MAAM,IAAC0L,GAAO,gBAA+B,CAC3CC,OAAQ3L,EACR/H,UAAWpB,KAAK4oB,SAAShc,WACzBc,YAAY,EACZqH,eAAe,EACfpH,WAAY,KAGRkxB,EAAW7+B,KAAK4oB,SAASiW,SAASh1B,IAAIV,GAC5C0L,EAAIkuB,YAAYz+B,OAAOtE,KAAK4gC,SAAS/B,IAGrC,MAAMmyC,EAAgC,GACtChxE,KAAKixE,iBAAiBlsE,SAAQ,CAACs8B,EAASv3B,KACtC,GAAGu3B,EAAQx3B,IAAIV,GAAS,CACtB,MAAM8nD,EAAO5vD,SAASC,cAAc,QACpC2vD,EAAKnrD,UAAY,kBAAgCgE,EAAOuF,OACxD2hE,EAAelpE,KAAKmpD,QAIT,IAAApoC,MAAKmoD,GAAgB,GAC7BjsE,SAAQ0M,IACboD,EAAIG,gBAAgB1Q,OAAOmN,U,YA9BW,K,+QAiI5C,KAAAy/D,eAAkBrwE,IAEC,aAAdb,KAAKC,OACND,KAAKmxE,WAAW7tE,MAAMC,QAAU1C,EAAS,GAAK,SAjOxC+O,OA2ER,OA1EA5P,KAAKsP,QAAQ9O,SACbR,KAAKoB,UAAUb,UAAUgB,IAAI,+BAC7BvB,KAAKmxE,WAAa,EAAW,yBAA0B,CAAC/hE,UAAU,IAClEpP,KAAKmxE,WAAW7tE,MAAMC,QAAU,OAEhCvD,KAAKkP,OAAO5K,OAAOtE,KAAKmxE,YAExBnxE,KAAKmxE,WAAW9wE,iBAAiB,SAAS,KACxC,MAAMw+B,EAAW7+B,KAAK4oB,SAAS0a,cAI/B,GAAiB,aAAdtjC,KAAKC,KACN,IAAI,MAAMkQ,KAAOnQ,KAAK8J,OAAOkR,OACI,IAA5B7K,EAAI8P,QAAQ,oBAKRjgB,KAAK8J,OAAOkR,OAAO7K,QAG5B,IAAI,MAAMA,KAAOnQ,KAAK8J,OAAOkR,OACI,IAA5B7K,EAAI8P,QAAQ,oBAKRjgB,KAAK8J,OAAOkR,OAAO7K,GAI9B,MAAMkE,EAAoB,GAC1B,IAAI,MAAMlE,KAAO0uB,EACZ1uB,EAAI6vB,WACL3rB,EAAQvM,KAAKqI,EAAI8Y,YAGjBjpB,KAAK8J,OAAOkR,OAAO7K,IAAO,EAI9B,IAAIihE,EAEFA,EADe,aAAdpxE,KAAKC,KACCkJ,GAAWkL,EAAQkrB,SAASp2B,GAE5BA,IAAYkL,EAAQkrB,SAASp2B,IAGtC,EAAAnD,EAAA,GAAehG,KAAK8J,OAAOunE,eAAe,CAACloE,EAAQhD,KAC7CirE,EAAIjoE,KACNnJ,KAAK8J,OAAOunE,cAAc/qE,OAAOH,EAAK,GACtCnG,KAAK8J,OAAOwnE,aAAahrE,OAAOH,EAAK,OAIzC,MAAMorE,EAAsB,aAAdvxE,KAAKC,KAAsB,iBAAmB,iBACtDuxE,EAA4B,aAAdxxE,KAAKC,KAAsB,gBAAkB,iBACjE,EAAA+F,EAAA,GAAehG,KAAK8J,OAAOynE,IAAQ,CAACpoE,EAAQhD,KACvCkO,EAAQkrB,SAASp2B,KAClBnJ,KAAK8J,OAAOynE,GAAOjrE,OAAOH,EAAK,GAC/BnG,KAAK8J,OAAO0nE,GAAalrE,OAAOH,EAAK,OAIzCnG,KAAK8J,OAAqB,aAAd9J,KAAKC,KAAsB,iBAAmB,kBAAoBoU,EAC9ErU,KAAK8J,OAAqB,aAAd9J,KAAKC,KAAsB,gBAAkB,iBAAmBoU,EAAQ3J,KAAIvB,GAAUiT,EAAA,mBAAiCjT,KAGnInJ,KAAKyxE,cAAcC,UAAU1xE,KAAK8J,QAAQ,GAC1C9J,KAAKyP,WAGPzP,KAAKixE,iBAAmB,IAAI7/D,IACrBnI,EAAA,oCAAqDlH,MAAKm0D,IAC/D,IAAI,MAAMpsD,KAAUosD,EAClBl2D,KAAKixE,iBAAiBhsE,IAAI6E,EAAQ,IAAIpE,IAAIuD,EAAA,kCAAmDa,EAAO+G,IAAInG,KAAIk3B,GAAKA,EAAEz4B,cAKzHy3B,SAAS/B,GACP,MAAM1d,EAAgB,IAAI,KAAc,CACtCje,OAAO,IAMT,OAJG27B,IACD1d,EAAcphB,MAAM4hB,QAAUkd,GAGzB1d,EAAc9N,MAsCvB1B,SACK3R,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd5P,KAAKmxE,WAAW7tE,MAAMC,QAAwB,aAAdvD,KAAKC,KAAsB,GAAK,OAChED,KAAKkQ,SAAuB,aAAdlQ,KAAKC,KAAsB,mBAAqB,mBAE9D,MAAM6J,EAAS9J,KAAK8J,OAEd6nE,EAAoB,IAAIz+D,GAAe,CAC3C4qB,aAAa,EACbh6B,KAAM,oBAKR,IAAIsT,EAFJu6D,EAAkBvwE,UAAUb,UAAUgB,IAAI,qBAIxC6V,EADe,aAAdpX,KAAKC,KACI,CACR2xE,cAAe,CAACC,IAAK,OAAQ5wD,KAAM,8BACnC6wD,iBAAkB,CAACD,IAAK,UAAW5wD,KAAM,2BACzC8wD,aAAc,CAACF,IAAK,YAAa5wD,KAAM,8BAG/B,CACR+gB,SAAU,CAAC6vC,IAAK,aAAc5wD,KAAM,4BACpC+wD,aAAc,CAACH,IAAK,cAAe5wD,KAAM,+BACzCgxD,OAAQ,CAACJ,IAAK,QAAS5wD,KAAM,0BAC7BixD,WAAY,CAACL,IAAK,aAAc5wD,KAAM,4BACtCkxD,KAAM,CAACN,IAAK,OAAQ5wD,KAAM,yBAI9B,MAAMye,EAAIr+B,SAAS86B,yBACnB,IAAI,MAAMhsB,KAAOiH,EAAS,CACxB,MAAMmH,GAAS,OAAO,qDAAsD,CAAC1P,KAAMuI,EAAQjH,GAAK0hE,IAAK5wD,KAAM7J,EAAQjH,GAAK8Q,OACxH1C,EAAOyK,QAAQ7f,OAASgH,EACxBoO,EAAOja,OAAOtE,KAAK4gC,YACnBlB,EAAEp7B,OAAOia,GAEXozD,EAAkBriE,QAAQhL,OAAOo7B,GAIjC,MAAM0yC,GAA+B,aAAdpyE,KAAKC,KAAsB6J,EAAOuoE,eAAiBvoE,EAAOwoE,gBAAgB1xE,QAEjGZ,KAAK4oB,SAAW,IAAI+V,GAAe,CACjCoC,SAAU/gC,KAAKoB,UACf2L,SAAU/M,KAAKkxE,eACfjyC,SAAU,CAAC,WACXU,kBAAmB3/B,KAAK4/B,cACxBzxB,YAAa,SACbsyB,uBAAwB,gBAE1BzgC,KAAK4oB,SAASiW,SAAW,IAAIn5B,IAAI0sE,GAEjC,IAAIG,GAAe,EACnB,MAAMC,EAAOxyE,KAAK4oB,SAASrnB,IAAIiH,KAAKxI,KAAK4oB,UACzC5oB,KAAK4oB,SAASrnB,IAAM,CAAC4H,EAAQkG,EAAO4zB,KAClC,GAAGjjC,KAAK4oB,SAASiW,SAAS39B,MAAQ,KAAOqxE,IAAiBn7D,EAAQjO,GAAS,CACzE,MAAMsI,EAAuBzR,KAAK4oB,SAASld,KAAK6F,cAAc,kBAAkBpI,yBAShF,OARGsI,GACDrE,YAAW,KACTqE,EAAGkQ,SAAU,IACZ,QAILmY,GADY,iBAA0B,aAAd95B,KAAKC,KAAsB,uCAAwC,wCAAwC,IAKrI,MAAMgxB,EAAMuhD,EAAKrpE,EAAQiO,EAAQjO,IAAU,IAAAyC,MAAKwL,EAAQjO,GAAQ8X,WAAQ1a,EAAW08B,GAInF,OAHG7rB,EAAQjO,IACT8nB,EAAI1f,cAAc,kBAAkBhR,UAAUgB,IAAI,SAAW6V,EAAQjO,GAAQ0oE,KAExE5gD,GAGTjxB,KAAK4oB,SAAShc,WAAWxL,UAAUkD,OAAOqtE,EAAkBvwE,UAAWpB,KAAK4oB,SAAShc,WAAWxL,UAAU21C,kBAE1G/2C,KAAK4oB,SAAS2a,WAAW6uC,GACzBG,GAAe,EAEf,IAAI,MAAMttC,KAAQn7B,EAAOkR,OAEpB5D,EAAQq7D,eAAextC,IAAWn7B,EAAOkR,OAAOiqB,IAChD0sC,EAAkBriE,QAAQiC,cAAc,kBAAkB0zB,OAA0BzE,QAY3F1wB,sBAME,OALG9P,KAAK4oB,WACN5oB,KAAK4oB,SAASxnB,UAAUZ,SACxBR,KAAK4oB,SAAW,MAGX/oB,MAAMiQ,sBAMRH,KAAK7F,EAAuB7J,EAAgCwxE,GAMjE,OALAzxE,KAAK0yE,eAAiB5oE,EACtB9J,KAAK8J,QAAS,EAAAoT,GAAA,GAAKld,KAAK0yE,gBACxB1yE,KAAKC,KAAOA,EACZD,KAAKyxE,cAAgBA,EAEd5xE,MAAM8P,QC9PF,MAAMgjE,WAAyB7jE,EAA9C,c,oBAUU,KAAAy1B,MAAsJ,GASpJ30B,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,yBAC7BvB,KAAK69B,QAAUx8B,SAASC,cAAc,OACtCtB,KAAK69B,QAAQt9B,UAAUgB,IAAI,WAC3BvB,KAAK69B,QAAQv5B,QAAO,IAAAsH,MAAK,6BACzB5L,KAAKy6D,iBAAmBp5D,SAASC,cAAc,OAC/CtB,KAAKy6D,iBAAiBl6D,UAAUgB,IAAI,qBAEpCvB,KAAKmxE,WAAa,EAAW,+BAC7B,MAAMyB,EAA4C,CAChD/jE,KAAM,gBACNoS,KAAM,mBACNC,QAAS,KACP,IAAI0a,GAAU,gBAAiB,CAC7B5D,aAAc,wCACdoE,mBAAoB,sCACpBxa,QAAS,CAAC,CACR6X,QAAS,SACTkD,SAAU,KACRi2C,EAAmBj6D,QAAQzY,aAAa,WAAY,QACpD+I,EAAA,oCAAqDjJ,KAAK8J,QAAQ,GAAM/H,MAAK8wE,IACxEA,GACD7yE,KAAKyP,WAEN6V,SAAQ,KACTstD,EAAmBj6D,QAAQ6wB,gBAAgB,gBAG/CxC,UAAU,MAEXtkB,SAGP1iB,KAAK8yE,QAAU,GAAiB,GAAI,cAAe,CAACF,IACpD5yE,KAAK8yE,QAAQvyE,UAAUgB,IAAI,QAE3BvB,KAAKkP,OAAO5K,OAAOtE,KAAKmxE,WAAYnxE,KAAK8yE,SAEzC,MAAMC,EAAe,IAAI7/D,GAAe,IAElCC,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3BvB,KAAK+pC,eAAiB,IAAI,IAAW,CACnC12B,MAAO,iBACPC,UAlEyB,KAqE3BH,EAAa7O,OAAOtE,KAAK+pC,eAAe3oC,WACxC2xE,EAAazjE,QAAQhL,OAAO6O,GAE5B,MAAM6/D,EAAe,CAAC1nE,EAAmB2nE,EAAqBrxD,EAAgFkzB,KAC5I,MAAM7hC,EAAU,IAAIC,GAAe,CACjCpP,KAAMmvE,EACNn1C,aAAa,IAGf7qB,EAAQ7R,UAAUb,UAAUgB,IAAI,cAAe+J,GAE/C,MAAM4nE,EAAajgE,EAAQqyB,yBAiB3B,OAhBA4tC,EAAW3yE,UAAUgB,IAAI,qBAEzBqgB,EAAQ7c,SAAQ03B,IACd,MAAMle,GAAS,OAAO,yDAA0D,CAC9E1P,KAAM4tB,EAAE5tB,KACRoS,KAAMwb,EAAExb,KACR7R,UAAUqtB,EAAEC,iBAAan2B,IAGxBk2B,EAAE34B,OACHgxC,EAAGrY,EAAE34B,MAAQya,GAGf20D,EAAW5uE,OAAOia,MAGbtL,GAGTjT,KAAKqyE,eAAiBW,EAAa,uBAAwB,gBAAiB,CAAC,CAC3EnkE,KAAM,cACNoS,KAAM,kCACNyb,YAAY,GACX,CACDzb,KAAM,2BACNpS,KAAM,aACN/K,KAAM,YACL,CACDmd,KAAM,8BACNpS,KAAM,cACN/K,KAAM,gBACL,CACDmd,KAAM,yBACNpS,KAAM,QACN/K,KAAM,UACL,CACDmd,KAAM,2BACNpS,KAAM,UACN/K,KAAM,cACL,CACDmd,KAAM,uBACNpS,KAAM,OACN/K,KAAM,SACJ9D,KAAKukC,OAETvkC,KAAKsyE,eAAiBU,EAAa,uBAAwB,gBAAiB,CAAC,CAC3EnkE,KAAM,gBACNoS,KAAM,kCACNyb,YAAY,GACX,CACDzb,KAAM,6BACNpS,KAAM,OACN/K,KAAM,iBACL,CACDmd,KAAM,0BACNpS,KAAM,UACN/K,KAAM,oBACL,CACDmd,KAAM,4BACNpS,KAAM,YACN/K,KAAM,iBACJ9D,KAAKukC,OAETvkC,KAAK4M,WAAWtI,OAAOtE,KAAKy6D,iBAAkBz6D,KAAK69B,QAASk1C,EAAa3xE,UAAWpB,KAAKqyE,eAAejxE,UAAWpB,KAAKsyE,eAAelxE,WAEvI,MAAM+xE,EAAyBnzE,KAAKqyE,eAAejxE,UAAUmQ,cAAc,sBACrE6hE,EAAyBpzE,KAAKsyE,eAAelxE,UAAUmQ,cAAc,sBAE3E4hE,EAAuB5hE,cAAc,QAAQlR,iBAAiB,SAAS,KACrE,IAAI0wE,GAAoB/wE,KAAK+O,QAAQY,KAAK3P,KAAK8J,OAAQ,WAAY9J,SAGrEozE,EAAuB7hE,cAAc,QAAQlR,iBAAiB,SAAS,KACrE,IAAI0wE,GAAoB/wE,KAAK+O,QAAQY,KAAK3P,KAAK8J,OAAQ,WAAY9J,SAGrEA,KAAKmxE,WAAW9wE,iBAAiB,SAAS,KACxC,GAAGL,KAAK+pC,eAAehqC,MAAMQ,UAAUmT,SAAS,SAC9C,OAGF,IAAI1T,KAAK+pC,eAAerpC,MAAMwM,OAE5B,YADAlN,KAAK+pC,eAAehqC,MAAMQ,UAAUgB,IAAI,SAI1C,IAUI8G,EAVAgrE,EAAWhpE,MAAMC,KAAK6oE,EAAuBviD,UAA4BhwB,MAAM,GAAG6D,QAAO,CAACC,EAAK+M,IAAO/M,KAAQ+M,EAAGnO,MAAMC,SAAS,GACpI8vE,GAAWrzE,KAAK8J,OAAOwpE,cAAczyE,OAEjCwyE,GAKJrzE,KAAKmxE,WAAWjxE,aAAa,WAAY,QAMvCmI,EAHErI,KAAK8J,OAAO+G,GAGJ5H,EAAA,oCAAqDjJ,KAAK8J,QAF1Db,EAAA,oCAAqDjJ,KAAK8J,QAKtEzB,EAAQtG,MAAK8wE,IACRA,GACD7yE,KAAKyP,WAENxB,OAAMJ,IACS,4BAAbA,EAAI5N,KACL65B,GAAM,yCAENhsB,QAAQC,MAAM,4BAA6BF,MAE5CyX,SAAQ,KACTtlB,KAAKmxE,WAAW3nC,gBAAgB,gBAxBhC1P,GAAM,uDA4BV95B,KAAK+pC,eAAehqC,MAAMM,iBAAiB,SAAS,KAClDL,KAAK8J,OAAOuF,MAAQrP,KAAK+pC,eAAerpC,MACxCV,KAAKuzE,wBAGP,MAAMC,EAAsD,SAAdxzE,KAAKC,KAAkB,CACnEgJ,EAAA,sCAAuDjJ,KAAK8J,OAAO+G,GAAI,gBACvE5H,EAAA,sCAAuDjJ,KAAK8J,OAAO+G,GAAI,iBACvE5H,EAAA,sCAAuDjJ,KAAK8J,OAAO+G,GAAI,kBACrE,GAEJ,OAAOrN,QAAQC,IAAI,CACjBzD,KAAKyzE,qBAAuB/uB,GAAA,uBAAkC,CAC5DtjD,UAAWpB,KAAKy6D,iBAChB/4D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,aAAaE,MAAK6kB,IACnB5mB,KAAKiC,UAAY2kB,EAEV89B,GAAA,oBAA+B99B,SAGrC4sD,IAIP5hE,qBACE5R,KAAKyzE,qBAAqB1xE,MAAK,KAC7B/B,KAAKiC,UAAUN,UAAW,EAC1B3B,KAAKiC,UAAUS,UAIXgxE,eAEN1zE,KAAKkQ,SAAS,aACdlQ,KAAK8yE,QAAQvyE,UAAUgB,IAAI,QAC3BvB,KAAKmxE,WAAW5wE,UAAUC,OAAO,QACjCR,KAAK+pC,eAAerpC,MAAQ,GAE5B,IAAI,MAAMukC,KAAQjlC,KAAKukC,MAErBvkC,KAAKukC,MAAMU,GAAM3hC,MAAMC,QAAU,OAI7BowE,aAEN3zE,KAAKkQ,SAAuB,WAAdlQ,KAAKC,KAAoB,YAAc,oBAEpC,SAAdD,KAAKC,OACND,KAAK8yE,QAAQvyE,UAAUC,OAAO,QAC9BR,KAAKmxE,WAAW5wE,UAAUgB,IAAI,SAGhC,MAAMuI,EAAS9J,KAAK8J,OACpB9J,KAAK+pC,eAAerpC,MAAQ,kBAAgCoJ,EAAOuF,OAEnE,IAAI,MAAM41B,KAAQjlC,KAAKukC,MACrBvkC,KAAKukC,MAAMU,GAAyC3hC,MAAMC,QAAYuG,EAAOkR,OAAOiqB,GAA2C,GAAK,OAGtI,CAAE,iBAA2B,kBAA4BlgC,SAAQoL,IAC/D,MAAM8C,EAAUjT,KAAKmQ,GACfyjE,EAAK,oBAELte,EAAQxrD,EAAOqG,GAAKvP,QAEpBizE,EAAcC,IAClB,IAAI,IAAIvuE,EAAI,EAAG1E,EAASmC,KAAKC,IAAIqyD,EAAMz0D,OAAQizE,GAAUvuE,EAAI1E,IAAU0E,EAAG,CACxE,MAAM4D,EAASmsD,EAAMvtD,SAEf,IAAC8M,GAAO,gBAA+B,CAC3CC,OAAQ3L,EACR/H,UAAWwyE,EACXlmE,YAAY,EACZqH,eAAe,EACfnH,WAAW,EACXD,WAAY,KAEdkH,EAAIG,gBAAgB/Q,cAAczD,SAGjC80D,EAAMz0D,OACPi2C,EAASC,iBAAiBvpB,aAAY,IAAA5hB,MAAK,sBAAuB,CAAC0pD,EAAMz0D,UACjEi2C,GACRA,EAASt2C,UAMb,IAAIs2C,EACJ,GAHA7jC,EAAQqyB,yBAAyBhhC,OAAOsvE,GAGrCte,EAAMz0D,OAAQ,CACf,MAAMyO,EAAU2D,EAAQqyB,yBACxBwR,GAAW,OAAO,yDAA0D,CAACjoC,KAAM,SACnFioC,EAASv2C,UAAUgB,IAAI,YAAa,eACpCu1C,EAASz2C,iBAAiB,SAAS,IAAMwzE,EAAW,MACpD/8B,EAASxyC,QAAO,IAAAsH,MAAK,sBAAuB,CAAC0pD,EAAMz0D,UAEnDyO,EAAQhL,OAAOwyC,GAGjB+8B,EAAW,MAIfN,qBACE,GAAiB,SAAdvzE,KAAKC,KAAiB,CACvB,MAAM89B,IAAW,EAAA9gB,GAAA,GAAUjd,KAAK0yE,eAAgB1yE,KAAK8J,QACrD9J,KAAKmxE,WAAW5wE,UAAUsD,OAAO,QAASk6B,GAC1C/9B,KAAK8yE,QAAQvyE,UAAUsD,OAAO,OAAQk6B,IAI1C2zC,UAAU5nE,EAAsBi6C,GAC3B/jD,KAAKoB,WAENiJ,MAAMC,KAAKtK,KAAKoB,UAAUoQ,iBAAiB,mBAAmBzM,SAAQ0M,GAAMA,EAAGjR,WAG9EujD,GACD/jD,KAAK0yE,eAAiB5oE,EACtB9J,KAAK8J,QAAS,EAAAoT,GAAA,GAAKpT,KAEnB9J,KAAK8J,OAASA,EACd9J,KAAK2zE,aACL3zE,KAAKuzE,sBAIF5jE,KAAK7F,GAoBV,YAnBcvD,IAAXuD,GACD9J,KAAK0xE,UAAU,CACbpoE,EAAG,eACHuH,GAAI,EACJxB,MAAO,GACP2L,OAAQ,GACRs2D,aAAc,GACdgC,cAAe,GACfS,cAAe,GACf1C,cAAe,GACfgB,eAAgB,GAChBC,eAAgB,KACf,GACHtyE,KAAKC,KAAO,WAEZD,KAAK0xE,UAAU5nE,GAAQ,GACvB9J,KAAKC,KAAO,QAGPJ,MAAM8P,OAAO5N,MAAK,KACN,SAAd/B,KAAKC,KAAiBD,KAAK2zE,aACzB3zE,KAAK0zE,mBCjWD,MAAMM,WAA0BllE,EAA/C,c,oBAOU,KAAAmlE,gBAA6C,GAG7CC,aAAaC,EAAqE/yE,EAAyB40B,GACjH,IAAIlsB,EA2CAmnB,EA1CAoL,EAAc,GACduF,EAAmB,GACvB,GAAsB,0BAAnBuyC,EAAa7qE,EACdQ,EAASqqE,EAAarqE,OACtBuyB,EAAc83C,EAAa93C,gBACtB,CAQL,GAPAvyB,EAASqqE,EAOa,IALDz5D,OAAOgzC,KAAK5jD,EAAOkR,QAAQna,OAKvB,CACvB,MAAMma,EAASlR,EAAOkR,OACtB,IAAIq8B,EACDr8B,EAAOgnB,SAAUqV,EAAI,oBAChBr8B,EAAOg3D,aAAc36B,EAAI,uBACzBr8B,EAAOi3D,OAAQ56B,EAAI,kBACnBr8B,EAAOk3D,WAAY76B,EAAI,oBACvBr8B,EAAOm3D,OAAM96B,EAAI,iBAEtBA,GACDzV,EAAE95B,MAAK,IAAA8D,MAAKyrC,IAIhB,IAAIzV,EAAE/gC,OAAQ,CACZ,MAAMuzE,EAASnrE,EAAA,kCAAmDa,EAAO+G,IACzE,IAAIonD,EAAQ,EAAGoc,EAAW,EAAGpC,EAAS,EACtC,IAAI,MAAMn9D,KAAUs/D,EACfh4D,EAAA,aAA2BtH,EAAO3L,QAAS8oE,IACtC71D,EAAA,cAA4BtH,EAAO3L,QAASkrE,IAC/Cpc,IAGJA,GAAOr2B,EAAE95B,MAAK,IAAA8D,MAAK,QAAS,CAACqsD,KAC7Boc,GAAUzyC,EAAE95B,MAAK,IAAA8D,MAAK,WAAY,CAACyoE,KACnCpC,GAAQrwC,EAAE95B,MAAK,IAAA8D,MAAK,SAAU,CAACqmE,MAKtC,GAAIj8C,EAwBFA,EAAI5F,SAASU,YAAc,IAC3B,IAAAjI,MAAK+Y,GAAG78B,SAAQ0M,IACdukB,EAAI5F,SAAS9rB,OAAOmN,WAbtB,GAZAukB,EAAM,IAAIuB,GAAI,CACZloB,MAAO,kBAAgCvF,EAAOuF,OAC9C+gB,SAAUiM,EACV9wB,WAAW,IAGVq2B,EAAE/gC,SACH,IAAAgoB,MAAK+Y,GAAG78B,SAAQ0M,IACdukB,EAAI5F,SAAS9rB,OAAOmN,MAIF,iBAAnB0iE,EAAa7qE,EAAsB,CACpC,MAAMgrE,EAAWxqE,EAAO+G,GACpB7Q,KAAKi0E,gBAAgBxB,eAAe3oE,EAAO+G,MAC7C,QAAiBmlB,EAAI50B,WAAW,KAC9B,IAAIuxE,GAAiB3yE,KAAK+O,QAAQY,KAAK1G,EAAA,2BAA4CqrE,MAClF,CAAC9kE,eAAgBxP,KAAKwP,iBAG3BxP,KAAKi0E,gBAAgBnqE,EAAO+G,IAAMmlB,EAgBtC,OAPA/E,EAAM+E,EAAI50B,UAEN0I,EAA0B2oE,eAAe,cAE3CzsB,GAAuB/0B,EAAKA,EAAIhtB,eAAiB7C,EAAY0I,EAA0ByqE,YAC/EnzE,GAAWA,EAAUkD,OAAO2sB,GAE/BA,EAGOrhB,O,qCACd5P,KAAKoB,UAAUb,UAAUgB,IAAI,0BAC7BvB,KAAKkQ,SAAS,8BAEdlQ,KAAK4M,WAAWxL,UAAUb,UAAUgB,IAAI,gBAExCvB,KAAKy6D,iBAAmBp5D,SAASC,cAAc,OAC/CtB,KAAKy6D,iBAAiBl6D,UAAUgB,IAAI,qBAEpC,MAAMs8B,EAAUx8B,SAASC,cAAc,OACvCu8B,EAAQt9B,UAAUgB,IAAI,YACtB,IAAAkvE,OAAM,CAAC93D,QAASklB,EAAS1tB,IAAK,2BAE9BnQ,KAAKw0E,iBAAkB,OAAO,kDAAmD,CAC/EvzD,KAAM,2BACNpS,KAAM,QAGR7O,KAAKy0E,eAAiB,IAAIvhE,GAAe,CACvCpP,KAAM,YAER9D,KAAKy0E,eAAerzE,UAAUkC,MAAMC,QAAU,OAE9CvD,KAAK00E,iBAAmB,IAAIxhE,GAAe,CACzCpP,KAAM,sBAER9D,KAAK00E,iBAAiBtzE,UAAUkC,MAAMC,QAAU,OAEhDvD,KAAK4M,WAAWtI,OAAOtE,KAAKy6D,iBAAkB58B,EAAS79B,KAAKw0E,gBAAiBx0E,KAAKy0E,eAAerzE,UAAWpB,KAAK00E,iBAAiBtzE,YAElI,QAAiBpB,KAAKw0E,iBAAiB,KAClC95D,OAAOgzC,KAAK1tD,KAAKi0E,iBAAiBpzE,QAAU,GAC7Ci5B,GAAM,yCAEN,IAAI64C,GAAiB3yE,KAAK+O,QAAQY,SAEnC,CAACH,eAAgBxP,KAAKwP,iBAEzB,MAAMmlE,EAA2B,KAC/B30E,KAAKy0E,eAAerzE,UAAUkC,MAAMC,QAAUmX,OAAOgzC,KAAK1tD,KAAKi0E,iBAAiBpzE,OAAS,GAAK,QA+DhG,OA5DAoI,EAAA,oCAAqDlH,MAAKm0D,IACxD,IAAI,MAAMpsD,KAAUosD,EAClBl2D,KAAKk0E,aAAapqE,EAAQ9J,KAAKy0E,eAAenlE,SAGhDqlE,OAGF30E,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAkB8J,IAChD9J,KAAKi0E,gBAAgBxB,eAAe3oE,EAAO+G,IAC5C7Q,KAAKk0E,aAAapqE,EAAQ,KAAM9J,KAAKi0E,gBAAgBnqE,EAAO+G,KAE5D7Q,KAAKk0E,aAAapqE,EAAQ9J,KAAKy0E,eAAenlE,SAGhDqlE,IAEA30E,KAAK40E,yBAGP50E,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAkB8J,IAChD9J,KAAKi0E,gBAAgBxB,eAAe3oE,EAAO+G,MAM5C7Q,KAAK40E,sBAEL50E,KAAKi0E,gBAAgBnqE,EAAO+G,IAAIzP,UAAUZ,gBACnCR,KAAKi0E,gBAAgBnqE,EAAO+G,KAGrC8jE,OAGF30E,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,gBAAiB60E,IAClDA,EAAM9vE,SAAQ,CAACuvE,EAAUnuE,KACvB,MAAM/E,EAAYpB,KAAKi0E,gBAAgBK,GAAUlzE,UACjD4kD,GAAuB5kD,EAAWA,EAAU6C,cAAekC,EAAM,SAIrEnG,KAAKyzE,qBAAuB/uB,GAAA,uBAAkC,CAC5DtjD,UAAWpB,KAAKy6D,iBAChB/4D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,aAAaE,MAAK6kB,IACnB5mB,KAAKiC,UAAY2kB,EAEV89B,GAAA,oBAA+B99B,MAGxC5mB,KAAK40E,sBAKE50E,KAAKyzE,sB,+RAGd7hE,qBACE5R,KAAKyzE,qBAAqB1xE,MAAK,KAC7B/B,KAAKiC,UAAUN,UAAW,EAC1B3B,KAAKiC,UAAUS,UAIXkyE,sBACN,OAAO,eAAqB,sCAAsC7yE,MAAK+yE,IACrE90E,KAAK00E,iBAAiBtzE,UAAUkC,MAAMC,QAAUuxE,EAAiBj0E,OAAS,GAAK,OAC/EwJ,MAAMC,KAAKtK,KAAK00E,iBAAiBplE,QAAQshB,UAAUhwB,MAAM,GAAGmE,SAAQ0M,GAAMA,EAAGjR,WAE7Es0E,EAAiB/vE,SAAQ+E,IACvB,MAAMmnB,EAAMjxB,KAAKk0E,aAAapqE,GACxByU,GAAS,OAAO,gCAAiC,CAAC0C,KAAM,QAC9DgQ,EAAI3sB,OAAOia,GACXve,KAAK00E,iBAAiBplE,QAAQhL,OAAO2sB,IAErC,QAAiB1S,GAASje,IAGxB,IAFA,EAAAohB,EAAA,GAAYphB,GAEToa,OAAOgzC,KAAK1tD,KAAKi0E,iBAAiBpzE,QAAU,GAE7C,YADAi5B,GAAM,yCAIRvb,EAAOre,aAAa,WAAY,QAEhC,MAAMw/B,EAAI51B,EAAOA,OACjB41B,EAAE2yC,eAAiB,GACnB3yC,EAAE4yC,eAAiB,GACnB5yC,EAAE2xC,cAAgB,GAElBpoE,EAAA,oCAAqDy2B,GAAG,GAAM39B,MAAK8wE,IAC9DA,GACD5hD,EAAIzwB,YAEL8kB,SAAQ,KACT/G,EAAOirB,gBAAgB,iBAExB,CAACh6B,eAAgBxP,KAAKwP,wBCvPlB,MAAMulE,WAA4B3kE,EACrCR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,0BAA2B,eACxDvB,KAAKkQ,SAAS,+CAEd,MAAM8kE,EAAiBp1E,IAKrB,MAAMqT,EAAU,IAAIC,GAAe,CACjCpP,KAAMlE,EAAQkE,OAGVmxE,EAAa,IAAI19C,GAAI,CACzBpW,cAAe,IAAI,KAAc,CAACF,KAAMrhB,EAAQs1E,SAAUvzD,SAAS,IACnE+V,gBAAiB,YAGby9C,EAAoB,IAAI59C,GAAI,CAChCpW,cAAe,IAAI,KAAc,CAACF,KAAM,iBAAkBU,SAAS,IACnE+V,gBAAiB,YAGnBzkB,EAAQ3D,QAAQhL,OAAO2wE,EAAW7zE,UAAW+zE,EAAkB/zE,WAE/DpB,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAE/B,MAAMg0E,EAAkB,CAAC9rE,EAAG1J,EAAQk4D,UAC9B5sB,EAAMZ,GAAA,oBAA0C8qC,IACrDlqC,aAAe1nC,QAAU0nC,EAAM1nC,QAAQ2E,QAAQ+iC,IAAMnpC,MAAMszE,IAC1D,MAAMC,EAAgB,KACpB,MAAMz6D,EAAQyvB,GAAA,UAAgC+qC,GAI9C,OAHAJ,EAAW9zD,cAAcQ,SAAW9G,EACpCs6D,EAAkBh0D,cAAcQ,QAAU0zD,EAAeE,cAElD16D,GAGTy6D,IAEAt1E,KAAKqQ,cAAchQ,iBAAiB,WAAW,KAC7C,MAAMm1E,GAAQP,EAAW9zD,cAAcQ,QACjC8zD,EAAeN,EAAkBh0D,cAAcQ,QAErD,GAAG6zD,IAASlrC,GAAA,UAAgC+qC,IAAmBI,IAAiBJ,EAAeE,cAC7F,OAGF,MAAMG,GAAqB,EAAAx4D,GAAA,GAAKm4D,GAChCK,EAAcpsE,EAAI,0BAClBosE,EAAcC,WAAaH,EAAO,WAAa,EAC/CE,EAAcH,cAAgBE,EAE9BnrC,GAAA,uBAA6C8qC,EAAiBM,KAC7D,CAACv6D,MAAM,IAEVnb,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,mBAAoB6lC,IACrD,MAAMiyB,EAAWmH,GAAqBp5B,EAAOF,KAAKr8B,GAC/C1J,EAAQk4D,WAAaA,IACtBud,EAAiBxvC,EAAO0E,gBACxB+qC,YAMRN,EAAc,CACZlxE,KAAM,4BACNoxE,SAAU,+BACVpd,SAAU,qBAGZkd,EAAc,CACZlxE,KAAM,sBACNoxE,SAAU,yBACVpd,SAAU,qBAGZkd,EAAc,CACZlxE,KAAM,wBACNoxE,SAAU,2BACVpd,SAAU,0BAGZ,CACE,MAAM7kD,EAAU,IAAIC,GAAe,CACjCpP,KAAM,uBAGF8xE,EAAoB,IAAIr+C,GAAI,CAChCpW,cAAe,IAAI,KAAc,CAACF,KAAM,gBAAiBU,SAAS,IAClE+V,gBAAiB,YAGbm+C,EAAW,IAAIt+C,GAAI,CACvBpW,cAAe,IAAI,KAAc,CAACF,KAAM,sBAAuBU,SAAS,EAAMyX,SAAU,iCACxF1B,gBAAiB,YAGnB2B,EAAA,mBAA2Bt3B,MAAKu3B,IAC9Bu8C,EAAS10D,cAAcQ,QAAU2X,EAAMknC,SAAS/vB,cAAcqlC,SAGhE7iE,EAAQ3D,QAAQhL,OAAOsxE,EAAkBx0E,UAAWy0E,EAASz0E,WAE7DpB,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAE/BkpC,GAAA,iCAAuDvoC,MAAK2b,IAC1Dk4D,EAAkBz0D,cAAcQ,QAAUjE,EAE1C1d,KAAKqQ,cAAchQ,iBAAiB,WAAW,KAC7C,MAAMugE,EAAWgV,EAAkBz0D,cAAcQ,QAC9CjE,IAAYkjD,GACbt2B,GAAA,gCAAsDs2B,KAEvD,CAACzlD,MAAM,SC3HH,MAAM46D,WAAuBjnE,EAC1Bc,O,qCACd5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKoB,UAAUb,UAAUgB,IAAI,sBAC7BvB,KAAKkQ,SAAS,mCAEd,MAAM+C,EAAU,IAAIC,GAAe,IAE7BmmD,EAA8B,IAAIjoD,IAElC/I,EAAU,wBAA8B,wBAAyB,CACrE2tE,UAAW,UACVj0E,MAAMk0E,IACP,MAAMj5C,GAAS,UACfi5C,EAAUlxE,SAASmxE,IACjB,MAAMlgD,EAAM,IAAIuB,GAAI,CAClBE,WAAY,IAAIyB,GAAW,CACzBjY,KAAMi1D,EAASpyE,KACfA,KAAMk5B,EACNt8B,MAAOw1E,EAASC,YAElB/lD,SAAU8lD,EAASE,cAGrB/c,EAAUp0D,IAAIixE,EAASC,UAAWngD,MAGpC,MAAMsB,EAAOgB,GAAkB,IAAI+gC,EAAU71B,WAAY9iC,IACvD,sBAAiBA,MAGnB,6BAAwBqB,MAAKs0E,IAC3B,MAAMrgD,EAAMqjC,EAAU3nD,IAAI2kE,EAASF,WAC/BngD,EAKJA,EAAIyB,WAAW32B,kBAAiB,GAJ9BgN,QAAQC,MAAM,SAAUioB,EAAKqgD,MAOjCpjE,EAAQ3D,QAAQhL,OAAOgzB,MAKzB,OAFAt3B,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAExBiH,G,gSC7CI,SAASiuE,GAAkB12E,GACxC,OAAO,IAAI4D,SAAwB,CAAC2E,EAASqnB,KAC3C,MAAM,OAACjR,EAAM,SAAEqiB,GAAYhhC,EAC3B2e,EAAOoe,SAAY13B,IACjBkD,EAAQlD,IAAQA,EAAI/D,UAAOqF,IAG7B,MAAMqb,GAAU,QAAgB,CAACrD,IAC3Bg4D,EAAe30D,EAAQvP,MAAKkM,GAAUA,EAAO29C,WACnDqa,EAAa55C,SAAW,KACtBnN,KAGF5vB,EAAQgiB,QAAUA,EAClBhiB,EAAQ48B,WAAaoE,GAAY,CAACA,GAElC,IAAIhF,GAAU,qBAAsBh8B,GAAS8iB,UCpB1C,SAAS8zD,GAA4Bv2E,EAAkCoP,GAC5E,MAAM4D,EAAU,IAAIC,GAAe,CAACpP,KAAMuL,IAEpCc,EAAM,yBAA2BlQ,EAAO,IACxCw2E,EAAwB,IAAI,KAAc,CAC9Cx1D,KAAM,uBACNnd,KAAM,WACNs1B,SAAUjpB,EAAM,WAChBusB,YAAY,IAERg6C,EAAuB,IAAI,KAAc,CAC7Cz1D,KAAM,2BACNnd,KAAM,UACNs1B,SAAUjpB,EAAM,UAChBusB,YAAY,IAERi6C,EAAsB,IAAI,KAAc,CAC5C11D,KAAM,yBACNnd,KAAM,SACNs1B,SAAUjpB,EAAM,SAChBusB,YAAY,IAERk6C,EAAwB,IAAI,KAAc,CAC9C31D,KAAM,uBACNnd,KAAM,WACNs1B,SAAUjpB,EAAM,WAChBusB,YAAY,IAUd,OAPAzpB,EAAQ3D,QAAQhL,OACdmyE,EAAsBpjE,MACtBqjE,EAAqBrjE,MACrBsjE,EAAoBtjE,MACpBujE,EAAsBvjE,OAGjBJ,EAGM,MAAM4jE,WAAgCzmE,EACzCR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKkQ,SAAS,sBAEd,MAAM+C,EAAUujE,GAA4B,QAAS,2BACrDx2E,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,YCzCpB,MAAM01E,WAA+B1mE,EACxCR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKkQ,SAAS,qBAEd,MAAM6mE,EAAgB98C,IAAU+8C,IAC9B39C,EAAA,iBAAyB,yCAA0C29C,KAClE,KAAK,GAAO,GAET/jE,EAAUujE,GAA4B,OAAQ,0BAE9CS,EAAM,OAGNC,EAAYC,SAEZH,EAAUnsE,EAAA,+CACVnK,EAAQsC,KAAK8hE,KAAK9hE,KAAK8hE,MAAMkS,EAAUC,GAAOC,IAC9CE,EAAO,IAAI,sBAAiB,CAChCjnE,IAAK,4BACL3L,KAAM,CAAC+iB,GAAYyvD,MAEfxI,EAAQ,IAAIL,GAAqB,0BAA2B,IAAMztE,EAAO,EAAG,GAAG,GACrF8tE,EAAMzhE,SAAYrM,IAChB,MAAMs2E,EAAW,SAAAt2E,EAAS,GAAIw2E,EAAYD,EAAO,EAEjDG,EAAKC,iBAAiB,CAAC7yE,KAAM,CAAC+iB,GAAYyvD,MAE1CD,EAAcC,IAGhBxI,EAAMD,eAAejqE,OAAO8yE,EAAKz+D,SAEjC1F,EAAQ3D,QAAQhL,OAAOkqE,EAAMptE,WAE7BpB,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,YCzCpB,MAAMk2E,WAAgClnE,EACzCR,OACR5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKkQ,SAAS,sBAEd,MAAM+C,EAAUujE,GAA4B,QAAS,2BACrDx2E,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,YCUnC,MAAMm2E,GAAmF,CACvFv1C,SAAU,uBACVw1C,QAAS,iBACTvF,OAAQ,qBACRoC,SAAU,wBAGG,MAAMoD,WAA6BrnE,EAChCR,O,qCACd5P,KAAKkP,OAAO3O,UAAUgB,IAAI,eAC1BvB,KAAKkQ,SAAS,gBAEd,CACE,MAAM+C,EAAU,IAAIC,GAAe,CAACpP,KAAM,yBAA0B+5B,QAAS,0BAEvEvE,QAAcD,EAAA,mBAEdq+C,EAAoB,IAAI,KAAc,CAC1Cz2D,KAAM,oBACNnd,KAAM,OACN6d,SAAU2X,EAAMknC,SAASmX,gBAAgB38D,OAAO1G,SAChDooB,YAAY,IAGR3vB,EAAW,MACf,EAAA4wB,GAAA,GAAiB,CAAC+uC,IAChB,EAAAzvD,GAAA,GAAUqc,EAAMknC,SAASzxC,aAAc,EAAA08C,WAAA,yBACvC,EAAAxuD,GAAA,GAAUqc,EAAMknC,SAASmX,gBAAiB,EAAAlM,WAAA,4BAGxCmM,EAAe,KACnB53E,KAAK63E,wBAAwBC,EAAUx+C,EAAMknC,SAASzxC,aAAa1oB,OACnErG,KAAK63E,wBAAwBE,EAAUz+C,EAAMknC,SAASzxC,aAAa9X,OACnEjX,KAAK63E,wBAAwBG,EAAS1+C,EAAMknC,SAASzxC,aAAa27C,KAAMpxC,EAAMknC,SAASmX,gBAAgBM,gBAGnGC,EAAWhmE,IACf,MAAMhB,EAAM,IAAIgB,EAAelS,KAAK+O,QAAQ,GAC5CmC,EAAIvB,OAEJ3P,KAAKwP,eAAejO,IAAI2P,EAAIb,cAA5BrQ,CAA2C,WAAW,KACpD43E,IACA7qE,MACC,CAACoO,MAAM,KAGN28D,EAAW,IAAIvgD,GAAI,CACvBS,aAAc,qBACd5H,SAAU,GACV7kB,UAAW,KACT2sE,EAAQrB,OAINkB,EAAW,IAAIxgD,GAAI,CACvBS,aAAc,qBACd5H,SAAU,GACV7kB,UAAW,KACT2sE,EAAQZ,OAINU,EAAU,IAAIzgD,GAAI,CACtBS,aAAc,oBACd5H,SAAU,GACV7kB,UAAW,KACT2sE,EAAQpB,OAINpK,GAAc,OAAO,sCAAuC,CAAC79D,KAAM,SAAUoS,KAAM,iCACzF,QAAiByrD,GAAa,KAC5B4J,GAAkB,CAChBt+C,aAAc,wCACdoE,mBAAoB,mCACpB7d,OAAQ,CACNkb,QAAS,WAEV13B,MAAK,KACN8I,EAAA,kCAAqC,EAAAqS,GAAA,GAAK,EAAAuuD,WAAA,0BAC1C5gE,EAAA,+BAAkC,EAAAqS,GAAA,GAAK,EAAAuuD,WAAA,uBACvCpyC,EAAA,oBAA4B,WAAYxuB,EAAA,kBACxCA,EAAA,sBAAwB,mBAAoB,CAACsF,IAAK,WAAYzP,MAAOmK,EAAA,mBAErE+sE,IACAF,EAAkB/1D,SAAW2X,EAAMknC,SAASmX,gBAAgB38D,OAAO1G,eAIvE,MAAM6jE,EAAmB,KACvB,MAAM7jE,GAAYojE,EAAkB/1D,QAE9B6+C,EAAW31D,EAAA,iBACdyJ,EACDksD,EAASmX,gBAAgB38D,OAAO1G,UAAW,SAEpCksD,EAASmX,gBAAgB38D,OAAO1G,SAGzC,CAACwjE,EAAUC,EAAUC,GAASjzE,SAAQixB,IACpCA,EAAI50B,UAAUb,UAAUsD,OAAO,cAAeyQ,MAGhD+kB,EAAA,oBAA4B,WAAYmnC,GACxC31D,EAAA,sBAAwB,mBAAoB,CAACsF,IAAK,WAAYzP,MAAO8/D,IAErEzzD,KAGF2qE,EAAkB33E,MAAMM,iBAAiB,SAAU83E,GACnDA,IACAP,IAEA3kE,EAAQ3D,QAAQhL,OACdozE,EAAkBrkE,MAClBykE,EAAS12E,UACT22E,EAAS32E,UACT42E,EAAQ52E,UACRsrE,GAGF1sE,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAGjC,CACE,MAAM6R,EAAU,IAAIC,GAAe,CAACpP,KAAM,kBAEpCs0E,EAAoB,IAAI,KAAc,CAC1Cn3D,KAAM,cACNnd,KAAM,OACNs1B,SAAU,yBACVsD,YAAY,IAER27C,EAAsB,IAAI,KAAc,CAC5Cp3D,KAAM,gBACNnd,KAAM,SACNs1B,SAAU,2BACVsD,YAAY,IAGdzpB,EAAQ3D,QAAQhL,OAAO8zE,EAAkB/kE,MAAOglE,EAAoBhlE,OAEpErT,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,a,+RAI3By2E,wBAAwB7hD,EAAUwqC,EAAwCwW,GAChF,IAAI7mE,EAAkB3L,EAA2B,GAEjD,MAAM8zE,EAAW59D,OAAOgzC,KAAK8S,GACvB+X,EAAcD,EAAS5tE,KAAIyF,GAAOqwD,EAASrwD,GAAOonE,GAAuBpnE,QAAO5J,IAAWuD,OAAOa,SACxG,GAAI4tE,EAAY13E,QAAsB,IAAZm2E,EAEnB,CACL,MAAMwB,EAAQD,EAAY13E,SAAWy3E,EAASz3E,OAQ9C,QAPe0F,IAAZywE,GACD7mE,EAAMqoE,EAAQ,6BAA+B,wBAC7Ch0E,EAAKsD,KAAKyf,GAAYyvD,KAEtB7mE,EAAMqoE,EAAQ,yBAA2B,qBAGvCA,EAAO,CACT,MAAMt8C,EAAW76B,SAASC,cAAc,QACxC46B,EAAS53B,WAAU,IAAAukB,MAAK0vD,EAAY7tE,KAAIyF,IAAO,IAAAvE,MAAKuE,MAAO,GAAM,IACjE3L,EAAKsD,KAAKo0B,SAbZ/rB,EAAM,mBAiBR,EAAAnC,EAAA,GAAegoB,EAAI5F,UAAU,IAAAxkB,MAAKuE,EAAK3L,KCjK5B,MAAMo2D,WAAuB9rD,EAA5C,c,oBACU,KAAA8S,QAOJ,GASMhS,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,sBAC7BvB,KAAKkQ,SAAS,YAEd,MAAM8R,EAAU,GAAiB,GAAI,cAAe,CAAC,CACnDnT,KAAM,SACNoS,KAAM,qBACNC,QAAS,KACP,IAAI0a,GAAU,SAAU,CACtB5D,aAAc,SACdoE,mBAAoB,qBACpBxa,QAAS,CAAC,CACR6X,QAAS,SACTkD,SAAU,KACR,eAEFqK,UAAU,MAEXtkB,WAIP1iB,KAAK4hB,QAAQ62D,KAAO,EAAW,QAE/Bz4E,KAAKkP,OAAO5K,OAAOtE,KAAK4hB,QAAQ62D,KAAMz2D,GAEtChiB,KAAKuyC,QAAU,IAAIpC,GAAYnwC,KAAK4M,WAAY5M,KAAKwP,gBAAgB,GACrExP,KAAKuyC,QAAQ3iC,OACb5P,KAAKuyC,QAAQ9C,QAAQ5kC,EAAA,cACrB7K,KAAKuyC,QAAQf,sBAEb,MAAMknC,GAAkB,OAAO,wDAAyD,CAAC7pE,KAAM,cAC/F6pE,EAAgBr4E,iBAAiB,SAAS,KACxC,MAAMgD,EAAShC,SAASC,cAAc,WACtC,IAAI,KAAcqO,KAAKtM,GAAS0nE,IAC9BA,IAAShpE,MAAKqS,GACLwpB,EAAA,2BAAqCxpB,WAIlDpU,KAAKuyC,QAAQ55B,QAAQo+B,iBAAiBltB,kBAAkBvlB,OAAOo0E,GAE/D,MAAMC,EAAwB,K,MAC5B,MAAM1uC,EAAOh1B,EAAA,YACbyjE,EAAgBn4E,UAAUsD,OAAO,OAA0B,sBAAR,QAAV,EAAAomC,EAAK5jC,aAAK,eAAEiD,KAGvDqvE,IACA34E,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAkBmJ,IAChD0B,EAAA,eAAmB1B,GACpBwvE,OA8CJ,MAAMC,EAAav3E,SAASC,cAAc,OAC1Cs3E,EAAWr4E,UAAUgB,IAAI,mBAEzB,MAQMg3B,EAR0D,CAC9D,CAAC,SAAU,gCAAiCw8C,IAC5C,CAAC,OAAQ,eAAgB0C,IACzB,CAAC,OAAQ,qCAAsCtY,IAC/C,CAAC,WAAY,yCAA0CsP,IACvD,CAAC,SAAU,0BAA2BuF,KAGzBtpE,KAAI,EAAEmE,EAAMmrB,EAAa9nB,KAC/B,IAAIqlB,GAAI,CACbS,aAAcgC,EACdnrB,KAAAA,EACAtD,UAAW,KACT,IAAI2G,EAAelS,KAAK+O,QAAQ,GAAMY,YAK5C4oB,EAAKzwB,KACH9H,KAAK64E,WAAa,IAAIthD,GAAI,CACxBS,aAAc,UACdE,oBAAqB,IACrBrpB,KAAM,iBACNtD,UAAW,KAAW,O,EAAA,K,OAAA,E,EAAA,YAChBvL,KAAKu+D,uBACDv+D,KAAK2/D,wBAGb,MAAMzuD,EAAM,IAAIysD,GAAqB39D,KAAK+O,QAC1CmC,EAAIqtD,eAAiBv+D,KAAKu+D,eAC1BrtD,EAAIb,cAAchQ,iBAAiB,WAAW,KAC5CL,KAAKu+D,oBAAiBh4D,EACtBvG,KAAK2/D,sBAAqB,KACzB,CAACxkD,MAAM,IACVjK,EAAIvB,Q,YAXgB,K,iRAexB3P,KAAK84E,YAAc,IAAIvhD,GAAI,CACzBS,aAAc,2BACdE,qBAAqB,IAAAtsB,MAAK,gBAC1BiD,KAAM,WACNtD,UAAW,KACT,IAAIwqE,GAAe/1E,KAAK+O,QAAQY,WAKtCipE,EAAWt0E,UAAUi0B,EAAK7tB,KAAIsrB,GAAOA,EAAI50B,aAKzC,MAAM23E,EAAiB,IAAI7lE,GAC3B6lE,EAAezpE,QAAQhL,OAAOs0E,GAE9B54E,KAAK4M,WAAWtI,OAAOtE,KAAKuyC,QAAQ55B,QAAuCogE,EAAe33E,WAM1FpB,KAAK4hB,QAAQ62D,KAAKp4E,iBAAiB,SAAS,KAC9B,IAAIiwE,GAAkBtwE,KAAK+O,QACnCY,UAGN+0C,GAAA,sBAEA1kD,KAAK2/D,uBAGCqZ,kBAAkBC,GACxB,GAAGj5E,KAAKk5E,2BAA6BD,EAAW,OAAOj5E,KAAKk5E,yBAE5D,MAAM7wE,EAAUrI,KAAKk5E,yBAA2B,eAAqB,6BACpE5zD,SAAQ,KACJtlB,KAAKk5E,2BAA6B7wE,IACnCrI,KAAKk5E,8BAA2B3yE,MAIpC,OAAO8B,EAGFs3D,qBAAqBsZ,GAC1B,OAAOj5E,KAAKg5E,kBAAkBC,GAAWl3E,MAAKg/D,IAC5C/gE,KAAKu+D,eAAiBwC,EAAMxC,eAC5Bv+D,KAAK64E,WAAW/gD,WAAWhH,YAAc,GAAK9wB,KAAKu+D,eAAe19D,WC7NzD,MAAMs4E,WAAyBrqE,EAA9C,c,oBACU,KAAA+D,aAAyC,KAOvCjD,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,yBAC7BvB,KAAKkQ,SAAS,cAEdlQ,KAAK+S,WAAa,IAAIN,GAAYO,IAChChT,KAAK6S,aAAeG,KAGtB,MAAMC,EAAU,IAAIC,GAAe,CACjC2qB,QAAS,wCAGL1qB,EAAe9R,SAASC,cAAc,OAC5C6R,EAAa5S,UAAUgB,IAAI,iBAE3BvB,KAAKo5E,sBAAwB,IAAI,IAAW,CAC1C/lE,MAAO,mBACPC,UAAW,MAGbtT,KAAKq5E,6BAA+B,IAAI,IAAW,CACjDhmE,MAAO,iCACPC,UAAW,MAGbH,EAAa7O,OAAOtE,KAAKo5E,sBAAsBh4E,UAAWpB,KAAKq5E,6BAA6Bj4E,WAE5F,MAAMk4E,EAAiB,KACrBt5E,KAAK6T,QAAQtT,UAAUsD,OAAO,eAAgB7D,KAAKo5E,sBAAsB14E,MAAMG,SAC5Eb,KAAKo5E,sBAAsBr5E,MAAMQ,UAAUmT,SAAS,WACpD1T,KAAKq5E,6BAA6Bt5E,MAAMQ,UAAUmT,SAAS,WAGhE1T,KAAKo5E,sBAAsBr5E,MAAMM,iBAAiB,QAASi5E,GAC3Dt5E,KAAKq5E,6BAA6Bt5E,MAAMM,iBAAiB,QAASi5E,GAElEt5E,KAAK6T,QAAU,EAAa,CAAChF,KAAM,eAEnC7O,KAAK6T,QAAQxT,iBAAiB,SAAS,KACrC,MAAMgP,EAAQrP,KAAKo5E,sBAAsB14E,MACnCqT,EAAQ/T,KAAKq5E,6BAA6B34E,MAEhDV,KAAK6T,QAAQS,UAAW,EACxBR,EAAA,gBAA8B,CAC5BzE,MAAAA,EACA0E,MAAAA,EACAwlE,WAAW,IACVx3E,MAAMm8B,IACJl+B,KAAK6S,cACN7S,KAAK6S,eAAe9Q,MAAMqS,IACxBN,EAAA,YAA0BoqB,EAAW9pB,MAIzC,wBAAoCpU,MACpC,IAAI6qC,GAAiB7qC,KAAK+O,QAAQY,KAAK,CACrC1P,KAAM,UACN8qC,WAAW,EACX17B,MAAO,kBACPlB,YAAa,gBACbg2B,QAAU9vB,GACDP,EAAA,kBAAgCoqB,EAAW7pB,WAM1DrU,KAAKsP,QAAQhL,OAAOtE,KAAK6T,SACzBZ,EAAQ3D,QAAQhL,OAAOtE,KAAK+S,WAAW3R,UAAW+R,GAClDnT,KAAK4M,WAAWtI,OAAO2O,EAAQ7R,WAG1B0O,sBAML,OALA9P,KAAK+S,WAAWlH,QAChB7L,KAAK6S,aAAe,KACpB7S,KAAKo5E,sBAAsB14E,MAAQ,GACnCV,KAAKq5E,6BAA6B34E,MAAQ,GAC1CV,KAAK6T,QAAQS,UAAW,EACjBzU,MAAMiQ,uB,cCtFF,MAAM0pE,WAA2B,KAC9C75E,cACEE,MAAM,wDAAyD,KAAM,CAAC8jC,UAAU,EAAM81C,YAAa,SAEnG,IAAA//C,OAAM15B,KAAKqP,MAAO,oBAElB,QAAiBrP,KAAK05E,YAAY,KAChC,MAAMrxE,EAAU4M,EAAA,gBAA8B80B,EAAerpC,MAAOspC,EAAmBtpC,MAAOi5E,EAAcj5E,OAE5G2H,EAAQtG,MAAK,KACX/B,KAAK6jC,UACHh2B,IACc,YAAbA,EAAI5N,OACL85B,GAAS,CAACC,YAAa,sCACvB6O,EAASv0B,UAAW,MAIxBu0B,EAAS3R,gBAAgB7uB,KACxB,CAACmH,eAAgBxP,KAAKwP,iBAEzB,MAAMknB,EAA4B,GAC5BzF,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,eAClB,MAAMwoC,EAAiB,IAAI,IAAW,CACpC12B,MAAO,YACPvP,KAAM,sBACNwP,UAAW,GACXsjB,UAAU,IAENoT,EAAqB,IAAI,IAAW,CACxC32B,MAAO,WACPvP,KAAM,0BACNwP,UAAW,KAEPqmE,EAAgB,IAAI,KAAc,CAAC/iD,UAAU,IACnDF,EAAY5uB,KAAKiiC,EAAgBC,EAAoB2vC,GAErD,MAAMrrE,EAAU,KACd,MAAMxK,EAAOimC,EAAerpC,MAAQ,IAAMspC,EAAmBtpC,MAE7DmoC,EAAS7R,WAAW92B,aAAa,aAAc4D,GAC/C+kC,EAAS7R,WAAW6O,UAGtB7lC,KAAKwP,eAAejO,IAAIwoC,EAAehqC,MAAvCC,CAA8C,QAASsO,GACvDtO,KAAKwP,eAAejO,IAAIyoC,EAAmBjqC,MAA3CC,CAAkD,QAASsO,GAE3DqrE,EAAcC,SAAW,MACdD,EAAcj5E,MAAM0V,MAAM,MAGrC,MAAM6zB,EAAOh1B,EAAA,YACP4/C,GAAY,EAAAD,GAAA,GAAkB3qB,EAAKU,OACtCkqB,EAAU3uC,OACXyzD,EAAcj5E,MAAQ,IAAMm0D,EAAU3uC,KAAK2zD,cAG7C,MAAMhxC,EAAW,IAAIzS,GAAS,CAC5BM,YAAAA,EACAlnB,eAAgBxP,KAAKwP,eACrBynB,iBAAiB,EACjBpjB,QAAS7T,KAAK05E,WACd/rE,WAAY,MAGdsjB,EAAI3sB,OAAOylC,EAAe3oC,UAAW4oC,EAAmB5oC,UAAWynC,EAAS7R,YAC5Eh3B,KAAKoB,UAAUkD,OAAO2sB,EAAK0oD,EAAcv4E,WAEzCpB,KAAK0iB,QC9DM,MAAMo3D,WAAuBhrE,EAKhCc,OACR5P,KAAKoB,UAAUyP,GAAK,qBAIpB,MAAMiuD,EAAS,EAAa,CAACjwD,KAAM,MAAOvD,UAAW,eACrDtL,KAAKsP,QAAQhL,OAAOw6D,IAEpB,QAAiBA,GAAQ,KACvB,IAAI0a,KACH,CAAChqE,eAAgBxP,KAAKwP,iBAEzBxP,KAAK+5E,YAAc,IAAI7rE,EAAY,UAAWxN,IAC5CV,KAAKg6E,aAAat5E,MAGpBV,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,mBAAoB4U,IACrD,MAAMqlE,EAAYhlE,EAAA,YAA0BL,GACtCzL,EAASyL,EAAOqU,WACnBgxD,EAAWj6E,KAAKk6E,eAAe34E,IAAI4H,GACjCnJ,KAAKk6E,eAAelqE,OAAO7G,MAGlCnJ,KAAKqP,MAAMme,YAAYxtB,KAAK+5E,YAAY34E,WAExCpB,KAAK6wB,YAAa,UAMVspD,aACR,MAAMD,EAAiB,IAAI7yB,GACrB37C,EAAOwuE,EAAexuE,KAM5B,OALAA,EAAKmF,GAAK,WACVnF,EAAKnL,UAAUgB,IAAI,sBACnB,wBAAuCmK,GAAM,KAC3C1L,KAAKyP,eACJlJ,GAAW,GACP2zE,EAGC1nE,UACRxS,KAAK6wB,WAAWxX,QAMRzH,sBACL,GAAAwoE,WAAcvf,IAAS,IAC1B76D,KAAK+5E,YAAYh6E,MAAMuN,QAGlB0sE,aAAavtE,GACfzM,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd5P,KAAK6wB,WAAWxX,QAChB,MAAMwX,EAAa7wB,KAAK6wB,WAAWnf,MACnC1R,KAAK4M,WAAWK,iBAAmB,KACnCjN,KAAK4M,WAAWxL,UAAU0vB,YAAc,GAExC7b,EAAA,qBAAmCxI,OAAOlG,EAAW,UAAUxE,MAAKigC,IAClE,IAAInR,IACF,OAGF,MAAMqpD,EAAiBl6E,KAAKk6E,eAAiBl6E,KAAKm6E,aAElD,IAAIE,EAAa,KACf,MAAM94C,EAAYC,GAAA,SAAoB,GAAK,KAAO,EACtCQ,EAAS17B,OAAO,EAAGi7B,GAE3Bx8B,SAASoE,IACX+wE,EAAe34E,IAAI4H,MAGjB64B,EAASnhC,SACXw5E,OAAa9zE,EACbvG,KAAK4M,WAAWK,iBAAmB,OAIvCotE,IACAr6E,KAAK4M,WAAWK,iBAAmB,KAC9BotE,EACDA,IAEAr6E,KAAK4M,WAAWK,iBAAmB,OAIvC,EAAAe,EAAA,GAAehO,KAAK4M,WAAWxL,UAAW84E,EAAexuE,SAItDiE,OAEL,OADA3P,KAAKg6E,eACEn6E,MAAM8P,QCxHF,MAAM2qE,WAAuBxrE,EAI1Cc,OAIE,GAHA5P,KAAKoB,UAAUyP,GAAK,2BACpB7Q,KAAKkQ,SAAS,kBAEV,eAA8BoqE,GAAehG,UAAW,CAC1D,MAAMiG,EAAW,oBACjB,sBAAqCA,EAAUD,GAAehG,UAAUlzE,UAAUkD,OAAOi2E,GACzF,wBAAuCA,EAAU,MAAM,GAIzD,MAAM3tE,EAAa,eAA8B0tE,GAAehG,UAChEt0E,KAAK4M,WAAWxL,UAAUosB,YAAY5gB,EAAWxL,WACjDpB,KAAK4M,WAAaA,EAGpB+E,SACK3R,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd5P,KAAKw6E,YAAc,YACnB,eAA8BF,GAAehG,UAC7C,iBAIF1iE,qBACE,eAA8B5R,KAAKw6E,aAAa3uE,QAGlD2G,UACE,eAA8BxS,KAAKw6E,aACnC,iBAGF1qE,sBAEE,OADA,eAA8BwqE,GAAehG,UAAUzoE,QAChDhM,MAAMiQ,uBA1CA,GAAAwkE,SAAW,ECgBb,MAAMmG,WAA2B3rE,EAAhD,c,oBAEU,KAAA4rE,mBAA6B,EAY3B9qE,OACR5P,KAAKoB,UAAUb,UAAUgB,IAAI,2BAC7BvB,KAAKkQ,SAAS,gBAEdlQ,KAAK26E,cAAgBt5E,SAASC,cAAc,OAC5CtB,KAAK26E,cAAcp6E,UAAUgB,IAAI,OAAQ,OAAQ,gBAEjDvB,KAAK46E,SAAW,EAAa,CAAC/rE,KAAM,UAEpC,MACMgJ,EAAM8rC,GAAA,0BADE,MAER8W,EAAmBp5D,SAASC,cAAc,OAChDm5D,EAAiBl6D,UAAUgB,IAAI,qBAE5BsW,EACDmZ,GAAY,CACVnZ,IAAAA,EACAoZ,IAAKwpC,EACL/4D,MAAM,EACNgB,MAAM,EACNd,MAAO,GACPC,OAAQ,GACR6gD,MAbU,KAcVC,aAAa,IACZ5gD,MAAK,SAIR04D,EAAiBl6D,UAAUgB,IAAI,yBAGjC,MAAMs8B,EAAUx8B,SAASC,cAAc,OACvCu8B,EAAQt9B,UAAUgB,IAAI,YACtB,IAAAm4B,OAAMmE,EAAS,qBAEf79B,KAAK66E,aAAe,IAAIzpE,IAExB,MAAMy+B,EAAI,KACR,MAAMqqC,EAAiB,IAAI7yB,GAAe,CACxC15C,WAAY,GACZ85C,sBAAuB,CACrBqzB,WAAY,GACZpmE,KAAK,GAEPlJ,YAAY,EACZ27C,SAAWxuC,IACT,MAAMgtB,EAAO3lC,KAAK66E,aAAanpE,IAAIiH,EAAQ9H,IACrCiY,EAA0B,CAC9B9oB,KAAK+6E,cAAcp1C,EAAK8I,WAGtB91B,EAAQ9H,GAAGqxB,UACbpZ,EAAShhB,KAAK81B,EAAA,6BAAuCjlB,EAAQ9H,GAAG0qB,aAGlE5iB,EAAQ9D,IAAIG,gBAAgB8b,YAAc,GAC1CnY,EAAQ9D,IAAIG,gBAAgB1Q,WAAU,IAAAukB,MAAKC,GAAU,KAEvDo+B,SAAWvuC,GAEF,WADM3Y,KAAK66E,aAAanpE,IAAIiH,EAAQ9H,IAClB49B,WAM7B,OAFA,wBAAuCyrC,EAAexuE,UAAMnF,OAAWA,GAAW,GAE3E2zE,GAGHc,EAAgBh7E,KAAKg7E,cAAgB,IAAIC,GAAuB,CACpEn3E,KAAM,qBACNo3E,WAAYrrC,MAGRr7B,EAAexU,KAAKwU,aAAe,IAAIymE,GAAuB,CAClEn3E,KAAM,oBACNo3E,WAAYrrC,MAGRsrC,EAAiBH,EAAcI,WAAW,CAC9Cn6D,KAAM,oBACNpS,KAAM,aAGFwsE,EAAmBL,EAAcI,WAAW,CAChDn6D,KAAM,gBACNpS,KAAM,aAGFysE,EAAiB9mE,EAAa4mE,WAAW,CAC7Cn6D,KAAM,oBACNpS,KAAM,cAGR,QAAiBssE,GAAgB,KAC/B7E,GAAkB,CAChBt+C,aAAc,yBACdoE,mBAAoB,wBACpB7d,OAAQ,CACNkb,QAAS,QAEV13B,MAAK,KACN/B,KAAKu7E,qBAEN,CAAC/rE,eAAgBxP,KAAKwP,kBAEzB,QAAiB6rE,GAAkB,KACjCr7E,KAAKw7E,iBACJ,CAAChsE,eAAgBxP,KAAKwP,kBAEzB,QAAiB8rE,GAAgB,KAC/B,IAAI1oE,EAAe5S,KAAK+O,QAAQY,KAAK,IAAI,KACxC,CAACH,eAAgBxP,KAAKwP,iBAEzB2rE,EAAe56E,UAAUgB,IAAI,WAC7B85E,EAAiB96E,UAAUgB,IAAI,UAC/B+5E,EAAe/6E,UAAUgB,IAAI,WAE7BvB,KAAKsP,QAAQhL,OAAOtE,KAAK46E,UACzB56E,KAAK4M,WAAWtI,OACdm2D,EACA58B,EACAm9C,EAAc55E,UACdoT,EAAapT,UACbpB,KAAK26E,eAIDI,cAActsC,GACpB,MAAuC,UAApC5jC,EAAA,8BACE4jC,EAAW,SACL,IAAA7iC,MAAK,YAAa,CAAC5I,KAAKE,MAAMurC,EAAW,SAEzC,IAAA7iC,MAAK,YAAa,CAAC5I,KAAKE,MAAiB,MAAXurC,KAGpCA,GAAY,KACN,IAAA7iC,MAAK,eAAgB,CAAC6iC,EAAW,OAEjC,IAAA7iC,MAAK,cAAe,CAAC6iC,IAK3B9+B,OACL,MAAMpH,EAAS1I,MAAM8P,OA4CrB,OA3CApH,EAAOxG,MAAK,KACV/B,KAAK46E,SAASr6E,UAAUC,OAAO,cAC/B0U,UAAUC,YAAYC,oBAAoBC,IACxCrV,KAAKy7E,oBAAsB,CACzBjmE,SAAUH,EAASE,OAAOC,SAC1BE,UAAWL,EAASE,OAAOG,UAC3BgmE,SAAUrmE,EAASE,OAAOmmE,UAG5B5tE,QAAQ4Z,IAAI1nB,KAAKy7E,qBAEjBxmE,EAAA,aACEI,EAASE,OAAOC,SAChBH,EAASE,OAAOG,UAChBL,EAASE,OAAOmmE,UAChB35E,MAAM8T,IACN,MACMy/C,EADUz/C,EAA6B8lE,QAAQ,GAChCrmB,MACfsmB,EAAetmB,EAAM/qD,MAAK,CAACC,EAAGxF,IAAMwF,EAAEikC,SAAWzpC,EAAEypC,WACnDotC,EAAgBvmB,EAAMxrD,QAAQxJ,GAAkB,eAAZA,EAAEqlC,KAAKr8B,IAAoBzI,OAC/Di7E,EAAexmB,EAAMxrD,QAAQxJ,GAAkB,eAAZA,EAAEqlC,KAAKr8B,IAAoBzI,OACpE+6E,MAAAA,GAAAA,EAAc72E,SAAQ4gC,IACpB,MAAMx8B,EAASiT,EAAA,YAA0BupB,EAAKA,MACxC1yB,EAAU9J,EAAO+4B,SAAWliC,KAAKg7E,cAAgBh7E,KAAKwU,aAC5DxU,KAAK66E,aAAa51E,IAAIkE,EAAQw8B,GAC9B1yB,EAAQioE,WAAW35E,IAAI4H,MAGzBnJ,KAAK26E,cAAcp6E,UAAUsD,OAAO,UAAWi4E,IAAgBD,IAC/D77E,KAAK26E,cAAc70E,UAAY,gDAE/BiI,IACF/N,KAAK26E,cAAcp6E,UAAUC,OAAO,QACpCR,KAAK46E,SAASr6E,UAAUgB,IAAI,cAC5BvB,KAAK46E,SAASv6E,iBAAiB,QAASL,KAAK2P,MAC1C5B,aAAiBiI,yBAClBhW,KAAK26E,cAAc70E,UAAY,oDAE/B9F,KAAK26E,cAAc70E,UAAY,6EAK9ByC,EAGDgzE,gBACFv7E,KAAKy7E,sBAAuBz7E,KAAK06E,oBACrC16E,KAAK06E,mBAAoB,EAEzB5gD,GAAM,qFAEN7kB,EAAA,aACEjV,KAAKy7E,oBAAoBjmE,SACzBxV,KAAKy7E,oBAAoB/lE,UACzB1V,KAAKy7E,oBAAoBC,UACzB,EACA,YAGFxmE,UAAUC,YAAY4mE,eAAexzE,IACnC,MAAMyzE,EAAuBzzE,EAAOgN,OAAOG,YAAc1V,KAAKy7E,oBAAoB/lE,UAC5EumE,EAAsB1zE,EAAOgN,OAAOC,WAAaxV,KAAKy7E,oBAAoBjmE,SAC1E0mE,EAAgBl8E,KAAKm8E,kBACzB5zE,EAAOgN,OAAOC,SAAUjN,EAAOgN,OAAOG,UACtC1V,KAAKy7E,oBAAoBjmE,SAAUxV,KAAKy7E,oBAAoB/lE,WAC1D,KAEAumE,GAAuBD,IAAyBE,IAClDjnE,EAAA,aACE1M,EAAOgN,OAAOC,SACdjN,EAAOgN,OAAOG,UACdnN,EAAOgN,OAAOmmE,UACd,EACA,YAEF17E,KAAKy7E,oBAAsB,CACzBjmE,SAAUjN,EAAOgN,OAAOC,SACxBE,UAAWnN,EAAOgN,OAAOG,UACzBgmE,SAAUnzE,EAAOgN,OAAOmmE,eAMxBF,eACFx7E,KAAK06E,oBACT16E,KAAK06E,mBAAoB,EACzB5gD,GAAM,gGACN7kB,EAAA,aACE,EACA,EACA,GACA,EACA,IAIIknE,kBAAkBC,EAAcC,EAAeC,EAAcC,GACnE,MAAMjgD,EAAI,oBACV,OACE,MAAQt5B,KAAKw5E,KACXx5E,KAAK8hE,KACF,GAAM9hE,KAAKmiE,KAAKmX,EAAOF,GAAQ9/C,GAE9Bt5B,KAAKmiE,IAAIiX,EAAO9/C,GAAKt5B,KAAKmiE,IAAImX,EAAOhgD,IAClC,EAAIt5B,KAAKmiE,KAAKoX,EAAQF,GAAS//C,GAAG,M,0BCpSlC,SAASmgD,GAAa1gE,EAAemE,EAAW,GAC7D,GAAa,IAAVnE,EAAa,MAAO,IAEvB,MACMyL,EAAKtH,EAAW,EAAI,EAAIA,EAGxB3a,EAAIvC,KAAKykB,MAAMzkB,KAAK0kB,IAAI3L,GAAS/Y,KAAK0kB,IAJlC,MAMV,OAAOC,YAAY5L,EAAQ/Y,KAAK4kB,IANtB,IAM6BriB,IAAIub,QAAQ0G,IAJrC,CAAC,GAAI,IAAK,IAAK,IAAK,KAI8BjiB,GC0C3D,MAAMm3E,GAA+B,uBAmnBtCpxE,GAAY,uBACX,MAAM4H,GASXvT,YAAYC,EAAiC,IAC3C,MAAMwB,EAAYpB,KAAKoB,UAAYC,SAASC,cAAc,OAC1DF,EAAUb,UAAUgB,IAAI+J,GAAY,cAEpC,MAAM60B,EAAiBngC,KAAKmgC,eAAiB9+B,SAASC,cAAc,OAOpE,GANA6+B,EAAe5/B,UAAUgB,IAAI+J,IAE1B1L,EAAQ8gC,UACTP,EAAe5/B,UAAUgB,IAAI,aAG5B3B,EAAQ+8E,sBACTx8C,EAAe77B,OAAOw8B,MACtBX,EAAe5/B,UAAUgB,IAAI,4BACxB,GAAI3B,EAAQk+B,YAIjBqC,EAAe5/B,UAAUgB,IAAI,oBAJC,CAC9B,MAAM40C,EAAK90C,SAASC,cAAc,MAClC6+B,EAAe77B,OAAO6xC,GAaxB,MAAM7mC,EAAUtP,KAAKsP,QAAUtP,KAAKslC,yBAEpC,GAAG1lC,EAAQkE,KAAM,CACf,MAAMuL,EAAQrP,KAAKqP,MAAQhO,SAASC,cAAc,OAClD+N,EAAM9O,UAAUgB,IAAI,kBAAmB+J,GAAY,UACnD,IAAAmlE,OAAM,CAAC93D,QAAStJ,EAAOc,IAAKvQ,EAAQkE,KAAMU,KAAM5E,EAAQ6U,WACxDnF,EAAQhL,OAAO+K,GAKjB,GAFAjO,EAAUkD,OAAO67B,GAEdvgC,EAAQi+B,QAAS,CAClB,MAAMA,EAAU79B,KAAK69B,QAAU79B,KAAKslC,yBACpCzH,EAAQt9B,UAAUgB,IAAI+J,GAAY,YAClClK,EAAUkD,OAAOu5B,IAEM,IAApBj+B,EAAQi+B,UACT,IAAA4yC,OAAM,CAAC93D,QAASklB,EAAS1tB,IAAKvQ,EAAQi+B,WAKrCyH,yBACL,MAAMh2B,EAAUjO,SAASC,cAAc,OAQvC,OAPAgO,EAAQ/O,UAAUgB,IAAI+J,GAAY,YAMlCtL,KAAKmgC,eAAe77B,OAAOgL,GACpBA,GAIJ,MAAMmqD,GAAkB,CAAC14B,EAAsBj9B,EAAoB+5B,KACxE,MAAM5qB,EAAU,IAAIC,GAAe,CAACpP,KAAAA,EAAM+5B,QAAAA,IAE1C,OADAkD,EAASz8B,OAAO2O,EAAQ7R,WACjB6R,EAAQ3D,SAGJwxB,GAAoB,KAC/B,MAAM87C,EAAYv7E,SAASC,cAAc,OAEzC,OADAs7E,EAAUr8E,UAAUgB,IAAI,sBACjBq7E,GAGF,MAAM3B,WAA+B/nE,GAG1CvT,YAAYC,GACVC,MAAMD,GAENI,KAAKk7E,WAAat7E,EAAQs7E,WAE1Bl7E,KAAKsP,QAAQhL,OAAOtE,KAAKk7E,WAAWxvE,MAG/B0vE,WAAWx7E,GAChB,MAAM2e,GAAS,OAAO,yDAA0D3e,GAGhF,OAFGI,KAAKqP,MAAOrP,KAAKsP,QAAQnL,aAAaoa,EAAQve,KAAKqP,MAAMhL,aACvDrE,KAAKsP,QAAQpL,QAAQqa,GACnBA,GAIX,MAAMs+D,GAAiB,IA1tBhB,cAA6BtsE,EAkBlC5Q,cACEE,MAAM,CACJyR,UAAWjQ,SAASuzC,eAAe,eACnChkC,eAAgB,SATZ,KAAA1E,aAAuG,GAc7GlM,KAAK+5E,YAAc,IAAI7rE,EAAY,UACnC,MAAM4uE,EAAgB98E,KAAKsR,UAAUC,cAAc,8BACnDurE,EAAcx4E,OAAOtE,KAAK+5E,YAAY34E,WAEtC,MAYM27E,EAAkB,KACtB,IAAIjD,GAAe95E,MAAM2P,QAI3B3P,KAAKg9E,QAAUh9E,KAAKsR,UAAUC,cAAc,wBAE5C,MAAM0rE,EAA+D,CACnEpuE,KAAM,UACNoS,KAAM,gBACNC,QAAS,KACP,IAAIo5D,GAAet6E,MAAM2P,QAE3B+I,OAAQ,MACSzP,EAAA,kCAAmD,GAAG,GACrDpI,SAAWoI,EAAA,iCAAkD,IAI3Ei0E,EAAqB,IAAI,KAAc,CAC3Cr5E,QAAQ,EACR8d,QAAuC,UAA9B9W,EAAA,mBAAqB/G,OAEhCo5E,EAAmBn9E,MAAMM,iBAAiB,UAAU,KAClDwK,EAAA,uBAA2BqyE,EAAmBn9E,MAAM4hB,QAAU,QAAU,MACxE0X,EAAA,oBAA4B,WAAYxuB,EAAA,kBACxCA,EAAA,sBAAwB,mBAG1BA,EAAA,yBAA2B,gBAAgB,KACzCqyE,EAAmBp8E,iBAA+C,UAA9B+J,EAAA,mBAAqB/G,SAG3D,MAwFMq5E,EAxFoE,CAAC,CACzEtuE,KAAM,QACNoS,KAAM,gBACNC,QAAS,KACP9T,YAAW,KACT,WAAqB,CACnBjE,OAAQ,YAET,KAEJ8zE,EAAY,CACbpuE,KAAM,OACNoS,KAAM,WACNC,QAAS67D,GACR,GAA2B,CAC5BluE,KAAM,QACNoS,KAAM,eACNC,QAAS,KACP,IAAIu5D,GAAmBz6E,MAAM2P,cAE7BpJ,EAAW,CACbsI,KAAM,WACNoS,KAAM,WACNC,QAAS,KACP,IAAI05C,GAAe56D,MAAM2P,SAE1B,CACDd,KAAM,WACNoS,KAAM,WACNC,QAAS,OAGTC,cAAe+7D,GACd,CACDruE,KAAM,aACNoS,KAAM,aACNC,QAAS,OAGTC,cAAe,IAAI,KAAc,CAC/Btd,QAAQ,EACR8d,SAAS,EACTyX,SAAU,gCAEX,CACDvqB,KAAM,OACNoS,KAAM,mBACNC,QAAS,KACP,gBAA0B,CACxBk8D,SAAU,mBAGb,CACDvuE,KAAM,MACNoS,KAAM,YACNC,QAAS,KACP,MAAM1W,EAAInJ,SAASC,cAAc,KACjCkJ,EAAEgO,OAAS,SACXhO,EAAEopD,KAAO,kDACTvyD,SAASwY,KAAKvV,OAAOkG,GACrBA,EAAEg2B,QACFpzB,YAAW,KACT5C,EAAEhK,WACD,KAEJ,CACDqO,KAAM,SACNoS,KAAM,2BACNC,QAAS,KACP1d,QAAQC,IAAI,CACV45E,GAAA,MAAmB,CAACC,WAAY,MAChCD,GAAA,SAAsB,eACrBt7E,MAAK,KACNsT,SAASu+C,KAAO,kCAGpBl7C,OAAQ,IAAM,mBACb,CACD7J,KAAM,SACNoS,KAAM,kCACNC,QAAS,KACPm8D,GAAA,SAAsB,aAAat7E,MAAK,KACtCsT,SAASu+C,KAAO,yCAGpBl7C,OAAQ,IAAM,oBAGoB5O,OAAOa,SAE3C3K,KAAKu9E,SAAW,GAAiB,GAAI,eAAgBJ,GAAkB78E,IACrE68E,EAAgBp4E,SAAQwZ,IACnBA,EAAO7F,QACR6F,EAAO5F,QAAQpY,UAAUsD,OAAO,QAAS0a,EAAO7F,gBAItD1Y,KAAKu9E,SAASh9E,UAAUC,OAAO,cAC/BR,KAAKu9E,SAASh9E,UAAUgB,IAAI,uBAAwB,cAEpDvB,KAAKg9E,QAAQ/4E,cAAcE,aAAanE,KAAKu9E,SAAUv9E,KAAKg9E,SAE5D,MAAMh7D,EAAUhiB,KAAKu9E,SAAShsE,cAAc,aAEtCisE,EAAgBn8E,SAASC,cAAc,KAC7Ck8E,EAAc5pB,KAAO,iEACrB4pB,EAAchlE,OAAS,SACvBglE,EAAcC,IAAM,sBACpBD,EAAcj9E,UAAUgB,IAAI,mBAC5Bi8E,EAAcn9E,iBAAiB,MAAmBC,IAChDA,EAAEo9E,mBACF,aAEF,MAAMprE,EAAIjR,SAASC,cAAc,QACjCgR,EAAE/R,UAAUgB,IAAI,wBAChB+Q,EAAExM,UAAY,eAAiB,YAAa,IAAqB,iBACjE03E,EAAcl5E,OAAOgO,GACrB0P,EAAQzhB,UAAUgB,IAAI,cACtBygB,EAAQ1d,OAAOk5E,GAEfx9E,KAAK29E,WAAa,GAAiB,GAAI,WAAY,CAAC,CAClD9uE,KAAM,aACNoS,KAAM,aACNC,QAAS,KACP,IAAIi4D,GAAiBn5E,MAAM2P,SAE5B,CACDd,KAAM,WACNoS,KAAM,WACNC,QA9KsB,KACtB,IAAI2pB,GAAiB7qC,MAAM2P,KAAK,CAC9B1P,KAAM,OACN8qC,WAAW,EACX5G,QAAU9vB,IACR,IAAIzB,EAAe5S,MAAM2P,KAAK0E,IAEhChF,MAAO,kBACPlB,YAAa,oBAuKd,CACDU,KAAM,aACNoS,KAAM,iBACNC,QAAS67D,KAEX/8E,KAAK29E,WAAWryE,UAAY,0EAC5BtL,KAAK29E,WAAWj4D,mBAAmB,aAAc,6GAIjD1lB,KAAK29E,WAAW9sE,GAAK,WACrBisE,EAAcjgD,mBAAmBv4B,OAAOtE,KAAK29E,YAE7C39E,KAAK49E,UAAYv8E,SAASC,cAAc,OAExCtB,KAAK49E,UAAUtyE,UAAY,2DAC3B,EAAA+V,GAAAA,QAAOrhB,KAAK49E,WACZ59E,KAAK49E,UAAUt5E,QAAO,IAAAsH,MAAK,YAK3B,QAAiB5L,KAAK49E,WAAW,KAC/BvoE,SAASwoE,YAGXf,EAAcjgD,mBAAmBv4B,OAAOtE,KAAK49E,WAS7C59E,KAAK+5E,YAAYh6E,MAAMM,iBAAiB,SAAS,IAAML,KAAK89E,cAAc,CAAC3iE,MAAM,IAIjFnb,KAAK+9E,cAAgB18E,SAASC,cAAc,QAC5CtB,KAAK+9E,cAAczyE,UAAY,2CAE/B2xE,EAAWtkE,QAAQrU,OAAOtE,KAAK+9E,eAE/BlzE,EAAA,yBAA2B,iBAAkBupE,IAC3C,GAAiB,IAAdA,EAAOvjE,GAAU,CAElB,MAAMrK,EAAQ4tE,EAAO4J,mBACrBh+E,KAAK+9E,cAAc/vD,UAAY,GAAKyuD,GAAaj2E,EAAO,GACxDxG,KAAK+9E,cAAcx9E,UAAUsD,OAAO,QAAS2C,OAIjDyO,EAAA,cAA4B,kBAE5BokB,EAAA,mBAA2Bt3B,MAAKu3B,IAC9B,MAAM+7B,EAAe/7B,EAAM+7B,cAAgB,GAC3C,IAAI,IAAI9vD,EAAI,EAAG1E,EAASw0D,EAAax0D,OAAQ0E,EAAI1E,IAAU0E,EACzD8zB,EAAA,oBAA4Bg8B,EAAa9vD,GAAI,gBAG/C,MACM04E,EAAsBjtC,aAAY,KACtCp7B,MAAM,UAAW,CAACsoE,MAAO,aACxBn8E,MAAKwL,GAAuB,MAAfA,EAAIg6C,QAAkBh6C,EAAI4wE,IAAM5wE,EAAI0T,QAAWzd,QAAQgsB,WACpEztB,MAAKkf,IACDA,IAAS,mBACVjhB,KAAKo+E,WAAY,EACjBxjC,cAAcqjC,GAEVj+E,KAAK29E,WAAWp9E,UAAUmT,SAAS,cACrC1T,KAAK49E,UAAUr9E,UAAUC,OAAO,iBAIrCyN,MAAMse,GAAA,KAdqB,SAmB1BuxD,aACN,MAAMO,EAAkBr+E,KAAKsR,UAAUC,cAAc,qBAE/C3E,EAAa,IAAI,KAAWyxE,GAE5B5uE,EAAQ,KAEVzP,KAAKg9E,QAAQx8C,SAIjBxgC,KAAKkM,aAAe,CAClB81B,SAAU,IAAI52B,EAAY,sBAAuB,gBAAY7E,OAAWA,OAAWA,OAAWA,EAAWkJ,GACzGslD,eAAgB,IAAI3pD,EAAY,eAAgB,gBAAY7E,OAAWA,OAAWA,OAAWA,EAAWkJ,GACxG5C,SAAU,IAAIzB,EAAY,iBAAkB,YAC5CmqD,OAAQ,IAAInqD,GAAY,EAAO,YAAY,EAAM,uBAAuB,GAAM,EAAOqE,GACrF2lD,OAAQ,IAAIhqD,EAAY,SAAU,YAAY,EAAM,uBAAuB,GAAM,EAAMqE,IAGzF,MAAMgjC,EAAczyC,KAAKyyC,YAAc,IAAIU,GAAe,CACxDC,UAAW,CAAC,CACV/pC,YAAa,2BACbvF,KAAM,cACN7D,KAAM,SACL,CACDoJ,YAAa,gCACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,yBACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,8BACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,2BACbvF,KAAM,kBACN7D,KAAM,SACL,CACDoJ,YAAa,gCACbvF,KAAM,kBACN7D,KAAM,UAER2M,WAAAA,EACAV,aAAclM,KAAKkM,aACnBskD,YAAY,EACZE,eAAe,EACfpnC,YAAY,IAGd+0D,EAAgBn6E,QAAQuuC,EAAYC,IAAIzuC,cAAcA,eACtD2I,EAAWxL,UAAUkD,OAAOmuC,EAAYrxC,WAGtCqxC,EAAY4B,SAAS,CACnBlrC,OAAQ,GAAG8f,WACX/e,SAAU,IAEZuoC,EAAY5iC,UAAU,GACtB4iC,EAAYjxC,MAAK,GAKnB,IAAI88E,EAAgC,GAChCC,EAAyB,GAAGt1D,WAC5Bu1D,EAAkB,EAClBC,EAAkB,EACtB,MAAMC,EAAe,KAEnB1+E,KAAK+5E,YAAY34E,UAAUb,UAAUsD,OAAO,kBAA6C,IAA1By6E,EAAez9E,QAC9Eb,KAAK+5E,YAAY34E,UAAUb,UAAUsD,OAAO,cAAey6E,EAAez9E,QAEvEy9E,EAAez9E,OAChBb,KAAK+5E,YAAYh6E,MAAMuD,MAAMspC,YAAY,gBAAkB0xC,EAAeA,EAAez9E,OAAS,GAAG4e,wBAAwB+uB,MAAQxuC,KAAK+5E,YAAYh6E,MAAM0f,wBAAwBoB,KAAQ,MAE5L7gB,KAAK+5E,YAAYh6E,MAAMuD,MAAMq7E,eAAe,kBAI1CC,EAASv9E,SAASC,cAAc,OACtCs9E,EAAOr+E,UAAUgB,IAAI,iBACrBq9E,EAAOv+E,iBAAiB,SAAUC,IAChC,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,iBACzC,IAAIA,EACF,OAGF,MAAMrI,EAAMqI,EAAOwQ,QAAQ7Y,IAC3B,GAA4B,IAAzBA,EAAI8P,QAAQ,SAAgB,CAC7B,MAAO3W,EAAG4rD,EAASqC,GAAWpnD,EAAI6vC,MAAM,KACxCw+B,GAAmBtpB,EACnBupB,GAAmBlnB,OAEnBgnB,EAAiBpuE,EAAI8Y,WAGvBzQ,EAAOnY,iBAAiB,SAAS,KAC/Bw+E,EAAermE,MAGjBxY,KAAK+5E,YAAY34E,UAAUkD,OAAOkU,GAClCxY,KAAK+5E,YAAYhtE,SAAS/M,KAAK+5E,YAAYr5E,MAAQ,IACnD49E,EAAex2E,KAAK0Q,GACpBkmE,OAGFjsC,EAAYC,IAAIzuC,cAAcK,OAAOs6E,GAErC,MAAME,EAAe,CAAC3uE,EAAsBd,KAC1C,MAAM4hB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,iBAElB,MAAMu6B,EAAWz6B,SAASC,cAAc,kBA2BxC,OA1BAw6B,EAASv7B,UAAUgB,IAAI,uBAAwB,SAC/Cu6B,EAAS57B,aAAa,SAAU,KAChC47B,EAASv7B,UAAUgB,IAAI,aAEvB0vB,EAAIjI,QAAQ7Y,IAAM,GAAKA,EACpBA,EAAI6vB,iBACQz5B,IAAV8I,IACDA,EAAQ,IAAI,KAAU,CAAClG,OAAQgH,EAAI8Y,aAAatQ,SAGlDmjB,EAAS57B,aAAa,OAAQ,GAAKiQ,IAEnC2rB,EAASv7B,UAAUgB,IAAI,wBAGtB8N,IACoB,iBAAZ,EACP4hB,EAAInrB,UAAYuJ,IAEhB,EAAArB,EAAA,GAAeijB,EAAK5hB,GACpB4hB,EAAI3sB,OAAO+K,KAIf4hB,EAAIiS,sBAAsB,aAAcpH,GAEjC7K,GAGH4tD,EAAkBrmE,IAEM,IADhBA,EAAOwQ,QAAQ7Y,IACpB8P,QAAQ,SACbu+D,EAAkBC,EAAkB,EAEpCF,EAAiB,GAAGt1D,WAGtBzQ,EAAOhY,UACP,EAAAwR,EAAA,GAAiBssE,EAAgB9lE,GAEjCpL,YAAW,KACTsxE,IACA1+E,KAAK+5E,YAAYhtE,SAAS/M,KAAK+5E,YAAYr5E,SAC1C,IAGLV,KAAK+5E,YAAYtrE,QAAU,KACzB6vE,EAAev5E,SAAQ0M,IACrBotE,EAAeptE,OAInBzR,KAAK+5E,YAAYhtE,SAAYrM,IAgB3B,GAfA+xC,EAAYxB,cACZwB,EAAY4B,SAAS,CACnBlrC,OAAQo1E,EACRr0E,SAAUq0E,OAAiBh4E,EAAY,EACvCkG,MAAO/L,EACPw0D,QAASspB,EACTjnB,QAASknB,IAEXhsC,EAAYjxC,MAAK,GAEjBo9E,EAAO94E,UAAY,GACnB2sC,EAAYC,IAAInyC,UAAUC,OAAO,SAI7B+9E,GAAkB79E,EAAMwM,OAAQ,CAClC,MAAM2jB,EAAa4hB,EAAY5hB,WAAWnf,MAC1ClO,QAAQC,IAAI,CAEVwF,EAAA,mBAAoCvI,GAAO2H,QAAQtG,MAAK,EAAEs/B,QAAAA,KAAaA,EAAQ32B,KAAIk3B,GAAKA,EAAEz4B,WAC1F8L,EAAA,qBAAmCvU,GAAO,KACzCqB,MAAKwgC,IACF1R,MACY,IAAInrB,IAAI68B,EAAQ,GAAG98B,OAAO88B,EAAQ,KAE1Cx9B,SAAQoE,IACdy1E,EAAOt6E,OAAOw6E,EAAa31E,OAG7BspC,EAAYC,IAAInyC,UAAUsD,OAAO,SAAU+6E,EAAO94E,eAKtD,IAAI04E,GAAmB99E,EAAMwM,OAAQ,CACnC,MAAM6xE,EAAoB,IAC1B,SAAar+E,EAAOq+E,GACpBA,EAAMh6E,SAAQi6E,IACZJ,EAAOt6E,OAAOw6E,EAAa,QAAUE,EAAS9pB,QAAU,IAAM8pB,EAASznB,QAASynB,EAAS3vE,WAG3FojC,EAAYC,IAAInyC,UAAUsD,OAAO,SAAU+6E,EAAO94E,aAItD2sC,EAAY1iC,KAAKqkD,yBAAyB/zD,iBAAiB,aAAcC,IACvE,MAAMkY,GAAS,EAAA+sB,GAAA,GAAUjlC,EAAEkY,OAAQ,MACnC,IAAIA,EACF,OAGF,MAAMhL,GAAc,EAAAqV,GAAA,GAAgBrK,EAAQ,gBAC5C,IAAIhL,GAAeA,EAAYjN,UAAUmT,SAAS,wBAA0BlG,EAAYjN,UAAUmT,SAAS,uBACzG,OAGF,MAAMvK,EAASqP,EAAOstD,aAAa,gBAAgB78C,WACnDoQ,EAAA,mBAA2Bt3B,MAAKu3B,IAC9B,MAAM+7B,EAAe/7B,EAAM+7B,cAAgB,GAC3C,GAAGA,EAAa,KAAOlsD,EAAQ,EAC7B,EAAA6I,EAAA,GAAiBqjD,EAAclsD,GAC/BksD,EAAartD,QAAQmB,GAClBksD,EAAax0D,OAAS,KACvBw0D,EAAax0D,OAAS,IAGxBw4B,EAAA,oBAA4B,eAAgBg8B,GAC5C,IAAI,MAAMlsD,KAAUksD,EAClBh8B,EAAA,oBAA4BlwB,EAAQ,sBAIzC,CAACymB,SAAS,IAEb,IAAIqvD,EAAkB59E,SAASC,cAAc,OAC7C29E,EAAgB1+E,UAAUgB,IAAI,2BAC9B09E,EAAgB36E,OAAOtE,KAAKkM,aAAaqpD,OAAO7pD,MAChD1L,KAAKkM,aAAaqpD,OAAOn0D,UAAUkD,OAAO26E,GACnB,IAAI,KAAYA,GAAvC,IAGIC,EADArqD,GAAQ,EAGZ,MAAM+d,GAAa,OAAiByrC,EAAgBp6E,cAAe,YAAa,KAAM4M,IACjFquE,GAAuB3wE,aAAa2wE,GAE7B,IAAPruE,GAAagkB,IACd4d,EAAY5iC,UAAU,GAAG,GACzB7P,KAAK+5E,YAAYvrE,eACjB0wE,EAAwB/xE,OAAOC,YAAW,KACxC8xE,EAAwB,EACxBl/E,KAAK29E,WAAWp9E,UAAUC,OAAO,aACjCR,KAAKo+E,WAAap+E,KAAK49E,UAAUr9E,UAAUC,OAAO,eACjD,MAGLq0B,GAAQ,KAGV+d,EAAW,GAEX,MAAMusC,EAAkB,aAClBC,EAAU,KACdp/E,KAAKu9E,SAASh9E,UAAUC,OAAO2+E,GAC/Bn/E,KAAKg9E,QAAQz8E,UAAUgB,IAAI49E,GAC3Bn/E,KAAK29E,WAAWp9E,UAAUgB,IAAI,aAC9BvB,KAAK49E,UAAUr9E,UAAUgB,IAAI,aAC7BvB,KAAKu9E,SAASt5E,cAAc4lB,kBAAkBtpB,UAAUsD,OAAO,cAAc,GAEzE,GAAA8oD,kBAAqBh8C,EAAA,iBAAuC,kBAC9DA,EAAA,WAAiC,CAC/BkB,MAAO,KACLpC,KAEFxP,KAAM,kBAIV2yC,EAAW,IAGb5yC,KAAK+5E,YAAYh6E,MAAMM,iBAAiB,QAAS++E,GACjDA,IAEAp/E,KAAKg9E,QAAQ38E,iBAAiB,SAAUC,IACtCN,KAAKu9E,SAASh9E,UAAUgB,IAAI49E,GAC5Bn/E,KAAKg9E,QAAQz8E,UAAUC,OAAO2+E,GAC9Bn/E,KAAKu9E,SAASt5E,cAAc4lB,kBAAkBtpB,UAAUsD,OAAO,cAAc,GAE7E8M,EAAA,eAAqC,iBAErCiiC,EAAW,MAGb,MAAMysC,EAAuB,EAAW,SACxCr/E,KAAKkM,aAAakpD,OAAOzpD,OAAOrH,OAAO+6E,GACvCA,EAAqBh/E,iBAAiB,SAAS,KAC7Ci2E,GAAkB,CAChBl6C,mBAAoB,8BACpB7d,OAAQ,CACNkb,QAAS,cACTuN,UAAU,KAEXjlC,MAAK,KACNs3B,EAAA,mBAA2Bt3B,MAAKu3B,IAC9Bt5B,KAAKkM,aAAakpD,OAAOvpD,QAEzB,MAAMwpD,EAAe/7B,EAAM+7B,cAAgB,GAC3C,IAAI,MAAMlsD,KAAUksD,EAClBh8B,EAAA,0BAAkClwB,EAAQ,gBAG5CksD,EAAax0D,OAAS,EACtBw4B,EAAA,oBAA4B,eAAgBg8B,cA4HtD,qBAAgCwnB,GAChC,YCnwBe,MAAMyC,GAOnB3/E,YAAoB09B,GAAA,KAAAA,KAAAA,EANZ,KAAAzD,QAA8B,GAC9B,KAAA2lD,WAA4C,IAAInuE,IAChD,KAAA6gE,OAAuB,GAEvB,KAAAuN,aAAe,IAMvBC,aAAa57B,GACX,MAAMzsC,EAAUpX,KAAKu/E,WAAW7tE,IAAImyC,GACjCzsC,IACEA,EAAQ8Z,MAAMrwB,SACfuW,EAAQ8Z,MAAMyQ,eAAcC,GAAKA,EAAEiiB,SAAWA,IAC1CzsC,EAAQ8Z,MAAMrwB,OAGhBb,KAAK0/E,YAAYtoE,EAAQ8Z,QAFzB,EAAAlf,EAAA,GAAiBhS,KAAKiyE,OAAQ76D,EAAQ8Z,QAM1ClxB,KAAKu/E,WAAWvvE,OAAO6zC,IAI3B87B,gBAAgB97B,EAAqB96C,GACnC,MAAMqO,EAAUpX,KAAKu/E,WAAW7tE,IAAImyC,GACjCzsC,IACDA,EAAQrO,IAAMA,GAIlB62E,UAAU/7B,EAAqB39C,EAAoBU,GAGjD,MAAM4vD,EAAYtwD,EAAQ2mB,KACpB9jB,EAAM7C,EAAQ6C,IACpB,IACImoB,EADAzjB,EAASvH,EAAQ25E,UAAY35E,EAAQuH,OAItCA,IAAW5C,EAAA,cAAkB3E,EAAQiD,SAAW0B,EAAA,cAAmB3E,EAAgB45E,YAAcryE,IAClGA,EAASA,EAAOwb,UAAS,IAI3BjpB,KAAKy/E,aAAa57B,GAElB,MAAMk8B,EAAe,CAACl8B,OAAAA,EAAQ96C,IAAAA,EAAKytD,UAAAA,GACnC,GAAGx2D,KAAK45B,QAAQ/4B,OAAQ,CACtB,IAAIm/E,EACAC,GAAgB,EACpB,IAAI,IAAI16E,EAAI,EAAGA,EAAIvF,KAAK45B,QAAQ/4B,SAAU0E,EAAG,CAC3C,MAAMs+C,EAAS7jD,KAAK45B,QAAQr0B,GACtBowB,EAAO3yB,KAAK4yB,IAAIiuB,EAAO2S,UAAYA,GAGzC,GAFa3S,EAAOp2C,SAAWA,GAAUkoB,GAAQ31B,KAAKw/E,cAKpD,GAFAS,EAAe16E,EAEO,cAAnBvF,KAAKq9B,KAAKp9B,KACX,WAGFggF,GAAgB,EAGlB,GAAsB,cAAnBjgF,KAAKq9B,KAAKp9B,MACR8I,EAAM86C,EAAO96C,IACd,MAaN,IARqB,IAAlBk3E,IACDD,EAAchgF,KAAK45B,QAAQqmD,IAOzBD,EACC,CACH9uD,EAAQ8uD,EAAY9uD,MAEpB,IAAI3rB,EAAI,EAAG26E,EAA0B,EACrC,KAAM36E,EAAI2rB,EAAMrwB,SAAU0E,EAAG,CAC3B,MAAM46E,EAAajvD,EAAM3rB,GAAGixD,UACtB4pB,EAAOlvD,EAAM3rB,GAAGwD,IAEtB,GAAGytD,EAAY2pB,EACb,MAKF,GAJU3pB,IAAc2pB,IACtBD,EAA0BE,GAGzBF,GAA2Bn3E,EAAMm3E,EAClC,MAIJhvD,EAAM5qB,OAAOf,EAAG,EAAGw6E,QApBJ//E,KAAKiyE,OAAOnqE,KAAKopB,EAAQ,CAAC6uD,SAuB3C//E,KAAKiyE,OAAOnqE,KAAKopB,EAAQ,CAAC6uD,IAK5B,MAAMM,EAAc,CAAC7pB,UAAAA,EAAW/oD,OAAAA,EAAQ1E,IAAK7C,EAAQ6C,IAAKmoB,MAAAA,GAC1D,IAAIovD,EAAc,EAClB,KAAMA,EAActgF,KAAK45B,QAAQ/4B,UAC5Bb,KAAK45B,QAAQ0mD,GAAav3E,IAAMA,KADMu3E,GAM3CtgF,KAAK45B,QAAQtzB,OAAOg6E,EAAa,EAAG,CAAC9pB,UAAAA,EAAW/oD,OAAAA,EAAQ1E,IAAK7C,EAAQ6C,IAAKmoB,MAAAA,IAC1ElxB,KAAK0/E,YAAYxuD,GAEjBlxB,KAAKu/E,WAAWt6E,IAAI4+C,EAAQw8B,GAqD9BX,YAAYxuD,GASR,IAAIA,EAAMrwB,OACR,OAGF,MAAMg0B,EAAQ3D,EAAM,GAAG2yB,OAIvB,GAAoB,IAAjB3yB,EAAMrwB,OAGP,YAFAg0B,EAAMt0B,UAAUgB,IAAI,iBAAkB,iBAItCszB,EAAMt0B,UAAUC,OAAO,iBACvBq0B,EAAMt0B,UAAUgB,IAAI,kBAItB,MAAMV,EAASqwB,EAAMrwB,OAAS,EAC9B,IAAI,IAAI0E,EAAI,EAAGA,EAAI1E,IAAU0E,EACZ2rB,EAAM3rB,GAAGs+C,OACjBtjD,UAAUC,OAAO,gBAAiB,kBAI3C,MAAMmpD,EAAOz4B,EAAMA,EAAMrwB,OAAS,GAAGgjD,OACrC8F,EAAKppD,UAAUC,OAAO,kBACtBmpD,EAAKppD,UAAUgB,IAAI,iBAKvBg/E,uBAAuBx3E,GACrB,MAAMqO,EAAUpX,KAAK45B,QAAQvnB,MAAKmvD,GAAKA,EAAEz4D,MAAQA,IAC9CqO,GACDpX,KAAK0/E,YAAYtoE,EAAQ8Z,OAI7B/lB,UACEnL,KAAK45B,QAAU,GACf55B,KAAKiyE,OAAS,GACdjyE,KAAKu/E,WAAW1zE,SCrOL,MAAM20E,WAAwB,KAqB3C7gF,YAAY8gF,EAAuBC,EAA+C9gF,EAO9D,IA4ClB,GA3CAC,MAAM,oBAAqBD,EAAQ+gF,UAAY,GAAK,CAAC,CACnDlnD,QAAS,aACTkD,SAAU,KACL38B,KAAK0gF,QACN1gF,KAAK0gF,OAAO1gF,KAAK4gF,aAAahqB,UAAY,IAAO,KAGpD,CACDn9B,QAAS,SACTyiC,UAAU,IACR,OAAF,QAAGriD,MAAM,EAAMgiB,iBAAiB,GAASj8B,IAlBV,KAAA8gF,OAAAA,EAA+C,KAAA9gF,QAAAA,EAsKlF,KAAAihF,YAAevgF,IACbN,KAAK8gF,cAAcC,SAAS/gF,KAAK8gF,cAAcE,WAAa,GAC5DhhF,KAAK+gF,WAEF/gF,KAAK8gF,cAAclqB,YAAc52D,KAAKihF,SAASrqB,WAChD52D,KAAKkhF,QAAQhhF,aAAa,WAAY,QAGxCF,KAAK6T,QAAQ21B,gBAAgB,aAG/B,KAAA23C,YAAe7gF,IACbN,KAAK8gF,cAAcC,SAAS/gF,KAAK8gF,cAAcE,WAAa,GAC5DhhF,KAAK+gF,WAEF/gF,KAAK8gF,cAAclqB,YAAc52D,KAAKohF,SAASxqB,WAChD52D,KAAK6T,QAAQ3T,aAAa,WAAY,QAGxCF,KAAKkhF,QAAQ13C,gBAAgB,aAG/B,KAAA63C,YAAe/gF,IAEb,MAAMkY,EAASlY,EAAEkY,OAEjB,IAAIA,EAAOwQ,QAAQwtC,UAAW,OAE9B,GAAGx2D,KAAKshF,WAAY,CAClB,GAAGthF,KAAKshF,aAAe9oE,EAAQ,OAC/BxY,KAAKshF,WAAW/gF,UAAUC,OAAO,UAGnCR,KAAKshF,WAAa9oE,EAElBA,EAAOjY,UAAUgB,IAAI,UACrB,MAAMi1D,GAAah+C,EAAOwQ,QAAQwtC,UAElCx2D,KAAK4gF,aAAe,IAAIvmC,KAAKmc,GAE7Bx2D,KAAKkQ,WACLlQ,KAAKuhF,gBA3LLvhF,KAAKk1D,QAAUt1D,EAAQs1D,SAAW,IAAI7a,KAAK,uBAExComC,EAAWzgF,KAAKk1D,SACjBurB,EAASe,YAAYxhF,KAAKk1D,QAAQ6B,cAAe/2D,KAAKk1D,QAAQ8rB,WAAYhhF,KAAKk1D,QAAQusB,WAIzFzhF,KAAK0hF,YAAcrgF,SAASC,cAAc,OAC1CtB,KAAK0hF,YAAYnhF,UAAUgB,IAAI,wBAE/BvB,KAAKkhF,QAAU7/E,SAASC,cAAc,UACtCtB,KAAKkhF,QAAQ3gF,UAAUgB,IAAI,WAAY,aAAc,qBACrD,QAAiBvB,KAAKkhF,QAASlhF,KAAK6gF,YAAa,CAACrxE,eAAgBxP,KAAKwP,iBAEvExP,KAAK6T,QAAUxS,SAASC,cAAc,UACtCtB,KAAK6T,QAAQtT,UAAUgB,IAAI,WAAY,aAAc,qBACrD,QAAiBvB,KAAK6T,QAAS7T,KAAKmhF,YAAa,CAAC3xE,eAAgBxP,KAAKwP,iBAEvExP,KAAK2hF,WAAatgF,SAASC,cAAc,OACzCtB,KAAK2hF,WAAWphF,UAAUgB,IAAI,2BAE9BvB,KAAK0hF,YAAYp9E,OAAOtE,KAAKkhF,QAASlhF,KAAK2hF,WAAY3hF,KAAK6T,SAG5D7T,KAAK4hF,gBAAkBvgF,SAASC,cAAc,OAC9CtB,KAAK4hF,gBAAgBrhF,UAAUgB,IAAI,uBACnC,QAAiBvB,KAAK4hF,gBAAiB5hF,KAAKqhF,YAAa,CAAC7xE,eAAgBxP,KAAKwP,iBAE/ExP,KAAK6Z,KAAKvV,OAAOtE,KAAK0hF,YAAa1hF,KAAK4hF,iBAGrChiF,EAAQwpB,SAAU,CACnBppB,KAAK+rB,QAAU1qB,SAASC,cAAc,OACtCtB,KAAK+rB,QAAQxrB,UAAUgB,IAAI,oBAE3B,MAAMq7E,EAAYv7E,SAASC,cAAc,OACzCs7E,EAAUr8E,UAAUgB,IAAI,8BACxBq7E,EAAUt4E,OAAO,KAEjB,MAAMu9E,EAAkB,CAACh/E,EAAaD,EAAwB0L,EAAmCwzE,KAC/F,MAAMC,EAAY,GAAKl/E,EACvB7C,KAAKwP,eAAejO,IAAIqB,EAAW7C,MAAnCC,CAA0C,SAAUM,IAClD,IAAII,EAAQkC,EAAWlC,MAAMC,QAAQ,MAAO,IACzCD,EAAMG,OAAS,EAChBH,EAAQA,EAAME,MAAM,EAAG,IAEF,IAAjBF,EAAMG,SAAiBH,EAAM,IAAMqhF,EAAU,IAAyB,IAAjBrhF,EAAMG,SAAiBH,EAAQmC,KAClE,IAAjBnC,EAAMG,QAAgBihF,GACvBA,GAAYphF,EAAM,IAGpBA,EAAQ,IAAMA,EAAM,IAIxBkC,EAAW9B,iBAAiBJ,GAC5B4N,EAAQ5N,EAAMG,YAIlBb,KAAKgiF,gBAAkB,IAAI,IAAW,CAACliF,WAAW,IAClDE,KAAKiiF,kBAAoB,IAAI,IAAW,CAACniF,WAAW,IAEpD+hF,EAAgB,GAAI7hF,KAAKgiF,iBAAkBnhF,IAC3B,IAAXA,GACDb,KAAKiiF,kBAAkBliF,MAAMuN,QAG/BtN,KAAKuhF,kBACHW,IACFliF,KAAKiiF,kBAAkBvhF,OAASwhF,EAASliF,KAAKiiF,kBAAkBvhF,OAAOE,MAAM,EAAG,MAElFihF,EAAgB,GAAI7hF,KAAKiiF,mBAAoBphF,IACvCA,GACFb,KAAKgiF,gBAAgBjiF,MAAMuN,QAG7BtN,KAAKuhF,kBAGPvhF,KAAK4gF,aAAeH,EAEpBA,EAAS0B,WAAW1B,EAAS2B,aAAe,IAE5CpiF,KAAKgiF,gBAAgBlhF,kBAAkB,IAAM2/E,EAAS4B,YAAYzhF,OAAO,IACzEZ,KAAKiiF,kBAAkBnhF,kBAAkB,IAAM2/E,EAAS2B,cAAcxhF,OAAO,IAE7E6/E,EAAShqB,SAAS,EAAG,EAAG,EAAG,GAE3Bz2D,KAAK+rB,QAAQznB,OAAOtE,KAAKgiF,gBAAgB5gF,UAAWw7E,EAAW58E,KAAKiiF,kBAAkB7gF,YAEtF,QAAiBpB,KAAK05E,YAAY,KAC7B15E,KAAK0gF,SACN1gF,KAAK4gF,aAAanqB,UAAUz2D,KAAKgiF,gBAAgBthF,OAAS,GAAIV,KAAKiiF,kBAAkBvhF,OAAS,EAAG,EAAG,GACpGV,KAAK0gF,OAAO1gF,KAAK4gF,aAAahqB,UAAY,IAAO,IAGnD52D,KAAK6jC,SACJ,CAACr0B,eAAgBxP,KAAKwP,iBAEzBxP,KAAK6Z,KAAKvV,OAAOtE,KAAK+rB,SAEtB/rB,KAAKkhF,QAAQ3gF,UAAUgB,IAAI,WAC3BvB,KAAK6T,QAAQtT,UAAUgB,IAAI,WAG7B,MAAM+gF,EAAgBjhF,SAASC,cAAc,OAC7CghF,EAAc/hF,UAAUgB,IAAI,kBAC5B+gF,EAAch+E,OAAOtE,KAAKoB,WAC1BpB,KAAK2Y,QAAQrU,OAAOg+E,GAIpB7B,EAAShqB,SAAS,EAAG,EAAG,EAAG,GAC3Bz2D,KAAK4gF,aAAeH,EAEpBzgF,KAAKu3D,QAAU33D,EAAQ23D,SAAW,IAAIld,KACtCr6C,KAAKu3D,QAAQd,SAAS,EAAG,EAAG,EAAG,GAE/Bz2D,KAAK8gF,cAAgB,IAAIzmC,KAAKr6C,KAAK4gF,cACnC5gF,KAAK8gF,cAAcpqB,QAAQ,GAE3B12D,KAAKohF,SAAW,IAAI/mC,KAAKr6C,KAAKu3D,SAC9Bv3D,KAAKohF,SAAS1qB,QAAQ,GAEtB12D,KAAKihF,SAAW,IAAI5mC,KAAKr6C,KAAKk1D,SAC9Bl1D,KAAKihF,SAASxqB,SAAS,EAAG,EAAG,EAAG,GAChCz2D,KAAKihF,SAASvqB,QAAQ,GAEnB12D,KAAK8gF,cAAclqB,YAAc52D,KAAKihF,SAASrqB,WAChD52D,KAAKkhF,QAAQhhF,aAAa,WAAY,QAGrCF,KAAK8gF,cAAclqB,YAAc52D,KAAKohF,SAASxqB,WAChD52D,KAAK6T,QAAQ3T,aAAa,WAAY,QAGrCN,EAAQo8B,UACTh8B,KAAKkQ,SAAW,QAGlBlQ,KAAKuhF,eACLvhF,KAAKkQ,WACLlQ,KAAK+gF,WA+CAQ,eACL,GAAGvhF,KAAK05E,YAAc15E,KAAK4gF,aAAc,CACvC,IAAIzwE,EAAkB3L,EAAc,GACpC,MAAMqoB,EAAO,IAAIwtB,KACjBxtB,EAAK4pC,SAAS,EAAG,EAAG,EAAG,GAEvB,MAAM8rB,EAA0C,CAC9C3S,OAAQ,UACRD,KAAM,WAGF6S,EAAW,IAAInoC,KAAKr6C,KAAK4gF,aAAahqB,WAG5C,GAFA4rB,EAAS/rB,UAAUz2D,KAAKgiF,gBAAgBthF,OAAQV,KAAKiiF,kBAAkBvhF,OAEpEV,KAAK4gF,aAAahqB,YAAc/pC,EAAK+pC,UACtCzmD,EAAM,yBAGE,CACRA,EAAM,oBAEN,MAAMsyE,EAA0C,CAC9C3rB,MAAO,QACP4rB,IAAK,WAGJF,EAASzrB,gBAAkBlqC,EAAKkqC,gBACjC0rB,EAAYzrB,KAAO,WAGrBxyD,EAAKsD,KAAK,IAAI,0BAAqB,CACjC+kB,KAAM21D,EACN5iF,QAAS6iF,IACR9pE,SAGLnU,EAAKsD,KAAK,IAAI,0BAAqB,CACjC+kB,KAAM21D,EACN5iF,QAAS2iF,IACR5pE,SAEH3Y,KAAK05E,WAAW7lB,WAAWrmC,aAAY,IAAA5hB,MAAKuE,EAAK3L,KAI9C0L,WAGLlQ,KAAKqP,MAAMyhB,YAAc,GACzB9wB,KAAKqP,MAAM/K,OAAO,IAAI,0BAAqB,CACzCuoB,KAAM7sB,KAAK4gF,aACXhhF,QAAS,CACP8iF,IAAK,UACL5rB,MAAO,OACP6rB,QAAS,WAEVhqE,SAGGiqE,cAActuE,EAAmB0Z,EAAkC,IACzE,MAAMvc,EAAKpQ,SAASC,cAAc,UAWlC,OAVAmQ,EAAGlR,UAAUgB,IAAI,WAAY,0BAE1B+S,GACD7C,EAAGvR,aAAa,WAAY,QAG3B8tB,GACDvc,EAAGnN,OAAO0pB,GAGLvc,EAGFsvE,WACL,MAAM8B,EAAY,IAAIxoC,KAAKr6C,KAAK8gF,eAE1BlhF,EAAsC,CAC1Co3D,KAAM,UACNF,MAAO92D,KAAK+rB,SAAWhB,EAAA,YAAsB,QAAU,QAGzD/qB,KAAK2hF,WAAW7wD,YAAc,GAC9B9wB,KAAK2hF,WAAWr9E,OAAO,IAAI,0BAAqB,CAACuoB,KAAMg2D,EAAWjjF,QAAAA,IAAU+Y,SAGzE3Y,KAAK82D,OACN92D,KAAK82D,MAAMt2D,SAGbR,KAAK82D,MAAQz1D,SAASC,cAAc,OACpCtB,KAAK82D,MAAMv2D,UAAUgB,IAAI,qBAEzB,MAAMuhF,EAAgB,IAAIzoC,KACpBqoC,EAAMI,EAAcC,SACf,IAARL,GACDI,EAAcrsB,UAAU,IAAMisB,EAAM,IAGtC,IAAI,IAAIn9E,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAMkM,EAAKzR,KAAK4iF,eAAc,EAAM,IAAI,0BAAqB,CAAC/1D,KAAMi2D,EAAeljF,QAAS,CAAC+iF,QAAS,YAAYhqE,SAClHlH,EAAGlR,UAAUC,OAAO,0BACpBiR,EAAGlR,UAAUgB,IAAI,yBACjBvB,KAAK82D,MAAMxyD,OAAOmN,GAClBqxE,EAAcpsB,QAAQosB,EAAcrB,UAAY,GAIlD,IAAIuB,EAAWH,EAAUE,SAAW,GACnB,IAAdC,IAAiBA,EAAW,GAE/B,MAAMC,EAAa,IAAI5oC,KAAKwoC,EAAUjsB,WACtCqsB,EAAWvsB,QAAQusB,EAAWxB,UAAYuB,EAAW,GAGrD,IAAI,IAAIz9E,EAAI,EAAGA,EAAIy9E,IAAYz9E,EAC1BvF,KAAKJ,QAAQsjF,oBACdD,EAAWvsB,QAAQusB,EAAWxB,UAAY,GAC1CzhF,KAAK82D,MAAMxyD,OAAOtE,KAAK4iF,eAAc,EAAM,GAAKK,EAAWxB,aAE3DzhF,KAAK82D,MAAMxyD,OAAOtE,KAAK4iF,eAAc,IAIzC,EAAG,CACD,MAAM/1D,EAAOg2D,EAAUpB,UACjBhwE,EAAKzR,KAAK4iF,cAAcC,EAAY7iF,KAAKu3D,SAAWsrB,EAAY7iF,KAAKk1D,QAAS,GAAKroC,GACzFpb,EAAGuX,QAAQwtC,UAAY,GAAKqsB,EAAUjsB,UAEnCisB,EAAUjsB,YAAc52D,KAAK4gF,aAAahqB,YAC3C52D,KAAKshF,WAAa7vE,EAClBA,EAAGlR,UAAUgB,IAAI,WAGnBvB,KAAK82D,MAAMxyD,OAAOmN,GAElBoxE,EAAUnsB,QAAQ7pC,EAAO,SACK,IAAxBg2D,EAAUpB,WAElB,MAAMnqC,EAAYt3C,KAAK82D,MAAM/qD,kBAAoB,EACjD,GAAG/L,KAAKJ,QAAQsjF,oBAAsB5rC,EACpC,IAAI,IAAI/xC,EAAI+xC,EAAW/xC,EAAI,IAAKA,EAC9BvF,KAAK82D,MAAMxyD,OAAOtE,KAAK4iF,eAAc,EAAM,GAAKC,EAAUpB,YAC1DoB,EAAUnsB,QAAQmsB,EAAUpB,UAAY,GAI5C,MAAM0B,EAAQngF,KAAKmsC,KAAKnvC,KAAK82D,MAAM/qD,kBAAoB,GACvD/L,KAAKoB,UAAU4nB,QAAQm6D,MAAQ,GAAKA,EAEpCnjF,KAAK4hF,gBAAgBt9E,OAAOtE,KAAK82D,QChYrC,MAAMssB,GAAa,kBAIJ,MAAMC,GAKnB1jF,YAAYC,GAIVI,KAAKyuB,cAAgB7uB,EAAQ6uB,cAC7BzuB,KAAK2N,WAAa/N,EAAQ+N,WAE1B3N,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI6hF,IAE7BpjF,KAAKoB,UAAUkC,MAAMspC,YAAY,gBAAiBhtC,EAAQ+N,WAAa,MAGlE4b,OAAOlV,EAAmBka,GAC/B,MAAMqC,EAAW5wB,KAAKoB,UAAUwvB,UAChCvc,EAAUA,EAAQzT,QAAQgG,WACf/F,OAAS,IAClBwT,EAAUA,EAAQzT,OAAO,IAG3ByT,EAAQtP,SAAQ,CAACoE,EAAQhD,KACvB,IAAIm9E,EAAkB1yD,EAASzqB,GAC3Bm9E,IACFA,EAAkBjiF,SAASC,cAAc,OACzCgiF,EAAgB/iF,UAAUgB,IA/BEgiF,qCAkC9B,IAAIvsD,EAAassD,EAAgBz5D,kBAC7BmN,IACFA,EAAa,IAAI+E,GACjB/E,EAAW92B,aAAa,SAAU,KAClC82B,EAAWz2B,UAAUgB,IAAI,UAAYvB,KAAK2N,WAvCxBy1E,0BAwClBpsD,EAAWvI,cAAgBzuB,KAAKyuB,cAChCuI,EAAWzI,aAAeA,GAG5ByI,EAAW92B,aAAa,OAAQ,GAAKiJ,GAEjC6tB,EAAWjS,YACbu+D,EAAgBh/E,OAAO0yB,GAGrBssD,EAAgBv+D,YAClB/kB,KAAKoB,UAAUkD,OAAOg/E,MAKzBj5E,MAAMC,KAAKsmB,GAA4BhwB,MAAMyT,EAAQxT,QAAQkE,SAAQ0M,GAAMA,EAAGjR,YCvCpE,MAAMgjF,WAAwBr6D,YAS3CxpB,cACEE,QACAG,KAAKO,UAAUgB,IArBA,YAwBNkiF,oBACT,OAAOzjF,KAAK0jF,eAGHD,kBAAcA,GACvBzjF,KAAK0jF,eAAiBD,EAGbj9E,YACT,OAAOxG,KAAKyjF,cAAcj9E,MAGrBoJ,KAAK3P,GACVD,KAAKC,KAAOA,EACZD,KAAKO,UAAUgB,IAAI,YAAmBtB,GAGjC0jF,oBAAoBC,GACzB5jF,KAAK4jF,iBAAmBA,EAGnBr6D,OAAOs6D,GACZ,MAAMC,IAAwB9jF,KAAKy6D,iBAC/BqpB,IACF9jF,KAAKy6D,iBAAmBp5D,SAASC,cAAc,OAC/CtB,KAAKy6D,iBAAiBl6D,UAAUgB,IAAI,oBACpCvB,KAAKsE,OAAOtE,KAAKy6D,mBAGnB,MAAMgpB,EAAgBzjF,KAAKyjF,cAC3B,IAAII,IAAuBC,EAAqB,CAC9C,MAAMl8C,EAAoBT,GAAA,cAAgCs8C,EAAc57C,WACxE,EAAA8J,GAAA,GAAY/J,GAAoBA,I,MAC1BA,EAAkBm8C,aACpB/jF,KAAKy6D,iBAAiBl6D,UAAUgB,IAAI,aAGnCqmC,EAAkB5sB,OAAOmuB,UAC1BnpC,KAAKO,UAAUgB,IAAI,eAGrB,MAAML,EAAqB,WAAdlB,KAAKC,KA/DG,GACD,GA+Dd+jF,EAAchkF,KAAKikF,mBAAqBjzD,GAAY,CACxDC,IAAKjxB,KAAKy6D,iBACV5iD,IAAkC,QAA7B,EAAA+vB,EAAkBm8C,mBAAW,QAAIn8C,EAAkBI,YACxDpmC,MAAOV,EACPW,OAAQX,EACRizB,QAAQ,IACP7O,SAAQ,KACNtlB,KAAKikF,qBAAuBD,IAC7BhkF,KAAKikF,wBAAqB19E,UAO7B29E,gB,MACL,MAAMT,EAAgBzjF,KAAKyjF,cACrBU,EAA0B,WAAdnkF,KAAKC,KA9EuB,EACD,EA8E7C,GAAGwjF,EAAcj9E,OAAS29E,GAA4B,UAAdnkF,KAAKC,OAAqBD,KAAK4jF,iBAAmB,CACpF5jF,KAAKq2D,UACPr2D,KAAKq2D,QAAUh1D,SAASC,cAA4B,WAAdtB,KAAKC,KAAoB,IAAM,QACrED,KAAKq2D,QAAQ91D,UAAUgB,IAAI,qBAG7B,MAAMszD,EAAY4nB,GAAagH,EAAcj9E,OAC1CxG,KAAKq2D,QAAQvlC,cAAgB+jC,IAC9B70D,KAAKq2D,QAAQvlC,YAAc+jC,GAGzB70D,KAAKq2D,QAAQpyD,eACfjE,KAAKsE,OAAOtE,KAAKq2D,cAEC,QAAZ,EAAAr2D,KAAKq2D,eAAO,eAAEpyD,iBACtBjE,KAAKq2D,QAAQ71D,SACbR,KAAKq2D,aAAU9vD,GAIZ69E,cAAcC,GACF,WAAdrkF,KAAKC,OAILD,KAAKyjF,cAAcj9E,OAvGuB,IAuGwBxG,KAAK4jF,iBACrE5jF,KAAKskF,iBACNtkF,KAAKskF,eAAeljF,UAAUZ,SAC9BR,KAAKskF,oBAAiB/9E,IAMtBvG,KAAKskF,iBACPtkF,KAAKskF,eAAiB,IAAIjB,GAAe,CACvC11E,WAAY,KAGd3N,KAAKsE,OAAOtE,KAAKskF,eAAeljF,YAGlCpB,KAAKskF,eAAe/6D,OAAO86D,EAAgB35E,KAAIm9B,GAAYzrB,EAAA,YAA0ByrB,EAAS08C,cAGzFC,YAAYC,IAAazkF,KAAKyjF,cAAczoE,OAAOghC,QACvC,WAAdh8C,KAAKC,OACUD,KAAKO,UAAUmT,SAAS,eAAiB1T,KAAKO,UAAUmT,SAAS,gBAClE+wE,IACf,QAAczkF,KAAM,YAAaykF,EAAUzkF,KAAK8vB,YAAc,IAAM,GAIjE40D,uBACL,EAAA/yC,GAAA,GAAYxK,GAAA,cAAgCnnC,KAAKyjF,cAAc57C,WAAYD,IACzE,MAAM1mC,EAAqB,WAAdlB,KAAKC,KAAoB0kF,GAA4BC,GAC5D3zD,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,6BAElBiC,QAAQC,IAAI,CACVutB,GAAY,CACVC,IAAKA,EACLpZ,IAAK+vB,EAAkBm8C,YACvBniF,MAAOV,EACPW,OAAQX,EACR6gD,WAAW,EACXY,aAAa,EACbjgD,MAAM,EACNk/C,UAAW,EACX1wB,MAAO,OACPkwB,YAAY,IAGdM,GAAqB,CACnB7pC,IAAK+vB,EAAkBi9C,iBACvB3jF,KAAM,GACNsX,OAAQxY,KAAKy6D,iBACb9Y,KAAM,SACNC,UAAW,EACXl/C,MAAM,IACLo/C,iBACF//C,MAAK,EAAE+iF,EAAYC,MACpB,MAAMvkF,EAAS,MAEb,UAAQ,KAENskF,EAAWtkF,SACXywB,EAAIzwB,SACJR,KAAKy6D,iBAAiBl6D,UAAUC,OAAO,qBAI3CskF,EAAWzkF,iBAAiB,cAAe4hD,IACtCA,IAAY6iC,EAAW5iC,WACrBliD,KAAKikF,mBACNjkF,KAAKikF,mBAAmBliF,MAAK,KAC3BqL,WAAW5M,EAAQ,QAGrBA,QAKNskF,EAAWzkF,iBAAiB,cAAc,KACxCL,KAAKy6D,iBAAiBn2D,OAAO2sB,GAC7BjxB,KAAKy6D,iBAAiBl6D,UAAUgB,IAAI,iBACpCujF,EAAWpiF,OACXqiF,EAAariF,SACZ,CAACyY,MAAM,WAMlB4U,eAAeC,OAtME,mBAsMewzD,IC3MhC,MAGMwB,GAAyD,IAAI5zE,IAGpD,MAAM6zE,WAAyB97D,YAQ5CxpB,cACEE,QACAG,KAAKO,UAAUgB,IAhBA,aAiBfvB,KAAKoK,OAAS,GAGhB86E,oBACE,IAAIjgF,EAAM+/E,GAAmBtzE,IAAI1R,KAAKmQ,KAClClL,GACF+/E,GAAmB//E,IAAIjF,KAAKmQ,IAAKlL,EAAM,IAAIS,KAG7CT,EAAI1D,IAAIvB,MAELA,KAAKmlF,mBAAqBnlF,KAAK8vB,cAChC9vB,KAAKmlF,oBACLnlF,KAAKmlF,uBAAoB5+E,GAI7BspB,uBACE,MAAM5qB,EAAM+/E,GAAmBtzE,IAAI1R,KAAKmQ,KACxClL,EAAI+K,OAAOhQ,MACPiF,EAAI/D,MACN8jF,GAAmBh1E,OAAOhQ,KAAKmQ,KAI5Bi1E,iBAAiBC,GACtB,OAAOrlF,KAAKoK,OAAOpK,KAAKoK,OAAO6V,QAAQolE,IAAkB5B,cAGpD19B,aACL,OAAO/lD,KAAKkG,QAGP0J,KAAK1J,EAA0BjG,EAA0BqlF,QAC9C/+E,IAAbvG,KAAKmQ,KACNnQ,KAAK6vB,uBAGP7vB,KAAKkG,QAAUA,EACflG,KAAKmQ,IAAMnQ,KAAKkG,QAAQiD,OAAS,IAAMnJ,KAAKkG,QAAQ6C,IACpD/I,KAAKslF,cAAgBA,EAElBtlF,KAAKC,OAASA,IACfD,KAAKC,KAAOA,EACZD,KAAKO,UAAUgB,IAAI,aAAmBtB,IAGxCD,KAAKklF,oBAGAK,cAAcr/E,GACnB,OAAOlG,KAAK4P,KAAK1J,EAASlG,KAAKC,KAAMD,KAAKslF,eAGrCz/C,OAAO3/B,EAA0Bs/E,GACtCxlF,KAAKkG,QAAUA,EACflG,KAAKupB,OAAOi8D,GAGPj8D,OAAOi8D,GACZ,MAAMp8C,EAAYppC,KAAKkG,QAAQkjC,UACzBq8C,KAAkBr8C,IAAaA,EAAU7G,QAAQ1hC,QAEvD,GADAb,KAAKO,UAAUsD,OAAO,oBAAqB4hF,IACvCA,IAAiBzlF,KAAKoK,OAAOvJ,OAAQ,OAEzC,MAAM6kF,EAA2Bv+C,GAAA,0BAEzB/R,EAASqwD,EACbC,aAAoCliF,QAClC4lC,EAAU7G,QACV6G,EAAU7G,QAAQz4B,QAAO25E,GAChBt8C,GAAA,mBAAqCs8C,EAAc57C,YAE5D,IAEJ,EAAA7hC,EAAA,GAAehG,KAAKoK,QAAQ,CAACi7E,EAAiBl/E,EAAKX,KACjD,MAAMqiC,EAAWw9C,EAAgB5B,cAAc57C,SACjCzS,EAAOuwD,MAAKlC,GAAiBA,EAAc57C,WAAaA,MAEpEriC,EAAIc,OAAOH,EAAK,GAChBk/E,EAAgB7kF,aAIpB,MAAMolF,EAAiBxwD,EAAO3wB,QAAO,CAACC,EAAKuzB,IAAMvzB,EAAMuzB,EAAEzxB,OAAO,GAC1Do9E,EAAmBx6C,KAAeA,EAAUpuB,OAAO6qE,cAAgBD,ED5F9B,ECsI7C,GAzCE5lF,KAAKoK,OAASgrB,EAAO1qB,KAAI,CAAC+4E,EAAet9E,KACvC,MAAM2/E,EAAqB9lF,KAAKoK,OAAO0O,WAAUusE,GAAmBA,EAAgB5B,cAAc57C,WAAa47C,EAAc57C,WAC7H,IAAIw9C,GAA0C,IAAxBS,GAA6B9lF,KAAKoK,OAAO07E,GAC3DT,IACFA,EAAkB,IAAI7B,GACtB6B,EAAgBz1E,KAAK5P,KAAKC,OAG5B+lD,GAAuBq/B,EAAiBrlF,KAAMmG,GAE9C,MAAMk+E,EAAkBj7C,EAAU28C,iBAAmB38C,EAAU28C,iBAAiBj8E,QAAO+9B,GAAYA,EAASA,WAAa47C,EAAc57C,WAAY,GAQnJ,OAPAw9C,EAAgB5B,cAAgB,OAAH,UAAOA,GACpC4B,EAAgB1B,oBAAoBC,GACpCyB,EAAgB97D,OAAOvpB,KAAKslF,eAC5BD,EAAgBnB,gBAChBmB,EAAgBjB,cAAcC,GAC9BgB,EAAgBb,cAETa,MAWLrlF,KAAKslF,gBAAiBE,MAAAA,OAAc,EAAdA,EAAgB3kF,UACrCb,KAAK8vB,YACN9vB,KAAKgmF,qBAAqBR,GAE1BxlF,KAAKmlF,kBAAoB,KACvBnlF,KAAKgmF,qBAAqBR,MAO9BxlF,KAAKoK,OAAOvJ,QAAwB,UAAdb,KAAKC,KAAkB,CAC/C,MAAMgE,EAAgBjE,KAAKiE,cAG3B,GAFAjE,KAAKQ,SAEFyD,EAAc1D,UAAUmT,SAAS,sBAAwBzP,EAAcgiF,WAAWplF,OAEnF,YADAoD,EAAczD,SAIhB,MAAM0lF,EAAWlmF,KAAKuR,cAAc,SACjC20E,GACDjiF,EAAcK,OAAO4hF,IAKnBF,qBAAqBR,GAExBxlF,KAAKkG,QAAQiD,SAAW0B,EAAA,gBAE3B26E,EAAezgF,SAAQ0+E,IACrB,MAAM4B,EAAkBrlF,KAAKoK,OAAOiI,MAAKgzE,GAAmBA,EAAgB5B,cAAc57C,WAAa47C,EAAc57C,WAClHw9C,GACDA,EAAgBX,0BAMxB30D,eAAeC,OA5KE,oBA4Kei1D,ICvKhCp6E,EAAA,yBAA2B,mBAAoB3E,IAC5CmE,MAAMC,KAAKjJ,SAASmQ,iBAA4B,kCAAmBtL,EAAQiD,UAAUjD,EAAQ6C,UAA+BhE,SAAQ4T,IACnIA,EAAQzS,QAAUA,EAClByS,EAAQ4Q,eAIG,MAAM48D,WAAuBh9D,YAU1CxpB,cACEE,QAHM,KAAAumF,SAAU,EAMXx2E,OACL5P,KAAKupB,SACLvpB,KAAKgpB,QAAQq9D,QAAUrmF,KAAKkG,QAAQiD,OAAS,IAAMnJ,KAAKkG,QAAQ6C,IAChE/I,KAAKO,UAAUgB,IAAI,UAAW,WAAavB,KAAKC,MAG3CspB,SACL,MAAM+8D,EAAUtmF,KAAKkG,QAAQogF,QAM7B,GAAiB,WAAdtmF,KAAKC,KAAmB,CACzB,IAAIsmF,EACDvmF,KAAK6pB,oBACN08D,EAAWvmF,KAAK6pB,oBAGfy8D,MAAAA,OAAO,EAAPA,EAASE,kBACPD,IAAaA,EAAShmF,UAAUmT,SAAS,4BAC1C1T,KAAK8F,UAAY,GACjBygF,EAAW,MAGTvmF,KAAKskF,iBACPtkF,KAAKskF,eAAiB,IAAIjB,GAAe,CACvC50D,cAAezuB,KAAKyuB,cACpB9gB,WAAY,KAGd3N,KAAKskF,eAAeljF,UAAUb,UAAUgB,IAAI,2BAG9CglF,EAAWvmF,KAAKskF,eAAeljF,UAE/BpB,KAAKskF,eAAe/6D,OAAO+8D,EAAQE,gBAAgB97E,KAAIi7B,GAAQvpB,EAAA,YAA0BupB,KAAQ3lC,KAAKuuB,gBAEnGg4D,IAAaA,EAAShmF,UAAUmT,SAAS,oBAC1C6yE,EAAS/lF,SACT+lF,EAAW,MAGTA,IACFA,EAAWllF,SAASC,cAAc,QAClCilF,EAAShmF,UAAUgB,IAAI,oBAIvBglF,EAAStiF,eACXjE,KAAKkE,QAAQqiF,GAGXvmF,KAAKihB,OACPjhB,KAAKihB,KAAO,IAAI,uBAGlB,MAAMA,EAAOjhB,KAAKihB,KAWlB,GAVGqlE,EACEA,EAAQA,QACTrlE,EAAKo2D,iBAAiB,CAAClnE,IAAK,WAAY3L,KAAM,CAAC8hF,EAAQA,WAEvDrlE,EAAKo2D,iBAAiB,CAAClnE,IAAK,kBAG9B8Q,EAAKo2D,iBAAiB,CAAClnE,IAAK,eAG3Bm2E,EAAS,CAEV,IAAIG,GAAW,EACZH,EAAQA,cACkB//E,IAAxB+/E,EAAQI,kBAAgDngF,IAAnB+/E,EAAQK,SAC9CF,EAAWH,EAAQI,YAAcJ,EAAQK,QAK7C3mF,KAAKO,UAAUsD,OAAO,YAAa4iF,GAGrC,IAAIG,EAAW5mF,KAAK4wB,SAAS,GAC7B,IAAIg2D,EAAU,CACZA,EAAWvlF,SAASC,cAAc,QAClCslF,EAASrmF,UAAUgB,IAAI,uBAEvB,MAAMslF,EAAWxlF,SAASC,cAAc,QACxCulF,EAAStmF,UAAUgB,IAAI,cAEvB,MAAMulF,EAAkBzlF,SAASC,cAAc,QAC/C,EAAA+f,GAAAA,QAAOylE,GAEP9mF,KAAKsE,OAAOsiF,EAAUC,EAAUC,IAGlC,EAAA94E,EAAA,GAAe44E,EAAU3lE,EAAKtI,cAE9B3Y,KAAKO,UAAUgB,IAAI,wBACnBvB,KAAK8F,UAAY,iFAAgFwgF,MAAAA,OAAO,EAAPA,EAASA,SAAU7J,GAAa6J,EAAQA,QAAS,GAAK,aAGtJA,GAAYtmF,KAAKomF,SAAYpmF,KAAKkG,QAAQ8U,OAAO0O,cAClDzgB,EAAA,yBAA0CjJ,KAAKkG,QAAQiD,OAAQnJ,KAAKkG,QAAQ6C,KAC5EE,EAAA,gBAAiCjJ,KAAKkG,QAAQiD,OAAQnJ,KAAKkG,QAAQ6C,IAAK,mBACxE/I,KAAKomF,SAAU,GAGdpmF,KAAKuuB,eACNvuB,KAAKuuB,kBAAehoB,IAK1BwpB,eAAeC,OAxIE,kBAwIem2D,ICtIhC,MAEMY,GAAa,KACjB,MAAMC,EAAS3lF,SAASC,cAAc,KAGtC,OAFA0lF,EAAOzmF,UAAUgB,IAAI,WACrB,IAAAm4B,OAAMstD,EAAQ,iBACPA,GAGHC,GAAgB,KAAM,IAAAr7E,MAAK,oBAE1B,IAAUs7E,IAAjB,SAAiBA,GAKF,EAAAC,QAAWvnF,I,MAItB,MAAM,SAACwnF,EAAQ,QAAElhF,GAAWtG,EACtBitB,EAAO,IAAIwtB,KAAoB,IAAfn0C,EAAQ2mB,MACxBroB,EAAiC,GAEvC,IAAI6iF,EAAyBC,EAA4BC,EAAoCC,EAE7F,MAAMC,IAAiBvhF,EAA4B8U,OAAO0sE,UACpDC,IAAc,WAAYzhF,KAAauhF,EAC7C,IAAIhC,EAEArrC,EAAoBqtC,OAAclhF,GAAY,SAAWsmB,GAC7D,GAAG86D,EAAW,CACZ,GAAGzhF,EAAQ0hF,MAAO,CAChB,MAAMC,EAAa3hF,EAAQ4hF,cAA+B,QAAhB,EAAA5hF,EAAQ6hF,gBAAQ,eAAED,aAEtDE,EAAgB3mF,SAASC,cAAc,QAC7C0mF,EAAcznF,UAAUgB,IAAI,cAC5BymF,EAAcliF,UAAY22E,GAAav2E,EAAQ0hF,MAAO,GAEtD,MAAMK,EAAe5mF,SAASC,cAAc,KAI5C,GAHA2mF,EAAa1nF,UAAUgB,IAAI,qBAAsB,aAEjDiD,EAAKsD,KAAKkgF,EAAeC,GACtBJ,EAAY,CACb,MAAM52B,EAAO5vD,SAASC,cAAc,QACpC2vD,EAAKnrD,UAAY,kBAAgC+hF,GAAhC,UACjBrjF,EAAKsD,KAAKmpD,IAQd,GAJG/qD,EAAQgiF,WAA0B,cAAbd,IAA6BlhF,EAAQ8U,OAAOmtE,WAClE3jF,EAAKwD,QAAQq/E,EAAaN,MAGZ,WAAbK,GAAyBlhF,EAAQ8U,OAAOotE,OAAQ,CACjD,MAAM7iF,EAAIlE,SAASC,cAAc,KACjCiE,EAAEhF,UAAUgB,IAAI,mBAAoB,aACpCiD,EAAKwD,QAAQzC,GAGU,aAAtBW,EAAQq+E,QAAQj7E,IACjBm8E,GAAe,EAEf+B,EAAmBv+E,EAAA,wBAAyC/C,GAE5DqhF,EAAmB,IAAItC,GACvBsC,EAAiB33E,KAAK43E,EAAkB,UAAU,GAClDD,EAAiBh+D,SACjB/kB,EAAKwD,QAAQu/E,SAEPE,GACRjjF,EAAKsD,KAAKw/E,EAAgBL,MAGzB7sC,GACD51C,EAAKsD,KAAKsyC,GAGZ,IAAI/qC,EAAQo4E,OAAclhF,GAAY,SAAYsmB,GAC/C86D,IACDt4E,IAAUnJ,EAAQgiF,YAAchiF,EAAQ8U,OAAOmtE,UAAY,cAAa,SAAY,IAAI9tC,KAAyB,IAApBn0C,EAAQgiF,cAAuB,KACvHhiF,EAAQ6hF,SAAW,gBAAe,SAAY,IAAI1tC,KAA6B,IAAxBn0C,EAAQ6hF,SAASl7D,SAAkB,KAGjG,MAAMq5D,EAAW7kF,SAASC,cAAc,QACxC4kF,EAAS3lF,UAAUgB,IAAI,OAAQ,SAE/B2kF,EAAS5hF,UAAUE,GAEnB,MAAM6jF,EAAQhnF,SAASC,cAAc,OACrC+mF,EAAM9nF,UAAUgB,IAAI,QAAS,SAC1B8N,IAAOg5E,EAAMh5E,MAAQA,GAExB,IAAIi5E,EAAa9jF,EAOjB,GANG6iF,IACDiB,EAAWA,EAAWroE,QAAQonE,IAAeN,MAE5CO,IACDgB,EAAWA,EAAWroE,QAAQqnE,IAAkBL,MAE/CM,EAAkB,CACnB,MAAMgB,EAAoBD,EAAWA,EAAWroE,QAAQsnE,IAAqB,IAAItC,GACjFsD,EAAkB34E,KAAK43E,EAAkB,UACzCe,EAAkBh/D,SAUpB,OARA++D,EAAaA,EAAW59E,KAAIF,GAAKA,aAAa2e,cAAgB3e,EAAEjK,UAAUmT,SAAS,UAAYlJ,EAAEjK,UAAUmT,SAAS,aAAelJ,EAAEpG,WAAU,GAAuBoG,IACnK4vC,IACDkuC,EAAWA,EAAWznF,OAAS,IAAK,SAAWgsB,IAEjDw7D,EAAM/jF,UAAUgkF,GAEhBpC,EAAS5hF,OAAO+jF,GAETnC,GAGI,EAAAsC,cAAgB,EAAE3kC,OAAAA,EAAQ4kC,gBAAAA,EAAiBviF,QAAAA,EAASwiF,WAAAA,EAAYn6D,aAAAA,EAAcE,cAAAA,MAQzF,MAAMk6D,GAAY9kC,EAAOtjD,UAAUmT,SAAS,aAAemwC,EAAOtjD,UAAUmT,SAAS,eAAiBmwC,EAAOtjD,UAAUmT,SAAS,SAC1Hk1E,EAAgB,IAAIzC,GAO1B,OANAyC,EAAc1iF,QAAUA,EACxB0iF,EAAc3oF,KAAO0oF,EAAW,SAAW,SAC3CC,EAAcr6D,aAAeA,EAC7Bq6D,EAAcn6D,cAAgBA,EAC9Bm6D,EAAch5E,OACd64E,EAAgBvkF,QAAQ0kF,GACjBD,GAGI,EAAAE,SAAW,EAAExrD,KAAAA,EAAMwmB,OAAAA,EAAQ4kC,gBAAAA,EAAiBviF,QAAAA,MAMvD,MAAM4iF,GAAeL,EAClBK,IACDL,EAAkB5kC,EAAOtyC,cAAc,oBAGzC,MAAMw3E,EAAkBD,EAAcL,EAAgBl3E,cAAc,UAAY,KAChF,IAAIrL,EAAQ8iF,aAMV,OALGD,GACDA,EAAgBvoF,cAGlBqjD,EAAOtjD,UAAUC,OAAO,YAK1B,MAAMyoF,EAAgB/iF,EAAQgjF,SAASC,iBAAmB9rD,EAAKjhB,gBAAgBgtE,UAAUljF,EAAQgjF,SAASC,kBAAoB9rD,EAAKl0B,OAEnI,IACIkgF,EADAC,EAAkBjsD,EAAKp0B,mBAAmBsgF,iBAAiBN,EAAe/iF,EAAQ8iF,cAM7D,iBAAtBM,EAAgBhgF,GAEjB+zB,EAAKp0B,mBAAmBugF,kBAAkBP,EAAe/iF,EAAQ8iF,cACjE3rD,EAAKzD,QAAQ6vD,WAAW3hF,KAAK,CAACmhF,cAAAA,EAAeS,SAAUxjF,EAAQ8iF,aAAcjgF,IAAK7C,EAAQ6C,MAE1FsgF,GAAoB,IAAAz9E,MAAK,YAEzBy9E,EAAoB,IAAI,KAAU,CAChClgF,OAAQmgF,EAAgB77E,QAAU67E,EAAgBxJ,UAClDhrE,QAAQ,EACR0gD,eAAe,EACf11D,WAAW,IACV6Y,QAGL,MAAMwV,EAAU82B,GAAUokC,OAAmB9iF,EAAW+iF,GACrDP,EACDA,EAAgBv7D,YAAYW,GAE5Bs6D,EAAgBnkF,OAAO6pB,GAGzB01B,EAAOtjD,UAAUgB,IAAI,aAhLzB,CAAiB2lF,KAAAA,GAAa,K,eCtBvB,SAASyC,GAAkBvoF,EAAwBwoF,EAAgCC,GAExF,MAAMrqE,EAAOpe,EAAUqe,wBACjBxB,EAAuB,WAAnB4rE,EAA8B7mF,KAAKmsC,KAAK3vB,EAAKqB,MAASrB,EAAKgvB,MAAQhvB,EAAKqB,MAAQ,EAAK,GAAK7d,KAAKmsC,KAAK3vB,EAAKqB,KAAO,GACpH1C,EAAqB,WAAjByrE,EAA4B5mF,KAAKykB,MAAMjI,EAAKoZ,IAAMpZ,EAAK3d,OAAS,GAAKmB,KAAKmsC,KAAK3vB,EAAKoZ,IAAM,GACpG,OAAOv3B,SAASyoF,iBAAiB7rE,EAAGE,GCPvB,SAAS4rE,GAAwBpxE,GAC9CA,EAAQrV,MAAMC,QAAU,OACnBoV,EAAQ+1B,WACb/1B,EAAQrV,MAAMC,QAAU,GDO1B,wBAAmComF,GEVpB,MAAMK,GAInBrqF,YAAoByB,EAAgC6oF,GAAhC,KAAA7oF,UAAAA,EAAgC,KAAA6oF,QAAAA,EAClDjqF,KAAKkqF,iBACLlqF,KAAKmqF,kBAQCD,iBACNlqF,KAAKoqF,gBAAkB,IAAIh7C,sBAAsBC,IAC/C,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAMg7C,EAAa/6C,EAAMg7C,mBACnBC,EAAej7C,EAAM92B,OAAOvU,cAC5BumF,EAAiBl7C,EAAMm7C,WAG1BJ,EAAWzpE,OAAS4pE,EAAe5xD,KACpC54B,KAAKiqF,SAAQ,EAAMM,GAIlBF,EAAWzpE,QAAU4pE,EAAe5xD,KACnCyxD,EAAWzpE,OAAS4pE,EAAe5pE,QACrC5gB,KAAKiqF,SAAQ,EAAOM,MAGvB,CAACG,UAAW,EAAGC,KAAM3qF,KAAKoB,YAGvB+oF,kBACNnqF,KAAK4qF,iBAAmB,IAAIx7C,sBAAsBC,IAChD,IAAIC,EAAQD,EAAQvlC,QAAOwlC,GAASA,EAAMg7C,mBAAmB1xD,IAAM,IAAGruB,MAAK,CAACC,EAAGxF,IAAMwF,EAAE8/E,mBAAmB1xD,IAAM5zB,EAAEslF,mBAAmB1xD,MAAK,GAC1I,IAAI0W,EAAO,OACX,IAAIluC,EAAYkuC,EAAMC,eAAiBD,EAAM92B,OAAS82B,EAAM92B,OAAOqkB,mBACnE78B,KAAKiqF,SAAQ,EAAM7oF,KAClB,CAACupF,KAAM3qF,KAAKoB,YAOTypF,YAAYzpF,EAAwBkK,GAC1C,MAAMw/E,EAAWzpF,SAASC,cAAc,OAExC,OADAwpF,EAASvqF,UAAUgB,IAAI,kBAAmB+J,GACnClK,EAAU4jB,YAAY8lE,GAQxBC,2BAA2BpyE,GAChC,MAAMqyE,EAAiBhrF,KAAK6qF,YAAYlyE,EAAS,wBACjD3Y,KAAKoqF,gBAAgB18C,QAAQs9C,GAE7BhrF,KAAK4qF,iBAAiBl9C,QAAQ/0B,GAGzBsyE,aACLjrF,KAAKoqF,gBAAgBa,aACrBjrF,KAAK4qF,iBAAiBK,aAGjBh7C,UAAUt3B,EAAsBqyE,GACrChrF,KAAK4qF,iBAAiB36C,UAAUt3B,GAChC3Y,KAAKoqF,gBAAgBn6C,UAAU+6C,I,0DCpDnC,MAAME,GAAiC,CACrCC,SAAU,GACVC,QAAS,EACTC,SAAU,mBAKL,MAAMC,GAAb,cAEU,KAAAC,iBAEJ,GAGI,KAAAC,iBAAkD,GAElD,KAAAC,oBAAoE,GAiErEC,iBAAiBL,EAAmB,mBACzC,MAAMhjF,EAAUrI,KAAKyrF,oBAAoBJ,GACzC,GAAGhjF,EACD,OAAOA,EAGT,MAAMsjF,EAAkB,iBAAmBN,EAC3C,OAAOrrF,KAAKyrF,oBAAoBJ,GAAYO,GAAA,MAAiBD,GAAY5pF,MAAM8pF,KACzE,EAAAC,GAAA,GAASD,KACXA,EAAO,KAGT,EAAAE,GAAA,GAAmBb,GAAiBW,GAGpCA,EAAKR,SAAWA,EAChBrrF,KAAKurF,iBAAiBF,GAAYQ,EAE3B,eAAqB,sCAAuC,CACjE1V,UAAW0V,EAAKR,SAChBW,aAAcH,EAAKT,UAClBrpF,MAAMkqF,IACPJ,EAAKT,QAAUa,EAAmBb,QAElC,MAAMc,EAAeL,EAAKV,SACpBA,EAAWc,EAAmBd,SACpC,IAAI,IAAI5lF,EAAI,EAAG1E,EAASsqF,EAAStqF,OAAQ0E,EAAI1E,IAAU0E,EAAG,CACxD,MAAM,QAAC4mF,EAAO,UAAEC,GAAajB,EAAS5lF,GACtC2mF,EAAaC,GAAWC,EAO1B,OAJAR,GAAA,MAAiB,CACf,CAACD,GAAaE,IAGTA,KACN,IACMA,OAKNQ,uBACL,MAAMvpD,EAA2B,CAC/B9iC,KAAK0rF,oBAWP,OARG,kCAA+B,mBAChC5oD,EAASh7B,KAAK9H,KAAK0rF,iBAAiB,kCAGlC1rF,KAAKo1D,QACPtyB,EAASh7B,KAAK9H,KAAKssF,mBAGd9oF,QAAQC,IAAIq/B,GAGdypD,cACDvsF,KAAKmH,QACPnH,KAAKmH,MAAQ,IAAI,UAAYZ,EAAW,IAG1C,IAAI,MAAM8kF,KAAYrrF,KAAKurF,iBAAkB,CAC3C,GAAGvrF,KAAKwrF,iBAAiBH,GACvB,SAGF,MACMF,EADOnrF,KAAKurF,iBAAiBF,GACbF,SAEtB,IAAI,MAAMgB,KAAWhB,EAAU,CAC7B,MAAMiB,EAAYjB,EAASgB,GAC3BnsF,KAAKmH,MAAMqlF,YAAYJ,EAAWD,GAGpCnsF,KAAKwrF,iBAAiBH,IAAY,GAI/BoB,aAAa9pD,GAMlB,IAAI+pD,EACJ,GANA1sF,KAAKusF,eAEL5pD,EAAIA,EAAEwd,cAAcx/C,QAAQ,KAAM,MAI7BuM,OAAQ,CACX,MAAMjI,EAAMjF,KAAKmH,MAAMwlF,OAAOhqD,GAC9B+pD,EAASriF,MAAMC,KAAKrF,GAAKR,QAAO,CAACC,EAAKC,IAAMD,EAAIe,OAAOd,IAAI,SAE3D+nF,EAAS1sF,KAAKo1D,OAAO3vD,OAAO6lF,GAAgBsB,eAAehsF,MAAM,EAvK7C,IAmLtB,OATA8rF,EAASriF,MAAMC,KAAK,IAAI5E,IAAIgnF,IASrBA,EAGFJ,kBACL,OAAGtsF,KAAK6sF,uBAA+B7sF,KAAK6sF,uBACrC7sF,KAAK6sF,uBAAyBxzD,EAAA,mBAA2Bt3B,MAAKu3B,GAC5Dt5B,KAAKo1D,OAAS/qD,MAAM61C,QAAQ5mB,EAAMwzD,aAAexzD,EAAMwzD,YAAc,KAIzEC,gBAAgBrqC,GACrBA,EAAQ,aAA2BA,GACnC1iD,KAAKssF,kBAAkBvqF,MAAKqzD,KAC1B,EAAApjD,EAAA,GAAiBojD,EAAQ1S,GACzB0S,EAAOptD,QAAQ06C,GACZ0S,EAAOv0D,OAlMU,KAmMlBu0D,EAAOv0D,OAnMW,IAsMpBw4B,EAAA,oBAA4B,cAAe+7B,GAC3CvqD,EAAA,sBAAwB,eAAgB63C,OApM7B,GAAAkqC,cAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAyMxO,MAAMI,GAAkB,IAAI1B,GAC5B,QAAmB,sBAAiC0B,IACpD,Y,0BCtNA,MAAMC,GAA0B,IAAIvnF,IAC7B,SAASwnF,GAAYxqC,EAAethD,EAAwB8C,GAAU,EAAOipF,GAAQ,GAK1F,MAAMC,EAAY/rF,SAASC,cAAc,QAGzC,IAAI+rF,EAiBJ,GAnBAD,EAAU7sF,UAAUgB,IAAI,eAGrB4rF,IAAU,KACXE,EAAM,oBAAkC3qC,IAExCA,EAAQ,aAA2BA,GACnC2qC,EAAM,kBAAgC3qC,IAUxC0qC,EAAUtnF,UAAYunF,EAEnBD,EAAUx8D,SAAS/vB,OAAS,EAAG,CAChC,MAAMg0B,EAAQu4D,EAAUvjE,kBACxBujE,EAAUtnF,UAAY,GACtBsnF,EAAU9oF,OAAOuwB,GAGnB,GAAGu4D,EAAUvjE,oBAAsB,KAAoB,CACrD,MAAMk3B,EAAQqsC,EAAUvjE,kBAElBxR,EAAM0oC,EAAM3oC,IAClB,IAAI60E,GAAWpjF,IAAIwO,GAAM,CACvB0oC,EAAM7gD,aAAa,UAAW,QAC9B,MAAMiO,EAAc9M,SAASC,cAAc,QAC3C6M,EAAY5N,UAAUgB,IAAI,qBAEvBsJ,EAAA,qCACDk2C,EAAMz9C,MAAMwqD,QAAU,IACtB3/C,EAAY7K,MAAMwqD,QAAU,KAG9B/M,EAAM1gD,iBAAiB,QAAQ,MAC7B,UAAQ,KACHwK,EAAA,qCACDk2C,EAAMz9C,MAAMwqD,QAAU,GACtB3/C,EAAY7K,MAAMwqD,QAAU,IAG9Bs/B,EAAU7sF,UAAUC,OAAO,SAE3BysF,GAAW1rF,IAAI8W,QAEhB,CAAC8C,MAAM,IAEViyE,EAAU9oF,OAAO6J,IAMlBjK,EAAS9C,EAAU8C,QAAQkpF,GACzBhsF,EAAU4jB,YAAYooE,GAGtB,SAASE,GAAoB30E,GAClC,OAAI,EAAAkK,GAAA,GAAgBlK,EAAS,eAEL,IAArBA,EAAQ40E,SAAuB50E,EAAQ60E,WACnB,SAApB70E,EAAQ63B,UAAuB73B,EAAQpY,UAAUmT,SAAS,UAAYiF,EAAQkR,oBAC/ElR,EAAUA,EAAQkR,mBAGblR,EAAQmtD,aAAa,QAAUntD,EAAQqV,WAPM,GAUvC,MAAMy/D,GAArB,cASU,KAAAC,eAAiB,EA2KzB,KAAAC,eAAkBrtF,KAChB,EAAAohB,EAAA,GAAYphB,GAEZ,MAAMoiD,EAAQ4qC,GAAoBhtF,EAAEkY,QAChCkqC,IAIJ,8BAAwCA,GAAO,GAC5C,GAAA9lC,qBACD,EAAA4vC,GAAA,OAlLJ58C,OACE5P,KAAKsP,QAAUjO,SAASuzC,eAAe,iBAEvC,MAAMs+B,EAA4B,CAChC,wBACA,yBACA,qBACA,wBACA,yBACA,gBAEA,cACA,cAEI0a,EAEF,GAEExjF,EAAqC,IAAIgH,IAAI,CACjD,CACE,eACA,MAIJ,IAAI,MAAMsxC,KAAS,YAAc,CAC/B,MACMn9C,EAAI,GADM,YAAam9C,GAEvBmrC,EAAW3a,GAAY3tE,EAAE,GAAK,GACpC,IAAIsoF,EAAU,SAEd,IAAIv0E,EAAIlP,EAAOsH,IAAIm8E,GACfv0E,IACFA,EAAI,GACJlP,EAAOnF,IAAI4oF,EAAUv0E,IAGvBA,GAAG/T,EAAE3E,MAAM,IAAM,GAAK8hD,EAOxBt4C,EAAO4F,OAAOkjE,EAAWrrE,OAGzBuC,EAAOrF,SAAQ,CAAC2nF,EAAQmB,KACtB,MAAM58D,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,kBAElB,MAAMusF,EAAWzsF,SAASC,cAAc,OACxCwsF,EAASvtF,UAAUgB,IAAI,kBACvBusF,EAASxpF,QAAO,IAAAsH,MAAKiiF,IAErB,MAAME,EAAW1sF,SAASC,cAAc,OACxCysF,EAASxtF,UAAUgB,IAAI,gBAEvB0vB,EAAI3sB,OAAOwpF,EAAUC,GAErBrB,EAAO3nF,SAAQipF,IAsBbd,IAjBY,SAAoBc,GAiBoCD,GAAU,MAOhFH,EAAKC,GAAY58D,KAKnB,MAAMg9D,EAAOjuF,KAAKiuF,KAAOjuF,KAAKsP,QAAQ8lC,uBAChC84C,EAAcluF,KAAKijC,OAAS,IAAI,KAAWjjC,KAAKsP,QAAS,SAIzDyY,GAAY,QAAa/nB,KAAKsP,SAAS,GAE7C9L,QAAQC,IAAI,EACV,EAAApB,GAAA,GAAM,KACN,qBAAkCN,MAAKqzD,IACrC,MAAM+4B,IAAc/4B,EAAOv0D,OACrButF,EAAWD,EAAY,EAAI,EACjCnuF,KAAKiuF,KAAKr9D,SAAS,GAAGrwB,UAAUsD,OAAO,QAASsqF,GAChDnuF,KAAKiuF,KAAKr9D,SAASw9D,GAAU7tF,UAAUgB,IAAI,UAC3C,MAAMsuC,EAAIw+C,GAAkBC,YAAYL,EAAMC,OAAa3nF,EAAW6nF,GAGtE,OAFApuF,KAAKuuF,kBAAoB1+C,EAAE0+C,kBAC3BvuF,KAAKwuF,cAAgB3+C,EAAE/jC,UAChBspD,OAERrzD,MAAK,EAAEuH,EAAG8rD,MACXrtC,EAAUvnB,SAEVR,KAAKyuF,eAAiBb,EAAK,gBAAgBr8E,cAAc,iBACzD,IAAI,MAAMmxC,KAAS0S,EACjB83B,GAAYxqC,EAAO1iD,KAAKyuF,gBAG1BzuF,KAAKyuF,eAAexqF,cAAc1D,UAAUsD,OAAO,QAAS7D,KAAKyuF,eAAe1iF,mBAEhFmnE,EAAWlrE,QAAQ,gBACnBkrE,EAAWxoE,KAAImjF,IACb,MAAM58D,EAAM28D,EAAKC,GAQjB,OANI58D,GACFnjB,QAAQC,MAAM,sBAAuB8/E,GAGvCK,EAAY9sF,UAAUkD,OAAO2sB,GAC7BjxB,KAAKuuF,kBAAkBxD,2BAA2B95D,GAC3CA,QAIXjxB,KAAKsP,QAAQjP,iBAAiB,QAASL,KAAK2tF,gBAC5C3tF,KAAK4P,KAAO,KAEZ/E,EAAA,yBAA2B,gBAAiB63C,IAC1C,MAAM9xB,EAAWvmB,MAAMC,KAAKtK,KAAKyuF,eAAe79D,UAChD,IAAI,IAAIrrB,EAAI,EAAG1E,EAAS+vB,EAAS/vB,OAAQ0E,EAAI1E,IAAU0E,EAAG,CACxD,MAAMkM,EAAKmf,EAASrrB,GAEpB,GAAGm9C,IADY,aAA2B4qC,GAAoB77E,IACzC,CACnB,GAAS,IAANlM,EACD,OAGFkM,EAAGjR,UAIP0sF,GAAYxqC,EAAO1iD,KAAKyuF,gBAAgB,GACxCzuF,KAAKyuF,eAAexqF,cAAc1D,UAAUC,OAAO,QACnDR,KAAKiuF,KAAKr9D,SAAS,GAAGrwB,UAAUC,OAAO,QAEnCR,KAAK0tF,gBACP1tF,KAAKwuF,cAAc,MAIvB,oBAAmC,SAAS,KAC1CxuF,KAAK0tF,eAAiB1tF,KAAKijC,OAAO+K,aAkBtCx7B,Y,eC3RF,MAEM3Q,GAAS,IAEA,MAAM6sF,GAKnB/uF,YAAoBgZ,EAA8BuY,EAAuBtkB,EAAwBkiB,GAAS,GAAtF,KAAAnW,QAAAA,EAA8B,KAAAuY,MAAAA,EAAuB,KAAAtkB,WAAAA,EAHjE,KAAA+hF,cAA0CnrF,QAAQ2E,UAClD,KAAAkG,QAAkB,EAyBlB,KAAAo4B,SAAW,KACdzmC,KAAKqO,QACNE,aAAavO,KAAKqO,SAElBrO,KAAK2uF,eAAgB,UAIvB3uF,KAAKqO,QAAUlB,OAAOC,YAAW,KAC/BpN,KAAKqO,QAAU,EACfrO,KAAK2uF,cAAcxmF,YAElB,MA8EE,KAAAymF,oBAAuB39D,GACrBjxB,KAAK2uF,cAAc5sF,MAAK,KAAW,O,EAAA,K,OAAA,E,EAAA,YAGxC,GAAG/B,KAAKyuB,cAAcogE,YAAYC,UAAU79D,GAC1C,OAGF,MAAMha,EAAQga,EAAI1f,cAAc,SAC1Bsd,EAAMoC,EAAI1f,cAAc,OAE3Bsd,IACDA,GAAOA,EAAItuB,UAAUC,OAAO,cAEtB,aAGLR,KAAKyuB,cAAcogE,YAAYC,UAAU79D,IAIzCha,IACDA,EAAMzW,SACNyW,EAAMmB,IAAM,GACZnB,EAAMzV,OACa+9C,EAAA,gBAAmCtoC,GAC3ClS,SAAQ6C,IACjB23C,EAAA,iBAAoC33C,GAAM,GAAM,Q,YA1BZ,K,iRAjH1C5H,KAAKyuB,cAAgB,IAAI,UAAqBloB,GAAW,CAACiS,EAAQyK,KAC7DA,EACDjjB,KAAK+uF,kBAAkBv2E,GAEvBxY,KAAK4uF,oBAAoBp2E,MAa1BsW,GACD9uB,KAAK8uB,SAmBFA,SACL9uB,KAAK4M,WAAWxL,UAAUf,iBAAiB,SAAUL,KAAKymC,UAGrD4Y,SACLr/C,KAAK6L,QACL7L,KAAK4M,WAAWxL,UAAUwN,oBAAoB,SAAU5O,KAAKymC,UAGxD56B,QACL7L,KAAKyuB,cAAc5iB,QAGbkjF,kBAAkB99D,GACVA,EAAI1f,cAAc,UA0DhCvR,KAAKyuB,cAAc3mB,KAAK,CAACmpB,IAAAA,EAAKzvB,KAnDjB,KACX,MAAMuW,EAAQkZ,EAAIjI,QAAQjR,MACpBF,EAAMC,EAAA,SAAsBC,GA4ClC,OA1CgB/X,KAAK2uF,cAAc5sF,MAAK,KACtC,MASMsG,EATM+0C,GAAU,CACpBvlC,IAAAA,EACAzW,UAAW6vB,EACXxC,cAAe,KAEfyC,MAAOlxB,KAAKkxB,MACZqsB,QAAQ,IAGU97C,YAyBpB,OAxBA4G,EAAQid,SAAQ,KACd,MAAMrO,EAAQga,EAAI1f,cAAc,SAEhC0f,EAAI3tB,MAAMwqD,QAAU,GACpB,MAAMj/B,EAAMoC,EAAI1f,cAAc,OAC9Bsd,GAAOA,EAAItuB,UAAUgB,IAAI,QAEtB0V,IAAUA,EAAMhT,eACjBmJ,YAAW,KACT6J,EAAMmB,IAAM,GACZnB,EAAMzV,OACa+9C,EAAA,gBAAmCtoC,GAC3ClS,SAAQ6C,IACjB23C,EAAA,iBAAoC33C,GAAM,GAAM,QAEjD,GAID5H,KAAKyuB,cAAcogE,YAAYC,UAAU79D,IAC3CjxB,KAAK4uF,oBAAoB39D,MAItB5oB,QAgDN9G,IAAIsW,EAAiBkpB,EAAW/gC,KAAK2Y,S,MAC1C,IAAIq2E,EAAWn3E,EAAIwD,EACf4zE,EAAYp3E,EAAIoE,EACjBgzE,EAAYptF,KACbmtF,GAAWntF,GAASotF,EACpBA,EAAYptF,IAGd,MAAMqtF,EAAelsF,KAAKC,IAlKPrB,IADT,IAmK2CotF,GAC/C9tF,GAAO,EAAAiuF,GAAA,GAAeH,EAAUC,EAAWC,EAAcrtF,IAezDovB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,MAAO,sBACzB0vB,EAAI3tB,MAAM1B,MAAQV,EAAKU,MAAQ,KAC/BqvB,EAAI3tB,MAAMwqD,QAAU,IAEpB78B,EAAIjI,QAAQjR,MAAQ,GAAKF,EAAIhH,GAE7BkwB,EAASz8B,OAAO2sB,GAGhBjxB,KAAKyuB,cAAcif,QAAQzc,GAI3B,MAAM6tB,EAAWhnC,EAAA,WAAwBD,GAAK,GAG9C,IAAIgX,EADoBiwB,IAGtBjwB,EAAM,IAAIwe,MACVxe,EAAItuB,UAAUgB,IAAI,gBAEdu9C,EAAS5mC,aAAaG,KACxBymC,EAASz2C,QAAQtG,MAAK,KACpB8sB,EAAIzW,IAAM0mC,EAAS5mC,aAAaG,QAKtC,MAAM+qC,EAAc,KACfv0B,IACDoC,EAAI3sB,OAAOuqB,GACXoC,EAAI3tB,MAAMwqD,QAAU,MAID,QAAtB,EAAAhP,MAAAA,OAAQ,EAARA,EAAU5mC,oBAAY,eAAEG,MAAM,EAAAunC,GAAA,IAAmB/wB,EAAKiwB,EAAS5mC,aAAaG,IAAK+qC,GAAeA,KC1NtF,MAAMgsC,GAGnBx/E,OACE5P,KAAKsP,QAAUjO,SAASuzC,eAAe,gBACvC,MAAMy6C,EAAgBrvF,KAAKsP,QAAQua,kBACnCwlE,EAAchvF,iBAAiB,QAASguF,GAAkBt8B,cAE1D,MAAM9uB,EAAS,IAAI,KAAWjjC,KAAKsP,QAAS,QACtCggF,EAAU,IAAIZ,GAAYW,EAAeE,GAAuBtsD,GAChElb,GAAY,QAAa/nB,KAAKsP,SAAS,GAE7C,eAAqB,wBAAyB,CAAC8jD,KAAM,MAAMrxD,MAAMwL,IAGlD,uBAAVA,EAAIjE,GACLiE,EAAIiiF,KAAKzqF,SAAQ,CAAC8S,EAAK1R,KACrBoH,EAAIiiF,KAAKrpF,GAAO0R,EAAMC,EAAA,UAAuBD,GAE7Cy3E,EAAQ/tF,IAAIsW,MAIhBkQ,EAAUvnB,YAGZ,0BAAyC8uF,EAAQ7gE,cAAe6gE,EAAQV,qBAExE5uF,KAAK4P,KAAO,KAGd4C,YCpBK,MAAMi9E,GAIX9vF,YAAoB+vF,EAA6Cx+D,GAA7C,KAAAw+D,qBAAAA,EAA6C,KAAAx+D,MAAAA,EAFzD,KAAAy+D,aAAoC,IAAIjqF,IA8CxC,KAAAkqF,wBAA0B,CAAC3+D,EAAkBhO,KAEnCs8B,EAAA,gBAAmCtuB,GAC3ClsB,SAAQ6hB,IACV3D,EAGFs8B,EAAA,iBAAoC34B,GAAQ,GAF5C24B,EAAA,iBAAoC34B,GAAQ,GAAM,OAOhD,KAAAmoE,kBAAqB99D,IAC3B,MAAMlZ,EAAQkZ,EAAIjI,QAAQjR,MACpBF,EAAMC,EAAA,SAAsBC,GAE5B7W,EAAO6pB,EAAA,2BAIP1iB,EAAU2oB,GAAY,CAC1BnZ,IAAAA,EACAoZ,IAAKA,EACLrvB,MAAOV,EACPW,OAAQX,EACRutB,cAAe,KACfyC,MAAOlxB,KAAKkxB,MACZuxB,WAAW,EACX//C,MAAM,EACNhB,MAAM,IAYR,OATA2G,EAAQtG,MAAK,KAEX/B,KAAK4vF,wBAAwB3+D,EAAKjxB,KAAKyuB,cAAcogE,YAAYC,UAAU79D,OAOtE5oB,GAGF,KAAAumF,oBAAuB39D,IAC5B,MAAMlZ,EAAQkZ,EAAIjI,QAAQjR,MACpBF,EAAMC,EAAA,SAAsBC,GAIlC/X,KAAK4vF,wBAAwB3+D,GAAK,GAElCA,EAAInrB,UAAY,GAChB9F,KAAK6vF,cAAch4E,EAAKoZ,IAhGxBjxB,KAAKyuB,cAAgB,IAAI,UAAoBloB,GAAW,CAACiS,EAAQyK,KAC3DA,GACFjjB,KAAK4uF,oBAAoBp2E,MAKxB3M,QACL7L,KAAKyuB,cAAc5iB,QAGdgkF,cAAch4E,EAAiBoZ,EAAsB1C,GAoB1D,OAnBI0C,KACFA,EAAM5vB,SAASC,cAAc,QACzBf,UAAUgB,IAAI,YAAa,iBAE5BsW,EAAI2sC,UACLxkD,KAAK8vF,mBAAmB7+D,IAK5BD,GAAY,CACVnZ,IAAAA,EACAoZ,IAAAA,EACAxC,cAAezuB,KAAK0vF,qBACpBx+D,MAAOlxB,KAAKkxB,MACZuxB,UAAW5qC,EAAI2sC,SACfj2B,aAAAA,IAGK0C,EAGF6+D,mBAAmB7+D,GACxBjxB,KAAK2vF,aAAapuF,IAAI0vB,GAEtBjxB,KAAKyuB,cAAcif,QAAQ,CACzBzc,IAAAA,EACAzvB,KAAMxB,KAAK+uF,qBA6DF,MAAMgB,GAArB,cAIU,KAAA9f,YAGH,GAGG,KAAA+f,eAA+B,GAM/B,KAAAvhC,SAAU,EAEV,KAAAwhC,kBAAgE,GAMxEC,aAAaC,EAA0BC,EAAwB,GAAI/nF,EAAgCnE,GAGjG,MAAM6pF,EAAW1sF,SAASC,cAAc,OACxCysF,EAASxtF,UAAUgB,IAAI,iBAAkB,kBAEzC,MAAMusF,EAAWzsF,SAASC,cAAc,OAmCxC,OAlCAwsF,EAASvtF,UAAUgB,IAAI,kBAEpB6uF,IACDtC,EAAShoF,UAAYsqF,GAGvBD,EAAY7rF,OAAOwpF,EAAUC,GAE7B/tF,KAAKuuF,kBAAkBxD,2BAA2BoF,GAElDnwF,KAAKiwF,kBAAkBnoF,KAAK,CAAC6Q,QAASw3E,EAAajsF,QAAAA,IAEnDmE,EAAQtG,MAAK+iD,IACXA,EAAU//C,SAAQ8S,IAEhBk2E,EAASzpF,OAAOtE,KAAKqwF,qBAAqBR,cAAch4E,OAGvD7X,KAAKiwF,kBAAkBpvF,SACxBb,KAAKiwF,kBAAkBlrF,SAAQ,EAAE4T,QAAAA,EAASzU,QAAAA,MACrCA,EACElE,KAAKswF,UAAUrsF,eAChBjE,KAAK6tE,YAAY3pE,QAAQyU,GACzB3Y,KAAK6tE,YAAY3pE,QAAQlE,KAAKswF,YAE9BtwF,KAAK6tE,YAAY3pE,QAAQyU,GAEtB3Y,KAAK6tE,YAAYvpE,OAAOqU,MAGjC3Y,KAAKiwF,kBAAkBpvF,OAAS,MAI7B,CAACitF,SAAAA,GAGJ3d,iBAAiBlrE,EAA4Bf,GAAU,G,qCAC3D,MAAMisF,EAAc9uF,SAASC,cAAc,OAC3C6uF,EAAY5vF,UAAUgB,IAAI,oBAC1B4uF,EAAYnnE,QAAQnY,GAAK,GAAK5L,EAAI4L,GAClCs/E,EAAYnnE,QAAQ2hD,YAAc,GAAK1lE,EAAI0lE,YAE3C,MAAMpsD,EAASld,SAASC,cAAc,UACtCid,EAAOhe,UAAUgB,IAAI,WAAY,4BAEjCvB,KAAKiwE,YAAYhrE,EAAI4L,IAAM,CACzB0/E,SAAUJ,EACVj/E,IAAKqN,GAGJra,EACDlE,KAAKiuF,KAAK9pF,aAAaoa,EAAQve,KAAKiuF,KAAKpkE,kBAAkBxlB,aAE3DrE,KAAKiuF,KAAK3pF,OAAOia,GAKnB,MAAMlW,EAAUs7C,GAAA,gBAAiC1+C,GACjDjF,KAAKkwF,aAAaC,EAAa,kBAAgClrF,EAAIoK,OAAQhH,EAAQtG,MAAK8iD,GAAcA,EAAWC,YAA4B5gD,SACpHmE,EAIzBi8C,GAAoB,CAClBr/C,IAAAA,EACA7D,UAAWmd,EACX2S,MAAOq+D,GACP9gE,cAAe4/D,GAAkB5/D,cACjC7sB,MAAO,GACPC,OAAQ,GACRF,UAAU,K,+RAIdiO,OACE5P,KAAKsP,QAAUjO,SAASuzC,eAAe,oBAGvC50C,KAAKswF,UAAYjvF,SAASC,cAAc,OACxCtB,KAAKswF,UAAU/vF,UAAUgB,IAAI,mBAAoB,mBAEjD,IAAIivF,EAAcxwF,KAAKsP,QAAQ8lC,uBAC/Bp1C,KAAKiuF,KAAOuC,EAAY3mE,kBAExB,IAAI4mE,EAAa,IAAI,KAAYD,GAEjCxwF,KAAK6tE,YAAcxsE,SAASC,cAAc,OAC1CtB,KAAK6tE,YAAYttE,UAAUgB,IAAI,uBAC/BvB,KAAKsP,QAAQhL,OAAOtE,KAAK6tE,aAmBzBhjE,EAAA,yBAA2B,sBAAuBvK,IAChD,MAAM2E,EAA6B3E,GAE/BN,KAAKiwE,YAAYhrE,EAAI4L,KAAO7Q,KAAKyuD,SACnCzuD,KAAKmwE,iBAAiBlrE,GAAK,MAI/B4F,EAAA,yBAA2B,oBAAqBvK,IAC9C,MAAM2E,EAA6B3E,EAEnC,GAAGN,KAAKiwE,YAAYhrE,EAAI4L,KAAO7Q,KAAKyuD,QAAS,CAC3C,MAAM3lC,EAAW9oB,KAAKiwE,YAAYhrE,EAAI4L,IACtCiY,EAASynE,SAAS/vF,SAClBsoB,EAAS5X,IAAI1Q,gBACNR,KAAKiwE,YAAYhrE,EAAI4L,QAIhC7Q,KAAK6tE,YAAYxtE,iBAAiB,SAAUC,IAC1C,MAAMkY,EAASlY,EAAEkY,OACjB,IAAG,EAAAqK,GAAA,GAAgBrK,EAAQ,kBAA3B,CACE,MAAM/G,GAAK,EAAAkvB,GAAA,GAAgBnoB,EAAQ,WACnC,IAAIg1D,GAAc,CAAC38D,GAAIY,EAAGuX,QAAQnY,GAAI85D,YAAal5D,EAAGuX,QAAQ2hD,cAAcjoD,YAI9E2rE,GAAkBt8B,aAAazxD,MAGjC,MAAMowF,EAAY,CAACphE,GAAS,KAC1BzkB,EAAA,sBAAwB,oBAAqBykB,IAG/CtvB,KAAKijC,OAAS,IAAI,KAAWjjC,KAAKsP,QAAS,YAC3CtP,KAAKijC,OAAOn2B,oBAAoB9M,KAAK6tE,aACrC7tE,KAAKijC,OAAOuP,mBAAqB,KAC/Bk+C,KAGF,oBAAmC,UAAU,KAC3CA,GAAU,MAGZ,oBAAmC,UAAU,KAC3CA,OAGF1wF,KAAKuuF,kBAAoBF,GAAkBC,YAAYtuF,KAAKiuF,KAAMjuF,KAAKijC,OAAQwtD,GAAYlC,kBAE3F,MAAMxmE,GAAY,QAAa/nB,KAAKsP,SAAS,GAE7C9L,QAAQC,IAAI,CACVkgD,GAAA,sBAAuC5hD,MAAKwuF,IAC1CvwF,KAAKgwF,eAAiBO,EAASA,SAAS3vF,MAAM,EAAG,IAIjDZ,KAAKiwE,YAAoB,OAAI,CAC3BsgB,SAAUvwF,KAAKswF,UACfp/E,IAAKlR,KAAKiuF,KAAKpkE,mBAGjB9B,EAAUvnB,SACV,MAAM,SAACstF,GAAY9tF,KAAKkwF,aAAalwF,KAAKswF,UAAW,GAAI9sF,QAAQ2E,QAAQnI,KAAKgwF,iBAAiB,GAC/FlC,EAASxpF,QAAO,IAAAsH,MAAK,uBAGvB+3C,GAAA,mBAAoC5hD,MAAMwL,IACxCwa,EAAUvnB,SAEV,IAAI,IAAIyE,KAAQsI,EAAgD8iE,KAC9DrwE,KAAKmwE,iBAAiBlrE,QAGzBqgB,SAAQ,KACTtlB,KAAKyuD,SAAU,EACfiiC,OAGF1wF,KAAKqwF,qBAAuB,IAAIZ,GAAqBpB,GAAkB5/D,cAAe8gE,IAEtF,0BAAyCvvF,KAAKqwF,qBAAqB5hE,cAAezuB,KAAKqwF,qBAAqBzB,qBAU5G5uF,KAAK4P,KAAO,KAGd+gF,kBAAkB94E,G,MAGhB,GAFA8rC,GAAA,oBAAqC9rC,KAEnB,QAAd,EAAA7X,KAAKswF,iBAAS,eAAErsF,eAClB,OAGF,IAAIgtB,EAAMjxB,KAAKswF,UAAU/+E,cAAc,iBAAiBsG,EAAIhH,QACxDogB,IACFA,EAAMjxB,KAAKqwF,qBAAqBR,cAAch4E,IAGhD,MAAMlQ,EAAQ3H,KAAKswF,UAAU/+E,cAAc,mBAC3C5J,EAAMzD,QAAQ+sB,GAEXtpB,EAAMoE,kBAAoB,IAC1B1B,MAAMC,KAAK3C,EAAMipB,UAA4BhwB,MAAM,IAAImE,SAAQ0M,GAAMA,EAAGjR,WAI7EgS,YCkBF,MAAMo+E,GAAuB,IAvXtB,MAAP,cACU,KAAAC,cAAgE,GAChE,KAAAC,QAKJ,GAEGC,YAAYC,GACjB,MAAiB,aAAVA,EAAI1nF,EAAmB,CAC5BA,EAAG,gBACHgM,IAAK07E,EAAI17E,IACTG,KAAMu7E,EAAIv7E,KACVw7E,gBAAiBD,EAAIC,iBACnB,CACF3nF,EAAG,sBAIA4nF,iBAAiB/nF,EAAgBgoF,EAAc1kF,EAAQ,GAAI+nB,EAAS,GAAIw8D,GAC7E,OAAO,eAA0B,+BAAgC,CAC/DjyB,IAAK9pD,EAAA,eAA6Bk8E,GAClCxrD,KAAMvpB,EAAA,mBAAiCjT,GACvCsD,MAAAA,EACAuH,UAAWg9E,EAAMhxF,KAAK+wF,YAAYC,QAAOzqF,EACzCiuB,OAAAA,GACC,CAAmB48D,UAAW,EAAGC,YAAY,IAAOtvF,MAAKuvF,IAC1D,MAAMC,EAAUD,EAAWE,SAoB3B,OAdAF,EAAW/uD,QAAQx9B,SAAQwD,IACT,yBAAbA,EAAOe,IACLf,EAAOlH,WACRkH,EAAOlH,SAAWyW,EAAA,UAAuBvP,EAAOlH,WAG/CkH,EAAOlC,QACRkC,EAAOlC,MAAQ6V,EAAA,YAA2B3T,EAAOlC,SAIrDrG,KAAK6wF,cAAc7wF,KAAKyxF,YAAYF,EAAShpF,EAAOsI,KAAOtI,KAGtD+oF,KAIJG,YAAYF,EAA4DG,GAC7E,OAAOH,EAAU,IAAMG,EAGjBC,eAAeR,GACrBl8E,EAAA,cAA4B,eAAelT,MAAM6vF,IAC/C,MAAMC,EAAYV,EAAMloE,WAClB9hB,EAAQyqF,EAAS94E,WAAUg5E,GAAWA,EAAQjhF,KAAOghF,IAC3D,IAAIC,EAEFA,GADY,IAAX3qF,EACSyqF,EAASzqF,GAET,CACR0J,GAAIghF,EACJE,OAAQ,KAIVD,EAAQC,QACV,EAAA3qC,GAAA,GAA2BwqC,EAAUE,EAAS,UAE9Cz4D,EAAA,6BAAqC,oBAMlC24D,WAAWrkC,EAAoBwjC,EAAcc,GAGlD,OAFAjyF,KAAK8wF,QAAQK,GAAS,CAAChoF,OAAQwkD,EAAYvT,KAAMC,KAAKC,OACtDzvC,EAAA,sBAAwB,gBAAiB,CAAC1B,OAAQgoF,EAAMloE,aACjDhgB,EAAA,WAA4BkoF,OAAO5qF,EAAW0rF,GA8G1CC,kBAAkBf,G,qCAC7B,MAAMpyB,EAAM9pD,EAAA,UAAwBk8E,GACpC,IAAIpyB,IAAQA,EAAI/jD,OAAO+jD,MAAQA,EAAIozB,uBACjC,OAGF,MAAMC,EAAWpyF,KAAK8wF,QAAQK,GAC9B,OAAGiB,WACMpyF,KAAK8wF,QAAQK,GAChB92C,KAAKC,MAAQ83C,EAASh4C,KAAQ,MACzBg4C,EAASjpF,YAHpB,G,+RAQKkpF,kBAAkBlpF,EAAgBwD,EAAkBwkF,EAAc1kF,GACvE5B,EAAA,sBAAwB,gBAAiB,CAAC1B,OAAAA,EAAQwD,SAAAA,IAClDm0D,GAAA,WAA0B33D,EAAQwD,EAAU,IAAMsI,EAAA,UAAwBk8E,GAAO/1D,SAAW,IAAM3uB,GAG7F6lF,oBAAoBnpF,EAAgBJ,EAAawV,GACtD,OAAO,eAA0B,gCAAiC,CAChEonB,KAAMvpB,EAAA,mBAAiCjT,GACvC66C,OAAQh7C,EAAA,qBAAyCD,GACjD06C,KAAMllC,EAAOklC,MACZ,CAAmB2tC,UAAW,EAAGC,YAAY,IAAOtvF,MAAMwwF,IACtB,iBAA3BA,EAAersF,SAAwBqsF,EAAersF,QAAQrF,QACtEi5B,GAAM,iBAA+By4D,EAAersF,QAAS,CAACssF,SAAS,EAAMC,cAAc,QAyB1FC,iBAAiBvpF,EAAgBgoF,EAAcwB,EAA2B/yF,EAY5E,I,MACH,MAAMgzF,EAAe5yF,KAAK6wF,cAAc8B,GACxC,IAAIC,EACF,OAGF5yF,KAAK2xF,eAAeR,GACpB,MAAMh3B,EAAWw4B,EAAkB3yC,MAAM,KACnC6yC,EAAU14B,EAASpyD,QACnB+qF,EAAW34B,EAAStxC,KAAK,KAQ/B,GAPAjpB,EAAQigF,SAAWsR,EACnBvxF,EAAQ2xF,QAAUsB,EAClBjzF,EAAQ8xF,SAAWoB,EAChBF,EAAaG,aAAaC,eAC3BpzF,EAAQqzF,YAAcL,EAAaG,aAAaC,cAGf,yBAAhCJ,EAAaG,aAAazpF,EAC3B1J,EAAQg8C,SAAWg3C,EAAaG,aAAan3C,SAC7C3yC,EAAA,WAA4BE,EAAQypF,EAAaG,aAAa7sF,QAAStG,OAClE,CACL,IACIszF,EADAr1D,EAAU,GAEd,MAAMs1D,EAAcP,EAAaG,aACjC,OAAOI,EAAY7pF,GACjB,IAAK,4BAGH,GAFAu0B,EAAUs1D,EAAYjtF,QAEA,yBAAnB0sF,EAAatpF,EAA8B,CAC5C,MAAM,SAACjI,EAAQ,MAAEgF,GAASusF,EAExBM,EADC7xF,EACYyW,EAAA,gBAA6BzW,GAE7B6a,EAAA,gBAA+B7V,GAIhD,MAGF,IAAK,2BACH6sF,EAAa,CACX5pF,EAAG,qBACH0K,UAAWhU,KAAK+wF,YAAYoC,EAAYnC,MAG1CpxF,EAAQwzF,SAAWD,EAAYnC,IAE/B,MAGF,IAAK,6BACHkC,EAAa,CACX5pF,EAAG,kBACH0K,UAAWhU,KAAK+wF,YAAYoC,EAAYnC,KACxC3hF,MAAO8jF,EAAY9jF,MACnB4E,QAASk/E,EAAYl/E,QACrBo/E,SAAUF,EAAYE,SACtBC,SAAUH,EAAYG,SACtBC,WAAYJ,EAAYI,YAG1B3zF,EAAQwzF,SAAWD,EAAYnC,IAE/B,MAGF,IAAK,+BACHkC,EAAa,CACX5pF,EAAG,oBACHkqF,aAAcL,EAAYK,aAC1BrpD,WAAYgpD,EAAYhpD,WACxBC,UAAW+oD,EAAY/oD,UACvBqpD,MAAON,EAAYM,OAOrBP,IACFA,EAAa,CACX5pF,EAAG,sBACHrJ,KAAM2yF,EAAa3yF,KACnBwc,UAAWm2E,EAAavjF,QACmC,QAAxD,EAAAujF,EAAiDtjF,eAAO,eAAE+I,MAC1Du6E,EAAiDv6E,IACpDnX,KAAM,EACNmkB,SAAU,CAACquE,QAAS,GAAIrkE,MAAO,KAInCpmB,EAAA,YAA6BE,EAAQ+pF,EAAYtzF,MA4BvD,QAAmB,2BAAsCgxF,IACzD,YChYA,MAAM+C,GAAiB,cAER,MAAMC,WAAmB9kF,EAAxC,c,oBAIU,KAAA+kF,WAAa,GACb,KAAAxsF,WAAY,EA2BZ,KAAAysF,YAAexzF,IACrB,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,OACzC,IAAIA,EAAQ,OAEZ,MAAMm1D,EAASn1D,EAAOwQ,QAAQjR,MAC3B,sCAAgD41D,GAC9C5iD,EAAA,aACD,qBAGFjd,QAAQwM,KAAK,oBAAqBqzD,IA9B5B/9D,OACR5P,KAAKoB,UAAUyP,GAAK,wBAEpB7Q,KAAK+5E,YAAc,IAAI7rE,EAAY,mBAAoBxN,IACrDV,KAAKoH,QACLpH,KAAK2sF,OAAOjsF,MAGdV,KAAKqP,MAAMme,YAAYxtB,KAAK+5E,YAAY34E,WAExCpB,KAAK+zF,QAAU1yF,SAASC,cAAc,OACtCtB,KAAK+zF,QAAQxzF,UAAUgB,IAAI,iBAC3B,QAAiBvB,KAAK+zF,QAAS/zF,KAAK8zF,YAAa,CAACtkF,eAAgBxP,KAAKwP,iBAEvExP,KAAK4M,WAAWtI,OAAOtE,KAAK+zF,SAE5B/zF,KAAKsvF,QAAU,IAAIZ,GAAY1uF,KAAK+zF,QAASJ,GAAgB3zF,KAAK4M,YAkB7D4F,UACLxS,KAAK4M,WAAWK,iBAAmB,OAG9B6C,sBAKL,OAJA9P,KAAKoH,QACLpH,KAAK+zF,QAAQjuF,UAAY,GACzBy5C,EAAA,uBAAqCh5C,EAAWotF,IAChD3zF,KAAK+5E,YAAYv5E,SACVX,MAAMiQ,sBAGP1I,QACNpH,KAAKuM,cAAgB,KACrBvM,KAAK6zF,WAAa,GAClB7zF,KAAKqH,WAAY,EACjBrH,KAAKsvF,QAAQzjF,QAGR8D,OACL,MAAMu7B,EAAMrrC,MAAM8P,OAQlB,OAPA,kBAA8B,GAAM5N,MAAK,KACvC/B,KAAK2sF,OAAO,IAAI,GAEhB3sF,KAAK4M,WAAWK,iBAAmB,KACjCjN,KAAK2sF,OAAO3sF,KAAK+5E,YAAYr5E,OAAO,OAGjCwqC,EAGIyhD,OAAOlgF,EAAeunF,GAAY,G,qCAC7C,IAAGh0F,KAAKuM,gBAAiBvM,KAAKqH,UAA9B,CAEIrH,KAAKi0F,eACPj0F,KAAKi0F,oBAAsBh/E,EAAA,kBAAgC,QAAQpE,GAAGoY,UAAS,IAGjF,IACEjpB,KAAKuM,cAAgB,oBAAsC,MAAcvM,KAAKi0F,aAAcxnF,EAAOzM,KAAK6zF,YACxG,MAAM,QAAEtxD,EAAO,YAAEyU,SAAsBh3C,KAAKuM,cAE5C,GAAGvM,KAAK+5E,YAAYr5E,QAAU+L,EAC5B,OAGFzM,KAAKuM,cAAgB,KACrBvM,KAAK6zF,WAAa78C,EACfg9C,IACDh0F,KAAK+zF,QAAQjuF,UAAY,IAGxBy8B,EAAQ1hC,OACT0hC,EAAQx9B,SAASwD,IACC,yBAAbA,EAAOe,GAAgCf,EAAOlH,UAC/CrB,KAAKsvF,QAAQ/tF,IAAIgH,EAAOlH,aAI5BrB,KAAKqH,WAAY,EAGnBrH,KAAK4M,WAAW65B,WAChB,MAAM54B,GAGN,MAFA7N,KAAKuM,cAAgB,KACrBuB,QAAQC,MAAM,sBAAuBF,GAC/BA,K,gSChHG,MAAMqmF,WAAuBplF,EAKhCc,OACR5P,KAAKoB,UAAUyP,GAAK,qBACpB7Q,KAAKoB,UAAUb,UAAUgB,IAAI,sBAE7BvB,KAAKyuB,cAAgB,IAAI,KAEzBzuB,KAAK+5E,YAAc,IAAI7rE,EAAY,iCAAkCxN,IACnEV,KAAK2sF,OAAOjsF,MAGdV,KAAKqP,MAAMme,YAAYxtB,KAAK+5E,YAAY34E,WAExCpB,KAAKm0F,QAAU9yF,SAASC,cAAc,OACtCtB,KAAKm0F,QAAQ5zF,UAAUgB,IAAI,gBAC3BvB,KAAK4M,WAAWtI,OAAOtE,KAAKm0F,UAE5B,QAAiBn0F,KAAKm0F,SAAU7zF,IAC9B,MAAMwiD,GAAU,EAAAjgC,GAAA,GAAgBviB,EAAEkY,OAAQ,uBAC1C,GAAGsqC,EAAS,CACV,MAAM/qC,EAAQ+qC,EAAQ95B,QAAQjR,MAE9B,YADA,sCAAgDA,GAIlD,MAAMS,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,eACzC,IAAIA,EAAQ,OAEZ,MAAM3H,EAAK2H,EAAOwQ,QAAQ67B,WACpB8lB,EAAcnyD,EAAOwQ,QAAQ2hD,YAE7BpsD,GAAS,EAAAsE,GAAA,GAAgBviB,EAAEkY,OAAQ,sBACtC+F,GACDje,EAAEme,iBACFne,EAAEwvD,cAAe,EAEjBvxC,EAAOre,aAAa,WAAY,QAEhCyjD,GAAA,gBAAiC,CAAC9yC,GAAAA,EAAI85D,YAAAA,IAAc5oE,MAAK6sB,IACvD+0B,GAAA,mBAAoC/0B,EAAK3pB,KAAKlD,MAAKg8B,IAC9CA,IACDxf,EAAOuS,YAAc,GACrBvS,EAAOja,QAAO,IAAAsH,MAAKgjB,EAAK3pB,IAAI+oE,eAAiB,uBAAyB,uBACtEzvD,EAAOhe,UAAUsD,OAAO,SAAU+qB,EAAK3pB,IAAI+oE,oBAE5C1oD,SAAQ,KAET/G,EAAOirB,gBAAgB,mBAI3Bma,GAAA,gBAAiC,CAAC9yC,GAAAA,EAAI85D,YAAAA,IAAc5oE,MAAK6sB,IACvD,IAAI4+C,GAAc5+C,EAAK3pB,KAAKyd,YAG/B,CAAClT,eAAgBxP,KAAKwP,iBAGpBM,sBAGL,OAFA9P,KAAKm0F,QAAQruF,UAAY,GACzBy5C,EAAA,uBAAqCh5C,EAAW,mBACzC1G,MAAMiQ,sBAGRskF,UAAUnvF,GAEf,MAAMgsB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,eAElB,MAAM2N,EAAS7N,SAASC,cAAc,OACtC4N,EAAO3O,UAAUgB,IAAI,sBAErB,MAAM6V,EAAU/V,SAASC,cAAc,OACvC8V,EAAQ7W,UAAUgB,IAAI,uBACtB6V,EAAQtR,UAAY,yCACc,kBAAgCb,EAAIoK,qBAGtE,MAAMglF,EAAWhzF,SAASC,cAAc,OACxC+yF,EAAS9zF,UAAUgB,IAAI,qBACvB8yF,EAAS/vF,QAAO,IAAAsH,MAAK,WAAY,CAAC3G,EAAIuB,SACtC4Q,EAAQ9S,OAAO+vF,GAEf,MAAM91E,EAASld,SAASC,cAAc,UACtCid,EAAOhe,UAAUgB,IAAI,cAAe,oBAAqB,sBACzDgd,EAAOja,QAAO,IAAAsH,MAAK3G,EAAI+oE,eAAiB,uBAAyB,uBAG9D/oE,EAAI+oE,gBACLzvD,EAAOhe,UAAUgB,IAAI,QAKvB2N,EAAO5K,OAAO8S,EAASmH,GAEvB,MAAMsvD,EAAcxsE,SAASC,cAAc,OAC3CusE,EAAYttE,UAAUgB,IAAI,wBAE1B,MAAMiF,EAAQxD,KAAKC,IAAI,EAAGgC,EAAIuB,OAC9B,IAAI,IAAIjB,EAAI,EAAGA,EAAIiB,IAASjB,EAAG,CAC7B,MAAM+uF,EAAajzF,SAASC,cAAc,OAC1CgzF,EAAW/zF,UAAUgB,IAAI,uBAEzBssE,EAAYvpE,OAAOgwF,GAGrB3wC,GAAA,gBAAiC1+C,GAAKlD,MAAKkD,IAGzC,IAAI,IAAIM,EAAI,EAAGA,EAAIiB,IAASjB,EAAG,CAC7B,MAAM0rB,EAAM48C,EAAYj9C,SAASrrB,GAC3BsS,EAAM5S,EAAI6/C,UAAUv/C,GACb,kBAAVsS,EAAIvO,GAIP0nB,GAAY,CACVnZ,IAAAA,EACAoZ,IAAAA,EACAxC,cAAezuB,KAAKyuB,cACpByC,MAAO,kBAGPxuB,MAAM,EACNhB,MAAM,EACNE,MAAO,GACPC,OAAQ,SA8BdovB,EAAIjI,QAAQ67B,WAAa,GAAK5/C,EAAI4L,GAClCogB,EAAIjI,QAAQ2hD,YAAc,GAAK1lE,EAAI0lE,YACnC15C,EAAIjI,QAAQ3Z,MAAQpK,EAAIoK,MAExB4hB,EAAI3sB,OAAO4K,EAAQ2+D,GAEnB7tE,KAAKm0F,QAAQ7vF,OAAO2sB,GAGfthB,OACL,MAAMu7B,EAAMrrC,MAAM8P,OAKlB,OAJA,kBAA8B,GAAM5N,MAAK,KACvC/B,KAAKu0F,oBAGArpD,EAGFqpD,iBACL,OAAO5wC,GAAA,wBAAyC5hD,MAAKyyF,IAChDx0F,KAAK+5E,YAAYr5E,QAIpB8zF,EAAcx0F,KAAKy0F,eAAe,GAAID,IAC1BzvF,SAAQE,IAClBjF,KAAKo0F,UAAUnvF,EAAIA,WAKjBwvF,eAAehoF,EAAe+nF,GACpCA,EAAcA,EAAY5zF,QAE1B,MAAMgwB,EAAWvmB,MAAMC,KAAKtK,KAAKm0F,QAAQvjE,UAczC,OAbA,EAAA5qB,EAAA,GAAe4qB,GAAUnf,IACvB,MAAMZ,EAAKY,EAAGuX,QAAQ67B,WAChB19C,EAAQqtF,EAAY17E,WAAU47E,GAAWA,EAAQzvF,IAAI4L,KAAOA,KAEpD,IAAX1J,EACDqtF,EAAYluF,OAAOa,EAAO,GACjBsF,GAAUgF,EAAGuX,QAAQ3Z,MAAM8wC,cAAc5gB,SAAS9yB,EAAM0zC,gBACjE1uC,EAAGjR,YAIP++C,EAAA,uBAAqCh5C,EAAW,mBAEzCiuF,EAGF7H,OAAOlgF,GACZ,OAAIA,EAIGk3C,GAAA,oBAAqCl3C,GAAO,GAAO1K,MAAKyyF,IAC1Dx0F,KAAK+5E,YAAYr5E,QAAU+L,IAM9B+nF,EAAcx0F,KAAKy0F,eAAehoF,EAAO+nF,IAC7BzvF,SAAQE,IAClBjF,KAAKo0F,UAAUnvF,EAAIA,WAZdjF,KAAKu0F,kBC3NH,MAAMI,WAAsB,IAWzCh1F,YAAYC,GAGVC,OAAM,GANE,KAAA+0F,YAAa,EACb,KAAAC,QAAS,EAoCX,KAAAC,WAAcx0F,IAGpB,GADAiO,aAAavO,KAAK+0F,iBACd/0F,KAAKg1F,WAAY,OAErB,MAAMC,EAAa30F,EAAU20F,UAC1BA,IAAa,EAAAlqC,GAAA,GAAckqC,EAAWj1F,KAAK2Y,WAI9C3Y,KAAK+0F,eAAiB5nF,OAAOC,YAAW,KACtCpN,KAAK6D,QAAO,KA3DK,OA6Ed,KAAAA,OAAeyxC,IAAqB,O,EAAA,K,OAAA,E,EAAA,YAEzC,MAAM4/C,IAAkBl1F,KAAK2Y,QAAQrV,MAAMC,cAAsBgD,IAAX+uC,GAAyBA,EAC/E,GAAGt1C,KAAK4P,KAAM,CACZ,IAAGslF,EAID,OAHAl1F,KAAK4P,OACL5P,KAAK4P,KAAO,KAMhB,GAAGslF,IAAiBl1F,KAAKg1F,WAIzB,GAAIh1F,KAAK2Y,QAAQrV,MAAMC,cAAsBgD,IAAX+uC,GAAyBA,EAAQ,CACjE,MAAM/nC,EAAMvN,KAAKm1F,wBAAwB,cACnC3xF,QAAQC,IAAI8J,GAElBvN,KAAK2Y,QAAQrV,MAAMC,QAAU,GACxBvD,KAAK2Y,QAAQ+1B,WAClB1uC,KAAK2Y,QAAQpY,UAAUgB,IAAI,UAE3BgN,aAAavO,KAAK+0F,gBAClB/0F,KAAK+0F,eAAiB5nF,OAAOC,YAAW,KACtCpN,KAAK40F,YAAa,EAClB50F,KAAKsQ,cAAc,YAClB,GAAAsM,mBAAqB,EAxGH,UAqHrB5c,KAAKsQ,cAAc,SAEnBtQ,KAAK2Y,QAAQpY,UAAUC,OAAO,UAE9B+N,aAAavO,KAAK+0F,gBAClB/0F,KAAK+0F,eAAiB5nF,OAAOC,YAAW,KACtCpN,KAAK2Y,QAAQrV,MAAMC,QAAU,OAC7BvD,KAAK40F,YAAa,EAClB50F,KAAKsQ,cAAc,YAClB,GAAAsM,mBAAqB,EA9HH,M,YA4EkB,K,gRA3DzC,EAAA3V,EAAA,GAAWjH,KAAMJ,GAGZw1F,qBAAqB72E,EAAqB/O,GAC/C,IAAIu0C,GAAY,EACb,GAAAnnC,oBACD,QAAiB2B,GAAQ,KACpBwlC,GACDA,GAAY,EACZ/jD,KAAK6D,QAAO,IAEZ7D,KAAK6D,WAEN,CAAC2L,eAAAA,IAEJA,EAAejO,IAAIgd,EAAnB/O,CAA2B,aAAclP,IAEpCyjD,IACDv0C,EAAejO,IAAIgd,EAAnB/O,CAA2B,WAAYxP,KAAK80F,YAC5C/wC,GAAY,GAGdx1C,aAAavO,KAAK+0F,gBAClB/0F,KAAK+0F,eAAiB5nF,OAAOC,YAAW,KACtCpN,KAAK6D,QAAO,KA1CC,QA+DX+L,OACJ,GAAAgN,qBACF5c,KAAK2Y,QAAQ08E,WAAar1F,KAAK80F,WAC/B90F,KAAK2Y,QAAQ28E,YAAeh1F,IACvBN,KAAK40F,YAKRrmF,aAAavO,KAAK+0F,kBAyEjBC,WACL,OAAOh1F,KAAK2Y,QAAQpY,UAAUmT,SAAS,WCjIpC,MAAM67E,GAAwB,qBAO9B,MAAMlB,WAA0BsG,GAoBrCh1F,cACEE,MAAM,CACJ8Y,QAAStX,SAASuzC,eAAe,oBAb7B,KAAA2gD,OAAS,EA2IT,KAAAC,iBAAoB3kF,IACvB7Q,KAAKu1F,QAAU1kF,IAIlB0uC,EAAA,mBAAqC,EAAMgwC,IAE3CvvF,KAAKu1F,MAAQ1kF,EACb7Q,KAAKy1F,aAAal1F,UAAUsD,OAAO,OAAuB,IAAf7D,KAAKu1F,OAChDv1F,KAAK01F,UAAUn1F,UAAUsD,OAAO,OAAuB,IAAf7D,KAAKu1F,SAGvC,KAAAI,YAAc,KACpB,MAAM,OAACxsF,EAAM,SAAEwD,GAAY,QACrBikB,EAAW5wB,KAAK41F,OAAOhlE,SACvBilE,EAAexrF,MAAMC,KAAKsmB,GAE1BklE,EAAkB7sF,EAAA,gBAAiCE,EAAQwD,EAAU,iBAC3EkpF,EAAa,GAAG/+D,gBAAgB,YAAag/D,GAE7C,MAAMC,EAAc9sF,EAAA,gBAAiCE,EAAQwD,EAAU,aACvEkpF,EAAa,GAAG/+D,gBAAgB,YAAai/D,GAE7C,MAAMxgD,EAASv1C,KAAK41F,OAAOrkF,cAAc,YACtCgkC,GAAiC,KAAvB,EAAA4Q,GAAA,GAAW5Q,IAAmBugD,GAAoBC,GAC7D/1F,KAAK6P,UAAU,GAAG,IApJpB7P,KAAKK,iBAAiB,QAAQ,KAAW,O,EAAA,K,OAAA,E,EAAA,YACpC,GAAAuc,qBAEE,EAAA4vC,GAAA,aACK,EAAAnqD,GAAA,GAAM,MAIbrC,KAAK2Y,QAAQ1U,gBAAkB,yBAChC,+BAAyCjE,KAAK2Y,SAGhD3Y,KAAKg2F,WAAah2F,KAAKi2F,eAEvB5H,GAAkB5/D,cAAc8jC,OAEhChT,EAAA,wBAA2CgwC,K,YAhBJ,K,iRAmBzCvvF,KAAKK,iBAAiB,UAAU,KAC9Bk/C,EAAA,0BAA6CgwC,IAC7ClB,GAAkB5/D,cAAcynE,SAChC7H,GAAkB5/D,cAAc0nE,UAEhCn2F,KAAKoB,UAAUb,UAAUC,OAAO,oBAGlCR,KAAKK,iBAAiB,SAAS,KAC7BguF,GAAkB5/D,cAAc8jC,OAIhChT,EAAA,wBAA2CgwC,IAC3ChwC,EAAA,mBAAqC,EAAMgwC,OAG7CvvF,KAAKK,iBAAiB,UAAU,KAE9Bk/C,EAAA,0BAA6CgwC,IAC7ClB,GAAkB5/D,cAAcynE,SAChC7H,GAAkB5/D,cAAc0nE,UAEhCn2F,KAAKoB,UAAUb,UAAUC,OAAO,iBAEhCR,KAAKg2F,gBAAazvF,KAIZqJ,OACR5P,KAAKo2F,SAAW,IAAI3I,GACpBztF,KAAKq2F,YAAc,IAAItG,GACvB/vF,KAAKs2F,QAAU,IAAIlH,GAEnBpvF,KAAK+P,KAAO,CACV,EAAG/P,KAAKo2F,SACR,EAAGp2F,KAAKq2F,YACR,EAAGr2F,KAAKs2F,SAGVt2F,KAAKoB,UAAYpB,KAAK2Y,QAAQpH,cAAc,oCAC5CvR,KAAK41F,OAAS51F,KAAK2Y,QAAQpH,cAAc,eACzCvR,KAAK6P,WAAY,EAAA0hD,EAAA,GAAevxD,KAAK41F,OAAQ51F,KAAKoB,UAAWpB,KAAKw1F,kBAAkB,KAClF,MAAMtkF,EAAMlR,KAAK+P,KAAK/P,KAAKu1F,OACxBrkF,EAAItB,MACLsB,EAAItB,OAGNsB,EAAIpB,qBAAuBoB,EAAIpB,sBAC/ByvC,EAAA,mBAAqC,EAAOgwC,OAG9CvvF,KAAKy1F,aAAez1F,KAAK2Y,QAAQpH,cAAc,sBAC/CvR,KAAKy1F,aAAap1F,iBAAiB,SAAS,KACxB,IAAfL,KAAKu1F,MACF,eAA4BrB,KAC9B,IAAIA,GAAe,IAAiBvkF,OAGlC,eAA4BikF,KAC9B,IAAIA,GAAW,IAAiBjkF,UAKtC3P,KAAK01F,UAAY11F,KAAK2Y,QAAQpH,cAAc,sBAC5CvR,KAAK01F,UAAUr1F,iBAAiB,SAAUC,I,MACxC,MAAMP,EAAQ,4BACa,QAAvB,EAAAA,EAAMwtB,iBAAiB,eAAEijB,SAC3BzwC,EAAMg3C,iBAAiBv2C,SACfT,EAAMwtB,YACVxtB,EAAMwtB,UAAUuD,YAAYjwB,OAG9Bd,EAAMwtB,UAAUuD,YAAc/wB,EAAMwtB,UAAUuD,YAAYlwB,MAAM,GAAI,GAFpEb,EAAMwtB,UAAU/sB,UAMpB,MAAMwd,EAAQ,IAAI2b,MAAM,QAAS,CAACC,SAAS,EAAM5R,YAAY,IAC7D,yCAAmDhK,IAGnD,EAAA0D,EAAA,GAAYphB,MAGd,MAAMi2F,EAAiB,GAAA1vE,gBAEjB2vE,EAAcD,EAAiB,EAAI,EAczC,OAZGA,GACAv2F,KAAK41F,OAAOhlE,SAAS,GAAmBrwB,UAAUgB,IAAI,QAGxDvB,KAAK41F,OAAOhlE,SAAS4lE,EAAc,GAAqBh2D,QACtDxgC,KAAK+P,KAAKymF,GAAa5mF,MACxB5P,KAAK+P,KAAKymF,GAAa5mF,OAGzB/E,EAAA,yBAA2B,eAAgB7K,KAAK21F,aAChD31F,KAAK21F,cAEE91F,MAAM+P,OA8HR6mF,uBAAuBhoE,EAAyCmgE,GACrE5uF,KAAKK,iBAAiB,SAAS,KAC7BouB,EAAc8jC,UAGhBvyD,KAAKK,iBAAiB,UAAU,KAC9B,MAAMutF,EAAOn/D,EAAcogE,YAAY6H,aAEvC,IAAI,MAAMzlE,KAAO28D,EACfgB,EAAoB39D,GAGtBxC,EAAcogE,YAAY8H,kBAG5B32F,KAAKK,iBAAiB,UAAU,KAC9BouB,EAAc+jC,sBAIXokC,gBACL,OAAO52F,KAAKi2F,gBAAkBj2F,KAAKg2F,WAG7BC,eACN,MAAMnrD,EAAMzpC,SAASsnD,eACrB,GAAG7d,EAAI+rD,YAAcx1F,SAASy1F,gBAAkB,2BAC9C,OAAOhsD,EAAIisD,WAAW,IAzSZ,GAAAtoE,cAAgB,IAAI,KAgLpB,GAAA6/D,YAAc,CAACL,EAAmBhrD,EAAoBwtD,EAA0Bt/B,EAAS,KACrG,IAAI6lC,GAAY,EAEhB,MAAMlrF,EAAa+E,GACdA,IAAOsgD,IAIV88B,EAAKr9D,SAASugC,GAAQ5wD,UAAUC,OAAO,UACvCytF,EAAKr9D,SAAS/f,GAAItQ,UAAUgB,IAAI,UAChC4vD,EAAStgD,GAEF,GAGH09E,EAAoB,IAAIvE,GAAkB/mD,EAAO7hC,WAAW,CAAC61F,EAAOz+E,KAGxE,GAAGxV,KAAK4yB,IAAIohE,EAAW/zD,EAAO7hC,UAAU4sC,YAAc,EACpD,OAEAgpD,GAAY,EAGd,MAAME,GAAQ,EAAA/wC,GAAA,GAAW3tC,IACrBy+E,GAASC,IAIbprF,EAAUorF,GAEPzG,IACEyG,EAAQjJ,EAAKliF,kBAAoB,EAClC0kF,EAAWrvF,UAAU+1F,WAA2B,IAAbD,EAAQ,GAE3CzG,EAAWrvF,UAAU+1F,WAAqB,GAARD,OA+BxC,OA1BAjJ,EAAK5tF,iBAAiB,SAAUC,IAC9B,IAAIkY,EAASlY,EAAEkY,OAGf,GAFAA,GAAS,EAAAqK,GAAA,GAAgBrK,EAAQ,6BAE7BA,EACF,OAGF,MAAM0+E,GAAQ,EAAA/wC,GAAA,GAAW3tC,GAMzB,IAAI1M,EAAUorF,GACZ,OAGF,MACMtlC,GADW3uB,EAAOpD,SAAWoD,EAAO7hC,WAAWwvB,SAASsmE,GACpCtlC,UAAY,EAEtC3uB,EAAO7hC,UAAU4sC,UAAYgpD,EAAWplC,KAKnC,CAAC28B,kBAAAA,EAAmBziF,UAAAA,IAGf,GAAAimD,aAAe,CAACzxD,EAAoC82F,GAAa,KAC7E,IAAI5+E,EAASlY,EAAEkY,OAGf,GAFAA,GAAS,EAAA+sB,GAAA,GAAU/sB,EAAQ,QAEvBA,EAAQ,OAAO,EAEnB,MAAMm1D,EAASn1D,EAAOwQ,QAAQjR,MAC9B,QAAI41D,IAED,sCAAgDA,OAAQpnE,EAAW6wF,IAGjEC,GAAkBj2F,YACnBi2F,GAAkBzC,YAAa,EAC/ByC,GAAkBj2F,UAAUb,UAAUgB,IAAI,iBAC1C81F,GAAkBxzF,QAAO,KAGpB,IAEPiK,QAAQwM,KAAK,oBAAqBqzD,IAC3B,KAoCb,MAAM0pB,GAAoB,IAAIhJ,GAC9B,wBAAmCgJ,GACnC,YCvVaC,GAA6B,W,eCE1C,MAEA,KAF6D,oBAAxB,mBAAwC,GAAAjsD,YCE7E,GAF0B,GCIX,SAASksD,GAAe5+E,EAAsB6+E,EAA8BC,EAAyBj4E,EAAO7G,EAAQ8G,yBACjI,MAAMi4E,EAAeF,EAAgB/3E,wBAErC,IAAKmZ,IAAK++D,EAAanpD,MAAOopD,EAAeh3E,OAAQi3E,EAAgBh3E,KAAMi3E,GAAgBJ,EAG3F,GAAGD,EAAe,CAChB,MAAMM,EAASP,EAAgBjmF,cAAc,WAC1CwmF,IAEDJ,EADmBI,EAAOt4E,wBACDmB,QAI7B,GAAGpB,EAAKoZ,KAAOi/D,GACVr4E,EAAKoB,QAAU+2E,GACfn4E,EAAKgvB,OAASspD,GACdt4E,EAAKqB,MAAQ+2E,EAChB,OAAO,KAGT,MAAMI,EAAW,CACfp/D,KAAK,EACL4V,OAAO,EACP5tB,QAAQ,EACRC,MAAM,EACNvB,SAAU,EACV24E,WAAY,GAIR58E,EAAS,mBAAoBlO,OAASA,OAAO+qF,eAAiB/qF,OAC9DgrF,EAAc98E,EAAEzZ,OAASyZ,EAAE+8E,WAC3BC,EAAeh9E,EAAExZ,QAAUwZ,EAAEi9E,YAEnC,MAAO,CACL94E,KAAM,CACJoZ,IAAKpZ,EAAKoZ,IAAM++D,GAA+B,IAAhBA,GAAqBK,EAASp/D,KAAM,IAAQo/D,EAAS14E,SAAUq4E,GAAen4E,EAAKoZ,IAClH4V,MAAOhvB,EAAKgvB,MAAQopD,GAAiBA,IAAkBO,GAAeH,EAASxpD,OAAQ,IAAQwpD,EAASC,WAAYL,GAAiBp4E,EAAKgvB,MAC1I5tB,OAAQpB,EAAKoB,OAASi3E,GAAkBA,IAAmBQ,GAAgBL,EAASp3E,QAAS,IAAQo3E,EAAS14E,SAAUu4E,GAAkBr4E,EAAKoB,OAC/IC,KAAMrB,EAAKqB,KAAOi3E,GAAiC,IAAjBA,GAAsBE,EAASn3E,MAAO,IAAQm3E,EAASC,WAAYH,GAAgBt4E,EAAKqB,MAE5Hm3E,SAAAA,GAIH7qF,OAAeoqF,eAAiBA,G,IC9CrBgB,G,WCiBG,MAAMC,WAA4B,KAC/C74F,YAAYyzD,EAAcqlC,GACxB54F,MAAM,0BAA0B,QAAgB,CAAC,CAC/C45B,QAASg/D,EAAWz9E,OAAO09E,eAAiB,qBAAwBD,EAAWz9E,OAAOu+D,UAAY,yBAA2B,uBAC7H58C,SAAU,KACR,eAAqB,4BAA6B,CAACy2B,KAAAA,IAClDrxD,MAAM45E,IACLzjB,GAAA,uBAAuCyjB,GACvC,MACMxyE,EADQwyE,EAA4B1jB,MAAM,GAC5BpnD,GAAGoY,UAAS,GAChCpe,EAAA,sBAAwB,gBAAiB,CAAC1B,OAAAA,OACxC4E,IACgB,wBAAfA,EAAM9N,MACP85B,GAAS,CAACC,YAAa,6BAI1B,CAAC2J,UAAU,EAAM9H,iBAAiB,EAAMhiB,MAAM,IAEnD7Z,KAAKkP,OAAO1O,SAeZ,MAAMw2B,EAAa,IAAI+E,GACvB/E,EAAW92B,aAAa,SAAU,KAClC82B,EAAWz2B,UAAUgB,IAAI,cACC,UAAvBk3F,EAAWpyF,MAAMiD,GAClBmvF,EAAWpyF,MAAQ6V,EAAA,YAA2Bu8E,EAAWpyF,OACzD+nB,GAAU,CACRhtB,UAAW41B,EACX9wB,QAAS,KACTG,MAAOoyF,EAAWpyF,MAClBioB,UAAW,IACXD,SAAU,IACVG,kBAAkB,IAEpBwI,EAAW1zB,MAAM1B,MAAQo1B,EAAW1zB,MAAMzB,OAAS,IAEnDwa,EAAA,WAA2B2a,EAAY,OAAc,EAAOyhE,EAAWppF,OAGzE,MAAMA,EAAQhO,SAASC,cAAc,OACrC+N,EAAM9O,UAAUgB,IAAI,cACpB8N,EAAMvJ,UAAY,kBAAgC2yF,EAAWppF,OAG7D,MAAM0tB,EAAc07D,EAAWz9E,OAAOu+D,UAChCof,GAAc,IAAA/sF,MAAKmxB,EAAc,cAAgB,UAAW,EAAC,EAAA67D,GAAA,GAAuBH,EAAWnkC,sBAKrG,GAJAqkC,EAAYp4F,UAAUgB,IAAI,2BAE1BvB,KAAK6Z,KAAKvV,OAAO0yB,EAAY3nB,EAAOspF,GAEjCF,EAAWz9E,OAAO09E,eAAgB,CACnC,MAAM76D,EAAUx8B,SAASC,cAAc,QACvC,IAAAo4B,OAAMmE,EAASd,EAAc,kCAAoC,iCACjEc,EAAQt9B,UAAUgB,IAAI,0BAA2B,mBAEjDvB,KAAK6Z,KAAKvV,OAAOu5B,MDrFvB,SAAY06D,GACV,yBACA,mCACA,iCACA,6BACA,+BALF,CAAYA,KAAAA,GAAkB,KEIf,MAAMM,GASnBl5F,YACUiN,EACAhG,GADA,KAAAgG,WAAAA,EACA,KAAAhG,QAAAA,EAKExF,gBACV,OAAOpB,KAAK4M,WAAWxL,UAGlBq/C,OACL,MAAM,UAACzS,EAAS,aAAE6jB,GAAgB7xD,KAAKoB,UAIvCpB,KAAK84F,qBAAuBjnC,EAC5B7xD,KAAK+4F,6BAA+B/4F,KAAK4G,QAAUirD,EAAe7jB,EAAYA,EAczEgrD,QAAQC,GACb,MAAM,UAAC73F,EAAS,6BAAE23F,EAA4B,WAAEnsF,GAAc5M,KAC9D,QAAoCuG,IAAjCwyF,EAA4C,CAC7C,MAAMlnC,EAAezwD,EAAUywD,aAC/B,GAAGA,IAAiB7xD,KAAK84F,qBACvB,OAkBF,MAAMI,EAAel5F,KAAK4G,QAAUirD,EAAeknC,EAA+BA,EAQlF33F,EAAU4sC,UAAYkrD,EAItBtsF,EAAWusF,mBAAqBD,EAG7B,GAAAhjF,WAAa+iF,GACdlP,GAAwB3oF,K,2SCQhC,MACMg4F,GAA6D,IAAI1zF,IAAI,CACzE,4BACA,4BAII2zF,GAAiE,IAAI3zF,IAExE,IACD2zF,GAAmB93F,IAAI,0BAGzB,MAAM+3F,QAA4B/yF,EAClC,IAAIgzF,GAAcD,GAEd35C,GAAU,EAMC,MAAM65C,GA8FnB75F,YACU09B,EACAp0B,EACA06C,EACA1uC,EACA27E,EACA10E,EACAE,EACAwhB,EACAkjC,EACA93D,EACA8K,EACAqzB,GAmUR,GA9UQ,KAAA9J,KAAAA,EACA,KAAAp0B,mBAAAA,EACA,KAAA06C,mBAAAA,EACA,KAAA1uC,gBAAAA,EACA,KAAA27E,qBAAAA,EACA,KAAA10E,iBAAAA,EACA,KAAAE,gBAAAA,EACA,KAAAwhB,kBAAAA,EACA,KAAAkjC,iBAAAA,EACA,KAAA93D,sBAAAA,EACA,KAAA8K,gBAAAA,EACA,KAAAqzB,oBAAAA,EA/FF,KAAAsyD,UAAY,IAAI/zF,IACjB,KAAA+jF,WAAuE,GAEvE,KAAA7vD,QAAwC,GACxC,KAAA8/D,YAA2B,IAAIh0F,IAC9B,KAAAi0F,aAKH,GAEG,KAAAC,cAAe,EACf,KAAAC,mBAAqB,EAKrB,KAAAC,SAAqC,IAAI1oF,IACzC,KAAA2oF,aAA4B,IAAIr0F,IAKhC,KAAAqiB,UAAkC,KAElC,KAAAiyE,eAAiB,EACjB,KAAAC,kBAAoB,EAErB,KAAAC,qBAAsC,KACrC,KAAAC,cAAoG,GACpG,KAAAC,sBAAoC,KACpC,KAAAC,gCAA8C,KAE9C,KAAAC,kBAAiC,KAKjC,KAAAzpE,YAAa,UAMb,KAAA0pE,mBAA+B,GAE/B,KAAAznD,4BAA6B,EAG7B,KAAA0nD,aAAc,EAMd,KAAAC,aAEH,GAQG,KAAAC,UAAyB,IAAIh1F,IAG7B,KAAAi1F,iBAAkB,EAsuBlB,KAAAC,mBAAsBt6F,IAC5B,MAAMgP,GAAU,EAAAuT,GAAA,GAAgBviB,EAAEkY,OAAQ,kBAC1C,GAAGlJ,IAAYtP,KAAKq9B,KAAKyW,UAAUC,YAAa,CAC9C,MAAM8P,GAAS,EAAAhhC,GAAA,GAAgBvT,EAAS,UACxC,IAAItP,KAAKq9B,KAAKyW,UAAUoa,gBAAgBrK,GAEtC,YADA7jD,KAAK66F,kBAIP,IAAI,YAACC,EAAW,cAAEC,GAAiB/6F,KACnC,GAAG6jD,IAAWi3C,EACZ,OAQF,GALA96F,KAAK66F,kBAELC,EAAc96F,KAAK86F,YAAcj3C,EACjCk3C,EAAgB/6F,KAAK+6F,cAEjBA,EA0DMA,EAAc/xE,QAAQwV,QAC9Bx+B,KAAKg7F,gBAAgBD,GAAe,OA3DnB,CACjBA,EAAgB/6F,KAAK+6F,cAAgB15F,SAASC,cAAc,OAC5Dy5F,EAAcx6F,UAAUgB,IAAI,yBAE5B,MAAM05F,EAAiB55F,SAASC,cAAc,OAC9C25F,EAAe16F,UAAUgB,IAAI,iCAC7Bw5F,EAAcz2F,OAAO22F,GAErB3rF,EAAQhL,OAAOy2F,GAEf,IAAI70F,EAA2BlG,KAAKq9B,KAAK0oB,YAAYlC,EAAO76B,QAAQjgB,KACpE7C,EAAUlG,KAAKiJ,mBAAmBiyF,sBAAsBh1F,GAExD,MAAM2qB,EAAa7wB,KAAKm7F,eAAc,IAAMn7F,KAAK+6F,gBAAkBA,IACnEv3F,QAAQC,IAAI,CACVzD,KAAKmnC,oBAAoBi0D,+BAA+Bl1F,IACxD,EAAA7D,GAAA,GAAM,OACLN,MAAK,EAAEmlC,MACR,MAAMU,EAAoBV,EAAmB,GACzCU,EAKJ5W,GAAY,CACVC,IAAKgqE,EACLpjF,IAAK+vB,EAAkByzD,iBACvBz5F,MAAO,GACPC,OAAQ,GACR8gD,aAAa,EACb9xB,WAAAA,EACAK,MAAOC,GACP4wB,WAAW,EACXX,YAAY,IACXr/C,MAAK6kB,KACN,EAAAo7B,GAAA,GAA0Bp7B,GACtBiK,MAIJjK,EAAOvmB,iBAAiB,cAAc,KAChCwwB,MAKJkqE,EAAc/xE,QAAQwV,OAAS,IAC/Bx+B,KAAKg7F,gBAAgBD,GAAe,MACnC,CAAC5/E,MAAM,KAEV,QAAiB4/E,GAAgBz6F,KAC/B,EAAAohB,EAAA,GAAYphB,GAEZN,KAAKmnC,oBAAoBm0D,aAAap1F,EAAS0hC,EAAkBC,UACjE7nC,KAAK66F,oBACJ,CAACrrF,eAAgBxP,KAAKwP,qBAnCzBurF,EAAcv6F,kBA0CpBR,KAAK66F,mBAiBD,KAAAA,gBAAkB,KACxB,MAAM,YAACC,EAAW,cAAEC,GAAiB/6F,KAClC86F,IACD96F,KAAKg7F,gBAAgBD,GAAe,GACpC/6F,KAAK86F,iBAAcv0F,EACnBvG,KAAK+6F,mBAAgBx0F,IAmJlB,KAAAg1F,eAAkBj7F,I,MACvB,IAAIkY,EAASlY,EAAEkY,OACXqrC,EAAsB,KAC1B,IACEA,GAAS,EAAAhhC,GAAA,GAAgBrK,EAAQ,UACjC,MAAM3K,IAER,IAAIg2C,EAAQ,OAEZ,GAAGA,EAAOtjD,UAAUmT,SAAS,aAAc,EAAAmP,GAAA,GAAgBrK,EAAQ,kBAAmB,CACpF,GAAGqrC,EAAOtjD,UAAUmT,SAAS,eAAiB1T,KAAKw7F,UAAUj7F,UAAUmT,SAAS,gBAC9E,OAGF,IAAI,MAAM8iD,KAAax2D,KAAK25F,aAE1B,GADU35F,KAAK25F,aAAanjC,GACvBvlC,MAAQ4yB,EAAQ,CACnB,IAAI28B,GAAgB,IAAInmC,MAAMmc,GAAYx2D,KAAKy7F,YAAY/4E,OAC3D,MAIJ,OAGF,IAAI,GAAA9F,qBAAsB,EAAAiG,GAAA,GAAgBrK,EAAQ,QAEhD,YADAxY,KAAKq9B,KAAKyW,UAAUE,gBAAgB6P,GAKtC,GAAG7jD,KAAKq9B,KAAKyW,UAAUC,aAAezzC,EAAE6Y,UAAW,CACjD,GAAG0qC,EAAOtjD,UAAUmT,SAAS,iBAAqCnN,IAAvBs9C,EAAO76B,QAAQjgB,IACxD,OAMF,OAHA,EAAA2Y,EAAA,GAAYphB,GAGT,GAAAsc,oBAAsB5c,KAAKq9B,KAAKyW,UAAUuV,kBAC3CrpD,KAAKq9B,KAAKyW,UAAUuV,kBAAe9iD,QAKrCvG,KAAKq9B,KAAKyW,UAAUE,iBAAgB,EAAAnxB,GAAA,GAAgBrK,EAAQ,iBAAmBqrC,GAIjF,MAAM63C,GAA0B,EAAA74E,GAAA,GAAgBrK,EAAQ,WACxD,GAAGkjF,EAID,YAHA17F,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQuyF,EAAW1yE,QAAQ7f,OAAO8f,aAKtC,MAAM4yE,GAAuB,EAAAh5E,GAAA,GAAgBrK,EAAQ,eACrD,GAAGqjF,EAED,YADA77F,KAAKq9B,KAAKs+D,aAAaG,SAAS97F,KAAKmJ,OAAOoL,WAAYsnF,EAAQ7yE,QAAQ/oB,MAI1E,MAAM87F,GAAuB,EAAAl5E,GAAA,GAAgBrK,EAAQ,WACrD,GAAGujF,EAAS,CACV,MAAMrT,GAAa,EAAA7lE,GAAA,GAAgBk5E,EAAS,WAEtCzwF,EAAY,qBACZwjF,EAAYpG,EAAWnoF,UAAUmT,SAASpI,GAC5CwjF,IACF,EAAAptE,EAAA,GAAYphB,GAGd,MAAMmX,EAAW,IACXukF,EAAe,IACfC,EAAWnN,EAAgB,EAAJ,EAC1BmN,GACDvT,EAAWnoF,UAAUgB,IAAI,eAG3B,MAAM26F,EAAiBxT,EAAW1/D,QAAQkzE,eAe1C,OAdsB,OAAnBA,IACD3tF,cAAc2tF,UACPxT,EAAW1/D,QAAQkzE,qBAG5B,QAAcxT,EAAYp9E,GAAW,EAAMmM,GAAU,KACnDixE,EAAW1/D,QAAQkzE,eAAiB,GAAK/uF,OAAOC,YAAW,MACzD,QAAcs7E,EAAYp9E,GAAW,EAAOmM,GAAU,KACpDixE,EAAWnoF,UAAUC,OAAO,sBACrBkoF,EAAW1/D,QAAQkzE,oBAE3BF,KACFC,GAKL,MAAM5W,GAAkB,EAAA9/C,GAAA,GAAU/sB,EAAQ,oBAC1C,GAAG6sE,EAAiB,CAElB,IADA,EAAA3jE,EAAA,GAAYphB,GACT+kF,EAAgB9kF,UAAUmT,SAAS,eACpC,OAGF,MAAM6zE,EAAmBlC,EAAgBphF,cACnCw/E,EAAgB8D,EAAiBnC,iBAAiBC,GAElDn/E,EAAUqhF,EAAiBxhC,aAGjC,YAFA/lD,KAAKmnC,oBAAoBm0D,aAAap1F,EAASu9E,EAAc57C,UAM/D,IADiC,EAAAhlB,GAAA,GAAgBrK,EAAQ,WACzC,CACd,MAAM2jF,GAAat4C,EAAO76B,QAAQjgB,IAClC,GAAG/I,KAAKmJ,SAAW,MAAiB,CAClC,MAAMjD,EAAUlG,KAAKq9B,KAAK0oB,WAAWo2C,GAC/BhzF,EAASnJ,KAAKoc,gBAAgBgtE,UAAUljF,EAAQgjF,SAASC,kBACzDx8E,EAAWzG,EAAQgjF,SAASkT,gBAC5BC,EAAYn2F,EAAQ6hF,SAASuU,kBACnCt8F,KAAKq9B,KAAKs+D,aAAaY,WAAWpzF,EAAQkzF,EAAW1vF,OAChD,CACL,MAAMzG,EAAUlG,KAAKiJ,mBAAmBuzF,eAAex8F,KAAKq9B,KAAK0oB,WAAWo2C,IAAYj2F,KAAcA,EAA4BogF,UAAS,GACrIA,EAAUpgF,EAAQogF,QACrBA,GACDtmF,KAAKiJ,mBAAmBwzF,qBAAqBz8F,KAAKmJ,OAAQjD,EAAQ6C,KAAKhH,MAAKmE,IAC1ElG,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQm9E,EAAQoW,WAAWzzE,UAAS,GACpChpB,KAAM,aACN0M,SAAWzG,EAAsB6C,SAMzC,OAGF,MAAM4zF,GAAM,EAAA95E,GAAA,GAAgBrK,EAAQ,UACpC,GAAGmkF,EAAK,CACN,MAAMlrF,EAAKkrF,EAAIprF,cAAc,eAC7B,GAAGiH,IAAW/G,IAAM,EAAAs5C,GAAA,GAAcvyC,EAAQ/G,GAAK,CAC7C,MAAMvL,EAAUuL,EAAGuc,UAAY,IAI/B,OAHAhuB,KAAK8gE,iBAAiB87B,SAAS58F,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,SAAUzG,QAChE,EAAAwb,EAAA,GAAYphB,IAMhB,MAAMigD,GAAU,EAAA19B,GAAA,GAAgBrK,EAAQ,gBAAiB,EAAA+sB,GAAA,GAAU/sB,EAAQ,oBAAqB,EAAAmoB,GAAA,GAAgBnoB,EAAQ,mBACxH,GAAG+nC,GAAWA,IAAYsD,EAAQ,CAChCrrC,EAAS+nC,GAAW/nC,EACpB,MAAMqkF,EAAYrkF,EAAOwQ,QAAQ7f,QAAUqP,EAAOstD,aAAa,QACzDg3B,EAAYtkF,EAAOwQ,QAAQ8zE,UACjC,GAAyB,iBAAhB,GAA4BA,EACnC,GAAGA,EAAW,CACZ,MAAO3zF,EAAQJ,GAAO+zF,EAAU98C,MAAM,KAEtChgD,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQA,EAAO8f,WACfozE,WAAYtzF,QAET,CACL,MAAMI,EAAS0zF,EAAU5zE,WACtB9f,IAAW,MACZnJ,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAACzyF,OAAAA,IAErC2wB,GAAM,iBAAY,cAAc,IAKtC,OAaF,GAAG+pB,EAAOtjD,UAAUmT,SAAS,YAAc8E,EAAOvU,cAAc1D,UAAUmT,SAAS,cAAe,CAChG,MAAMqpF,GAAal5C,EAAO76B,QAAQjgB,IAG5B8O,EAAmB,QAAb,EAFI7X,KAAKq9B,KAAK0oB,WAAWg3C,GAEjBzmF,aAAK,eAAEjV,SAM3B,aAJGwW,MAAAA,OAAG,EAAHA,EAAK41D,kBACN,IAAID,GAAc31D,EAAI41D,iBAAiB/qD,QAM3C,MAAMs6E,GAAc,EAAAn6E,GAAA,GAAgBrK,EAAQ,uBAC5C,GAAuB,QAAnBA,EAAOg4B,UAAsBh4B,EAAOjY,UAAUmT,SAAS,WAAa8E,EAAOjY,UAAUmT,SAAS,mBAC7F8E,EAAOjY,UAAUmT,SAAS,eAEN,UAAnB8E,EAAOg4B,UAAwBqT,EAAOtjD,UAAUmT,SAAS,UACzDspF,IAAgBA,EAAYzrF,cAAc,wBAA0B,CACxE,MAAM0rF,GAAc,EAAAp6E,GAAA,GAAgBrK,EAAQ,gBAAiB,EAAAqK,GAAA,GAAgBrK,EAAQ,sBAC/EukF,IAAcE,GAAep5C,GAAQ76B,QAAQjgB,IAC7C7C,EAAUlG,KAAKq9B,KAAK0oB,WAAWg3C,GACrC,IAAI72F,EAEF,YADAlG,KAAK0nB,IAAIpN,KAAK,2BAA4ByiF,GAI5C,MAAMh1E,GAAak1E,GAAep5C,GAAQtyC,cAA2B,wBACrE,GAAGwW,EAGD,OAFA,QAAmBA,QACnB,EAAArG,EAAA,GAAYphB,GAId,MAAM48F,EAAyB,UACzBC,EAAgBt5C,EAAOtjD,UAAUmT,SAASwpF,GAE1Cx9D,EAAIs9D,EAAe1mF,GAChB27C,GAAemrC,mCAAmC9mF,GACtDA,GACgB,UAAZA,EAAMhN,GAAiB,CAAC,QAAS,OAAOi2B,SAASjpB,EAAMrW,MAG1DwK,EAAiE,GACjEwrD,EAAMknC,EAAgB,CAACJ,GAAariF,OAAOgzC,KAAK1tD,KAAK45B,SAASlvB,KAAI2sC,IAAMA,IAAGvtC,QAAO+G,IAMtF,MAAM3K,EAAUlG,KAAKq9B,KAAK0oB,WAAWl1C,GAC/ByF,EAAQtW,KAAKiJ,mBAAmBo0F,oBAAoBn3F,GAE1D,OAAOoQ,GAASopB,EAAEppB,MACjB/L,MAAK,CAACC,EAAGxF,IAAMwF,EAAIxF,IAEtBixD,EAAIlxD,SAAQ8L,IACV,IAAI+X,EACDo0E,EACDp0E,EAAW,uBAGXA,EAAW,qEAETA,GAHe5oB,KAAK45B,QAAQ/oB,GAAItQ,UAAUmT,SAAS,mBAGvC,2BAEA,sCAIhB,MAAMoV,EAAWze,MAAMC,KAAKtK,KAAK45B,QAAQ/oB,GAAIW,iBAAiBoX,IACxD00E,EAA4B,IAAI53F,IACtC,GAAGs3F,EACDl0E,EAAS/jB,SAAS4T,IAChBlO,EAAQ3C,KAAK,CACX6Q,QAASA,EAAQpH,cAAc,iBAC/BxI,KAAM4P,EAAQqQ,QAAQjgB,IACtBI,OAAQnJ,KAAKmJ,gBAGZ,CACL,MAAMo0F,IAAgBv9F,KAAK45B,QAAQ/oB,GAAIU,cAAc,6BACrDuX,EAAS/jB,SAAS4T,IAChB,GAAG4kF,KAAgB,EAAA16E,GAAA,GAAgBlK,EAAS,4BAA6B,OACzE,IAAI6kF,GAAY,EAAA36E,GAAA,GAAgBlK,EAAS,cACzC,MAAMoxC,EAASyzC,GAAa7kF,EAAQ1U,cACjCq5F,EAAQzzF,IAAIkgD,KACfuzC,EAAQ/7F,IAAIwoD,GACZt/C,EAAQ3C,KAAK,CACX6Q,QAAAA,EACA5P,IAAKy0F,GAAaA,EAAUx0E,QAAQjgB,IAAM8H,EAC1C1H,OAAQnJ,KAAKmJ,iBAMrBsB,EAAQF,MAAK,CAACC,EAAGxF,IAAMwF,EAAEzB,IAAM/D,EAAE+D,MAEjC,IAAI5C,EAAMsE,EAAQqO,WAAUxG,GAAKA,EAAEvJ,MAAQg0F,IAM3C,OAJG,OACD/8F,KAAK0nB,IAAI,oCAAqCuuC,EAAK9vD,EAAKsE,GAGtDA,EAAQtE,KAKZ,IAAI8rD,IACHjnD,iBAAiB,CAChB2B,SAAU3M,KAAKq9B,KAAK1wB,SACpBxD,OAAQnJ,KAAKmJ,OACbE,YAAa,CAACC,EAAG0zF,EAAc,8BAAgC,iCAC/D9xF,UAA8B,cAAnBlL,KAAKq9B,KAAKp9B,OAAyBk9F,EAC9CpyF,YAAgC,cAAnB/K,KAAKq9B,KAAKp9B,OAExBkyD,UAAUjsD,EAASuE,EAAQtE,GAAKwS,QAAS,GAAG,EAAMlO,EAAQ7J,MAAM,EAAGuF,GAAMsE,EAAQ7J,MAAMuF,EAAM,SAE9F,EAAAub,EAAA,GAAYphB,SAdVN,KAAK0nB,IAAI,8BAA+BlP,GAqB5C,IAFkE,IAA/D,CAAC,MAAO,MAAO,QAAmByH,QAAQzH,EAAOg4B,WAAiBh4B,GAAS,EAAA+sB,GAAA,GAAU/sB,EAAQ,SAEhD,IAA7C,CAAC,MAAO,QAAQyH,QAAQzH,EAAOg4B,SAAiD,CACjF,GAAGh4B,EAAOjY,UAAUmT,SAAS,iBAAkB,CAC7C,MAAMopF,EAAYj5C,EAAO76B,QAAQ8zE,WAC1B3zF,EAAQJ,GAAO+zF,EAAU98C,MAAM,KAMtC,YAJAhgD,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQA,EAAO8f,WACfozE,WAAYtzF,IAGT,GAAGyP,EAAOjY,UAAUmT,SAAS,WAAY,CAC9C,MAAM3K,GAAO86C,EAAO76B,QAAQjgB,IACtB7C,EAAUlG,KAAKiJ,mBAAmBsgF,iBAAiBvpF,KAAKmJ,OAAQJ,GAKtE,YAJA,IAAIi/C,GAAa,CACf,CAAChoD,KAAKmJ,QAASnJ,KAAKiJ,mBAAmBw0F,iBAAiBv3F,KAM5D,IAAIw3F,GAAe,EAEnB,IACEA,KAAiB,EAAA76E,GAAA,GAAgBviB,EAAEkY,OAAQ,SAC3C,MAAM3K,IAER,GAAG6vF,GAAgB75C,EAAOtjD,UAAUmT,SAAS,YAA6D,CACxG,MAAMyoF,GAAat4C,EAAO76B,QAAQjgB,IAClC/I,KAAKu6F,mBAAmBzyF,KAAKq0F,GAE7B,MAAMj2F,EAAUlG,KAAKq9B,KAAK0oB,WAAWo2C,GAE/BlT,EAAgB/iF,EAAQgjF,SAASC,iBAAmBnpF,KAAKoc,gBAAgBgtE,UAAUljF,EAAQgjF,SAASC,kBAAoBnpF,KAAKmJ,OAC7Hw0F,EAAaz3F,EAAQgjF,SAAS0U,gBAEpC59F,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQ8/E,EACRoT,UAAWsB,EACX19F,KAAMD,KAAKq9B,KAAKp9B,KAChB0M,SAAU3M,KAAKq9B,KAAK1wB,cAoKrB,KAAA85B,SAAW,KAIhB,GAAGzmC,KAAK8yC,4BAA8B9yC,KAAK45F,aAAc,OAGzD,MAAMiE,EAAgB79F,KAAK4M,WAAWkxF,oBAClC,GAAAlhF,oBAA8D,IAAxC5c,KAAK4M,WAAWmxF,qBAA6BF,EAAgB,IAClF79F,KAAK65F,mBACNtrF,aAAavO,KAAK65F,oBACT75F,KAAKw7F,UAAUj7F,UAAUmT,SAAS,iBAC3C1T,KAAKw7F,UAAUj7F,UAAUgB,IAAI,gBAG/BvB,KAAK65F,mBAAqB1sF,OAAOC,YAAW,KAC1CpN,KAAKw7F,UAAUj7F,UAAUC,OAAO,gBAChCR,KAAK65F,mBAAqB,IACzB,OAGFgE,EAAgB,MAAQ79F,KAAK4M,WAAWvF,UAAUuZ,QAAU5gB,KAAKq9B,KAAK2gE,iBAAmBh+F,KAAKmJ,SAC/FnJ,KAAKguD,iBAAiBztD,UAAUgB,IAAI,iBACpCvB,KAAK45F,cAAe,GACZ55F,KAAKguD,iBAAiBztD,UAAUmT,SAAS,mBACjD1T,KAAKguD,iBAAiBztD,UAAUC,OAAO,iBACvCR,KAAK45F,cAAe,GAGnB55F,KAAKq9B,KAAK4gE,OAAOC,eAClBl+F,KAAKq9B,KAAK4gE,OAAOC,cAAcC,gBAAgBn+F,KAAK4M,WAAWmxF,qBAGjE/9F,KAAKo+F,yBAkpEP,KAAA3C,WAAcjlC,IACZ,MAAMrtD,EAASnJ,KAAKmJ,OACpBnJ,KAAKiJ,mBAAmBo1F,eAAel1F,EAAQ,EAAG,GAAI,EAAGqtD,EAAWx2D,KAAKq9B,KAAK1wB,UAAU5K,MAAKkE,I,OACtE,QAAjB,EAAAA,MAAAA,OAAO,EAAPA,EAAS4G,gBAAQ,eAAEhM,QAGbb,KAAKmJ,SAAWA,GAI1BnJ,KAAKq9B,KAAKihE,aAAcr4F,EAAQ4G,SAAS,GAAiB9D,KANxD/I,KAAK0nB,IAAI3Z,MAAM,mBA/nHnB/N,KAAKwP,eAAiB,IAAI,IAE1BxP,KAAKguD,iBAAmB3sD,SAASC,cAAc,OAC/CtB,KAAKguD,iBAAiBztD,UAAUgB,IAAI,UAAW,iBAE/CvB,KAAKw7F,UAAYn6F,SAASC,cAAc,OACxCtB,KAAKw7F,UAAUj7F,UAAUgB,IAAI,iBAE7BvB,KAAKu+F,YAELv+F,KAAKguD,iBAAiB1pD,OAAOtE,KAAK4M,WAAWxL,WAI7CpB,KAAK0nB,IAAM1nB,KAAKq9B,KAAK3V,IACrB1nB,KAAKw+F,aAAe,IAAIlf,GAAat/E,KAAKq9B,MAC1Cr9B,KAAK+nB,UAAY,IAAI,KAAqB,CACxCC,YAAY,IAEdhoB,KAAKyuB,cAAgB,IAAI,KACzBzuB,KAAKyuB,cAAckxB,UAAYA,GAO/B3/C,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,kBAAkB,EAAE8K,QAAAA,EAAS3B,OAAAA,EAAQJ,IAAAA,MACtE,GAAG/I,KAAKq9B,KAAK4uB,uBAAyBnhD,EAAS,CAC7C,MAAM+4C,EAAS7jD,KAAK45B,QAAQ7wB,GAC5B,IAAI86C,EAAQ,OAEZ,MAAM39C,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,GAErC,IAAI86C,EAAO76B,QAAQwtC,WAActwD,EAAQ2mB,KAAOqtB,GAAA,mBAAqC,EAEnF,YADAl6C,KAAKw+F,aAAa7e,gBAAgB97B,EAAQ96C,GAI5C/I,KAAKy+F,kBAAkB56C,EAAQ39C,GAAS,GAGrClG,KAAK0+F,mBACN1+F,KAAK2+F,kBASX3+F,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,gBAAgB,EAAEmJ,OAAAA,MAChDnJ,KAAKmJ,SAAWA,GACjBnJ,KAAK4+F,oBAAoBlkF,OAAOgzC,KAAK1tD,KAAK45B,SAASlvB,KAAImlC,IAAMA,QAKjE7vC,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,gBAAiBM,I,oBAClD,MAAM,QAACwK,EAAO,OAAE22B,EAAM,YAAEo9D,EAAW,IAAE91F,GAAOzI,EAG5C,GAAGN,KAAKq9B,KAAK4uB,uBAAyBnhD,EACpC,OAKF,MAAM2jD,EAAUzuD,KAAK0uD,iBAAiBjtB,EAAQo9D,IAAgB7+F,KAAK0uD,iBAAiB3lD,GACpF,GAAG0lD,EAAS,CACV,MAAMvoD,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,GAC/B86C,EAAS4K,EAAQ5K,OAKjBi7C,EAAoBz0F,MAAMC,KAAKu5C,EAAOryC,iBAAiB,sBAO7D,GANGstF,EAAkBj+F,QACnBi+F,EAAkB/5F,SAAQwiF,IACxBA,EAAiBhC,cAAcr/E,MAIhCA,EAAQogF,QAAS,CAClB,MAAMyY,EAAiBl7C,EAAOtyC,cAAc,mBACzCwtF,IACDA,EAAe74F,QAAUA,EACzB64F,EAAenvF,QAInB,GAAgB,QAAb,EAAA1J,EAAQoQ,aAAK,eAAEjV,SAAU,CAC1B,MAAM4vB,EAAM4yB,EAAOtyC,cAAc,iCAAiCkwB,iBAClE,GAAGxQ,EAAK,CACN,MAAM7vB,GAAY,EAAAyhB,GAAA,GAAgBoO,EAAK,wBAEA,QAAnC,EAA2B,QAA3B,EAAiB,QAAjB,EAAA4tE,EAAYvoF,aAAK,eAAEjV,gBAAQ,eAAEya,cAAM,eAAEjb,UAAuC,QAA7B,EAAAqF,EAAQoQ,MAAMjV,SAASya,cAAM,eAAEjb,SAChFowB,EAAIzD,YAAYqyB,GAAa,CAAC35C,QAAAA,KAG7B9E,IACDA,EAAU4nB,QAAQjgB,IAAM,GAAKA,IAMnC,GAAG7C,EAAQ84F,WAAY,CACrB,MAAMp3F,EAAQi8C,EAAOtyC,cAAc,2BAA2BkwB,QAA+BoiB,EAC1Fj8C,IACDA,EAAKohB,QAAQjgB,IAAM,GAAKA,GAI5B,GAAgB,QAAb,EAAA7C,EAAQoQ,aAAK,eAAEs/B,KAAM,CACtB,MAAM4B,EAAcqM,EAAOtyC,cAAc,gBACzC,GAAGimC,EAAa,CACd,MAAMynD,EAAU/4F,EAAQoQ,MAAMs/B,KAC9B4B,EAAYtxC,QAAUA,EACtBsxC,EAAYt3C,aAAa,UAAW++F,EAAQpuF,IAC5C2mC,EAAYt3C,aAAa,aAAc,GAAK6I,IAIhD,GAAgB,QAAb,EAAA7C,EAAQoQ,aAAK,eAAEjV,SAAU,CAC1B,MAAMsX,EAAUkrC,EAAOtyC,cAAc,2BAA2BkwB,+BAAoCA,+BAAoCA,OACrI9oB,IACEA,aAAmBuQ,IAAgBvQ,EAAQpY,UAAUmT,SAAS,gBAC/DiF,EAAQqQ,QAAQjgB,IAAM,GAAK7C,EAAQ6C,WAC5B4P,EAAQqQ,QAAQS,WACtB9Q,EAAgBzS,QAAUA,EAC1ByS,EAAgBgV,QAAO,IAExBhV,EAAQqQ,QAAQjR,MAAQ7R,EAAQoQ,MAAMjV,SAASwP,KAWrC,QAAb,EAAA3K,EAAQoQ,aAAK,eAAEya,WAAY8yB,EAAOtyC,cAAc,UACjD,WAA2BxP,MAAK,KAC9B/B,KAAKk/F,kBAAkBh5F,GAAS,GAAM,EAAO29C,GAAQ,GACrD7jD,KAAKm/F,qBAAqBt7C,WAS9B7jD,KAAK0nB,IAAIpN,KAAK,kCAAmCha,GAGnD,MAAMs5B,EAAU55B,KAAK45B,QACrB,GAAGA,EAAQ6H,GAAS,CAClB,MAAMoiB,EAASjqB,EAAQ6H,GACvB7H,EAAQ7wB,GAAO86C,SACRjqB,EAAQ6H,IAGb,UAAQ,KACHoiB,EAAOtjD,UAAUmT,SAAS,iBAC3BmwC,EAAOtjD,UAAUC,OAAO,aAAc,eACtCqjD,EAAOtjD,UAAUgB,IAAIvB,KAAKmJ,SAAW0B,EAAA,cAAqC,cAAnB7K,KAAKq9B,KAAKp9B,KAAuB,UAAY,eAK1G4jD,EAAO76B,QAAQjgB,IAAM,GAAKA,EAGzB/I,KAAKy5F,UAAU5vF,IAAI43B,KACpBzhC,KAAKy5F,UAAUzpF,OAAOyxB,GACtBzhC,KAAKy5F,UAAUl4F,IAAIwH,IAIC,cAAnB/I,KAAKq9B,KAAKp9B,OACOo6C,KAAKC,MAAQ,IAAO,IACjBukD,EAAYhyE,KAAO,IAGtC7sB,KAAK4+F,oBAAoB,CAAC71F,OAKhC/I,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,gBAAgB,EAAE8K,QAAAA,EAAS3B,OAAAA,EAAQJ,IAAAA,MAElE,GAAG+B,IAAY9K,KAAKq9B,KAAK4uB,qBAAsB,OAC/C,MAAM/lD,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,GAC/B0lD,EAAUvoD,EAAQ84F,WAAah/F,KAAKo/F,iBAAiBl5F,EAAQ84F,YAAch/F,KAAK0uD,iBAAiB3lD,GACvG,IAAI0lD,EAAS,OAEb,MAAM4wC,EAAoC,cAAnBr/F,KAAKq9B,KAAKp9B,KAEjCD,KAAKs/F,qBACLt/F,KAAKk/F,kBAAkBzwC,EAAQvoD,SAAS,GAAM,EAAOuoD,EAAQ5K,OAAQw7C,GAElEA,IACAr/F,KAAKk6F,sBAAwB12F,QAAQ2E,WAAWpG,MAAK,KACpD/B,KAAKu/F,8BAMS,cAAnBv/F,KAAKq9B,KAAKp9B,OACXD,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,4BAA4B,EAAEkG,QAAAA,EAASs/E,eAAAA,MACxE,GAAGxlF,KAAKmJ,SAAWjD,EAAQiD,SAAWjD,EAAQkjC,YAAcljC,EAAQkjC,UAAU7G,QAAQ1hC,OACpF,OAGF,MAAMgjD,EAAS7jD,KAAKw/F,mBAAmBt5F,GACnC29C,IAID39C,EAAQ84F,aAET94F,EADgBlG,KAAKo/F,iBAAiBl5F,EAAQ84F,YAC5B94F,SAGpBlG,KAAKy/F,+BAA+B57C,EAAQ39C,EAASs/E,OAGvDxlF,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,qBAAqB,EAAEkG,QAAAA,EAASs/E,eAAAA,MACjE,GAAGxlF,KAAKmJ,SAAWjD,EAAQiD,OACzB,OAIF,IADenJ,KAAKw/F,mBAAmBt5F,GAErC,OAGFlG,KAAKs/F,qBAEL,MAAMnvF,EAAMjK,EAAQiD,OAAS,IAAMjD,EAAQ6C,IACrC9D,EAAM+/E,GAAmBtzE,IAAIvB,GACnC,GAAGlL,EACD,IAAI,MAAM0T,KAAW1T,EACnB0T,EAAQktB,OAAO3/B,EAASs/E,QAG1B36E,EAAA,sBAAwB,2BAA4B,CAAC3E,QAAAA,EAASs/E,eAAAA,QAkBpExlF,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,cAAc,EAAEmJ,OAAAA,EAAQ08C,QAAAA,EAAS65C,YAAAA,MAEhE,GAAGv2F,IAAWnJ,KAAKmJ,OAAQ,OAC3B,MACMw2F,EADO3/F,KAAKiJ,mBAAmB22F,eAAe/5C,GAC5BpgD,OAAOi6F,GAAartF,MAAKtJ,GAAO/I,KAAK45B,QAAQ7wB,KACrE,IAAI42F,EAAY,OAEhB,MAAME,GAAc,EAAA1oC,GAAA,GAAqBn3D,KAAKiJ,mBAAmB62F,uBAAuBj6C,GAAU,OAAOh+C,MAEzG7H,KAAKk/F,kBAAkBl/F,KAAKq9B,KAAK0oB,WAAW85C,IAAc,GAAM,EAAO7/F,KAAK45B,QAAQ+lE,IAAa,MAIrG3/F,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,uBAAuB,EAAEmJ,OAAAA,EAAQgB,KAAAA,MAClE,MAAM0mB,EAAa7wB,KAAKm7F,iBACxB,WAA2Bp5F,MAAK,KAC1B8uB,KAEH1mB,EAAkBpF,SAAQgE,KAKzB,EAAA/C,EAAA,GAAehG,KAAKypF,YAAY,CAACx/E,EAAK9D,KACpC,GAAG8D,EAAIy/E,WAAa3gF,GAAOkB,EAAIg/E,gBAAkB9/E,EAAQ,CACvD,MAAM,IAACJ,EAAG,SAAE2gF,GAAY1pF,KAAKypF,WAAWnjF,OAAOH,EAAK,GAAG,GAGjD09C,EAAS7jD,KAAK45B,QAAQ7wB,GAC5B,IAAI86C,EAAQ,OAEZ,MAAM39C,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,GAEd/I,KAAKiJ,mBAAmBsgF,iBAAiBt/E,EAAIg/E,cAAeS,GACjEzpD,gBACT/5B,EAAQ8iF,aAGjB9B,GAAc2B,SAAS,CACrBxrD,KAAMr9B,KAAKq9B,KACXwmB,OAAAA,EACA39C,QAAAA,iBAQT,GAAA0W,mBAAoB,CACrB,MAAMtR,EAAY,qBACZ6rE,EAAM,GACN4oB,EAAmB,IAAN5oB,EACnB,IACI3+D,EACA3J,EAFAmxF,GAAc,EAGlBp4C,GAAsB,CACpBjvC,QAAS3Y,KAAKguD,iBACdzhB,kBAAoBjsC,KACfN,KAAKq9B,KAAKyW,UAAUC,cAAgB/zC,KAAKq9B,KAAK4iE,YAKjDznF,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,UAChCA,KACD,QAAcA,EAAQlN,GAAW,EAAM,KAClCkN,EAAOk2B,WAER7/B,GAIFA,EAAKtO,UAAUC,OAAO,cACtBqO,EAAKvL,MAAMwqD,QAAU,KAJrBj/C,EAAOxN,SAASC,cAAc,QAC9BuN,EAAKtO,UAAUgB,IAAI,qBAAsB,8BAM3CiX,EAA8ClU,OAAOuK,KAG9C2J,IAEXu0B,QAAS,CAACL,EAAOC,KACfqzD,EAActzD,GAASqzD,EAEpBC,IAAgBnxF,EAAKtO,UAAUmT,SAAS,eACzC7E,EAAKtO,UAAUgB,IAAI,cAErBsN,EAAKvL,MAAMwqD,QAAU,GAAK9qD,KAAKC,IAAI,EAAGypC,EAAQqzD,GAE9C,MAAM9hF,GAAKjb,KAAKH,IAAI,EAAGG,KAAKC,IAAIk0E,EAAKzqC,IACrCl0B,EAAOlV,MAAMmd,UAAY,cAAcxC,QACvC,WAEFmuB,QAAS,KACP,MAAM8zD,EAAU1nF,GAChB,QAAc0nF,EAAS50F,GAAW,EAAO,KAAK,KACzCuD,EAAK5K,gBAAkBi8F,IACxBrxF,EAAKtO,UAAUC,OAAO,cACtBqO,EAAKrO,cAIT,UAAQ,KAGN,GAFA0/F,EAAQ58F,MAAMmd,UAAY,GAEvBu/E,EAAa,CACd,MAAM,IAACj3F,GAAOm3F,EAAQl3E,QACtBhpB,KAAKq9B,KAAKt9B,MAAMogG,kBAAkBp3F,GAClCi3F,GAAc,OAIpBl0D,gBAAiB,CAAClc,SAAS,KAoD/B,IAAIiB,GAhDJ,QAAiB7wB,KAAKguD,iBAAkBhuD,KAAKu7F,eAAgB,CAAC/rF,eAAgBxP,KAAKwP,iBAGhF,OACDxP,KAAKwP,eAAejO,IAAIvB,KAAKguD,iBAA7BhuD,CAA+C,YAAaM,IAC1D,MAAMujD,GAAS,EAAAhhC,GAAA,GAAgBviB,EAAEkY,OAAQ,kBAAmB,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,UACtF,GAAGqrC,EAAQ,CACT,MAAM96C,GAAO86C,EAAO76B,QAAQjgB,IAC5B/I,KAAK0nB,IAAI,iBAAkB1nB,KAAKq9B,KAAK0oB,WAAWh9C,IAChD/I,KAAKogG,gBAAgBv8C,OAKvB,GAAAu2B,WAAgC,WAAnBp6E,KAAKq9B,KAAKp9B,MACzBD,KAAKwP,eAAejO,IAAIvB,KAAKguD,iBAA7BhuD,CAA+C,YAAaM,IAC1D,GAAGN,KAAKq9B,KAAKyW,UAAUC,cACpB/zC,KAAKq9B,KAAK4iE,UACX,OAGF,MAAMznF,EAASlY,EAAEkY,OACXqrC,EAASrrC,EAAOjY,UAAUmT,SAAS,UACvC8E,EACCA,EAAOjY,UAAUmT,SAAS,sBAAwB8E,EAAOvU,cAAgB,KAC5E,GAAG4/C,IAAWA,EAAOtjD,UAAUmT,SAAS,gBAAiB,CACvD,MAAM3K,GAAO86C,EAAO76B,QAAQjgB,IAE5B,GADgB/I,KAAKq9B,KAAK0oB,WAAWh9C,GAC1BiS,OAAO0O,YAChB,OAGF1pB,KAAKq9B,KAAKt9B,MAAMogG,iBAAiBp3F,QAiBvC,EAAAupD,GAAA,KAAuB,KACrBtyD,KAAK8yC,4BAA6B,EAClC9yC,KAAKyuB,cAAc8jC,OACnB1hC,EAAa7wB,KAAKm7F,mBACjB,KACDn7F,KAAK8yC,4BAA6B,EAE/BjiB,GAAcA,MACf7wB,KAAKyuB,cAAcynE,SACnBl2F,KAAKyuB,cAAc0nE,WAGrBtlE,EAAa,OACZ7wB,KAAKwP,gBAGH6wF,uBAqJL,GAnJArgG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,kBAAkB,EAAE8K,QAAAA,EAAS/B,IAAAA,MAC9D,GAAG+B,IAAY9K,KAAKq9B,KAAK4uB,uBAErBjsD,KAAK4M,WAAWvF,UAAUuZ,OAG5B5gB,KAAKsgG,uBAAuB,CAACv3F,IAAM,GAFnC/I,KAAKq9B,KAAKihE,eAKTzzF,EAAA,oCAAsC,CACvC,MAAM67D,EAAmB1mE,KAAKq9B,KAAKqpC,iBAChCA,GACDA,EAAiBR,qBAKvBlmE,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,uBAAwBgzC,IACzD,KAAKhzC,KAAKmJ,UAAU6pC,GAAe,OACnC,MAAMutD,EAASl2F,MAAMC,KAAK0oC,EAAahzC,KAAKmJ,SAASvI,QAAQ2J,MAAK,CAACC,EAAGxF,IAAMA,EAAIwF,IAChFxK,KAAKsgG,uBAAuBC,MAG9BvgG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,kBAAkB,EAAEmJ,OAAAA,EAAQQ,KAAAA,MAC1DR,IAAWnJ,KAAKmJ,QACjBnJ,KAAK4+F,oBAAoBv0F,MAAMC,KAAKX,OAIxC3J,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAiB,EAAEmJ,OAAAA,MACjDA,IAAWnJ,KAAKmJ,SACjBnJ,KAAKq9B,KAAKt9B,MAAMygG,iBAChBxgG,KAAKygG,2BAITzgG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,uBAAwBqhC,IACtDA,EAAQrhC,KAAKmJ,SACdnJ,KAAKq9B,KAAKt9B,MAAMygG,oBAIpBxgG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,0BAA2B8U,IACzD9U,KAAKmJ,SAAW2L,EAAO3L,QACxBnJ,KAAKq9B,KAAKt9B,MAAMygG,oBAIpBxgG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,eAAgBmU,IAC9CnU,KAAKmJ,SAAWgL,EAAO8U,UAAS,IACfjpB,KAAKw7F,UAAUj7F,UAAUmT,SAAS,gBAClC1T,KAAKq9B,KAAK4iE,YAG1BjgG,KAAK0gG,mBACL1gG,KAAKq9B,KAAKt9B,MAAM2gG,uBAKtB1gG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAqBM,IACtD,GAAa,uBAAVA,EAAE6P,IAA8B,CACjC,MAAMwwF,EAAiB3gG,KAAK4M,WAAW+zF,eACnCA,GACF3gG,KAAK4gG,2BAGM,EAAAzpC,GAAA,GAAqBn3D,KAAK45B,QAAS,QAC3C70B,SAAQgE,IACX,MAAM86C,EAAS7jD,KAAK45B,QAAQ7wB,GAC5B,GAAG86C,EAAOtjD,UAAUmT,SAAS,sBAAuB,CAClD,MAAMxN,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,GACrC/I,KAAKk/F,kBAAkBh5F,OAASK,GAAW,EAAOs9C,OAKnD88C,EACD3gG,KAAK4M,WAAWohC,UAAY,MAE5BhuC,KAAK6gG,qBAAqB,IAAI,GAAM,OAAOt6F,OAKjDvG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAiB,EAAEmJ,OAAAA,EAAQy+E,MAAAA,EAAO7+E,IAAAA,MAChE/I,KAAKmJ,SAAWA,IAEnB,UAAQ,KACN,MAAM06C,EAAS7jD,KAAK45B,QAAQ7wB,GAC5B,IAAI86C,EAAQ,OAEZ,MAAMi9C,EAAoBz2F,MAAMC,KAAKu5C,EAAOryC,iBAAiB,gBAC7D,GAAGsvF,EAAkBjgG,OAAQ,CAC3B,MAAM4uE,EAAMgN,GAAamL,EAAO,GAChC,IAAImZ,GAAY,EAChBD,EAAkB/7F,SAAQi8F,KACrBD,GAAaC,EAAUl7F,YAAc2pE,KACtCzvE,KAAKs/F,qBACLyB,GAAY,EACZC,EAAUl7F,UAAY2pE,aAOhCzvE,KAAKihG,iBAAmB,IAAI7xD,sBAAsBC,IAChDA,EAAQtqC,SAAQuqC,IACd,GAAGA,EAAMC,eAAgB,CACvB,MAAM/2B,EAAS82B,EAAM92B,OACfzP,EAAM/I,KAAK85F,SAASpoF,IAAI8G,GAC9BxY,KAAKkhG,qBAAqB1oF,EAAQzP,UAKxC/I,KAAKmhG,cAAgB,IAAI/xD,sBAAsBC,IAC7CA,EAAQtqC,SAAQuqC,IACd,GAAGA,EAAMC,eAAgB,CACvB,MAAMxmC,GAAQumC,EAAM92B,OAAuBwQ,QAAQjgB,IAGnD,GAFA/I,KAAKmhG,cAAclxD,UAAUX,EAAM92B,QAEhCzP,EACD/I,KAAK06F,UAAUn5F,IAAIwH,GACnB/I,KAAKohG,gCACA,CACL,MAAM,iBAACC,GAAoBrhG,KACxBqhG,GAAoBA,EAAiBC,mBAC/BD,EAAiBC,UACxBthG,KAAKq9B,KAAKkkE,WAAWC,gBAAgB,gCAAiC,CACpElmE,QAASt7B,KAAK8T,gBAAgB2tF,gBAAgBzhG,KAAKmJ,OAAOoyB,YAC1D+lE,UAAWD,EAAiBC,qBAQxCthG,KAAKohG,0BAA4BnnE,IAAS,KACxC,MAAM9vB,EAAO,IAAInK,KAAK06F,WACtB16F,KAAK06F,UAAU7uF,QAEf7L,KAAKiJ,mBAAmBy4F,sBAAsB1hG,KAAKmJ,OAAQgB,KAC1D,KAAM,GAAO,GAEb,mBAAoBgD,OAAQ,CAC7B,IAAIw0F,EAAY3hG,KAAK4M,WAAWxL,UAAUwgG,aACtCC,GAAW,EACXC,GAAO,EACPC,EAAW,EACXC,EAAO,EACPC,EAAM,EAEV,MAAMC,EAAc,KAClB,MAAMrgG,EAAS7B,KAAK4M,WAAWxL,UAAUwgG,aACnCjB,EAAiB3gG,KAAK4M,WAAW+zF,eACpC9+F,IAAW8/F,GAAeG,GAASnB,IACpCqB,GAAQL,EAAY9/F,GAOnBmgG,IACDhiG,KAAK4M,WAAWohC,WAAahrC,KAAKE,MAAM8+F,IAG1CL,EAAY9/F,EACZkgG,EAAW,EACXE,EAAM,EACND,EAAO,EACPH,GAAW,EACXC,GAAO,GAGHK,EAAa3tD,IACdytD,GAAK90F,OAAOqW,qBAAqBy+E,GACpCA,EAAM90F,OAAOoW,sBAAsBixB,EAAS0tD,EAAc,KACxDD,EAAM90F,OAAOoW,sBAAsB2+E,MAKjCE,EAAkB/yD,IACtB,GAAGyyD,EAED,YADAK,GAAU,GAIZ,MACMtgG,EADQwtC,EAAQ,GACDgzD,YAAYxgG,OAEjC,IAAI8/F,EAEF,YADAA,EAAY9/F,GAId,MAAMygG,EAAWX,EAAY9/F,EAC7B,IAAI8zB,EAAO2sE,EAAWN,EACtB,MAAMO,EAAQ5sE,EAAO,EAGrB,GAFAA,GAAQ4sE,GAEJV,IACFA,GAAW,EAMRS,EAAW,GAAKtiG,KAAK4M,WAAW+zF,gBAOjC,OALEqB,GAAQM,EAGVR,GAAO,OACPK,GAAU,GAWd,GANAJ,GAAYpsE,EAMTA,EAAM,CACP,MAAM6sE,EAAgBxiG,KAAK4M,WAAWohC,UAAYrY,EAClD31B,KAAK4M,WAAWohC,UAAYw0D,EAG9BL,GAAU,GAEVH,EAAOO,EACPZ,EAAY9/F,GAIS,IAAI4gG,eAAeL,GAC3B10D,QAAQ1tC,KAAKguD,mBAIxBsxC,qBACFt/F,KAAK0iG,sBACP1iG,KAAK0iG,oBAAsB,IAAI7J,GAAY74F,KAAK4M,YAAY,GAC5DQ,YAAW,KACTpN,KAAK0iG,oBAAoB1J,UACzBh5F,KAAK0iG,yBAAsBn8F,IAC1B,GAEHvG,KAAK0iG,oBAAoBjiD,QAyFtBkiD,6BACL3iG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,sBAAuBA,KAAK66F,iBAC/D76F,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAkBA,KAAK66F,iBAC1D76F,KAAKwP,eAAejO,IAAIvB,KAAKq9B,KAAKyW,UAAlC9zC,CAA6C,SAAUA,KAAK66F,iBAC5D76F,KAAKwP,eAAejO,IAAIvB,KAAKguD,iBAA7BhuD,CAA+C,YAAaA,KAAK46F,oBAG3DI,gBAAgBD,EAA4B93E,IAClD,QAAc83E,EAAe,aAAc93E,EAAS,IAAKA,OAAU1c,EAAY,KAC7Ew0F,EAAcv6F,UACb,GAYE49F,wBACL,MAAMwE,EAAaloF,OAAOgzC,KAAK1tD,KAAK25F,cAAcjvF,KAAI2sC,IAAMA,IAAG9sC,MAAK,CAACC,EAAGxF,IAAMA,EAAIwF,IAClF,IAAIq4F,EAGF,MAAM,UAAC70D,GAAahuC,KAAK4M,WAAWxL,UAEpC,GADoB4sC,EAAY,EAE9B,IAAI,MAAMwoB,KAAaosC,EAAY,CACjC,MAAME,EAAc9iG,KAAK25F,aAAanjC,GAChCusC,EAAcxL,GAAeuL,EAAY1hG,UAAWpB,KAAK4M,WAAWxL,WAC1E,GAAG2hG,GAAeA,EAAY/K,SAASp/D,IACrCiqE,EAAcC,EAAY7xE,SACrB,GAAG4xE,EACR,MAMR,GAAGA,IAAgB7iG,KAAKgjG,mBAAxB,CAIA,GAAGH,EAAa,CACd,MAAMI,GAAkDjjG,KAAKgjG,mBAC1DC,GACDJ,EAAYtiG,UAAUgB,IAAI,iBAG5BshG,EAAYtiG,UAAUgB,IAAI,aAEvB0hG,IACIJ,EAAYn0D,WACjBm0D,EAAYtiG,UAAUC,OAAO,kBAI9BR,KAAKgjG,oBAAsBhjG,KAAKgjG,qBAAuBH,GACxD7iG,KAAKgjG,mBAAmBziG,UAAUC,OAAO,aAG3CR,KAAKgjG,mBAAqBH,GAGrBK,oBACL,OAAOxoF,OAAOgzC,KAAK1tD,KAAK45B,SAAS/4B,OAASb,KAAK05F,YAAYx4F,KAGrDggG,qBAAqB1oF,EAAqBzP,GAChD/I,KAAK+5F,aAAax4F,IAAIwH,GACtB/I,KAAKihG,iBAAiBhxD,UAAUz3B,GAChCxY,KAAK85F,SAAS9pF,OAAOwI,GACrBxY,KAAKmjG,eAGCA,eACN,GAAGnjG,KAAKojG,YAAa,OAErB,MAAMvyE,EAAa7wB,KAAKm7F,gBACxBn7F,KAAKojG,YAAcv4F,EAAA,gCAAiC,KAClD,IAAIgmB,IAAc,OAClB,IAAI/nB,EAAQ9F,KAAKH,OAAOwH,MAAMC,KAAKtK,KAAK+5F,eAGxC,GAAG/5F,KAAK4M,WAAWvF,UAAUuZ,OAAQ,CACnC,MAAMyiF,EAAergG,KAAKH,OAAO6X,OAAOgzC,KAAK1tD,KAAK45B,SAASlvB,KAAInF,IAAMA,KAClEuD,GAASu6F,IACVv6F,EAAQ9F,KAAKH,IAAI7C,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UAAU7D,OAAS,EAAGA,IAI5G9I,KAAK85F,SAAS/0F,SAAQ,CAACgE,EAAKyP,KACvBzP,GAAOD,GACR9I,KAAKkhG,qBAAqB1oF,EAAQzP,MAItC,MAAMw6F,EAAyB,GAC/B,IAAI,MAAMx6F,KAAO/I,KAAK+5F,aAAc,CAClC,MAAM7zF,EAAqBlG,KAAKq9B,KAAK0oB,WAAWh9C,GAC7C/I,KAAKiJ,mBAAmBu6F,gBAAgBt9F,IACzCq9F,EAAaz7F,KAAKiB,GActB,OAVA/I,KAAKiJ,mBAAmBw6F,aAAazjG,KAAKmJ,OAAQo6F,GAElDvjG,KAAK+5F,aAAaluF,QAEf,OACD7L,KAAK0nB,IAAI,6BAA8B5e,GAKlC9I,KAAKiJ,mBAAmBy6F,YAAY1jG,KAAKmJ,OAAQL,EAAO9I,KAAKq9B,KAAK1wB,UAAUsB,OAAOJ,IACxF7N,KAAK0nB,IAAI3Z,MAAM,mBAAoBF,GACnC7N,KAAKiJ,mBAAmBy6F,YAAY1jG,KAAKmJ,OAAQL,EAAO9I,KAAKq9B,KAAK1wB,aACjE2Y,SAAQ,KACLuL,MACJ7wB,KAAKojG,iBAAc78F,EAEhBvG,KAAK+5F,aAAa74F,MACnBlB,KAAKmjG,sBAMNQ,yBACL3jG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,wBAAyBM,IAC1D,MAAM,OAAC6I,EAAM,KAAEgB,EAAI,OAAEi+E,GAAU9nF,EAC5B6I,IAAWnJ,KAAKmJ,QAEhBgB,IACGi+E,GACFpoF,KAAK4+F,oBAAoBz0F,OAM1By5F,4BACL,MAAMz8C,EAAW,KACfnnD,KAAKq9B,KAAK4gE,OAAO/tF,SAASlQ,KAAKiJ,mBAAmB+iD,4BAA4BhsD,KAAKmJ,QAAQjI,OAG7FlB,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAiB,EAAEmJ,OAAAA,EAAQJ,IAAAA,MACzDI,IAAWnJ,KAAKmJ,SAEnBnJ,KAAKsgG,uBAAuB,CAACv3F,IAC7Bo+C,QAGFnnD,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAoB,EAAEmJ,OAAAA,EAAQgB,KAAAA,MAC5DhB,IAAWnJ,KAAKmJ,SAEnBnJ,KAAK4+F,oBAAoBz0F,GACzBg9C,QAqXG08C,gBACL,GAAG7jG,KAAKu6F,mBAAmB15F,OAAQ,EACjC,EAAAmF,EAAA,GAAehG,KAAKu6F,oBAAoB,CAACxxF,EAAK5C,KAC5C,MAAM09C,EAAS7jD,KAAK45B,QAAQ7wB,GAC5B,IAAI+6F,GAAM,EACV,GAAGjgD,EAAQ,CACT,MAAMrkC,EAAOqkC,EAAOpkC,wBACpBqkF,EAAOtiE,GAAA,SAAoB,EAAKhiB,EAAKoZ,SAErB54B,KAAKq9B,KAAK0oB,WAAWh9C,GACzBk3B,UACV6jE,GAAM,GAIPA,GACD9jG,KAAKu6F,mBAAmBj0F,OAAOH,EAAK,MAIxCnG,KAAKu6F,mBAAmBhwF,MAAK,CAACC,EAAGxF,IAAMA,EAAIwF,IAE3C,MAAMzB,EAAM/I,KAAKu6F,mBAAmB1yF,MACpC7H,KAAKq9B,KAAKihE,aAAav1F,QAEvB/I,KAAKq9B,KAAKihE,eAYPyF,iBAAiBna,GACtB,IAAIjxE,EAAUgxE,GAAkB3pF,KAAK4M,WAAWxL,UAAWwoF,EAAc,UAkBzE,OAFGjxE,IAASA,GAAU,EAAAkK,GAAA,GAAgBlK,EAAS,WAExCA,EAGFymF,iBAAiBv5C,GACtB,MAAM30B,EAAQlxB,KAAKiJ,mBAAmB62F,uBAAuBj6C,GAC7D,IAAI,MAAO98C,KAAQmoB,EACjB,GAAGlxB,KAAK45B,QAAQ7wB,GAAM,CACpB,MAAMD,EAAQ9F,KAAKH,OAAOquB,EAAMw8B,QAChC,MAAO,CACL7J,OAAQ7jD,KAAK45B,QAAQ7wB,GACrBA,KAAMA,EACN7C,QAASlG,KAAKq9B,KAAK0oB,WAAWj9C,KAM/B02F,mBAAmBt5F,GACxB,IAAKA,EAA4B84F,WAAY,OAAOh/F,KAAK45B,QAAQ1zB,EAAQ6C,KACzE,MAAMi7F,EAAUhkG,KAAKo/F,iBAAkBl5F,EAA4B84F,YACnE,OAAOgF,MAAAA,OAAO,EAAPA,EAASngD,OAGXwK,sBAAsBxK,GAC3B,OAAOx5C,MAAMC,KAAKu5C,EAAOryC,iBAAiB,kBAGrCk9C,iBAAiB3lD,EAAa7C,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,IAClE,GAAG7C,EAAQ84F,YAAch/F,KAAKiJ,mBAAmB22F,eAAe15F,EAAQ84F,YAAYn+F,OAAS,EAAG,CAC9F,MAAM2J,EAAIxK,KAAKo/F,iBAAiBl5F,EAAQ84F,YACxC,GAAGx0F,EAED,OADAA,EAAEq5C,OAASr5C,EAAEq5C,OAAOtyC,cAAc,iCAAiCxI,QAAYyB,EAAEq5C,OAC1Er5C,EAIX,MAAMq5C,EAAS7jD,KAAK45B,QAAQ7wB,GAC5B,GAAI86C,EAEJ,MAAO,CAACA,OAAAA,EAAQ96C,IAAAA,EAAK7C,QAAAA,GAGf+9F,6BAA6Bl7F,GACnC,OAAO/I,KAAK45B,SAAQ,EAAAu9B,GAAA,GAAqBn3D,KAAK45B,SAASvnB,MAAKxB,I,MAC1D,QAAGA,EAAK9H,KACiB,QAAhB,EAAA/I,KAAK45B,QAAQ/oB,UAAG,eAAE5M,oBAIxBigG,gBAAgBtrE,EAAc6b,GAAW,GAE9C,IAAIz0C,KAAKmJ,QAEPnJ,KAAKq9B,KAAK2gE,gBACVh+F,KAAK8yC,4BACJla,IAAQ54B,KAAKmkG,sBAAwBnkG,KAAK4M,WAAWvF,UAAUuxB,OAC9DA,IAAQ54B,KAAKokG,yBAA2BpkG,KAAK4M,WAAWvF,UAAUuZ,QAEpE,OAIF,MAAM3a,EAAUyU,OAAOgzC,KAAK1tD,KAAK45B,SAASlvB,KAAImG,IAAOA,IAAItG,MAAK,CAACC,EAAGxF,IAAMwF,EAAIxF,IAC5E,GAAIiB,EAAQpF,OAEZ,GAAG+3B,EACE,OACD54B,KAAK0nB,IAAI,qCAAsCzhB,EAAQ,GAAI,SAAUA,EAAQA,EAAQpF,OAAS,GAAI4zC,GAOrFz0C,KAAKqkG,WAAWp+F,EAAQ,IAAI,OAAMM,OAAWA,EAAWkuC,OAClE,CAEL,MAAMH,EAAiBt0C,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UAGxF,IAA8C,IAA3C1G,EAAQga,QAAQq0B,EAAexrC,OAEhC,YADA9I,KAAKskG,UAAU,UAAU,GAIxB,OACDtkG,KAAK0nB,IAAI,uCAAwCzhB,EAAQA,EAAQpF,OAAS,GAAI4zC,GAGjEz0C,KAAKqkG,WAAWp+F,EAAQA,EAAQpF,OAAS,IAAI,GAAO,OAAM0F,EAAWkuC,IAwCjF8pD,YACLv+F,KAAK4M,WAAa,IAAI,KAAW,KAAM,KAAiB,KACxD5M,KAAKskG,UAAU,OAAO,GACtBtkG,KAAKskG,UAAU,UAAU,GAEzBtkG,KAAK4M,WAAWxL,UAAUkD,OAAOtE,KAAKw7F,WAatCx7F,KAAK4M,WAAW4lC,mBAAqBxyC,KAAKymC,SAC1CzmC,KAAK4M,WAAW23F,cAAgB,IAAMvkG,KAAKkkG,iBAAgB,GAC3DlkG,KAAK4M,WAAWK,iBAAmB,IAAMjN,KAAKkkG,iBAAgB,GAG3D,GAAAtnF,qBACD5c,KAAK4M,WAAWxL,UAAUf,iBAAiB,aAAa,KACnDL,KAAK65F,mBACNtrF,aAAavO,KAAK65F,oBACT75F,KAAKw7F,UAAUj7F,UAAUmT,SAAS,iBAC3C1T,KAAKw7F,UAAUj7F,UAAUgB,IAAI,kBAE9B,CAACyd,SAAS,IAEbhf,KAAK4M,WAAWxL,UAAUf,iBAAiB,YAAY,KACjDL,KAAKw7F,UAAUj7F,UAAUmT,SAAS,kBAInC1T,KAAK65F,oBACNtrF,aAAavO,KAAK65F,oBAGpB75F,KAAK65F,mBAAqB1sF,OAAOC,YAAW,KAC1CpN,KAAKw7F,UAAUj7F,UAAUC,OAAO,gBAChCR,KAAK65F,mBAAqB,IACzB,SACF,CAAC76E,SAAS,KAIVyhF,uBACL,MAAMnsD,EAAiBt0C,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UAClF7D,EAAQ9I,KAAKmJ,SAAW0B,EAAA,aAAiBypC,EAAekwD,UAAYlwD,EAAemwD,gBAIzF,IAAI,MAAMC,KAAS1kG,KAAKy5F,UACtB,GAAGiL,EAAQ,GAAKA,GAAS57F,EAAO,CAC9B,MAAM+6C,EAAS7jD,KAAK45B,QAAQ8qE,GAC5B,GAAG7gD,EAAQ,CACT,GAAGA,EAAOtjD,UAAUmT,SAAS,eAC3B,SAGFmwC,EAAOtjD,UAAUC,OAAO,UAAW,aAAc,eACjDqjD,EAAOtjD,UAAUgB,IAAI,WAGvBvB,KAAKy5F,UAAUzpF,OAAO00F,IAKrB9F,oBAAoBz0F,EAAgBw6F,GAAY,GACrD,IAAI1kE,GAAU,EACd91B,EAAKpF,SAAQgE,IACX,KAAKA,KAAO/I,KAAK45B,SAAU,OAE3BqG,GAAU,EAIV,MAAM4jB,EAAS7jD,KAAK45B,QAAQ7wB,UACrB/I,KAAK45B,QAAQ7wB,GACpB/I,KAAK05F,YAAY1pF,OAAOjH,GAErB/I,KAAKs6F,oBAAsBz2C,IAC5B7jD,KAAKs6F,kBAAoB,MAG3Bt6F,KAAKw+F,aAAa/e,aAAa57B,GAC5B7jD,KAAKihG,mBACNjhG,KAAKihG,iBAAiBhxD,UAAU4T,GAChC7jD,KAAK85F,SAAS9pF,OAAO6zC,IAEpB7jD,KAAKmhG,gBACNnhG,KAAKmhG,cAAclxD,UAAU4T,GAC7B7jD,KAAK06F,UAAU1qF,OAAOjH,IAGxB86C,EAAOrjD,SAGJR,KAAK4kG,sBAAwB77F,IAC9B/I,KAAK4kG,yBAAsBr+F,MAM3B05B,IAID0kE,GAAa3kG,KAAKq9B,KAAKyW,UAAUC,aAClC/zC,KAAKq9B,KAAKyW,UAAUiZ,mBAAmB/sD,KAAKmJ,OAAQgB,GAGtDo1C,EAAA,mBAAqC,EAAOpuB,IAC5CnxB,KAAKu/F,wBACLv/F,KAAKymC,YAGA65D,uBAAuBn2F,EAAgByvF,GAC5C,IAAI55F,KAAK4M,WAAWvF,UAAUuZ,OAAQ,CAEpC,MAAMo9E,EAAiBh+F,KAAKq9B,KAAK2gE,eACjC,GAAGA,EAAgB,CACjB,MAAMntE,EAAa7wB,KAAKm7F,gBACxB6C,EAAej8F,MAAK,KACd8uB,KACJ7wB,KAAKsgG,uBAAuBn2F,MAIhC,OAGCnK,KAAKq9B,KAAK1wB,WACXxC,EAAOA,EAAKL,QAAOf,IACjB,MACM87F,EADU7kG,KAAKq9B,KAAK0oB,WAAWh9C,GACbmgF,SACxB,OAAO2b,IAAYA,EAAQzI,iBAAmByI,EAAQjH,mBAAqB59F,KAAKq9B,KAAK1wB,aAIzFxC,EAAOA,EAAKL,QAAOf,IAAQ/I,KAAK45B,QAAQ7wB,KAMpC6wF,IACFA,EAAe55F,KAAK45F,gBACjB55F,KAAK0+F,mBACN1+F,KAAK0+F,oBAAsB1+F,KAAK8kG,iBAChC9kG,KAAK0+F,oBAAsB1+F,KAAKw7F,YAIpC,MAAM3qE,EAAa7wB,KAAKm7F,gBACxB,IACI4J,EADAC,GAAkB,EAEtB,IAAIhlG,KAAK26F,gBAAiB,CACxB,MAAM,aAACsK,EAAY,aAAEpzC,GAAgB7xD,KAAK4M,WAAWxL,UACrD4jG,EAAkBC,IAAiBpzC,EAShCmzC,IAIDD,EAAe/kG,KAAKw7F,UACpBuJ,EAAazhG,MAAM4hG,WAAaD,EAAe,KAC/CjlG,KAAK4M,WAAWohC,UAAY6jB,EAC5B7xD,KAAK26F,iBAAkB,GAI3B,MAAMtyF,EAAUrI,KAAK6gG,qBAAqB12F,GAAM,GAAO,GACpDyvF,GACDvxF,EAAQtG,MAAK,KACX,IAAI8uB,IAAc,OAKlB,IAAIgzB,EACkB,cAAnB7jD,KAAKq9B,KAAKp9B,OACX4jD,EAAS7jD,KAAK45B,QAAQ52B,KAAKH,OAAOsH,KAGpC,MAAM9B,EAAUw7C,EAAS7jD,KAAKmlG,kBAAkBthD,GAAU7jD,KAAK2+F,cAC5DqG,GACD38F,EAAQtG,MAAK,KACR8uB,KAAgBm0E,IACjBD,EAAazhG,MAAM4hG,WAAa,GAChCllG,KAAK26F,iBAAkB,SAc5BmK,gBACL,MAAMM,EAAgBplG,KAAKqlG,mBAC3B,GAAGD,EACD,OAAOA,EAAcruD,iBAIlBuuD,eACL3sF,EACAkgB,EACA4K,EACA8hE,GAEA,MAAM1hD,GAAS,EAAAhhC,GAAA,GAAgBlK,EAAS,UAExC,IAAI6sF,EAED3hD,GAAuB,QAAbhrB,IAAsB,EAAAstB,GAAA,GAAWtC,MAAa7jD,KAAKuuF,kBAAoB,EAAI,KAGpFiX,EAFgB3hD,EAAO5/C,eAkB3B,MAAMwhG,EAAoBzlG,KAAKq9B,KAAKt9B,MAAM2lG,cAAgB1lG,KAAKq9B,KAAKt9B,MAAM2lG,aAAanlG,UAAUmT,SAAS,uBAA0B1T,KAAKq9B,KAAKj8B,UAAUb,UAAUmT,SAAS,sBAC3K,OAAO1T,KAAK4M,WAAWu2B,kBAAkB,CACvCxqB,QAAAA,EACAkgB,SAAAA,EACA8sE,OATW,EAUXliE,eAAAA,EACA8hE,cAAAA,EACAK,KAAM,IACNC,cAAeJ,EAAmB,EAAEjmF,KAAAA,MAGlC,IAAI3d,EAAS2/B,GAAA,SAIb,OAFA3/B,GAAU7B,KAAKguD,iBAAiB4D,UAChC/vD,GAAUkpB,EAAA,aAAuByW,GAAA,SAAoB,IAAM,GAAK,GACzD3/B,QAKL0E,EACJi/F,oCAAAA,IAIG7G,cACL,OAAO3+F,KAAKmlG,kBAAkBnlG,KAAKw7F,WAGxB2J,kBAAkBthD,G,0CAK7B,GAAGA,EAAQ,CACT7jD,KAAK0+F,kBAAoB76C,EACzB,MAAMhzB,EAAa7wB,KAAKm7F,gBAExB,SADMn7F,KAAKslG,eAAezhD,EAAQ,WAAOt9C,OAAWA,IAChDsqB,IAAc,OAClB7wB,KAAK0+F,uBAAoBn4F,MAKrB8+F,mBACN,IAAkBS,EAAdC,EAAW,EACf,IAAI,MAAMxgG,KAAKvF,KAAK25F,aAAc,CAChC,MAAMmJ,EAAc9iG,KAAK25F,aAAap0F,GACnCu9F,EAAYkD,eAAiBD,IAC9BD,EAAWhD,EAAY1hG,UACvB2kG,EAAWjD,EAAYkD,gBAI3B,OAAOF,EAGI3G,qBAAqBt7C,G,0CAChC,GAAG7jD,KAAK8kG,kBAAoBjhD,EAE1B,OAAO7jD,KAAK2+F,iBAITyB,gBAAgBznF,GACrB,MAAMstF,EAAa,mBAChBttF,EAAQqQ,QAAQi9E,KACjB13F,cAAcoK,EAAQqQ,QAAQi9E,IAC9BttF,EAAQpY,UAAUC,OAAO,kBACpBmY,EAAQyqB,aAGfzqB,EAAQpY,UAAUgB,IAAI,kBACtBoX,EAAQqQ,QAAQi9E,GAAc,GAAK74F,YAAW,KAC5CuL,EAAQpY,UAAUC,OAAO,yBAClBmY,EAAQqQ,QAAQi9E,KACtB,KAGEC,0BAA0BhgG,EAAcU,GAC7C,MAAMimB,EAAO,IAAIwtB,KAAoB,IAAfn0C,EAAQ2mB,MAC9BA,EAAK4pC,SAAS,EAAG,EAAG,GACpB,MAAME,EAAgB9pC,EAAK+pC,UAC3B,IAAI52D,KAAK25F,aAAahjC,GAAgB,CACpC,IAAIM,EAEJ,MAAMkvC,EAAQ,IAAI9rD,KAClB8rD,EAAM1vC,SAAS,EAAG,EAAG,EAAG,GAExB,MAAM1rD,EAAiC,cAAnB/K,KAAKq9B,KAAKp9B,KAE9B,GAAGkmG,EAAMvvC,YAAc/pC,EAAK+pC,UAC1BK,GAAc,IAAArrD,MAAKb,EAAc,8BAAgC,mBAC5D,GAAGA,GAAe7E,EAAQ2mB,OAASyqE,GACxCrgC,GAAc,IAAArrD,MAAK,mCACd,CACL,MAAMhM,EAAsC,CAC1C8iF,IAAK,UACL5rB,MAAO,QAGNjqC,EAAKkqC,gBAAkBovC,EAAMpvC,gBAC9Bn3D,EAAQo3D,KAAO,WAGjBC,EAAc,IAAI,0BAAqB,CACrCpqC,KAAAA,EACAjtB,QAAAA,IACC+Y,QAEA5N,IACDksD,GAAc,IAAArrD,MAAK,yBAA0B,CAACqrD,KAIlD,MAAMpT,EAASxiD,SAASC,cAAc,OACtCuiD,EAAOv4C,UAAY,yBACnB,MAAM86F,EAAgB/kG,SAASC,cAAc,OAC7C8kG,EAAc7lG,UAAUgB,IAAI,kBAC5B,MAAM8kG,EAAahlG,SAASC,cAAc,OAC1C+kG,EAAW9lG,UAAUgB,IAAI,eAEzB8kG,EAAW/hG,OAAO2yD,GAElBmvC,EAAc9hG,OAAO+hG,GACrBxiD,EAAOv/C,OAAO8hG,GAGd,MAAMhlG,EAAYC,SAASC,cAAc,WACzCF,EAAUkK,UAAY,qBACtBlK,EAAUkD,OAAOu/C,GAEjB7jD,KAAK25F,aAAahjC,GAAiB,CACjC1lC,IAAK4yB,EACLziD,UAAAA,EACA4kG,eAAgBn5E,EAAK+pC,WAGvB,MAAMM,GAAiB,EAAAC,GAAA,GAAqBn3D,KAAK25F,aAAc,OAC/D,IAA2Cx1F,EAAvCoB,EAAI,EAAG1E,EAASq2D,EAAer2D,OACnC,KAAM0E,EAAI2xD,EAAer2D,SAAU0E,EAAG,CACpC,MAAM+M,EAAI4kD,EAAe3xD,GAEzB,GADApB,EAAenE,KAAK25F,aAAarnF,GAAGlR,UACjCu1D,EAAgBrkD,EACjB,MAID/M,IAAM1E,GAAUsD,IACjBA,EAAeA,EAAa04B,oBAG1B14B,EAGFnE,KAAKw7F,UAAUr3F,aAAa/C,EAAW+C,GAFvCnE,KAAKw7F,UAAUl3F,OAAOlD,GAKrBpB,KAAKuuF,mBACNvuF,KAAKuuF,kBAAkBxD,2BAA2B3pF,GAItD,OAAOpB,KAAK25F,aAAahjC,GAGpB2vC,UAGLtmG,KAAK4M,WAAW23F,cAAgBvkG,KAAK4M,WAAWK,iBAAmBjN,KAAK4M,WAAW4lC,mBAAqB,KAExGxyC,KAAKwP,eAAeS,YAEpBjQ,KAAKyuB,cAAc5iB,QACnB7L,KAAKihG,kBAAoBjhG,KAAKihG,iBAAiBhW,aAC/CjrF,KAAKmhG,eAAiBnhG,KAAKmhG,cAAclW,aACzCjrF,KAAKuuF,mBAAqBvuF,KAAKuuF,kBAAkBtD,oBAE1CjrF,KAAKyuB,cACZzuB,KAAKihG,yBAA2BjhG,KAAKihG,iBACrCjhG,KAAKmhG,sBAAwBnhG,KAAKmhG,cAClCnhG,KAAKuuF,0BAA4BvuF,KAAKuuF,kBAGjCpjF,QAAQo7F,GAAa,GAC1BvmG,KAAK45B,QAAU,GAEf55B,KAAKskG,UAAU,OAAO,GACtBtkG,KAAKskG,UAAU,UAAU,IAGzB,SAAqBtkG,KAAK4M,WAAWxL,YAGrC,gBAEmBmF,IAAhBgzF,KACDA,GAAcD,IAGhBt5F,KAAK05F,YAAY7tF,QACjB7L,KAAK25F,aAAe,GACpB35F,KAAKw+F,aAAarzF,UAClBnL,KAAKy5F,UAAU5tF,QACf7L,KAAKypF,WAAW5oF,OAAS,EACzBb,KAAKyuB,cAAc5iB,QAGhB06F,IACDvmG,KAAK4M,WAAWxL,UAAU0vB,YAAc,IAG1C9wB,KAAKs6F,kBAAoB,KACzBt6F,KAAKwmG,sBAAuB,EAE5BxmG,KAAKm6F,cAAct5F,OAAS,EAC5Bb,KAAKk6F,qBAAuB,KAE5Bl6F,KAAKmkG,qBAAuBnkG,KAAKokG,6BAA0B79F,EAC3DvG,KAAKymG,qBAAkBlgG,EACvBvG,KAAK0mG,gCAA6BngG,EAE/BvG,KAAKuuF,mBACNvuF,KAAKuuF,kBAAkBtD,aAGtBjrF,KAAKihG,mBACNjhG,KAAKihG,iBAAiBhW,aACtBjrF,KAAK85F,SAASjuF,QACd7L,KAAK+5F,aAAaluF,QAClB7L,KAAKojG,iBAAc78F,GAGlBvG,KAAKmhG,gBACNnhG,KAAKmhG,cAAclW,aACnBjrF,KAAK06F,UAAU7uF,SAGjB7L,KAAKg6F,eAAiBh6F,KAAKi6F,kBAAoB,EAE/Cj6F,KAAK6wB,WAAWxX,QAEhBrZ,KAAK2mG,qBAAkBpgG,EACvBvG,KAAK4mG,4BAAyBrgG,EAC9BvG,KAAK4kG,yBAAsBr+F,EAC3BvG,KAAKqhG,sBAAmB96F,EACxBvG,KAAKgjG,wBAAqBz8F,EAE1BvG,KAAK0+F,uBAAoBn4F,EAGzBvG,KAAK26F,iBAAkB,EAIpB36F,KAAK65F,qBACNtrF,aAAavO,KAAK65F,oBAClB75F,KAAK65F,mBAAqB,GAIvBpqD,QAAQtmC,EAAgBkzF,EAAoBpK,G,MAIjD,IAAI9oF,EAGF,OAFAnJ,KAAKmL,SAAQ,GACbnL,KAAKmJ,OAASA,EACP,KAGT,MAAM09F,EAAW7mG,KAAKmJ,SAAWA,EAM3Bi+E,EAAWpnF,KAAKq9B,KAAKp9B,MAEX,cAAbmnF,GAA4BpnF,KAAKq9B,KAAKypE,gBACvCzK,EAAY,GAGd,MAAM/nD,EAAiBt0C,KAAKs0C,eAAiBt0C,KAAKiJ,mBAAmBq6F,kBAAkBn6F,EAAQnJ,KAAKq9B,KAAK1wB,UACzG,IAAIo6F,EAA0B,WAAb3f,EAAwBpnF,KAAKiJ,mBAAmB+9F,eAAe79F,GAAQL,MAAiC,QAAzB,EAAA9I,KAAKs0C,eAAexrC,aAAK,QAAI,EAC7H,MAAMm+F,OAAyB1gG,IAAd81F,EAOjB,IAAI6K,EACeC,EAAiEC,EAAhF5C,EAAY,EAChB,IAAIyC,EAKF,GAJIJ,IACFM,EAAgBnnG,KAAKq9B,KAAKs+D,aAAa0L,qBAAqBrnG,KAAKq9B,OAGhE8pE,QAEI,GAAGJ,EAAY,CACpBvC,EAAYxkG,KAAKiJ,mBAAmBq+F,qBAAqBn+F,EAAQnJ,KAAKq9B,KAAK1wB,UAC3E,MAAMmI,EAAS9U,KAAKiJ,mBAAmBs+F,cAAcp+F,GACrD,IAA4Bq7F,GAAcqC,GAAc/xF,GAAkC,IAAxBA,EAAO0yF,aASvEnL,EAAY0K,MATgF,CAC5F,MAAMU,EAAanzD,EAAeruC,QAAQyhG,gBAAgBlD,GACvDiD,GAAcA,EAAW7mG,MAAMmhC,MAAM,eACtCqlE,EAAwBK,EAAW7mG,MAAM6mG,EAAWjzE,OAAS,KAAOizE,EAAW7mG,MAAM,IAAM4jG,GAG7F0C,GAAmBD,EACnB5K,EAAYmI,GAQlB,MAAMmD,EAAStL,IAAc0K,GAEvB,WAACn6F,GAAc5M,KAErB,GAAG6mG,EAAU,CACX,MAAMp4C,EAAUzuD,KAAK0uD,iBAAiB2tC,GACtC,GAAG5tC,EAeD,OAdGw4C,GACDjnG,KAAKslG,eAAe72C,EAAQ5K,OAAQ,UACpC7jD,KAAKogG,gBAAgB3xC,EAAQ5K,QAC7B7jD,KAAKq9B,KAAK/sB,cAAc,UAAW+rF,GAAW,IACtC0K,IAAeY,IAEvB/6F,EAAWohC,UAAYphC,EAAWilD,aAClC7xD,KAAKq9B,KAAK/sB,cAAc,UAAW+rF,GAAW,SAG9B91F,IAAf0rF,GACDjyF,KAAKq9B,KAAKt9B,MAAM6nG,cAAc3V,GAGzB,UAGNjyF,KAAKmJ,SACNnJ,KAAKyuB,cAAckxB,UAAYA,GAC/B3/C,KAAKq9B,KAAKkkE,WAAWsG,WAAW7nG,KAAKq9B,KAAKzD,QAAQnL,cAAckxB,UAGlE3/C,KAAKmJ,OAASA,EACdnJ,KAAKu6F,mBAAmB15F,OAAS,EAEjCb,KAAKy6F,aAAe,CAClBqN,wBAAyB9nG,KAAKoc,gBAAgB2rF,WAAW5+F,IAAWnJ,KAAKiV,gBAAgB+yF,MAAM7+F,IAIhG,OACDnJ,KAAK0nB,IAAI,kBAAmBve,EAAQnJ,KAAKs0C,eAAgB+nD,EAAW0K,GAItE,MAAMkB,EAAgBb,MAAAA,EAAAA,EAA0BO,GAAuB,cAAbvgB,GAA4BpnF,KAAKq9B,KAAKypE,aAAe,EAAIC,EAQnH,IAAImB,EAAc,EAClB,GAAGrB,EAAU,CACX,IAAIp1F,EAAKzR,KAAK+jG,iBAAiB,UAE5BtyF,IACDy2F,GAAez2F,EAAGuX,QAAQjgB,KAGzBm/F,GAAe,IAChBA,EAAcllG,KAAKH,OAAO6X,OAAOgzC,KAAK1tD,KAAK45B,SAASlvB,KAAI3B,IAAQA,WAGlE/I,KAAKw6F,aAAc,EAGrB,MAAM2N,EAAenoG,KAAKw7F,UAC1Bx7F,KAAKmL,UACL,MAAMqwF,EAAYx7F,KAAKw7F,UAAYn6F,SAASC,cAAc,OAU1D,IAAIiH,EATDs+F,GACDrL,EAAUlwF,UAAY68F,EAAa78F,UACnCkwF,EAAUj7F,UAAUC,OAAO,gBAAiB,iBAE5Cg7F,EAAUj7F,UAAUgB,IAAI,iBAG1BvB,KAAKyuB,cAAc8jC,OAMjBhqD,EAHE4+F,EAGO,CACP9+F,SAAS,WAA2BtG,MAAK,IAChC/B,KAAK6gG,qBAAqBsG,EAAch9F,MAAM,GAAM,OAAO5D,KAEpE+V,QAAQ,GANDtc,KAAKqkG,WAAWhI,GAAW,EAAMsL,EAAQM,GAUpD,MAAM,QAAC5/F,EAAO,OAAEiU,GAAU/T,EAGtB+T,GACEuqF,IACFj6F,EAAWxL,UAAU0vB,YAAc,GAEnC9wB,KAAKq9B,KAAKqjE,iBAAiBuG,EAAUU,EAAQtL,EAAWpK,GACxDjyF,KAAK+nB,UAAU+G,OAAO9uB,KAAKguD,mBAQ/BzO,EAAA,YAA+BpuB,IAC/B,MAAM6sE,EAAiB31F,EAAQtG,MAAK,KA8BlC,GA3BGua,EACGuqF,GACF7mG,KAAKq9B,KAAKqjE,iBAAiBuG,EAAUU,EAAQtL,EAAWpK,GAG1DjyF,KAAK+nB,UAAUs3B,SAGdr/C,KAAK4mG,yBACN5mG,KAAK4mG,yBACL5mG,KAAK4mG,4BAAyBrgG,GAKhCqG,EAAWmxF,oBAAsB,EACjCnxF,EAAWusF,mBAAqB,GAChC,EAAAnrF,EAAA,GAAepB,EAAWxL,UAAWo6F,GAErCj8C,EAAA,cAAiCpuB,IACjCouB,EAAA,mBAAqC,EAAOpuB,IAG1CnxB,KAAKyuB,cAAcynE,SAIlBiR,EACDv6F,EAAWohC,UAAYphC,EAAWusF,mBAAqBgO,EAAcvuE,SAYhE,GAAImuE,GAAcY,GAAWV,EAAU,CAC5C,MAAMmB,EAASF,EAAc,IAAMA,EAAc7L,GAAaA,EAAY,IACtE+L,GAAUvB,EACZj6F,EAAWohC,UAAYphC,EAAWusF,mBAAqB,MAC/CiP,IACRx7F,EAAWohC,UAAYphC,EAAWusF,mBAAqB,GAGzD,MAAMkP,EAAqBroG,KAAK0uD,iBAAiB2tC,GACjD,IAAIx4C,EAAuBqjD,GAAmBlnG,KAAKs6F,oBAAsB+N,MAAAA,OAAkB,EAAlBA,EAAoBxkD,SACzFA,MAAAA,OAAM,EAANA,EAAQ5/C,iBACV4/C,EAAS7jD,KAAKikG,6BAA6B5H,IAI1Cx4C,IACD7jD,KAAKslG,eAAezhD,EAAQqjD,EAAkB,QAAU,SAAWL,OAAmCtgG,EAAxB,aAC1E2gG,GACFlnG,KAAKogG,gBAAgBv8C,SAIzBj3C,EAAWohC,UAAYphC,EAAWusF,mBAAqB,MAGzDn5F,KAAKymC,WAEL,MAAM5V,EAAa7wB,KAAKm7F,gBAClBmN,EAAkB9kG,QAAQC,IAAI,CAACu6F,GAAgB,aAQrD,GAPAsK,EAAgBvmG,MAAK,KACnB6K,EAAW8xB,sBAGb1+B,KAAKq9B,KAAK/sB,cAAc,UAAW+rF,GAAYsL,GAEjB3nG,KAAKoc,gBAAgBksB,UAAUn/B,GACnC,CACxB,MAAM0nB,EAAa7wB,KAAKm7F,gBAClBoN,EAAiB,KACrB,IAAI13E,IAAc,OAElB,MAAM1mB,EAAiB,GACvB,IAAI,MAAMpB,KAAO/I,KAAK45B,QAAS,CAC7B,IAAI1zB,EAAqBlG,KAAKq9B,KAAK0oB,YAAYh9C,GAC9B,YAAd7C,EAAQoD,IAIXpD,EAAUlG,KAAKiJ,mBAAmBiyF,sBAAsBh1F,GACxDiE,EAAKrC,KAAK5B,EAAQ6C,OAGJoB,EAAKtJ,OAASb,KAAKmnC,oBAAoBqhE,qBAAqBxoG,KAAKmJ,OAAQgB,GAAQ3G,QAAQ2E,WACjGpG,MAAK,KACXqL,WAAWm7F,EAAgB,SAI/B/kG,QAAQC,IAAI,CAAC6kG,GAAiB,YAA4B,EAAAjmG,GAAA,GAAM,OAAON,MAAK,KAC1EwmG,OAIJ,MAAME,EAAoBzoG,KAAKiJ,mBAAmBy/F,sBAAsBv/F,GA4DxE,GA3DqBg+F,GAAiBsB,EAOpCH,EAAgBvmG,MAAK,KACnB,GAAI8uB,MAIJjkB,EAAW8xB,mBAER+pE,GAAmB,CACpB,MAAM/oE,EAAI,KACR1/B,KAAKymG,gBAAkB,IAAIjjG,SAAe2E,IACpC0oB,KAAiB7wB,KAAKiJ,mBAAmBy/F,sBAAsBv/F,GAKnEnJ,KAAKiJ,mBAAmB0/F,cAAcx/F,EAAQnJ,KAAKq9B,KAAK1wB,UAAU5K,MAAMuyC,IACtE,IAAIzjB,MAAiByjB,EAEnB,YADAnsC,IAIF,MACMygG,EADQt0D,EAAeruC,QAAQrF,MACXmhC,MAAM,aAC7Bn1B,EAAWvF,UAAUuZ,QAAUhU,EAAWvF,UAAUuZ,SAAWgoF,IAChE5oG,KAAKskG,UAAU,SAAUsE,GACzB5oG,KAAKymC,YAGPr5B,WAAWsyB,EAAG,KACdv3B,OAlBAA,OAoBDmd,SAAQ,KACTtlB,KAAKymG,qBAAkBlgG,MAIxBsgG,EACDz5F,WAAWsyB,EAAG,KAEdA,QA3CF28D,IAAar8F,KAAK45B,QAAQmtE,IAAe1K,IAAc0K,GACzD/mG,KAAKskG,UAAU,UAAU,GAgD7BtkG,KAAK0nB,IAAI,mBAAoB9a,EAAWvF,UAAUuZ,QAG/ChU,EAAWvF,UAAUuZ,QAAUmmF,IAAe/mG,KAAK85F,SAAS54F,MAC7DlB,KAAK6oG,oBAGS,SAAbzhB,EAAqB,CACtB,MAAMtyE,EAAS9U,KAAKiJ,mBAAmBs+F,cAAcp+F,IAClD2L,MAAAA,OAAM,EAANA,EAAQkG,OAAO8tF,cAChB9oG,KAAKiJ,mBAAmB8/F,iBAAiB5/F,GAAQ,OAUpD8E,OAAMJ,IAGP,MAFA7N,KAAK0nB,IAAI3Z,MAAM,4BAA6BF,GAC5C7N,KAAK+nB,UAAUs3B,SACTxxC,KAGR,MAAO,CAACyO,OAAAA,EAAQjU,QAAS21F,GAGpB6K,oBACL,GAAsB,SAAnB7oG,KAAKq9B,KAAKp9B,MAAsC,eAAnBD,KAAKq9B,KAAKp9B,KAAuB,CAC/D,MAAM6K,EAAU9K,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UACjF3M,KAAKiJ,mBAAmBy6F,YAAY1jG,KAAKmJ,OAAQ2B,EAAQhC,MAAO9I,KAAKq9B,KAAK1wB,UAAU,IAIjF+zF,mBACL,MAAMp4D,EAAYtoC,KAAKoc,gBAAgBksB,UAAUtoC,KAAKmJ,QAChD6/F,EAAWhpG,KAAKq9B,KAAK4iE,UAE3BjgG,KAAKw7F,UAAUj7F,UAAUsD,OAAO,aAAcmlG,GAC9ChpG,KAAKguD,iBAAiBztD,UAAUsD,OAAO,wBAAyBmlG,GAEhEhpG,KAAKw7F,UAAUj7F,UAAUsD,OAAO,UAAW7D,KAAKq9B,KAAK0qE,cACrD/nG,KAAKw7F,UAAUj7F,UAAUsD,OAAO,aAAcykC,GAGzC2gE,oBAAoB/iG,EAAc29C,EAAqBj9C,EAAkBk8B,GAY9E,OAFA9iC,KAAKm6F,cAAcryF,KAAK,CAAC5B,QAAAA,EAAS29C,OAAAA,EAAQj9C,QAAAA,EAASk8B,SAAAA,IAE5C9iC,KAAK4gG,0BAGPA,0BACL,OAAG5gG,KAAKk6F,uBAAyBl6F,KAAKm6F,cAAct5F,OAAe2C,QAAQ2E,UAEpEnI,KAAKk6F,qBAAuB,IAAI12F,SAAQ,CAAC2E,EAASqnB,KACvDpiB,YAAW,KACT,MAAM87F,EAAQlpG,KAAKm6F,cAAcv5F,QACjCZ,KAAKm6F,cAAct5F,OAAS,EAE5B,MAAMiiC,EAAWomE,EAAMzkG,QAAO,CAACC,GAAMo+B,SAAAA,MAAep+B,EAAIoD,QAAQg7B,GAAWp+B,IAAM,IAQjF1E,KAAK0nB,IAAI,mBAAoBob,EAAUomE,EAAOlpG,KAAK8yC,4BACnD,MAAMjiB,EAAa7wB,KAAKm7F,gBACxB33F,QAAQC,IAAIq/B,GAAU/gC,MAAK,KACzB,IAAI8uB,IACF,KAAM,yCAGL7wB,KAAKo6F,uBACNp6F,KAAKo6F,wBAGJp6F,KAAKq6F,iCACNr6F,KAAKq6F,kCAGP6O,EAAMnkG,SAAQ,EAAEmB,QAAAA,EAAS29C,OAAAA,EAAQj9C,QAAAA,MAC/B5G,KAAKy+F,kBAAkB56C,EAAQ39C,EAASU,MAIxCuB,IAEFnI,KAAKk6F,qBAAuB,KAEzBl6F,KAAKm6F,cAAct5F,QACpBb,KAAK4gG,0BAGP5gG,KAAKmpG,wBAEJl7F,MAAMuhB,KACR,MAMAivE,kBAAkB56C,EAAqB39C,EAAmDU,GAC/F,GAAGV,EAAQ8U,OAAOouF,MAEhB,YADAppG,KAAKw7F,UAAWt1F,EAA4B8U,OAAO0sE,UAAY,SAAW,WAAW7jC,GAIvF,MAAMi/C,EAAc9iG,KAAKkmG,0BAA0BhgG,EAASU,GAC5D,GAAsB,cAAnB5G,KAAKq9B,KAAKp9B,MAA2C,WAAnBD,KAAKq9B,KAAKp9B,KAAiC,CAC9E,MAAMu0B,EAASx0B,KAAKuuF,kBAAoB,EAAI,EAC5C,IAAI39D,EAAWvmB,MAAMC,KAAKw4F,EAAY1hG,UAAUwvB,UAAUhwB,MAAM4zB,GAC5DjvB,EAAI,EAAG26E,EAA0B,EACrC,KAAM36E,EAAIqrB,EAAS/vB,SAAU0E,EAAG,CAC9B,MAAM+M,EAAIse,EAASrrB,GACbixD,GAAalkD,EAAE0W,QAAQwtC,UAC7B,GAAGtwD,EAAQ2mB,KAAO2pC,EAChB,MAKF,GAJUtwD,EAAQ2mB,OAAS2pC,IACzB0pB,GAA2B5tE,EAAE0W,QAAQjgB,KAGpCm3E,GAA2Bh6E,EAAQ6C,IAAMm3E,EAC1C,MAKJ,IAAI/4E,EAAQqtB,EAASjvB,EAQrBygD,GAAuBnC,EAAQi/C,EAAY1hG,UAAW+F,QAEnDP,EACDk8F,EAAY1hG,UAAU+C,aAAa0/C,EAAQi/C,EAAY1hG,UAAUwvB,SAAS5wB,KAAKuuF,kBAAoB,EAAI,GAAGlqF,aAE1Gy+F,EAAY1hG,UAAUkD,OAAOu/C,GAIhB,YAAd39C,EAAQoD,GAAoBpD,EAAQE,QAAUizF,GAAmBxvF,IAAI3D,EAAQE,OAAOkD,GACrFtJ,KAAKw+F,aAAa5e,UAAU/7B,EAAQ39C,EAASU,GAE7Ci9C,EAAOtjD,UAAUgB,IAAI,iBAAkB,iBAIpC45F,cAAckO,GACnB,OAAOrpG,KAAK6wB,WAAWnf,IAAI23F,GAIrBC,cAAcpjG,EAAmDU,GAAU,EAAO2iG,GAAiB,EAAO1lD,EAAsB,KAAMw7C,GAAiB,G,QAI7J,IAAIx7C,GAAU7jD,KAAK45B,QAAQ1zB,EAAQ6C,KACjC,OAGF,MAAM4+E,EAA0B,YAAdzhF,EAAQoD,EACpBu8C,EAAU8hC,GAAazhF,EAAQ84F,WAG/BwK,EAA6C,WAAnBxpG,KAAKq9B,KAAKp9B,KAC1C,GAAGiG,EAAQ+5B,QAAS,OACf,GAAG4lB,GAAW2jD,EAAyB,CAC1C,MAAM1+F,EAAU9K,KAAKiJ,mBAAmB62F,uBAAuBj6C,GACzD/8C,EAAQ9F,KAAKH,OAAOiI,EAAQ4iD,QAClC,GAAGxnD,EAAQ6C,IAAMD,EACf,OAIJ,MAAMK,EAASnJ,KAAKmJ,OAEdsgG,EAAMvjG,EAAQuH,SAAW5C,EAAA,cAAmB3E,EAAQ8U,OAAOiP,KAAOjqB,KAAKoc,gBAAgBstF,YAAYvgG,GAEnGu/E,EAAarnF,SAASC,cAAc,OAK1C,IAAImnF,EACAkhB,EAGJ,GARAjhB,EAAWnoF,UAAUgB,IAAI,WAQrBsiD,EAsBG,CACL,MAAMpD,EAAO,CAAC,iBAAkB,iBAAkB,iBAC5CmpD,EAAgB/lD,EAAOv4C,UAAU00C,MAAM,KACvC6pD,EAAa,CAAC,UAAUpkG,OAAOg7C,EAAK32C,QAAOmuB,GAAK2xE,EAAcrqE,SAAStH,MAC7E4rB,EAAOv4C,UAAYu+F,EAAWhhF,KAAK,KAEnC8gF,EAAiB9lD,EAAO9M,iBACpB4yD,EAAeppG,UAAUmT,SAAS,4BACpCi2F,EAAiB9lD,EAAOtyC,cAAc,4BAGxCk3E,EAAkBkhB,EAAe9/E,kBACjC4+D,EAAgB3iF,UAAY,GAC5B2iF,EAAgBnlF,MAAMsW,QAAU,GAChC+vF,EAAe7jG,UAAY,GAC3B6jG,EAAe3kF,YAAYyjE,GAE3B,MAAMqhB,EAAkBH,EAAermG,MAAMwmG,gBAC7CH,EAAermG,MAAMsW,QAAU,GAC/B+vF,EAAermG,MAAMwmG,gBAAkBA,EAEpCjmD,IAAW7jD,KAAKs6F,mBACjBz2C,EAAOtjD,UAAUgB,IAAI,mBAIvB,MAAMwoG,GAAelmD,EAAO76B,QAAQjgB,KACnB7C,EAAQ6C,MAAQghG,WAMxB/pG,KAAK45B,QAAQmwE,GACpB/pG,KAAK05F,YAAY1pF,OAAO+5F,SAvD1BJ,EAAiBtoG,SAASC,cAAc,OACxCqoG,EAAeppG,UAAUgB,IAAI,0BAE7BknF,EAAkBpnF,SAASC,cAAc,OACzCmnF,EAAgBloF,UAAUgB,IAAI,mBAE9BsiD,EAASxiD,SAASC,cAAc,QACzBf,UAAUgB,IAAI,UACrBooG,EAAe3kF,YAAYyjE,GAC3B5kC,EAAO7+B,YAAY2kF,GAEfF,GAAQvjG,EAAQ8U,OAAOiP,MAAOjqB,KAAKihG,mBAEpB/6F,EAAQ8U,OAAOgvF,QAC9BhqG,KAAKiJ,mBAAmBu6F,gBAAgBt9F,SACLK,IAAlCvG,KAAKs0C,eAAekwD,WAA2BxkG,KAAKs0C,eAAekwD,UAAYt+F,EAAQ6C,OAExF/I,KAAKihG,iBAAiBvzD,QAAQmW,GAC9B7jD,KAAK85F,SAAS70F,IAAI4+C,EAAQ39C,EAAQ6C,MA4CxC/I,KAAK45B,SAAS1zB,EAAQ6C,KAAO86C,EAC7BA,EAAO76B,QAAQjgB,IAAM,GAAK7C,EAAQ6C,IAClC86C,EAAO76B,QAAQ7f,OAAS,GAAKjD,EAAQiD,OACrC06C,EAAO76B,QAAQwtC,UAAY,GAAKtwD,EAAQ2mB,KAExC,MAAM0B,EAA+B,GAErC,KAAiB,mBAAdroB,EAAQoD,GAA4BpD,EAAQE,QAAWizF,GAAmBxvF,IAAI3D,EAAQE,OAAOkD,IAAK,CACnG,MAAMlD,EAASF,EAAQE,OACvB,GAAGA,EAAQ,CACT,MAAMkD,EAAIlD,EAAOkD,EACjB,GAAG8vF,GAAevvF,IAAIP,IAAO+sE,EAAS,SAAT,eAAwB/sE,KAAO+sE,EAAAA,SAAS/sE,GAEnE,OADAtJ,KAAK05F,YAAYn4F,KAAK2E,EAAQ6C,KACvB86C,EAIXA,EAAOv4C,UAAY,iBAEnBm9E,EAAgB3iF,UAAY,GAC5B,MAAMwT,EAAIjY,SAASC,cAAc,OAqBjC,OApBAgY,EAAE/Y,UAAUgB,IAAI,eACb6E,IACe,oCAAbA,EAAOkD,EACRgQ,EAAEhV,QAAO,IAAAsH,MAAK,qBAAsB,CAAC,IAAI,KAAU,CAACzC,OAAQ/C,EAAO6jG,QAAQhhF,UAAS,KAAQtQ,WACvE,+BAAbvS,EAAOkD,EACfgQ,EAAEhV,QAAO,IAAAsH,MAAK,mBAAoB,CAAC,IAAI,KAAU,CAACzC,OAAQ/C,EAAOs2F,WAAWzzE,UAAS,KAAQtQ,WAE7FW,EAAEhV,OAAOtE,KAAKiJ,mBAAmBihG,yBAAyBhkG,KAG9DuiF,EAAgBnkF,OAAOgV,GAEpB+lF,IACDr/F,KAAKipG,oBAAoB/iG,EAAS29C,EAAQj9C,EAAS2nB,GAEhDroB,EAAQ8U,OAAOmvF,WAChBtmD,EAAOtjD,UAAUgB,IAAI,kBAIlBsiD,EAGT,IAEIumD,EAAwBr3C,EAFxBs3C,EAA6B1iB,GAAazhF,EAAQoQ,MAGtD,GAAGqxE,EACD,IAAI0iB,MAAAA,OAAY,EAAZA,EAAoDhpG,YACrD,CAAC,QAAS,OAAOk+B,SAAW8qE,EAAmDhpG,SAAwBpB,YAEnG,GAAG4lD,GAAW2jD,EAAyB,CAC5C,MAAMl3F,EAAItS,KAAKiJ,mBAAmBqhG,aAAazkD,GAC/CukD,EAAiB93F,EAAEpM,QAEnB6sD,EAAgBzgD,EAAEygD,kBAC8E,aAAX,QAA3E,EAAAs3C,MAAAA,OAAY,EAAZA,EAAoDhpG,gBAAuB,eAAEpB,QACvFmqG,EAAiBlkG,EAAQA,QAEzB6sD,EAAgB7sD,EAAQ6sD,mBAGF,2BAArB7sD,EAAQE,OAAOkD,IAChB+gG,EAAe,CACb/gG,EAAG,mBACHlD,OAAQF,EAAQE,SAQtB,IAAImkG,EAAW,iBAA+BH,EAAgB,CAC5DxuD,SAAUmX,EACV0nC,aAAcz6F,KAAKy6F,eAGjB+P,GAAc,EACdC,GAAoB,EACpBC,GAAgB,EACpB,GAAG33C,IAAkBs3C,EAAc,CACjC,IAAIM,EAAgB53C,EAAcjpD,QAAQxJ,GAAc,uBAARA,EAAEgJ,IAC9CshG,EAAYR,EAAevpG,OAG/B,GAFqB8pG,EAAclmG,QAAO,CAACC,EAAKmmG,IAASnmG,EAAMmmG,EAAKhqG,QAAQ,KAEtD+pG,GAAaD,EAAc9pG,QAAU,GAAKkyD,EAAclyD,SAAW8pG,EAAc9pG,OAAQ,CAC7G,GAAGgK,EAAA,2BAA8B,CAC/B,IAAIi4C,EAAU9iD,KAAK2jD,mBAAmBmnD,wBAAwBV,GAC9D,GAA4B,IAAzBO,EAAc9pG,SAAiBwpG,GAAgBvnD,EAChDunD,EAAe,CACb/gG,EAAG,uBACHjI,SAAUyhD,OAEP,CACL,IAAIgD,EAAgBzkD,SAASC,cAAc,OAC3CwkD,EAAcvlD,UAAUgB,IAAI,cAE5BukD,EAAchgD,UAAYykG,EAE1B1mD,EAAOtjD,UAAUgB,IAAI,SAAWopG,EAAc9pG,OAAS,KAEvD4nF,EAAgBnkF,OAAOwhD,GAGzBjC,EAAOtjD,UAAUgB,IAAI,mBAAoB,aACzCkpG,GAAoB,EACpBD,GAAc,EACdE,GAAgB,EAGlB7mD,EAAOtjD,UAAUgB,IAAI,uBAStBmpG,GACD/kG,EAAa+iF,EAAY6hB,GAG3B,MAAMrkB,EAAWgB,GAAcC,QAAQ,CACrCC,SAAUpnF,KAAKq9B,KAAKp9B,KACpBiG,QAAAA,IAMF,GAJAwiF,EAAWpkF,OAAO4hF,GAClBuC,EAAgBvkF,QAAQwkF,GAGrBf,GAAazhF,EAAQ0hF,MAAO,CAG7B,GAFA/jC,EAAOtjD,UAAUgB,IAAI,kBAED,QAAhB,EAAA2E,EAAQ6hF,gBAAQ,eAAEuU,oBAAwC,WAAnBt8F,KAAKq9B,KAAKp9B,KAAmB,CACtE,MAAM8qG,EAAU1pG,SAASC,cAAc,OACvCypG,EAAQxqG,UAAUgB,IAAI,uBAAwB,UAAW,wBACzDknF,EAAgBvkF,QAAQ6mG,GACxBlnD,EAAOtjD,UAAUgB,IAAI,uBAGnB2E,EAAQ8U,OAAO0O,aAAe1pB,KAAKmhG,eACrCnhG,KAAKmhG,cAAczzD,QAAQmW,GAI/B,MAAMovC,EAActL,GAAazhF,EAAQ8sF,aACzC,GAAGC,GAAiC,sBAAlBA,EAAY3pF,GAA6B2pF,EAAY16D,MAAQ06D,EAAY16D,KAAK13B,OAAQ,CACtG,MAAM03B,EAAO06D,EAAY16D,KAEnByyE,EAAe3pG,SAASC,cAAc,OAC5C0pG,EAAazqG,UAAUgB,IAAI,gBAC3Bg3B,EAAKxzB,SAASixB,IACZ,MAAMpU,EAAUoU,EAAIpU,QACpB,IAAIA,IAAYA,EAAQ/gB,OAAQ,OAEhC,MAAMoqG,EAAS5pG,SAASC,cAAc,OACtC2pG,EAAO1qG,UAAUgB,IAAI,oBAErBqgB,EAAQ7c,SAASwZ,IACf,MAAM0C,EAAO,iBAA+B1C,EAAO0C,KAAM,CAACuxE,SAAS,EAAMC,cAAc,IAEvF,IAAIyY,EAEJ,OAAO3sF,EAAOjV,GACZ,IAAK,oBAAqB,CACxB,MAAMga,EAAI,iBAA+B,IAAK,CAC5Cs4B,SAAU,CAAC,CACTtyC,EAAG,uBACHzI,OAAQ,EACR2zB,OAAQ,EACRnc,IAAKkG,EAAOlG,QAIhB6yF,GAAW,EAAAz3C,GAAA,GAAuBnwC,GAAGuG,kBACrCqhF,EAAS3qG,UAAUgB,IAAI,UAAW,SAElC,MAGF,IAAK,6BACH2pG,EAAW7pG,SAASC,cAAc,UAClC4pG,EAAS3qG,UAAUgB,IAAI,mBAAoB,UAC3C,QAAiB2pG,GAAW5qG,KAC1B,EAAAohB,EAAA,GAAYphB,GAEZ,MAAM6wF,EAAQjrF,EAAQ25E,UAAY35E,EAAQuH,OAC1C,IAAIpF,EACwBA,EAAzBkW,EAAOvD,OAAOmwF,UAAqB3nG,QAAQ2E,QAAQnI,KAAKmJ,QAC5CnJ,KAAK4wF,qBAAqBsB,kBAAkBf,GAAOpvF,MAAKoH,GAClEA,GAII,IAAI3F,SAAgB,CAAC2E,EAASqnB,KACnC,MAAM47E,EAAQ,IAAIpjD,GAAa,CAC7B,CAAChoD,KAAKmJ,QAAS,KACbA,IACFhB,EAAQgB,MACP,GAEHiiG,EAAM/qG,iBAAiB,SAAS,KAC9BmvB,YAKNnnB,EAAQtG,MAAKoH,IACX,MAAMwD,EAAW3M,KAAKmJ,SAAWA,EAASnJ,KAAKq9B,KAAK1wB,cAAWpG,EAC/DvG,KAAK4wF,qBAAqByB,kBAAkBlpF,EAAQwD,EAAUwkF,EAAO5yE,EAAO9R,aAGhF,MAGF,QACEy+F,EAAW7pG,SAASC,cAAc,UAKtC4pG,EAAS3qG,UAAUgB,IAAI,sBAAuB,MAC9C2pG,EAASxlF,mBAAmB,YAAazE,IAEzC,EAAAI,GAAAA,QAAO6pF,GAEPD,EAAO3mG,OAAO4mG,MAGhBF,EAAa1mG,OAAO2mG,OAGtB,QAAiBD,GAAe1qG,IAC9B,IAAIkY,EAASlY,EAAEkY,OAGf,GADIA,EAAOjY,UAAUmT,SAAS,yBAAwB8E,GAAS,EAAAqK,GAAA,GAAgBrK,EAAQ,yBACnFA,GAAUA,EAAOjY,UAAUmT,SAAS,YAAc8E,EAAOjY,UAAUmT,SAAS,oBAAqB,QAErG,EAAAgO,EAAA,GAAYphB,GAEZ,MAAM+qG,GAAS,EAAAllD,GAAA,GAAW3tC,GACpBwd,EAAMuC,GAAK,EAAA4tB,GAAA,GAAW3tC,EAAOvU,gBAEnC,IAAI+xB,EAAIpU,UAAYoU,EAAIpU,QAAQypF,GAE9B,YADArrG,KAAK0nB,IAAIpN,KAAK,iBAAkB0b,EAAKq1E,EAAQnlG,GAI/C,MAAMqY,EAASyX,EAAIpU,QAAQypF,GAC3BrrG,KAAK4wF,qBAAqB0B,oBAAoBtyF,KAAKmJ,OAAQjD,EAAQ6C,IAAKwV,MAG1EisF,GAAc,EACd3mD,EAAOtjD,UAAUgB,IAAI,qBACrBooG,EAAerlG,OAAO0mG,GAGxB,MAAMvhF,EAAavjB,EAAQ8U,OAAO0O,YAClC,GAAG+/E,EAAK,EACHvjG,EAAQ8U,OAAOgvF,QAAUvgF,IAAYzpB,KAAKy5F,UAAUl4F,IAAI2E,EAAQ6C,KACnE,IAAIw+C,EAAS,GACEA,EAAZ99B,EAAqB,aACVvjB,EAAQ8U,OAAOgvF,QAAW9jG,EAA4B8U,OAAOC,aAAe,UAAY,UACtG4oC,EAAOtjD,UAAUgB,IAAIgmD,GAGpB99B,GACDo6B,EAAOtjD,UAAUgB,IAAI,eAGvB,MAAM+pG,EAAqB3jB,GAAa3nF,KAAKiJ,mBAAmBsiG,sBAAsBrlG,GAChFslG,IAAgBF,GAAsBplG,EAAQ6C,IAAM,EAEvDyiG,GACD3nD,EAAOtjD,UAAUgB,IAAI,gBAGvB,MAAMkqG,EAAU9jB,GAAazhF,EAAQ6hF,SAC/BjI,EAAY6H,GAAazhF,EAAQ45E,UAEjCxiC,EAAQmsD,KAASgC,GAAWzrG,KAAKmJ,SAAW0B,EAAA,cAClD,IAAI6gG,EAA6BjjB,EAEjC,MAAMkjB,IAAsBzlG,EAAQ25E,UAAa35E,EAAQuH,SAAW5C,EAAA,cAAmB3E,EAAQ8U,OAAOiP,KAGtG,GAAGogF,EAA8D,CAC/D,IAAIvkD,EAAgBzkD,SAASC,cAAc,OAC3CwkD,EAAcvlD,UAAUgB,IAAI,cAExB6oG,GACFvmD,EAAOtjD,UAAUgB,IAAI,oBAGvB,IAAIqqG,GAAoB,EAEJ,OAAOvB,EAAa/gG,GACtC,IAAK,oBAAqB,CACxB,MAAMjD,EAAQgkG,EAAahkG,MAGvB+jG,IACFI,GAAc,GAGbmB,GACD9nD,EAAOtjD,UAAUgB,IAAI,aAGvBsiD,EAAOtjD,UAAUgB,IAAI,SAErB,MAAMuJ,EAAU9K,KAAKiJ,mBAAmB62F,uBAAuBj6C,GAC/D,GAAGA,GAA4B,IAAjB/6C,EAAQ5J,MAAcsoG,EAAyB,CAC3D3lD,EAAOtjD,UAAUgB,IAAI,WAAY,cACjCqkD,GAAU,CACRC,QAASA,EACTC,cAAAA,EACAj1B,WAAY7wB,KAAKm7F,gBACjB79C,MAAOmsD,EACPh7E,cAAezuB,KAAKyuB,cACpB4O,KAAMr9B,KAAKq9B,KACX9O,aAAAA,EACAQ,aAAc/uB,KAAKq9B,KAAKtO,eAG1B,MAGF,MAAMsuB,GAAY,GAAAwuD,YAAcrB,IAAgBgB,IA1gGlC,EA2gGXnuD,GAAUwG,EAAOtjD,UAAUgB,IAAI,mBAClC6sB,GAAU,CACR/nB,MAAOA,EACPH,QAAAA,EACA9E,UAAW0kD,EACXzI,SAAAA,EACAC,MAAAA,EACA7uB,cAAezuB,KAAKyuB,cACpBoC,WAAY7wB,KAAKm7F,gBACjB5sE,aAAAA,EACAmvB,iBAAkB19C,KAAKq9B,KAAKtO,aAAa1oB,QAG3C,MAGF,IAAK,sBAAuB,CAC1BulG,GAAoB,EAEpB,IAAI76E,EAAmBs5E,EAAat5E,QAEpC,GAAiB,YAAdA,EAAQznB,EACT,MAGFu6C,EAAOtjD,UAAUgB,IAAI,WAErB,IAAI4lE,EAAM9lE,SAASC,cAAc,OACjC6lE,EAAI5mE,UAAUgB,IAAI,OAElB,IAGIuqG,EAAgCC,EAHhCC,EAAQ3qG,SAASC,cAAc,OACnC0qG,EAAMzrG,UAAUgB,IAAI,SAGpB,MAAM8E,EAAqB0qB,EAAQ1qB,OAChCA,GAAS0qB,EAAQ1vB,YAClByqG,EAAiBzqG,SAASC,cAAc,OACxCwqG,EAAevrG,UAAUgB,IAAI,mBAC7BwqG,EAAU1qG,SAASC,cAAc,OACjCyqG,EAAQxrG,UAAUgB,IAAI,WACtBuqG,EAAexnG,OAAOynG,IAGxB,MAAMl0F,EAAMkZ,EAAQ1vB,SACpB,GAAGwW,EACD,GAAgB,QAAbA,EAAI5X,MAA+B,UAAb4X,EAAI5X,MAAiC,UAAb4X,EAAI5X,KAAkB,CAErE,MAAMgsG,EAAyB,UAAbp0F,EAAI5X,KAAmB8qB,EAAA,gBAA0BA,EAAA,kBACnD,UAAblT,EAAI5X,MACL4jD,EAAOtjD,UAAUgB,IAAI,SACrBwqG,EAAQxrG,UAAUgB,IAAI,aAEtBsiD,EAAOtjD,UAAUgB,IAAI,SAEvB67C,GAAU,CACRvlC,IAAAA,EACAzW,UAAW2qG,EACX7lG,QAASA,EACTmoB,SAAU49E,EAAUrqG,MACpB0sB,UAAW29E,EAAUpqG,OACrB4sB,cAAezuB,KAAKyuB,cACpBoC,WAAY7wB,KAAKm7F,gBACjB79C,MAAAA,EACApsB,MAAOC,GACP5C,aAAAA,EACAQ,aAAc/uB,KAAKq9B,KAAKtO,mBAGrB,CACL,MAAMqxB,EAASP,GAAa,CAC1B35C,QAAAA,EACAw3C,iBAAkB19C,KAAKq9B,KAAKtO,aAAa27C,KACzCj8C,cAAezuB,KAAKyuB,cACpBF,aAAAA,IAEFw9E,EAAQznG,OAAO87C,GACf2rD,EAAQxrG,UAAUgB,IAAI,yBAM1B,IAOI+Q,EAPA45F,EAAe7qG,SAASC,cAAc,OAQ1C,GAPA4qG,EAAa3rG,UAAUgB,IAAI,cAExBuqG,GACDI,EAAa5nG,OAAOwnG,GAInB/6E,EAAQo7E,UAAW,CACpB,MAAMtmG,EAAO,iBAA+BkrB,EAAQ1Y,KAC9C7N,GAAuB,EAAAipD,GAAA,GAAuB5tD,GAAMgkB,kBAC1Drf,EAAEjK,UAAUgB,IAAI,gBAChB,MAAM6qG,EAAS/qG,SAASC,cAAc,UACtCqE,EAAaymG,EAAQ,kBAAgCr7E,EAAQo7E,YAC7D3hG,EAAEsmB,YAAc,GAChBtmB,EAAElG,OAAO8nG,GACTF,EAAa5nG,OAAOkG,GACpB8H,EAAI9H,EAGN,GAAGumB,EAAQwiC,OAAQ,CACjB,IAAIu6B,EAAWzsF,SAASC,cAAc,OACtCwsF,EAASvtF,UAAUgB,IAAI,SACvB,MAAM6qG,EAAS/qG,SAASC,cAAc,UACtCqE,EAAaymG,EAAQr7E,EAAQwiC,QAC7Bu6B,EAASxpF,OAAO8nG,GAChBF,EAAa5nG,OAAOwpF,GACpBx7E,EAAIw7E,EAGN,GAAG/8D,EAAQsiC,aAAc,CACvB,IAAIg5C,EAAUhrG,SAASC,cAAc,OACrC+qG,EAAQ9rG,UAAUgB,IAAI,QACtBoE,EAAa0mG,EAASt7E,EAAQsiC,cAC9B64C,EAAa5nG,OAAO+nG,GACpB/5F,EAAI+5F,EAWN,GAFAL,EAAM1nG,OAAO4nG,GAEV7lG,IAAUwR,EAAK,CAChBgsC,EAAOtjD,UAAUgB,IAAI,SAErB,MAAML,EAA4BmF,EAAM2V,MAAM3V,EAAM2V,MAAMnb,OAAS,GACnE,IAAIyrG,GAAW,EACZprG,EAAKma,IAAMna,EAAK+a,GAAK3J,GACtBuxC,EAAOtjD,UAAUgB,IAAI,mBACrB+qG,GAAW,EACXtsG,KAAKkc,iBAAiBqwF,kBAAkBlmG,EAAO0lG,EAAS,GAAI,IAAI,IAKxD7qG,EAAK+a,EAAI/a,EAAKma,GACtBwoC,EAAOtjD,UAAUgB,IAAI,qBAGvB6sB,GAAU,CACR/nB,MAAAA,EACAH,QAAAA,EACA9E,UAAW2qG,EACX19E,SAAUi+E,EAAW,EAAIvhF,EAAA,wBACzBuD,UAAWg+E,EAAW,EAAIvhF,EAAA,yBAC1BuyB,MAAAA,EACA7uB,cAAezuB,KAAKyuB,cACpBoC,WAAY7wB,KAAKm7F,gBACjB5sE,aAAAA,EACAC,iBAAkB89E,EAClB5uD,iBAAkB19C,KAAKq9B,KAAKtO,aAAa1oB,QAI7C8gE,EAAI7iE,OAAO0nG,GAITtjB,EAAWvkF,aAAagjE,EAAK+e,GAO/B,MAGF,IAAK,uBAAwB,CAC3B,MAAMruE,EAAMwyF,EAAahpG,SAIzB,GAAGwW,EAAIirC,QAAkC,CACvCe,EAAOtjD,UAAUgB,IAAI,WACrBipG,GAAc,EACdC,GAAoB,EAEjB5yF,EAAI2sC,UACLX,EAAOtjD,UAAUgB,IAAI,oBAGvB,MAAMya,EAAQ+O,EAAA,UACR7pB,EAAO2iD,EAAOtjD,UAAUmT,SAAS,aAAesI,EAAMwwF,aAAgB30F,EAAI2sC,SAAWxoC,EAAMywF,gBAAkBzwF,EAAM0wF,cACzH1sG,KAAKkc,iBAAiBqwF,kBAAkB10F,EAAKiuC,EAAe5kD,EAAKU,MAAOV,EAAKW,QAE7E4mF,EAAgBnlF,MAAMsuB,SAAWk0B,EAAcxiD,MAAM1B,MACrD6mF,EAAgBnlF,MAAMmzC,UAAYqP,EAAcxiD,MAAMzB,OAEtDmvB,GAAY,CACVnZ,IAAAA,EACAoZ,IAAK60B,EACLj1B,WAAY7wB,KAAKm7F,gBACjB1sE,cAAezuB,KAAKyuB,cACpByC,MAAOC,GAEPzuB,MAAM,EACNhB,MAAM,EACNghD,MAAOmB,EAAOtjD,UAAUmT,SAAS,aAAe02F,OAAiB7jG,EACjEw7C,WAAW,EACXxzB,aAAAA,SAEG,GAAgB,UAAb1W,EAAI5X,MAAiC,QAAb4X,EAAI5X,MAA+B,UAAb4X,EAAI5X,KAA4C,CAGtG,MAAMywB,EAAuB,UAAb7Y,EAAI5X,KACjBywB,IACD+5E,GAAoB,IAGnB/5E,GAAY05E,IACbI,GAAc,GAGbmB,GACD9nD,EAAOtjD,UAAUgB,IAAI,aAGvBsiD,EAAOtjD,UAAUgB,IAAImvB,EAAU,QAAU,SACzC,MAAM5lB,EAAU9K,KAAKiJ,mBAAmB62F,uBAAuBj6C,GAC/D,GAAGA,GAA4B,IAAjB/6C,EAAQ5J,MAAcsoG,EAClC3lD,EAAOtjD,UAAUgB,IAAI,WAAY,cAEjCqkD,GAAU,CACRC,QAASA,EACTC,cAAAA,EACAj1B,WAAY7wB,KAAKm7F,gBACjB79C,MAAOmsD,EACPh7E,cAAezuB,KAAKyuB,cACpB4O,KAAMr9B,KAAKq9B,KACX9O,aAAAA,EACAQ,aAAc/uB,KAAKq9B,KAAKtO,mBAErB,CACL,MAAMsuB,GAAY,GAAAwuD,aAAe,GAAAlvF,WAAa+T,GAAW85E,IAAgBgB,IA3vG/D,EA4vGPnuD,GAAUwG,EAAOtjD,UAAUgB,IAAI,mBAClC67C,GAAU,CACRvlC,IAAAA,EACAzW,UAAW0kD,EACX5/C,QAASA,EACTmoB,SAAUtD,EAAA,wBACVuD,UAAWvD,EAAA,yBACXsyB,SAAAA,EACAC,MAAAA,EACA7uB,cAAezuB,KAAKyuB,cACpBoC,WAAY7wB,KAAKm7F,gBACjBjqE,MAAOC,GACP5C,aAAAA,EACAQ,aAAc/uB,KAAKq9B,KAAKtO,aACxB7lB,cAAewnB,EAAU,CACvBvnB,OAAQnJ,KAAKmJ,OACbE,YAAa,CAACC,EAAG,iCACjBqD,SAAU3M,KAAKq9B,KAAK1wB,SACpBzB,WAAahF,EAA4B8U,OAAOC,aAChDlQ,YAAc7E,EAA4B8U,OAAOC,mBAC/C1U,SAGH,CAEL,MAAMomG,E7F/4CX,UAA8B,wBAACnD,EAAuB,QAAEtjG,EAAO,OAAE29C,EAAM,WAAE6kC,EAAU,KAAErrD,EAAI,aAAE9O,EAAY,iBAAEmvB,EAAgB,cAAEjvB,EAAa,cAAEvlB,EAAa,UAAEgC,IAa9J,IAAIwgG,EACJ,MAAMvhG,EAAOq/F,EAA0BnsE,EAAK+wB,aAAaloD,EAAQ6C,KAAO,CAAC7C,EAAQ6C,KAwDjF,OAnDAoB,EAAKpF,SAAQ,CAACgE,EAAK5C,KACjB,MAAMD,EAAUm3B,EAAK0oB,WAAWh9C,GAC1BkoB,EAAM4uB,GAAa,CACvB35C,QAAAA,EACAqoB,aAAAA,EACAmvB,iBAAAA,EACAjvB,cAAAA,EACAvlB,cAAAA,IAGI9H,EAAYC,SAASC,cAAc,OACzCF,EAAUb,UAAUgB,IAAI,sBACxBH,EAAU4nB,QAAQjgB,IAAM,GAAKA,EAC7B3H,EAAU4nB,QAAQ7f,OAAS,GAAKjD,EAAQiD,OAExC,MAAM0b,EAAUxjB,SAASC,cAAc,OAGvC,GAFAujB,EAAQtkB,UAAUgB,IAAI,oBAEnB2E,EAAQA,QAAS,CAClB,MAAMwiF,EAAarnF,SAASC,cAAc,OAC1ConF,EAAWnoF,UAAUgB,IAAI,oBAEzB,MAAMgpG,EAAW,iBAA+BrkG,EAAQA,QAAS,CAC/D01C,SAAU11C,EAAQ6sD,gBAGpB21B,EAAW5iF,UAAYykG,EACvB1lF,EAAQvgB,OAAOokF,GAGjB,GAAGv+E,EAAKtJ,OAAS,EAAG,CAClB,MAAMizC,EAAYzyC,SAASC,cAAc,OACzCwyC,EAAUvzC,UAAUgB,IAAI,sBACxBH,EAAUkD,OAAOwvC,GAEjB1yC,EAAUb,UAAUgB,IAAI,gBAEb,IAAR4E,IACDulG,EAAgB7mF,GAIpBA,EAAQvgB,OAAO2sB,GACf7vB,EAAUkD,OAAOugB,GACjB6jE,EAAWpkF,OAAOlD,MAGjB+I,EAAKtJ,OAAS,GACfgjD,EAAOtjD,UAAUgB,IAAI,wBAAyB,cAGzCmqG,E6Fy0C4BkB,CAAqB,CAC5CpD,wBAAAA,EACAtjG,QAAAA,EACA29C,OAAAA,EACA6kC,WAAAA,EACArrD,KAAMr9B,KAAKq9B,KACX9O,aAAAA,EACAmvB,iBAAkB19C,KAAKq9B,KAAKtO,aAAa27C,KACzCj8C,cAAezuB,KAAKyuB,cACpBvlB,cAA4B,UAAb2O,EAAI5X,MAAiC,UAAb4X,EAAI5X,KAAmB,CAC5DkJ,OAAQnJ,KAAKmJ,OACbE,YAAa,CAACC,EAAgB,UAAbuO,EAAI5X,KAAmB,gCAAkC,4BAC1E0M,SAAU3M,KAAKq9B,KAAK1wB,SACpBzB,WAAahF,EAA4B8U,OAAOC,aAChDlQ,YAAc7E,EAA4B8U,OAAOC,mBAC/C1U,IAGHomG,IACDjB,EAAgBiB,GAGlB,MAAME,EAAgBnkB,EAAW3xC,iBAAiBxlC,cAAc,6CAEhEs7F,GAAiBA,EAAcvoG,OAAO4hF,GAEtCriC,EAAOtjD,UAAUC,OAAO,oBACxBkoF,EAAWnoF,UAAUgB,KAAO,CAAC,QAAS,OAAgCg+B,SAAS1nB,EAAI5X,MAAiC,WAAzB4X,EAAI5X,MAAQ,YAA2B,YAClI2rG,GAAoB,EAGtB,MAGF,IAAK,mBAAoB,CACvB,MAAMxlG,EAASikG,EAAajkG,OACtB6qB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI,cAAe6E,EAAO4U,OAAO/D,MAAQ,oBAAsB,eAE7E,MAAMhX,EAAiBmG,EAAO4U,OAAO/D,MAAQ,QAAU,QACvDga,EAAIjI,QAAQ/oB,KAAOA,EAEnB,MAAMoP,EAAQhO,SAASC,cAAc,OACrC+N,EAAM9O,UAAUgB,IAAI,sBAEpB,IAAAm4B,OAAMrqB,EAAOiuC,EACVl3C,EAAO4U,OAAO/D,MAAQ,2BAA6B,sBACnD7Q,EAAO4U,OAAO/D,MAAQ,2BAA6B,uBAEtD,MAAMmZ,EAAW/uB,SAASC,cAAc,OAGxC,GAFA8uB,EAAS7vB,UAAUgB,IAAI,6BAEAgF,IAApBH,EAAOqR,SACR2Y,EAAS9rB,QAAO,EAAAwoG,GAAA,GAAmB1mG,EAAOqR,eACrC,CACL,IAAIuiB,EACJ,OAAO5zB,EAAO2mG,OAAOzjG,GACnB,IAAK,6BACH0wB,EAAc,kBACd,MACF,IAAK,+BACHA,EAAc,2BACd,MAEF,QACEA,EAAc,8BAIlB5J,EAAS7vB,UAAUgB,IAAI,cACvB,IAAAm4B,OAAMtJ,EAAU4J,GAGlB5J,EAAS7vB,UAAUgB,IAAI,QAAS,eAAgCgF,IAApBH,EAAOqR,SAAyB,QAAU,QAEtFwZ,EAAI3sB,OAAO+K,EAAO+gB,GAElBw7E,GAAoB,EAEpB/nD,EAAOtjD,UAAUC,OAAO,oBACxBkoF,EAAWnoF,UAAUgB,IAAI,gBACzBmnF,EAAWpkF,OAAO2sB,GAElB,MAGF,IAAK,sBAAuB,CAG1B,MAAM+7E,EAAU3C,EACV3O,EAAar6F,SAASC,cAAc,OAC1Co6F,EAAWn7F,UAAUgB,IAAI,WACzBm6F,EAAW1yE,QAAQ7f,OAAS,GAAK6jG,EAAQ/mE,QAEzC2lE,GAAoB,EAEpB,MAAMqB,EAAQ,GACXD,EAAQ7iE,YAAY8iE,EAAMnlG,KAAK,kBAAgCklG,EAAQ7iE,aACvE6iE,EAAQ5iE,WAAW6iE,EAAMnlG,KAAK,kBAAgCklG,EAAQ5iE,YAEzEsxD,EAAW51F,UAAY,wFAESmnG,EAAMpkF,KAAK,yDACTmkF,EAAQxZ,aAAe,KAAM,EAAA5+B,GAAA,GAAkBo4C,EAAQxZ,cAAc3+B,UAAY,mDAGnH,MAAM79B,EAAa,IAAI+E,GACvB/E,EAAWvI,cAAgBzuB,KAAKyuB,cAChCuI,EAAW92B,aAAa,OAAQ,GAAK8sG,EAAQ/mE,QAAQhd,YACrD+N,EAAWz2B,UAAUgB,IAAI,iBAAkB,aAE3Cm6F,EAAWx3F,QAAQ8yB,GAEnB6sB,EAAOtjD,UAAUC,OAAO,oBACxBkoF,EAAWnoF,UAAUgB,IAAI,mBACzBmnF,EAAWpkF,OAAOo3F,GAElB,MAGF,IAAK,mBAAoB,CACvB73C,EAAOtjD,UAAUC,OAAO,oBAExB,MAAMg3C,E7Fj8CT,SAAkBtxC,GACvB,MAAMN,EAAO,IAAIqyC,GAMjB,OALAryC,EAAKM,QAAUA,EACfN,EAAK1F,aAAa,UAAW,GAAKgG,EAAQiD,QAC1CvD,EAAK1F,aAAa,UAAWgG,EAAQoQ,MAAMs/B,KAAK/kC,IAChDjL,EAAK1F,aAAa,aAAc,GAAKgG,EAAQ6C,KAC7CnD,EAAK2jB,SACE3jB,E6F07CqBsnG,CAAShnG,GAC7BwiF,EAAWxkF,QAAQszC,GACnBkxC,EAAWnoF,UAAUgB,IAAI,gBAEzB,MAGF,QACEsiD,EAAOtjD,UAAUC,OAAO,oBACxBkoF,EAAWpkF,QAAO,IAAAsH,MAAK,EAAAuhG,2BAA4BjnB,GACnDlmF,KAAK0nB,IAAIpN,KAAK,2BAA4B+vF,EAAa/gG,EAAGpD,GAI1D0lG,GACFnjB,EAAgBnkF,OAAOwhD,GAYxB2kD,GACD5mD,EAAOtjD,UAAUgB,IAAI,cAGpBvB,KAAKq9B,KAAKyW,UAAUC,aACrB/zC,KAAKq9B,KAAKyW,UAAU0X,sBAAsB3H,GAAQ,GAGpD,IAAIi5C,EAAY,GAGhB,MAAMsQ,EAAYlnG,EAAQuH,SAAW5C,EAAA,cAAkB7K,KAAKoc,gBAAgB2rF,WAAW5+F,IAAYjD,EAAQ25E,UAAa35E,EAA4B8U,OAAO0sE,UAC3J,GAAG0lB,GAAY3B,GAAWvlG,EAAQ8iF,aAAc,CAC9C,IAAI35E,EACAg+F,EAEJ,MAAMC,EAAuBpnG,EAAQqnG,SAAiC,gBAAtBrnG,EAAQqnG,QAAQjkG,GAAuBpD,EAAQuH,SAAWqyE,EAE1G,IA8BIv/B,EA9BAitD,EAAW/B,IAAYA,EAAQ8B,QA+BnC,GA9BGrnG,EAAQ25E,WACTwtB,EAAWhsG,SAASC,cAAc,QAClC+rG,EAASr/E,UAAY,IAAMhuB,KAAKiV,gBAAgBw4F,QAAQvnG,EAAQ25E,UAAUzkD,SAC1EiyE,EAAS9sG,UAAUgB,IAAI,cACvBsiD,EAAOtjD,UAAUgB,IAAI,mBAGpBisG,GAEDn+F,EAAQhO,SAASC,cAAc,QAC/B+N,EAAMvJ,UAAY,kBAAgC2lG,EAAQiC,WAC1Dr+F,EAAM9O,UAAUgB,IAAI,cAEpBsiD,EAAOtjD,UAAUgB,IAAI,mBAErB8N,EAAQ,IAAI,KAAU,CAAClG,OAAQ22E,GAAa55E,EAAQuH,SAASkL,QAG5DzS,EAAQ8iF,cAAgB9iF,EAAQ8iF,eAAiBhpF,KAAKq9B,KAAK1wB,UAAYg7E,GACxET,GAAc2B,SAAS,CACrBxrD,KAAMr9B,KAAKq9B,KACXwmB,OAAAA,EACA4kC,gBAAAA,EACAviF,QAAAA,IAOA45E,GAAa2rB,EAaf,GAZGzrG,KAAKmJ,SAAW0B,EAAA,cAAmByiG,GACpCzpD,EAAOtjD,UAAUgB,IAAI,aAGpB2E,EAAQ42F,YACTA,EAAY52F,EAAQ42F,UACpBztF,EAAM2Z,QAAQ8zE,UAAYA,GAG5Bv8C,EAAUl/C,SAASC,cAAc,OACjC+N,EAAM2Z,QAAQ7f,OAAS,GAAK22E,EAExB9/E,KAAKmJ,SAAW0B,EAAA,cAAkB7K,KAAKmJ,SAAW,QAAmBmkG,GAA0B7C,EAG5F,CAGL,MAAMjmG,EAA2B,CAAC6K,GAC/Bo7F,GACDjmG,EAAKwD,QAAQ3G,SAASC,cAAc,OAEtCi/C,EAAQj8C,QAAO,IAAAsH,MAAK,gBAAiB,CAACpH,UATtC+7C,EAAQj9C,MAAMk3C,MAAQx6C,KAAKoc,gBAAgBuxF,iBAAiB7tB,GAAW,GACvEv/B,EAAQj8C,OAAO+K,QAURnJ,EAAQ25E,YACb4qB,GAAqB2C,GACvB7sD,EAAUl/C,SAASC,cAAc,OACjCi/C,EAAQj8C,OAAO+K,GAEXo6F,IACFlpD,EAAQj9C,MAAMk3C,MAAQx6C,KAAKoc,gBAAgBuxF,iBAAiBznG,EAAQuH,QAAQ,IAG9E8yC,EAAQv3B,QAAQ7f,OAAS,GAAKjD,EAAQuH,QAEtCo2C,EAAOtjD,UAAUgB,IAAI,cAIzB,GAAG2E,EAAQ25E,SAAU,CACft/B,EAGFA,EAAQj8C,OAAO,KAFfi8C,EAAUl/C,SAASC,cAAc,OAKnC,MAAM2vD,EAAO5vD,SAASC,cAAc,QACpC2vD,EAAK3sD,QAAO,IAAAsH,MAAK,UAAW,IAAKyhG,GACjCp8C,EAAK1wD,UAAUgB,IAAI,UAEnBg/C,EAAQj8C,OAAO2sD,GASjB,GANG1Q,IACDA,EAAQhgD,UAAUgB,IAAI,QACtBmqG,EAAcpnG,OAAOi8C,IAGJvgD,KAAKq9B,KAAK0qE,eAAiBzqD,EAC/B,CACb,IAAItmB,EAAa,IAAI+E,GACrB/E,EAAWvI,cAAgBzuB,KAAKyuB,cAChCuI,EAAWz2B,UAAUgB,IAAI,cAAe,aACxCy1B,EAAWzI,aAAeA,GAEtBuxD,GAAa2rB,GAAWA,EAAQiC,WAClC12E,EAAW92B,aAAa,aAA8BurG,EAAQiC,WAGhE12E,EAAW92B,aAAa,OAAQ,KAAQurG,IAAYzrG,KAAKmJ,SAAW0B,EAAA,cAAkB7K,KAAKmJ,SAAW,QAAqBmkG,EAAuBxtB,EAAY55E,EAAQuH,SAAW,QAKjLk8F,EAAerlG,OAAO0yB,SAGxB6sB,EAAOtjD,UAAUgB,IAAI,aAYvB,GATsB,WAAnBvB,KAAKq9B,KAAKp9B,OACX68F,EAAY,GAAG98F,KAAKq9B,KAAKl0B,UAAUjD,EAAQ6C,OAGrBuiG,GAAsBA,EAAmBviG,MAAQ/I,KAAKq9B,KAAK1wB,UAEjFk3C,EAAOtjD,UAAUgB,IAAI,oBAAqB,iBAGzCu7F,IAAiC,WAAnB98F,KAAKq9B,KAAKp9B,MAAqBwrG,EAAQnP,oBAAsBt8F,KAAKmJ,SAAW,MAAiB,CAC7G,MAAMykG,EAAOvsG,SAASC,cAAc,OACpCssG,EAAKrtG,UAAUgB,IAAI,uBAAwB,gBAAiB,oBAC5DknF,EAAgBnkF,OAAOspG,GACvB/pD,EAAO76B,QAAQ8zE,UAAYA,EAC3Bj5C,EAAOtjD,UAAUgB,IAAI,sBAuCvB,OApCAsiD,EAAOtjD,UAAUgB,IAAI+7C,EAAQ,SAAW,SACrC+hD,GACDr/F,KAAKipG,oBAAoB/iG,EAAS29C,EAAQj9C,EAAS2nB,GAGlDi9E,GACgBtkB,GAAcsB,cAAc,CAC3C3kC,OAAAA,EACA4kC,gBAAAA,EACAviF,QAASolG,EACT5iB,WAAAA,EACAn6D,aAAAA,EACAE,cAAezuB,KAAKyuB,kBAIpB+7E,GAAc,GAIf7iB,GACD3nF,KAAKy/F,+BAA+B57C,EAAQ39C,GAS3CskG,IACD3mD,EAAOtjD,UAAUgB,IAAI,iBAErBknF,EAAgBnkF,OAAOupG,OAGlBhqD,EAGD47C,+BAA+B57C,EAAqB39C,EAA0Bs/E,GACpF,GAAGxlF,KAAKmJ,OAAO+4B,SACb,OAGF,MAAMslD,EAAmBxnF,KAAKiJ,mBAAmBiyF,sBAAsBh1F,GACvE,IAAIshF,EAAiBp+C,YAAco+C,EAAiBp+C,UAAU7G,QAAQ1hC,OACpE,OAKF,MAAM0mF,EAAmB,IAAItC,GAI7B,GAHAsC,EAAiB33E,KAAK43E,EAAkB,SACxCD,EAAiBh+D,OAAOi8D,GAErB3hC,EAAOtjD,UAAUmT,SAAS,oBAC3BmwC,EAAOtyC,cAAc,2BAA2BjN,OAAOijF,OAClD,CACL,MAAMmB,EAAa7kC,EAAOtyC,cAAc,YACxC,GAAGsyC,EAAOtjD,UAAUmT,SAAS,yBAA0B,CACrD,MAAMo6F,EAAoBplB,EAAW3xC,iBACrC,IAAIg3D,EAAqBD,EAAkBv8F,cAAc,qBAErD20E,EAAwB6nB,GAAsBA,EAAmBx8F,cAAc,SAC/E20E,IACFA,EAAWgB,GAAcC,QAAQ,CAC/BC,SAAUpnF,KAAKq9B,KAAKp9B,KACpBiG,QAAAA,KAIJqhF,EAAiBjjF,OAAO4hF,GAEpB6nB,IACFA,EAAqB1sG,SAASC,cAAc,OAC5CysG,EAAmBxtG,UAAUgB,IAAI,oBACjCusG,EAAkBv8F,cAAc,qBAAqBrN,QAAQ6pG,IAG/DA,EAAmBzpG,OAAOijF,OACrB,CACL,MAAMrB,EAAW77E,MAAMC,KAAKu5C,EAAOryC,iBAAiB,UAAU3J,MAC9D0/E,EAAiBjjF,OAAO4hF,GAExBwC,EAAWpkF,OAAOijF,KAKhB2X,kBAAkBh5F,EAAcU,EAAmB2iG,EAA0B1lD,EAAsBw7C,GACzG,IACE,OAAOr/F,KAAKspG,cAAcpjG,EAASU,EAAS2iG,EAAgB1lD,EAAQw7C,GACpE,MAAMxxF,GACN7N,KAAK0nB,IAAI3Z,MAAM,uBAAwBF,IAI9BgzF,qBAAqB56F,EAAgEW,EAAkBonG,EAAsB/F,G,0CAuCxI,IAAIgG,EAvBJhoG,EAAUA,EAAQrF,QAEfqnG,GACDhiG,EAAQ+B,QAAQigG,GAqBlBjoG,KAAKo6F,sBAAwB,KAC3B6T,EAAc,IAAIpV,GAAY74F,KAAK4M,WAAYhG,GAC/CqnG,EAAYxtD,QAGXzgD,KAAKkuG,mBACNnkB,GAAwB/pF,KAAK4M,WAAWxL,WACxCpB,KAAKkuG,kBAAmB,GAG1B,MAAMtxD,EAAM7zC,IACV,MAAM7C,EAAoE,iBAAV,EAAqBlG,KAAKq9B,KAAK0oB,WAAWh9C,GAAOA,EAC9G7C,EAAQ8U,OAAOouF,MAChBppG,KAAKmuG,0BAA0BjoG,GAE/BlG,KAAKk/F,kBAAkBh5F,EAASU,GAAS,IAIvC/F,EAASoF,EAAQpF,OACvB,GAAG+F,EAAS,IAAI,IAAIrB,EAAI,EAAGA,EAAI1E,IAAU0E,EAAGq3C,EAAG32C,EAAQV,SAClD,IAAI,IAAIA,EAAI1E,EAAS,EAAG0E,GAAK,IAAKA,EAAGq3C,EAAG32C,EAAQV,IAErD,GAAsB,cAAnBvF,KAAKq9B,KAAKp9B,KAAsB,CACjC,MAAMq0C,EAAiBt0C,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UAClFyhG,EAAa95D,EAAeruC,QAAQ4uB,MACpCw5E,EAAY/5D,EAAeruC,QAAQ0jD,MACtCykD,EAAWrsE,MAAM,cAAsBqsE,EAAWvtG,SAAUoF,EAAQs5B,SAAS6uE,EAAW,KACzFpuG,KAAKskG,UAAU,UAAU,GAAM,IAG9B+J,EAAUtsE,MAAM,WAAmBssE,EAAUxtG,SAAUoF,EAAQs5B,SAAS8uE,EAAUA,EAAUxtG,OAAS,KACtGb,KAAKskG,UAAU,OAAO,GAAM,QAG9BtkG,KAAKskG,UAAU,OAAO,GACtBtkG,KAAKskG,UAAU,UAAU,GAiB3B,aAdMtkG,KAAKk6F,qBAERl6F,KAAK4M,WAAWvF,UAAUuxB,KAAO54B,KAAKq6F,kCACvCr6F,KAAKq6F,kCAEFr6F,KAAKq6F,iCACNr6F,KAAKq6F,mCAIN4T,GACDA,EAAYjV,UAA2B,IAAnB/yF,EAAQpF,SAAiB+F,KAGxC,KAkBFy3F,eAAev1F,EAAejC,EAAmBgC,GAEtD,MAAsB,SAAnB7I,KAAKq9B,KAAKp9B,MAAsC,eAAnBD,KAAKq9B,KAAKp9B,KACjCD,KAAKiJ,mBAAmBo7F,WAAWrkG,KAAKmJ,OAAQL,EAAOjC,EAAWgC,EAAW7I,KAAKq9B,KAAK1wB,UACnE,WAAnB3M,KAAKq9B,KAAKp9B,KACFD,KAAKiJ,mBAAmBqlG,UAAU,CAChDnlG,OAAQnJ,KAAKmJ,OACbE,YAAa,CAACC,EAAG,6BACjBR,MAAAA,EACAM,MAAOvC,EACPgC,UAAAA,IAED9G,MAAKrB,IAAS,CAAEuF,QAASvF,EAAMuF,QAAQyE,KAAImlC,GAAKA,EAAE9mC,UAGxB,cAAnB/I,KAAKq9B,KAAKp9B,KACXD,KAAKiJ,mBAAmBslG,qBAAqBvuG,KAAKmJ,QAAQpH,MAAKoI,IAG7D,CAAClE,QAASkE,EAAKvJ,QAAQgG,mBAJ3B,EASK4nG,gBAAgBvG,EAAuBwG,EAA0BC,EAA2B7lG,EAAmBC,G,0CAI3H,GAAG9I,KAAKq9B,KAAK2gE,iBAAmBh+F,KAAK4mG,uBAGnC,YADA5mG,KAAK4mG,uBAAyB5mG,KAAKwuG,gBAAgBhmG,KAAKxI,KAAMioG,EAAewG,EAAgBC,EAAkB7lG,EAAWC,IAQ5H,IAAI4R,OAAOgzC,KAAK1tD,KAAK45B,SAAS/4B,OAC5B,OAGF,IAMI8tG,EANAC,GAAa,EAAAz3C,GAAA,GAAqBn3D,KAAK45B,QAAS,QAEjD80E,GAAoBD,EAAe5tG,SACpC+tG,EAAaA,EAAW9kG,QAAOf,IAAQ0lG,EAAelvE,SAASx2B,MAK/D4lG,EADC9lG,EACWC,GAAS9F,KAAKH,OAAO+rG,GAE9B3G,GAGWjlG,KAAKH,OAAO+rG,GAI5B,MAAMC,EAASD,EAAWhuG,MAAMguG,EAAW91F,WAAU/P,GAAO4lG,EAAY5lG,KAClE+lG,EAAYJ,EAAmB,GAAK,CAACC,GACrCI,EAAYL,EAAmB,GAAKE,EAAWhuG,MAAM,EAAGguG,EAAW91F,WAAU/P,GAAO4lG,GAAa5lG,KAAMnC,UAE1G,OACD5G,KAAK0nB,IAAI,6BAA8BinF,EAAW7lG,EAAOm/F,EACvD4G,EAAOnkG,KAAImlC,GAAK7vC,KAAKgJ,sBAAsBgmG,mBAAmBn/D,KAC9Dk/D,EAAUrkG,KAAImlC,GAAK7vC,KAAKgJ,sBAAsBgmG,mBAAmBn/D,MAGrE,MAAMo/D,EAA4B,GAElCjvG,KAAKw7F,UAAUj7F,UAAUgB,IAAI,eAC7B,MAAM2tG,EAAQR,EAAmB,GAAK,GAChC5vE,EAAc4vE,EAAmB,EAAI,EACrCF,EAAkB,CAACrkG,EAAgB20B,EAAc,KACrD,MAAM2W,GAAmB,UACzB,IAAI05D,EAAc,EAsClB,OArCAhlG,EAAKpF,SAAQ,CAACgE,EAAK5C,KACjB,IAAInG,KAAK45B,QAAQ7wB,IAAQ/I,KAAK05F,YAAY7vF,IAAId,GAE5C,YADA/I,KAAK0nB,IAAIpN,KAAK,qCAAsCvR,GAItD,MAAM4gG,EAAiB3pG,KAAK45B,QAAQ7wB,GAAKguC,iBASzC,GAPAo4D,GAAgBhpG,EAAM24B,GAAgB,IAAOowE,EAI7CvF,EAAeppG,UAAUgB,IAAI,aAC7BooG,EAAermG,MAAMwmG,gBAAkBqF,EAAc,KAElDhpG,IAASgE,EAAKtJ,OAAS,EAAI,CAC5B,MAAM+vD,EAAmBtwD,IACpBA,EAAEkY,SAAWmxF,IAIhBl0D,EAAiBttC,UACjBwhG,EAAe/6F,oBAAoB,gBAAiBgiD,KAGtD+4C,EAAetpG,iBAAiB,gBAAiBuwD,GAKnDq+C,EAAWnnG,KAAK6hG,MAGdx/F,EAAKtJ,QACP40C,EAAiBttC,UAGZ,CAACgnG,YAAAA,EAAa15D,iBAAAA,IAGjB25D,EAASZ,EAAgBK,EAAQ/vE,GACjCuwE,EAAYb,EAAgBM,GAC5BQ,EAAYd,EAAgBO,EAAWjwE,GACvCgE,EAAW,CAACssE,EAAO35D,iBAAkB45D,EAAU55D,iBAAkB65D,EAAU75D,kBAC3E85D,EAAmB,CAACH,EAAOD,YAAaE,EAAUF,YAAaG,EAAUH,aAgB/E,IAAI9mG,EAsBJ,OApCGrI,KAAK2mG,wBACA3mG,KAAK2mG,oBAIb,UAAQ,KACN3mG,KAAKo+F,wBAEL6Q,EAAWlqG,SAAQ4kG,IACjBA,EAAeppG,UAAUC,OAAO,oBAMjCquG,EAAOhuG,QAAUiuG,EAAUjuG,QAAUkuG,EAAUluG,UAChDwH,EAAU7E,QAAQC,IAAIq/B,IAEtB,SAA4Bz6B,EAASrF,KAAKH,OAAO0sG,GAAU,KAC1DxtG,MAAK,MACJ,UAAQ,KACNktG,EAAWlqG,SAAQ4kG,IACjBA,EAAermG,MAAMwmG,gBAAkB,MAGzC9pG,KAAKw7F,UAAUj7F,UAAUC,OAAO,kBAK9B,GAAA0V,YACFlW,KAAKkuG,kBAAmB,OAKvB7lG,KAGDmnG,uBAAuBvvG,EAA4F4jD,EAAqB39C,EAAc4iB,GAC5J,MAAMskB,EAAa,2BAGnB,IAAI/9B,EAaAogG,EACJ,GAhBA5rD,EAAOtjD,UAAUgB,IAAI6rC,EAAYA,EAAa,IAAMntC,GAGxC,UAATA,EAAkBoP,GAAQ,IAAAzD,MAAK,oBACjB,UAAT3L,EAAkBoP,GAAQ,IAAAzD,MAAK,qBACtB,eAAT3L,GAAkC,aAATA,EAAqBoP,GAAQ,IAAAzD,MAAK,cAClD,wBAAT3L,EAAgCoP,GAAQ,IAAAzD,MAAK,uBACpC,eAAT3L,IACNoP,EAAQhO,SAASC,cAAc,QAC/B+N,EAAM2e,UAAYhuB,KAAKoc,gBAAgBszF,yBAAyB1vG,KAAKmJ,SAEvEkG,EAAM9O,UAAUgB,IAAI,SAAU6rC,EAAa,UAE3CtkB,EAAShhB,KAAKuH,GAGF,UAATpP,EACD6oB,EAAShhB,MAAK,IAAA8D,MAAK,qBACnB6jG,EAAe,EACb,IAAA7jG,MAAK,sBACL,IAAAA,MAAK,sBACL,IAAAA,MAAK,sBACL,IAAAA,MAAK,2BAEF,GAAY,UAAT3L,EACRwvG,EAAe,EACb,IAAA7jG,MAAK,6BACL,IAAAA,MAAK,6BACL,IAAAA,MAAK,6BACL,IAAAA,MAAK,kCAEF,GAAY,aAAT3L,EAAqB,CAC7B,MAAMmwB,GAAW,IAAAxkB,MAAK,kCACtBwkB,EAAS7vB,UAAUgB,IAAI,SAAU6rC,EAAa,aAE9CptC,KAAKm6F,cAAcx4D,eAAcgB,GAAKA,EAAEkhB,SAAWA,IAEnD,MAAMywC,EAAajzF,SAASC,cAAc,OAC1CgzF,EAAW/zF,UAAUgB,IAAI6rC,EAAa,YAEtC,MAAMvc,EAAa7wB,KAAKm7F,gBAElB15F,EAAczB,KAAK2jD,mBAAmBgsD,qBAAqB5tG,MAAK8V,IACpE,IAAIgZ,IAAc,OAElB,MAAMtC,EAA+B,GAoBrC,OAnBAyC,GAAY,CACVnZ,IAAAA,EAEAoZ,IAAKqjE,EACLzjE,WAAAA,EACApC,cAAezuB,KAAKyuB,cACpByC,MAAOC,GAEPzuB,MAAM,EACNhB,MAAM,EACNqgD,WAAW,EACXxzB,aAAAA,KAGF,QAAiB+lE,GAAah0F,KAC5B,EAAAohB,EAAA,GAAYphB,GACZ+tF,GAAkBt8B,aAAa,CAACv5C,OAAQlY,EAAEkY,YAGrChV,QAAQC,IAAI8qB,MAGrBvuB,KAAKipG,oBAAoB/iG,EAAS29C,GAAQ,EAAO,CAACpiD,IAElDqnB,EAAShhB,KAAKsoB,EAAUkkE,GAGvBmb,IACD3mF,EAAShhB,QACJ2nG,EAAa/kG,KAAI9E,IAClB,MAAMqrD,EAAO5vD,SAASC,cAAc,QAGpC,OAFA2vD,EAAK1wD,UAAUgB,IAAI6rC,EAAa,cAChC6jB,EAAK3sD,OAAOsB,GACLqrD,MAIC,UAAThxD,EACDwvG,EAAa1qG,SAAQa,IACnB,MAAML,EAAIlE,SAASC,cAAc,QACjCiE,EAAEhF,UAAUgB,IAAI,eAChBqE,EAAK1B,QAAQqB,MAEE,UAATtF,GACRwvG,EAAa1qG,SAAQa,IACnB,MAAML,EAAIlE,SAASC,cAAc,QACjCiE,EAAEhF,UAAUgB,IAAI6rC,EAAa,gBAC7B7nC,EAAEyoB,UAAY,IACdpoB,EAAK1B,QAAQqB,OAKhBujB,EAASjoB,OAAS,GACnBgjD,EAAOtjD,UAAUgB,IAAI,mBAGvBunB,EAAS/jB,SAAS4T,GAAiBA,EAAQpY,UAAUgB,IAAI6rC,EAAa,WAGhE+gE,0BAA0BjoG,GAChC,MAAMuhF,IAAiBvhF,EAA4B8U,OAAO0sE,UACpD7jC,EAAS7jD,KAAKk/F,kBAAkBh5F,OAASK,OAAWA,OAAWA,EAAWkhF,GAChF5jC,EAAOtjD,UAAUgB,IAAI,gBAAiB,kBAElCkmF,IACF5jC,EAAOtjD,UAAUgB,IAAI,gBACrBsiD,EAAOtjD,UAAUC,OAAO,gBAAiB,UAG3C,MAAMsoB,EAA8B,GAC9Bk/E,EAAQhoG,KAAKoc,gBAAgB4rF,MAAMhoG,KAAKmJ,QAC9C,GAAGnJ,KAAKq9B,KAAKypE,aACX9mG,KAAKwvG,uBAAuB,aAAc3rD,EAAQ39C,EAAS4iB,OACtD,IAAG2+D,EAAa,CACrB,IAAIxmE,EAAmBlY,EAAakpF,EAAoBt1D,EAExDknB,EAAOtjD,UAAUgB,IAAI,mBAErB,MAAM8/F,EAAmBrhG,KAAKqhG,iBAAoBn7F,EAA4Bm7F,iBACxEl4F,EAASnJ,KAAKoc,gBAAgBgtE,UAAUiY,EAAiBkM,SAE5DlM,EAAiBuO,cAClB3uF,EAAO,kBACPlY,EAAM/I,KAAKgJ,sBAAsB6mG,kBAAkBxO,EAAiBuO,eAC5DvO,EAAiByO,aAAe9vG,KAAKiV,gBAAgB+yF,MAAM7+F,EAAOoL,aAC1E0M,EAAO,uBACPgxE,EAAaoP,EAAiByO,aAE9B7uF,EAAOjhB,KAAKoc,gBAAgB2rF,WAAW5+F,GAAU,yBAA2B,2BAI5EwzB,EADC0kE,EAAiB0O,YACP,KACT,IAAIvX,GAAoB6I,EAAiB2O,iBAAkB3O,EAAiB0O,aAAsCrtF,QAE5G2+E,EAAiB2O,iBACd,KACT,MAAMvyE,EAAqB,CACzBn0B,EAAGivF,GAAmB0X,UACtBC,OAAQ7O,EAAiB2O,kBAG3BhwG,KAAKq9B,KAAKs+D,aAAawU,oBAAoB1yE,IAGlC,KACT5yB,EAAA,sBAAwB,gBAAiB,CACvC1B,OAAAA,EACAJ,IAAAA,EACAkpF,WAAAA,KAKN,MAAM1zE,GAAS,OAAO,yDAA0D,CAC9E0C,KAAAA,IAWF,OARAjhB,KAAKmhG,cAAczzD,QAAQnvB,GAExBoe,IACD,QAAiBpe,EAAQoe,QAG3BknB,EAAOtyC,cAAc,mBAAmBrN,QAAQqa,GAG3C,GAAGypF,GAAuB,YAAd9hG,EAAQoD,EAAiB,CAC1C,MAAMtE,EAAI3D,SAASC,cAAc,KACjC0D,EAAEV,QAAO,IAAAsH,MAAK,iBACdkd,EAAShhB,KAAK9C,EAAG,aACThF,KAAKoc,gBAAgB2rF,WAAW/nG,KAAKmJ,SAAWnJ,KAAKoc,gBAAgBg0F,QAAQpwG,KAAKmJ,QAAQ6R,OAAOq1F,QACzGrwG,KAAKwvG,uBAAuB,QAAS3rD,EAAQ39C,EAAS4iB,GAC3B,cAAnB9oB,KAAKq9B,KAAKp9B,KAClBD,KAAKwvG,uBAAuB,sBAAuB3rD,EAAQ39C,EAAS4iB,GAC5Dje,EAAA,eAAmB7K,KAAKmJ,OAChCnJ,KAAKwvG,uBAAuB,QAAS3rD,EAAQ39C,EAAS4iB,GAC9C9oB,KAAKoc,gBAAgB8lB,OAAOliC,KAAKmJ,UAAY6+F,GAAShoG,KAAKq9B,KAAK4iE,WAAgC,SAAnBjgG,KAAKq9B,KAAKp9B,KAC/FD,KAAKwvG,uBAAuB,WAAY3rD,EAAQ39C,EAAS4iB,GAEzD9oB,KAAKwvG,uBAAuB,aAAc3rD,EAAQ39C,EAAS4iB,GAO1DA,EAASjoB,QACSgjD,EAAOtyC,cAAc,0BAC7BrN,WAAW4kB,GAGxB,MAAMoX,EAA+BunD,EAAc,SAAW,UAC3DznF,KAAKq6F,gCACNr6F,KAAK2mG,gBAAkB,KAKrB,GAJA3mG,KAAKw7F,UAAUt7D,GAAQ2jB,GACvB7jD,KAAK2mG,qBAAkBpgG,GAGnBvG,KAAKk6F,qBACP,OAAO,YAIXl6F,KAAKw7F,UAAUt7D,GAAQ2jB,GAIvB7jD,KAAK4kG,oBAAsB1+F,EAAQ6C,IAI/BunG,uBAAuBC,EAAY,GAEzC,IAAI/7E,GAA6B,cAAnBx0B,KAAKq9B,KAAKp9B,MAAwB,EAAI,GAAKswG,EAGzD,MAAM1/F,GAAM7N,KAAK4yB,IAAIpB,GAErB,MAAO,CAAC3jB,GAAAA,EAAI9H,KADC/F,KAAK4yB,IAAI51B,KAAKgJ,sBAAsB6mG,kBAAkBh/F,KAI7D2/F,0BAA6CC,EAAavgF,EAAuDqgF,EAAY,GACnI,MAAM,GAAC1/F,EAAE,IAAE9H,GAAO/I,KAAKswG,uBAAuBC,GACxCrqG,EAA0F,CAC9FoD,EAAGmnG,EAAU,iBAAmB,UAChC5jF,KAAM,EACNhc,GAAAA,EACA9H,IAAAA,EACAw7E,QAASvkF,KAAKoc,gBAAgBs0F,cAAc1wG,KAAKmJ,QACjD6R,OAAQ,CACNouF,OAAO,IAgBX,OAZIqH,IACFvqG,EAAQA,QAAU,KAKpB,EAAA87C,GAAA,GAAwC97C,GAExCgqB,GAAQA,EAAKhqB,GAEblG,KAAKiJ,mBAAmB0nG,aAAa,CAACzqG,GAAU,CAAC4E,QAAS,IAAIsG,MAC9DlL,EAAQ6C,IAAMA,EACP7C,EAGDo+F,UAAU3iD,EAAkBjhD,EAAgBkwG,GAAoB,GAEtE,GADmB5wG,KAAK4M,WAAWvF,UAAUs6C,KAAUjhD,EACvD,CAUA,GANAV,KAAK4M,WAAWvF,UAAUs6C,GAAQjhD,EAMtB,WAATihD,GAAqB3hD,KAAKoc,gBAAgB2gB,YAAY/8B,KAAKmJ,UAAYnJ,KAAKq9B,KAAKypE,aAA6B,CAC/G,MAAM,IAAC/9F,GAAO/I,KAAKswG,uBA5qIW,GA6qI9B,GAAG5vG,EAAO,CACR,MAAMmwB,EAAa7wB,KAAKm7F,eAAc,IAC7Bn7F,KAAK4M,WAAWvF,UAAUuZ,SAAW5gB,KAAK45B,QAAQ7wB,IAAQ/I,KAAK0mG,6BAA+Br+F,IAGjGA,EAAUrI,KAAK0mG,2BAA6B1mG,KAAKq9B,KAAKkkE,WAAWsP,mBAAmB,gCAAiC,CACzHv1E,QAASt7B,KAAK8T,gBAAgB2tF,gBAAgBzhG,KAAKmJ,OAAOoyB,aACzD,CAACu1E,aAAc,MAAM/uG,MAAKgvG,IAC3B,IAAIlgF,IAAc,OAQlB7wB,KAAKiV,gBAAgB+7F,aAAaD,EAAkB/4C,OACpDh4D,KAAK8T,gBAAgBm9F,aAAaF,EAAkB94C,OAEpD,MAAMopC,EAAmB0P,EAAkBlkG,SAAS9E,QACpD,IAAIs5F,EACF,OAGF0P,EAAkBlkG,SAAS/E,KAAKu5F,GAChC,MAAMn7F,EAAUlG,KAAKwwG,2BAA0B,GAAQtqG,IACrDA,EAAQA,QAAUm7F,EAAiBn7F,QACnCA,EAAQqnG,QAAUlM,EAAiBkM,QACnCrnG,EAAQ01C,SAAWylD,EAAiBzlD,SACpC11C,EAAQ8U,OAAO0sE,WAAY,EAC3BxhF,EAAQm7F,iBAAmBA,IA3sIH,GA8sI1B,OAAO79F,QAAQC,IAAI,CACjBzD,KAAKmkG,qBACLnkG,KAAKk6F,uBACJn4F,MAAK,KACF8uB,KAEY7wB,KAAK6gG,qBAAqB,CAAC36F,IAAU,GAAO,SAE7Dof,SAAQ,KACTtlB,KAAK0mG,gCAA6BngG,UAGpCvG,KAAK4+F,oBAAoB,CAAC71F,IAC1B/I,KAAK0mG,gCAA6BngG,EAItC,GAAY,QAATo7C,GAAkBjhD,GAASV,KAAKoc,gBAAgB4rF,MAAMhoG,KAAKmJ,UAAYnJ,KAAKq9B,KAAKypE,aAAc,CAChG9mG,KAAK0nB,IAAI,0BAET,MAAMmJ,EAAa7wB,KAAKm7F,gBACxB,OAAO33F,QAAQ2E,QAAQnI,KAAK49B,kBAAkBszE,WAAWlxG,KAAKmJ,OAAOoL,aAAaxS,MAAK+uE,I,MACrF,IAAIjgD,IACF,OAGF,KAAqB,QAAjB,EAAAigD,EAASqgC,gBAAQ,eAAE90E,aAErB,YADAr8B,KAAKoxG,gCAIP,MAAMlrG,EAAUlG,KAAKwwG,2BAA0B,GAAOtqG,IACpDA,EAAQA,QAAU4qE,EAASqgC,SAAS90E,eAGtCr8B,KAAKmuG,0BAA0BjoG,MAInClG,KAAKoxG,iCAGAA,gCACL,GAAGpxG,KAAK4M,WAAWvF,UAAUuxB,KAC3B54B,KAAK4M,WAAWvF,UAAUuZ,aACGra,IAA7BvG,KAAK4kG,sBAEH5kG,KAAKq9B,KAAKypE,eACT9mG,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,QAAQ3C,OAEtDkU,OAAOgzC,KAAK1tD,KAAK45B,SAAS/4B,SACzBb,KAAKkjG,qBAEY,cAAnBljG,KAAKq9B,KAAKp9B,OAAyBya,OAAOgzC,KAAK1tD,KAAK45B,SAAS/4B,QAEhE,CACAb,KAAK0nB,IAAI,iCAET,MAAMxhB,EAAUlG,KAAKwwG,2BAA0B,GAG/C,OAFAxwG,KAAKmuG,0BAA0BjoG,IAExB,EAGT,OAAO,EAWFm+F,WAAWv7F,EAAQ,EAAGlC,GAAU,EAAOonG,GAAc,EAAO/F,EAAgB,EAAGxzD,GAAW,GAC/F,MAAMtrC,EAASnJ,KAAKmJ,OAEd4zB,EAAc/8B,KAAKoc,gBAAgB2gB,YAAY5zB,GAE/Co4B,EAAYv+B,KAAKC,IAAI,GAAIu+B,GAAA,SAAoB,GAAkB,GAE/D6vE,EAAgBt0E,EAAc,GAAMriB,OAAOgzC,KAAK1tD,KAAK45B,SAAS/4B,OAAS,EAAImC,KAAKH,IAAI,GAAI0+B,GAAaA,EAE3G,IAAI16B,EAAYwqG,EAOhB,QAAmB9qG,IAAhBgzF,GAA2B,CAC5B,IAAGA,GAKD,MAAO,CAACj9E,QAAQ,EAAOjU,QAAS7E,QAAQ2E,SAAQ,IAJ7CuS,OAAOgzC,KAAK1tD,KAAK45B,SAAS/4B,OAAS,KAClC04F,GASR,IAUIkV,EAVA5lG,EAAY,EAWhB,GAVGmlG,IACDnlG,EAAYhC,EAERD,IACFC,EAAY,IAMbohG,IAAkB+F,EACnB,GAAsB,WAAnBhuG,KAAKq9B,KAAKp9B,KACXwuG,EAAiB,CAACxG,OACb,CACL,MACMrnG,EADiBZ,KAAKiJ,mBAAmBq6F,kBAAkBn6F,EAAQnJ,KAAKq9B,KAAK1wB,UACtD1G,QAAQrF,MACrC,GAAGA,EAAMC,OAASgG,IAAcjG,EAAMmhC,MAAM,WAAgB,CAC1D0sE,EAAiB7tG,EAAMA,QAGvB,IAAI,IAAI2E,EAAIkpG,EAAe5tG,OAAS,EAAG0E,GAAK,GAC1BvF,KAAKq9B,KAAK0oB,WAAW0oD,EAAelpG,IACzCy5F,aAFoCz5F,EAExBkpG,EAAenoG,OAAOf,EAAG,GAIlDuD,EAAQ2lG,EAAeA,EAAe5tG,OAAS,IAAMiI,GAQ3D,IACIwoG,EADA/oG,EAA6EvI,KAAKq+F,eAAev1F,EAAOjC,EAAWgC,GAIvH,MAAM6lG,GAAmBD,MAAAA,OAAc,EAAdA,EAAgB5tG,SAAU0H,aAAkB/E,QAC/D+tG,EAAwBvxG,KAAKw6F,aAAe3xF,GAAaN,aAAkB/E,SAAYkrG,EAC1FA,IACD4C,EAAgB/oG,EAChBA,EAAS,CAACtC,QAASwoG,IAIrBzuG,KAAKw6F,aAAc,EAEnB,MAAMgX,EAAsBC,GAAiC,mCAC3D,GAAG,mBAAoBA,GAAiBA,EAAcxrG,QAAQ87B,MAAM,UAAe,CACjF,GAAsB,eAAnB/hC,KAAKq9B,KAAKp9B,KAAuB,CAElC,MAAMyxG,EAAwB1xG,KAAKiJ,mBAAmB0oG,iCAAiC3xG,KAAKmJ,OAAS,IAAMnJ,KAAKq9B,KAAK1wB,UAClH+kG,GAAuBD,EAAcxrG,QAAQ6B,KAAK4pG,GACrDD,EAAcxrG,QAAQ6B,QAAQ9H,KAAKq9B,KAAK+wB,aAAapuD,KAAKq9B,KAAK1wB,UAAU/F,iBAGrE5G,KAAKskG,UAAU,OAAO,OAI1BsN,EAAOrpG,IASJ,WAA2BxG,MAAK,IAC9ByvG,EAAcjpG,KACpBxG,MAAK,IACC/B,KAAK6gG,qBAAqBt4F,EAAOtC,SAAW,GAAIW,EAASonG,GAAcU,GAAoBzG,KAIhG4J,EAAkBtpG,IACtB,MAAMF,EAAUE,EAAOxG,MAAMwG,IAGxB3B,EAAU5G,KAAKmkG,uBAAyB97F,EAAUrI,KAAKokG,0BAA4B/7F,IACpFrI,KAAK0nB,IAAIpN,KAAK,4BAEP9W,QAAQgsB,UAGdilB,GACDz0C,KAAK4M,WAAW65B,YACT,GAIFmrE,EAAIrpG,KACTsF,IAEF,MADA7N,KAAK0nB,IAAI3Z,MAAM,oBAAqBF,GAC9BA,KAGR,OAAOxF,GAGT,IAAIA,EAA2BiU,EAC/B,GAAG/T,aAAkB/E,QACnB8Y,GAAS,EACTjU,EAAUwpG,EAAetpG,OACpB,IAAGksC,EACR,OAAO,KAEPn4B,GAAS,EAETjU,EAAUupG,EAAIrpG,GAKhB,MAAMupG,EAAcpD,EAAmBmD,EAAeP,GAAiBjpG,EAEvE,GAAGkpG,GAAwB1mG,EAAA,mCAAqD,CAC9E,IAAImyC,EAAQ0xD,EAAmB,EAAI,EACnC1uG,KAAKq6F,gCAAkC,KACrCr6F,KAAK0nB,IAAI,qCAEJs1B,IAELh9C,KAAKq6F,qCAAkC9zF,EAEvBvG,KAAKwuG,gBAAgBvG,EAAewG,EAAgBC,EAAkB7lG,EAAWC,GACzF/G,MAAK,KACXqL,YAAW,KACTpN,KAAKkkG,gBAAgBt9F,GAAS,KAC7B,aAIP5G,KAAKq6F,qCAAkC9zF,EAQzC,OALCK,EAAU5G,KAAKmkG,qBAAuB2N,EAAc9xG,KAAKokG,wBAA0B0N,EACpFA,EAAY/vG,MAAK,KACd6E,EAAU5G,KAAKmkG,0BAAuB59F,EAAYvG,KAAKokG,6BAA0B79F,KAGjFkuC,EACM,OAGO88D,GAAwBlpG,EAAQtG,MAAK,KASnD,IAAIk0D,EARDrvD,GACD5G,KAAKg6F,iBACLh6F,KAAKi6F,kBAAoBj3F,KAAKH,IAAI,IAAK7C,KAAKi6F,qBAE5Cj6F,KAAKi6F,oBACLj6F,KAAKg6F,eAAiBh3F,KAAKH,IAAI,IAAK7C,KAAKg6F,kBAIvCpzF,GAAW5G,KAAKg6F,eAAiB,IAAQpzF,GAAW5G,KAAKi6F,kBAAoB,KAC/EhkC,GAAM,EAAAkB,GAAA,GAAqBn3D,KAAK45B,UAIlC,MAAMm4E,EAA4B,EAAhBV,EAEfp7C,GAAOA,EAAIp1D,OAASkxG,IAClBnrG,GAGDqvD,EAAMA,EAAIr1D,MAAMmxG,GAChB/xG,KAAKskG,UAAU,UAAU,KAOzBruC,EAAMA,EAAIr1D,MAAM,EAAGq1D,EAAIp1D,OAASkxG,GAChC/xG,KAAKskG,UAAU,OAAO,IAQxBtkG,KAAK4+F,oBAAoB3oC,GAAK,OAIlC5tD,EAAQtG,MAAK,KAGW,SAAnB/B,KAAKq9B,KAAKp9B,MAITmN,YAAW,KACNxG,EACD5G,KAAKkkG,iBAAgB,GAAM,GAE3BlkG,KAAKkkG,iBAAgB,GAAO,KAE7B,MAMF,CAAC5nF,OAAAA,EAAQjU,QAAAA,IAGX8gG,qBACL,GAAwB,SAAnBnpG,KAAKq9B,KAAKp9B,MAAsC,eAAnBD,KAAKq9B,KAAKp9B,KAC1C,OAGF,GAAGD,KAAKwmG,qBACN,OAGF,MAAMlyD,EAAiBt0C,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UACxF,IAAI63F,EAAYxkG,KAAKiJ,mBAAmBq+F,qBAAqBtnG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UACpF,GAAI63F,IAEJA,EAAY9pF,OAAOgzC,KAAK1tD,KAAK45B,SAC5B9vB,QAAOf,IAAQ/I,KAAK45B,QAAQ7wB,GAAKxI,UAAUmT,SAAS,YACpDhJ,KAAInF,IAAMA,IACVgF,MAAK,CAACC,EAAGxF,IAAMwF,EAAIxF,IACnBqN,MAAK9M,GAAKA,EAAIi/F,IAEZA,GAAaxkG,KAAK45B,QAAQ4qE,IAAY,CACvC,IAAI3gD,EAAS7jD,KAAK45B,QAAQ4qE,GACvBxkG,KAAKs6F,mBAAqBt6F,KAAKs6F,oBAAsBz2C,IACtD7jD,KAAKs6F,kBAAkB/5F,UAAUC,OAAO,mBACxCR,KAAKs6F,kBAAoB,MAGxBkK,IAAclwD,EAAexrC,OAC9B+6C,EAAOtjD,UAAUgB,IAAI,mBAGvBvB,KAAKs6F,kBAAoBz2C,EACzB7jD,KAAKwmG,sBAAuB,GAIzBjH,wBACL,MAAMyS,KAAqBhyG,KAAKuuF,kBAAZ,EACpB,IAAItuD,GAAU,EACd,IAAI,MAAM16B,KAAKvF,KAAK25F,aAAc,CAChC,MAAMmJ,EAAc9iG,KAAK25F,aAAap0F,GAEnCu9F,EAAY1hG,UAAU2K,oBAAsBimG,IAC7ClP,EAAY1hG,UAAUZ,SACnBR,KAAKuuF,mBACNvuF,KAAKuuF,kBAAkBt+C,UAAU6yD,EAAY1hG,UAAW0hG,EAAY7xE,YAE/DjxB,KAAK25F,aAAap0F,GACzB06B,GAAU,GASVA,IAIJjgC,KAAKoxG,gCACLpxG,KAAKo+F,0BAIF,SAASyP,KACd,MAAMljF,EAAMtpB,SAAS6pB,gBAAgB,6BAA8B,OACnEP,EAAIxC,eAAe,KAAM,UAAW,aACpCwC,EAAIxC,eAAe,KAAM,QAAS,MAClCwC,EAAIxC,eAAe,KAAM,SAAU,MACnCwC,EAAIpqB,UAAUgB,IAAI,eAElB,MAAMgqC,EAAMlqC,SAAS6pB,gBAAgB,6BAA8B,OAKnE,OAJAqgB,EAAIpjB,eAAe,KAAM,OAAQ,wBAEjCwC,EAAIrmB,OAAOinC,GAEJ5gB,EC5rJM,MAAMsnF,GACnBtyG,YAAYwJ,EAAgBJ,EAAampG,EAAc9pD,G,MACrD,IAAI/4C,EAAoBgtB,EAA0B0K,EAChDnlB,EAAuC,GAAI4a,EAA6C,GAE1F,MAAM21E,EAAW/1F,EAAA,gBAA8BjT,GAEzCwzB,EAAW,CAAChb,EAA4CywF,EAAmBC,KAC/EjlG,YAAW,KACT,IAAI/E,EAGAA,EAFD6pG,IAAUnpG,EACRopG,EACSlpG,EAAA,mBAAoCE,GAEpCF,EAAA,qBAAsCE,GAGxCF,EAAA,sBAAuCE,EAAQJ,EAAKmpG,EAAOG,EAAQD,GAG5EhqD,GACD//C,EAAQtG,KAAKqmD,KAEd,MAGL,GAAG8pD,EAAO,CACR,IAAII,EAA0B,eAC1BvpG,GAWFsG,EAAQ,yBACRgtB,EAAc,sBAXX81E,GACD9iG,EAAQ,uBACRgtB,EAAc,oCACd0K,EAAkB,CAAC,KAA+C,QAAzC,EAAA99B,EAAA,iBAAkCE,UAAO,eAAE3C,QAAS,MAE7E6I,EAAQ,wBACRgtB,EAAc,8BACdi2E,EAAa,oBAOjB1wF,EAAQ9Z,KAAK,CACX2xB,QAAS64E,EACTtrE,UAAU,EACVrK,SAAAA,QAEG,CACLttB,EAAQ,uBACR,MAAMkjG,EAA6B,aAEhCppG,EAAO65B,aACRphB,EAAQ9Z,KAAK,CACX2xB,QAAS84E,EACT51E,SAAWhb,GAAYgb,EAAShb,GAAS,GAAQA,EAAQzgB,QAGxD4S,EAAA,cAA4B3K,EAAOoyB,YACpCc,EAAc,0BAEdA,EAAc,kBAEdG,EAAW10B,KAAK,CACdmZ,KAAM,YACNU,SAAS,OAIb0a,EAAc,sBAEXlzB,IAAW0B,EAAA,aACZ+W,EAAQ9Z,KAAK,CACX2xB,QAAS84E,EACT51E,SAAAA,KAGF/a,EAAQ9Z,KAAK,CACX2xB,QAAS84E,EACT51E,SAAWhb,GAAYgb,EAAShb,GAAUA,EAAQzgB,QAGpDs7B,EAAW10B,KAAK,CACdmZ,KAAM,aACNM,SAAU,CAAC,IAAI,KAAU,CAACpY,OAAAA,IAASwP,SACnCgJ,SAAS,OAMjB,QAAgBC,GAEF,IAAIga,GAAU,oBAAqB,CAC/CzyB,OAAAA,EACA6uB,aAAc3oB,EACd+sB,mBAAoBC,EACpBE,oBAAqBwK,EACrBnlB,QAAAA,EACA4a,WAAAA,IAGI9Z,QC/GK,SAAS8vF,GAAiB1+D,EAAY3mC,OAAOw7C,gBAC1D,IAAI7U,IAAcA,EAAU+iD,WAC1B,OAAO,EAGT,MAAM4b,EAAiB3+D,EAAUijD,WAAW,GAC5C,OAAI0b,EAAenpD,aAAempD,EAAeC,aCEpC,MAAMC,WAAmC/2E,GAEtDj8B,YAAYwJ,EAAgBgB,EAAgB4iG,EAA2B3kD,GACrEvoD,MAAM,gCAAiC,CACrCm8B,SAAS,EACTI,mBAAoB,aACpBxa,QAAS,CAAC,CACR6X,QAAS,aACTkD,SAAU,KACJ/5B,EAAW+zB,YAIfyxB,GAAaA,IACbn/C,EAAA,iBAAkCE,EAAQgB,EAAM4iG,EAAQnqG,EAAWlC,OAAOqB,MAAK8wE,IACzEA,GAEJ94C,GAAS,CACPC,YAAa,0BAKrBngB,MAAM,IAGR,MAAMoX,EAAM5vB,SAASC,cAAc,OAGnC0vB,GAAY,CACVnZ,IAHU8rC,GAAA,0BAA2CgvD,GAA2BC,eAIhF3hF,IAAAA,EACAyxB,MAAOiwD,GAA2BC,cAClChxG,MALW,IAMXC,OANW,IAOXH,MAAM,EACNgB,MAAM,IACL4iB,SAAQ,KACTtlB,KAAK0iB,UAGP1iB,KAAKkP,OAAO5K,OAAO2sB,GAEnB,MAAMruB,EAAa,IAAI,IAAW,CAChCyQ,MAAO,aACPC,UAAW,IACXnF,YAAa,0BAGfvL,EAAW7C,MAAMM,iBAAiB,SAAS,KACzCL,KAAK4hB,QAAQ,GAAGjJ,QAAQme,gBAAgB,YAAal0B,EAAW+zB,cAGlE32B,KAAK6Z,KAAKvV,OAAO1B,EAAWxB,YApDhB,GAAAwxG,cAAgB,QCCjB,MAAMC,WAA4Bj3E,GAC/Cj8B,YAAYwJ,EAAgBgB,EAAgBi+C,GAC1CvoD,MAAM,wBAAyB,CAACm4B,aAAc,2BAA4BpW,QAAS,GAAI/H,MAAM,IAE7F1P,EAAOA,EAAKvJ,QAEZ,MAAMghB,EAA8C,CAClD,CAAC,iBAAkB,yBACnB,CAAC,qBAAsB,6BACvB,CAAC,kBAAmB,+BACpB,CAAC,wBAAyB,gCAC1B,CAAC,kBAAmB,2BAItBA,EAAQ7c,SAAQC,IACd,MAAMuZ,GAAS,OAFC,8BAEiB,CAAqB0C,KAAMjc,EAAE,KAC9DhF,KAAK6Z,KAAKvV,OAAOia,MAGnB,MAAMu0F,EAAwBnvD,GAAA,8BAA+CgvD,GAA2BC,gBAExG,QAAiB5yG,KAAK6Z,MAAOvZ,IAC3B,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,eACnCu0F,EAASnrF,GAAQ,EAAAukC,GAAA,GAAW3tC,IAAS,GAE3Cs6F,EAAsB/wG,MAAK,KACzB/B,KAAK6jC,OAEL,IAAI8uE,GAA2BxpG,EAAQgB,EAAM4iG,EAAQ3kD,QAEtD,CAAC54C,eAAgBxP,KAAKwP,iBAEzBxP,KAAK6Z,KAAKvW,MAAMqiG,OAAS,UACzB3lG,KAAK+yG,UAAUzvG,MAAM0vG,UAAY,QAEjChzG,KAAK0iB,QC1CM,MAAMuwF,WAAuBr3E,GAC1Cj8B,cACEE,MAAM,kBAAmB,CACvBm4B,aAAc,8BACdoE,mBAAoB,uBACpBG,oBAAqB,EAAC,IAAA3wB,MAAK,gCAC3BgW,QAAS,CAAC,CACR6X,QAAS,KACTyiC,UAAU,GACT,CACDziC,QAAS,2BACTkD,SAAU,KACRxvB,OAAOwC,KAAK,iBAAY,+BAA+B,KAEzDusD,UAAU,MAId,MAAMtvD,EAAa,IAAI,UAAWrG,GAClCqG,EAAW4lC,mBAAqB,KAC9B5lC,EAAWxL,UAAUb,UAAUsD,OAAO,gBAAiB+I,EAAWohC,WAClEphC,EAAWxL,UAAUb,UAAUsD,OAAO,kBAAmB+I,EAAW+zF,iBAGtE3gG,KAAKq8B,YAAY7O,YAAY5gB,EAAWxL,WAExCwL,EAAWxL,UAAUkD,OAAOtE,KAAKq8B,aACjCzvB,EAAWxL,UAAUb,UAAUgB,IAAI,gBAEnCvB,KAAK0iB,Q,2SClBM,MAAMwwF,WAAyB,KAC5CvzG,YACUsJ,EACA/C,GAERrG,MAAM,qBAGD,KAAM,CAAC8jC,UAAU,EAAM9H,iBAAiB,EAAMhiB,MAAM,IANjD,KAAA5Q,mBAAAA,EACA,KAAA/C,QAAAA,EAORlG,KAAK4P,OAGOA,O,0CACZ,MAAM1J,EAAUlG,KAAKiJ,mBAAmBiyF,sBAAsBl7F,KAAKkG,SAE7DitG,EAA0BnzG,KAAKiJ,mBAAmBmqG,+BAA+BltG,GAIjFqhF,EAAmB,IAAItC,GACvBouB,EAAU,+BACXntG,GAAO,CACV6C,IAAK,EACL8H,GAAI,EACJu4B,UAAW,OAAF,sBACP9/B,EAAG,mBACHi5B,QAAS,IAENr8B,EAAQkjC,WAAS,CAEpBpuB,OAAQ,GACR+qE,iBAAkB,OAItBstB,EAAWjqE,UAAU7G,QAAU8wE,EAAWjqE,UAAU7G,QAAQ73B,KAAI+4E,GACvD,OAAP,wBACKA,GAAa,CAChBzoE,OAAQ,OAIZusE,EAAiB33E,KAAKyjG,EAAY,SAClC9rB,EAAiBh+D,SACjBg+D,EAAiBhnF,UAAUgB,IAAI,aAC/BgmF,EAAiBhnF,UAAUC,OAAO,oBAElC+mF,EAAiBjjF,OAAOtE,KAAKszG,UAE7BtzG,KAAKkP,OAAO5K,OAAOijF,GAEnB,MAAMl2E,EAAgBhQ,SAASC,cAAc,OAC7C+P,EAAc9Q,UAAUgB,IAAI,kBAC5B8P,EAAc2X,QAAQ/mB,UAAY,OAElC,MAAMsxG,EAA8C,IAAIniG,IAExD,IAAIoiG,GAAkB,EACtB,GAAGH,EAAWjqE,UAAU7G,QAAQ1hC,OAAQ,CACtC,MAAMgnC,EAAW7nC,KAAKyzG,mBAAmB,YAAaJ,EAAWjqE,UAAU7G,QAAQ99B,QAAO,CAACC,EAAK4e,IAAM5e,EAAM4e,EAAE9c,OAAO,IAErH+gF,EAAiBrjF,QAAQ2jC,GACzBwrE,EAAWjqE,UAAU7G,QAAQv6B,QAAQ6/B,EAAS47C,eAC9C+vB,GAAkB,EAGpB,IAAIE,GAAsB,EAC1B,GAAGP,EACD,IACE,MAAMQ,QAAoB3zG,KAAKiJ,mBAAmB2qG,2BAA2B1tG,EAAQiD,OAAQjD,EAAQ6C,KACrG,IAAI4qG,EAAY9yG,OACd,KAAM,GAGR,MAAMgnC,EAAW7nC,KAAKyzG,mBAAmB,SAAUE,EAAY9yG,QAE/D0mF,EAAiBrjF,QAAQ2jC,GACzBwrE,EAAWjqE,UAAU7G,QAAQv6B,QAAQ6/B,EAAS47C,eAC9CiwB,GAAsB,EACtB,MAAM7lG,IAKVwlG,EAAWjqE,UAAU7G,QAAQx9B,SAAQ0+E,IACnC,MAAM72E,EAAa,IAAI,UAAWrG,GAClCqG,EAAWxL,UAAUb,UAAUgB,IAAI,YAEnC,MAAM0R,EAAU,IAAIC,GAAe,CACjCwtB,UAAU,EACV5C,aAAa,IAGT+1E,EAAW,kBAAiC,CAChD/4B,WAAY,KAGd,wBAAuC+4B,GAAU,KAC/C7zG,KAAK6jC,cACJt9B,GAAW,GAAO,GAErB0M,EAAQ3D,QAAQhL,OAAOuvG,GACvBjnG,EAAWxL,UAAUkD,OAAO2O,EAAQ7R,WAEpC,MAAM0yG,EAAkD,WAA3BrwB,EAAc57C,SACrCksE,EAA+C,WAA3BtwB,EAAc57C,SAKxC,IAAIgsD,EAJD,CAAC,SAAU,aAAat0D,SAASkkD,EAAc57C,YAChD47C,EAAc57C,cAAWthC,GAI3B,MAAM8/B,EAAS,IAAI/H,GAAiB,CAClC1xB,WAAAA,EACA6xB,WAAY,IAAW,mCACrB,MAAMl2B,QAAevI,KAAKiJ,mBAAmB+qG,2CAA2C9tG,OAASK,EAAWk9E,EAAc57C,SAAUgsD,EAAYigB,EAAsBC,GAgCtK,OA/BAlgB,EAAatrF,EAAOsrF,WAEpBtrF,EAAO0rG,SAASlvG,SAAQ,EAAEoE,OAAAA,EAAQ0+B,SAAAA,MAChC,MAAM,IAAChzB,GAAO,gBAA+B,CAC3CC,OAAQ3L,EACRqC,YAAY,EACZpK,UAAWyyG,EACXlmG,WAAY,GACZoH,eAAe,EACfnH,WAAW,EACXF,YAAY,IAGd,GAAGm6B,EAAU,CACX,MAAM4yB,EAAmBp5D,SAASC,cAAc,OAChDm5D,EAAiBl6D,UAAUgB,IAAI,8BAG/ByvB,GAAY,CACVnZ,IAHwBsvB,GAAA,oBAAsCU,GAGvCG,YACvB/W,IAAKwpC,EACL74D,MAAO,GACPC,OAAQ,KAGVgT,EAAI+wB,OAAOthC,OAAOm2D,IAGpB,EAAAzsD,EAAA,GAAe6G,EAAIG,gBAAiBC,EAAA,sBAAoC9L,EAAOoL,iBAGzEs/E,OAIZ0f,EAAQtuG,IAAI2H,EAAWxL,UAAWilC,GAElCh1B,EAAc/M,OAAOsI,EAAWxL,cAGlCpB,KAAK6Z,KAAKvV,OAAO+M,GAEjB,MAAMxB,GAAY,EAAA0hD,EAAA,GAAeg2B,EAAkBl2E,GAAe,CAACR,EAAI2gD,KACrE,GAAG3gD,IAAQ02E,EAAiBx7E,kBAAoB,EAC9C,OAAO,EAGT,MAAM87B,EAAW0/C,EAAiB32D,SAAS/f,GACrCsgD,EAASthD,EAAUshD,UACV,IAAZA,GACAo2B,EAAiB32D,SAASugC,GAA4BqzB,aAAY,GAGrE38C,EAAS28C,aAAY,GAEN+uB,EAAQ7hG,IAAI8/C,GACpBhwD,UAITqO,EAAU,GAAG,GAEb7P,KAAK0iB,UAGC+wF,mBAAmB5kG,EAAcrI,GACvC,MAAMqhC,EAAW,IAAI27C,GACrB37C,EAASj4B,KAAK,SACdi4B,EAAS47C,cAAgB,CACvBn6E,EAAG,gBACH9C,MAAOA,EACPqhC,SAAUh5B,GAEZg5B,EAAS87C,qBAAoB,GAC7B97C,EAASq8C,gBAET,MAAMgwB,EAAsB7yG,SAASC,cAAc,OAInD,OAHA4yG,EAAoB3zG,UAAUgB,IAAI,mBAAoB,wBAAyB,SAAWsN,GAC1Fg5B,EAAS3jC,QAAQgwG,GAEVrsE,GChMX,MACMssE,GAAsBC,8BAMtBC,IAAqB,GAAAn+F,UASpB,MAAMo+F,GASX30G,YACUwnC,EACAlnC,EACR4wB,GAFQ,KAAAsW,oBAAAA,EACA,KAAAlnC,KAAAA,EA8EF,KAAAwmC,SAAW,KACjBzmC,KAAKu0G,aAAaxvG,SAAQ,CAACyvG,EAASvjF,KAClCjxB,KAAKy0G,oBAAoBxjF,EAAKujF,OAmI1B,KAAAz2F,YAAezd,I,MACrB,MAAMo0G,GAAc,EAAA7xF,GAAA,GAAgBviB,EAAEkY,OAAQ27F,IAC9C,IAAIO,EACF,OAGF,MAAMF,EAAUx0G,KAAKu0G,aAAa7iG,IAAIgjG,GACtC,IAAIF,EACF,OAIF,KAAkB,QAAd,EAAAA,EAAQG,cAAM,eAAEv7F,QAClB,OAGF,MAAMwN,EAAS4tF,EAAQ17E,OACnBlS,GAIDA,EAAOxN,SACRwN,EAAOjlB,UAAW,EAClBilB,EAAOg9B,YAvOT,MAAMgxD,EAAiB50G,KAAK40G,eAAiBvzG,SAASC,cAAc,OACpEszG,EAAer0G,UAAUgB,IAAI6yG,gCAC7BQ,EAAer0G,UAAUgB,IAAI6yG,gCAAuCn0G,GAEpE,MAAM40G,EAAqB70G,KAAKoB,UAAYC,SAASC,cAAc,OACnEuzG,EAAmBt0G,UAAUgB,IAnCJ,sBAqCzB,MAAMuzG,EAAsB90G,KAAK4M,WAAsB,aAAT3M,EAAsB,IAAI,UAAWsG,GAAa,IAAI,UAAYA,GAChHsuG,EAAmBvwG,OAAOwwG,EAAoB1zG,WAC9C0zG,EAAoBtiE,mBAAqBxyC,KAAKymC,SAC9CquE,EAAoB10F,eAEpB00F,EAAoB1zG,UAAUb,UAAUgB,IAAI,gBAE5C,CAAC,OAAOwD,SAAQ9E,IACd,MAAM4jD,EAASxiD,SAASC,cAAc,OACtCuiD,EAAOtjD,UAAUgB,IAAI6yG,4BAAkCA,6BAAoCn0G,GAC3F40G,EAAmBvwG,OAAOu/C,MAG5B7jD,KAAKu0G,aAAe,IAAInjG,IACxBpR,KAAK+0G,eAAiB,uBAAyB16D,KAAKC,MACpDiF,EAAA,uBAA0Cv/C,KAAK+0G,gBAAgB,GAE3D,GAAAn4F,oBACFi4F,EAAmBx0G,iBAAiB,YAAaL,KAAK+d,cAGxD,QAAiB82F,GAAqBv0G,IACpC,MAAMo0G,GAAc,EAAA7xF,GAAA,GAAgBviB,EAAEkY,OAAQ27F,IAC9C,IAAIO,EAAa,OAEjB,MAAMF,EAAUx0G,KAAKu0G,aAAa7iG,IAAIgjG,GAClCF,GAEJx0G,KAAKmnC,oBAAoBm0D,aAAat7F,KAAKkG,QAASsuG,EAAQ3sE,aAG9D+sE,EAAetwG,OAAOuwG,GAEtB70G,KAAK6wB,WAAaA,MAAAA,EAAAA,GAAc,UAG3BjhB,KAAK1J,GACVlG,KAAKkG,QAAUA,EAEf,MAAM2qB,EAAa7wB,KAAK6wB,WAAWnf,MAE7BnJ,EAASvI,KAAKmnC,oBAAoBi0D,+BAA+Bl1F,IACvE,EAAAyrC,GAAA,GAAYppC,GAAS6gC,IACnB,IAAIvY,MAAiBuY,EAAUvoC,OAAQ,OACvCuoC,EAAUrkC,SAAQ8iC,IAChB7nC,KAAKg1G,eAAentE,MAGtB,MAAMotE,EAAa,KACjBj1G,KAAKoB,UAAUb,UAAUgB,IAAI,eAG5BgH,aAAkB/E,SACnB,SAAQyxG,GAERA,OAKC9pG,UACLnL,KAAK6wB,WAAWxX,QAChBrZ,KAAK4M,WAAWmU,kBAChB/gB,KAAKu0G,aAAa1oG,QAClB0zC,EAAA,uBAA0Cv/C,KAAK+0G,gBAAgB,GAC/Dx1D,EAAA,mBAAqC,EAAMv/C,KAAK+0G,gBAAgB,GAS1DC,eAAentE,GACrB,MAAM6sE,EAAcrzG,SAASC,cAAc,OAC3CozG,EAAYn0G,UAAUgB,IAAI4yG,IAE1B,MAAMe,EAAiB7zG,SAASC,cAAc,OAC9C4zG,EAAe30G,UAAUgB,IAAI4yG,GAAsB,UAEnD,MAAMgB,EAAgB9zG,SAASC,cAAc,OAC7C,IAAI8zG,EACJD,EAAc50G,UAAUgB,IAAI4yG,GAAsB,WAE/CtpG,EAAA,qCACDuqG,EAAgB/zG,SAASC,cAAc,OACvC8zG,EAAc70G,UAAUgB,IAAI4yG,GAAsB,UAAW,SAG/D,MAAMK,EAAoC,CACxCY,cAAAA,EACAD,cAAAA,EACAttE,SAAUA,EAASA,UAErB7nC,KAAKu0G,aAAatvG,IAAIyvG,EAAaF,GAEnC,MAAM3jF,EAAa7wB,KAAK6wB,WAAWnf,MAG7BxQ,EAtIY,IAqIC,GAAA0b,mBAAqB,EAAI,MAGtChd,EAAU,CACdgC,MAAOV,EACPW,OAAQX,EACR0gD,UAAW,EACXR,YAAY,EACZW,WAAW,EACX7wB,MAAOlxB,KAAK+0G,eACZlkF,WAAAA,GAGF,GAAIhmB,EAAA,mCASG,CACL,IAAImwD,GAAU,EACdhqC,GAAY,OAAD,QACTnZ,IAAKgwB,EAASwtE,iBACdpkF,IAAKkkF,EACLzyG,MAAM,GACH9C,IACFmC,MAAK6kB,KACN,EAAAo7B,GAAA,GAA0Bp7B,GAE1B4tF,EAAQG,OAAS/tF,EAEjBA,EAAOvmB,iBAAiB,cAAe4hD,IAClCr7B,EAAOs7B,WAAaD,GACrBqzD,EAAkBvzG,MAAMwzG,KACtB,EAAAvzD,GAAA,GAA0BuzD,GAC1BJ,EAAc50G,UAAUgB,IAAI,QAC5B6zG,EAAc70G,UAAUC,OAAO,QAE5Bw6D,IACDw5C,EAAQ17E,OAASy8E,EACjBv6C,GAAU,KAEXzuC,GAAA,QAGNA,GAAA,GAEH,MAAM+oF,EAAoBtkF,GAAY,OAAD,QACnCnZ,IAAKgwB,EAASwzD,iBACdpqE,IAAKmkF,GACFx1G,IACFmC,MAAK6kB,KACN,EAAAo7B,GAAA,GAA0Bp7B,GAEnB89B,GAAA,oBAA+B99B,MACrC3Y,MAAMse,GAAA,eA5CF3sB,EAAQwhD,kBACRxhD,EAAQmiD,UAEf/wB,GAAY,OAAD,QACTnZ,IAAKgwB,EAASG,YACd/W,IAAKkkF,GACFv1G,IAyCPs1G,EAAe5wG,OAAO6wG,GACtBC,GAAiBF,EAAe5wG,OAAO8wG,GACvCV,EAAYpwG,OAAO4wG,GACnBl1G,KAAK4M,WAAWtI,OAAOowG,GAGjBD,oBAAoBxjF,EAAkBujF,GAG5C,MAAMU,EAAiBjkF,EAAIpH,kBACrBk5E,EAAcxL,GAAetmE,EAAKjxB,KAAK4M,WAAWxL,WACxD,IAAIqf,EACJ,GAAIsiF,EAeG,GAAGA,EAAY/K,SAASn3E,MAAQkiF,EAAY/K,SAASxpD,MAAO,CACjE,MAAM7Y,EAAO3yB,KAAK4yB,IAAImtE,EAAYvjF,KAAKqB,KAAOkiF,EAAYvjF,KAAKgvB,OAG/D/tB,EAAY,SAFEzd,KAAKC,IAAI,SAAA0yB,EAAQ,GAAI,SA7NT6/E,GA6NoC,GAAG,GAElC,SAE/B/0F,EAAY,OArBG,CACf,IAAI+zF,EAAQW,cAAc50G,UAAUmT,SAAS,UAAY8gG,EAAQG,OAC/D,OAGCH,EAAQ17E,QACT07E,EAAQ17E,OAAO11B,OAGjBoxG,EAAQG,OAAOvxG,OACfoxG,EAAQG,OAAOhzG,UAAW,EAC1B6yG,EAAQW,cAAc50G,UAAUC,OAAO,QACvCg0G,EAAQY,cAAc70G,UAAUgB,IAAI,QAEpCkf,EAAY,GAUX4zF,KACDa,EAAe5xG,MAAMmd,UAAYA,IC5NxB,MAAMg1F,GAyBnB91G,YACU6vD,EACAnyB,EACAp0B,EACAmT,EACAy5B,EACA/9B,EACA9O,EACAm+B,GAPA,KAAAqoB,SAAAA,EACA,KAAAnyB,KAAAA,EACA,KAAAp0B,mBAAAA,EACA,KAAAmT,gBAAAA,EACA,KAAAy5B,gBAAAA,EACA,KAAA/9B,eAAAA,EACA,KAAA9O,sBAAAA,EACA,KAAAm+B,oBAAAA,EA2BF,KAAAuuE,cAAiBp1G,IACvB,IAAIujD,EAAqB8lD,EAEzB,IACEA,GAAiB,EAAA9mF,GAAA,GAAgBviB,EAAEkY,OAAQ,0BAC3CqrC,EAAS8lD,EAAiBA,EAAe1lG,eAAgB,EAAA4e,GAAA,GAAgBviB,EAAEkY,OAAQ,UACnF,MAAMlY,IAGR,IAAIujD,GAAUA,EAAOtjD,UAAUmT,SAAS,gBAAiB,OAEzD,IAAIiF,EAAU3Y,KAAK2Y,QAEnB,IADGrY,aAAa+rB,YAAc/rB,EAAEmyE,eAAe,oBAAoBnyE,EAAUme,iBAC1E9F,GAAWA,EAAQpY,UAAUmT,SAAS,UACvC,OAAO,GAENpT,aAAa+rB,YAAc/rB,EAAEmyE,eAAe,mBAAkBnyE,EAAUwvD,cAAe,GAE1F,IAAI/mD,GAAO86C,EAAO76B,QAAQjgB,IAC1B,IAAIA,EAAK,OAET,MAAM0+E,EAAcznF,KAAKynF,YAAc1+E,EAAM,EAa7C,GAZA/I,KAAK21G,aAAe31G,KAAKq9B,KAAKyW,UAAUoa,gBAAgBrK,GACxD7jD,KAAKmJ,OAASnJ,KAAKq9B,KAAKl0B,OAExBnJ,KAAKwY,OAASlY,EAAEkY,OAChBxY,KAAK41G,gBAAkBpD,KACvBxyG,KAAK61G,eAAyC,MAAxB71G,KAAKwY,OAAOg4B,UACc,WAA7CxwC,KAAKwY,OAA6BA,QACnCxY,KAAKwY,OAAOjY,UAAUmT,SAAS,eAEjC1T,KAAK81G,iBAA2C,MAAxB91G,KAAKwY,OAAOg4B,SAAmBxwC,KAAKwY,OAAOjY,UAAUmT,SAAS,WAGnF1T,KAAKq9B,KAAKyW,UAAUC,cAAgB41D,EAAgB,CACrD,GAAGliB,EACD,OAGF,MAAMt9E,EAAOnK,KAAKq9B,KAAK+wB,aAAarlD,GACpC,GAAGoB,EAAKtJ,OAAS,EAAG,CAClB,MAAMk1G,EAAc/1G,KAAKq9B,KAAKyW,UAAU+W,cAAc7qD,KAAKmJ,OAAQJ,GACjEA,EACAoB,EAAKkI,MAAKtJ,GAAO/I,KAAKq9B,KAAKyW,UAAU+W,cAAc7qD,KAAKmJ,OAAQJ,KAC/DgtG,IACDhtG,EAAMgtG,IAKZ/1G,KAAKg2G,eAAiBrM,EAEtB,MAAM1M,GAAc,EAAAp6E,GAAA,GAAgB7iB,KAAKwY,OAAQ,gBACjDxY,KAAKi2G,uBAAyBhZ,EAE5Bj9F,KAAK+I,IADJk0F,GACWA,EAAYj0E,QAAQjgB,IAErBA,EAGb/I,KAAK4qD,WAAa5qD,KAAKq9B,KAAKyW,UAAU+W,cAAc7qD,KAAKmJ,OAAQnJ,KAAK+I,KACtE/I,KAAKkG,QAAUlG,KAAKq9B,KAAK0oB,WAAW/lD,KAAK+I,KACzC/I,KAAKk2G,YAAczuB,IAAgBznF,KAAKiJ,mBAAmBkjD,WAAWnsD,KAAKkG,SAC3ElG,KAAKm2G,kBAAe5vG,EACpBvG,KAAKo2G,wBAAqB7vG,EAE1B,MAAM8vG,EAAar2G,KAAK4P,OACxB+I,EAAU09F,EAAW19F,QACrB,MAAM,QAACxN,EAAO,QAAEm7F,EAAO,YAAEgQ,GAAeD,EAElC10D,EAAyBkC,EAAOtjD,UAAUmT,SAAS,SAAW,OAAS,SAG7E,QAAcpT,EAAiBoe,QAAWpe,EAAiBoe,QAAQ,GAAKpe,EAAiBqY,EAASgpC,EAAM20D,IACxG,QAAY39F,GAAS,KACnB3Y,KAAK+I,IAAM,EACX/I,KAAKmJ,YAAS5C,EACdvG,KAAKwY,OAAS,KACdxY,KAAKm2G,kBAAe5vG,EACpBvG,KAAKo2G,wBAAqB7vG,EAC1B4E,IAEAiC,YAAW,KACTk5F,MACC,SA+ZC,KAAAiQ,qBAAuB,KAC1Bv2G,KAAKq9B,KAAKyW,UAAUC,aACrB,QAAmB/zC,KAAKq9B,KAAKyW,UAAUkb,qBAEvC,IAAIvG,GAAazoD,KAAKmJ,OAAQnJ,KAAKq9B,KAAK+wB,aAAapuD,KAAK+I,OAItD,KAAAytG,aAAe,KACrBx2G,KAAKq9B,KAAKt9B,MAAMogG,iBAAiBngG,KAAK+I,MAGhC,KAAA0tG,YAAc,KACpBz2G,KAAKq9B,KAAKt9B,MAAM22G,mBAAmB12G,KAAK+I,MAGlC,KAAA4tG,YAAc,KACjBnE,KAUDh6E,IATax4B,KAAKq9B,KAAKyW,UAAUC,YAC/B,IAAI/zC,KAAKq9B,KAAKyW,UAAUkV,aAAat3C,IAAI1R,KAAKmJ,SAASoB,MAAK,CAACC,EAAGxF,IAAMwF,EAAIxF,IAC1E,CAAChF,KAAK+I,MAEStE,QAAO,CAACC,EAAKqE,KAC5B,MAAM7C,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,GACrC,OAAOrE,IAAOwB,MAAAA,OAAO,EAAPA,EAASA,SAAUA,EAAQA,QAAU,KAAO,MACzD,IAAIgH,QAIP7L,SAAS03B,YAAY,SAKjB,KAAA69E,sBAAwB,KAC9Bp+E,GAAqBx4B,KAAKwY,OAA6Bo7C,OAGjD,KAAAijD,gBAAkB,KACxB,IAAIC,EACkB,eAAnB92G,KAAKq9B,KAAKp9B,OACX62G,EAAgB92G,KAAKiJ,mBAAmBsgF,iBAAiBvpF,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,WAGlF,MAAMyuB,EAAWp7B,KAAKoc,gBAAgB26F,gBAAgBD,EAAgBA,EAAcrpG,OAASzN,KAAKmJ,QAC5Fu7F,EAAQ1kG,KAAKgJ,sBAAsBgmG,mBAAmBhvG,KAAK+I,KACjE,IACIoH,EADAkI,EAAM,gBAEP+iB,GACD/iB,GAAO+iB,EAAW,KAAO07E,EAAgB92G,KAAKgJ,sBAAsBgmG,mBAAmB8H,EAAc/uB,SAAS6nB,cAAgBlL,GAC3HoS,IAAez+F,GAAO,YAAcqsF,GACvCv0F,EAAM,eAENkI,GAAO,KAAOrY,KAAKmJ,OAAOoyB,WAAa,IAAMmpE,EAC1CoS,IAAez+F,GAAO,WAAarY,KAAKgJ,sBAAsBgmG,mBAAmB8H,EAAc/tG,MAClGoH,EAAM,yBAGR2pB,GAAM,iBAAY3pB,GAAK,IAEvBqoB,GAAoBngB,IAGd,KAAA2+F,WAAa,KACnB,IAAI/E,GAAgBjyG,KAAKmJ,OAAQnJ,KAAK+I,MAGhC,KAAAkuG,aAAe,KACrB,IAAIhF,GAAgBjyG,KAAKmJ,OAAQnJ,KAAK+I,KAAK,IAGrC,KAAAmuG,cAAgB,KACtBl3G,KAAK61C,gBAAgBshE,SAASn3G,KAAKkG,QAAS,KAGtC,KAAAkxG,WAAa,KACnBp3G,KAAK61C,gBAAgBwhE,SAASr3G,KAAKkG,UAG7B,KAAAwpD,eAAiB,KACvB,GAAG1vD,KAAKq9B,KAAKyW,UAAUC,aACrB,QAAmB/zC,KAAKq9B,KAAKyW,UAAUsZ,yBAClC,CACL,MAAMjjD,EAAOnK,KAAKi2G,qBAAuB,CAACj2G,KAAK+I,KAAO/I,KAAKq9B,KAAK+wB,aAAapuD,KAAK+I,KAClF,IAAIi/C,GAAa,CACf,CAAChoD,KAAKmJ,QAASgB,MAKb,KAAAwlD,cAAgB,KACtB3vD,KAAKq9B,KAAKyW,UAAUE,iBAAgB,EAAAnxB,GAAA,GAAgB7iB,KAAKwY,OAAQ,kBAAmB,EAAAqK,GAAA,GAAgB7iB,KAAKwY,OAAQ,YAG3G,KAAAo3C,sBAAwB,KAC9B5vD,KAAKq9B,KAAKyW,UAAU4U,mBAGd,KAAAmH,cAAgB,KACnB7vD,KAAKq9B,KAAKyW,UAAUC,aACrB,QAAmB/zC,KAAKq9B,KAAKyW,UAAUuZ,oBAEvC,IAAIlF,GAAoBnoD,KAAKmJ,OAAQnJ,KAAKi2G,qBAAuB,CAACj2G,KAAK+I,KAAO/I,KAAKq9B,KAAK+wB,aAAapuD,KAAK+I,KAAM/I,KAAKq9B,KAAKp9B,OAlnB5HD,KAAKwP,eAAiB,IAAI,IAC1BxP,KAAK6wB,YAAa,UAEf,GAAAjU,oBACD,QAAiB4yC,GAAWlvD,IAC1B,GAAG+8B,EAAKyW,UAAUC,YAChB,OAGF,MAAMzoC,EAAahL,EAAEkY,OAAuBlN,UACxCA,GAAcA,EAAUi0B,WAE5BlC,EAAK3V,IAAI,WAAYpnB,GAER,CAAC,SAAU,yBAA0B,iBAAkB,UAAW,OAAQ,SAAS+R,MAAK4lB,GAAK3sB,EAAU8K,MAAM,IAAIo+C,OAAOv8B,EAAI,iBAEvI,EAAAvW,EAAA,GAAYphB,GAGZN,KAAK01G,cAAcp1G,OAEpB,CAACkP,eAAgBxP,KAAKq9B,KAAKzD,QAAQpqB,kBACjC,QAA0BggD,EAAUxvD,KAAK01G,cAAe11G,KAAKq9B,KAAKzD,QAAQpqB,gBA2F5ErE,UACLnL,KAAKwP,eAAeS,YACpBjQ,KAAKs3G,eAAiBt3G,KAAKs3G,cAAcnsG,UACzCnL,KAAK6wB,WAAWxX,QAGXitF,UACLtmG,KAAKmL,UAGCosG,cAAc31F,GACpB,OAAG5hB,KAAKynF,YACC7lE,EAAQ9X,QAAOyU,GACbA,EAAOkpE,cAGT7lE,EAAQ9X,QAAOyU,IACpB,IAAI4H,EAWJ,OARGnmB,KAAKq9B,KAAKyW,UAAUC,cAAgBx1B,EAAOwxC,cAC5C5pC,GAAO,GAEAnmB,KAAKg2G,cAAgB,GAAAp5F,mBAA5BuJ,EACE5H,EAAO7F,UAIJyN,KAKLqxF,aACNx3G,KAAK4hB,QAAU,CAAC,CACd/S,KAAM,QACNoS,KAAM,sBACNC,QAASlhB,KAAKu2G,qBACd79F,OAAQ,IAAyB,cAAnB1Y,KAAKq9B,KAAKp9B,OAAyBD,KAAKkG,QAAQ8U,OAAO0O,aACpE,CACD7a,KAAM,QACNoS,KAAM,oCACNC,QAASlhB,KAAKu2G,qBACd79F,OAAQ,IAAyB,cAAnB1Y,KAAKq9B,KAAKp9B,MAAwBD,KAAK4qD,aAAe5qD,KAAKq9B,KAAKyW,UAAUkb,oBAAoByoD,aAAa,YACzHC,UAAW,KAAM,EACjB3nD,eAAe,GACd,CACDlhD,KAAM,WACNoS,KAAM,0BACNC,QAAS,KACPlhB,KAAKq9B,KAAKt9B,MAAM43G,iBAAgB,MAC9B,EAAA31D,GAAA,GAA4BhiD,KAAKkG,SACjClG,KAAKiJ,mBAAmB2uG,YAAY53G,KAAKkG,QAASlG,KAAKkG,QAAQA,QAAS,CACtE2xG,aAAc73G,KAAKq9B,KAAKt9B,MAAM83G,aAC9Bj8D,SAAU57C,KAAKkG,QAAQ01C,WAGzB57C,KAAKq9B,KAAKt9B,MAAM6K,eAAc,GAAO,KACpC,IAAIyvC,KAAyB,IAApBr6C,KAAKkG,QAAQ2mB,QAE3BnU,OAAQ,IAAyB,cAAnB1Y,KAAKq9B,KAAKp9B,MACvB,CACD4O,KAAM,QACNoS,KAAM,QACNC,QAASlhB,KAAKw2G,aACd99F,OAAQ,IAAM1Y,KAAKq9B,KAAK4iE,YACrBjgG,KAAKkG,QAAQ8U,OAAO0O,eACnB1pB,KAAKq9B,KAAKt9B,MAAM2lG,cACC,cAAnB1lG,KAAKq9B,KAAKp9B,MAEX,CACD4O,KAAM,OACNoS,KAAM,OACNC,QAASlhB,KAAKy2G,YACd/9F,OAAQ,IAAM1Y,KAAKiJ,mBAAmB6uG,eAAe93G,KAAKkG,QAAS,WAAalG,KAAKq9B,KAAKt9B,MAAM2lG,cAC/F,CACD72F,KAAM,OACNoS,KAAM,OACNC,QAASlhB,KAAK22G,YACdj+F,OAAQ,MAAO1Y,KAAKk2G,aAAiBl2G,KAAKkG,QAA4BA,SAAYlG,KAAK41G,gBAAoB51G,KAAK61G,gBAAmB71G,KAAKkG,QAA4BA,UAAYlG,KAAKwY,OAAOwV,YAC3L,CACDnf,KAAM,OACNoS,KAAM,wBACNC,QAASlhB,KAAK22G,YACdj+F,OAAQ,KAAO1Y,KAAKk2G,cAAiBl2G,KAAKkG,QAA4BA,SAAWlG,KAAK41G,gBACrF,CACD/mG,KAAM,OACNoS,KAAM,iCACNC,QAASlhB,KAAK22G,YACdj+F,OAAQ,KACN,IAAI1Y,KAAK4qD,YAAc5qD,KAAKk2G,WAC1B,OAAO,EAGT,IAAI,MAAO/sG,EAAQgB,KAASnK,KAAKq9B,KAAKyW,UAAUkV,aAC9C,IAAI,MAAMjgD,KAAOoB,EACf,GAAKnK,KAAKiJ,mBAAmBsgF,iBAAiBpgF,EAAQJ,GAAK7C,QACzD,OAAO,EAKb,OAAO,GAETwxG,UAAW,KAAM,EACjB3nD,eAAe,GACd,CACDlhD,KAAM,OACNoS,KAAM,WACNC,QAASlhB,KAAK42G,sBACdl+F,OAAQ,IAAM1Y,KAAK61G,eACnB9lD,eAAe,GACd,CACDlhD,KAAM,OACNoS,KAAM,6BACNC,QAAS,KACPsX,GAAoBx4B,KAAKwY,OAAO1S,YAElC4S,OAAQ,IAAM1Y,KAAK81G,iBACnB/lD,eAAe,GACd,CACDlhD,KAAM,OACNoS,KAAM,4BACNC,QAAS,KACPsX,GAAoBx4B,KAAKwY,OAAO1S,YAElC4S,OAAQ,IAAM1Y,KAAKwY,OAAOjY,UAAUmT,SAAS,kBAC7Cq8C,eAAe,GACd,CACDlhD,KAAM,OACNoS,KAAM,kCACNC,QAASlhB,KAAK62G,gBACdn+F,OAAQ,IAAM1Y,KAAKoc,gBAAgBksB,UAAUtoC,KAAKmJ,UAAYnJ,KAAKkG,QAAQ8U,OAAO0O,aACjF,CACD7a,KAAM,MACNoS,KAAM,sBACNC,QAASlhB,KAAKg3G,WACdt+F,OAAQ,KAAO1Y,KAAKkG,QAAQ8U,OAAO0O,aACd,mBAAnB1pB,KAAKkG,QAAQoD,IACZtJ,KAAKkG,QAAQ8U,OAAOotE,QACrBpoF,KAAKoc,gBAAgB27F,cAAc/3G,KAAKmJ,SACrB,cAAnBnJ,KAAKq9B,KAAKp9B,MACX,CACD4O,KAAM,QACNoS,KAAM,wBACNC,QAASlhB,KAAKi3G,aACdv+F,OAAQ,IAAO1Y,KAAKkG,QAA4B8U,OAAOotE,QAAUpoF,KAAKoc,gBAAgB27F,cAAc/3G,KAAKmJ,SACxG,CACD0F,KAAM,WACNoS,KAAM,+BACNC,QAAS,KACPlhB,KAAK8X,eAAekgG,YAAah4G,KAAKkG,QAAgBoQ,MAAMjV,WAE9DqX,OAAQ,K,MACN,GAAG1Y,KAAKkG,QAAQ8U,OAAO0O,YACrB,OAAO,EAGT,MAAM7R,EAAgG,QAA7E,EAAC7X,KAAKkG,QAA4BoQ,aAA2C,eAAEjV,SACxG,IAAIwW,EAAK,OAAO,EAEhB,IAAIogG,IAAc,GAAAr7F,mBAClB,MAAMs7F,GAAcrgG,EAAI5X,OAAU,CAAC,MAAO,QAAS,WAAoCs/B,SAAS1nB,EAAI5X,MAEpG,OADGi4G,IAAYD,EAAYA,MAAe,EAAAp1F,GAAA,GAAgB7iB,KAAKwY,OAAQ,gBAAiB,EAAAqK,GAAA,GAAgB7iB,KAAKwY,OAAQ,UAC9G0/F,GAAcD,IAEtB,CACDppG,KAAM,eACNoS,KAAM,mBACNC,QAASlhB,KAAKk3G,cACdx+F,OAAQ,K,MACN,MAAMk9B,EAAkC,QAA1B,EAAA51C,KAAKkG,QAAgBoQ,aAAK,eAAEs/B,KAC1C,OAAOA,GAAQA,EAAKgC,cAAc/2C,SAAW+0C,EAAK56B,OAAO08B,SAAW9B,EAAK56B,OAAO86B,OAGjF,CACDjnC,KAAM,OACNoS,KAAM,iBACNC,QAASlhB,KAAKo3G,WACd1+F,OAAQ,K,MACN,MAAMk9B,EAAkC,QAA1B,EAAA51C,KAAKkG,QAAgBoQ,aAAK,eAAEs/B,KAC1C,OAAO51C,KAAKiJ,mBAAmB6uG,eAAe93G,KAAKkG,QAAS,SAAW0vC,IAASA,EAAK56B,OAAO08B,SAAW13C,KAAKkG,QAAQ8U,OAAO0O,cAG5H,CACD7a,KAAM,UACNoS,KAAM,UACNC,QAASlhB,KAAK0vD,eACdh3C,OAAQ,MAAO1Y,KAAKk2G,YAAiC,cAAnBl2G,KAAKq9B,KAAKp9B,MAA0BD,KAAKkG,QAAQ8U,OAAO0O,aAAgB1pB,KAAKkG,QAAQ8U,OAAOiP,KAA2B,mBAAnBjqB,KAAKkG,QAAQoD,IAClJ,CACDuF,KAAM,UACNoS,KAAM,oCACNC,QAASlhB,KAAK0vD,eACdh3C,OAAQ,IAAM1Y,KAAKq9B,KAAKyW,UAAUsZ,qBAChCptD,KAAK4qD,aACJ5qD,KAAKq9B,KAAKyW,UAAUsZ,oBAAoBqqD,aAAa,YACxDC,UAAW,KAAM,EACjB3nD,eAAe,GACd,CACDlhD,KAAM,OACNoS,KAAM,aACNC,QAAS,KACP,IAAI2xF,GAAoB7yG,KAAKmJ,OAAQ,CAACnJ,KAAK+I,OAE7C2P,OAAQ,KAAO1Y,KAAKkG,QAAQ8U,OAAOiP,KAA0B,YAAnBjqB,KAAKkG,QAAQoD,IAAoBtJ,KAAKkG,QAAQ8U,OAAO0O,aAAe1pB,KAAKoc,gBAAgBksB,UAAUtoC,KAAKmJ,QAClJuuG,UAAW,KAAM,EACjB3nD,eAAe,GACd,CACDlhD,KAAM,SACNoS,KAAM,yBACNC,QAASlhB,KAAK2vD,cACdj3C,OAAQ,KAAQ1Y,KAAKkG,QAAmCE,SAAWpG,KAAK4qD,YAAc5qD,KAAK21G,aAC3F+B,UAAW,KAAM,EACjB3nD,eAAe,GACd,CACDlhD,KAAM,SACNoS,KAAM,kCACNC,QAASlhB,KAAK4vD,sBACdl3C,OAAQ,IAAM1Y,KAAK4qD,WACnB8sD,UAAW,KAAM,EACjB3nD,eAAe,GACd,CACD7uC,QAAS,KACP,GAAGlhB,KAAKm2G,aACNn2G,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQnJ,KAAKm2G,mBAEV,KAAGn2G,KAAKo2G,mBAGb,OAAO,EAFP,IAAIlD,GAAiBlzG,KAAKiJ,mBAAoBjJ,KAAKkG,WAKvDwS,OAAQ,KAAK,QAAC,OAAC1Y,KAAKmJ,OAAO+4B,cAA4E,QAA7D,EAA2C,QAA3C,EAACliC,KAAKkG,QAA4BkjC,iBAAS,eAAE28C,wBAAgB,eAAEllF,SAAUb,KAAKiJ,mBAAmBmqG,+BAA+BpzG,KAAKkG,WAC/KwxG,UAAW,KAAM,GAChB,CACD7oG,KAAM,gBACNoS,KAAM,SACNC,QAASlhB,KAAK6vD,cACdn3C,OAAQ,IAAM1Y,KAAKiJ,mBAAmBmjD,iBAAiBpsD,KAAKkG,UAC3D,CACD2I,KAAM,gBACNoS,KAAM,mCACNC,QAASlhB,KAAK6vD,cACdn3C,OAAQ,IAAM1Y,KAAK4qD,aAAe5qD,KAAKq9B,KAAKyW,UAAUuZ,mBAAmBoqD,aAAa,YACtFC,UAAW,KAAM,EACjB3nD,eAAe,GACd,CACDlhD,KAAM,OACNoS,KAAM,8BACNC,QAAS,KACP,IAAI+xF,IAENv6F,OAAQ,KAAM,EACd+uE,aAAa,IAIT73E,OACN5P,KAAKmL,UACLnL,KAAKw3G,aAEL,MAAMr6B,EAAkBn9E,KAAKu3G,cAAcv3G,KAAK4hB,SAC1CjJ,EAAU3Y,KAAK2Y,QAAU,GAAWwkE,EAAiBn9E,KAAKwP,gBAChEmJ,EAAQ9H,GAAK,qBACb8H,EAAQpY,UAAUgB,IAAI,eAEtB,MAAM42G,EAAch7B,EAAgB9qE,MAAKkM,IAAWA,EAAO1P,OAC3D,GAAGspG,EAAa,CACd,MAAM/uE,EAAappC,KAAKkG,QAA4BkjC,UAC9Ci7C,EAAkBj7C,MAAAA,OAAS,EAATA,EAAW28C,iBAC7BqyB,KAAuB/zB,MAAAA,OAAe,EAAfA,EAAiBxjF,QACxCw3G,EAAoBr4G,KAAKiJ,mBAAmBmqG,+BAA+BpzG,KAAKkG,SAAYlG,KAAKoc,gBAAgBg0F,QAAQpwG,KAAKmJ,QAAwBmrD,wBAAqB/tD,EAC3K+xG,EAAgBlvE,EAAYA,EAAU7G,QAAQ99B,QAAO,CAACC,EAAK4e,IAAM5e,EAAM4e,EAAE9c,OAAO,QAAKD,EAE3F4xG,EAAYx/F,QAAQpY,UAAUgB,IAAI,UAAY62G,EAAqB,YAAc,WACjF,MAAMG,EAAW,IAAI,sBAAiB,CACpCpoG,IAAKioG,OACmB7xG,IAAtB8xG,EAAkC,2BAA6B,uBAC7D,eACJ7zG,KAAM4zG,OACkB7xG,IAAtB8xG,EAAkC,CAACC,GAAiB,CAACD,EAAmBA,QACtE9xG,EACJoS,QAASw/F,EAAY72F,cAGvB,IAAIk3F,EAGAA,EAFDJ,OACwB7xG,IAAtB8xG,GACU,IAAAzsG,MAAK,2BAA4B,CAAC0sG,KAElC,IAAA1sG,MACTy4E,EAAgBxjF,SAAWw3G,EAAoB,2BAA6B,uBAC5E,CAACh0B,EAAgBxjF,OAAQw3G,KAIlB,IAAAzsG,MAAK,WAGlB4sG,EAASj4G,UAAUgB,IAAI,2BACvB42G,EAAYx/F,QAAQrU,OAAOk0G,GAE3B,MAAMC,EAAc,EACdC,EAAqB,KAC3BH,EAAS5/F,QAAQrV,MAAMq1G,WAAa,SACpCJ,EAAS5/F,QAAQrV,MAAMs1G,aAAeR,EAAqBM,EAAqB11G,KAAKC,IAAIw1G,EAAap0B,EAAgBxjF,QAAU,MAAQ,OACxI,MAAMgwB,EAAa7wB,KAAK6wB,WAAWnf,MACnC1R,KAAKiJ,mBAAmB+qG,2CAA2Ch0G,KAAKkG,SAA4BnE,MAAMwG,IACxG,IAAIsoB,IACF,OAGC2nF,GACDA,EAASh4G,SAGX,MAAM4oC,EAAY7gC,EAAO0rG,SACnBqE,OAAsC/xG,IAAtB8xG,EACpB9vG,EAAOswG,eAELT,EACEhvE,EAAUt/B,QAAO+9B,GAAYA,EAASA,WAAUhnC,OAChDuoC,EAAUvoC,OAGhB,IAAIi4G,EACJ,GAAwB,IAArB1vE,EAAUvoC,OACXi4G,EAAW,IAAI,KAAU,CACvB3vG,OAAQigC,EAAU,GAAGjgC,OACrBqsD,eAAe,EACf1gD,QAAQ,IACP6D,UAECy/F,GAAsB7vG,EAAOwwG,iBAAiBl4G,QAAU,KAC1Db,KAAKm2G,aAAe/sE,EAAU,GAAGjgC,aAE9B,GAAGivG,EAAoB,CAC5B,MAAMpxF,EAASsxF,IAAkBlvE,EAAUvoC,aAAgC0F,IAAtB8xG,EACrDS,GAAW,IAAAltG,MACTob,EAAS,2BAA6B,uBACtCA,EAAS,CAACsxF,GAAiB,CAACA,EAAelvE,EAAUvoC,cAGnDuoC,EAAUvoC,OAGZi4G,GAAW,IAAAltG,MAAK,cAAe,CAACw9B,EAAUvoC,SAF1C03G,EAAS5/F,QAAQrV,MAAMq1G,WAAa,GAYxC,GANGG,IACDA,EAASx1G,MAAMs1G,aAAeF,EAAqB11G,KAAKC,IAAIw1G,EAAaH,GAAiB,MAC1FQ,EAASv4G,UAAUgB,IAAI,2BACvB42G,EAAYx/F,QAAQrU,OAAOw0G,IAG1B1vE,EAAUvoC,OAAQ,CACnB,MAAM2sC,EAAU,IAAI61C,GAAe,CAAC11E,WAAY,KAChD6/B,EAAQjkB,OAAO86D,EAAkBA,EAAgB35E,KAAI4Y,GAAKtjB,KAAKoc,gBAAgBgtE,UAAU9lE,EAAEihE,WAAYn7C,EAAU1+B,KAAIm9B,GAAYA,EAAS1+B,UAC1IgvG,EAAYx/F,QAAQrU,OAAOkpC,EAAQpsC,WAIjCpB,KAAKo2G,oBAAqB,MAMlC,IAAIE,EACAgB,EACJ,GAAsB,YAAnBt3G,KAAKkG,QAAQoD,IAAoBtJ,KAAKq9B,KAAKyW,UAAUC,cAAgB/zC,KAAKkG,QAAQ8U,OAAO0O,cAAgB1pB,KAAKkG,QAAQ8U,OAAOC,aAAc,CAC5I,MAAM4d,EAAuC,GAAAlc,UAAY,GAAAC,mBAAqC,aAAe,WAC7G06F,EAAgBt3G,KAAKs3G,cAAgB,IAAIhD,GAAkBt0G,KAAKmnC,oBAAqBtO,EAAU74B,KAAK6wB,YACpGymF,EAAc1nG,KAAK5P,KAAKiJ,mBAAmBiyF,sBAAsBl7F,KAAKkG,UACtEyS,EAAQzU,QAAQozG,EAAc1C,gBAE9B,MAEMoE,EAAY93G,GAEhBo1G,EADc,aAAbz9E,EACa,CACZD,IAAK,GAEL/X,KAAMm4F,GAGM,CACZpgF,IAAKogF,EACLxqE,MAAO,GACP3tB,KAAM,IAOZ,OAFA7gB,KAAKq9B,KAAKj8B,UAAUkD,OAAOqU,GAEpB,CACLA,QAAAA,EACAxN,QAAS,KACPnL,KAAKmL,UACLmsG,GAAiBA,EAAcnsG,WAEjCm7F,QAAS,KACP3tF,EAAQnY,UAEV81G,YAAAA,I,qCCtkBS,MAAM2C,GAKnBt5G,YAAYC,GAQVI,KAAKk5G,gBAAkB,CAAC,CACtBrqG,KAAM,OACNoS,KAAM,yBACNC,QAASthB,EAAQu5G,cACjBzgG,OAAQ,IAAoB,aAAd1Y,KAAKC,MAClB,CACD4O,KAAM,WACNoS,KAAM,6BACNC,QAASthB,EAAQw5G,gBACjB1gG,OAAQ,IAAoB,aAAd1Y,KAAKC,MAClB,CACD4O,KAAM,WACNoS,KAAM,wBACNC,QAASthB,EAAQw5G,gBACjB1gG,OAAQ,IAAoB,aAAd1Y,KAAKC,OAGrBD,KAAKq5G,SAAW,GAAWr5G,KAAKk5G,gBAAiBt5G,EAAQ4P,gBACzDxP,KAAKq5G,SAAS94G,UAAUgB,IAAI,YAAa3B,EAAQ05G,WAEjD,QAA0B15G,EAAQ25G,kBAAmBj5G,IAChDV,EAAQ+R,SAAW/R,EAAQ+R,WAI9B3R,KAAKk5G,gBAAgBn0G,SAAQwZ,IAC3BA,EAAO5F,QAAQpY,UAAUsD,OAAO,QAAS0a,EAAO7F,cAGlD,EAAAgJ,EAAA,GAAYphB,IACZ,QAAYN,KAAKq5G,aAChBz5G,EAAQ4P,gBAGNgqG,UAAUrwG,GACfnJ,KAAKC,KAAOkJ,IAAW0B,EAAA,aAAiB,WAAa,Y,0BClC1C,MAAM4uG,WAAwB,KAc3C95G,YAAoB09B,GAkBlB,GAjBAx9B,MAAM,oCAAqC,KAAM,CAAC8jC,UAAU,EAAM81C,YAAa,SAAU5/D,MAAM,IAD7E,KAAAwjB,KAAAA,EAVZ,KAAAoE,OAAS,EAmKT,KAAAi4E,cAAgB,KACtB15G,KAAK25G,QAwGP,KAAArrG,QAAWhO,IACT,MAAMkY,EAASlY,EAAEkY,OAEXohG,GAAa,EAAAr0E,GAAA,GAAU/sB,EAAQ,SAC/BqhG,GAAU,EAAAC,GAAA,GAAathG,GACzBqhG,IACFrhG,EAAOvU,cAAc1D,UAAUgB,IAAI,aACnCq4G,EAAWr5G,UAAUC,OAAO,iBAC5Bo5G,EAAW/vF,kBAAkB2f,gBAAgB,cAG/BowE,EAAW/8E,qBACbg9E,GAAW75G,KAAK+5G,UAAUhuG,kBAAoB,IAC1D/L,KAAKg6G,kBAGPh6G,KAAK62B,gBAGP,KAAAg5B,cAAiBvvD,IACf,MAAMkY,EAASlY,EAAEkY,OACXnF,GAAQ,EAAAkyB,GAAA,GAAU/sB,EAAQ,SAC1BrS,GAAM,EAAAggD,GAAA,GAAW9yC,GAEpBrT,KAAKi6G,gBAAkBj6G,KAAKi6G,eAAe,GAAG,KAAO9zG,IACtDnG,KAAKi6G,oBAAiB1zG,GAGxB8M,EAAM7S,SACNR,KAAKk6G,kBAAkB5zG,OAAOH,EAAK,GAEnCnG,KAAKk6G,kBAAkBn1G,SAAQ,CAACnC,EAAYuD,KAC1CvD,EAAWhD,QAAQu6G,aAAat5G,OAAS,EACzC+B,EAAWhD,QAAQu6G,aAAaryG,KAAK3B,EAAM,GACvB,sBAAiBvD,EAAWyQ,MAAMwW,mBAC1Cgc,YAGd7lC,KAAK62B,iBArSL,IAAA6C,OAAM15B,KAAKqP,MAAO,WAElBrP,KAAKo6G,mBAAqB,IAAI,IAAW,CACvCjsG,YAAa,eACbkF,MAAO,eACPvP,KAAM,WACNwP,UA3BsB,MA8BxBtT,KAAKwP,eAAejO,IAAIvB,KAAKo6G,mBAAmBr6G,MAAhDC,CAAuD,SAAS,KAC9DA,KAAK62B,kBAGP72B,KAAKk6G,kBAAoB,GAEH,cAAnBl6G,KAAKq9B,KAAKp9B,KAAsB,CACjC,MAAMo5G,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACbn5G,KAAKq9B,KAAKt9B,MAAMs6G,YAAa,EAC7Br6G,KAAK25G,QAEPP,gBAAiB,KACfp5G,KAAKq9B,KAAKt9B,MAAM43G,iBAAgB,KAC9B33G,KAAK25G,WAGTL,SAAU,cACVC,iBAAkBv5G,KAAK05E,aAGzB2/B,EAASG,UAAUx5G,KAAKq9B,KAAKl0B,QAE7BnJ,KAAKkP,OAAO5K,OAAO+0G,EAASA,UAG9Br5G,KAAKkP,OAAO5K,OAAOtE,KAAKo6G,mBAAmBh5G,WAE3C,MAAM+0C,EAAK90C,SAASC,cAAc,MAC5BsgC,EAAIvgC,SAASC,cAAc,OACjCsgC,EAAErhC,UAAUgB,IAAI,YAChB,IAAAm4B,OAAMkI,EAAG,eAET5hC,KAAK+5G,UAAY14G,SAASC,cAAc,QACxCtB,KAAK+5G,UAAUx5G,UAAUgB,IAAI,yBAE7B,MAAM+4G,EAAKj5G,SAASC,cAAc,OAClCg5G,EAAG/5G,UAAUgB,IAAI,wBAEjB,MAAMg5G,EAAkBl5G,SAASC,cAAc,OAC/Ci5G,EAAgBh6G,UAAUgB,IAAI,YAC9B,IAAAm4B,OAAM6gF,EAAiB,YAEnBv6G,KAAKq9B,KAAKjhB,gBAAgB2gB,YAAY/8B,KAAKq9B,KAAKl0B,UAClDnJ,KAAKw6G,uBAAyB,IAAI,KAAc,CAC9Cv5F,KAAM,oBACNnd,KAAM,cAER9D,KAAKw6G,uBAAuBz6G,MAAM4hB,SAAU,EAC5C24F,EAAGh2G,OAAOtE,KAAKw6G,uBAAuBnnG,QAGxCrT,KAAKy6G,sBAAwB,IAAI,KAAc,CAC7Cx5F,KAAM,yBACNnd,KAAM,aAER9D,KAAK06G,kBAAoB,IAAI,KAAc,CACzCz5F,KAAM,eACNnd,KAAM,SAGR9D,KAAKwP,eAAejO,IAAIvB,KAAKy6G,sBAAsB16G,MAAnDC,CAA0D,UAAU,KAClE,MAAM2hB,EAAU3hB,KAAKy6G,sBAAsB16G,MAAM4hB,QACjD3hB,KAAK06G,kBAAkB36G,MAAM+2B,gBAAgB,WAAYnV,MAG3D3hB,KAAKwP,eAAejO,IAAIvB,KAAK06G,kBAAkB36G,MAA/CC,CAAsD,UAAU,KAC9D,MAAM2hB,EAAU3hB,KAAK06G,kBAAkB36G,MAAM4hB,QAE5CtX,MAAMC,KAAKtK,KAAK+5G,UAAUnpF,UAA4BlmB,KAAI+G,IACzDA,EAAGlR,UAAUsD,OAAO,cAAe8d,MAGjCA,IACF3hB,KAAKi6G,oBAAiB1zG,EACtBvG,KAAK26G,kBAAkB75G,iBAAiB,KAG1C85G,EAAa71G,SAAQ0M,GAAMA,EAAGlR,UAAUsD,OAAO,QAAS8d,KAExD3hB,KAAKy6G,sBAAsB16G,MAAM+2B,gBAAgB,WAAYnV,GAC7D3hB,KAAK62B,kBAGPyjF,EAAGh2G,OAAOtE,KAAKy6G,sBAAsBpnG,MAAOrT,KAAK06G,kBAAkBrnG,OAEnE,MAAMunG,EAA8B,GAE9BC,EAAsBx5G,SAASC,cAAc,OACnDu5G,EAAoBt6G,UAAUgB,IAAI,YAClC,IAAAm4B,OAAMmhF,EAAqB,2BAE3B,MAAMC,EAASz5G,SAASC,cAAc,MAEhCy5G,EAAwB15G,SAASC,cAAc,OACrDy5G,EAAsBx6G,UAAUgB,IAAI,yBAEpCvB,KAAK26G,kBAAoB,IAAI,IAAW,CACtCxsG,YAAa,kCACbkF,MAAO,kCACPvP,KAAM,WACNwP,UAjIsB,MAoIxBtT,KAAKwP,eAAejO,IAAIvB,KAAKo6G,mBAAmBr6G,MAAhDC,CAAuD,SAAS,KAC9DA,KAAK62B,kBAGP,MAAMmkF,EAAuB35G,SAASC,cAAc,OACpD05G,EAAqBz6G,UAAUgB,IAAI,aACnC,IAAAm4B,OAAMshF,EAAsB,wBAE5BD,EAAsBz2G,OAAOtE,KAAK26G,kBAAkBv5G,UAAW45G,GAE/DJ,EAAa9yG,KAAKgzG,EAAQD,EAAqBE,GAC/CH,EAAa71G,SAAQ0M,GAAMA,EAAGlR,UAAUgB,IAAI,UAE5CvB,KAAK6Z,KAAK5V,cAAcE,aAAagyC,EAAIn2C,KAAK6Z,MAC9C7Z,KAAK6Z,KAAKvV,OAAOs9B,EAAG5hC,KAAK+5G,UAAW14G,SAASC,cAAc,MAAOi5G,EAAiBD,KAAOM,IAE1F,QAAiB56G,KAAK05E,WAAY15E,KAAK05G,cAAe,CAAClqG,eAAgBxP,KAAKwP,iBAE5ExP,KAAK4M,WAAa,IAAI,KAAW5M,KAAK6Z,MACtC7Z,KAAKg6G,kBAELh6G,KAAKi7G,SAAW,KACNj7G,KAAKk7G,mBAAmBr6G,OAGlCb,KAAK62B,eAGCqkF,mBAMN,OALgB7wG,MAAMC,KAAKtK,KAAK+5G,UAAUnpF,UAAUlmB,KAAI,CAAC+G,EAAItL,KAC3D,MAAMpG,EAAQ0R,EAAGF,cAAc,sBAC/B,OAAOxR,aAAiBo7G,iBAAmBp7G,EAAMW,OAAQ,EAAA06G,GAAA,GAAar7G,GAAO,GAAOW,SACnFoJ,QAAOnF,KAAOA,EAAEuI,SASb0sE,W,MACN,MAAMyhC,EAAWr7G,KAAKo6G,mBAAmB15G,MACzC,IAAI26G,EACF,OAAO,EAGT,GAAGA,EAASx6G,OArLY,IAsLtB,OAAO,EAGT,GAAGb,KAAK06G,kBAAkB36G,MAAM4hB,WAA+B,QAAnB,EAAA3hB,KAAKi6G,sBAAc,eAAEp5G,QAC/D,OAAO,EAGT,MAAMw1C,EAAUr2C,KAAKk7G,mBACrB,GAAG7kE,EAAQx1C,OAAS,EAClB,OAAO,EAIT,GADsBw1C,EAAQhkC,MAAK7H,GAAKA,EAAE3J,OAjMpB,MAmMpB,OAAO,EAGT,MAAOH,MAAO46G,IAAgB,EAAAF,GAAA,GAAap7G,KAAK26G,kBAAkB56G,OAAO,GACzE,QAAGu7G,EAAaz6G,OAtMQ,KA6MlBg2B,eACN,MAAM4wC,EAAQznE,KAAK45E,WACnB55E,KAAK05E,WAAW5iD,gBAAgB,YAAa2wC,GAGxCkyC,KAAK4B,GAAQ,GAClB,MAAMF,EAAWr7G,KAAKo6G,mBAAmB15G,MAEnC21C,EAAUr2C,KAAKk7G,oBAEdx6G,MAAO46G,EAAc1/D,SAAU4/D,IAAwB,EAAAJ,GAAA,GAAap7G,KAAK26G,kBAAkB56G,OAElG,GAAsB,cAAnBC,KAAKq9B,KAAKp9B,OAAyBs7G,EAKpC,YAJAv7G,KAAKq9B,KAAKt9B,MAAM43G,iBAAgB,KAC9B33G,KAAK25G,MAAK,MAMd35G,KAAK6jC,OAKL,MAAM7oB,EAAyB,GAE5Bhb,KAAKw6G,yBAA2Bx6G,KAAKw6G,uBAAuBz6G,MAAM4hB,UACnE3G,EAAOk+B,eAAgB,GAGtBl5C,KAAKy6G,sBAAsB16G,MAAM4hB,UAClC3G,EAAOm+B,iBAAkB,GAGxBn5C,KAAK06G,kBAAkB36G,MAAM4hB,UAC9B3G,EAAO86B,MAAO,GAGhB,MAAMF,EAAa,CACjBtsC,EAAG,OACH0R,OAAAA,EACAqgG,SAAAA,EACAhlE,QAASA,EAAQ3rC,KAAI,CAAChK,EAAOyF,KACpB,CACLmD,EAAG,aACH2X,KAAMvgB,EACNg2C,OAAQ,IAAI5xC,WAAW,CAACqB,QAG5B0K,QAAItK,GAIAk1G,EAAiBz7G,KAAKq9B,KAAKwY,gBAAgB6lE,kBAAkB9lE,EAAM51C,KAAKi6G,eAAgBqB,EAAcE,GAI5Gx7G,KAAKq9B,KAAKp0B,mBAAmB0yG,UAAU37G,KAAKq9B,KAAKl0B,OAAQsyG,EAAgB,OAAF,UAClEz7G,KAAKq9B,KAAKu+E,4BAGmB,UAA/B57G,KAAKq9B,KAAKt9B,MAAM87G,YACjB77G,KAAKq9B,KAAKt9B,MAAM+7G,cAGlB97G,KAAKq9B,KAAKt9B,MAAM6K,eAAc,GAAO,GA4C/BovG,kBACN,MAAMv4E,EAASzhC,KAAKyhC,SACdt7B,EAAMnG,KAAK+5G,UAAUhuG,kBAAoB,EACzCgwG,EAAgB,IAAI,IAAW,CACnC5tG,YAAa,2BACbkF,MAAO,sBACP8mG,aAAc,CAACh0G,GACfrC,KAAM,YAAc29B,EACpBnuB,UApUoB,MAsUtBtT,KAAKwP,eAAejO,IAAIw6G,EAAch8G,MAAtCC,CAA6C,QAASA,KAAKsO,SAE3D,MAAMmpB,EAAa,IAAIyB,GAAW,CAChCjY,KAAM,GACNnd,KAAM,aAER2zB,EAAW+B,KAAKl1B,OAAOy3G,EAAc36G,YACrC,QAAiB26G,EAAch8G,MAAO2hB,EAAA,EAAa,CAAClS,eAAgBxP,KAAKwP,iBACzEioB,EAAWpkB,MAAM9S,UAAUgB,IAAI,iBAC/Bk2B,EAAW13B,MAAMuU,UAAW,EACxBtU,KAAK06G,kBAAkB36G,MAAM4hB,SAC/B8V,EAAWpkB,MAAM9S,UAAUC,OAAO,eAEpCR,KAAKwP,eAAejO,IAAIk2B,EAAW13B,MAAnCC,CAA0C,UAAU,KAElD,GADgBy3B,EAAW13B,MAAM4hB,QACrB,CACV,MAAMxb,GAAM,EAAAggD,GAAA,GAAW1uB,EAAWpkB,OAClCrT,KAAKi6G,eAAiB,CAAC,IAAIn1G,WAAW,CAACqB,KACvCnG,KAAK62B,mBAIT,MAAM6+D,EAAYr0F,SAASC,cAAc,QACzCo0F,EAAUn1F,UAAUgB,IAAI,WAAY,eACpCw6G,EAAc36G,UAAUkD,OAAOoxF,IAE/B,QAAiBA,EAAW11F,KAAK6vD,cAAe,CAACrgD,eAAgBxP,KAAKwP,eAAgB2L,MAAM,IAE5Fnb,KAAK+5G,UAAUz1G,OAAOmzB,EAAWpkB,OAEjCrT,KAAK4M,WAAWu2B,kBAAkB,CAChCxqB,QAAS3Y,KAAK+5G,UAAUhjE,iBACxBle,SAAU,WAIZ74B,KAAKk6G,kBAAkBpyG,KAAKi0G,I,eC9XjB,SAASC,GAAej7D,GACrC,MAAM3oC,EAAM2oC,EAAM3oC,IAElB,OAAOxC,MAAMwC,GACZrW,MAAK8T,GAAYA,EAASomG,gBAC1Bl6G,MAAKk6G,IACJ,MAAMr6E,EAAI,IAAI98B,WAAWm3G,GAGzB,IAAIxkG,EAAW,EACf,IAAI,IAAIlS,EAAI,EAAG1E,EAAS+gC,EAAE/gC,OAAQ0E,EAAI1E,IAAU0E,EAE9C,GAAW,IAARq8B,EAAEr8B,IACW,KAAZq8B,EAAEr8B,EAAI,IACM,GAAZq8B,EAAEr8B,EAAI,IACM,GAAZq8B,EAAEr8B,EAAI,GAAY,CAEpB,MAAM2pG,EAASttE,EAAEr8B,EAAI,IAAM,EAAiB,IAAXq8B,EAAEr8B,EAAI,GAIvCkS,GAAYy3F,EAAQ,EAAI,GAAKA,EAIjC,OAAOz3F,EAAW,OCetB,IAAIykG,GAEG,SAASC,KACd,OAAOD,GAGM,MAAME,WAAsB,KAezCz8G,YAAoB09B,EAAoBg/E,EAAeC,GAWrD,GAVAz8G,MAAM,mCAAoC,KAAM,CAAC8jC,UAAU,EAAM81C,YAAa,aAAc8iC,+BAA+B,EAAM1iG,MAAM,IADrH,KAAAwjB,KAAAA,EAAoB,KAAAg/E,MAAAA,EAuIhC,KAAAG,UAAal8G,IACnB,MAAMkY,EAASlY,EAAEkY,OACjB,GAAGA,IAAWxY,KAAKD,MAAO,CACxB,GAAsB,UAAnByY,EAAOg4B,SAAuBh4B,EAAOi/F,aAAa,mBACnD,OAGFz3G,KAAKD,MAAMuN,SACX,EAAAmvG,GAAA,GAAgBz8G,KAAKD,SA0MjB,KAAA28G,WAAchyC,IACpB,MAAMiyC,EAAa38G,KAAK28G,WAClBC,EAAiB58G,KAAK48G,eAAelyC,EAAKzqE,MAE1C48G,EAAyB,GAC/BA,EAAOnyC,KAAOA,EAEd,MAAMoyC,EAAUz7G,SAASC,cAAc,OACvCw7G,EAAQv8G,UAAUgB,IAAI,cAEtBs7G,EAAOC,QAAUA,EAEjB,MAAMz0G,EAAUu0G,EAAiB58G,KAAK+8G,YAAYryC,EAAMmyC,EAAQC,GAAW98G,KAAKg9G,eAAetyC,EAAMmyC,EAAQC,GAE7G,OADAH,EAAWM,gBAAgBn1G,KAAK+0G,GACzBx0G,GApWPrI,KAAK28G,WAAa,CAChB18G,KAAMq8G,EACNW,gBAAiB,GACjB/rF,OAAO,IAGT,QAAiBlxB,KAAK05E,YAAY,IAAM15E,KAAK25G,QAAQ,CAACnqG,eAAgBxP,KAAKwP,iBAErD,cAAnBxP,KAAKq9B,KAAKp9B,KAAsB,CACjC,MAAMo5G,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACbn5G,KAAKq9B,KAAKt9B,MAAMs6G,YAAa,EAC7Br6G,KAAK25G,QAEPP,gBAAiB,KACfp5G,KAAKq9B,KAAKt9B,MAAM43G,iBAAgB,KAC9B33G,KAAK25G,WAGTL,SAAU,cACVC,iBAAkBv5G,KAAK05E,WACvBlqE,eAAgBxP,KAAKwP,iBAGvB6pG,EAASG,UAAUx5G,KAAKq9B,KAAKl0B,QAE7BnJ,KAAKkP,OAAO5K,OAAO+0G,EAASA,UAG9Br5G,KAAKk9G,eAAiB77G,SAASC,cAAc,OAC7CtB,KAAKk9G,eAAe38G,UAAUgB,IAAI,eAClC,MAAMqL,EAAa,IAAI,KAAW,MAClCA,EAAWxL,UAAUkD,OAAOtE,KAAKk9G,gBAEjCl9G,KAAK4C,WAAa,IAAI,IAAW,CAC/BuL,YAAa,mCACbkF,MAAO,UACPvP,KAAM,gBACNwP,UAAWzI,EAAA,oCAEb7K,KAAKD,MAAQC,KAAK4C,WAAW7C,MAE7BC,KAAK4C,WAAWlC,MAAQV,KAAKm9G,cAAgBn9G,KAAKq9B,KAAKt9B,MAAMq9G,kBAAkBr9G,MAAM+F,UACrF9F,KAAKq9B,KAAKt9B,MAAMq9G,kBAAkB18G,MAAQ,GAE1CV,KAAK6Z,KAAKvV,OAAOsI,EAAWxL,WAC5BpB,KAAKoB,UAAUkD,OAAOtE,KAAK4C,WAAWxB,WAEtCpB,KAAKq9G,cAELr9G,KAAKK,iBAAiB,SAAS,KAC7BL,KAAKq8G,MAAQ,GACbH,QAAe31G,KAGjB21G,GAAel8G,KAGVs9G,YAAY3kG,GACjB3Y,KAAK6Z,KAAKvV,OAAOqU,GAGf1Y,WACF,OAAOD,KAAK28G,WAAW18G,KAGrBA,SAAKA,GACPD,KAAK28G,WAAW18G,KAAOA,EAGjBs9G,2B,MACN,MAAMp3F,EAAOnmB,KAAKq8G,MAAMx7G,OAAS,EAC9BslB,IAASnmB,KAAKw9G,oBACfx9G,KAAKw9G,mBAAqB,IAAI,KAAc,CAC1Cv8F,KAAM,2BACNnd,KAAM,gBAER9D,KAAKoB,UAAUkD,UAAU,CAACtE,KAAKw9G,mBAAmBnqG,MAA8B,QAAvB,EAAArT,KAAKy9G,0BAAkB,eAAEpqG,MAAOrT,KAAK4C,WAAWxB,WAAW0I,OAAOa,UAE3H3K,KAAK28G,WAAWzrF,OAAQ,EACxBlxB,KAAKw9G,mBAAmB18G,iBAAiBd,KAAK28G,WAAWzrF,OAEzDlxB,KAAKwP,eAAejO,IAAIvB,KAAKw9G,mBAAmBz9G,MAAhDC,CAAuD,UAAU,KAC/D,MAAM2hB,EAAU3hB,KAAKw9G,mBAAmB77F,QAExC3hB,KAAK28G,WAAWzrF,MAAQvP,EAExB3hB,KAAKq9G,kBAECr9G,KAAKw9G,oBACbx9G,KAAKw9G,mBAAmBnqG,MAAM9S,UAAUsD,OAAO,QAASsiB,GAIpDu3F,2B,MACN,MAAMv3F,IAASnmB,KAAKq8G,MAAMhqG,MAAKq4D,GAAQ,MAA+BA,EAAKzqE,QACxEkmB,IAASnmB,KAAKy9G,oBACfz9G,KAAKy9G,mBAAqB,IAAI,KAAc,CAC1Cx8F,KAAM,6BACNnd,KAAM,mBAER9D,KAAKoB,UAAUkD,UAAU,CAAwB,QAAvB,EAAAtE,KAAKw9G,0BAAkB,eAAEnqG,MAAOrT,KAAKy9G,mBAAmBpqG,MAAOrT,KAAK4C,WAAWxB,WAAW0I,OAAOa,UAE3H3K,KAAKy9G,mBAAmB38G,iBAA0C,UAAzBd,KAAK28G,WAAW18G,MAEzDD,KAAKwP,eAAejO,IAAIvB,KAAKy9G,mBAAmB19G,MAAhDC,CAAuD,UAAU,KAC/D,MAAM2hB,EAAU3hB,KAAKy9G,mBAAmB97F,QAExC3hB,KAAK28G,WAAW18G,KAAO0hB,EAAU,QAAU,WAE3C3hB,KAAKq9G,kBAECr9G,KAAKy9G,oBACbz9G,KAAKy9G,mBAAmBpqG,MAAM9S,UAAUsD,OAAO,QAASsiB,GAIrDw3F,SAAStB,GACd,MAAMuB,EAASvB,EAAMvyG,QAAO4gE,IACZ1qE,KAAKq8G,MAAMhqG,MAAKwrG,GACrBA,EAAMC,eAAiBpzC,EAAKozC,cAAgBD,EAAM/5G,OAAS4mE,EAAK5mE,MAAQ+5G,EAAM38G,OAASwpE,EAAKxpE,SAMpG08G,EAAO/8G,SACRb,KAAKq8G,MAAMv0G,QAAQ81G,GACnB59G,KAAKq9G,eAgBD1D,KAAK4B,GAAQ,GACnB,GAAsB,cAAnBv7G,KAAKq9B,KAAKp9B,OAAyBs7G,EAKpC,YAJAv7G,KAAKq9B,KAAKt9B,MAAM43G,iBAAgB,KAC9B33G,KAAK25G,MAAK,MAMd,IAAI97E,EAAU79B,KAAK4C,WAAWlC,MAC9B,GAAGm9B,EAAQh9B,OAASgK,EAAA,kCAElB,YADAivB,GAAM,iBAAY,sCAAsC,IAI1D95B,KAAK6jC,OACL,MAAM84E,EAAa38G,KAAK28G,WACxBA,EAAWoB,QAA8B,UAApBpB,EAAW18G,WAA0BsG,EAC1D,MAAM,gBAAC02G,EAAe,QAAEc,GAAWpB,GAI7B,OAACxzG,EAAM,MAAEpJ,GAASC,KAAKq9B,KAE7B4/E,EAAgBl4G,SAAQ68B,IACtBA,EAAEk7E,aAAUv2G,KAGd,MAAM,OAAC1F,GAAUo8G,EACXe,EAAgBh+G,KAAKq9B,KAAKu+E,0BAChC57G,KAAK88C,SAASmgE,IACTp/E,GAAWo/E,EAAgBp8G,SAAWA,IACvCb,KAAKq9B,KAAKp0B,mBAAmBg1G,SAAS90G,EAAQ00B,EAAS,OAAF,wBAChDmgF,GAAa,CAChB5mB,YAAY,KAGdv5D,OAAUt3B,GAGZ,MAAM8U,EAAI,OAAH,wBACFshG,GAAU,CACbM,gBAAAA,IAGFj9G,KAAKq9B,KAAKp0B,mBAAmBi1G,UAAU/0G,EAAQkS,EAAE4hG,gBAAgBvyG,KAAIk3B,GAAKA,EAAE8oC,OAAOhwD,OAAO49C,OAAO,OAAD,wBAC3F0lD,GAAa,CAChBngF,QAAAA,EACAkgF,QAASA,EACT3mB,YAAY,IACX/7E,IAEHwiB,OAAUt3B,KAGZxG,EAAMo+G,aAAen+G,KAAKq9B,KAAK1wB,SAC/B5M,EAAM6K,gBAGAmyG,YAAYryC,EAAYmyC,EAAwBC,GAKtD,IAAIz0G,EACJ,GALAy0G,EAAQv8G,UAAUgB,IAAI,oBAENmpE,EAAKzqE,KAAKm+G,WAAW,UAGzB,CACV,MAAMnnG,EAAQ5V,SAASC,cAAc,SAC/B+8G,EAASh9G,SAASC,cAAc,UACtC+8G,EAAOjmG,IAAMykG,EAAOyB,UAAY35D,IAAIC,gBAAgB8lB,GACpDzzD,EAAMtV,UAAW,EACjBsV,EAAMmO,UAAW,EACjBnO,EAAM4D,OAAQ,EACd5D,EAAM/W,aAAa,cAAe,QAElC+W,EAAM5W,iBAAiB,cAAc,KACnC4W,EAAM5U,UACL,CAAC8Y,MAAM,IAEV9S,GAAU,SAAY4O,GAAOlV,MAAK,KAChC86G,EAAOj7G,MAAQqV,EAAMsnG,WACrB1B,EAAOh7G,OAASoV,EAAMunG,YACtB3B,EAAOplG,SAAWzU,KAAKykB,MAAMxQ,EAAMQ,UAEnC,MAAMgnG,EAAyBxnG,EAAcynG,4BAM7C,YAL6Bn4G,IAA1Bk4G,IACD5B,EAAO8B,SAAWF,GAGpB3B,EAAQx4G,OAAO2S,IACR,SAAsBA,GAAOlV,MAAK4sB,IACvCkuF,EAAOluF,MAAQ,OAAH,QACVtW,IAAKssC,IAAIC,gBAAgBj2B,EAAM40B,OAC5B50B,SAKT1X,EAAM3S,OAAO+5G,OACR,CACL,MAAMxvF,EAAM,IAAIwe,MAChBhlC,EAAU,IAAI7E,SAAe2E,IAC3B0mB,EAAI+vF,OAAS,KACX/B,EAAOj7G,MAAQitB,EAAIq9C,aACnB2wC,EAAOh7G,OAASgtB,EAAIs9C,cAEpB2wC,EAAQx4G,OAAOuqB,GAEE,cAAd67C,EAAKzqE,MACN48G,EAAO8B,SAAU,EAEjBn7G,QAAQC,IAAI,CACVu4G,GAAentF,GAAK9sB,MAAK0V,IACvBolG,EAAOplG,SAAWzU,KAAKmsC,KAAK13B,OAG9B,SAAsBoX,GAAK9sB,MAAK4sB,IAC9BkuF,EAAOluF,MAAQ,OAAH,QACVtW,IAAKssC,IAAIC,gBAAgBj2B,EAAM40B,OAC5B50B,QAGN5sB,MAAK,KACNoG,QAGFA,QAKN0mB,EAAIzW,IAAMykG,EAAOyB,UAAY35D,IAAIC,gBAAgB8lB,GAGnD,OAAOriE,EAGD20G,eAAetyC,EAAYmyC,EAAwBC,GACzDA,EAAQv8G,UAAUgB,IAAI,uBAEtB,MAAMs9G,EAAUn0C,EAAKzqE,KAAKm+G,WAAW,UAC/BU,EAAUp0C,EAAKzqE,KAAKm+G,WAAW,WAClCS,GAAWC,KACZjC,EAAOyB,UAAY35D,IAAIC,gBAAgB8lB,IAGzC,MAAM7yD,EAAM,CACVvO,EAAG,WACHohE,KAAMA,EACNjuD,UAAWiuD,EAAK5mE,MAAQ,GACxBqpB,SAAUu9C,EAAK5mE,KAAO,kBAAgC4mE,EAAK5mE,MAAQ,GACnE5C,KAAMwpE,EAAKxpE,KACXjB,KAAM4+G,EAAU,QAAU,OAGtB3mG,EAAeC,GAAA,kBAAmCN,GACxDK,EAAaG,IAAMwkG,EAAOyB,UAC1BpmG,EAAagnC,WAAawrB,EAAKxpE,KAE/B,MAAMk/C,EAASP,GAAa,CAC1B35C,QAAS,CACPoD,EAAG,UACH0R,OAAQ,CACN0O,aAAa,GAEf3gB,IAAK,EACLI,OAAQ,EACRmN,MAAO,CACLhN,EAAG,uBACHjI,SAAUwW,MA2BhB,OAtBgB,IAAIrU,SAAe2E,IACjC,MAAM42G,EAAS,KACbjC,EAAQx4G,OAAO87C,GACfj4C,KAGF,GAAG02G,EAAS,CACV,MAAMhwF,EAAM,IAAIwe,MAChBxe,EAAIzW,IAAMykG,EAAOyB,UACjBzvF,EAAI+vF,OAAS,KACX/B,EAAOj7G,MAAQitB,EAAIq9C,aACnB2wC,EAAOh7G,OAASgtB,EAAIs9C,cAEpB4yC,KAGFlwF,EAAImwF,QAAUD,OAEdA,OAwBEnC,eAAeqC,GACrB,MAAgC,UAAzBj/G,KAAK28G,WAAW18G,MAAoB,MAA+Bg/G,GAGpEC,WAEFl/G,KAAK2Y,QAAQpY,UAAUmT,SAAS,YAClC1T,KAAKwP,eAAejO,IAAIF,SAASwY,KAAjC7Z,CAAuC,UAAWA,KAAKw8G,WACvDx8G,KAAKK,iBAAiB,SAAS,KAC1BL,KAAKm9G,gBACNn9G,KAAKq9B,KAAKt9B,MAAMq9G,kBAAkB18G,MAAQV,KAAKm9G,kBAGnDn9G,KAAK0iB,QAIDxS,WACN,MAAM,WAACysG,EAAU,MAAEttG,EAAK,MAAEgtG,GAASr8G,KACnC,IAAImQ,EACJ,MAAM3L,EAA2B,GACjC,GAAuB,aAApBm4G,EAAW18G,KACZkQ,EAAM,yBACN3L,EAAKsD,KAAKu0G,EAAMx7G,YACX,CACL,IAAIs+G,EAAc,EAAGC,EAAc,EAAGC,EAAa,EACnDhD,EAAMt3G,SAAQ2lE,IACTA,EAAKzqE,KAAKm+G,WAAW,YAAae,EAC7Bz0C,EAAKzqE,KAAKm+G,WAAW,YAAagB,IACnCC,KAGN,CAACF,EAAaC,EAAaC,GAAYv1G,QAAOw1G,GAAKA,EAAI,IAAGz+G,OAAS,GACpEsP,EAAM,yBACN3L,EAAKsD,KAAKu0G,EAAMx7G,SAQLs+G,GACXhvG,EAAM,0BACN3L,EAAKsD,KAAKq3G,IACFC,IACRjvG,EAAM,0BACN3L,EAAKsD,KAAKs3G,KAId,EAAApxG,EAAA,GAAeqB,GAAO,IAAAzD,MAAKuE,EAAK3L,IAG1B+6G,uBAAuBtuF,EAAkB4rF,GAC/C,GAAG78G,KAAK48G,eAAeC,EAAOnyC,KAAKzqE,MAAO,CACxC,MAAMiB,GAAO,EAAAiuF,GAAA,GAAe0tB,EAAOj7G,MAAOi7G,EAAOh7G,OAAQ,IAAK,KAC9DovB,EAAI3tB,MAAM1B,MAAQV,EAAKU,MAAQ,KAC/BqvB,EAAI3tB,MAAMzB,OAASX,EAAKW,OAAS,KAGnC7B,KAAKk9G,eAAe54G,OAAO2sB,GAGrB6rB,QAAQF,GACd,MAAM,gBAACqgE,GAAmBj9G,KAAK28G,WAC/B,IAAI38G,KAAK28G,WAAWzrF,MAElB,YADA+rF,EAAgBl4G,SAAQu3B,GAAKsgB,EAAG,CAACtgB,MAInC,MAAMz7B,EAASo8G,EAAgBp8G,OAC/B,IAAI,IAAI0E,EAAI,EAAGA,EAAI1E,GAAS,CAC1B,MAAM2+G,EAAYvC,EAAgB13G,GAAGmlE,KAAKzqE,KAC1C,IAAIo3C,EAAI,EACR,KAAMA,EAAI,IAAM9xC,EAAI1E,IAAU0E,IAAK8xC,EAAG,CACpC,MAAMp3C,EAAOg9G,EAAgB13G,GAAGmlE,KAAKzqE,KACrC,GAAGD,KAAK48G,eAAe4C,KAAex/G,KAAK48G,eAAe38G,GACxD,MAIJ28C,EAAGqgE,EAAgBr8G,MAAM2E,EAAI8xC,EAAG9xC,KAI5B83G,cACN,MAAM,MAAChB,EAAK,WAAEM,EAAU,eAAEO,GAAkBl9G,KAC5C28G,EAAWM,gBAAgBp8G,OAAS,EAEpCb,KAAKu9G,2BACLv9G,KAAK09G,2BAELl6G,QAAQC,IAAI44G,EAAM3xG,IAAI1K,KAAK08G,aAAa36G,MAAK,KAC3Cm7G,EAAep3G,UAAY,GAEvBu2G,EAAMx7G,SAIVb,KAAKkQ,WAELlQ,KAAK88C,SAASmgE,IACZ,GAAGj9G,KAAK48G,eAAeK,EAAgB,GAAGvyC,KAAKzqE,OAASg9G,EAAgBp8G,OAAS,EAAG,CAClF,MAAM4+G,EAAiBp+G,SAASC,cAAc,OAC9Cm+G,EAAel/G,UAAUgB,IAAI,mBAAoB,cACjDk+G,EAAen7G,UAAU24G,EAAgBvyG,KAAI4O,GAAKA,EAAEwjG,WAEpD33D,GAAa,CACX/jD,UAAWq+G,EACX93G,MAAOs1G,EAAgBvyG,KAAI+xB,IAAK,CAAEphB,EAAGohB,EAAE76B,MAAOqa,EAAGwgB,EAAE56B,WACnD8vB,SAAU,IACVC,SAAU,IACVC,QAAS,IAGXqrF,EAAe54G,OAAOm7G,QAEtBxC,EAAgBl4G,SAAS83G,IACvB78G,KAAKu/G,uBAAuB1C,EAAOC,QAASD,aAIjD96G,MAAK,KACN/B,KAAKk/G,eCzhBX,MAAMQ,GAAe,UACfC,GAAoB,SAEpBC,GAA0B,CAAC,UAAW,aACtCC,GAA0B,CAAC,YAAa,cCF/B,MAAMC,WAA2B,IAoB9CngH,YAAYC,GAOVC,OAAM,GAtBE,KAAAkgH,QAAS,EA4CT,KAAAC,UAAY,KACjBhgH,KAAKq/C,QACNr/C,KAAKq/C,SAGP,MAAM3zC,EAAO1L,KAAK0L,MACZ,OAACojB,EAAM,OAAEuwB,EAAM,YAAE4gE,GDnDZ,UAA8B,KAACv0G,EAAI,KAAEzL,EAAI,SAAE2jC,EAAQ,KAAEzoB,EAAI,WAAE+kG,IAOxE,IAAIC,GAAgBD,MAAAA,OAAU,EAAVA,EAAYr/G,QAAS,IAAI6E,IAAIw6G,QAAc35G,EAC/D,MAAM65G,EAAW,IAAI16G,IAAa,OAATzF,EAAgB2/G,GAAYn6G,OAAOo6G,IAAyB,MAAT5/G,EAAe4/G,GAAcD,IAEzG,IAAIpnG,EACJ,MAAM6nG,EAAmB,IAChB7nG,GAAU9M,EAAK6F,cAAc,YAA4B7F,EAAKme,kBAGjEy2F,EAAmB,CAACpgB,EAAkBqgB,KAC1C,GAAG/nG,IAAW0nF,EACZ,OAGF,IAAIsgB,GAAY,EACbhoG,IACDgoG,GAAY,EACZhoG,EAAOjY,UAAUC,OAAOm/G,KAG1BnnG,EAAS0nF,EACL1nF,IACJA,EAAOjY,UAAUgB,IAAIo+G,IAElBa,GAAa5zG,GAAc2zG,IAC5B,EAAAE,GAAA,GAAiB,CACfr/G,UAAWwL,EACX+L,QAASH,EACTqgB,SAAU,SACV0sE,cAAe,IACfK,KAAe,MAAT3lG,EAAe,IAAM,QAK3BygH,EAAiB,CAACC,EAAwBC,KAC9C,IAAIC,EAIJ,OAHWA,EAARD,EAAqBD,EAAc9jF,oBAAsBnxB,EAAKme,kBAC/C82F,EAAcvrE,wBAA0B1pC,EAAKqrC,iBAExD8pE,GAqBT,IAAIC,EAEFA,EADU,OAAT7gH,EACgB,CAAC0gH,EAAexwG,IACpB,YAARA,GAA6B,cAARA,EArBL,EAACwwG,EAAwBC,KAC9C,MAAMG,EAAWH,EAAS,qBAAuB,yBAC3CI,EAAcJ,EAAS,oBAAsB,mBAC7CK,EAAcN,EAAclhG,wBAElC,IAAIohG,EAAaF,EAAcI,IAAar1G,EAAKs1G,GACjD,KAAMH,IAAeF,GAAe,CAClC,MAAMO,EAAaL,EAAWphG,wBAC9B,GAAGyhG,EAAWjjG,IAAMgjG,EAAYhjG,GAAKijG,EAAW/iG,IAAM8iG,EAAY9iG,EAChE,MAGF0iG,EAAaA,EAAWE,IAAar1G,EAAKs1G,GAG5C,OAAOH,GAM+CM,CAAeR,EAAuB,cAARxwG,GACtEuwG,EAAeC,EAAuB,eAARxwG,GAG3B,CAACwwG,EAAexwG,IAAQuwG,EAAeC,EAAuB,eAARxwG,GAAgC,cAARA,GAGjG,IAAIqsG,EAAal8G,IACf,MAAM6P,EAAM7P,EAAE6P,IACd,GAAIiwG,EAASv2G,IAAIsG,IAWjB,IAFA,EAAAuR,EAAA,GAAYphB,GAEToL,EAAKK,kBAAoB,EAAG,CAC7B,IAAI40G,EAAgBN,IACpBM,EAAgBG,EAAeH,EAAexwG,GAC9CmwG,EAAiBK,GAAe,SAbrB,UAARxwG,GAA6B,OAATlQ,GAAyB,QAARkQ,MACtC,EAAAuR,EAAA,GAAYphB,GACZ8gH,EAAWf,OAejB,MAAMzzG,GAAa,EAAAiW,GAAA,GAAgBnX,EAAM,cACzCA,EAAKnL,UAAUgB,IAAI,kBAEnB,MAAMwc,EAAezd,IACnB,MAAMkY,GAAS,EAAAuyC,GAAA,GAAczqD,EAAEkY,OAAQ9M,GACnC8M,GAIJ8nG,EAAiB9nG,GAAQ,IAGrB0I,EAAW5gB,KACf,EAAAohB,EAAA,GAAYphB,GAEZ,MAAMkY,GAAS,EAAAuyC,GAAA,GAAczqD,EAAEkY,OAAQ9M,GACnC8M,IAIJ8nG,EAAiB9nG,GAAQ,GACzB4oG,EAAWf,OAGPe,EAAc5oG,IAClB,MAAM6oG,EAAcz9E,EAASprB,SACVjS,IAAhB86G,GAA6BA,EAAclmG,IAC5CkkC,KAIJ,IAAIiiE,GAAW,EACf,MAAMxyF,EAAS,KACVwyF,IACHA,GAAW,EAGXjgH,SAAShB,iBAAiBq/G,GAAclD,EAAW,CAAC5sF,SAAS,EAAM5Q,SAAS,IAC5EtT,EAAKrL,iBAAiB,YAAa0d,EAAa,CAACiB,SAAS,KAC1D,QAAiBtT,EAAMwV,KAGnBm+B,EAAS,KACTiiE,IACJA,GAAW,EAEXjgH,SAASuN,oBAAoB8wG,GAAclD,EAAW,CAAC5sF,SAAS,IAChElkB,EAAKkD,oBAAoB,YAAamP,IACtC,QAAiBrS,EAAMwV,KAGnB++F,EAAc,KACfE,GACHG,EAAiB50G,EAAKme,mBAAmB,IAG3C,GAAGs2F,EAAe,CAChB,MAAMoB,EAAa/E,EACnBA,EAAal8G,IACR6/G,EAAct2G,IAAIvJ,EAAE6P,QACrB,EAAAuR,EAAA,GAAYphB,GAEZe,SAASuN,oBAAoB8wG,GAAclD,EAAW,CAAC5sF,SAAS,IAChE4sF,EAAY+E,EACZlgH,SAAShB,iBAAiBq/G,GAAclD,EAAW,CAAC5sF,SAAS,EAAM5Q,SAAS,IAE5EmhG,OAAgB55G,EAChB05G,WAIJA,IAKF,OAFAnxF,IAEO,CACLA,OAAAA,EACAuwB,OAAAA,EACA4gE,YAAAA,GC7HsCuB,CAAqB,CACzD91G,KAAAA,EACAzL,KAAMD,KAAKyhH,SACX79E,SAAU5jC,KAAK4jC,SACfzoB,MAAM,EACN+kG,WAAYlgH,KAAKkgH,aAGnBlgH,KAAK8uB,OAASA,EACd9uB,KAAKq/C,OAASA,EACdr/C,KAAKigH,YAAcA,EACf,GAAA7lC,WAAcp6E,KAAK0hH,iBACrB1hH,KAAK0hH,eAAiB,CACpBzhH,KAAM,sBACN4R,MAAO,KACL7R,KAAK0hH,oBAAiBn7G,EACtBvG,KAAK6D,QAAO,IAEd89G,aAAa,GAGfhxG,EAAA,WAAiC3Q,KAAK0hH,iBAGxC1hH,KAAKK,iBAAiB,UAAU,KAC9BL,KAAKigH,iBAAc15G,EACnBvG,KAAK8uB,YAASvoB,EACdvG,KAAKq/C,YAAS94C,EAEdmF,EAAK5F,UAAY,GACjBu5C,IAEGr/C,KAAK0hH,iBACN/wG,EAAA,aAAmC3Q,KAAK0hH,gBACxC1hH,KAAK0hH,oBAAiBn7G,KAEvB,CAAC4U,MAAM,MA9DV,EAAAlU,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,sBAAuB,aAEpD3B,EAAQmhC,SAASz8B,OAAOtE,KAAKoB,WAE7BpB,KAAK4hH,mBAEL5hH,KAAK6hH,YAAc7hH,KAAK6hH,WAAWC,UAAU9hH,MAGxC+hH,qBAAqBrkG,GACvBA,EACD1d,KAAK8uB,QAAU9uB,KAAK8uB,SAEpB9uB,KAAKq/C,QAAUr/C,KAAKq/C,SAiDduiE,mBACR5hH,KAAKK,iBAAiB,UAAWL,KAAKggH,WAGjCn8G,OAAOggC,EAAgBm+E,GAAiB,EAAOC,GACpD,GAAGjiH,KAAK4P,KACN,OAOF,QAJYrJ,IAATs9B,IACDA,EAAO7jC,KAAKoB,UAAUb,UAAUmT,SAAS,gBAAkB1T,KAAKoB,UAAUb,UAAUmT,SAAS,cAG5F1T,KAAK+/G,SAAWl8E,EAKjB,YAJIA,GACF7jC,KAAKsQ,cAAc,YAMvBtQ,KAAK+/G,OAASl8E,EAEVA,GAIC7jC,KAAK0hH,iBACN/wG,EAAA,aAAmC3Q,KAAK0hH,gBACxC1hH,KAAK0hH,oBAAiBn7G,IAGpBy7G,GAAkBhiH,KAAK6hH,YACzB7hH,KAAK6hH,WAAWK,mBAGfliH,KAAKq/C,QACNr/C,KAAKq/C,WAbPr/C,KAAK6hH,YAAc7hH,KAAK6hH,WAAWK,iBAAiBliH,MACpDA,KAAKsQ,cAAc,YAgBrB,MAAM2rF,EAAUj8F,KAAK6hH,YAAch+E,EAAO,EAAI,EAE3CA,GACD7jC,KAAKsQ,cAAc,WAGrB,QACEtQ,KAAKoB,UACL,cACCyiC,EACDh5B,EAAA,qCAAyCo3G,EAAgB,IAAM,GAC/D,KACEjiH,KAAK+/G,QAAU//G,KAAKsQ,cAAc,YAEpC2rF,IClJS,MAAMkmB,WAAuBrC,GAM1CngH,YAAYohC,EAAuB8gF,GACjChiH,MAAM,CACJkhC,SAAAA,EACA8gF,WAAAA,EACAJ,SAAU,KACV79E,SAAWprB,IACD61E,GAAkBt8B,aAAa,CAACv5C,OAAAA,IAAS,GAEnD0nG,WAAY,CAAC,UAAW,eAG1BlgH,KAAKoB,UAAUb,UAAUgB,IAAI,mBAE7BvB,KAAKK,iBAAiB,WAAW,KAC/B+M,YAAW,KACTpN,KAAK4M,WAAWxL,UAAU4sC,UAAY,IACrC,GAEHnjC,EAAA,sBAAwB,oBAAoB,MAG9C7K,KAAKK,iBAAiB,UAAU,KAC3BL,KAAKoiH,iBACNr3F,EAAA,uBAA+B,eAAgB/qB,KAAKoiH,gBACpDpiH,KAAKoiH,oBAAiB77G,GAGxBsE,EAAA,sBAAwB,oBAAoB,MAIzCw3G,cAAcp+D,GACnB,MAAMpzB,EAAa7wB,KAAK6hH,WAAW1mB,gBAEhCn7F,KAAKyuB,eACNzuB,KAAKyuB,cAAc5iB,QAGrB83C,GAAA,8BAA+CM,GAC/CN,GAAA,wBAAyCM,GACxCliD,MAAMwuF,IACL,IAAI1/D,IACF,OAGC7wB,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd,MAAMxO,EAAYpB,KAAK0L,KAAKtH,YAE5B,IAAIk+G,EAEJtiH,KAAKyuB,cAAc5iB,QAEjBy2G,EADC/xB,EAAS1vF,OACF,IAAI2C,SAAe2E,IACzB,MAAM26B,EAA2B,GACjCytD,EAASxrF,SAAQ+9C,IACf1hD,EAAUkD,OAAOtE,KAAKqwF,qBAAqBR,cAAc/sC,OAAuBv8C,EAAWu8B,OAG5Ft/B,QAAQC,IAAIq/B,GAA2Bxd,QAAQnd,MAG1C3E,QAAQ2E,UAGlBm6G,EAAMvgH,MAAK,KACT/B,KAAK0L,KAAK8hB,YAAYpsB,GACtBpB,KAAK0L,KAAOtK,EAERpB,KAAKoiH,iBACPpiH,KAAKoiH,eAAiB,KACpB,MAAMxgH,EAAS5B,KAAK0L,KAAKK,kBAAoBgf,EAAA,4BAAuC/qB,KAAK0L,KAAKK,kBAAoB,GAClH/L,KAAK0L,KAAKpI,MAAM1B,MAAQA,EAAQ,MAElCmpB,EAAA,oBAA4B,eAAgB/qB,KAAKoiH,iBAGnDpiH,KAAKoiH,iBAELpiH,KAAK6D,QAAQ0sF,EAAS1vF,QACtBb,KAAK4M,WAAWohC,UAAY,QAKxBp+B,OACR5P,KAAK0L,KAAOrK,SAASC,cAAc,OACnCtB,KAAK0L,KAAKnL,UAAUgB,IAAI,2BAA4B,kBAEpDvB,KAAKoB,UAAUkD,OAAOtE,KAAK0L,MAE3B1L,KAAK4M,WAAa,IAAI,KAAW5M,KAAKoB,WACtCpB,KAAKyuB,cAAgB,IAAI,KACzBzuB,KAAKqwF,qBAAuB,IAAIZ,GAAqBzvF,KAAKyuB,cAAe0C,KC7G7E,MAAMoxF,GAAa,KACjB,MAAM11F,EAAO,IAAIwtB,KAGjB,OADAxtB,EAAK4pC,SAAS,EAAG,EAAG,EAAG,GAChB5pC,GAGH21F,GAAa,KACjB,MAAM31F,EAAO,IAAIwtB,KAGjB,OAFAxtB,EAAK20D,YAAY30D,EAAKkqC,cAAgB,GACtClqC,EAAK6pC,QAAQ7pC,EAAK40D,UAAY,GACvB50D,GAOM,MAAM41F,WAAsBjiC,GACzC7gF,YAAY8gF,EAAgBC,EAAqCgiC,GALjD,IAAC71F,EAuBf,GAjBAhtB,OANegtB,EAMC4zD,GALN7pB,UAAY4rD,KAAa5rD,UAAY,IAAIvc,KAASxtB,EAKjC6zD,EAAQ,CACjCC,WAAW,EACX3kD,SAAS,EACT2H,UAAU,EACV81C,aAAa,EACbvkB,QAASqtD,KACThrD,QAASirD,KACTp5F,UAAU,EACV85D,oBAAoB,EACpBq5B,+BAA+B,IAGjCv8G,KAAK2Y,QAAQpY,UAAUgB,IAAI,kBAC3BvB,KAAKkP,OAAO5K,OAAOtE,KAAK0hF,aACxB1hF,KAAKqP,MAAMme,YAAYxtB,KAAK2hF,YAC5B3hF,KAAK6Z,KAAKvV,OAAOtE,KAAK05E,YAEnBgpC,EAAmB,CACpB,MAAMC,GAAoB,OAAO,4DAA6D,CAAC1hG,KAAM,4BACrGjhB,KAAK6Z,KAAKvV,OAAOq+G,IAEjB,QAAiBA,GAAmB,KAClCjiC,EAAO4W,IACPt3F,KAAK6jC,Y,0BCvCE,SAAS++E,GAAsBC,EAAoBC,GAAe,GAC/E,MAAM3/B,EAAkB,GAClBztD,EAAiB,GAEjBoV,EAAM39B,OAAOw7C,eACnB,IAAIo6D,EACAC,EACJ,GAAGl4E,GAAOA,EAAI+rD,WAAY,CACxB,MAAMroB,EAAQ1jC,EAAIisD,WAAW,GACvBksB,EAAcz0C,EAAMy0C,YAC1B,GACEz0C,EAAM00C,gBACN10C,EAAM00C,gBAAkB10C,EAAM20C,cAC9BF,GAAez0C,EAAM40C,UACrB,CAEA,MAAMC,EAA8BJ,EAAc,EAC5Ch9B,EAAa48B,EAAM58B,WACzB,GAAGzX,EAAM00C,iBAAmBL,GAAS58B,EAAWo9B,GAA8B,CAC5EN,EAAU98B,EAAWo9B,GACrBL,EAAY,EAEZ,IAAI,IAAIz9G,EAAI,EAAGA,EAAIipE,EAAM40C,YAAa79G,EAAG,CACvC,MAAM+9G,EAAOr9B,EAAW1gF,GAClB7E,EAAQ4iH,EAAK91B,WAAc81B,EAA0BC,IAExD7iH,IACDsiH,GAAatiH,EAAMG,cAIvBkiH,EAAUv0C,EAAM00C,eAChBF,EAAYC,GAKlB,MAAMrnE,EAA4BknE,EAAe,QAAKv8G,GACtD,EAAAi9G,GAAA,GAAoBX,EAAO1/B,EAAOztD,EAAMqtF,EAASC,EAAWpnE,GAEzDlmB,EAAK70B,QACNsiF,EAAMr7E,KAAK4tB,EAAK7M,KAAK,KAGvB,IAAInoB,EAAQyiF,EAAMt6D,KAAK,MACvB,MAAM46F,EAAW/iH,EAAMuf,QAAQ,KAU/B,OATgB,GAAbwjG,IACD/iH,EAAQA,EAAMgjH,OAAO,EAAGD,GAAY/iH,EAAMgjH,OAAOD,EAAW,IAE9D/iH,EAAQA,EAAMC,QAAQ,UAAW,KAE9Bi7C,GACD,wBAAsCA,GAGjC,CAACl7C,MAAAA,EAAOk7C,SAAAA,EAAU6nE,SAAAA,GCzDZ,MAAME,WAAoB7D,GAGvCngH,YAAYohC,EACV8gF,EACA+B,EACQ52B,GACRntF,MAAM,CACJkhC,SAAAA,EACA8gF,WAAAA,EACAJ,SAAU,IACV79E,SAAWprB,IACTorG,EAAUC,gBAAgBv2B,GAAoB90E,IAAgB,MAN1D,KAAAw0E,gBAAAA,EAURhtF,KAAKoB,UAAUb,UAAUgB,IAAI,gBAGrBqO,OACR5P,KAAK0L,KAAOrK,SAASC,cAAc,OACnCtB,KAAK0L,KAAKnL,UAAUgB,IAAI,sBAAuB,gBAE/CvB,KAAKoB,UAAUkD,OAAOtE,KAAK0L,MAE3B1L,KAAK4M,WAAa,IAAI,KAAY5M,KAAKoB,WAEvCpB,KAAKK,iBAAiB,WAAW,KAC/B+M,YAAW,KACTpN,KAAK4M,WAAWxL,UAAU+1F,WAAa,IACtC,MAIA5tE,OAAOmjE,EAAkBwzB,GAC9B,GAAGlgH,KAAK4P,KAAM,CACZ,IAAI88E,EAAO7rF,OACT,OAGFb,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd88E,EAASA,EAAO9rF,MAAM,EAAG,KAEfC,SACRb,KAAK0L,KAAK5F,UAAY,GACtB4mF,EAAO3nF,SAAQ29C,IACbwqC,GAAYxqC,EAAO1iD,KAAK0L,MAAM,GAAO,OAIzC1L,KAAKkgH,WAAaA,EAAa,CAAC,UAAW,kBAAe35G,EAC1DvG,KAAK6D,QAAQ6oF,EAAO7rF,QAOfijH,WAAWr3G,EAAes3G,GAC/B,MAAMlzF,EAAa7wB,KAAK6hH,WAAW1mB,gBACnCn7F,KAAKgtF,gBAAgBX,uBAAuBtqF,MAAK,KAC/C,IAAI8uB,IACF,OAGF,MAAM8R,EAAIl2B,EAAM9L,QAAQ,KAAM,IACxB+rF,EAAS1sF,KAAKgtF,gBAAgBP,aAAa9pD,GACjD3iC,KAAKupB,OAAOmjE,EAAsB,MAAdq3B,OCtEX,MAAMC,WAA+BlE,GAKlDngH,YACEohC,EACA8gF,EACUv2G,EACVs4B,GAEA/jC,MAAM,CACJkhC,SAAAA,EACA8gF,WAAAA,EACAJ,SAAU,IACV79E,SAAAA,IAPQ,KAAAt4B,UAAAA,EAUVtL,KAAKoB,UAAUb,UAAUgB,IAAIyiH,GAAuB52E,WAAY9hC,GAGxDsE,OACR5P,KAAK0L,KAAOrK,SAASC,cAAc,OACnCtB,KAAK0L,KAAKnL,UAAUgB,IAAIyiH,GAAuB52E,WAAa,QAASptC,KAAKsL,UAAY,SAEtFtL,KAAKoB,UAAUkD,OAAOtE,KAAK0L,MAE3B1L,KAAK4M,WAAa,IAAI,KAAW5M,KAAKoB,WAEtCpB,KAAKK,iBAAiB,WAAW,KAC/B+M,YAAW,KACTpN,KAAK4M,WAAWxL,UAAU4sC,UAAY,IACrC,MAIAzkB,OAAOk6B,EAA+DwgE,GAC3E,GAAGjkH,KAAK4P,KAAM,CACZ,IAAI6zC,EAAK5iD,OACP,OAGFb,KAAK4P,OACL5P,KAAK4P,KAAO,KAGX6zC,EAAK5iD,SACNb,KAAK0L,KAAK5F,UAAY,GACtB29C,EAAK1+C,SAAQ68B,IACX,MAAM3Q,EAAM+yF,GAAuBE,YAAY,CAC7C54G,UAAWtL,KAAKsL,UAChBnC,OAAQy4B,EAAEz4B,OACVrF,KAAM89B,EAAE99B,KACRu4B,YAAauF,EAAEvF,cAGjBr8B,KAAK0L,KAAKpH,OAAO2sB,OAIjBgzF,GACFjkH,KAAK6D,QAAQ4/C,EAAK5iD,QAIfszB,mBAAmBv0B,GAMxB,MAAMukH,EAAOH,GAAuBI,wBACpCxkH,EAAQ0L,WAAa,gBAErB,MAAM2lB,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI4iH,EAAMvkH,EAAQ0L,WAChC2lB,EAAIjI,QAAQ7f,OAAS,GAAKvJ,EAAQuJ,OAElC,MAAMgkC,EAAS,IAAIpR,GACnBoR,EAAO5sC,UAAUgB,IAAI,YAAa4iH,EAAO,UAAWvkH,EAAQ0L,UAAY,WACxE6hC,EAAOjtC,aAAa,SAAU,KAC9BitC,EAAOjtC,aAAa,OAAQ,GAAKN,EAAQuJ,QAEzC,MAAMrF,EAAOzC,SAASC,cAAc,OAepC,GAdAwC,EAAKvD,UAAUgB,IAAI4iH,EAAO,QAASvkH,EAAQ0L,UAAY,SACnD1L,EAAQkE,KAQVA,EAAKgC,UAAY,kBAAgClG,EAAQkE,MAPzDA,EAAKQ,OAAO,IAAI,KAAU,CACxB6E,OAAQvJ,EAAQuJ,OAChB2L,QAAQ,EACR0gD,eAAe,EACf11D,WAAW,IACV6Y,SAKLsY,EAAI3sB,OAAO6oC,EAAQrpC,GAEhBlE,EAAQy8B,YAAa,CACtB,MAAMA,EAAch7B,SAASC,cAAc,OAC3C+6B,EAAY97B,UAAUgB,IAAI4iH,EAAO,eAAgBvkH,EAAQ0L,UAAY,gBACrE+wB,EAAYv2B,UAAY,kBAAgClG,EAAQy8B,aAChEpL,EAAI3sB,OAAO+3B,GAGb,OAAOpL,GCxGJ,SAASozF,GAA2Bz1F,EAAoEniB,GAC7G,MAAM63G,EAA8B,GAAG7+G,OAAOmpB,EAAKuiF,UACnD,IAAIhqG,OAESZ,IAAVkG,IACDtF,EAAQ,IAAI,KAAoB,CAC9Bo9G,YAAY,KAKhB,MAAMC,EAA2B,IAAIpzG,IAkBrC,IAAI6Y,EACJ,GAlBAq6F,EAASv/G,SAAQ0/G,IACfA,EAAQD,SAASz/G,SAAQ,CAAC2/G,EAAYv+G,KACpC,MAAM8xB,EAAI,IAAMysF,EAAWC,QAC3BH,EAASv/G,IAAIy/G,EAAWC,QAAS,CAC/Bx7G,OAAQs7G,EAAQx+E,QAAQhd,UAAS,GACjC07F,QAASD,EAAWC,QACpB7gH,KAAMm0B,EACNoE,YAAaqoF,EAAWroF,YACxBl1B,MAAOhB,IAGNgB,GACDA,EAAMqlF,YAAYk4B,EAAWC,QAAS1sF,SAMxC9wB,EAEG,CACL,MAAMy9G,EAAQz9G,EAAMwlF,OAAOlgF,GAC3Bwd,EAAM5f,MAAMC,KAAKs6G,GAAOl6G,KAAIi6G,GAAWH,EAAS9yG,IAAIizG,UAHpD16F,EAAM,IAAIu6F,EAAShhF,UAQrB,OAFAvZ,EAAMA,EAAI1f,MAAK,CAACC,EAAGxF,IAAMw/G,EAAS9yG,IAAIlH,EAAEm6G,SAASx9G,MAAQq9G,EAAS9yG,IAAI1M,EAAE2/G,SAASx9G,QAE1E8iB,EDvCU,GAAAmjB,WAAa,2BACb,GAAAg3E,wBAA0BJ,GAAuB52E,WAAa,gBCyClE,MAAMy3E,WAAuBb,GAC1CrkH,YAAYohC,EACV8gF,EACA+B,EACQhmF,EACA3oB,GACRpV,MAAMkhC,EACJ8gF,EACA,mBACCrpG,IACC,MAAM1S,EAAY0S,EAAOjH,cAAc,IAAIyyG,GAAuBI,gCAAgCt+G,UAClG,OAAO89G,EAAUkB,gBAAe,KAC9BlB,EAAUle,aAAa5/F,UAAYA,EACnC89G,EAAUzwB,aAAY,SATpB,KAAAv1D,kBAAAA,EACA,KAAA3oB,gBAAAA,EAcH6uG,WAAWr3G,EAAetD,GAC/B,IAAInJ,KAAKiV,gBAAgB+yF,MAAM7+F,GAC7B,OAAO,EAGT,MAAM0nB,EAAa7wB,KAAK6hH,WAAW1mB,gBAWnC,OAVA33F,QAAQ2E,QAAQnI,KAAK49B,kBAAkBmnF,mBAAmB57G,IAASpH,MAAK6sB,IACtE,IAAIiC,IACF,OAGF,MAAM6iB,EAAW2wE,GAA2Bz1F,EAAMniB,GAClDzM,KAAKupB,OAAOmqB,OAIP,GClFI,MAAMsxE,GAArB,cACU,KAAAC,QAAmC,IAAIv/G,IACvC,KAAAmrB,YAAa,UAWdkxF,qBAAqBrkG,GAC1B,IAAI,MAAMkhE,KAAU5+E,KAAKilH,QACvBrmC,EAAOmjC,qBAAqBrkG,GAIzBy9E,gBAEL,OADAn7F,KAAK6wB,WAAWxX,QACTrZ,KAAK6wB,WAAWnf,MAGlBowG,UAAUljC,GACf5+E,KAAKilH,QAAQ1jH,IAAIq9E,GAGZsjC,iBAAiBgD,GACtBllH,KAAKilH,QAAQlgH,SAAQ65E,IAChBA,IAAWsmC,GACZtmC,EAAO/6E,QAAO,GAAM,MAIpBqhH,GACFllH,KAAK6wB,WAAWxX,SChCP,MAAM8rG,WAAuBnB,GAC1CrkH,YAAYohC,EACV8gF,EACA+B,EACQhmF,EACA3oB,GACRpV,MAAMkhC,EACJ8gF,EACA,mBACCrpG,IACC,MAAMyxB,EAAOh1B,EAAgBw4F,QAASj1F,EAAuBwQ,QAAQ7f,OAAOoL,YAC5E,IAAcu+C,EAAV2c,EAAM,GACPxlC,EAAK7O,SACNq0C,EAAM,IAAMxlC,EAAK7O,UAEjBq0C,EAAMxlC,EAAKE,YAAcF,EAAKG,UAC9B0oB,EAAS,CACPxpD,EAAG,2BACHzI,OAAQ4uE,EAAI5uE,OACZ2zB,OAAQ,EACRyR,QAASgE,EAAKp5B,KAIlB4+D,GAAO,IACPm0C,EAAUwB,cAAc31C,EAAK3c,MArBzB,KAAAl1B,kBAAAA,EACA,KAAA3oB,gBAAAA,EAyBH6uG,WAAWr3G,EAAetD,EAAgBk8G,GAC/C,MAAMC,EAAU74G,EAAMS,OACtB,GAAGT,EAAM5L,SAAWykH,EAAQzkH,OAAQ,OAAO,EAE3C,MAAMgwB,EAAa7wB,KAAK6hH,WAAW1mB,gBAkBnC,OAjBAn7F,KAAK49B,kBAAkB2nF,YAAYp8G,GAAUA,EAAOoyB,WAAY+pF,EAASD,GAAUtjH,MAAKsS,IACtF,IAAIwc,IAAc,OAElB,MAAMuK,EAAWkqF,EAAQ1kH,MAAM,GAAGu/C,cAClCngD,KAAKupB,OAAOlV,EAAQ3J,KAAIvB,IACtB,MAAM8gC,EAAOjqC,KAAKiV,gBAAgBw4F,QAAQtkG,GAC1C,IAAG8gC,EAAK7O,UAAY6O,EAAK7O,SAAS+kB,gBAAkB/kB,EAIpD,MAAO,CACLjyB,OAAAA,EACAkzB,YAAa4N,EAAK7O,SAAW,IAAM6O,EAAK7O,cAAW70B,MAEpDuD,OAAOa,cAGL,G,eC5CI,MAAM66G,WAAsB7wB,GAUzCh1F,YAAYC,GAOVC,MAAM,CACJ8Y,QAAStX,SAASC,cAAc,SAsE5B,KAAAmkH,iBAAoBnlH,IAC1B,MAAMkY,EAASlY,EAAEoe,QAAQ,GAAGlG,QACxB,EAAAuyC,GAAA,GAAcvyC,EAAQxY,KAAK2Y,UAAYH,IAAWxY,KAAK0lH,YACzD,EAAAhkG,EAAA,GAAYphB,GACZN,KAAK6D,QAAO,MAvEd,EAAAoD,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAK2Y,QAAQpY,UAAUgB,IAAIikH,GAAcp4E,YACzCptC,KAAK2Y,QAAQrV,MAAMC,QAAU,OAE7BvD,KAAKo1F,qBAAqBp1F,KAAK0lH,SAAU1lH,KAAKwP,gBAC9CxP,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,wBAAwB,EAAEmJ,OAAAA,MACxDnJ,KAAKmJ,SAAWA,IACdnJ,KAAK2lH,qBAAuB3lH,KAAKg1F,YAClCh1F,KAAKupB,UAGP,WAA2BxnB,MAAK,KAC9B/B,KAAK4lH,yBAMHh2G,OA6CR,OA5CA5P,KAAK+gC,SAASz8B,OAAOtE,KAAK2Y,SAE1B3Y,KAAKwP,eAAejO,IAAIvB,KAAxBA,CAA8B,QAAQ,KACpCA,KAAKupB,SAEF,GAAA3M,qBACD5c,KAAK6lH,cAAgB7lH,KAAKwP,eAAejO,IAAIF,SAASwY,KAAjC7Z,CAAuC,aAAcA,KAAKylH,iBAAkB,CAACzmG,SAAS,EAAO4Q,SAAS,IAC3H5vB,KAAKwP,eAAejO,IAAIvB,KAAxBA,CAA8B,SAAS,KACrCA,KAAKwP,eAAehP,OAAOR,KAAK6lH,iBAC/B,CAAC1qG,MAAM,QAIdnb,KAAKwP,eAAejO,IAAIvB,KAAK2Y,QAA7B3Y,CAAsC,SAAUM,IAC9C,MAAMkY,GAAS,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,OACzC,IAAIA,EACF,OAGF,MAAMvY,EAAOuY,EAAOwQ,QAAQ/oB,MACtB,OAACkJ,GAAUnJ,KAEV,+BADAC,EAEHq2E,GAAkB,CAChBt+C,aAAc,2BACdzZ,OAAQ,CACNkb,QAAS,MAEX2C,mBAAoB,oCACnBr6B,MAAK,KACN/B,KAAKiJ,mBAAmB68G,YAAY38G,EAAQ0B,EAAA,iBAM9C7K,KAAKiJ,mBAAmBg1G,SAAS90G,EAAQqP,EAAOwQ,QAAQ/H,MAK5DjhB,KAAK6D,QAAO,MAGPhE,MAAM+P,OAWRg2G,kBACL,MAAM3yB,EAAcjzF,KAAK+lH,iBACJ,4BAAlB9yB,EAAY3pF,GACZ2pF,EAAYj4E,OAAO+kG,QACnB9sB,EAAYj4E,OAAO+6C,OACpBk9B,EAAYj4E,OAAO+6C,MAAO,EAC1B/1D,KAAK4jH,UAAUzjB,iBAAiBlN,EAAYlqF,MAIxCg9G,iB,MACN,OAAyE,QAAlE,EAAA/lH,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,QAAQ8pF,mBAAW,QAAI,CAC3E3pF,EAAG,qBAIAigB,OAAO0pE,EAA+CjzF,KAAK+lH,kBAChE/lH,KAAK2Y,QAAQ7S,UAAY,GAEzB,IAAI,MAAMkwB,KAAOi9D,EAAY16D,KAAM,CACjC,MAAMtH,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAIikH,GAAcp4E,WAAa,QAE7C,IAAI,MAAM7uB,KAAUyX,EAAIpU,QAAS,CAC/B,MAAM8C,EAAMrjB,SAASC,cAAc,UACnCojB,EAAInkB,UAAUgB,IAAIikH,GAAcp4E,WAAa,UAAW,OACxD1oB,EAAI5e,UAAY,kBAAgCyY,EAAO0C,MACvDyD,EAAIsE,QAAQ/H,KAAO1C,EAAO0C,KAC1ByD,EAAIsE,QAAQ/oB,KAAOse,EAAOjV,EAC1B2nB,EAAI3sB,OAAOogB,GAGb1kB,KAAK2Y,QAAQrU,OAAO2sB,IAIjB00F,kBAAkB1yB,EAA2BjzF,KAAK+lH,kB,MACvD,MAAMliF,EAAyB,sBAAlBovD,EAAY3pF,KAAiF,QAAnD,EAAC2pF,EAA8C16D,YAAI,eAAE13B,QAO5G,OANAb,KAAK0lH,SAASnlH,UAAUsD,OAAO,OAAQggC,GAEpCA,GACD7jC,KAAK6D,QAAO,IAGNggC,EAGH4L,QAAQtmC,GACbnJ,KAAKmJ,OAASA,EAEdnJ,KAAK2lH,oBACL3lH,KAAK4lH,mBAlJQ,GAAAx4E,WAAa,iB,eCM9B,MAAM,GAAkB,gBAGT,MAAM44E,WAAqBlG,GAQxCngH,YAAYohC,EACV8gF,EACQxkF,EACApoB,EACA27E,GACR/wF,MAAM,CACJkhC,SAAAA,EACA8gF,WAAAA,EACAJ,SAAU,KACVvB,WAAY,CAAC,UAAW,aACxBt8E,SAAWprB,IACT,IAAIA,EAAQ,OAAO,EACnB,MAAM,OAACrP,EAAM,MAAEgoF,EAAK,QAAEI,GAAWvxF,KAAK0L,KAAKsd,QAC3C,OAAOhpB,KAAKq9B,KAAKt9B,MAAM+kH,gBAAe,KACpC,MAAMnyB,EAAoB3yF,KAAK4wF,qBAAqBa,YAAYF,EAAU/4E,EAAuBwQ,QAAQ0oE,UACzG1xF,KAAK4wF,qBAAqB8B,iBAAiBvpF,EAAO8f,WAAYkoE,EAAOwB,EAAmB,OAAF,wBACjF3yF,KAAKq9B,KAAKu+E,2BAAyB,CACtCxkB,YAAY,KAGdp3F,KAAKq9B,KAAKt9B,MAAM6K,eAAc,GAAM,SAlBlC,KAAAyyB,KAAAA,EACA,KAAApoB,gBAAAA,EACA,KAAA27E,qBAAAA,EAuCH,KAAAq1B,YAAc,CAAM98G,EAAgBiyB,EAAkB3uB,KAAkB,O,EAAA,K,OAAA,E,EAAA,YAC7E,MAAMokB,EAAa7wB,KAAK6hH,WAAW1mB,gBAE7Bx1D,QAAa3lC,KAAKiV,gBAAgBixG,gBAAgB9qF,GACxD,IAAIvK,IACF,KAAM,eAGR,GAAc,SAAX8U,EAAKr8B,EACN,KAAM,YAGR,MAAMk4C,EAAgBxhD,KAAK4wF,qBAAqBM,iBAAiB/nF,EAAQw8B,EAAK90B,GAAIpE,GAAO1K,MAAKuvF,IAC5F,IAAIzgE,IACF,KAAM,eAGL7wB,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd,MAAMlE,EAAO1L,KAAK0L,KAAKtH,YACvBsH,EAAKsd,QAAQ7f,OAAS,GAAKA,EAC3BuC,EAAKsd,QAAQmoE,MAAQ,GAAKxrD,EAAK90B,GAC/BnF,EAAKsd,QAAQuoE,QAAU,GAAKD,EAAWE,SAEvC,MAAM20B,EAAc,IAAIz3B,GAAY,KAAM,GAAiB1uF,KAAK4M,YAAY,GAE5E5M,KAAKyuB,cAAc5iB,QACnB7L,KAAKqwF,qBAAqBxkF,QAE1B,MAAM0iB,EAA+B,GAC/B63F,IAAc90B,EAAWt2E,OAAOqrG,QAEtC,IAAI,MAAMz+G,KAAQ0pF,EAAW/uD,QAAS,CACpC,MAAMnhC,EAAYC,SAASC,cAAc,OACzCF,EAAUb,UAAUgB,IAAI,wBACxBH,EAAU4nB,QAAQ0oE,SAAW9pF,EAAKiJ,GAElC,MAAMk7F,EAAUqa,OAAY7/G,EAAYlF,SAASC,cAAc,OAS/D,GARGyqG,IACDA,EAAQxrG,UAAUgB,IAAI,gCAEtBH,EAAUkD,OAAOynG,IAGnBrgG,EAAKpH,OAAOlD,GAERglH,EAsBFhlH,EAAUb,UAAUgB,IAAI,iBAtBX,CACbwqG,EAAQxrG,UAAUgB,IAAI,SACtBwqG,EAAQjmG,UAAY,kBAAgC,IAAI8B,EAAKyH,MAAMnC,QAAQ,IAE3E,MAAMmC,EAAQhO,SAASC,cAAc,OACrC+N,EAAM9O,UAAUgB,IAAI,8BACpB8N,EAAMvJ,UAAY,kBAAgC8B,EAAKyH,OAEvD,MAAMgtB,EAAch7B,SAASC,cAAc,OAC3C+6B,EAAY97B,UAAUgB,IAAI,oCAC1B86B,EAAYv2B,UAAY,iBAA+B8B,EAAKy0B,YAAa,CACvEiqF,YAAY,EACZ9zB,SAAS,IAGXpxF,EAAUkD,OAAO+K,EAAOgtB,GAExB,MAAMkqF,EAAYllH,SAASC,cAAc,OACzCilH,EAAUhmH,UAAUgB,IAAI,2BAExBmK,EAAKpH,OAAOiiH,GAKd,GAAc,oBAAX3+G,EAAK0B,GACN,GAAG1B,EAAK+mB,OAAoD,IAA3C/mB,EAAK+mB,MAAMsvB,UAAUh+B,QAAQ,UAAiB,CAC7D,IAAIi9F,EACDnR,GACDmR,EAAiB77G,SAASC,cAAc,OACxCyqG,EAAQznG,OAAO44G,IAEfA,EAAiB97G,EAGnB87G,EAAe38G,UAAUgB,IAAI,mBAC7B6kH,GAAalJ,EAAe38G,UAAUgB,IAAI,oBAE1CvB,KAAKyuB,cAAc3mB,KAAK,CACtBmpB,IAAK7vB,EACLI,KAAM,IACG2W,GAAA,WAA4B,CACjCquG,KAAM,EACNnxG,SAAU,CACR/L,EAAG,uBACHqhE,YAAc/iE,EAAK+mB,MAAkCg8C,YACrDtyD,IAAKzQ,EAAK+mB,MAAMtW,KAElBnX,KAAM0G,EAAK+mB,MAAMztB,KACjB+9G,SAAUr3G,EAAK+mB,MAAMsvB,YACpBl8C,MAAKwhD,IACN,MAAMxC,EAAQ,IAAI1T,MAClB0T,EAAMxgD,UAAUgB,IAAI,gBACpB,EAAAklH,GAAA,GAAkBljE,GAAMxhD,MAAK2kH,IAC3BplE,GAAsB47D,EAAgBn8D,EAAO2lE,GAAS,gBAM3D,CACL,MAAMpwG,EAAQ1O,EAAKvG,UAA0BuG,EAAKvB,MAClD,GAAI,CAAC,UAAW,OAAgCk5B,SAAUjpB,MAAAA,OAAK,EAALA,EAAsBrW,OAASmmH,GACvF,EAAApkE,GAAA,GAAuB1rC,GAEL,QAAfA,EAAMrW,KACPkmH,EAAY5kH,IAAI+U,EAAOlV,GACA,YAAfkV,EAAMrW,OACdmB,EAAUb,UAAUgB,IAAI,iBACxBvB,KAAKqwF,qBAAqBR,cAAcv5E,EAAOlV,EAAWmtB,GACrC,IAAlBjY,EAAMwsC,SACP9iD,KAAKqwF,qBAAqBP,mBAAmB1uF,SAG5C,GAAGkV,EAAO,CACf,MAAMpV,EAAOklH,EAAY,QAAK7/G,EAC9B6/G,GAAahlH,EAAUb,UAAUgB,IAAI,oBACrC6sB,GAAU,CACR/nB,MAAOiQ,EACPlV,UAAWglH,EAAYhlH,EAAY2qG,EACnC19E,SAAUntB,EACVotB,UAAWptB,EACX2vB,WAAAA,EACApC,cAAezuB,KAAKyuB,cACpBF,aAAAA,MAMR,OAAO/qB,QAAQC,IAAI8qB,GAAcxsB,MAAK,KACpC,IAAI8uB,IAEF,YADAs1F,EAAYt6G,QAIdH,EAAKnL,UAAUsD,OAAO,aAAcuiH,GACpC16G,EAAKnL,UAAUsD,OAAO,iBAAkBuiH,GACxCpmH,KAAKoB,UAAUb,UAAUsD,OAAO,aAAcuiH,GAQ9C,MAAMr8D,EAAS/pD,KAAK0L,KAAKzH,cAEzB,GADA8lD,EAAOj5B,YAAc,GAClBwgE,EAAWq1B,UAAW,CACvB,MAAMC,GAAgB,OAAO,6DAC7BA,EAAclhG,mBAAmB,YAAa,kBAAgC4rE,EAAWq1B,UAAU1lG,QACnG,QAAiB2lG,GAAgBtmH,IAC/BN,KAAK4wF,qBAAqBoB,WAAW7oF,EAAQw8B,EAAK90B,GAAIygF,EAAWq1B,UAAU7W,gBAE7E/lD,EAAOzlD,OAAOsiH,GAEhB78D,EAAOzlD,OAAOtE,KAAK0L,KAAOA,GAEvB1L,KAAKmmH,aACNnmH,KAAKmmH,YAAY9mE,SAEnBr/C,KAAKmmH,YAAcA,EACnBA,EAAYr3F,SAER9uB,KAAKoiH,iBACPpiH,KAAKoiH,eAAiB,KACpB,GAAGpiH,KAAK0L,KAAKnL,UAAUmT,SAAS,cAAe,CAC7C,MAAM9R,EAAS5B,KAAK0L,KAAKK,kBAAoBgf,EAAA,4BAAuC/qB,KAAK0L,KAAKK,kBAAoB,GAClH/L,KAAK0L,KAAKpI,MAAM1B,MAAQA,EAAQ,UAEhC5B,KAAK0L,KAAKpI,MAAM1B,MAAQ,IAG5BmpB,EAAA,oBAA4B,eAAgB/qB,KAAKoiH,iBAGnDpiH,KAAKoiH,iBAELpiH,KAAK6D,QAAQytF,EAAW/uD,QAAQ1hC,SAAWywF,EAAWq1B,WACtD3mH,KAAK4M,WAAWohC,UAAY,QAIhC,MAAO,CAAC/D,KAAMtE,EAAM6b,cAAAA,I,YAhMyD,K,+QAlB7ExhD,KAAKoB,UAAUb,UAAUgB,IAAI,iBAE7BvB,KAAKK,iBAAiB,WAAW,KAC/B+M,YAAW,KACTpN,KAAK4M,WAAWxL,UAAU4sC,UAAY,IACrC,MAGLhuC,KAAK8jH,WAAa7pF,GAASj6B,KAAKimH,YAAa,KAAK,GAAM,GAExDjmH,KAAKK,iBAAiB,UAAU,KAC3BL,KAAKoiH,iBACNr3F,EAAA,uBAA+B,eAAgB/qB,KAAKoiH,gBACpDpiH,KAAKoiH,oBAAiB77G,MAwMlBqJ,OACR5P,KAAK0L,KAAOrK,SAASC,cAAc,OACnCtB,KAAK0L,KAAKnL,UAAUgB,IAAI,yBAExBvB,KAAKoB,UAAUkD,OAAOtE,KAAK0L,MAE3B1L,KAAK4M,WAAa,IAAI,KAAW5M,KAAKoB,WACtCpB,KAAKyuB,cAAgB,IAAI,KACzBzuB,KAAKqwF,qBAAuB,IAAIZ,GAAqBzvF,KAAKyuB,cAAe,K,eChR9D,MAAMo4F,WAAwB7C,GAG3CrkH,YACEohC,EACQ6iF,EACAhmF,GAER/9B,MAAMkhC,OAAUx6B,EATD,gBASyBiS,IACtC,MAAM1S,EAAY0S,EAAOjH,cAAc,IAAIyyG,GAAuBI,gCAAgCt+G,UAClG,OAAO89G,EAAUkB,gBAAe,KAC9BlB,EAAUle,aAAa5/F,UAAYA,EACnC89G,EAAUzwB,aAAY,GACtBnzF,KAAK6D,QAAO,SARR,KAAA+/G,UAAAA,EACA,KAAAhmF,kBAAAA,EAYHkpF,UAAUlyG,EAAgBic,G,MAC/B,GAAG7wB,KAAK4U,SAAWA,KAAmB,QAAT,EAAA5U,KAAK0L,YAAI,eAAEK,mBAMxC,OADA/L,KAAK4U,OAASA,GACP,EAAA+8B,GAAA,GAAY3xC,KAAK49B,kBAAkBszE,WAAWt8F,IAAUga,IAC7D,IAAIiC,IAAc,OAClB,MAAM6iB,EAAW2wE,GAA2Bz1F,GAKtC/sB,EAA2B,GAAlB6xC,EAAS7yC,OAHJ,EAEG,GAEvBb,KAAKoB,UAAUkC,MAAMspC,YAAY,WAAY/qC,EAAS,MAEtD7B,KAAKupB,OAAOmqB,MAfZ1zC,KAAK6D,QAAO,IC8DlB,MACMkjH,GAA4B,qDAMnB,MAAMC,GAkInBrnH,YACU09B,EACAp0B,EACAD,EACA8O,EACAhE,EACAsI,EACA6qG,EACAtrB,EACA76B,EACA5mB,EACA5P,EACA0iD,EACA/3E,EACA27E,EACAhzD,GAdA,KAAAP,KAAAA,EACA,KAAAp0B,mBAAAA,EACA,KAAAD,sBAAAA,EACA,KAAA8O,eAAAA,EACA,KAAAhE,gBAAAA,EACA,KAAAsI,gBAAAA,EACA,KAAA6qG,mBAAAA,EACA,KAAAtrB,aAAAA,EACA,KAAA76B,iBAAAA,EACA,KAAA5mB,kBAAAA,EACA,KAAA5P,wBAAAA,EACA,KAAA0iD,gBAAAA,EACA,KAAA/3E,gBAAAA,EACA,KAAA27E,qBAAAA,EACA,KAAAhzD,kBAAAA,EAxIF,KAAAspF,QAAU,GACV,KAAAC,aAAe,EAiBf,KAAAC,cAIJ,GAeI,KAAAC,gBAA2B,KAW5B,KAAAp5D,WAAY,EACX,KAAAq5D,gBAAiB,EAGjB,KAAAC,gBAAkB,EAclB,KAAAC,UAAW,EACX,KAAAC,gBAAkB,GACT,KAAAC,YAAwB,GACxB,KAAAC,gBAA4B,GACrC,KAAAC,gBAAkB,GAq3BlB,KAAAC,oBAAuBvnH,IAC1BA,IACD,EAAAohB,EAAA,GAAYphB,GAGdN,KAAKsnH,gBAAiB,EACtBtnH,KAAK8nH,SAAS1kH,OACd2kH,GAAA,gBAAkC,IAG5B,KAAAC,gBAAkB,KACxB,MAAMC,EAAc,GAAArrG,mBAAqB,YAAc,SACvD5c,KAAKkoH,mBAAmB3nH,UAAUsD,OAAOokH,GAAa,IAGhD,KAAAE,iBAAmB,KACzB,MAAMF,EAAc,GAAArrG,mBAAqB,YAAc,SACvD5c,KAAKkoH,mBAAmB3nH,UAAUsD,OAAOokH,GAAa,IAOjD,KAAAtQ,gBAAkB,CAACh7E,EAAuB38B,KAAKmzF,YAAY3qF,KAAKxI,MAAM,GAAOygF,EAAW,IAAIpmC,QACjG,MAAM,OAAClxC,GAAUnJ,KAAKq9B,KAChBxM,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBAC/BunB,EAAoB73G,EAAA,eAAmB1B,GAAUA,EAAO+4B,UAAYliC,KAAKiV,gBAAgBmzG,oBAAoBj/G,GAEnH,IAAIs5G,GAAchiC,GAAWjqB,IACvB3lC,MAKD2lC,GAD4C,IAAzBnc,KAAKC,MAAQ,IAAO,KAExCkc,OAAYjwD,GAGdvG,KAAK63G,aAAerhD,EACpB75B,IAEsB,cAAnB38B,KAAKq9B,KAAKp9B,MAAwBu2D,GACnCppD,YAAW,KACLyjB,KAIJ7wB,KAAK27F,aAAa0sB,cAAcl/G,KAC/B,MAEJu5G,GAAmBhgG,QA6iBhB,KAAA4lG,uBAAyB,KAC/BtoH,KAAK2nH,gBAAgB7/G,KAAK9H,KAAK0lG,aAAa5/F,WACrC,IAAM9F,KAAK4nH,gBAAkB5nH,KAAK0lG,aAAa5/F,WAGhD,KAAAyiH,SAAW,CAACjoH,EAAUL,EAAuBuoH,MACnD,EAAA9mG,EAAA,GAAYphB,GAEZ,IAAIuF,EAAO7F,KAAK0lG,aAAa5/F,UAC7B,GAAGD,GAAQA,IAAS2iH,EAAU,CAC5BxoH,KAAKwnH,UAAW,EAEhB,IAAIiB,EAAgB,EACpB,EAAG,CACDpnH,SAAS03B,YAAY94B,GAAM,EAAO,MAClC,MAAMyoH,EAAc1oH,KAAK0lG,aAAa5/F,UACtC,GAAGD,IAAS6iH,GACV,KAAKD,EAAgB,EACnB,WAGFA,EAAgB,EAGlB5iH,EAAO6iH,QACD7iH,IAAS2iH,GAEjBxoH,KAAKwnH,UAAW,IAoGZ,KAAAmB,uBAA0BroH,IAEhC,MAAMsoH,EAA4C,CAChD,KAAQ,OACR,KAAQ,SACR,KAAQ,YACR,KAAQ,gBACR,KAAQ,YACR,KAAQ,WAGP5oH,KAAK27F,aAAaktB,gBACnBD,EAAiB,KAAI,QAGvB,MAAM1iG,EAAO5lB,EAAE4lB,KACT4iG,EAAgBF,EAAW1iG,GAejC,GAbkB7kB,SAASsnD,eACdW,WAAWp8C,OAAOrM,QAAUioH,IAE3B,SAAT5iG,EACDlmB,KAAK27F,aAAaktB,cAAcE,iBAEhC/oH,KAAK8oH,cAAcA,IAGrB,EAAApnG,EAAA,GAAYphB,IAIF,SAAT4lB,EAAiB,CAClB,IAAIrgB,EAAO7F,KAAK0lG,aAAa5/F,UAE1BxF,EAAE0oH,SACAhpH,KAAK0nH,YAAY7mH,SAClBb,KAAK2nH,gBAAgB7/G,KAAKjC,GAC1BA,EAAO7F,KAAK0nH,YAAY7/G,MACxB7H,KAAKuoH,SAASjoH,EAAG,OAAQuF,GACzBA,EAAO7F,KAAK0lG,aAAa5/F,UACzB9F,KAAKynH,gBAAkBznH,KAAK0nH,YAAY7mH,OAASgF,EAAO,GACxD7F,KAAK4nH,gBAAkB/hH,IAItB7F,KAAK2nH,gBAAgB9mH,QAAYb,KAAK4nH,iBAAmB/hH,IAAS7F,KAAK4nH,kBACxE5nH,KAAK0nH,YAAY5/G,KAAKjC,GACtBA,EAAO7F,KAAK2nH,gBAAgB9/G,MAC5B7H,KAAKuoH,SAASjoH,EAAG,OAAQuF,GAGzB7F,KAAK4nH,gBAAkB5nH,KAAKynH,gBAAkBznH,KAAK0lG,aAAa5/F,aAMhE,KAAAmjH,eAAkB3oH,I,MAexB,MAAOI,MAAOwoH,EAAWttE,SAAUutE,EAAgB,SAAE1F,GAAYb,GAAsB5iH,KAAKo9G,kBAAkBr9G,OAGxGW,EAAQ,kBAAgCwoH,EAAWC,GAAkB,GACrEvtE,EAAW,kBAAgCutE,EAAkB,kBAAgCzoH,IAIhGV,KAAKynH,kBAAoBznH,KAAKwnH,UAAYxnH,KAAK0lG,aAAa5/F,YAAc9F,KAAKynH,kBAChFznH,KAAKynH,gBAAkB,GACvBznH,KAAK0nH,YAAY7mH,OAAS,GAG5B,MAAMuoH,KAA4G,QAAhB,EAAAppH,KAAK43G,mBAAW,eAAEthG,QAAsC,wBAA7BtW,KAAK43G,YAAYthG,MAAMhN,IAAgCsyC,EAAS9xC,QAAOxJ,GAAa,qBAARA,EAAEgJ,GAAoC,yBAARhJ,EAAEgJ,IACzO,GAAG8/G,EAAYvoH,OACb,IAAI,MAAMiyD,KAAUs2D,EAAa,CAC/B,IAAI/wG,EACJ,GAAgB,yBAAby6C,EAAOxpD,EACR+O,EAAMy6C,EAAOz6C,SAIb,GAFAA,EAAM6wG,EAAUtoH,MAAMkyD,EAAOt+B,OAAQs+B,EAAOt+B,OAASs+B,EAAOjyD,SAEvDwX,EAAIknB,SAAS,aAAclnB,EAAIknB,SAAS,YAC3C,SAMJ,GAAGv/B,KAAKknH,UAAY7uG,EAAK,CACvBrY,KAAKknH,QAAU7uG,EAEf,MAAMhQ,EAAUrI,KAAKqpH,kBAAoB,uBAA6B,CACpEnpF,OAAQ,sBACRsxE,cAAgB8X,GACPtpH,KAAKinH,mBAAmBsC,YAAYD,GAE7CzM,OAAQ,CACNxkG,IAAAA,KAEDtW,MAAMgvB,IACJ/wB,KAAKqpH,oBAAsBhhH,IAASrI,KAAKqpH,uBAAoB9iH,GAC7DvG,KAAKknH,UAAY7uG,IACF,YAAf0Y,EAAQznB,GAGTtJ,KAAKwpH,WAAW,WAAW,QAAUz4F,EAAQo7E,WAAap7E,EAAQ1hB,OAAS,UAAW0hB,EAAQsL,aAAetL,EAAQ1Y,KAAO,WACrHrY,KAAKypH,UACZzpH,KAAKqnH,gBAAkBt2F,GACf/wB,KAAKqnH,iBACbrnH,KAAK0pH,qBAKX,WAEM1pH,KAAKknH,UACblnH,KAAKknH,QAAU,UACRlnH,KAAKypH,UACZzpH,KAAKqnH,gBAAkB,KAEpBrnH,KAAK67G,WACN77G,KAAK2pH,aAEL3pH,KAAK87G,eAKT,GADiBoN,EAAUh8G,OASpB,CACL,MAAMktC,EAAOC,KAAKC,MACfF,EAAOp6C,KAAKmnH,cAAgB,MAC7BnnH,KAAKmnH,aAAe/sE,EACpBp6C,KAAKiJ,mBAAmBynF,UAAU1wF,KAAKq9B,KAAKl0B,OAAQ,CAACG,EAAG,6BAGvDtJ,KAAK4pH,aACN5pH,KAAK4pH,YAAY/lH,QAAO,QAfvB7D,KAAKmnH,cACNnnH,KAAKiJ,mBAAmBynF,UAAU1wF,KAAKq9B,KAAKl0B,OAAQ,CAACG,EAAG,4BAGvDtJ,KAAK27F,aAAaktB,eACnB7oH,KAAK27F,aAAaktB,cAAchlF,OAcjC7jC,KAAK4pH,aACN5pH,KAAK6pH,0BAGH7pH,KAAK8pH,WACP9pH,KAAK+pH,qBAGP/pH,KAAKgqH,kBAAkBd,EAAWzF,EAAU7nE,GAE5C57C,KAAKiqH,iBA0EA,KAAApG,gBAAkB,CAACnhE,EAAeviD,KACvCH,KAAKolH,cAAc1iE,EAAO,4BAA0CA,GAAQviD,IA0HtE,KAAA+pH,eAAkB5pH,IAGxB,IAFA,EAAAohB,EAAA,GAAYphB,IAERN,KAAK8nH,UAAY9nH,KAAKiuD,YAAcjuD,KAAK85G,gBAAkB95G,KAAKmqH,YAAcnqH,KAAK8pH,UAClF9pH,KAAKiuD,UACF5T,KAAKC,MAAQt6C,KAAKunH,gBAhiEN,IAiiEdvnH,KAAK6nH,sBAEL7nH,KAAK8nH,SAAS1kH,OAGhBpD,KAAKmzF,kBAEF,CACL,GAAGnzF,KAAKq9B,KAAKl0B,OAAO65B,cAAgBhjC,KAAKq9B,KAAK4iE,QAAQ,cAEpD,YADAnmE,GAAMitF,IAIR/mH,KAAK4jH,UAAUrjH,UAAUgB,IAAI,cAC7B,EAAAirD,GAAA,KAEAxsD,KAAK8nH,SAAS1jG,QAAQriB,MAAK,KACzB/B,KAAKoqH,qBAAuB,oBAC5BpqH,KAAKsnH,gBAAiB,EAEtBtnH,KAAKqqH,cAAa,GAClBtC,GAAA,gBAAkC,GAElC,MAAMuC,EAAmB,KACvB,IAAI1uF,GAAU,sBAAuB,CACnC5D,aAAc,2BACdoE,mBAAoB,iCACpBxa,QAAS,CAAC,CACR6X,QAAS,4BACTkD,SAAU,MACR,QAAmB38B,KAAKuqH,mBAEzB,CACD9wF,QAAS,WACTyiC,UAAU,MAEXx5C,QAGL1iB,KAAKwqH,yBAA2BxqH,KAAKwP,eAAejO,IAAIF,SAASwY,KAAjC7Z,CAAuC,aAAcM,KAC/E,EAAAuiB,GAAA,GAAgBviB,EAAEkY,OAAQ,gBAAkB,EAAAqK,GAAA,GAAgBviB,EAAEkY,OAAQ,0BACxE,EAAAkJ,EAAA,GAAYphB,GACZgqH,OAED,CAAC16F,SAAS,EAAM5Q,SAAS,IAE5BrO,EAAA,WAAiC3Q,KAAKyqH,wBAA0B,CAC9DxqH,KAAM,QACN4R,MAAO,KACLzE,YAAW,KACTk9G,MACC,IAEI,KAIXtqH,KAAKunH,gBAAkBltE,KAAKC,MAE5B,MAAMowE,EAAyC1qH,KAAK8nH,SAAS4C,WAGvDC,EAFUD,EAAWz/G,QAEF2/G,iBACzBF,EAAWG,QAAQF,GAEnBA,EAASG,QAAU,GAEnB,MAAMC,EAAgB,IAAIjmH,WAAW6lH,EAASK,mBACxCnoH,EAA6B,IAAvBkoH,EAAclqH,OAE1B,IAAIyiB,EAAI,KACN,IAAItjB,KAAKiuD,UAAW,OAEpB08D,EAASM,qBAAqBF,GAE9B,IAAIt2F,EAAM,EACVs2F,EAAchmH,SAAQrE,IACpB+zB,GAAO/zB,KAGT,IAAI6f,EAAWvd,KAAKC,IAAI,EAAIwxB,EAAM5xB,EAXxB,KAcV7C,KAAKkrH,eAAe5nH,MAAMmd,UAAY,SAASF,KAE/C,IAAIoV,EAAO0kB,KAAKC,MAAQt6C,KAAKunH,gBACzBrtF,EAAKvE,EAAO,IAEZk/B,GAAa,GAAMl/B,EAAO,KAAO7P,WAAa,KAAO,KAAO9iB,KAAKE,MAAMg3B,EAAK,KAAKt5B,OAAO,GAE5FZ,KAAKmrH,aAAan9F,UAAY6mC,GAE9B,SAAQvxC,IAGVA,OACCrV,OAAO3N,IACR,OAAOA,EAAEwD,MACP,IAAK,kBACHg2B,GAAM,0CACN,MAGF,IAAK,mBACHA,GAAMx5B,EAAE4F,SACR,MAGF,QACE4H,QAAQC,MAAM,wBAAyBzN,EAAGA,EAAEwD,KAAMxD,EAAE4F,SACpD4zB,GAAMx5B,EAAE4F,SAIZlG,KAAKqqH,cAAa,GAClBrqH,KAAK4jH,UAAUrjH,UAAUC,OAAO,kBAK9B,KAAAkpH,eAAiB,CAACppH,EAAWi7G,KAKnC,GAJGj7G,IACD,EAAAohB,EAAA,GAAYphB,GAGXN,KAAKqnH,gBAAiB,CACvB,MAAMH,EAAUlnH,KAAKknH,QACrB,IAAIkE,GAAa,EAcjB,GAbGprH,KAAK67G,aAEJ77G,KAAK2pH,aAGPyB,GAAa,GAIfprH,KAAKknH,QAAUA,EACflnH,KAAKypH,WAAY,EACjBzpH,KAAKqnH,gBAAkB,KAEpB+D,EAAY,OAGjB,GAAuB,SAApBprH,KAAK67G,aAA0BN,EAAO,CACvC,MAAMr1G,EAAUlG,KAAK43G,YACfl3G,EAAQ,kBAAgCV,KAAKo9G,kBAAkB18G,MAAO,IAC5E,GAAGwF,EAAQA,UAAYxF,EAWrB,YAVA,IAAIk7B,GAAU,kBAAmB,CAC/Bha,QAAS,CAAC,CACR6X,QAAS,wBACTkD,SAAU,KACR38B,KAAK0pH,oBAAenjH,GAAW,MAGnC61B,mBAAoB,0BACnB1Z,OAMP1iB,KAAK87G,cACL97G,KAAKiqH,iBAGC,KAAAoB,cAAiB/qH,IAGvB,IAFA,EAAAohB,EAAA,GAAYphB,IAER,EAAAuiB,GAAA,GAAgBviB,EAAEkY,OAAQ,SAC9B,GAAuB,YAApBxY,KAAK67G,WAA0B,CAChC,MAAM,gBAACyP,GAAmBtrH,KACvBsrH,GAAmB,GAAA1uG,qBAAuB0uG,EAAgBlqH,UAAUb,UAAUmT,SAAS,YACxF,QAAY43G,EAAgBlqH,eAEF,UAApBpB,KAAK67G,WACb77G,KAAKq9B,KAAKihE,aAAat+F,KAAKm+G,cACA,SAApBn+G,KAAK67G,YACb77G,KAAKq9B,KAAKihE,aAAat+F,KAAK8pH,YAzjE9B9pH,KAAKwP,eAAiB,IAAI,IAGrByY,YACLjoB,KAAK4jH,UAAYviH,SAASC,cAAc,OACxCtB,KAAK4jH,UAAUrjH,UAAUgB,IAAI,cAC7BvB,KAAK4jH,UAAUtgH,MAAMC,QAAU,OAE/BvD,KAAKovD,eAAiB/tD,SAASC,cAAc,OAC7CtB,KAAKovD,eAAe7uD,UAAUgB,IAAI,wBAElCvB,KAAKurH,mBAAqBlqH,SAASC,cAAc,OACjDtB,KAAKurH,mBAAmBhrH,UAAUgB,IAAI,wBAEtCvB,KAAKwrH,YAAcnqH,SAASC,cAAc,OAC1CtB,KAAKwrH,YAAYjrH,UAAUgB,IAAI,eAAgB,sBAE/CvB,KAAKurH,mBAAmBjnH,OAAOtE,KAAKwrH,aAEpC,MAAMlnD,EAAOupC,KACb7tG,KAAKwrH,YAAYlnH,OAAOggE,GAExB,MAAMmnD,EAAkBzrH,KAAKyrH,gBAAkBpqH,SAASC,cAAc,OACtEmqH,EAAgBlrH,UAAUgB,IAAI,eAAgB,qBAE9C,MAAMmqH,EAAuB1rH,KAAK0rH,qBAAuBrqH,SAASC,cAAc,OAChFoqH,EAAqBnrH,UAAUgB,IAAI,eAAgB,0BAEnDvB,KAAKovD,eAAe9qD,OAAOtE,KAAKurH,mBAAoBE,EAAiBC,GACrE1rH,KAAK4jH,UAAUt/G,OAAOtE,KAAKovD,gBAE3BpvD,KAAK2rH,UAAY,EAAa,CAAC98G,KAAM,aAAcvD,UAAW,+CAC9DtL,KAAKovD,eAAe9qD,OAAOtE,KAAK2rH,YAEhC,QAAiB3rH,KAAK2rH,WAAYrrH,KAChC,EAAAohB,EAAA,GAAYphB,GACZN,KAAKq9B,KAAKzD,QAAQiqE,kBACjB,CAACr0F,eAAgBxP,KAAKwP,iBAqEzB,MAAMyoB,EAAIj4B,KAAK4rH,iBAAmBvqH,SAASC,cAAc,OACzD22B,EAAE13B,UAAUgB,IAAI,qBAAsB,sBACtCvB,KAAKovD,eAAe9qD,OAAO2zB,GAGtBooE,uBACLrgG,KAAKonH,cAAchmH,UAAYC,SAASC,cAAc,OACtDtB,KAAKonH,cAAchmH,UAAUb,UAAUgB,IAAI,iBAE3CvB,KAAKonH,cAAcyE,QAAU,EAAW,IACxC7rH,KAAKonH,cAAc0E,UAAY,EAAW,qBAAsB,CAAC18G,UAAU,IAE3EpP,KAAKonH,cAAchmH,UAAUkD,OAAOtE,KAAKonH,cAAcyE,QAAS7rH,KAAKonH,cAAc0E,WAInF,MAAMC,EAAoB,KACxBC,GAAmB,EACZhsH,KAAKisH,uBAGRC,EAAqB,KACzBF,GAAmB,GAGfV,EAAgDtrH,KAAKsrH,gBAAkB,GAC7E,IAAIU,GAAmB,EACvB,MAAMG,EAA0C,CAC9Cb,EAAgBhiG,WAAa,CAC3BrI,KAAM,kCACNC,QAAS6qG,EACT5qG,cAAe,IAAI,KAAc,CAACQ,SAAS,KAE7C2pG,EAAgBc,WAAa,CAC3BnrG,KAAM,kCACNC,QAAS6qG,EACT5qG,cAAe,IAAI,KAAc,CAACQ,SAAS,KAE7C2pG,EAAgBe,YAAc,CAC5BprG,KAAM,wCACNC,QAASgrG,EACT/qG,cAAe,IAAI,KAAc,CAACQ,SAAS,KAE7C2pG,EAAgBgB,YAAc,CAC5BrrG,KAAM,wCACNC,QAASgrG,EACT/qG,cAAe,IAAI,KAAc,CAACQ,SAAS,KAE7C2pG,EAAgBiB,WAAa,CAC3BtrG,KAAM,oCACNC,QAAS,KACPlhB,KAAKwsH,0BAEP39G,KAAM,YAGJ49G,EAAiBnB,EAAgBlqH,UAAY,GAAW+qH,EAAgBnsH,KAAKwP,gBAG7EohB,EAAWvmB,MAAMC,KAAKmiH,EAAe77F,UAIrC,CAAC,CACL9H,SAAU8H,EAAShwB,MAAM,EAAG,GAC5BmM,SAAU,CAACrM,EAAOJ,KAChB,MAAMqhB,KAAajhB,EAChBsrH,IACDhsH,KAAK0sH,0BAA4B/qG,GAGnC,MAAMgrG,EAAa3sH,KAAKonH,cAAchmH,UAAUmQ,cAAc,gBAC9D,GAAGo7G,EAAY,CACb,MAAMl7G,EAAKk7G,EAAW9iG,kBAChBtkB,EAAI,sBAAiBkM,GACrBuoB,EAA2BsxF,EAAgBhiG,WAAWnI,cAAcQ,QAAU,yBAA2B,wBAC/Gpc,EAAE4K,IAAM6pB,EACRz0B,EAAEsgC,YAGL,CACD/c,SAAU8H,EAAShwB,MAAM,EAAG,GAC5BmM,SAAWrM,IACT,MAAMihB,KAAajhB,EACnB,IAAIsE,EAEFA,EADC2c,QAA6Cpb,IAAlCvG,KAAK0sH,yBACb1sH,KAAK0sH,yBAA2BpB,EAAgBc,WAAad,EAAgBhiG,WAE7E3H,EAAU2pG,EAAgBhiG,WAAagiG,EAAgBc,WAG7DpnH,EAAEmc,cAAcQ,SAAU,KAGvB5c,SAAQmsB,IACb,MAAM9vB,EAAYg2B,GAAUlG,EAAMpI,SAASpe,KAAIpK,IACtC,CACLc,UAAWd,EACXP,MAAOO,EAAEiR,cAAc,aAEvB2f,EAAMnkB,UAEJopC,EAAK90C,SAASC,cAAc,MAClCF,EAAUkD,OAAO6xC,GACjBs2E,EAAenoH,OAAOlD,MAGxBqrH,EAAenoH,OAAOgnH,EAAgBiB,WAAW5zG,SAE7C,GAAAiE,qBACmB5c,KAAK4sH,aAAe,IAAIj4B,GAAc,CACzDh8E,QAAS8zG,KAIbnB,EAAgBuB,WAAaV,EAAevrH,MAAM,GAAI,GACtDZ,KAAKonH,cAAchmH,UAAUkD,OAAOmoH,GAEpCnB,EAAgBuB,WAAW9nH,SAAQ,CAACC,EAAGmB,KACrC,MAAM,MAACpG,GAASiF,EAAEmc,cAClBphB,EAAME,KAAO,QACbF,EAAM+D,KAAOqC,EAAM,EAAI,SAAW,UAClCpG,EAAMW,MAAQ,OAAQyF,EAAM,MAK9BnG,KAAK8sH,kBAAoBzrH,SAASC,cAAc,OAChDtB,KAAK8sH,kBAAkBvsH,UAAUgB,IAAI,uBAErCvB,KAAK+sH,gBAAkB1rH,SAASC,cAAc,OAC9CtB,KAAK+sH,gBAAgBxsH,UAAUgB,IAAI,iCAEnCvB,KAAKgtH,eAAiB3rH,SAASC,cAAc,OAC7CtB,KAAKgtH,eAAezsH,UAAUgB,IAAI,4BAA6B,6BAA8B,eAE7F,MAAM0rH,EAAyC,CAAC,CAC9ChsG,KAAM,qBACNC,aAAS3a,IAGX,IAAI2mH,EACJ,MAAMC,EAAsBlqG,IACvBA,IACDiqG,EAAiBltH,KAAKotH,cAGxB,MAAM92F,EAAYt2B,KAAKotH,eAAiBF,EAClCjxB,GAAWh5E,GAAWqT,EAAY,EAAI,GAE5C,QAAct2B,KAAKgtH,eAAgB,aAAc/pG,EAvZpB,SAuZyD1c,EAAW01F,GAC7F3lE,IACF,QAAc42F,EAAgB,cAAejqG,EAzZlB,SAyZuD1c,EAAW01F,IAwBjG,GApBA,GAAiB,CACf7sF,UAAU,EACVI,eAAgBxP,KAAKwP,eACrBpO,UAAWpB,KAAK+sH,iBACf,YAAaE,GAAe,KAC7BE,GAAmB,MAClB,KACDA,GAAmB,MAGrBF,EAAc,GAAGt0G,QAAQpY,UAAUgB,IAAI,wBACvCvB,KAAKqtH,cAAgBrtH,KAAK+sH,gBAAgBljG,kBAC1C7pB,KAAKqtH,cAAc9sH,UAAUgB,IAAI,aAAc,gBAC/CvB,KAAK+sH,gBAAgBzoH,OAAOtE,KAAKgtH,gBAEjChtH,KAAKkoH,mBAAqB,EAAW,wBAAyB,CAAC94G,UAAU,IAEzEpP,KAAKstH,sBAAwBjsH,SAASC,cAAc,OACpDtB,KAAKstH,sBAAsB/sH,UAAUgB,IAAI,2BAEnB,SAAnBvB,KAAKq9B,KAAKp9B,KAAiB,CAC5BD,KAAKutH,kBAAoBlsH,SAASC,cAAc,QAChDtB,KAAKutH,kBAAkBhtH,UAAUgB,IAAI,QAAS,WAAY,iBAC1DvB,KAAK2rH,UAAUrnH,OAAOtE,KAAKutH,mBAE3BvtH,KAAKwtH,aAAe,EAAa,CAAC3+G,KAAM,UAAWvD,UAAW,6CAC9DtL,KAAKytH,qBAAuBpsH,SAASC,cAAc,QACnDtB,KAAKytH,qBAAqBltH,UAAUgB,IAAI,QAAS,WAAY,iBAC7DvB,KAAKwtH,aAAalpH,OAAOtE,KAAKytH,sBAC9BztH,KAAKovD,eAAe9qD,OAAOtE,KAAKwtH,eAEhC,QAAiBxtH,KAAKwtH,cAAeltH,KACnC,EAAAohB,EAAA,GAAYphB,GACZN,KAAKiJ,mBAAmBykH,gBAAgB1tH,KAAKq9B,KAAKl0B,UACjD,CAACqG,eAAgBxP,KAAKwP,iBAEzBxP,KAAK2tH,aAAe,EAAW,qCAAsC,CAACv+G,UAAU,KAEhF,QAAiBpP,KAAK2tH,cAAertH,IACnCN,KAAK27F,aAAa0sB,cAAcroH,KAAKq9B,KAAKl0B,UACzC,CAACqG,eAAgBxP,KAAKwP,iBAEzBxP,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAiB,EAAEmJ,OAAAA,MACjDnJ,KAAKq9B,KAAKl0B,SAAWA,GAIxBnJ,KAAK2tH,aAAaptH,UAAUC,OAAO,WAGrCR,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAoB,EAAEmJ,OAAAA,MACpDnJ,KAAKq9B,KAAKl0B,SAAWA,GAIxBnJ,KAAKiJ,mBAAmBslG,qBAAqBvuG,KAAKq9B,KAAKl0B,QAAQpH,MAAKrB,IAClEV,KAAK2tH,aAAaptH,UAAUsD,OAAO,QAASnD,EAAMG,cAItDb,KAAK4tH,qBAAuB,EAAW,wCAAyC,CAACx+G,UAAU,IAC3FpP,KAAK6tH,cAAgB,IAAIrI,GAAc,CACrCzkF,SAAU/gC,KAAKwrH,YACfh8G,eAAgBxP,KAAKwP,eACrBvG,mBAAoBjJ,KAAKiJ,mBACzBy8G,SAAU1lH,KAAK4tH,qBACfhK,UAAW5jH,OAEbA,KAAKwP,eAAejO,IAAIvB,KAAK6tH,cAA7B7tH,CAA4C,QAAQ,IAAMA,KAAK4tH,qBAAqBrtH,UAAUgB,IAAI,YAClGvB,KAAKwP,eAAejO,IAAIvB,KAAK6tH,cAA7B7tH,CAA4C,SAAS,IAAMA,KAAK4tH,qBAAqBrtH,UAAUC,OAAO,YAEtGR,KAAK4pH,YAAc,IAAI/C,GAAgB7mH,KAAKwrH,YAAaxrH,KAAMA,KAAK49B,mBACpE59B,KAAK8tH,kBAAoBzsH,SAASC,cAAc,OAChDtB,KAAK8tH,kBAAkBvtH,UAAUgB,IAAI,4BAErC,MAAMwsH,EAAS1sH,SAASC,cAAc,OACtCysH,EAAOxtH,UAAUgB,IAAI,uCAErB,MAAMsN,EAAO7O,KAAKguH,gBAAkB3sH,SAASC,cAAc,OAC3DuN,EAAKtO,UAAUgB,IAAI,qBAAsB,4BACzCwsH,EAAOzpH,OAAOuK,GACd7O,KAAK8tH,kBAAkBxpH,OAAOypH,IAE9B,QAAiB/tH,KAAK8tH,mBAAoBxtH,KACxC,EAAAohB,EAAA,GAAYphB,GACIuO,EAAKtO,UAAUmT,SAAS,eAEtC1T,KAAK4pH,YAAY/lH,QAAO,GACxBgL,EAAKtO,UAAUC,OAAO,gBAEtBR,KAAK4pH,YAAY9C,UAAU9mH,KAAKq9B,KAAKl0B,OAAOoL,WAAYvU,KAAKq9B,KAAKzD,QAAQuhE,iBAC1EtsF,EAAKtO,UAAUgB,IAAI,iBAEpB,CAACiO,eAAgBxP,KAAKwP,iBAEzBxP,KAAK4pH,YAAYvpH,iBAAiB,WAAW,KAC3CwO,EAAKtO,UAAUgB,IAAI,iBAGrBvB,KAAK4pH,YAAYvpH,iBAAiB,UAAU,KAC1CwO,EAAKtO,UAAUC,OAAO,iBAI1BR,KAAKiuH,kBAAoB,CAAC,CACxBp/G,KAAM,QACNoS,KAAM,iCACNC,QAAS,KACPlhB,KAAKkuH,UAAUxtH,MAAQ,GACvB,MAAMytH,EAAS,IAAI,GAA4BtlG,KAAK,MACpD7oB,KAAKkuH,UAAUhuH,aAAa,SAAUiuH,GACtCnuH,KAAKs8G,eAAiB,QACtBt8G,KAAKkuH,UAAU1tF,SAEjB9nB,OAAQ,IAAM1Y,KAAKq9B,KAAK4iE,QAAQ,eAC/B,CACDpxF,KAAM,WACNoS,KAAM,6BACNC,QAAS,KACPlhB,KAAKkuH,UAAUxtH,MAAQ,GACvBV,KAAKkuH,UAAU1kF,gBAAgB,UAC/BxpC,KAAKs8G,eAAiB,WACtBt8G,KAAKkuH,UAAU1tF,SAEjB9nB,OAAQ,IAAM1Y,KAAKq9B,KAAK4iE,QAAQ,eAC/B,CACDpxF,KAAM,OACNoS,KAAM,OACNC,QAAS,KACP,IAAIu4F,GAAgBz5G,KAAKq9B,MAAM3a,QAEjChK,OAASvP,GAAWA,EAAO65B,aAAehjC,KAAKq9B,KAAK4iE,QAAQ,gBAG9DjgG,KAAKouH,WAAa,GAAiB,CAACh/G,UAAU,EAAMI,eAAgBxP,KAAKwP,gBAAiB,WAAYxP,KAAKiuH,mBAC3GjuH,KAAKouH,WAAW7tH,UAAUgB,IAAI,cAAe,gBAC7CvB,KAAKouH,WAAW7tH,UAAUC,OAAO,cAIjCR,KAAKmrH,aAAe9pH,SAASC,cAAc,OAC3CtB,KAAKmrH,aAAa5qH,UAAUgB,IAAI,eAEhCvB,KAAKkuH,UAAY7sH,SAASC,cAAc,SACxCtB,KAAKkuH,UAAUjuH,KAAO,OACtBD,KAAKkuH,UAAUG,UAAW,EAC1BruH,KAAKkuH,UAAU5qH,MAAMC,QAAU,OAE/BvD,KAAK8sH,kBAAkBxoH,UAAU,CAACtE,KAAK+sH,gBAAiB/sH,KAAK8tH,kBAAmB9tH,KAAKkoH,mBAAoBloH,KAAKstH,sBAAuBttH,KAAK2tH,aAAc3tH,KAAK4tH,qBAAsB5tH,KAAKouH,WAAYpuH,KAAKmrH,aAAcnrH,KAAKkuH,WAAWpkH,OAAOa,UAE9O3K,KAAKwrH,YAAYlnH,OAAOtE,KAAKonH,cAAchmH,WAC3CpB,KAAKsuH,6BAA+B,IAAItJ,GACxChlH,KAAKuuH,eAAiB,IAAIpM,GAAeniH,KAAKwrH,YAAaxrH,KAAKsuH,8BAChEtuH,KAAKwuH,YAAc,IAAI7K,GAAY3jH,KAAKwrH,YAAaxrH,KAAKsuH,6BAA8BtuH,KAAMA,KAAKgtF,iBACnGhtF,KAAKyuH,eAAiB,IAAI5J,GAAe7kH,KAAKwrH,YAAaxrH,KAAKsuH,6BAA8BtuH,KAAMA,KAAKq9B,KAAKO,kBAAmB59B,KAAKq9B,KAAKpoB,iBAC3IjV,KAAK0uH,eAAiB,IAAIvJ,GAAenlH,KAAKwrH,YAAaxrH,KAAKsuH,6BAA8BtuH,KAAMA,KAAKq9B,KAAKO,kBAAmB59B,KAAKq9B,KAAKpoB,iBAC3IjV,KAAK2uH,aAAe,IAAI3I,GAAahmH,KAAKwrH,YAAaxrH,KAAKsuH,6BAA8BtuH,KAAKq9B,KAAMr9B,KAAKiV,gBAAiBjV,KAAK4wF,sBAChI5wF,KAAKwrH,YAAYlnH,OAAOtE,KAAK8sH,mBAE7B9sH,KAAKuqH,gBAAkB,EAAW,iDAElCvqH,KAAK4uH,iBAAmBvtH,SAASC,cAAc,OAC/CtB,KAAK4uH,iBAAiBruH,UAAUgB,IAAI,sBAEpCvB,KAAKkrH,eAAiB7pH,SAASC,cAAc,OAC7CtB,KAAKkrH,eAAe3qH,UAAUgB,IAAI,iBAElCvB,KAAK6uH,QAAU,EAAW,2DAC1B7uH,KAAK6uH,QAAQnpG,mBAAmB,aAAc,qMAO9C1lB,KAAK4uH,iBAAiBtqH,OAAOtE,KAAKkrH,eAAgBlrH,KAAK6uH,SAEjC,cAAnB7uH,KAAKq9B,KAAKp9B,OACXD,KAAKq5G,SAAW,IAAIJ,GAAS,CAC3BE,cAAe,KACbn5G,KAAKq6G,YAAa,EAClBr6G,KAAKmzF,eAEPimB,gBAAiB,KACfp5G,KAAK23G,qBAAgBpxG,IAEvBiJ,eAAgBxP,KAAKwP,eACrB8pG,SAAU,WACVC,iBAAkBv5G,KAAK6uH,QACvBl9G,OAAQ,KACE3R,KAAK85G,kBAAoBp/F,OAAOgzC,KAAK1tD,KAAKmqH,YAAYtpH,SAIlEb,KAAK4uH,iBAAiBtqH,OAAOtE,KAAKq5G,SAASA,WAG7Cr5G,KAAKovD,eAAe9qD,OAAOtE,KAAKuqH,gBAAiBvqH,KAAK4uH,kBAEtD,wBAAuC5uH,KAAKkoH,mBAAoBloH,KAAKwP,gBACrExP,KAAKwP,eAAejO,IAAI,GAAxBvB,CAA2C,OAAQA,KAAKgoH,iBACxDhoH,KAAKwP,eAAejO,IAAI,GAAxBvB,CAA2C,QAASA,KAAKmoH,kBAEzDnoH,KAAK8uH,0BAWL9uH,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAoB,MAClDA,KAAKuuH,gBAAkBvuH,KAAKwuH,eAE7BxuH,KAAK+uH,cAAgB,GACrB/uH,KAAKgqH,qBAQJhqH,KAAKo9G,mBACNp9G,KAAKo9G,kBAAkB4R,iBAI3BhvH,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAiB,EAAEmJ,OAAAA,EAAQwD,SAAAA,EAAUsiH,MAAAA,EAAO1T,MAAAA,MAC1Ev7G,KAAKq9B,KAAK1wB,WAAaA,GAAY3M,KAAKq9B,KAAKl0B,SAAWA,GAC3DnJ,KAAK48F,SAASqyB,GAAO,EAAM1T,MAG7Bv7G,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAkBq9B,IAChDr9B,KAAKq9B,OAASA,GACfr9B,KAAKkvH,eAITlvH,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,iBAAiB,EAAEsK,KAAAA,EAAMwqC,GAAAA,MACvD90C,KAAKq9B,OAAS/yB,EACftK,KAAKsuH,6BAA6BvM,sBAAqB,GAC/C/hH,KAAKq9B,OAASyX,GACtB90C,KAAKsuH,6BAA6BvM,sBAAqB,MAIxD/hH,KAAK+sH,iBACN/sH,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAqBmJ,IACnDA,EAAOm/B,aAAetoC,KAAKq9B,KAAKl0B,SAAWA,GAC5CnJ,KAAKmvH,kBAKW,cAAnBnvH,KAAKq9B,KAAKp9B,KACXD,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAoB,EAAEmJ,OAAAA,EAAQgB,KAAAA,MAC5DnK,KAAKq9B,KAAKl0B,SAAWA,GAAUgB,EAAKo1B,SAASv/B,KAAK8pH,YACnD9pH,KAAK4K,oBAIT5K,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,kBAAkB,EAAEmJ,OAAAA,EAAQQ,KAAAA,MAC1D3J,KAAKq9B,KAAKl0B,SAAWA,IACnBQ,EAAKE,IAAI7J,KAAK8pH,YACf9pH,KAAK4K,gBAGJ5K,KAAKm+G,cAAgBx0G,EAAKE,IAAI7J,KAAKm+G,eACpCn+G,KAAK87G,YAAY,aASvB97G,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,uBAAwBqhC,IACtDA,EAAQrhC,KAAKq9B,KAAKl0B,UAChBnJ,KAAKiyF,aAAe,MACrBjyF,KAAK4nG,gBAEL5nG,KAAK8uD,QAAO,QAMpB,IACE9uD,KAAK8nH,SAAW,IAAI,KAAJ,CAAa,CAG3BsH,kBAAmB,KACnBC,YAAa,EACbC,iBAAkB,EAClBC,cAAe,EACfC,aAAa,IAEf,MAAM3hH,GACNC,QAAQC,MAAM,8BAA+BF,GAG/C7N,KAAKiqH,gBAELjqH,KAAKwP,eAAejO,IAAIvB,KAAKkuH,UAA7BluH,CAAwC,UAAWM,IACjD,IAAI+7G,EAAS/7G,EAAEkY,OAA0C6jG,MACrDA,EAAMx7G,SAIV,IAAIu7G,GAAcp8G,KAAKq9B,KAAMhzB,MAAMC,KAAK+xG,GAAOz7G,QAASZ,KAAKs8G,gBAC7Dt8G,KAAKkuH,UAAUxtH,MAAQ,OACtB,IAkBH,QAAiBV,KAAK6uH,QAAS7uH,KAAKkqH,eAAgB,CAAC16G,eAAgBxP,KAAKwP,eAAgBigH,gBAAgB,IAEvGzvH,KAAK8nH,YACN,QAAiB9nH,KAAKuqH,gBAAiBvqH,KAAK6nH,oBAAqB,CAACr4G,eAAgBxP,KAAKwP,iBAEvFxP,KAAK8nH,SAAS4H,OAAS,KACrB1vH,KAAKqqH,cAAa,GAClBrqH,KAAK4jH,UAAUrjH,UAAUC,OAAO,aAChCR,KAAKkrH,eAAe5nH,MAAMmd,UAAY,IAGxCzgB,KAAK8nH,SAAS6H,gBAAmBC,IAgB/B,GAfG5vH,KAAKoqH,uBACNpqH,KAAKoqH,uBACLpqH,KAAKoqH,0BAAuB7jH,GAG3BvG,KAAKwqH,2BACNxqH,KAAKwP,eAAehP,OAAOR,KAAKwqH,0BAChCxqH,KAAKwqH,8BAA2BjkH,GAG/BvG,KAAKyqH,0BACN95G,EAAA,aAAmC3Q,KAAKyqH,yBACxCzqH,KAAKyqH,6BAA0BlkH,GAG9BvG,KAAKsnH,eACN,OAGF,MAAM,OAACn+G,EAAM,SAAEwD,GAAY3M,KAAKq9B,KAC1B8gF,EAAen+G,KAAKm+G,aAEpB1mG,GAAY4iC,KAAKC,MAAQt6C,KAAKunH,iBAAmB,IAAO,EACxDsI,EAAW,IAAIC,KAAK,CAACF,GAAa,CAAC3vH,KAAM,cAK/C8nH,GAAA,SAA4B6H,GAAY,GAAM7tH,MAAKwG,IAGjDw/G,GAAA,gBAAkC,GAGlC/nH,KAAKiJ,mBAAmB8mH,SAAS5mH,EAAQ0mH,EAAU,CACjDG,gBAAgB,EAChBjS,SAAS,EACTtmG,SAAAA,EACAyS,SAAU3hB,EAAO2hB,SACjBo0F,UAAW/1G,EAAO8P,IAClB8lG,aAAAA,EACAxxG,SAAAA,EACAyqF,YAAY,IAGdp3F,KAAK4K,eAAc,GAAO,SAKhC,QAAiB5K,KAAKonH,cAAc0E,UAAW9rH,KAAK0pH,eAAgB,CAACl6G,eAAgBxP,KAAKwP,kBAC1F,QAAiBxP,KAAKonH,cAAchmH,UAAWpB,KAAKqrH,cAAe,CAAC77G,eAAgBxP,KAAKwP,iBAEzFxP,KAAK+pH,mBAAqB9vF,IAAS,IAAMj6B,KAAKkvH,aAAa,MAAM,GAAO,GAExElvH,KAAKiwH,aAAc,OAAO,mEAC1BjwH,KAAKiwH,YAAY3rH,QAAO,IAAAsH,MAAK,cAE7B,QAAiB5L,KAAKiwH,aAAa,KACjC,MAAM,WAACh+B,GAAcjyF,KACrB,QAAkBuG,IAAf0rF,EACD,OAGF,MAAMpuF,EAAS7D,KAAKkwH,6BAA8B,EAAAvyF,GAAA,GAAiB,CAAC39B,KAAKiwH,cAAc,GACjF9mH,EAASnJ,KAAKq9B,KAAKl0B,OACnB0nB,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,eAAc,IAC1Cn7F,KAAKq9B,KAAKl0B,SAAWA,GAAUnJ,KAAKiyF,aAAeA,GAAcjyF,KAAKkwH,8BAAgCrsH,IAG/G7D,KAAKiJ,mBAAmBknH,SAAShnH,EAAOoL,gBAAYhO,EAAW0rF,GAAYlwF,MAAK,KAC3E8uB,MACDhtB,IACA7D,KAAKkwH,iCAA8B3pH,EACnCvG,KAAK4nG,sBAGR,CAACp4F,eAAgBxP,KAAKwP,iBAEzBxP,KAAK4rH,iBAAiBtnH,OAAOtE,KAAKiwH,aAG7BtsB,yBACL3jG,KAAKowH,kBAAmB,OAAO,kEAAmE,CAACvhH,KAAM,UACzG7O,KAAK4rH,iBAAiBtnH,OAAOtE,KAAKowH,kBAElCpwH,KAAKwP,eAAejO,IAAIvB,KAAKowH,iBAA7BpwH,CAA+C,SAAS,KACtD,MAAMmJ,EAASnJ,KAAKq9B,KAAKl0B,OAEzB,IAAI8oG,GAAgB9oG,EAAQ,GAAG,GAAM,KACnCnJ,KAAKq9B,KAAKs+D,aAAalsD,UAGvB,MAAM4gF,EAAerwH,KAAKq9B,KAAKs+D,aAAat+D,KACzCgzF,EAAapyB,OAAOC,eACrBmyB,EAAapyB,OAAOC,cAAcoyB,uBAAuBzsH,QAAO,SAKtE7D,KAAK4jH,UAAUrjH,UAAUgB,IAAI,eAGxButD,OAAOh+C,GAAU,GACtB,MAAMy/G,EAAsBvwH,KAAKwwH,yBACjC,IAAID,IAAwBvwH,KAAKovD,eAAe7uD,UAAUmT,SAAS,gBACjE,OAGF,GAAG68G,IAAwBvwH,KAAKywH,cAC9B,OAUF,MAAM/E,EAAuB6E,GAAuBvwH,KAAKywH,cACnDhkE,IAAa8jE,EACbG,EAAmB1wH,KAAKywH,cAC9B,IAAuC9hE,EAAnCluC,EAAY,GAAIkwG,EAAe,GAEjC,MAAMC,EAAoBlF,EAAqBjsG,wBACzCoxG,EAAe7wH,KAAKyrH,gBAAgBhsG,wBACpCmvC,EAAYiiE,EAAajvH,MACzBitD,EAAU+hE,EAAkBhvH,MAElC,GAAGgtD,IAAcC,EAAS,CACxB,MAAMiiE,EAAQ,EAAsBliE,EAC9BmiE,GAAkBniE,EAAYC,GAAW,EAG/C,GAFAF,EAAiBiiE,EAAkB/vG,KAAOgwG,EAAahwG,KAAOkwG,EAE3DtkE,IACDhsC,EAAY,cAAckuC,eAA4BmiE,KAGnDA,EAAQ,GAAG,CACZ,MAAME,EAAK,GACXL,EAAqBK,EAAKA,GAAM,EAAIF,GAAU,MAOtD9wH,KAAKywH,cAAgBF,EAErB,MAAM94G,EAAW3G,EAAU,IAAM,EAMjC,OALA,QAAc9Q,KAAKovD,eAAgB,eAAgB3C,EAAUh1C,IAC7D,QAAczX,KAAKurH,mBAAoB,6BAA8B9+D,GAAY8jE,GAAuBA,EAAoBhwH,UAAUmT,SAAS,uBAAwB+D,GACvKzX,KAAKwrH,YAAYloH,MAAMmd,UAAYA,EACnCzgB,KAAKwrH,YAAYloH,MAAMqtH,aAAeA,EAE/B,CACLlwG,UAAAA,EACAkwG,aAAAA,EACAhiE,eAAgB+hE,IAEVH,GACAA,EAAoBhwH,UAAUmT,SAAS,uBACvCg9G,IAAqB1wH,KAAK0rH,sBACvBgF,EAAiBnwH,UAAUmT,SAAS,wBACrB,GAAlBi7C,EAAuBA,EAC7BC,UAAAA,EACAC,QAAAA,GAIG+4C,cAAc3V,GAChBjyF,KAAKiyF,aAAeA,IAIvBjyF,KAAKiyF,WAAaA,EAClBjyF,KAAK8uD,QAAO,IAGP0hE,yBACL,OAAGxwH,KAAKq9B,KAAKyW,UAAUC,YACd/zC,KAAK0rH,0BACgBnlH,IAApBvG,KAAKiyF,aACZjyF,KAAKq9B,KAAK4iE,WACQ,WAAnBjgG,KAAKq9B,KAAKp9B,MACVD,KAAKq9B,KAAK4zF,sBAEHjxH,KAAK4rH,sBALP,EA8CF9G,eAAenoF,GACpB,MAA0B,cAAnB38B,KAAKq9B,KAAKp9B,MAAwBD,KAAK23G,gBAAgBh7E,IAAW,IAASA,KAAY,GAiCzF6jE,iBACL,IAAIxgG,KAAKutH,kBACP,OAGF,MAAMz4G,EAAS9U,KAAKiJ,mBAAmBs+F,cAAcvnG,KAAKq9B,KAAKl0B,QACzD3C,EAAQsO,MAAAA,OAAM,EAANA,EAAQ0yF,aAItB,GAHAxnG,KAAKutH,kBAAkBv/F,UAAY,IAAMxnB,GAAS,IAClDxG,KAAKutH,kBAAkBhtH,UAAUsD,OAAO,aAAc7D,KAAKsqC,wBAAwB4mF,iBAAiBlxH,KAAKq9B,KAAKl0B,QAAQ,IAEnHnJ,KAAKytH,sBAA2C,SAAnBztH,KAAKq9B,KAAKp9B,KAAiB,CACzD,MAAMkxH,MAAiBr8G,MAAAA,OAAM,EAANA,EAAQs8G,yBAAyBt8G,EAAO0yF,cAC/DxnG,KAAKytH,qBAAqBz/F,UAAYmjG,EAAc,GAAMr8G,EAA4B,sBAAI,GAC1F9U,KAAKwtH,aAAajtH,UAAUsD,OAAO,aAAcstH,IAI9CjC,YACL,IAAIlvH,KAAKq9B,KAAKl0B,QAAUnJ,KAAK8pH,WAAgC,cAAnB9pH,KAAKq9B,KAAKp9B,KAAsB,OAE1E,MAAM,MAACS,EAAK,SAAEk7C,IAAY,EAAAw/D,GAAA,GAAap7G,KAAKo9G,kBAAkBr9G,OAE9D,IAAIkvH,GACDvuH,EAAMG,QAAUb,KAAKm+G,gBACtB8Q,EAAQ,CACN3lH,EAAG,eACHujB,MAAM,UAAM,GAAQ7sB,KAAKk6C,kBAAkBm3E,iBAC3CnrH,QAASxF,EACTk7C,SAAUA,EAAS/6C,OAAS+6C,OAAWr1C,EACvCyU,OAAQ,CACNs2G,WAAYtxH,KAAKypH,WAEnB7rB,gBAAiB59F,KAAKm+G,eAI1Bn+G,KAAK8gE,iBAAiBywD,UAAUvxH,KAAKq9B,KAAKl0B,OAAQnJ,KAAKq9B,KAAK1wB,SAAUsiH,GAGjE3oB,UAGLtmG,KAAKwP,eAAeS,YAGf9E,QAAQqmH,GAAY,GACrBxxH,KAAKq9B,KAAKl0B,SACZnJ,KAAK4jH,UAAUtgH,MAAMC,QAAU,OAC/BvD,KAAK2rH,UAAUprH,UAAUgB,IAAI,SAG/BmnD,KAEA1oD,KAAKmnH,aAAe,EACpBnnH,KAAKiyF,gBAAa1rF,EAEfvG,KAAKkwH,8BACNlwH,KAAKkwH,8BACLlwH,KAAKkwH,iCAA8B3pH,GAGlCvG,KAAK0lG,eACN1lG,KAAKyxH,aACLD,GAAaxxH,KAAK87G,eAIflf,SAASqyB,EAAwByC,GAAa,EAAMnW,GAAQ,GACjE,SAAKA,KAAU,EAAAzB,GAAA,GAAa95G,KAAK0lG,eAAqC,cAAnB1lG,KAAKq9B,KAAKp9B,OAEzDgvH,IACFA,EAAQjvH,KAAK8gE,iBAAiB6wD,SAAS3xH,KAAKq9B,KAAKl0B,OAAQnJ,KAAKq9B,KAAK1wB,WAyBlE3M,KAAKo9G,kBAAkB18G,QAAUuuH,EAAM2C,UAAY5xH,KAAKm+G,eAAiB8Q,EAAMrxB,kBAE/E8zB,GACD1xH,KAAK87G,cAGP97G,KAAKypH,UAAYwF,EAAMj0G,OAAOs2G,WAC3BrC,EAAMrxB,iBACP59F,KAAKmgG,iBAAiB8uB,EAAMrxB,iBAG9B59F,KAAK6xH,cAAc5C,EAAM2C,SAAUF,EAAYA,GACxC,IAlCAnW,IAIEv7G,KAAKq9B,KAAKj8B,UAAUb,UAAUmT,SAAS,qBACxC1T,KAAKsS,IAGPtS,KAAKo9G,kBAAkB0U,UAAUhhG,YAAc,GAC/C9wB,KAAKo9G,kBAAkB4R,aAAY,IAEjChvH,KAAKq9B,KAAKzD,QAAQsgE,sBAAwB12F,QAAQ2E,WAA4BpG,MAAK,MACnF,UAAQ,KACN/B,KAAK4K,uBAKJ,KAmBN81F,iBAAiBzO,GACtB,MAAM9oF,EAASnJ,KAAKq9B,KAAKl0B,QAEnB,gBAACmiH,EAAe,aAAEqC,EAAY,cAAEE,EAAa,SAAExU,EAAQ,UAAEsS,EAAS,UAAE/H,EAAS,gBAAEmJ,EAAe,kBAAEe,GAAqB9tH,KAC3H4jH,EAAUtgH,MAAMC,QAAU,GAE1B,MAAMw5B,EAAc/8B,KAAKoc,gBAAgB2gB,YAAY5zB,GAmBrD,GAlBAwiH,EAAUprH,UAAUsD,OAAO,eAAgBk5B,GAC3C4uF,EAAUprH,UAAUC,OAAO,QAExBR,KAAKutH,mBACNvtH,KAAKwgG,iBAGe,WAAnBxgG,KAAKq9B,KAAKp9B,MACX2jH,EAAUrjH,UAAUsD,OAAO,UAAW7D,KAAKoc,gBAAgB27F,cAAc5uG,IAIxEmiH,IACDtrH,KAAK0sH,0BAA2B,EAChCpB,EAAgBe,YAAYlrG,cAAcrgB,kBAAiB,GAC3DwqH,EAAgBhiG,WAAWnI,cAAcrgB,kBAAiB,IAGzD6sH,EAAc,CACfA,EAAaptH,UAAUgB,IAAI,QAC3B,MAAMsvB,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBACrCn7F,KAAKiJ,mBAAmBslG,qBAAqBplG,GAAQpH,MAAKoI,IACpD0mB,KACJ88F,EAAaptH,UAAUsD,OAAO,QAASsG,EAAKtJ,WAQhD,GAJGb,KAAK8sH,mBACN9sH,KAAK+xH,aAAa,MAAM,GAAO,GAG9BjE,IACD9tH,KAAKgyH,oBAAiBzrH,EACtBvG,KAAK4pH,YAAY/lH,QAAO,OAAM0C,GAAW,GACzCvG,KAAK6pH,yBAAwB,GAC7BiE,EAAkBttH,SACfR,KAAKoc,gBAAgB4rF,MAAM7+F,IAAS,CACrC,MAAMyL,EAASzL,EAAOoL,WAChBsc,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBAC/B82B,EAAoBjyH,KAAK49B,kBAAkBszE,WAAWt8F,IAC5D,EAAA+8B,GAAA,GAAYsgF,GAAoBnhD,IAC1BjgD,KACJ7wB,KAAKkyH,kBAAkBphD,IAAYmhD,aAA6BzuH,aAKnEupH,IACE/sH,KAAKotH,eACNptH,KAAKotH,aAAa5sH,SAClBR,KAAKotH,kBAAe7mH,GAGtBwmH,EAAgBvsH,SAChBR,KAAKmyH,kBAAe5rH,EACpBvG,KAAKoyH,2BAAwB7rH,EAE7BvG,KAAKmvH,cAAa,IAGjBtB,GACDA,EAAcp+E,QAAQtmC,GAGrBkwG,GACDA,EAASG,UAAUrwG,GAGlBnJ,KAAK0lG,aACN1lG,KAAKqyH,qBACGryH,KAAKowH,kBACbpwH,KAAKowH,iBAAiB9rH,QAAO,IAAAsH,MAAK5L,KAAKoc,gBAAgB27F,cAAc/3G,KAAKq9B,KAAKl0B,QAAU,sBAAwB,yBAMnHnJ,KAAKiyF,WAAaA,EAElBjyF,KAAK8uD,QAAO,GAGNijE,aAAa9xH,EAAyBwsD,EAAmBw1D,EAAyBhmB,GACrFh8F,EACDD,KAAK8sH,kBAAkB9jG,QAAQwL,OAASv0B,SAEjCD,KAAK8sH,kBAAkB9jG,QAAQwL,QAGxC,QAAcx0B,KAAK8sH,kBAAmB,aAAcrgE,EAAUw1D,EAAgB,EAAI,SAAK17G,EAAW01F,GAG5Fi2B,kBAAkBphD,EAA6BmxC,GACrDjiH,KAAKgyH,eAAiBlhD,EAASqgC,UAAYrgC,EAASqgC,SAASqT,SAAS3jH,OACtEb,KAAK6pH,wBAAwB5H,GAGvB4H,wBAAwB5H,GAC9B,MAAM,kBAAC6L,EAAiB,eAAEkE,GAAkBhyH,KAEtC0iB,EAAOsvG,GAAkBhyH,KAAK85G,eAChCkY,GACFlE,EAAkBttH,SAGpB,MAAMisD,EAAW/pC,EACXu5E,EAAU6xB,EAAkB7pH,cAAgB,EAAI,EAElD6pH,EAAkB7pH,eACpBjE,KAAK8sH,kBAAkB5oH,QAAQ4pH,GAGjC9tH,KAAK+xH,aAAa,WAAYtlE,EAAUw1D,EAAehmB,GAGjDq2B,oBAAoBj+G,GAC1B,MAAMuN,EAAmCvN,EAAQ3J,KAAI,CAACynH,EAAchsH,KAClE,MAAMmb,EAAcjgB,SAASC,cAAc,OAErC8uB,EAAW/uB,SAASC,cAAc,OAexC,OAdA8uB,EAAS7vB,UAAUgB,IAAI,0BACpB4wH,EAAajwF,SACd9R,EAAS9rB,QAAO,IAAAsH,MAAK,gCACbumH,IAAiBnyH,KAAKq9B,KAAKl0B,OACnCinB,EAAS9rB,QAAO,IAAAsH,MAAK,8BAErBwkB,EAAS9rB,OAAOtE,KAAK49B,kBAAkB20F,qBAAqBJ,EAAa52F,aAG3Eja,EAAYhd,OACV,IAAI,KAAU,CAAC6E,OAAQgpH,IAAex5G,QACtCyX,GAGK,CACLlP,QAAS/a,EAAM,KACb,MAAMqsH,EAAgBxyH,KAAKq9B,KAAKl0B,OAChC,GAAGqpH,EAAclqF,YAAa,CAC5B,MAAMmqF,EAAczyH,KAAK49B,kBAAkB80F,kBAAkBF,EAAcj3F,YAC3E,GAAGk3F,EAAa,CACdA,EAAYE,gBAAkB3yH,KAAKoc,gBAAgBs0F,cAAcyhB,GACjEnyH,KAAKmyH,aAAeA,EACpBnyH,KAAK4yH,mBAAmBT,GACxBnyH,KAAK6yH,gCAEL,MAAMhiG,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBAC/B23B,EAAuB,KAC3B,GAAG9yH,KAAKmyH,eAAiBA,IAAiBthG,IAAc,OACxD,MAAMxc,EAAUrU,KAAK+yH,cAAcnyH,SACnC,EAAAoR,EAAA,GAAiBqC,EAAS89G,GAC1B99G,EAAQrM,QAAQmqH,GAChBnyH,KAAKsyH,oBAAoBj+G,IAGxBxJ,EAAA,mCACDuC,WAAW0lH,EAAsB,KAEjCA,KAMN,eAAqB,6BAA8B,CACjDntF,KAAM3lC,KAAKoc,gBAAgB42G,iBAAiBR,GAC5CS,QAASjzH,KAAKoc,gBAAgB42G,iBAAiBb,WAE/C5rH,EACJ+a,YAAAA,MAIEU,EAAU,GAAWJ,GAC3BA,EAAQ7c,SAAQ,CAACwZ,EAAQpY,KACvB,MAAMgD,EAASkL,EAAQlO,GACjBgnC,EAAS,IAAIpR,GACnBoR,EAAO5sC,UAAUgB,IAAI,YAAa,sBAClC4rC,EAAOjtC,aAAa,OAAQ,GAAKiJ,GAE7BhD,GACFgnC,EAAO5sC,UAAUgB,IAAI,UAGvBgd,EAAO5F,QAAQzU,QAAQipC,MAGzB9iC,MAAMC,KAAKtK,KAAKqtH,cAAcz8F,UAAUhwB,MAAM,GAAGmE,SAAQu+G,GAAQA,EAAK9iH,WACtER,KAAKqtH,cAAc/oH,UAAU+F,MAAMC,KAAK0X,EAAQ4O,WAG1CgiG,mBAAmBT,EAAsBlQ,GAC/C,MAAMiL,EAAiBltH,KAAKotH,aAC5B,GAAGF,IACGA,EAAepnD,aAAa,UAAYqsD,EAC1C,OAIAjF,IACFjL,GAAgB,GAGlB,IAAIhmB,EAAUgmB,EAAgB,EAAI,EAClC,MAAMxqG,EAAWwqG,EAAgB,EA/zCF,IAg0CzB90E,EAASntC,KAAKotH,aAAe,IAAIrxF,GACvCoR,EAAOjtC,aAAa,SAAU,KAC9BitC,EAAOjtC,aAAa,OAAQ,GAAKiyH,GACjChlF,EAAO5sC,UAAUgB,IAAI,6BAA8B,cAEnD,QAAc4rC,EAAQ,cAAc,EAAM11B,OAAUlR,EAAW01F,GAC5DixB,IACD,QAAcA,EAAgB,cAAc,EAAOz1G,GAAU,KAC3Dy1G,EAAe1sH,WACdy7F,GAGLj8F,KAAK+sH,gBAAgBzoH,OAAO6oC,GAGtB+lF,mBAEN,OAAO,EAAAvhF,GAAA,GAAY3xC,KAAK49B,kBAAkBu1F,eAAenzH,KAAKq9B,KAAKl0B,OAAOoyB,aAAck3F,GAC/EA,EAAYE,gBAAkB3yH,KAAKoc,gBAAgBgtE,UAAUqpC,EAAYE,sBAAmBpsH,IAI/F4oH,aAAalN,GACnB,MAAM94G,EAASnJ,KAAKq9B,KAAKl0B,OACzB,IAAIA,EAAOm/B,aAAetoC,KAAKoyH,sBAC7B,OAGF,MAAMvhG,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,eAAc,KACzCn7F,KAAKoyH,uBAAyBpyH,KAAKoyH,wBAA0BA,KAGjE,gBAACrF,GAAmB/sH,KACpBmU,EAAShL,EAAOoyB,WAChBhzB,EAASvI,KAAKkzH,mBAGjB3qH,aAAkB/E,UACnBy+G,OAAgB17G,GAGlB,MAAM6sH,GAAqB,EAAAzhF,GAAA,GAAYppC,GAAS4pH,IAC9C,IAAIthG,UAAiCtqB,IAAjB4rH,EAA4B,OAEhDnyH,KAAKmyH,aAAeA,EACpBnyH,KAAK4yH,mBAAmBT,EAAclQ,GACtCjiH,KAAK6yH,gCAEL7yH,KAAK8T,gBAAgBu/G,UAAUl/G,GAAQpS,MAAKuzD,IAC1C,IAAIzkC,IAAc,OAElB,MAAMxc,EAAUihD,EAAM5qD,KAAKi7B,GAAS3lC,KAAKoc,gBAAgBgtE,UAAUzjD,KACnE3lC,KAAK+yH,cAAgB1+G,EAAQzT,SAE7B,EAAAoR,EAAA,GAAiBqC,EAAS89G,GAC1B99G,EAAQrM,QAAQmqH,GAChBnyH,KAAKsyH,oBAAoBj+G,MAG3B,IAAI4nF,EAAU,EACV8wB,EAAgB9oH,gBAClBjE,KAAK8sH,kBAAkB5oH,QAAQ6oH,GAC/B9wB,EAAU,GAGZj8F,KAAK+xH,aAAa,MAAM,EAAM9P,EAAehmB,GAE7Cj8F,KAAKoyH,2BAAwB7rH,KAGzB6rH,EAAwBpyH,KAAKoyH,sBAAwB5uH,QAAQ2E,QAAQirH,GAC3E,OAAOhB,EAGDS,gCACN,MAAMttH,EAAI,sBAAiBvF,KAAK0lG,cAChC,GAAGngG,EAAG,CACJ,MAAM,OAAC4D,EAAM,SAAEwD,GAAY3M,KAAKq9B,KAChC,IAAIltB,EAEFA,EADCxD,EACK,UACE3M,KAAKoc,gBAAgB2gB,YAAY5zB,GACnC,wBACyB5C,IAAtBvG,KAAKmyH,cAA8BnyH,KAAKmyH,eAAiBtnH,EAAA,cAClE7K,KAAKiJ,mBAAmBqqH,mBAAmBnqH,GACrC,kBAEA,UAGR5D,EAAE8xE,iBAAiB,CAAClnE,IAAAA,KAIjBkiH,qBACL,MAAM,UAACzO,EAAS,WAAEwK,EAAU,aAAE1oB,GAAgB1lG,MACxC,OAACmJ,EAAM,SAAEwD,GAAY3M,KAAKq9B,KAC1B2rE,EAAWhpG,KAAKq9B,KAAK4iE,UACV2jB,EAAUrjH,UAAUmT,SAAS,gBACxBs1F,IAEpB4a,EAAUrjH,UAAUgB,IAAI,iBACxBqiH,EAAUrjH,UAAUsD,OAAO,aAAcmlG,GACpC4a,EAAUl1E,WACfk1E,EAAUrjH,UAAUC,OAAO,kBAG7BR,KAAK6yH,gCAEL,MAAM5vG,EAAUjjB,KAAKiuH,kBAAkBnkH,QAAOyU,IAC5C,MAAM4H,EAAO5H,EAAO7F,OAAOvP,EAAQwD,GAEnC,OADA4R,EAAO5F,QAAQpY,UAAUsD,OAAO,QAASsiB,GAClCA,KAGL6iF,GAGFtD,EAAaxlG,aAAa,kBAAmB,QAC7CF,KAAK48F,cAASr2F,GAAW,GAErBm/F,EAAa5/F,WACf9F,KAAKo9G,kBAAkB4R,eANzBtpB,EAAal8D,gBAAgB,mBAU/B4kF,EAAWt3F,gBAAgB,YAAa7T,EAAQpiB,QAChDutH,EAAW7tH,UAAUsD,OAAO,gBAAiBof,EAAQpiB,QACrDb,KAAKiqH,gBAGC6E,0BACN,MAAMyE,EAAgBvzH,KAAKo9G,kBAC3Bp9G,KAAKo9G,kBAAoB,IAAI,IAAW,CACtCjvG,YAAa,UACbrK,KAAM,UACNgN,SAAS,IAGX9Q,KAAKo9G,kBAAkBr9G,MAAMQ,UAAUI,QAAQ,oBAAqB,uBACpEX,KAAKo9G,kBAAkB0U,UAAUvxH,UAAUI,QAAQ,oBAAqB,uBACxEX,KAAK0lG,aAAe1lG,KAAKo9G,kBAAkBr9G,MAC3CC,KAAK0lG,aAAanlG,UAAUgB,IAAI,gBAChCvB,KAAKwzH,8BAEF,OACD,EAAAC,GAAA,GAA6BzzH,KAAK0lG,cAGjC6tB,GACDA,EAAcxzH,MAAMytB,YAAYxtB,KAAKo9G,kBAAkBr9G,OACvDwzH,EAAczB,UAAUtkG,YAAYxtB,KAAKo9G,kBAAkB0U,YAE3D9xH,KAAKstH,sBAAsBhpH,OAAOtE,KAAKo9G,kBAAkBr9G,MAAOC,KAAKo9G,kBAAkB0U,WAInF0B,8BACNxzH,KAAKwP,eAAejO,IAAIvB,KAAK0lG,aAA7B1lG,CAA2C,WAAYM,IACrD,MAAM6P,EAAM7P,EAAE6P,IACd,IAAG,EAAAujH,GAAA,GAAsBpzH,IACvB,EAAAohB,EAAA,GAAYphB,GACZN,KAAKmzF,mBACA,GAAG7yF,EAAEqzH,SAAWrzH,EAAEszH,QACvB5zH,KAAK2oH,uBAAuBroH,QACvB,IAAY,WAAR6P,GAA4B,aAARA,KAAwB7P,EAAE0oH,SAGvD,GAFA1oH,EAAEme,iBAES,WAARtO,EAAkB,CACnB,MAAMq+D,EAAQntE,SAASkoD,cACjBze,EAAM39B,OAAOw7C,eAEnB6lB,EAAMqlD,SAAS7zH,KAAK0lG,aAAazf,WAAW,IAAMjmF,KAAK0lG,aAAc,GACrEl3B,EAAMslD,UAAS,GAEfhpF,EAAI+d,kBACJ/d,EAAIipF,SAASvlD,QAEb,EAAAiuC,GAAA,GAAgBz8G,KAAK0lG,iBAKxB,GAAA9oF,qBACD,QAAiB5c,KAAK0lG,cAAeplG,IACnCN,KAAK27F,aAAa9rF,UAAU,GAE5B,WAAyB,KACxB,CAACL,eAAgBxP,KAAKwP,iBA8B3BxP,KAAKwP,eAAejO,IAAIvB,KAAK0lG,aAA7B1lG,CAA2C,QAASA,KAAKipH,gBACzDjpH,KAAKwP,eAAejO,IAAIvB,KAAK0lG,aAA7B1lG,CAA2C,SAAS,KAClDA,KAAKgqH,uBAGe,SAAnBhqH,KAAKq9B,KAAKp9B,MAAsC,eAAnBD,KAAKq9B,KAAKp9B,MACxCD,KAAKwP,eAAejO,IAAIvB,KAAK0lG,aAA7B1lG,CAA2C,WAAW,KACjDA,KAAKq9B,KAAKzD,QAAQhtB,WAAWvF,UAAUuZ,QACxC5gB,KAAKiJ,mBAAmB+qH,eAAeh0H,KAAKq9B,KAAKl0B,OAAQnJ,KAAKq9B,KAAK1wB,aAqCpEm8G,cAAc7oH,EAAoB2zD,GACvC,MAAMqgE,EAAsE,CAC1EC,KAAM,OACNC,OAAQ,SACRC,UAAW,YACXC,cAAe,gBACfC,UAAW,IAAMjzH,SAAS03B,YAAY,YAAY,EAAO,aACzD0E,KAAMm2B,EAAO,IAAMvyD,SAAS03B,YAAY,cAAc,EAAO66B,GAAQ,IAAMvyD,SAAS03B,YAAY,UAAU,EAAO,MACjHgjE,QAAS,IAAM16F,SAAS03B,YAAY,YAAY,EAAO,YAGzD,IAAIk7F,EAAYh0H,GACd,OAAO,EAGT,MAAM0kH,EAAUsP,EAAYh0H,GAItBs0H,EAAev0H,KAAKsoH,yBACpBkM,EAAkB,GAuCxB,GAFAA,EAAS1sH,KAAKzG,SAAS03B,YAAY,gBAAgB,EAAO,SAE9C,cAAT94B,GAAiC,YAATA,EAAoB,CAC7C,IAAIw0H,GAAe,EAGnB,MAAM3gF,EAAY3mC,OAAOw7C,eACzB,IAAI7U,EAAU4gF,YAAa,CACzB,MAAMlmD,EAAQ16B,EAAUijD,WAAW,GAC7B49B,EAAM,KAAa10H,GAEnBqjH,EAAO90C,EAAMomD,yBACftR,EAAKv+F,WAA2B2D,QAAQisG,EAAIv+G,QAAWktG,aAAgBn6F,aAAem6F,EAAK56F,QAAQisG,EAAIv+G,UACzGq+G,GAAe,GAMhBA,EACDD,EAAS1sH,KAAKzG,SAAS03B,YAAY,YAAY,EAAO,WAEtDy7F,EAAS1sH,KAAyB,mBAAd,EAA2B68G,IAAYtjH,SAAS03B,YAAY4rF,GAAS,EAAO,YAGlG6P,EAAS1sH,KAAyB,mBAAd,EAA2B68G,IAAYtjH,SAAS03B,YAAY4rF,GAAS,EAAO,OAWlG,OARA6P,EAAS1sH,KAAKzG,SAAS03B,YAAY,gBAAgB,EAAO,UAG1Dw7F,IACGv0H,KAAK27F,aAAaktB,eACnB7oH,KAAK27F,aAAaktB,cAAcgM,yBAG3B,EAkLFzP,cAAc0P,EAAoBC,EAA8BC,GAAW,GAChF,MAAOt0H,MAAOu0H,EAAS,SAAExR,EAAQ,SAAE7nE,GAAYgnE,GAAsB5iH,KAAK0lG,cACpEz/C,EAAMw9D,GAAY,EAAIA,EAAWwR,EAAUp0H,OAC3C8nB,EAASssG,EAAUvR,OAAO,EAAGz9D,GAC7BivE,EAASD,EAAUvR,OAAOz9D,GAE1Bv9B,EAAUssG,EAAWrsG,EAAOvS,MAAM4wG,GAAUmO,uBAAyB,KAErEC,EAAa1sG,EAAUA,EAAQvhB,OAASuhB,EAAQ,GAAG7nB,OAAS6nB,EAAQ,GAAG7nB,QAAU8nB,EAAO9nB,OAExFw0H,EADY1sG,EAAO/nB,MAAM,EAAGw0H,GACLN,EAAaI,EAGpCI,EAAc,kBAAgCL,GACpD,kBAAgCr5E,EAAU05E,GAG1C,MAAMC,EAAeR,EAAe/xH,KAAKH,IAAIkyH,EAAal0H,OAAQi0H,EAAWj0H,QAAUi0H,EAAWj0H,OAC5F20H,EAA+B,GAClCT,IACDS,EAAY1tH,KAAKitH,GACjBA,EAAavgG,OAAS4gG,GAIxB,MAAMz/F,EAAOjN,EAAU6sG,EAAe7sG,EAAQ,GAAG7nB,OAAS00H,EAC1D35E,EAAS72C,SAAQ+tD,IACZA,EAAOt+B,QAAU4gG,IAClBtiE,EAAOt+B,QAAUmB,MAIrB,kBAAgCimB,EAAU45E,GAEqB,CAC7D,MAAMC,EAAgD,CACpDnsH,EAAG,qBACHkrB,OAAQ4gG,EAAaG,EACrB10H,OAAQ,GAGV,IAAI60H,EAAqB,EACzB,IAAI,IAAI70H,EAAS+6C,EAAS/6C,OAAQ60H,EAAqB70H,KACtC+6C,EAAS85E,GACdlhG,OAASihG,EAAYjhG,UAFgCkhG,GAOjE95E,EAASt1C,OAAOovH,EAAoB,EAAGD,GAKzC,MAAM/0H,EAAQ,kBAAgC20H,EAAU,CAACz5E,SAAAA,IACzD57C,KAAKo9G,kBAAkBt8G,iBAAiBJ,GAAO,GAE/C,MAAMi1H,EAAQ31H,KAAK0lG,aAAan0F,cAAc,iBAC3CokH,IC5+DQ,SAAoBrS,GAGjC,MAAMsS,EAAetS,EAGrB,GAAqB,KAFrBA,EAAOA,EAAKuS,iBAEJtoC,SAAgB,CACtB,MAAMuoC,EAAUz0H,SAAS00H,eAAe,IACxCzS,EAAKv+F,WAAW5gB,aAAa2xH,EAAUF,EAAavxH,aAAeuxH,EAAavxH,YAAYkpF,WAAa+1B,EAAK/1B,SAA0BqoC,EAAavxH,YAA5BuxH,GACzHtS,EAAOwS,EAGT,GAAG3oH,OAAOw7C,cAAgBtnD,SAASkoD,YAAa,CAC9C,MAAMilB,EAAQntE,SAASkoD,cACpB+5D,IACD90C,EAAMwnD,cAAc1S,GACpB90C,EAAMynD,WAAW3S,GACjB90C,EAAMqlD,SAASvQ,EAAMA,EAAK91B,UAAU3sF,SAGtC2tE,EAAMslD,UAAS,GAEf,MAAMhpF,EAAM39B,OAAOw7C,eACnB7d,EAAI+d,kBACJ/d,EAAIipF,SAASvlD,IDq9DX0nD,CAAWP,GACXA,EAAMn1H,UAIRR,KAAKipH,iBAWCe,kBAAkBtpH,EAAgB+iH,EAAmB7nE,GAG3D,QAAar1C,IAAV7F,EAAqB,CACtB,MAAM4iB,EAAIs/F,GAAsB5iH,KAAKo9G,kBAAkBr9G,OAAO,GAC9DW,EAAQ4iB,EAAE5iB,MACV+iH,EAAWngG,EAAEmgG,SACb7nE,EAAWt4B,EAAEs4B,SAOf,IAJiB,IAAd6nE,IACDA,EAAW/iH,EAAMG,aAGH0F,IAAbq1C,EAAwB,CACzB,MAAMu6E,EAAS,kBAAgCz1H,EAAOk7C,GAAU,GAChEA,EAAW,kBAAgCA,EAAU,kBAAgCu6E,IAKvF,GAFAz1H,EAAQA,EAAME,MAAM,EAAG6iH,GAEpBzjH,KAAK+uH,gBAAkBruH,EACxB,OAGFV,KAAK+uH,cAAgBruH,EAErB,MAAMgoB,EAAUhoB,EAAM0V,MAAM4wG,GAAUmO,uBACtC,IAAIiB,EACJ,GAAG1tG,EAAS,CACV,MAAMoqC,EAASlX,EAAS,GAExB,IAAInvC,EAAQic,EAAQ,GACpB,MAAMq7F,EAAYt3G,EAAM,GAExB,GAAGzM,KAAKuuH,gBACN1jH,EAAA,mCACA7K,KAAKq9B,KAAK4iE,QAAQ,kBACJ,wBAAdntC,MAAAA,OAAM,EAANA,EAAQxpD,IAA8BwpD,EAAOjyD,SAAWH,EAAMG,SAAWiyD,EAAOt+B,OAChF4hG,EAAcp2H,KAAKuuH,eACnBvuH,KAAKuuH,eAAelM,cAAc3hH,QAC7B,GAAiB,MAAdqjH,EAAmB,CAC3B,MAAMsB,EAAWrlH,KAAKq9B,KAAK1wB,SAAW3M,KAAKgJ,sBAAsBgmG,mBAAmBhvG,KAAKq9B,KAAK1wB,eAAYpG,EACvGvG,KAAK0uH,eAAe5K,WAAWr3G,EAAOzM,KAAKq9B,KAAKl0B,OAAO+4B,SAAW,MAAeliC,KAAKq9B,KAAKl0B,OAAQk8G,KACpG+Q,EAAcp2H,KAAK0uH,qBAEZhmG,EAAQ,IAAoB,MAAdq7F,EAIfl5G,EAAA,iCACR4B,EAAQA,EAAM9L,QAAQ,OAAQ,IAC1BD,EAAM0V,MAAM,mBAAsB1V,EAAM0V,MAAM,uBAAwB3J,IACxE2pH,EAAcp2H,KAAKwuH,YACnBxuH,KAAKwuH,YAAY1K,WAAWr3G,EAAOs3G,KAPlC/jH,KAAKyuH,eAAe3K,WAAWr3G,EAAOzM,KAAKq9B,KAAKl0B,UACjDitH,EAAcp2H,KAAKyuH,gBAWzB2H,EAAcp2H,KAAKq2H,wBAAwB31H,EAAO01H,GAElDp2H,KAAKsuH,6BAA6BpM,iBAAiBkU,GAG7CC,wBAAwB31H,EAAe01H,GAC7C,IAAIE,GAAkB,EAEtB,IAAIF,EAAa,CACf,MAAMG,EAAc71H,EAAM0V,MAAM,4BAChC,GAAGmgH,EAAa,CACd,MAAMn7F,EAAWm7F,EAAY,GACvB9pH,EAAQ/L,EAAME,MAAM21H,EAAY,GAAG11H,QACzCy1H,EAAkBC,EAAY,GAAG11H,SAAWH,EAAMG,OAElDu1H,EAAcp2H,KAAK2uH,aAEf3uH,KAAKw2H,cAKP,QAAcx2H,KAAKw2H,aAAc,QAAQ,EAAM,MAJ/Cx2H,KAAKw2H,aAAe,EAAW,8CAA+C,CAACpnH,UAAU,KACzF,QAAapP,KAAKw2H,cAAc,GAChCx2H,KAAKstH,sBAAsBrpH,cAAcE,aAAanE,KAAKw2H,aAAcx2H,KAAKstH,sBAAsBjpH,cAKtGrE,KAAK2uH,aAAa7K,WAAW9jH,KAAKq9B,KAAKl0B,OAAQiyB,EAAU3uB,GAAO1K,MAAK,EAAEkoC,KAAAA,EAAMuX,cAAAA,MACxE80E,GAAmBrsF,EAAKkoD,yBACzBnyF,KAAK0lG,aAAa18E,QAAQytG,kBAAoBxsF,EAAKkoD,wBAGrD3wC,EAAcz/C,MAAK,MACjB,QAAc/B,KAAKw2H,aAAc,QAAQ,EAAO,WAEjDvoH,MAAMse,GAAA,IAcb,OAVI+pG,UACKt2H,KAAK0lG,aAAa18E,QAAQytG,kBAGhCL,IAAgBp2H,KAAK2uH,cACnB3uH,KAAKw2H,eACN,QAAcx2H,KAAKw2H,aAAc,QAAQ,EAAO,KAI7CJ,EAGD/L,aAAa3pH,GAChBV,KAAKiuD,YAAcvtD,KAItB,QAAcV,KAAK4jH,UAAW,eAAgBljH,EAAO,KACrDV,KAAKiuD,UAAYvtD,EACjBV,KAAKiqH,iBA+LCuC,yBACN,GAAGxsH,KAAK02H,qBAAsB,OAC9B12H,KAAK02H,sBAAuB,EAE5B,MAAM/M,EAAa3pH,KAAK2pH,WACxB3pH,KAAK87G,cACL97G,KAAKiqH,gBACL,IAAIprF,GAAW,EACD,IAAImpB,IAAa,EAAA9qC,GAAA,GAAKld,KAAKmqH,aAAa,KACpDtrF,GAAW,KAGPx+B,iBAAiB,SAAS,KAC9BL,KAAK02H,sBAAuB,EAExB73F,GACF8qF,OAKC8H,WAAWkF,GAAc,EAAMC,GAAY,EAAMC,EAAa,IACnE,GAAGx1H,SAASy1F,gBAAkB92F,KAAK0lG,cAAgB,GAAA/4C,iBAAkB,CACnE,MAAMpnD,EAAIlE,SAASC,cAAc,SACjCD,SAASwY,KAAKvV,OAAOiB,IACrB,EAAAuxH,GAAA,GAAqBvxH,GACrBvF,KAAKo9G,kBAAkBt8G,iBAAiB+1H,IACxC,EAAAC,GAAA,GAAqB92H,KAAK0lG,cAC1BngG,EAAE/E,cAEFR,KAAKo9G,kBAAkBt8G,iBAAiB+1H,GAGvC,GAAAj6G,qBAOD5c,KAAKynH,gBAAkB,GACvBznH,KAAK0nH,YAAY7mH,OAAS,EAC1Bb,KAAK2nH,gBAAgB9mH,OAAS,EAC9Bb,KAAK4nH,gBAAkB,IAGzB,IAAI3iH,GAAM,EACP0xH,IACD1xH,EAAMjF,KAAK48F,cAASr2F,GAAW,KAG7BtB,GAAO2xH,GACT52H,KAAKipH,iBAIFnP,eACL,OAAO,EAAAA,GAAA,GAAa95G,KAAK0lG,cAGpBukB,gBACL,IAAIp7G,EAEJ,MAAMirG,EAAe95G,KAAK85G,eAEPjrG,EAAhB7O,KAAK8pH,UAAkB,QACjB9pH,KAAK8nH,UAAY9nH,KAAKiuD,YAAc6rD,GAAgB95G,KAAKmqH,WAAsC,cAAnBnqH,KAAKq9B,KAAKp9B,KAAuB,WAAa,OACvH,SAEZ,CAAC,OAAQ,SAAU,OAAQ,YAAY8E,SAAQQ,IAC7CvF,KAAK6uH,QAAQtuH,UAAUsD,OAAO0B,EAAGsJ,IAAStJ,MAGzCvF,KAAK2tH,cACN3tH,KAAK2tH,aAAaptH,UAAUsD,OAAO,OAAQi2G,GAG1C95G,KAAK4tH,sBACN5tH,KAAK4tH,qBAAqBrtH,UAAUsD,OAAO,OAAQi2G,GAIhDlvG,cAAc6mH,GAAa,EAAMsF,GAChB,cAAnB/2H,KAAKq9B,KAAKp9B,MACXD,KAAKiJ,mBAAmB+qH,eAAeh0H,KAAKq9B,KAAKl0B,OAAQnJ,KAAKq9B,KAAK1wB,UAAU,GAG/E3M,KAAK63G,kBAAetxG,EACpBvG,KAAKq6G,gBAAa9zG,EAElB,MAAM7F,EAAQV,KAAKo9G,kBAAkB18G,MACpB,kBAAgCA,GACkBoJ,QAAOgpD,GAAuB,uBAAbA,EAAOxpD,IAC7EvE,SAAQ+tD,IACpB,MAAMpQ,GAAQ,SAAoBoQ,EAAOkkE,SACzCh3H,KAAKgtF,gBAAgBD,gBAAgBrqC,MAGpC+uE,IACDzxH,KAAKknH,QAAU,UACRlnH,KAAKypH,UACZzpH,KAAKqnH,gBAAkB,KACvBrnH,KAAKyxH,eAGJsF,GAActF,IACfzxH,KAAK87G,cAGP97G,KAAKiqH,gBAGA92B,YAAYooB,GAAQ,GACzB,MAAM,UAACuO,EAAS,KAAEzsF,GAAQr9B,KAC1B,GAAiB,cAAdq9B,EAAKp9B,OAAyBs7G,IAAUuO,EAEzC,YADA9pH,KAAK23G,kBAIP,MAAM,OAACxuG,GAAUk0B,GACX,UAACosF,GAAazpH,KACdg+G,EAAgBh+G,KAAKq9B,KAAKu+E,2BAE1B,MAACl7G,EAAK,SAAEk7C,IAAY,EAAAw/D,GAAA,GAAap7G,KAAKo9G,kBAAkBr9G,OAG9D,GAAG+pH,EAAW,CACZ,MAAM5jH,EAAUlG,KAAK43G,YACrB,IAAGl3G,EAAMwM,SAAUhH,EAAQoQ,MAUzB,YAFA,IAAI6xC,GAAoBh/C,EAAQ,CAAC2gH,GAAYzsF,EAAKp9B,MAPlDD,KAAKiJ,mBAAmB2uG,YAAY1xG,EAASxF,EAAO,CAClDk7C,SAAAA,EACA6tE,UAAWA,IAGbzpH,KAAK4K,qBAMClK,EAAMwM,SACdlN,KAAKiJ,mBAAmBg1G,SAAS90G,EAAQzI,EAAO,OAAF,sBAC5Ck7C,SAAAA,GACGoiE,GAAa,CAChByL,UAAWA,EACXH,QAAStpH,KAAKqpH,uBAAoB9iH,EAAYvG,KAAKqnH,gBACnDjwB,YAAY,KAGdp3F,KAAK4K,eAAc,GAAO,IAK5B,GAAG5K,KAAKmqH,WAAY,CAClB,MAAMA,GAAa,EAAAjtG,GAAA,GAAKld,KAAKmqH,YAC7B/8G,YAAW,KACT,IAAI,MAAMugD,KAAcw8D,EACtBnqH,KAAKiJ,mBAAmBguH,gBAAgB9tH,EAAQwkD,EAAW1kC,WAAYkhG,EAAWx8D,GAAa,OAAF,wBACxFqwD,GAAa,CAChBkZ,WAAYl3H,KAAKsrH,iBAAmBtrH,KAAKsrH,gBAAgBc,WAAWjrG,cAAcQ,QAClFw1G,aAAcn3H,KAAKo3H,wBAInB12H,GACFV,KAAK4K,kBAEN,IAMAysH,wBAAwBh2H,EAA+Bk6G,GAAQ,EAAOnkB,GAAa,G,MAGxF,MAAMnyD,EAAyB,aAF/B5jC,EAAWrB,KAAK8X,eAAew/G,OAAOj2H,IAEhBpB,KAAqB,gBAAqC,QAAlBoB,EAASpB,KAAiB,YAAc,aACtG,OAAGD,KAAKq9B,KAAKl0B,OAAO65B,cAAgBhjC,KAAKq9B,KAAK4iE,QAAQh7D,IACpDnL,GAAMitF,KACC,GAGa,cAAnB/mH,KAAKq9B,KAAKp9B,MAAyBs7G,IAKnCl6G,IACDrB,KAAKiJ,mBAAmB8mH,SAAS/vH,KAAKq9B,KAAKl0B,OAAQ9H,EAAU,OAAF,wBACtDrB,KAAKq9B,KAAKu+E,2BAAyB,CACtCmC,SAAS,EACT3mB,WAAYA,QAAc7wF,KAE5BvG,KAAK4K,cAAcwsF,GAAY,GAEV,YAAlB/1F,EAASpB,OACmB,QAA7B,wBAA6B,SAAE0wF,kBAAkBtvF,KAG5C,IAhBPrB,KAAK23G,iBAAgB,IAAM33G,KAAKq3H,wBAAwBh2H,GAAU,EAAM+1F,MACjE,GAqBH60B,sBACN,MAAM,gBAACX,GAAmBtrH,KAC1B,IAAIsrH,EAAiB,OAAO,EAC5B,MAAMiM,EAA2BjM,EAAgBgB,YAAYnrG,cAC7D,OAAQo2G,EAAyB51G,UAC/B,EAAA4jB,GAAA,GAAUgyF,EAAyBlkH,MAAO,QAAQ9S,UAAUmT,SAAS,QAGjE0jH,qBACN,OAAQp3H,KAAKisH,sBAeRvV,mBAAmB3tG,GACxB,MAAM7C,EAA2BlG,KAAKq9B,KAAK0oB,WAAWh9C,GAEtD,IAAIhJ,EAAQ,kBAAgCmG,EAAQA,QAAS,CAAC01C,SAAU11C,EAAQ6sD,gBAChF,MAAMrzB,EAAI,KACR,MAAM83F,EAAgBx3H,KAAKiJ,mBAAmBwuH,oBAAoBvxH,OAASK,EAAW,CAACL,EAAQ6C,MAC/F/I,KAAKwpH,WAAW,OAAQ9pF,GAAG,IAAA9zB,MAAK,mBAAoB4rH,EAAez3H,EAAOmG,GAE1ElG,KAAK8pH,UAAY/gH,EACjB/I,KAAK43G,YAAc1xG,EACnBnG,OAAQwG,GAEVm5B,IAGKg4F,oBAAoBC,GACzB,MAAMj4F,EAAI,KAER,MAAMk4F,EAAcl9G,OAAOgzC,KAAKiqE,GAAiBjtH,KAAIijD,GAAcA,EAAW1kC,aACxE4uG,EAAoB,IAAInyH,IAC9B,IAAI7E,EAAS,EAAGi3H,EAA6B,EAE7CF,EAAY7yH,SAAQ4oD,IAClB,MAAMxjD,EAAOwtH,EAAgBhqE,GAC7BxjD,EAAKpF,SAAQgE,I,MACX,MAAM7C,EAA2BlG,KAAKiJ,mBAAmBsgF,iBAAiB57B,EAAY5kD,KACnE,QAAhB,EAAA7C,EAAQ6hF,gBAAQ,eAAE2lB,YAAcxnG,EAAQuH,QAAWvH,EAAQ45E,UAG5D+3C,EAAKt2H,IAAI,IAAM2E,EAAQuH,QAFvBoqH,EAAKt2H,IAAI,IAAM2E,EAAQ6hF,SAAS2lB,WAK/BxnG,EAAQoQ,OAASpQ,EAAQA,WACxB4xH,KAINj3H,GAAUsJ,EAAKtJ,UAGjB,MAAM20D,EAAgBqiE,EAAK32H,KAAO,EAC5B62H,EAAa,IAAIF,GAAMntH,KAAImtH,IAC/B,MAAM53H,EAAO43H,EAAK,GAElB,GADAA,EAAOA,EAAKj3H,MAAM,GACN,MAATX,EAAc,CACf,MAAMkJ,EAAS0uH,EAAK5uG,WACpB,OAAO9f,IAAW0B,EAAA,cAAiB,IAAAe,MAAK,8BAAgC,IAAI,KAAU,CAACzC,OAAAA,EAAQ2L,QAAQ,EAAO0gD,cAAAA,IAAgB78C,QAE9H,OAAO68C,EAAgBqiE,EAAK73E,MAAM,KAAK,GAAK63E,MAI1C,gBAACvM,GAAmBtrH,MACb,EAAAulC,GAAA,GAAU+lF,EAAgBe,YAAYlrG,cAAc9N,MAAO,QACnE9S,UAAUsD,OAAO,QAASi0H,GAC/B,MAAMxL,EAAchB,EAAgBgB,YAAYnrG,cAAcQ,QAC3Dm2G,GAA8BxL,EAC/BhB,EAAgBc,WAAWjrG,cAAcrgB,kBAAiB,QAChByF,IAAlCvG,KAAK0sH,2BACZ1sH,KAAK0sH,yBAA2BpB,EAAgBc,WAAad,EAAgBhiG,YAAYnI,cAAcrgB,kBAAiB,GAG3H,MAAMk3H,EAAwB1M,EAAgBhiG,WAAWnI,cAAcQ,QAAU,yBAA2B,wBACtGtS,GAAQ,IAAAzD,MAAKosH,EAAU,CAACn3H,IAExBo3H,EAAe52H,SAAS86B,yBAO9B,IAAI+7F,EAA+BC,EACnC,GAPGJ,EAAWl3H,OAAS,EACrBo3H,EAAa3zH,WAAU,IAAAukB,MAAKkvG,GAAY,IAExCE,EAAa3zH,OAAOyzH,EAAW,IAAI,IAAAnsH,MAAK,WAAY,CAACmsH,EAAWl3H,OAAS,KAIjD,IAAvB+2H,EAAY/2H,OAAc,CAC3B,MAAM8sD,EAAaiqE,EAAY,GACzBztH,EAAOwtH,EAAgBhqE,GAI7B,GAHAuqE,EAAel4H,KAAKiJ,mBAAmBsgF,iBAAiB57B,EAAYxjD,EAAK,IAEzEguH,IAAmBD,EAAal5B,WAC7Bm5B,EAAgB,CACjB,MAAMC,EAAYp4H,KAAKiJ,mBAAmBw0F,iBAAiBy6B,IACxDE,EAAUv3H,SAAWA,GAAUu3H,EAAU/lH,MAAKtJ,IAAQoB,EAAKo1B,SAASx2B,QACrEovH,GAAiB,IAKvB,MAAM3kE,EAAmBnyD,SAAS86B,yBAElC,GAAGg8F,GAA6B,IAAXt3H,EAAc,CACjC,MAAMsJ,EAAOwtH,EAAgBC,EAAY,IACnCJ,EAAgBx3H,KAAKiJ,mBAAmBwuH,oBAAoBS,OAAc3xH,EAAW4D,GAC3FqpD,EAAiBlvD,OACf2zH,EALc,KAOdT,QAGFhkE,EAAiBlvD,QACf,IAAAsH,MAAK,+BAXS,KAadqsH,GAIJ,IAAII,EAAWr4H,KAAKwpH,WAAW,UAAW9pF,EAAGrwB,EAAOmkD,GAEpD83D,EAAgBuB,WAAW9nH,SAAQ,CAACC,EAAGmB,KACrC,MAAM8a,EAAOjc,EAAEsc,YACTg3G,EAAyB,sBAAiBr3G,GAChDq3G,EAAK9zH,KAAO,CAAC2B,EAAM,EAAIyxH,EAAY/2H,OAASi3H,GAC5CQ,EAAKzyF,YAGJ7lC,KAAK4sH,cACN5sH,KAAK4sH,aAAax3B,qBAAqBijC,EAAUr4H,KAAKwP,gBAGxDxP,KAAKmqH,WAAawN,GAGpBj4F,IAGKygE,iBAAiBp3F,GACtB,GAAG/I,KAAKm+G,eAAiBp1G,EACvB,OAGF,IAAI7C,EAAmBlG,KAAKq9B,KAAK0oB,WAAWh9C,GAC5C,MAAM22B,EAAI,KACR,IAAI64F,EACa,iBAAdryH,EAAQoD,GACTivH,GAAc,IAAA3sH,MAAK,WAEnB5L,KAAKq9B,KAAKp0B,mBAAmBugF,kBAAkBxpF,KAAKq9B,KAAKl0B,OAAQJ,GAAKhH,MAAMy2H,IACvEx4H,KAAKm+G,eAAiBp1G,IAIzB7C,EAAUsyH,EACO,iBAAdtyH,EAAQoD,EACTtJ,KAAK87G,YAAY,SAEjBp8E,SAIJ64F,EAAc,IAAI,KAAU,CAC1BpvH,OAAQjD,EAAQuH,OAChBqH,QAAQ,IACP6D,QAGL3Y,KAAKwpH,WAAW,QAAS9pF,EAAG64F,EAAaryH,GAAYA,EAA4BA,aAASK,EAAWL,GACrGlG,KAAKm+G,aAAep1G,GAEtB22B,IAGKo8E,YAAY77G,GACM,SAApBD,KAAK67G,YAAkC,SAAT57G,GAC/BD,KAAKyxH,aAGJxxH,IACDD,KAAKknH,QAAU,UACRlnH,KAAKypH,UACZzpH,KAAKqnH,gBAAkB,MAGb,UAATpnH,IACDD,KAAKm+G,kBAAe53G,EACpBvG,KAAKmqH,gBAAa5jH,GAGpBvG,KAAK8pH,UAAY9pH,KAAK43G,iBAAcrxG,EACpCvG,KAAK67G,WAAa77G,KAAK2pH,gBAAapjH,EAEjCvG,KAAKq9B,KAAKj8B,UAAUb,UAAUmT,SAAS,sBACxC/C,EAAA,eAAqC,gBACrC3Q,KAAKq9B,KAAKj8B,UAAUb,UAAUC,OAAO,oBACrCR,KAAKsS,KAIDA,IACN,MAAMhH,EAAY,sBAClB,QAActL,KAAKq9B,KAAKj8B,UAAWkK,GAAW,EAAM,KAAK,KACvDtL,KAAKq9B,KAAKj8B,UAAUb,UAAUC,OAAO8K,MAIlCumH,cAAcnxH,EAAemL,GAAQ,EAAMyB,GAAQ,GACpD5M,IAAOA,EAAQ,IAEhBmL,EAAO7L,KAAKyxH,YAAW,GAAO,EAAO/wH,GACnCV,KAAKo9G,kBAAkBt8G,iBAAiBJ,IAE7C,UAAQ,KACN4M,IAAS,EAAAmvG,GAAA,GAAgBz8G,KAAK0lG,cAC9B1lG,KAAKipH,iBACLjpH,KAAK0lG,aAAa13D,UAAYhuC,KAAK0lG,aAAa7zC,gBAI7C23D,WACLvpH,EACAw4H,EACAppH,EAAyC,GACzC+gB,EAA4C,GAC5CrwB,EACAmG,GAEA,GAAGlG,KAAKqnH,iBAA4B,UAATpnH,EACzB,OAGU,YAATA,IACDD,KAAK87G,YAAY77G,GACjBD,KAAK67G,WAAa57G,EAClBD,KAAK2pH,WAAa8O,GAGpB,MAAMC,EAAc14H,KAAKonH,cAAchmH,UACjCu3H,EAAWD,EAAY3hF,iBAAiB3B,uBACxCwjF,EAAYD,EAASp4H,UAAUmT,SAAS,SAE9C1T,KAAKonH,cAAcyE,QAAQr+F,YAAYxtB,KAAKonH,cAAcyE,QAAU,GAAqB,YAAT5rH,EAAqB,OAASA,GAAQ,qBAAsB,CAACmP,UAAU,KACvJ,MAAMipH,EAAWpzE,GAAU51C,EAAO+gB,EAAUlqB,GAsC5C,OArCG0yH,EACDD,EAASnrG,YAAY6qG,GAErBK,EAAYv0H,aAAak0H,EAAUK,EAAY3hF,kBAGrC,YAAT92C,IACDo4H,EAAS/0H,MAAMuoC,OAAS,WAGtB7rC,KAAKq9B,KAAKj8B,UAAUb,UAAUmT,SAAS,sBACzC1T,KAAKq9B,KAAKj8B,UAAUb,UAAUgB,IAAI,oBAClCvB,KAAKsS,KAQH,GAAA8nE,WACFzpE,EAAA,WAAiC,CAC/B1Q,KAAM,eACN4R,MAAO,KACL7R,KAAK0pH,yBAKEnjH,IAAVxG,GACDC,KAAK6xH,cAAc9xH,GAGrBqN,YAAW,KACTpN,KAAKiqH,kBACJ,GAEIoO,GA/rFM,GAAAlD,sBAAwB,yDEvFzC,MACM0D,GAAiB,mBAGR,MAAMC,GAenBn5H,YAAYC,GAJF,KAAAm5H,UAAW,GAanB,EAAA9xH,EAAA,GAAWjH,KAAMJ,GAEjB,MAAM,cAACo5H,EAAa,UAAE1tH,GAAatL,KACnCg5H,EAAc53H,UAAUb,UAAUgB,IAAIs3H,GAAgB,QACtDG,EAAc3pH,MAAM9O,UAAUgB,IAAIs3H,GAAiB,UACnDG,EAAc5oG,SAAS7vB,UAAUgB,IAAIs3H,GAAiB,aACtDG,EAAc1pH,QAAQ/O,UAAUgB,IAAIs3H,GAAiB,YAErD74H,KAAKszG,SAAWjyG,SAASC,cAAc,UACvCtB,KAAKszG,SAAS/yG,UAAUgB,IAAIs3H,GAAiB,SAAU,UAAUvtH,UAAmB,WAAY,eAEhGtL,KAAK6kB,QAAUxjB,SAASC,cAAc,OACtCtB,KAAK6kB,QAAQtkB,UAAUgB,IAAIs3H,GAAiB,aAC5C,EAAAx3G,GAAAA,QAAOrhB,KAAK6kB,SAEZ7kB,KAAKi5H,aAAe53H,SAASC,cAAc,OAC3CtB,KAAKi5H,aAAa14H,UAAUgB,IAAIs3H,GAAiB,kBACjD74H,KAAKi5H,aAAa30H,OAAOtE,KAAKszG,UAE9BtzG,KAAK6kB,QAAQvgB,UAAU+F,MAAMC,KAAK0uH,EAAc53H,UAAUwvB,UAAW5wB,KAAKi5H,cAE1ED,EAAc53H,UAAUkD,OAAOtE,KAAK6kB,SAEpC7kB,KAAKk5H,mBAAmBl5H,KAAKszG,UAGxB4lB,mBAAmBtzH,IACxB,QAAiBA,GAAOtF,KACtB,EAAAohB,EAAA,GAAYphB,KAEVN,KAAKwS,QAAUxS,KAAKwS,UAAY,OAAShP,QAAQ2E,SAAQ,IAAOpG,MAAKo3H,IAClEA,GACDn5H,KAAK6D,QAAO,QAGf,CAAC2L,eAAgBxP,KAAKwP,iBAGpB3L,OAAOggC,GACZ,MAAM2pE,EAAWxtG,KAAKg5H,cAAc53H,UAAUb,UAAUmT,SAAS,QACjE,QAAYnN,IAATs9B,EACDA,GAAQ2pE,OACH,GAAG3pE,IAAS2pE,EACjB,OAKF,MAAM4rB,GAAcp5H,KAAK+4H,UAAYhuG,EAAA,eAAyB8Y,EAG9D7jC,KAAKg5H,cAAc53H,UAAUb,UAAUsD,OAAO,cAAeu1H,GAC7Dp5H,KAAKg5H,cAAc53H,UAAUb,UAAUsD,OAAO,OAAQggC,GAEtD7jC,KAAKi+F,OAAO78F,UAAUb,UAAUsD,OAAO,qBAAsBu1H,GAC7Dp5H,KAAKi+F,OAAO78F,UAAUb,UAAUsD,OAAO,aAAa7D,KAAKsL,mBAAoBu4B,GAU7E7jC,KAAKi+F,OAAOo7B,cACZr5H,KAAKi+F,OAAOq7B,gBAGPppG,KAAK7gB,EAAgD+gB,EAAmDlqB,GAC7GlG,KAAKg5H,cAAc53H,UAAU4nB,QAAQ7f,OAAS,GAAKjD,EAAQiD,OAC3DnJ,KAAKg5H,cAAc53H,UAAU4nB,QAAQjgB,IAAM,GAAK7C,EAAQ6C,IACxD/I,KAAKg5H,cAAc9oG,KAAK7gB,EAAO+gB,EAAUlqB,GACzClG,KAAKi+F,OAAOq7B,iBC9FD,MAAMC,WAAkBT,GAMrCn5H,YAAsBs+F,EAA8B5gE,EAAsBp0B,GACxEpJ,MAAM,CACJo+F,OAAAA,EACA5gE,KAAAA,EACA7tB,eAAgByuF,EAAOzuF,eACvBlE,UAAW,QACX0tH,cAAe,IAAI/oG,GACjB,gBACA,CAAC5gB,EAAgD+gB,MAC/C,EAAApiB,EAAA,GAAehO,KAAKg5H,cAAc3pH,MAAOA,IACzC,EAAArB,EAAA,GAAehO,KAAKg5H,cAAc5oG,SAAUA,MAGhD5d,QAAS,KACP,WAEFumH,UAAU,IAhBQ,KAAA96B,OAAAA,EAA8B,KAAA5gE,KAAAA,EAAsB,KAAAp0B,mBAAAA,EA2FlE,KAAAuwH,qBAAwBlhH,IAC9BtY,KAAKy5H,SAASl5H,UAAUsD,OAAO,SAAUyU,EAAe,IAGlD,KAAAW,QAAU,KAChBjZ,KAAK05H,SAASn5H,UAAUC,OAAO,cAGzB,KAAAm5H,OAAS,KACf35H,KAAK6D,QAAO,IAGN,KAAA+1H,YAAc,EAAE/hH,IAAAA,EAAK3R,QAAAA,EAASoQ,MAAAA,MAKpC,IAAIjH,EAA6B+gB,EACjB,UAAbvY,EAAI5X,MAAiC,UAAb4X,EAAI5X,MAC7BoP,EAAQ,IAAI,KAAU,CAAClG,OAAQjD,EAAQuH,SAASkL,QAGhDyX,GAAW,SAAmBlqB,EAAQ2mB,MACtC7sB,KAAKy5H,SAASl5H,UAAUC,OAAO,UAE/B6O,EAAQwI,EAAIqV,YAAcrV,EAAIsV,SAC9BiD,EAAWvY,EAAI8U,iBAAkB,IAAA/gB,MAAK,sBACtC5L,KAAKy5H,SAASl5H,UAAUgB,IAAI,SAG9BvB,KAAKstB,aAAavU,SAASzC,GAE3BtW,KAAKkwB,KAAK7gB,EAAO+gB,EAAUlqB,GAE3BlG,KAAK05H,SAASn5H,UAAUsD,OAAO,aAAcyS,EAAM8C,QACnDpZ,KAAK6D,QAAO,IA3GZ7D,KAAKg5H,cAAc7oG,OAAO3vB,SAE1B,MAAMq5H,EAAS,EAAW,qBAAsB,CAACzqH,UAAU,IACrD0qH,EAAS,EAAW,sBAAuB,CAAC1qH,UAAU,IAEtD2qH,EAAc,CAACn0H,EAAmB+2B,MACtC,QAAiB/2B,GAAOtF,KACtB,EAAAohB,EAAA,GAAYphB,GACZq8B,MACC,CAACntB,eAAgBxP,KAAKi+F,OAAOzuF,kBAGlCuqH,EAAYF,GAAQ,KAClB,iBAGFE,EAAYD,GAAQ,KAClB,aAGF95H,KAAK05H,SAAW,EAAW,GAAI,CAACtqH,UAAU,IAC1CpP,KAAK05H,SAASn5H,UAAUgB,IAAI,SAAU,mBAAoB,SAC1Dw4H,EAAY/5H,KAAK05H,UAAU,KACzB,eAEF15H,KAAK6kB,QAAQ3gB,QAAQlE,KAAK6kB,QAAQgF,kBAAmBgwG,EAAQ75H,KAAK05H,SAAUI,GAE5E95H,KAAK+lB,eAAiB,IAAI1B,GAAerkB,KAAKwP,gBAAgB,GAC9D,MAAMwqH,EAA8B34H,SAASC,cAAc,OAC3D04H,EAA4Bz5H,UAAUgB,IAAI,2BAC1Cy4H,EAA4B11H,OAAOtE,KAAK+lB,eAAe3kB,WACvD,MAAM64H,EAAS54H,SAASC,cAAc,OACtC24H,EAAO15H,UAAUgB,IAAI,8BACrBvB,KAAK+lB,eAAerB,IAAInkB,UAAUgB,IAAI,sBAAuB,UAC7DvB,KAAK+lB,eAAerB,IAAIxgB,QAAQ+1H,GAChCj6H,KAAK+lB,eAAerB,IAAIpgB,OAAO01H,GAE/B,MAAMP,EAAWz5H,KAAKy5H,SAAW,EAAW,cAAe,CAACrqH,UAAU,IACtE2qH,EAAYN,GAAU,KACpB,gBAA0CA,EAASl5H,UAAUmT,SAAS,UAAY,EAAI,QAGxF1T,KAAKi5H,aAAa/0H,QAAQlE,KAAK+lB,eAAerB,IAAK+0G,GAEnD,MAAMS,EAAkB74H,SAASC,cAAc,OAC/C44H,EAAgB35H,UAAUgB,IAAI,iCAE9BvB,KAAKstB,aAAe,IAAIpK,QAAkB3c,OAAWA,GAAW,GAAM,GACtEvG,KAAKstB,aAAalsB,UAAUb,UAAUgB,IAAI,yBAC1C24H,EAAgB51H,OAAOtE,KAAKstB,aAAalsB,WACzCpB,KAAK6kB,QAAQ1gB,aAAa+1H,EAAiBl6H,KAAKi5H,cAEhDj5H,KAAKi+F,OAAOzuF,eAAejO,IAAIsJ,EAAA,QAA/B7K,CAA0C,aAAcA,KAAK45H,aAC7D55H,KAAKi+F,OAAOzuF,eAAejO,IAAIsJ,EAAA,QAA/B7K,CAA0C,cAAeA,KAAKiZ,SAC9DjZ,KAAKi+F,OAAOzuF,eAAejO,IAAIsJ,EAAA,QAA/B7K,CAA0C,aAAcA,KAAK25H,QAC7D35H,KAAKi+F,OAAOzuF,eAAejO,IAAIsJ,EAAA,QAA/B7K,CAA0C,yBAAyB,EAAEsY,aAAAA,MACnEtY,KAAKw5H,qBAAqBlhH,MAG5B,MAAM6hH,EAAiB,uBACpBA,IACDn6H,KAAK45H,YAAYO,GACjBn6H,KAAKw5H,qBAAqB,kBAIvBlzB,UACFtmG,KAAKstB,cACNttB,KAAKstB,aAAavM,mBCnHxB,IAAKq5G,IAAL,SAAKA,GACH,kBACA,kBACA,sBACA,mBACA,mBALF,CAAKA,KAAAA,GAAW,KAQhB,MAEMhtF,GAAa,wBAEJ,MAAMitF,GAArB,cAYU,KAAAC,SAAW,CAACr8G,EAAWE,EAAWvc,EAAeC,EAAgBg4C,IAChE,IAAI57B,KAAKE,EAAI07B,KAAUA,KAAUA,WAAgBj4C,OAAWC,EAAS,EAAIg4C,KAAUA,KAAUA,YAAiBj4C,OAG/G,KAAA24H,YAAc,CAAC1pH,EAAY2pH,EAAmBh0H,KAGpD,IAAIo7B,EAAI,GAKJ,GAAa,IAAVp7B,EACLo7B,EAAI5hC,KAAKs6H,SAAS,EAAG,EA5Bb,EA4BuBE,EARlB,GAQuCx6H,KAAKs6H,SAAS,EAAGE,EAAYC,EA5BzE,EA4ByFD,EARpF,QAUb,IAAI,IAAIj1H,EAAI,EAAGA,EAAIiB,IAASjB,EAC1Bq8B,GAAK5hC,KAAKs6H,SAAS,GAAIE,EAhCnB,GAgCsCj1H,EA/BpC,EA+B8Ci1H,EAXzC,GAyBf,OAVIx6H,KAAK06H,WACP16H,KAAK06H,SAAWr5H,SAAS6pB,gBAAgB,6BAA8B,YACvElrB,KAAK26H,KAAOt5H,SAAS6pB,gBAAgB,6BAA8B,QAEnElrB,KAAK06H,SAASp2H,OAAOtE,KAAK26H,OAG5B36H,KAAK06H,SAAS7pH,GAAKA,EACnB7Q,KAAK26H,KAAKxyG,eAAe,KAAM,IAAKyZ,GAE7B5hC,KAAK06H,UAGN,KAAAE,aAAe,CAACp0H,EAAeW,KACrC,IAAIqzH,EAaJ,OAZGh0H,GAAS,EACVg0H,EAAYJ,GAAYS,IACN,IAAVr0H,EACRg0H,EAAYJ,GAAYU,IACN,IAAVt0H,EACRg0H,EAAYJ,GAAYW,MACN,IAAVv0H,EACRg0H,EAAYJ,GAAYY,KAChBx0H,EAAQ,IAChBg0H,EAAYJ,GAAYa,MAGnBT,GAGD,KAAAU,cAAgB,CAAC10H,EAAeW,KACtC,IAAIg0H,EAaJ,OAZG30H,GAAS,EACV20H,EAAaf,GAAYS,IACP,IAAVr0H,EACR20H,EAAaf,GAAYU,IACP,IAAVt0H,EACR20H,EAAaf,GAAYW,MACP,IAAVv0H,EACR20H,EAAaf,GAAYY,KACjBx0H,EAAQ,IAChB20H,EAAaf,GAAYa,MAGpBE,GAGD,KAAAC,kBAAoB,CAACj0H,EAAeqzH,EAAmBh0H,IAChD,IAAVA,EACM,EACW,IAAVA,EACAW,EAAYqzH,EAvFd,EAuFU,EAGL,IAAVh0H,EACGW,EAEgB,IAAVA,EACDqzH,EA9FH,EAiGa,EAAZA,EAAgBC,EAAU,EALxB,GAODD,EAnGF,GAmGqBrzH,EAIvB,KAAAk0H,mBAAqB,CAACl0H,EAAeX,EAAeg0H,EAAmBc,IAC1E90H,GAAS,GAITW,GAAS,EAHH,EAKCA,GAAUX,EAAQ,EACnB80H,EAAclB,GAAYS,IAAML,GAIjCrzH,EAAQ,GAAKqzH,EAnHb,EAmHyBrzH,EAI3B,KAAAo0H,eAAiB,CAAC/0H,EAAeg0H,IAChCh0H,GAAS,EAAI4zH,GAAYS,IAAML,EAAYh0H,EAxH1C,GAwHyDA,EAAQ,GAGpE+iB,OAAO/iB,EAAeW,GAS3B,GARInH,KAAKmwB,SACPnwB,KAAKmwB,OAAS9uB,SAASC,cAAc,OACrCtB,KAAKmwB,OAAO5vB,UAAUgB,IAAI6rC,IAE1BptC,KAAK6kB,QAAUxjB,SAASC,cAAc,OACtCtB,KAAKmwB,OAAO7rB,OAAOtE,KAAK6kB,UAGb,IAAVre,EAOD,OANGxG,KAAKwG,QAAUA,IAChBxG,KAAK6kB,QAAQvZ,UAAY8hC,GAAa,aACtCptC,KAAKmwB,OAAO5vB,UAAUC,OAAO4sC,GAAa,SAC1CptC,KAAK6kB,QAAQ/e,UAAY9F,KAAK6kB,QAAQvhB,MAAMsW,QAAU,IAGjD5Z,KAAKmwB,OAGd,MAAMqqG,EAAYx6H,KAAK46H,aAAap0H,EAAOW,GACrCg0H,EAAan7H,KAAKk7H,cAAc10H,EAAOW,GACvCm0H,EAAct7H,KAAKu7H,eAAe/0H,EAAOg0H,GAEzCgB,EAAa,YAAYh1H,IACzBk0H,EAAW16H,KAAKu6H,YAAYiB,EAAYhB,EAAWh0H,GAEnDi1H,EAAiBz7H,KAAKo7H,kBAAkBj0H,EAAOqzH,EAAWh0H,GAC1Dk1H,EAAkB17H,KAAKq7H,mBAAmBl0H,EAAOX,EAAOg0H,EAAWc,GAwCzE,OAtCAt7H,KAAKmwB,OAAO5vB,UAAUsD,OAAOupC,GAAa,QAAS5mC,EAAQ,GAExDW,GAAS,GACVnH,KAAKmwB,OAAO5vB,UAAUgB,IAAI,eAC1BvB,KAAKmwB,OAAO5vB,UAAUC,OAAO,aACrB2G,GAAUX,EAAQ,GAC1BxG,KAAKmwB,OAAO5vB,UAAUgB,IAAI,YAC1BvB,KAAKmwB,OAAO5vB,UAAUC,OAAO,gBAE7BR,KAAKmwB,OAAO5vB,UAAUgB,IAAI,WAAY,eAGxCvB,KAAK6kB,QAAQvZ,UAAY8hC,GAAa,WACtCptC,KAAK6kB,QAAQvhB,MAAMsW,QAAU,mBAAmB4hH,2BAAoCF,+BAAyCI,QAEzH17H,KAAK2qB,MACP3qB,KAAK2qB,IAAMtpB,SAAS6pB,gBAAgB,6BAA8B,OAClElrB,KAAK2qB,IAAIxC,eAAe,KAAM,SAAU,KACxCnoB,KAAK2qB,IAAIxC,eAAe,KAAM,QAAS,KAEvCnoB,KAAK27H,KAAOt6H,SAAS6pB,gBAAgB,6BAA8B,QACnElrB,KAAK27H,KAAKr3H,OAAOo2H,GAEjB16H,KAAK2qB,IAAIrmB,OAAOtE,KAAK27H,MAErB37H,KAAK47H,KAAOv6H,SAASC,cAAc,OACnCtB,KAAK47H,KAAKr7H,UAAUgB,IAAI6rC,GAAa,UAGnCptC,KAAK2qB,IAAI1mB,eACXjE,KAAK6kB,QAAQvgB,OAAOtE,KAAK2qB,IAAK3qB,KAAK47H,MAGrC57H,KAAK47H,KAAKt4H,MAAMsW,QAAU,WAAWuhH,8BAAuCM,QAE5Ez7H,KAAKwG,MAAQA,EACbxG,KAAKmH,MAAQA,EAENnH,KAAKmwB,Q,2SChLhB,MAAM0rG,GAOJl8H,cAHA,KAAA44B,KAAgF,GAI9Ev4B,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUkK,UAAYuwH,GAAczuF,WAGpC0uF,OAAO30H,EAAe40H,GAAe,GAC1C,GAAG/7H,KAAKu4B,KAAKpxB,GAAQ,OAAOnH,KAAKu4B,KAAKpxB,GAAOwR,QAC7C,MAAMqd,EAAM30B,SAASC,cAAc,OAC7B05D,GAAWtgD,OAAOgzC,KAAK1tD,KAAKu4B,MAAM13B,SAAWk7H,EAInD,OAHA/lG,EAAI1qB,UAAYuwH,GAAczuF,WAAa,QAAU4tB,EAAU,GAAK,mBACpEh7D,KAAKu4B,KAAKpxB,GAAS,CAACwR,QAASqd,EAAKthB,KAAK,GACvC1U,KAAKoB,UAAUkD,OAAO0xB,GACfA,EAGFgmG,SAAS70H,GACVnH,KAAKu4B,KAAKpxB,KACdnH,KAAKu4B,KAAKpxB,GAAOwR,QAAQnY,gBAClBR,KAAKu4B,KAAKpxB,IAGZ80H,UAAUC,GACZl8H,KAAKuO,cAAcA,aAAavO,KAAKuO,cACxCvO,KAAKuO,aAAepB,OAAOC,YAAW,KACpC,IAAI,MAAM7H,KAAKvF,KAAKu4B,MACdhzB,IAAM22H,GACVl8H,KAAKg8H,UAAUz2H,KAEhBs2H,GAAcM,UAGZC,UAAUj1H,EAAek1H,GAAS,GACvC,MAAMrmG,EAAMh2B,KAAKu4B,KAAKpxB,GACnB6uB,EAAIthB,MACF2nH,GACDrmG,EAAIrd,QAAQpY,UAAUC,OAAO,QACxBw1B,EAAIrd,QAAQ+1B,YAEjB1Y,EAAIrd,QAAQpY,UAAUC,OAAO,YAAa,eAGrCw1B,EAAIthB,KAGb1U,KAAKi8H,UAAU90H,GAGV2J,QAAQ3J,EAAem1H,EAAuBC,EAAUp1H,EAAQm1H,EAAeE,GAAiB,GACrG,GAAGr1H,IAAUm1H,EACX,OAAOt8H,KAAKo8H,UAAUj1H,GAGxB,MAAM6uB,EAAMh2B,KAAKu4B,KAAKpxB,GAChBs1H,EAAcz8H,KAAKu4B,KAAK+jG,GAC9B,IAAIG,IAAgBD,EAClB,OAAOx8H,KAAKo8H,UAAUj1H,GAGxB,MAAM+rB,EAAQ,CAAC,WAAY,eACvBqpG,GAASrpG,EAAMtsB,UAEnBovB,EAAIrd,QAAQpY,UAAUgB,IAAI2xB,EAAM,IAChC8C,EAAIrd,QAAQpY,UAAUC,OAAO0yB,EAAM,IAChCupG,IACDA,EAAY9jH,QAAQpY,UAAUgB,IAAI2xB,EAAM,IACxCupG,EAAY9jH,QAAQpY,UAAUC,OAAO0yB,EAAM,KAG1C8C,EAAIthB,KACL1U,KAAKo8H,UAAUj1H,GAAO,GAGxB6uB,EAAIrd,QAAQpY,UAAUsD,OAAO,aAAa,GAC1C44H,GAAeA,EAAY9jH,QAAQpY,UAAUsD,OAAO,aAAa,GAajE7D,KAAKi8H,UAAU90H,IA5FV,GAAAg1H,SAAW,IACX,GAAA/uF,WAAa,iBA+FtB,MAAMsvF,GAYJ/8H,YAAoBiH,GAAU,GAAV,KAAAA,QAAAA,EARpB,KAAAsZ,SAIM,GACN,KAAAy8G,eAAiB,EAIf38H,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUkK,UAAYoxH,GAAgBtvF,WAG7CwvF,WAAWz1H,GACT,GAAGnH,KAAKkgB,SAAS/Y,GAAQ,OAAOnH,KAAKkgB,SAAS/Y,GAC9C,MAAMS,EAAOvG,SAASC,cAAc,OACpCsG,EAAK0D,UAAYoxH,GAAgBtvF,WAAa,WAE9C,MAAMj/B,EAAc9M,SAASC,cAAc,OAC3C6M,EAAY7C,UAAYoxH,GAAgBtvF,WAAa,uBAErD,MAAMyvF,EAAgB,IAAIhB,GAO1B,OANAgB,EAAcz7H,UAAUkK,UAAYoxH,GAAgBtvF,WAAa,mBAEjExlC,EAAKtD,OAAO6J,EAAa0uH,EAAcz7H,WAEvCpB,KAAKoB,UAAUkD,OAAOsD,GAEf5H,KAAKkgB,SAAS/Y,GAAS,CAAC/F,UAAWwG,EAAMuG,YAAAA,EAAa0uH,cAAAA,GAG/DhxH,MAAMq2E,GACDliF,KAAKuO,cAAcA,aAAavO,KAAKuO,cAExC,MAAM2R,GAAY,GAAKgiE,GAAQrhF,OAC5Bqf,GAAYlgB,KAAKkgB,SAASrf,SAI7Bb,KAAKuO,aAAepB,OAAOC,YAAW,KAClBpN,KAAKkgB,SAAS5Z,OAAO4Z,EAAUlgB,KAAKkgB,SAASrf,OAASqf,GAC9Dnb,SAAS+3H,IACjBA,EAAQ17H,UAAUZ,cAEnBq7H,GAAcM,WAYnBY,SAAS76C,GACP,MAAMhiE,GAAY,GAAKgiE,GAAQrhF,OACbb,KAAKkgB,SAAStf,MAAMsf,GAC5Bnb,SAAS+3H,IACjB,MAAME,GAAyBF,EAAQ3uH,YAAY6f,WAAa,EACpD8uG,EAAQD,cAAcf,OAAOY,GAAgBO,aAAa,GACtEH,EAAQD,cAAc/rH,QAAQ4rH,GAAgBO,YAAaD,EAAuBh9H,KAAK4G,QAAUs7E,EAASliF,KAAK28H,eAAiBz6C,EAASliF,KAAK28H,gBAAgB,MAGhK38H,KAAK6L,MAAMq2E,GAGbg7C,SAASh7C,GAGP,MAAMi7C,EAAoB9yH,MAAMC,KAAK,GAAKtK,KAAK28H,gBAAgBjyH,KAAI40G,IAAMA,IACvDj1G,MAAMC,KAAK,GAAK43E,GAAQx3E,KAAI40G,IAAMA,IAC1Cv6G,SAAQ,CAACq4H,EAAej3H,K,MAChC,MAAM22H,EAAU98H,KAAK48H,WAAWz2H,GAE1B6vB,EAAM8mG,EAAQD,cAAcf,OAAOsB,GAAe,GAClDJ,EAA8C,QAAtB,EAAAG,EAAkBh3H,UAAI,QAAIu2H,GAAgBO,YACxEjnG,EAAIhI,UAAY8uG,EAAQ3uH,YAAY6f,UAAY,GAAKovG,EAErDN,EAAQD,cAAc/rH,QAAQssH,EAAeJ,EAAuBh9H,KAAK4G,QAAUs7E,EAASliF,KAAK28H,eAAiBz6C,EAASliF,KAAK28H,gBAAgB,MAGlJ38H,KAAK+8H,SAAS76C,GAEdliF,KAAK28H,eAAiBz6C,GAxFjB,GAAA+6C,aAAe,EACf,GAAA7vF,WAAa,mBA2FP,MAAMiwF,GA0CnB19H,YAAoBs+F,EAA4B5gE,EAAoBp0B,EAAgDmT,GAAhG,KAAA6hF,OAAAA,EAA4B,KAAA5gE,KAAAA,EAAoB,KAAAp0B,mBAAAA,EAAgD,KAAAmT,gBAAAA,EAnC7G,KAAAkhH,aAAe,EACf,KAAAC,UAAY,EACZ,KAAAC,aAAe,EACf,KAAAC,eAAiB,EACjB,KAAAC,oBAAsB,EAEtB,KAAAC,QAAS,EACT,KAAAC,qBAAsB,EAEtB,KAAAp3H,MAAQ,EACR,KAAA2D,KAAiB,GACjB,KAAA20B,YAAc,EAEd,KAAAP,SAAU,EACV,KAAAs/F,cAAe,EACf,KAAAC,WAAY,EAOZ,KAAAC,yBAA2C,KAE3C,KAAAhe,QAAS,EAET,KAAAie,uBAAuC,KAKtC,KAAAC,UAAW,EAEX,KAAAC,OAAQ,EAGdl+H,KAAKwP,eAAiB,IAAI,IAE1B,MAAM2uH,EAAM,IAAI7sG,GAAe,kBAC/BtxB,KAAKswH,uBAAyB,IAAIwI,GAAgB,CAChD76B,OAAAA,EACA5gE,KAAAA,EACA7tB,eAAgBxP,KAAKwP,eACrBlE,UAAW,UACX0tH,cAAemF,EACf3rH,QAAS,IAAW,mCAOlB,OANG4J,EAAgB27F,cAAc/3G,KAAKi+F,OAAO90F,QAC3C,IAAI8oG,GAAgBjyG,KAAKi+F,OAAO90F,OAAQnJ,KAAKu9H,WAAW,GAExD,IAAItrB,GAAgBjyG,KAAKi+F,OAAO90F,OAAQ,GAAG,IAGtC,OAIXnJ,KAAKo+H,oBAAsB,IAAI/D,GAC/B8D,EAAIhuG,OAAO3C,YAAYxtB,KAAKo+H,oBAAoB70G,OAAO,EAAG,IAE1DvpB,KAAKq+H,iBAAmB,IAAIxC,GAC5BsC,EAAI/tG,SAAS9rB,OAAOtE,KAAKq+H,iBAAiBj9H,WAE1CpB,KAAKs+H,cAAgB,IAAIzC,GACzB77H,KAAKs+H,cAAcl9H,UAAUb,UAAUgB,IAAI,kCAC3C48H,EAAI7uH,QAAQpL,QAAQlE,KAAKs+H,cAAcl9H,WAEvCpB,KAAKu+H,gBAAkB,IAAI7B,IAAgB,GAC3CyB,EAAI9uH,MAAM/K,QAAO,IAAAsH,MAAK,iBAAkB,IAAK5L,KAAKu+H,gBAAgBn9H,WAElE,MAAMkyG,EAAWtzG,KAAKswH,uBAAuBhd,SAASlvG,WAAU,GAChEpE,KAAKswH,uBAAuB4I,mBAAmB5lB,GAC/C6qB,EAAI/8H,UAAU8C,QAAQovG,GAEtBtzG,KAAKw+H,QAAU,EAAW,wDAAyD,CAACpvH,UAAU,IAE9FpP,KAAKswH,uBAAuB2I,aAAa/0H,QAAQlE,KAAKw+H,UAEtD,QAAiBx+H,KAAKw+H,SAAUl+H,KAC9B,EAAAohB,EAAA,GAAYphB,GACZN,KAAKi+F,OAAOwgC,YAAW,KACtB,CAACjvH,eAAgBxP,KAAKwP,iBAEzBxP,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,wBAAwB,EAAEmJ,OAAAA,MACxDA,IAAWnJ,KAAKi+F,OAAO90F,SAGnBnJ,KAAK+/G,QACN//G,KAAKswH,uBAAuBzsH,OAAO7D,KAAK+/G,QAAS,GAGnD//G,KAAK89H,UAAY99H,KAAK69H,cAAe,EACrC79H,KAAKw9H,aAAe,EACpBx9H,KAAKu9H,UAAY,EACjBv9H,KAAKwG,MAAQ,EACbxG,KAAKmK,KAAO,GACZnK,KAAK8+B,YAAc,EACnB9+B,KAAKs9H,aAAe,EACpBt9H,KAAKm+F,gBAAgB,OAK3Bn+F,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,sBAAsB,EAAEmJ,OAAAA,MACtDA,IAAWnJ,KAAKi+F,OAAO90F,QACxBnJ,KAAKswH,uBAAuBzsH,OAAO7D,KAAK+/G,QAAS,MAMrD//G,KAAK0+H,iBAAmBzkG,IAAS,IAAMj6B,KAAK2+H,qBAAqB,KAAK,GAAM,GAE5E3+H,KAAKi+H,SAA8B,eAAnBj+H,KAAKq9B,KAAKp9B,KAGrBqmG,UACLtmG,KAAKswH,uBAAuB0I,cAAc53H,UAAUZ,SACpDR,KAAKswH,uBAAuBzsH,QAAO,GACnC7D,KAAKwP,eAAeS,YACpBjQ,KAAK4+H,yBAAwB,GAGxBzgC,gBAAgBJ,GACrB,GAAG/9F,KAAKi+H,SAAU,OAGlB,GAAGj+H,KAAK29H,QAAU39H,KAAK+/G,OACrB,OAGF,IAAI//G,KAAK69H,cAAgB79H,KAAK89H,aAAe99H,KAAKwG,MAChD,OAIF,IAAIiL,EAAKzR,KAAKq9B,KAAKzD,QAAQmqE,iBAAiB,UAE5C,IAAItyF,EAAI,OAIR,MAAM1I,EAAM0I,EAAGuX,QAAQjgB,IACpB0I,QAAclL,IAARwC,GAEP/I,KAAK6+H,SAAS91H,EAAKg1F,GAIhB8gC,QAAQ91H,EAAag1F,GAC1B,GAAG/9F,KAAKi+H,SAAU,OAGlB,GAAGj+H,KAAK+/G,OAAQ,OAIhB,IAAImc,EAAuBl8H,KAAKmK,KAAK2O,WAAUsnE,GAAQA,GAAQr3E,IAC/D,IAAqB,IAAlBmzH,GAAwBl8H,KAAK8+H,aAAa5C,GAEtC,MAAGl8H,KAAK89H,WAAa/0H,EAAM/I,KAAKmK,KAAKnK,KAAKmK,KAAKtJ,OAAS,IAQ7D,YAJIb,KAAKg+H,yBACPh+H,KAAKg+H,uBAAyBh+H,KAAK++H,gBAAgBh2H,OAA6BxC,IAAxBw3F,KAH1Dm+B,EAAel8H,KAAKmK,KAAKtJ,OAAS,EAAIb,KAAK8+B,iBAH3Co9F,GAAgBl8H,KAAK8+B,YAqBvB,GADgB9+B,KAAKw9H,cAAgBtB,EACzB,CACV,GAAGl8H,KAAK49H,0BAA+Cr3H,IAAxBw3F,IACL,IAArB/9F,KAAKw9H,aAAqBx9H,KAAKw9H,YAActB,GAC9C,OAIJl8H,KAAKw9H,YAActB,EACnBl8H,KAAKu9H,UAAYv9H,KAAKmK,KAAKkI,MAAK+tE,GAAQA,GAAQr3E,KAAQ/I,KAAKmK,KAAKnK,KAAKmK,KAAKtJ,OAAS,GACrFb,KAAK0+H,oBAIDI,aAAa5C,GACnB,OAAQl8H,KAAKwG,MAAQ62H,GAAkBznE,cAEjC51D,KAAK69H,cAAgB3B,GAAgBmB,GAAkB2B,cACvDh/H,KAAK89H,WAAc99H,KAAKwG,MAAQ,EAAI01H,GAAiBmB,GAAkB2B,aAKjED,gBAAgBh2H,EAAak2H,GAAe,G,0CACxD,IAAGj/H,KAAKu+B,QAAR,CACAv+B,KAAKu+B,SAAU,EAEf,IACE,IAAI2gG,GAAU,EACd,MAAMp8F,EAAW,CACf9iC,KAAKiJ,mBAAmBqlG,UAAU,CAChCnlG,OAAQnJ,KAAKi+F,OAAO90F,OACpBE,YAAa,CAACC,EAAG,6BACjBR,MAAOC,EACPK,MAAOi0H,GAAkBznE,WACzB/sD,UAAWw0H,GAAkBznE,aAE9B7zD,MAAKuhB,IACJ47G,GAAU,EACH57G,MAIX,IAAItjB,KAAKs9H,aAAc,CACrB,MAAMj1H,EAAUrI,KAAKiJ,mBAAmBk2H,iBAAiBn/H,KAAKi+F,OAAO90F,QAAQpH,MAAKu6B,IAC5EA,EAAExzB,QACN9I,KAAKs9H,aAAehhG,EAAExzB,OAElBo2H,GAAWD,IACbj/H,KAAKmK,KAAO,CAACnK,KAAKs9H,cAClBt9H,KAAKwG,MAAQ81B,EAAE91B,MACfxG,KAAKw9H,YAAc,EACnBx9H,KAAKu9H,UAAYv9H,KAAKmK,KAAK,GAC3BnK,KAAK0+H,wBAKT57F,EAASh7B,KAAKO,GAGhB,MAAME,SAAgB/E,QAAQC,IAAIq/B,IAAW,GAE7C,IAAIs8F,EAAc72H,EAAOtC,QAAQ6S,WAAU5S,GAAWA,EAAQ6C,KAAOA,KACjD,IAAjBq2H,IACDA,EAAc72H,EAAOtC,QAAQpF,QAK/Bb,KAAK8+B,YAAcv2B,EAAO82H,iBAAmB92H,EAAO82H,iBAAmBD,EAAc,EACrFp/H,KAAKmK,KAAO5B,EAAOtC,QAAQyE,KAAIxE,GAAWA,EAAQ6C,MAAKnI,QACvDZ,KAAKwG,MAAQ+B,EAAO/B,MAEhBxG,KAAKwG,OACPxG,KAAKswH,uBAAuBzsH,QAAO,GAGrC7D,KAAK89H,UAAa99H,KAAK8+B,YAAc9+B,KAAKmK,KAAKtJ,SAAYb,KAAKwG,MAChExG,KAAK69H,cAAgB79H,KAAK8+B,YAE1B9+B,KAAKk+H,OAASl+H,KAAKq9B,KAAK3V,IAAI,gCAAiC3e,EAAKR,EAAQ62H,EAAap/H,KAAK8+B,YAAa9+B,KAAK89H,UAAW99H,KAAK69H,cAC9H,MAAMhwH,GACN7N,KAAKq9B,KAAK3V,IAAI3Z,MAAM,8BAA+BF,GAGrD7N,KAAKu+B,SAAU,EAEZv+B,KAAK29H,OACN39H,KAAK6+H,QAAQ91H,GACLk2H,GACRj/H,KAAKm+F,gBAAgB,GAGvBn+F,KAAKg+H,uBAAyB,SAIzBsB,wBACLt/H,KAAK49H,qBAAsB,EAEvB59H,KAAK+9H,2BACP/9H,KAAK+9H,yBAA2B,IAAI,IC5e3B,SAA+Bn4H,EAAmB+7C,EAAwBhlB,EAAsBntB,GAC7G,GAAG,GAAAoN,mBAAoB,CACrB,IAAI2iH,EACJ,MAAM3/H,EAAU,CAACof,SAAS,GAC1BxP,EAAejO,IAAIqE,EAAnB4J,CAAyB,cAAelP,IACnCA,EAAEoe,QAAQ7d,OAAS,EACpBie,KAIFygH,EAAQj/H,EAAEoe,QAAQ,GAAGE,QAErBpP,EAAejO,IAAIqE,EAAnB4J,CAAyB,YAAagP,EAAa5e,GACnD4P,EAAejO,IAAIqE,EAAnB4J,CAAyB,WAAYsP,EAAYlf,MAChDA,GAEH,MAAM4e,EAAele,IACnB,MAAMse,EAAUte,EAAEoe,QAAQ,GAAGE,QAEvB4gH,EAAS5gH,EAAU2gH,GACDC,GAAQ7iG,IAEhC4iG,EAAQ3gH,GAIJE,EAAa,KACjBtP,EAAe47C,aAAaxlD,EAAM,YAAa4Y,EAAa5e,GAC5D4P,EAAe47C,aAAaxlD,EAAM,WAAYkZ,EAAYlf,SAG5D4P,EAAejO,IAAIqE,EAAnB4J,CAAyB,SAAUlP,IACjC,MAAMk/H,EAASl/H,EAAEyiE,OAAS,GAEFy8D,GAAQ7iG,MAE/B,CAAC3d,SAAS,IDycXygH,CAAsBz/H,KAAKq9B,KAAKzD,QAAQhtB,WAAWxL,UAAW,GAAU,KACtEpB,KAAK4+H,4BACJ5+H,KAAK+9H,2BAILa,wBAAwBc,GAAkB,GAC/C1/H,KAAK49H,qBAAsB,EAExB59H,KAAK+9H,2BACN/9H,KAAK+9H,yBAAyB9tH,YAC9BjQ,KAAK+9H,yBAA2B,MAG/B2B,GACD1/H,KAAKm+F,gBAAgB,GAIZwhC,+B,0CACX3/H,KAAK29H,QAAS,EAEd39H,KAAKk+H,OAASl+H,KAAKq9B,KAAK3V,IAAI,sCAC5B,IACE1nB,KAAKs/H,wBAEL,MAAMthC,EAAiBh+F,KAAKq9B,KAAK2gE,eAC9BA,aAA0Bx6F,gBACrBw6F,SAIF,WAEHh+F,KAAKg+H,+BACAh+H,KAAKg+H,wBAGbh+H,KAAKk+H,OAASl+H,KAAKq9B,KAAK3V,IAAI,8CAC5B1nB,KAAK29H,QAAS,EAOd,MAAM9vH,GACN7N,KAAKq9B,KAAK3V,IAAI3Z,MAAM,4CAA6CF,GAEjE7N,KAAK29H,QAAS,EACd39H,KAAK49H,qBAAsB,EAC3B59H,KAAKm+F,gBAAgB,OAIZyhC,oBAAoB72H,G,0CAC/B,MAAM7C,EAAUlG,KAAKq9B,KAAK0oB,WAAWh9C,GAClC7C,IAAYA,EAAQ+5B,UACrBjgC,KAAKq9B,KAAKihE,aAAav1F,IACtB/I,KAAKq9B,KAAK2gE,gBAAkBx6F,QAAQ2E,WAAWpG,MAAK,KACnD/B,KAAK2/H,+BACL3/H,KAAK6+H,QAAQ7+H,KAAKw9H,aAAgBx9H,KAAKwG,MAAQ,EAAKxG,KAAKs9H,aAAev0H,EAAM,UAKvE41H,oB,0CAQT,MAAMn4H,EAAQxG,KAAKwG,MACnB,GAAGA,EAAO,CACR,MAAMg3H,EAAcx9H,KAAKw9H,YACnBt3H,EAAUlG,KAAKq9B,KAAK0oB,WAAW/lD,KAAKu9H,WAKlCsC,EAAyB,IAAhBrC,EACfx9H,KAAKu+H,gBAAgBn9H,UAAUb,UAAUsD,OAAO,UAAWg8H,GAEvDA,GACF7/H,KAAKu+H,gBAAgBrB,SAAS12H,EAAQg3H,GAK1Cx9H,KAAKswH,uBAAuBzsH,QAAO,GAEnC,MAAM04H,EAAUiB,EAAcx9H,KAAKy9H,eAEnCz9H,KAAKk+H,OAASl+H,KAAKq9B,KAAK3V,IAAI,kCAAmC60G,EAASiB,EAAax9H,KAAKy9H,gBAE1F,MAAMqC,EAAU9/H,KAAKq+H,iBAAiBvC,OAAO0B,GACvCuC,EAAe//H,KAAKs+H,cAAcxC,OAAO0B,GAC/CuC,EAAax/H,UAAUgB,IAAI,wBAE3B,MAAMgtB,EAA+B,GAC/BgD,EAAajB,GAAuB,CACxCjhB,WAAO9I,EACPwmB,QAAS,KACTqD,SAAUlqB,EAAQA,QAClBqqB,WAAYuvG,EACZ55H,QAAAA,EACAsqB,QAASuvG,EACTxxG,aAAAA,UAGI/qB,QAAQC,IAAI8qB,GAElBvuB,KAAKswH,uBAAuB0I,cAAc53H,UAAUb,UAAUsD,OAAO,WAAY0tB,GAG/EvxB,KAAKq+H,iBAAiBvtH,QAAQ0sH,EAAax9H,KAAKy9H,gBAC7ClsG,GACDvxB,KAAKs+H,cAAcxtH,QAAQ0sH,EAAax9H,KAAK09H,qBAC7C19H,KAAK09H,oBAAsBF,GAE3Bx9H,KAAKs+H,cAAcrC,YAIvBj8H,KAAKo+H,oBAAoB70G,OAAO/iB,EAAOA,EAAQg3H,EAAc,GAC7Dx9H,KAAKy9H,eAAiBD,EACtBx9H,KAAKswH,uBAAuB0I,cAAc53H,UAAU4nB,QAAQjgB,IAAM,GAAK7C,EAAQ6C,SAE/E/I,KAAKswH,uBAAuBzsH,QAAO,GACnC7D,KAAKy9H,eAAiB,EAGxBz9H,KAAKswH,uBAAuB0I,cAAc53H,UAAUb,UAAUsD,OAAO,UAAW7D,KAAKwG,MAAQ,OAranF,GAAAovD,WAAa,GACb,GAAAopE,YAAc,EEtN9B,MAEA,GAFgC,G,eCajB,MAAMgB,WAAkBpkG,GACrCj8B,YAAYwJ,GACVtJ,MAAM,aAAc,CAClBsJ,OAAAA,EACA6uB,aAAc,gBACdpW,QAAS,CAAC,CACR6X,QAAS,wBACTkD,SAAU,KACR1zB,EAAA,WAA4BE,GAAkB,IAAVixC,EAAc,OAAa,EAAA6lF,GAAA,IAAM,GAAQ7lF,MAGjFvgC,MAAM,IAGR,MAsBM0e,EArBgD,CAAC,CACrD6hB,KAFe,KAGf3gB,QAAS,uBACR,CACD2gB,KAAM8lF,MACNzmG,QAAS,wBACR,CACD2gB,KAAM8lF,MACNzmG,QAAS,wBACR,CACD2gB,KAAM8lF,MACNzmG,QAAS,sBACR,CACD2gB,KAAM8lF,OACNzmG,QAAS,uBACR,CACD2gB,MAAO,EACP3gB,QAAS,0BAIQ/uB,KAAK0vC,GACV,IAAI7iB,GAAI,CAClBE,WAAY,IAAIyB,GAAW,CACzBO,QAAS2gB,EAAK3gB,QACd31B,KALO,YAMPpD,MAAO,GAAK05C,EAAKA,WAOvB,IAAIA,EACJ,MAAM+lF,EAAY7nG,GAAkBC,GAAO73B,IACzC05C,GAAQ15C,KAGV63B,EAAKA,EAAK13B,OAAS,GAAG42B,WAAW9V,SAAU,EAE3C,MAAM1O,EAAU,IAAIC,GAAe,CAACwtB,UAAU,EAAM5C,aAAa,IACjE7qB,EAAQ3D,QAAQhL,OAAO67H,GACvBngI,KAAK6Z,KAAKvV,OAAO2O,EAAQ7R,WAEzBpB,KAAK0iB,QCnBM,MAAM09G,GA8BnBzgI,YACU09B,EACAsX,EACA1rC,EACAmT,EACAtI,EACAw2B,EACA1M,EACA3oB,EACAorH,GARA,KAAAhjG,KAAAA,EACA,KAAAsX,gBAAAA,EACA,KAAA1rC,mBAAAA,EACA,KAAAmT,gBAAAA,EACA,KAAAtI,gBAAAA,EACA,KAAAw2B,wBAAAA,EACA,KAAA1M,kBAAAA,EACA,KAAA3oB,gBAAAA,EACA,KAAAorH,qBAAAA,EAmKF,KAAAC,cAAiBhgI,IACvB,MAAMigI,IAAejgI,MAAQN,KAAKwgI,UAAWxgI,KAAKwgI,QAAQjgI,UAAUmT,SAAS,cAE7EpT,IAAK,EAAAohB,EAAA,GAAYphB,GAEjB,MAAMggI,EAAiB1+G,IACrBA,EAAQ7c,SAAQwZ,IACdA,EAAO5F,QAAQpY,UAAUsD,OAAO,QAAS0a,EAAO7F,cAIjD6nH,IACDD,EAActgI,KAAKygI,aAGnBzgI,KAAKygI,YAAYzgI,KAAKygI,YAAY5/H,OAAS,GAAG8X,QAAQ4U,UAAUC,aAAY,IAAA5hB,MAAK5L,KAAKoc,gBAAgBskH,oBAAoB1gI,KAAKmJ,WAGjIm3H,EAActgI,KAAK2gI,kBAGb,KAAAC,sBAAyB3gI,I,MAC/B,IAAI,IAA2BD,KAAKmJ,OAAO+4B,SAAU,OAAO,EAE5D,MAAM2+F,EAAmB7gI,KAAKqgI,qBAAqBS,UAC7C3sH,EAASnU,KAAKmJ,OAAOoyB,WAC3B,OAAGslG,MAAAA,OAAgB,EAAhBA,EAAkB1sH,UAAWA,MAI7BlU,KACGD,KAAKmJ,OAAO4zB,eAA0B,UAAT98B,GAC9BD,KAAKmJ,OAAO4+F,cAAyB,cAAT9nG,OAME,QAA5B,EADMD,KAAK8T,gBAAgBitH,aAAa5sH,GAClB6G,cAAM,eAAEgmH,cAAehhI,KAAK8T,gBAAgBy0C,UAAUp0C,EAAQ,kBAGrF,KAAA8sH,iBAAoBhhI,IAC1B,IAAI,KAAsBD,KAAKmJ,OAAO+4B,SAAU,OAAO,EACvD,MAAMttB,EAAS5U,KAAKmJ,OAAOoL,WACrBu8D,EAAW9wE,KAAK49B,kBAAkBsjG,kBAAkBtsH,GAE1D,QAASk8D,MAAwB,UAAT7wE,EAAmB6wE,EAAS91D,OAAOmmH,sBAAwBrwD,EAAS91D,OAAOomH,wBAsN7F,KAAAC,qBAAuB,KAC7BrhI,KAAKq9B,KAAKs+D,aAAa2lC,cAActhI,KAAKmJ,SAkIpC,KAAAmb,YAAc,KACpB,IAAI07G,GAAUhgI,KAAKmJ,SAGb,KAAAo4H,SAAW,KACjBvhI,KAAKs5H,eAAc,GACnBt5H,KAAKq5H,eAGC,KAAAjX,eAAiB,CAAC93G,EAAkBwqC,KAC1C90C,KAAKoB,UAAUb,UAAUsD,OAAO,qBAAsBknB,EAAA,aAEtD/qB,KAAKk+F,eAAiBl+F,KAAKk+F,cAAcoyB,uBAAuB0I,cAAc53H,UAAUb,UAAUsD,OAAO,cAAeixC,IAAO,aAC/H90C,KAAKuhI,YA8KA,KAAAjI,cAAgB,CAACkI,GAAS,KAE5BxhI,KAAKyhI,aAAat0H,OAAOqW,qBAAqBxjB,KAAKyhI,aAEnD,GAAAvrH,WAAasrH,GACdxhI,KAAK0hI,UAAUnhI,UAAUgB,IAAI,QAI/BvB,KAAKyhI,YAAct0H,OAAOoW,uBAAsB,KAKvC,GAAArN,WAAasrH,GACdxhI,KAAK0hI,UAAUnhI,UAAUC,OAAO,QAIlC,MAAMoB,EAAmC5B,KAAK0hI,UAAUjiH,wBAAwB7d,MAChF5B,KAAKq9B,KAAK3V,IAAI,eAAgB9lB,GAC9B5B,KAAKoB,UAAUkC,MAAMspC,YAAY,gBAAiBhrC,EAAQ,MAI5D5B,KAAKyhI,YAAc,MAOlB,KAAApI,YAAc,KACnB,MACM7yH,EADa,CAACxG,KAAK2hI,UAAW3hI,KAAKk+F,eAAiBl+F,KAAKk+F,cAAcoyB,wBAAwBxmH,OAAOa,SACnFlG,QAAO,CAACC,EAAKtD,KACpC,MAAMg4H,EAAah4H,EAAU43H,cAAc53H,UAAUb,UAAUmT,SAAS,eAExE,OADA1T,KAAKoB,UAAUb,UAAUsD,OAAO,aAAazC,EAAUkK,qBAAsB8tH,GACtE10H,IAAO00H,IACb,GACHp5H,KAAKoB,UAAU4nB,QAAQ+vG,SAAW,GAAKvyH,GAGlC,KAAA6pC,cAAgB,CAACC,GAAY,KAClC,IAAItwC,KAAKowB,SAAU,OAEnB,MAAMjnB,EAASnJ,KAAKmJ,OACpBnJ,KAAKq9B,KAAKs+D,aAAatrD,cAAcrwC,KAAKmJ,OAAQnJ,KAAKowB,SAAUkgB,GAAW,GAAO,IAAMnnC,IAAWnJ,KAAKmJ,UAjxBzGnJ,KAAKwP,eAAiB,IAAI,IAE1BxP,KAAKygI,YAAc,GACnBzgI,KAAK2gI,gBAAkB,GAGlB14G,YAGLjoB,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,iBAAkB,UAC/CvB,KAAKoB,UAAU4nB,QAAQ+vG,SAAW,IAElC/4H,KAAK4hI,QAAU,EAAW,4BAA6B,CAACxyH,UAAU,IAGlEpP,KAAK6hI,kBAAoBxgI,SAASC,cAAc,OAChDtB,KAAK6hI,kBAAkBthI,UAAUgB,IAAI,uBAErCvB,KAAK8hI,SAAWzgI,SAASC,cAAc,OACvCtB,KAAK8hI,SAASvhI,UAAUgB,IAAI,aAE5B,MAAMwgI,EAAS1gI,SAASC,cAAc,OACtCygI,EAAOxhI,UAAUgB,IAAI,UAErB,MAAM+N,EAAUjO,SAASC,cAAc,OACvCgO,EAAQ/O,UAAUgB,IAAI,WAEtB,MAAMq3B,EAAMv3B,SAASC,cAAc,OACnCs3B,EAAIr4B,UAAUgB,IAAI,OAElBvB,KAAKqP,MAAQhO,SAASC,cAAc,OACpCtB,KAAKqP,MAAM9O,UAAUgB,IAAI,cAEzBq3B,EAAIt0B,OAAOtE,KAAKqP,OAEhB,MAAMuR,EAASvf,SAASC,cAAc,OACtCsf,EAAOrgB,UAAUgB,IAAI,UAElBvB,KAAKowB,UACNxP,EAAOtc,OAAOtE,KAAKowB,UAGrB9gB,EAAQhL,OAAOs0B,EAAKhY,GACjB5gB,KAAKgiI,eACND,EAAOz9H,OAAOtE,KAAKgiI,eAGrBD,EAAOz9H,OAAOgL,GACdtP,KAAK8hI,SAASx9H,OAAOy9H,GAGrB/hI,KAAK0hI,UAAYrgI,SAASC,cAAc,OACxCtB,KAAK0hI,UAAUnhI,UAAUgB,IAAI,cAE7BvB,KAAK2hI,UAAY,IAAIpI,GAAUv5H,KAAMA,KAAKq9B,KAAMr9B,KAAKiJ,oBAElDjJ,KAAKygI,YAAY5/H,SAClBb,KAAKwgI,QAAU,GAAiB,CAAChxH,eAAgBxP,KAAKwP,gBAAiB,cAAexP,KAAKygI,YAAazgI,KAAKsgI,gBAG/GtgI,KAAK0hI,UAAUp9H,UAAU,CAEvBtE,KAAKk+F,cAAgBl+F,KAAKk+F,cAAcoyB,uBAAuB0I,cAAc53H,UAAY,KACzFpB,KAAKiiI,QACLjiI,KAAKkiI,UACLliI,KAAKmiI,QACLniI,KAAKoiI,aACLpiI,KAAKqiI,QACLriI,KAAKsiI,UACLtiI,KAAKwgI,SACL12H,OAAOa,UAET3K,KAAKuiI,mBAAmBviI,KAAKmiI,QAASniI,KAAKihI,iBAAiBz4H,KAAKxI,KAAM,UACvEA,KAAKuiI,mBAAmBviI,KAAKoiI,aAAcpiI,KAAK4gI,uBAEhD5gI,KAAK6hI,kBAAkBv9H,OAAOtE,KAAK4hI,QAAS5hI,KAAK8hI,SAAU9hI,KAAK0hI,WAChE1hI,KAAKoB,UAAUkD,OAAOtE,KAAK6hI,mBAExB7hI,KAAK2hI,WAEN3hI,KAAKoB,UAAUkD,OAAOtE,KAAK2hI,UAAU3I,cAAc53H,WAOrDpB,KAAKwP,eAAejO,IAAI4L,OAAxBnN,CAAgC,SAAUA,KAAKuhI,UAC/CvhI,KAAKwP,eAAejO,IAAIwpB,EAAA,GAAxB/qB,CAAoC,eAAgBA,KAAKoiH,iBAEzD,QAAiBpiH,KAAKoB,WAAYd,IAChC,MAAMc,GAAY,EAAAyhB,GAAA,GAAgBviB,EAAEkY,OAAQ,oBAE5C,IADA,EAAAg0C,GAAA,KACGprD,EAAW,CAGZ,IAFA,EAAAsgB,EAAA,GAAYphB,IAET,EAAAuiB,GAAA,GAAgBviB,EAAEkY,OAAQ,iBAC3B,OAGF,MAAMzP,GAAO3H,EAAU4nB,QAAQjgB,IAC/B,GAAG3H,EAAUb,UAAUmT,SAAS,kBAE5B1T,KAAKk+F,cAAc0hC,oBAAoB72H,OAEpC,CACL,MAAMI,EAAS/H,EAAU4nB,QAAQ7f,OAAO8f,WAClC/f,EAAgB,sBACtBlJ,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAAA,EACAkzF,UAAWtzF,EACX9I,KAAMiJ,EAAc6B,YAAc,YAAe7B,EAAcyD,SAAW,kBAAepG,EACzFoG,SAAUzD,EAAcyD,iBAIzBoe,EAAA,kBAA4B,aAAqB1pB,SAASwY,KAAKtZ,UAAUmT,SAASgpE,IACnF8lD,KACQ,EAAAj9F,GAAA,GAAUjlC,EAAEkY,OAAQ,kBAC5BxY,KAAK20C,gBAAgBI,eAAe1zC,SAASwY,KAAKtZ,UAAUmT,SAASghC,KAErE10C,KAAK20C,gBAAgBI,eAAc,KAGtC,CAACvlC,eAAgBxP,KAAKwP,iBAEzB,MAAMgzH,EAAkBliI,IAOtB,GANGA,IACD,EAAAohB,EAAA,GAAYphB,GAKXyqB,EAAA,kBAA4B,aAAqB1pB,SAASwY,KAAKtZ,UAAUmT,SAASgpE,IACnF18E,KAAKq9B,KAAKs+D,aAAalsD,QAAQ,CAACtmC,OAAQnJ,KAAKmJ,aACxC,CACL,MAAMs5H,EAAkE,IAApDziI,KAAKq9B,KAAKs+D,aAAa1jC,MAAMh4C,QAAQjgB,KAAKq9B,MAC9D1sB,EAAA,OAA6B8xH,EAAc,KAAO,WAYtD,QAAiBziI,KAAK4hI,QAASY,EAAgB,CAAChzH,eAAgBxP,KAAKwP,iBAG/D+yH,mBAAmB5pH,EAAsBD,GAC3CC,GAIJ3Y,KAAK2gI,gBAAgB74H,KAAK,CAAC6Q,QAAAA,EAASD,OAAAA,IAoD/BgqH,iBACL1iI,KAAKygI,YAAc,CAAC,CAClB5xH,KAAM,SACNoS,KAAM,SACNC,QAAS,KACPlhB,KAAKq9B,KAAKygD,cAEZplE,OAAQ,IAAMqS,EAAA,aAMX,CACHlc,KAAM,OACNoS,KAAM,wBACNC,QAASlhB,KAAKskB,YACd5L,OAAQ,IAAyB,SAAnB1Y,KAAKq9B,KAAKp9B,MAAmB4K,EAAA,eAAmB7K,KAAKmJ,SAAWnJ,KAAKsqC,wBAAwB4mF,iBAAiBlxH,KAAKmJ,QAAQ,IACxI,CACD0F,KAAM,SACNoS,KAAM,0BACNC,QAAS,KACPlhB,KAAKiJ,mBAAmB05H,eAAe3iI,KAAKmJ,SAE9CuP,OAAQ,IAAyB,SAAnB1Y,KAAKq9B,KAAKp9B,MAAmB4K,EAAA,eAAmB7K,KAAKmJ,QAAUnJ,KAAKsqC,wBAAwB4mF,iBAAiBlxH,KAAKmJ,QAAQ,IACvI,CACD0F,KAAM,WACNoS,KAAM,iBACNC,QAAS,KACP,MAAM2P,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBACrC33F,QAAQ2E,QAAQnI,KAAK49B,kBAAkBu1F,eAAenzH,KAAKmJ,OAAOoyB,aAAax5B,MAAK0wH,IAC/E5hG,KAAgB4hG,EAAYmQ,gBAC7B5iI,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQspH,EAAYmQ,eAAe35G,UAAS,SAKpDvQ,OAAQ,KACN,MAAM6kB,EAAWv9B,KAAK49B,kBAAkB80F,kBAAkB1yH,KAAKmJ,OAAOoyB,YACtE,MAA0B,SAAnBv7B,KAAKq9B,KAAKp9B,SAAsBs9B,MAAAA,OAAQ,EAARA,EAAmCqlG,kBAE3E,CACD/zH,KAAM,QACNoS,KAAM,OACNC,QAASlhB,KAAK6iI,YAAYr6H,KAAKxI,KAAM,SACrC0Y,OAAQ1Y,KAAKihI,iBAAiBz4H,KAAKxI,KAAM,UACxC,CACD6O,KAAM,cACNoS,KAAM,YACNC,QAASlhB,KAAK6iI,YAAYr6H,KAAKxI,KAAM,SACrC0Y,OAAQ1Y,KAAKihI,iBAAiBz4H,KAAKxI,KAAM,UACxC,CACD6O,KAAM,YACNoS,KAAM,6BACNC,QAASlhB,KAAKqhI,qBACd3oH,OAAQ1Y,KAAK4gI,sBAAsBp4H,KAAKxI,KAAM,cAC7C,CACD6O,KAAM,YACNoS,KAAM,4BACNC,QAASlhB,KAAKqhI,qBACd3oH,OAAQ1Y,KAAK4gI,sBAAsBp4H,KAAKxI,KAAM,UAC7C,CACD6O,KAAM,SACNoS,KAAM,2BACNC,QAAS,KACP,MAAM4yB,EAAY9zC,KAAKq9B,KAAKyW,UAC5BA,EAAUqV,iBAAgB,GAAM,GAChC9vB,EAAA,mBAA2Bt3B,MAAKu3B,IAC9B,GAAGA,EAAMwpG,4BACP,OAGF,MAAMlmG,EAAWkX,EAAUE,gBAAgBxrC,KAAKsrC,GAChDA,EAAUE,gBAAmB6P,IAC3BxqB,EAAA,oBAA4B,+BAA+B,GAC3DS,IAAM,IAAAluB,MAAK,mBAEXkoC,EAAUE,gBAAkBpX,EAC5BkX,EAAUE,gBAAgB6P,QAIhCnrC,OAAQ,KAAO1Y,KAAKq9B,KAAKyW,UAAUC,eAAiBr5B,OAAOgzC,KAAK1tD,KAAKq9B,KAAKzD,QAAQA,SAAS/4B,QAC1F,CACDgO,KAAM,SACNoS,KAAM,2BACNC,QAAS,KACPlhB,KAAKq9B,KAAKyW,UAAU4U,mBAEtBhwC,OAAQ,IAAM1Y,KAAKq9B,KAAKyW,UAAUC,aACjC,CACDllC,KAAM,UACNoS,KAAM,aACNC,QAAS,KACP,IAAIlhB,KAAK20C,gBAAgBpiC,YAAYs3B,IAAoB,CACvD,MAAM34B,EAAM,IAAI24B,GAAkB7pC,KAAK20C,iBACvCzjC,EAAI/H,OAASnJ,KAAKmJ,OAClB+H,EAAIvB,OAEJ3P,KAAK20C,gBAAgBI,eAAc,KAGvCr8B,OAAQ,IAAM1Y,KAAKmJ,OAAO+4B,WAAaliC,KAAKoc,gBAAgB69D,UAAUj6E,KAAKmJ,SAC1E,CACD0F,KAAM,UACNoS,KAAM,eACNC,QAAS,KACP,MAAM6hH,EAAgB/iI,KAAKmJ,OAC3B,IAAIu6B,GAAc,CAChBI,UAAW,CAAC,UAAW,YACvBF,SAAWz6B,GACF,IAAI3F,SAAQ,CAAC2E,EAASqnB,KAC3B,IAAIoM,GAAU,GAAI,CAChB5D,aAAc,mBACdoE,mBAAoB,yBACpBG,oBAAqB,CAAC,IAAI,KAAU,CAACpzB,OAAAA,EAAQ2L,QAAQ,IAAO6D,SAC5DiJ,QAAS,CAAC,CACR6X,QAAS,OACTkD,SAAU,KACRx0B,IAEAnI,KAAKiJ,mBAAmB68G,YAAY38G,EAAQ45H,GAC5C/iI,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAACzyF,OAAAA,MAEtC,CACDswB,QAAS,SACTkD,SAAU,KACRnN,KAEF0sC,UAAU,IAEZ/yD,OAAAA,EACA0yB,iBAAiB,IAChBnZ,UAGPvU,YAAa,gCACb0zB,iBAAkB,gBAClBxC,aAAc,kBAGlB3mB,OAAQ,IAAM7N,EAAA,eAAmB7K,KAAKmJ,QAAUnJ,KAAKmJ,OAAO+4B,UAAYliC,KAAKoc,gBAAgB69D,UAAUj6E,KAAKmJ,WAAanJ,KAAKiV,gBAAgBw4F,QAAQztG,KAAKmJ,OAAOoL,YAAYo2B,OAC7K,CACD97B,KAAM,OACNoS,KAAM,YACNC,QAAS,KACP,IAAI0a,GAAU,GAAI,CAChBzyB,OAAQnJ,KAAKmJ,OACb6uB,aAAc,YACdoE,mBAAoB,0BACpBG,oBAAqB,CAAC,IAAI,KAAU,CAACpzB,OAAQnJ,KAAKmJ,SAASwP,SAC3DiJ,QAAS,CAAC,CACR6X,QAAS,YACTuN,UAAU,EACVrK,SAAU,KACR38B,KAAKiV,gBAAgB+tH,YAAYhjI,KAAKmJ,QAAQ,GAAMpH,MAAKrB,IACpDA,GACDq5B,GAAS,CAACC,YAAa,wBAK9BtX,QAELhK,OAAQ,K,MACN,IAAI1Y,KAAKmJ,OAAO+4B,SAAU,OAAO,EACjC,MAAM4uC,EAAW9wE,KAAK49B,kBAAkBsjG,kBAAkBlhI,KAAKmJ,OAAOoL,YACtE,OAAOvU,KAAKmJ,SAAW0B,EAAA,cAAkBimE,KAA4B,QAAf,EAAAA,EAAS91D,cAAM,eAAEgkD,WAExE,CACDnwD,KAAM,UACNoS,KAAM,UACNC,QAAS,KACPlhB,KAAKiV,gBAAgB+tH,YAAYhjI,KAAKmJ,QAAQ,GAAOpH,MAAKrB,IACrDA,GACDq5B,GAAS,CAACC,YAAa,sBAI7BthB,OAAQ,K,MACN,MAAMo4D,EAAW9wE,KAAK49B,kBAAkBsjG,kBAAkBlhI,KAAKmJ,OAAOoL,YACtE,SAAyB,QAAhB,EAAAu8D,MAAAA,OAAQ,EAARA,EAAU91D,cAAM,eAAEgkD,WAE5B,CACDnwD,KAAM,gBACNoS,KAAM,SACNC,QAAS,KACP,IAAIwlB,GAAkB1mC,KAAKmJ,SAE7BuP,OAAQ,IAAyB,SAAnB1Y,KAAKq9B,KAAKp9B,QAAqBD,KAAKiJ,mBAAmBs+F,cAAcvnG,KAAKmJ,UAG1FnJ,KAAKsiI,UAAY,EAAW,UAC5BtiI,KAAKijI,iBAAiBjjI,KAAKsiI,WAAYhiI,IACrCN,KAAKq9B,KAAKygD,gBACT,GAGEmlD,iBAAiBxxH,EAAiBmrC,EAA6BxrB,IACpE,QAAiB3f,GAAKnR,KACpB,EAAAohB,EAAA,GAAYphB,IACX8wB,IAAU,EAAAo7B,GAAA,KACX5P,EAAGt8C,KACF,CAACkP,eAAgBxP,KAAKwP,iBAGnBqzH,YAAY5iI,GAClBD,KAAKq9B,KAAKs+D,aAAaG,SAAS97F,KAAKmJ,OAAOoL,WAAYtU,GAOnDogG,uBAsGL,OArGArgG,KAAKgiI,cAAgB,IAAIjmG,GACzB/7B,KAAKgiI,cAAc9hI,aAAa,SAAU,KAE1CF,KAAKgiI,cAAczhI,UAAUgB,IAAI,YAAa,iBAE9CvB,KAAKowB,SAAW/uB,SAASC,cAAc,OACvCtB,KAAKowB,SAAS7vB,UAAUgB,IAAI,QAE5BvB,KAAKk+F,cAAgB,IAAIm/B,GAAkBr9H,KAAMA,KAAKq9B,KAAMr9B,KAAKiJ,mBAAoBjJ,KAAKoc,iBAE1Fpc,KAAKiiI,SAAU,OAAO,gDACtBjiI,KAAKmiI,QAAU,EAAW,SAC1BniI,KAAKoiI,aAAe,EAAW,aAC/BpiI,KAAKkiI,UAAY,EAAW,WAC5BliI,KAAKqiI,QAAU,EAAW,QAE1BriI,KAAKijI,iBAAiBjjI,KAAKmiI,QAASniI,KAAK6iI,YAAYr6H,KAAKxI,KAAM,UAChEA,KAAKijI,iBAAiBjjI,KAAKoiI,aAAcpiI,KAAKqhI,sBAE9CrhI,KAAKijI,iBAAiBjjI,KAAKkiI,WAAW,KACpCliI,KAAKy+H,YAAW,MAGlBz+H,KAAKijI,iBAAiBjjI,KAAKqiI,QAASriI,KAAKskB,aAEzCtkB,KAAKijI,iBAAiBjjI,KAAKiiI,SAAS,KAClC,MAAMpxG,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBACrCn7F,KAAKiiI,QAAQ/hI,aAAa,WAAY,QAEtC,MAAMiU,EAASnU,KAAKmJ,OAAOoyB,WAC3B,IAAIlzB,EAEFA,EADCrI,KAAK8T,gBAAgBw0B,UAAUn0B,GACtBnU,KAAK8T,gBAAgBovH,YAAY/uH,GAEjCnU,KAAK8T,gBAAgBqvH,YAAYhvH,EAAQtJ,EAAA,cAGrDxC,EAAQid,SAAQ,KACVuL,KAIJ7wB,KAAKiiI,QAAQz4F,gBAAgB,kBAIjCxpC,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,eAAgBmU,I,MACjD,GAAGnU,KAAKmJ,SAAWgL,EAAO8U,UAAS,GAAO,CACxC,MAAMoU,EAAOr9B,KAAK8T,gBAAgBsvH,QAAQjvH,GAE1CnU,KAAKiiI,QAAQ1hI,UAAUsD,OAAO,SAAkC,QAAzB,EAACw5B,MAAAA,OAAI,EAAJA,EAAkBriB,cAAM,eAAE6F,OAClE7gB,KAAKs5H,gBACLt5H,KAAKsgI,oBAITtgI,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,0BAA2B8U,IACzDA,EAAO3L,SAAWnJ,KAAKmJ,QACxBnJ,KAAKqjI,mBAITrjI,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,gBAAgB,EAAEmJ,OAAAA,MAChDnJ,KAAKmJ,SAAWA,GACjBnJ,KAAKqwC,mBAITrwC,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,eAAgB4U,IAC9C5U,KAAKmJ,SAAWyL,EAAOqU,YACxBjpB,KAAKqwC,mBAITrwC,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,oBAAqBmJ,IACnDnJ,KAAKmJ,SAAWA,GACjBnJ,KAAKsgI,mBAINtgI,KAAKk+F,eACNl+F,KAAKq9B,KAAKh9B,iBAAiB,WAAW,CAAC0I,EAAKu6H,KAC1C,MAAMzyG,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBACrC9hE,EAAA,mBAA2Bt3B,MAAMu3B,IAC3BzI,MAEJ7wB,KAAKk+F,cAAc6hB,SAAWzmF,EAAMiqG,qBAAqBvjI,KAAKq9B,KAAKl0B,QAEhEm6H,GACDtjI,KAAKk+F,cAAc0gC,0BACnB5+H,KAAKk+F,cAAc2gC,QAAQ91H,EAAK,IACvB/I,KAAKk+F,cAAcy/B,SAC5B39H,KAAKk+F,cAAcyhC,+BACnB3/H,KAAKk+F,cAAc2gC,QAAQ91H,WAMnC/I,KAAK+wC,sBAAwB5jC,OAAO6jC,YAAYhxC,KAAKqwC,cAAe,KAE7DrwC,KAGF2jG,yBACL3jG,KAAKwP,eAAejO,IAAIsJ,EAAA,QAAxB7K,CAAmC,wBAAwB,EAAEmJ,OAAAA,EAAQgB,KAAAA,MAChEhB,IAAWnJ,KAAKmJ,QAEhBgB,GACDnK,KAAKkQ,cAKJszH,6BACLxjI,KAAKk+F,cAAgB,IAAIm/B,GAAkBr9H,KAAMA,KAAKq9B,KAAMr9B,KAAKiJ,mBAAoBjJ,KAAKoc,iBAGrFqiH,WAAWgF,GAChBzjI,KAAKq9B,KAAKs+D,aAAaC,aAAa,CAClCzyF,OAAQnJ,KAAKmJ,OACbkzF,UAAWonC,GAAazjI,KAAKk+F,cAAcoyB,uBAAuB0I,cAAc53H,UAAU4nB,QAAQjgB,IAAM,EACxG9I,KAAM,WAoBHqmG,UAELtmG,KAAKwP,eAAeS,YACpB9C,OAAOytC,cAAc56C,KAAK+wC,uBAEvB/wC,KAAKk+F,eACNl+F,KAAKk+F,cAAcoI,UAGlBtmG,KAAK2hI,WACN3hI,KAAK2hI,UAAUr7B,iBAGVtmG,KAAK2hI,iBACL3hI,KAAKk+F,cAGPzuD,QAAQtmC,GACbnJ,KAAK0jI,UAAY1jI,KAAKmJ,OACtBnJ,KAAKmJ,OAASA,EAEdnJ,KAAKoB,UAAUkC,MAAMC,QAAU4F,EAAS,GAAK,OAGxCu3F,iBAAiBuG,EAAmBU,EAAiBtL,G,QAC1D,MAAMlzF,EAASnJ,KAAKmJ,OAEjBnJ,KAAKgiI,gBACNhiI,KAAKgiI,cAAc9hI,aAAa,OAAQ,GAAKiJ,GAC7CnJ,KAAKgiI,cAAcn8F,UAGrB,MAAM9I,EAAc/8B,KAAKoc,gBAAgB2gB,YAAY5zB,GAErD,GADAnJ,KAAKqiI,SAAWriI,KAAKqiI,QAAQ9hI,UAAUsD,OAAO,QAASk5B,GACpD/8B,KAAKiiI,QACN,GAAGjiI,KAAKoc,gBAAgB4mB,UAAU75B,GAAS,CACzC,MAAMgL,EAAShL,EAAOoyB,YACtB,EAAAvtB,EAAA,GAAehO,KAAKiiI,SAAS,IAAAr2H,MAAK5L,KAAK8T,gBAAgBipB,YAAY5oB,GAAU,iBAAmB,gBAChGnU,KAAKiiI,QAAQ1hI,UAAUsD,OAAO,SAAqD,QAA5C,EAAoC,QAApC,EAAA7D,KAAK8T,gBAAgBsvH,QAAQjvH,UAAO,eAAE6G,cAAM,eAAE6F,YAErF7gB,KAAKiiI,QAAQ1hI,UAAUgB,IAAI,QAI/BvB,KAAKs5H,gBAELt5H,KAAKsgI,gBAEL,MAAMzvG,EAAa7wB,KAAKq9B,KAAKzD,QAAQuhE,gBACrC,GAAGn7F,KAAKk+F,cACN,GAAsB,SAAnBl+F,KAAKq9B,KAAKp9B,KAAiB,CAC5B,QAAsBsG,IAAnBvG,KAAK0jI,UAAyB,CAC/B,MAAMC,EAAmB,IAAItG,GAAkBr9H,KAAMA,KAAKq9B,KAAMr9B,KAAKiJ,mBAAoBjJ,KAAKoc,iBAC9Fpc,KAAKk+F,cAAcoyB,uBAAuB0I,cAAc53H,UAAUosB,YAAYm2G,EAAiBrT,uBAAuB0I,cAAc53H,WACpIpB,KAAKk+F,cAAcoI,UAEnBtmG,KAAKk+F,cAAgBylC,EAGvBtqG,EAAA,mBAA2Bt3B,MAAMu3B,IAC3BzI,MAEJ7wB,KAAKk+F,cAAc6hB,SAAWzmF,EAAMiqG,qBAAqBp6H,GAErD89F,GACFjnG,KAAKk+F,cAAcC,gBAAgB,WAGZ,eAAnBn+F,KAAKq9B,KAAKp9B,OAClBD,KAAKk+F,cAAcq/B,UAAYv9H,KAAKq9B,KAAK1wB,SACzC3M,KAAKk+F,cAAc13F,MAAQ,EAC3BxG,KAAKk+F,cAAcs/B,YAAc,EACjCx9H,KAAKk+F,cAAcygC,sBAIvB,UAAQ,KACN3+H,KAAKkQ,WACLlQ,KAAKqwC,eAAc,GACnBrwC,KAAKqjI,mBAIFnzH,SAAS1J,G,MACd,IAAIumB,EAgEJ,GA/DsB,WAAnB/sB,KAAKq9B,KAAKp9B,MACa8sB,OAAXxmB,IAAVC,GAA+B,IAAAoF,MAAK,YACxB,IAAAA,MAAK,sBAAuB,CAACpF,SAE/BD,IAAVC,GACDxG,KAAKiJ,mBAAmB26H,kBAAkB5jI,KAAKmJ,OAAQ,CAAC,CAACG,EAAG,+BAA+B,GAAOvH,MAAKwG,IACrG,MAAM/B,EAAQ+B,EAAO,GAAG/B,MAIxB,GAHAxG,KAAKkQ,SAAS1J,IAGVA,EAAO,CACTxG,KAAKq9B,KAAKs+D,aAAalsD,UAGvB,MAAM4gF,EAAerwH,KAAKq9B,KAAKs+D,aAAat+D,KACzCgzF,EAAapyB,OAAOC,eACrBmyB,EAAapyB,OAAOC,cAAcoyB,uBAAuBzsH,QAAO,QAK7C,cAAnB7D,KAAKq9B,KAAKp9B,MAGhB8sB,EAFC/sB,KAAKmJ,SAAW0B,EAAA,cAEP,IAAAe,MAAK,cAEL,IAAAA,MAAK,0BAIJrF,IAAVC,GACDxG,KAAKiJ,mBAAmBslG,qBAAqBvuG,KAAKmJ,QAAQpH,MAAKoI,IAC7DnK,KAAKkQ,SAAS/F,EAAKtJ,YAGI,eAAnBb,KAAKq9B,KAAKp9B,MACM8sB,OAAXxmB,IAAVC,GAA+B,IAAAoF,MAAK,YACxB,IAAAA,MAAK,sBAAuB,CAACpF,SAE/BD,IAAVC,GACDhD,QAAQC,IAAI,CACVzD,KAAKiJ,mBAAmBo7F,WAAWrkG,KAAKmJ,OAAQ,EAAG,EAAG,EAAGnJ,KAAKq9B,KAAK1wB,UACnEnJ,QAAQ2E,YACPpG,MAAK,KACN,MAAMyE,EAAQxG,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,OAAQnJ,KAAKq9B,KAAK1wB,UAAUnG,MAC5E,OAAVA,EACD4G,YAAW,KACTpN,KAAKkQ,aACJ,IAEHlQ,KAAKkQ,SAAS1J,OAIO,SAAnBxG,KAAKq9B,KAAKp9B,OAClB8sB,EAAU,IAAI,KAAU,CACtB5jB,OAAQnJ,KAAKmJ,OACb2L,QAAQ,IACP6D,UAGL,EAAA3K,EAAA,GAAehO,KAAKqP,MAAO0d,GAEL,SAAnB/sB,KAAKq9B,KAAKp9B,KAAiB,CAC5B,MAAM0lC,EAAO3lC,KAAKoc,gBAAgBg0F,QAAQpwG,KAAKmJ,SAChC,QAAZ,EAAAw8B,MAAAA,OAAI,EAAJA,EAAM3qB,cAAM,eAAEu2B,WACfvxC,KAAKqP,MAAM/K,OAAOgnC,OAKjB+3F,gBACL,IAAIrjI,KAAKqiI,QAAS,OAElB,MAAMl5H,EAASnJ,KAAKmJ,OACpB,IAAI0R,EAAQ7a,KAAKsqC,wBAAwB4mF,iBAAiB/nH,GAAQ,GAC/DnJ,KAAKoc,gBAAgB2gB,YAAY5zB,IAClCnJ,KAAKqiI,QAAQ9hI,UAAUC,OAAO,aAAc,gBAC5CR,KAAKqiI,QAAQ9hI,UAAUgB,IAAIsZ,EAAQ,eAAiB,cACpD7a,KAAKqiI,QAAQ/+H,MAAMC,QAAU,IAE7BvD,KAAKqiI,QAAQ/+H,MAAMC,QAAU,QChzBpB,MAAMsgI,WAA4B/0H,EAAjD,c,oBAMU,KAAAnC,SAAW,EACX,KAAAF,MAAQ,GAGhBmF,qBACE5R,KAAK8jI,UAAUz2H,YAAYrN,KAAKmJ,OAAQnJ,KAAK2M,SAAU3M,KAAKyM,OAGpDmD,OACR5P,KAAKoB,UAAUyP,GAAK,2BACpB7Q,KAAKoB,UAAUb,UAAUgB,IAAI,sBAC7BvB,KAAK+5E,YAAc,IAAI7rE,EAAY,UACnClO,KAAKqP,MAAMme,YAAYxtB,KAAK+5E,YAAY34E,WAExCpB,KAAK+jI,YAAc,EAAW,iCAC9B/jI,KAAKkP,OAAO5K,OAAOtE,KAAK+jI,aAExB,MAAM9rG,EAAI52B,SAASC,cAAc,OACjC22B,EAAE13B,UAAUgB,IAAI,sBAChBvB,KAAK4M,WAAWxL,UAAUosB,YAAYyK,GACtCj4B,KAAK8jI,UAAY,IAAI93H,EAAUisB,EAAGj4B,KAAK+5E,YAAa,CAClDltE,SAAU,IAAIzB,EAAY,4BAA6B,cAI3DuE,KAAKxG,EAAgBwD,EAAmB8uF,EAAgDhvF,GACtF,MAAMy+B,EAAMrrC,MAAM8P,OAsBlB,OApBI3P,KAAKmJ,OAiBPnJ,KAAK8jI,UAAUz2H,YAAYrN,KAAKmJ,OAAQnJ,KAAK2M,SAAUF,IAhBvDzM,KAAKyM,MAAQA,EACbzM,KAAKmJ,OAASA,EACdnJ,KAAK2M,SAAWA,EAChB3M,KAAKy7F,WAAaA,EAElBz7F,KAAK+jI,YAAYxjI,UAAUsD,OAAO,QAAS7D,KAAKy7F,YAC7Cz7F,KAAKy7F,aACN,QAAiBz7F,KAAK+jI,aAAa,KACjC,IAAIvjD,GAAgB,IAAInmC,KAAQr6C,KAAKy7F,YAAY/4E,UAIrDjW,GAASzM,KAAK8jI,UAAU73H,YAAYrJ,WAAW9B,iBAAiB2L,GAEhE,kBAA8B,IAKzBy+B,GC9CI,MAAM84F,GAuBnBrkI,YAAoBs+F,EAA4B5gE,EAAY5wB,GAAxC,KAAAwxF,OAAAA,EAA4B,KAAA5gE,KAAAA,EANxC,KAAA/wB,WAAa,EACb,KAAA23H,cAAgB,EA6HhB,KAAA5iD,YAAe/gF,KACrB,EAAAohB,EAAA,GAAYphB,GACZ,IAAIkgF,GAAgB,IAAInmC,KAAQr6C,KAAKq9B,KAAKzD,QAAQ6hE,YAAY/4E,QAwCxD,KAAAwhH,eAAkB5jI,IACxB,MAAMkY,GAAS,EAAA+sB,GAAA,GAAUjlC,EAAEkY,OAAQ,MAChCA,GACDxY,KAAKmkI,aAAa3rH,IAId,KAAA4rH,cAAiB9jI,IACpBN,KAAKsM,aACNtM,KAAKq9B,KAAKzD,QAAQo0B,iBAAiBztD,UAAUsD,OAAO,yBACpD7D,KAAKuiC,QAAQhiC,UAAUsD,OAAO,YAI1B,KAAAwgI,UAAa/jI,KACnB,EAAAohB,EAAA,GAAYphB,GACZN,KAAKmkI,aAAankI,KAAKwN,YAAY9B,KAAKklB,SAAS5wB,KAAKikI,cAAgB,KAGhE,KAAAK,YAAehkI,KACrB,EAAAohB,EAAA,GAAYphB,GACZN,KAAKmkI,aAAankI,KAAKwN,YAAY9B,KAAKklB,SAAS5wB,KAAKikI,cAAgB,KAtLtEjkI,KAAK2Y,QAAUtX,SAASC,cAAc,OACtCtB,KAAK2Y,QAAQpY,UAAUgB,IAAI,iBAAkB,cAAe,sBAE5DvB,KAAKg9E,QAAU37E,SAASC,cAAc,UACtCtB,KAAKg9E,QAAQz8E,UAAUgB,IAAI,WAAY,aAAc,yBACrD,EAAA8f,GAAAA,QAAOrhB,KAAKg9E,SAEZ,MAAMxtE,EAAiBxP,KAAKwP,eAAiB,IAAI,IAE3CuqH,EAAc,CAACphH,EAAsBgkB,MACzC,QAAiBhkB,EAASgkB,EAAU,CAACntB,eAAAA,KAGvCuqH,EAAY/5H,KAAKg9E,SAAS,KACxBh9E,KAAKsmG,aAGPtmG,KAAK+5E,YAAc,IAAI7rE,EAAY,UAGnClO,KAAKuiC,QAAUlhC,SAASC,cAAc,OACtCtB,KAAKuiC,QAAQhiC,UAAUgB,IAAI,sBAAuB,sBAElDvB,KAAKwN,YAAc,IAAIpC,GAAY,EAAO,gBAAY7E,EAAW,IAAI,GACrEwzH,EAAY/5H,KAAKwN,YAAY9B,KAAM1L,KAAKkkI,gBAExClkI,KAAK8jI,UAAY,IAAI93H,EAAUhM,KAAKuiC,QAASviC,KAAK+5E,YAAa,CAC7DltE,SAAU7M,KAAKwN,cACbhH,IACFxG,KAAKsM,WAAa9F,EAEdxG,KAAKsM,WAOPtM,KAAKmkI,aAAankI,KAAKwN,YAAY9B,KAAKklB,SAAS,MANjD,EAAA5iB,EAAA,GAAehO,KAAKukI,aAAcvkI,KAAK+5E,YAAYr5E,OAAQ,IAAAkL,MAAK,YAAc,IAC9E5L,KAAKuiC,QAAQhiC,UAAUC,OAAO,UAC9BR,KAAKq9B,KAAKzD,QAAQo0B,iBAAiBztD,UAAUC,OAAO,yBACpDR,KAAKwkI,MAAMtkI,aAAa,WAAY,QACpCF,KAAKykI,QAAQvkI,aAAa,WAAY,YAK1CF,KAAK8jI,UAAUz2H,YAAYrN,KAAKq9B,KAAKl0B,OAAQnJ,KAAKq9B,KAAK1wB,UAGvD3M,KAAKq9B,KAAKzD,QAAQo0B,iBAAiB1pD,OAAOtE,KAAKuiC,SAG/CviC,KAAK0kI,OAASrjI,SAASC,cAAc,OACrCtB,KAAK0kI,OAAOnkI,UAAUgB,IAAI,sBAE1Bw4H,EAAY/5H,KAAK0kI,OAAQ1kI,KAAKokI,gBAC9B,EAAA/iH,GAAAA,QAAOrhB,KAAK0kI,QAEZ1kI,KAAKukI,aAAeljI,SAASC,cAAc,QAC3CtB,KAAKukI,aAAahkI,UAAUgB,IAAI,qBAEhCvB,KAAK2kI,QAAUtjI,SAASC,cAAc,UACtCtB,KAAK2kI,QAAQpkI,UAAUgB,IAAI,WAAY,kBAEvCvB,KAAKolB,SAAW/jB,SAASC,cAAc,OACvCtB,KAAKolB,SAAS7kB,UAAUgB,IAAI,wBAE5BvB,KAAKwkI,MAAQnjI,SAASC,cAAc,UACpCtB,KAAKwkI,MAAMjkI,UAAUgB,IAAI,WAAY,YACrCvB,KAAKykI,QAAUpjI,SAASC,cAAc,UACtCtB,KAAKykI,QAAQlkI,UAAUgB,IAAI,WAAY,cAEvCvB,KAAKwkI,MAAMtkI,aAAa,WAAY,QACpCF,KAAKykI,QAAQvkI,aAAa,WAAY,QAEtC65H,EAAY/5H,KAAK2kI,QAAS3kI,KAAKqhF,aAC/B04C,EAAY/5H,KAAKwkI,MAAOxkI,KAAKqkI,WAC7BtK,EAAY/5H,KAAKykI,QAASzkI,KAAKskI,aAC/BtkI,KAAKolB,SAAS9gB,OAAOtE,KAAKwkI,MAAOxkI,KAAKykI,SAEtCzkI,KAAK0kI,OAAOpgI,OAAOtE,KAAKukI,aAAcvkI,KAAK2kI,QAAS3kI,KAAKolB,UAEzDplB,KAAKi+F,OAAO78F,UAAU6C,cAAcE,aAAanE,KAAK0kI,OAAQrnG,EAAKt9B,MAAM6jH,WAGzE5jH,KAAK2Y,QAAQrU,OAAOtE,KAAKg9E,QAASh9E,KAAK+5E,YAAY34E,WAEnDpB,KAAKi+F,OAAO78F,UAAUb,UAAUgB,IAAI,eACpCvB,KAAKi+F,OAAO78F,UAAU6C,cAAcK,OAAOtE,KAAK2Y,SAEhD3Y,KAAK+5E,YAAYh6E,MAAMuN,QAEpBb,GACDzM,KAAKq0C,SAAS5nC,GAGZ,GAAAkgD,mBACF3sD,KAAK0hH,eAAiB,CACpBzhH,KAAM,gBACN4R,MAAO,KACL7R,KAAKsmG,YAIT31F,EAAA,WAAiC3Q,KAAK0hH,iBAInCpb,UACLtmG,KAAKi+F,OAAO78F,UAAUb,UAAUC,OAAO,eACvCR,KAAK2Y,QAAQnY,SACbR,KAAK+5E,YAAYv5E,SACjBR,KAAKuiC,QAAQ/hC,SACbR,KAAK0kI,OAAOlkI,SACZR,KAAKwP,eAAeS,YACpBjQ,KAAKq9B,KAAKzD,QAAQo0B,iBAAiBztD,UAAUC,OAAO,yBACpDR,KAAKq9B,KAAKsvD,YAASpmF,EACnBoK,EAAA,aAAmC3Q,KAAK0hH,gBAGnCrtE,SAAS5nC,GACdzM,KAAK+5E,YAAYn3E,WAAWlC,MAAQ+L,EAQ9B03H,aAAav+H,GACnB,GAAG5F,KAAKg+F,eAAgB,OAAOh+F,KAAKg+F,eAEpC,MAAM70F,EAASvD,EAAKojB,QAAQ7f,OAAO8f,WAC7BozE,GAAaz2F,EAAKojB,QAAQjgB,UAAOxC,EAEjCY,GAAQ,EAAAg/C,GAAA,GAAWvgD,GAEtBuB,IAAWnH,KAAKsM,WAAa,EAC9BtM,KAAKwkI,MAAMtkI,aAAa,WAAY,QAEpCF,KAAKwkI,MAAMh7F,gBAAgB,YAGzBriC,EAGFnH,KAAKykI,QAAQj7F,gBAAgB,YAF7BxpC,KAAKykI,QAAQvkI,aAAa,WAAY,QAKxCF,KAAKuiC,QAAQhiC,UAAUC,OAAO,UAC9BR,KAAKq9B,KAAKzD,QAAQo0B,iBAAiBztD,UAAUC,OAAO,yBAEpD,MAAM+M,EAAMvN,KAAKq9B,KAAKoS,QAAQtmC,EAAQkzF,GACtCr8F,KAAKg+F,gBAAmBzwF,aAAe/J,QAAU+J,EAAM/J,QAAQ2E,QAAQoF,IAAuBxL,MAAK,KACjG/B,KAAKikI,cAAgB98H,GACrB,EAAA6G,EAAA,GAAehO,KAAKukI,cAAc,IAAA34H,MAAK,KAAM,CAACzE,EAAQ,EAAGnH,KAAKsM,cAE9D,MAAMs4H,EAAgB5kI,KAAKwN,YAAY9B,KAAKK,kBACzC/L,KAAKikI,eAAkBW,EAAgB,GACxC5kI,KAAK8jI,UAAU92H,gBAEhBsY,SAAQ,KACTtlB,KAAKg+F,eAAiB,SC1Lb,MAAM6mC,GAWnBllI,cACEK,KAAK8kI,SAAW,IAAIp/H,IAGfyuB,mBAAmBv0B,GACxB,IAAImlI,EAAW/kI,KAAKglI,UAAU3yH,MAAM0yH,IAC3B,EAAA9nH,GAAA,GAAU8nH,EAASnlI,QAASA,KASrC,OANImlI,IACFA,EAAW,IAAIF,GACfE,EAASn1H,KAAKhQ,GACdI,KAAKglI,UAAUl9H,KAAKi9H,IAGfA,EAGFn1H,KAAKhQ,GACVI,KAAKJ,QAAUA,EAGVqlI,eAAe5hI,GACpB,OAAOrD,KAAKklI,oBAAoB7hI,GAAQtB,MAAK,IACpC/B,KAAKmlI,WAAW9hI,KAInB6hI,oBAAoB7hI,GAC1B,OAAGrD,KAAKolI,2BAAmCplI,KAAKolI,2BACzCplI,KAAKolI,2BAA6B,IAAI5hI,SAAS2E,IACpD,MAAM0mB,EAAMxtB,SAASC,cAAc,OACnCutB,EAAIw2G,YAAc,aAClB,EAAAzlF,GAAA,IAA0B/wB,EAAK7uB,KAAKJ,QAAQyY,KAAK,GAAOtW,MAAK,KAC3D,IAAIujI,EACJ,GAAG,GAAApvH,UAAW,CACZ,MAAM7S,EAASiiI,EAAoBjkI,SAASC,cAAc,UAC1D+B,EAAOzB,MAAQitB,EAAIq9C,aACnB7oE,EAAOxB,OAASgtB,EAAIs9C,cACR9oE,EAAOqP,WAAW,MAC1BgsC,UAAU7vB,EAAK,EAAG,EAAGxrB,EAAOzB,MAAOyB,EAAOxB,aAE9CyjI,EAAoBz2G,EAItB7uB,KAAK2sE,QAAUtpE,EAAOqP,WAAW,MAAM6yH,cAAcD,EAAmB,YACxEn9H,UAKCq9H,2BAA2BniI,GAChC,OAAGrD,KAAKylI,kCAA0CzlI,KAAKylI,kCAChDzlI,KAAKylI,kCAAoC,IAAIjiI,SAAiB2E,IACnE9E,EAAOqiI,QAAQniF,IACb,MAAMoiF,EAAS3lI,KAAK4lI,UAAYjhF,IAAIC,gBAAgBrB,GACpDp7C,EAAQw9H,KACP,gBAIAx6H,QAAQ9H,GACbrD,KAAK8kI,SAAS90H,OAAO3M,GAEjBrD,KAAK8kI,SAAS5jI,QAChB,EAAA8Q,EAAA,GAAiB6yH,GAA8BG,UAAWhlI,MAEvDA,KAAK4lI,WACNjhF,IAAI0S,gBAAgBr3D,KAAK4lI,YAKxBT,WAAW9hI,GAChB,MAAM4H,EAAU5H,EAAOqP,WAAW,MAClCzH,EAAQ+6D,UAAYhmE,KAAK2sE,QACzB1hE,EAAQg7D,SAAS,EAAG,EAAG5iE,EAAOzB,MAAOyB,EAAOxB,QAIvCgkI,oBAAoBxiI,GACzBA,EAAOzB,MAAQ5B,KAAKJ,QAAQgC,MAAQuL,OAAOk3C,iBAC3ChhD,EAAOxB,OAAS7B,KAAKJ,QAAQiC,OAASsL,OAAOk3C,iBAAmB,IAG3DoiB,eACL,MAAMpjE,EAAShC,SAASC,cAAc,UAGtC,OAFAtB,KAAK8kI,SAASvjI,IAAI8B,GAClBrD,KAAK6lI,oBAAoBxiI,GAClBA,GApGM,GAAA2hI,UAA6C,GCgC/C,MAAMc,WAAa,IAsChCnmI,YACSg8F,EACA7nF,EACAgE,EACA84E,EACA3nF,EACAmT,EACAF,EACA0hB,EACA+lB,EACA1uC,EACAgyG,EACApxE,EACA0rD,EACAzgC,EACA5mB,EACApvC,EACAw/B,EACA0iD,EACAhkF,EACAq3H,EACAl5F,GAEPtnC,QAtBO,KAAA87F,aAAAA,EACA,KAAA7nF,gBAAAA,EACA,KAAAgE,eAAAA,EACA,KAAA84E,qBAAAA,EACA,KAAA3nF,mBAAAA,EACA,KAAAmT,gBAAAA,EACA,KAAAF,iBAAAA,EACA,KAAA0hB,kBAAAA,EACA,KAAA+lB,mBAAAA,EACA,KAAA1uC,gBAAAA,EACA,KAAAgyG,mBAAAA,EACA,KAAApxE,gBAAAA,EACA,KAAA0rD,WAAAA,EACA,KAAAzgC,iBAAAA,EACA,KAAA5mB,kBAAAA,EACA,KAAApvC,QAAAA,EACA,KAAAw/B,wBAAAA,EACA,KAAA0iD,gBAAAA,EACA,KAAAhkF,sBAAAA,EACA,KAAAq3H,qBAAAA,EACA,KAAAl5F,oBAAAA,EAIPnnC,KAAKC,KAAO,OAEZD,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,OAAQ,YAErCvB,KAAK+lI,aAAe1kI,SAASC,cAAc,OAC3CtB,KAAK+lI,aAAaxlI,UAAUgB,IAAI,mBAIhCvB,KAAK0nB,KAAM,EAAA2oC,EAAA,IAAO,OAAQ,KAAA21E,IAAe,UAAgB,WAAiB,YAG1EhmI,KAAKmJ,OAAS,MAEdnJ,KAAKoB,UAAUkD,OAAOtE,KAAK+lI,cAC3B/lI,KAAK27F,aAAa/8D,eAAet6B,OAAOtE,KAAKoB,WAE7CpB,KAAKimI,iBAAmB,EAGnBC,cAAc7tH,EAAa4pG,GAChC,MAAMt4C,EAAQ9+D,EAAA,mBAEd,IAAIjD,EAEJ,GAD4B+hE,EAAMD,WAAWlvB,QAAUmvB,EAAMD,WAAWG,OAASF,EAAMD,WAAWE,WAGtD,aAA1CvoE,SAASg0C,gBAAgB/xC,MAAMuoC,QAC/B7rC,KAAK0mE,mBACJ1mE,KAAKmmI,gBAIN,OAFAnmI,KAAKomI,eAAep9G,QAAQ68C,OAAS8D,EAAMD,WAAWlvB,MACtDx6C,KAAK0mE,iBAAiB92D,KAAK5P,KAAKomI,gBACzB5iI,QAAQ2E,UAGjB,MAAMs5B,IAAWzhC,KAAKimI,iBAEhBI,EAA2BrmI,KAAK0mE,iBAChC4/D,EAA0BtmI,KAAKmmI,gBAE/BI,GADyBvmI,KAAKomI,eACNpmI,KAAKwmI,eAEnCxmI,KAAK0mE,iBACH1mE,KAAKmmI,gBACLnmI,KAAKomI,eACLpmI,KAAKwmI,mBACLjgI,EAEF,MAAMqjE,EAAYD,EAAMD,WAAWE,WAAaD,EAAMD,WAAWE,UAAY,IACvE68D,IAAkB78D,GAAaA,EAAY,EAEjD,IAAIu8D,EAEAC,EA0BA1/D,EA3BA8/D,EAAgB5+H,MAAAA,OAAI,EAAJA,EAAMiiB,kBAE1B,IAAIjiB,EAIF,GAHAA,EAAOvG,SAASC,cAAc,OAC9BsG,EAAKrH,UAAUgB,IAAI,wBAEhB8W,EACD,GAAGuxD,EAAW,CACZhiE,EAAKrH,UAAUgB,IAAI,cAEnB,MAAMie,EAAOxf,KAAK27F,aAAa/8D,eAAenf,wBAC9C0mH,EAAkBnmI,KAAKmmI,gBAAkBtB,GAA8B6B,YAAY,CACjFruH,IAAAA,EACAzW,MAAO4d,EAAK5d,MACZC,OAAQ2d,EAAK3d,SAGf2kI,EAAgBxmI,KAAKwmI,cAAgBL,EAAgB1/D,eACrD+/D,EAAcjmI,UAAUgB,IAAI,8BAA+B,4CACnDooE,EAAMD,WAAWG,MACzBjiE,EAAKrH,UAAUgB,IAAI,iBAEbooE,EAAMD,WAAWlvB,OACzB5yC,EAAKrH,UAAUgB,IAAI,YAKvB,MAAMi5C,EAAQmvB,EAAMD,WAAWlvB,MAC/B,GAAGA,EAAO,CAER,MAAM,OAACn3C,EAAQqjE,iBAAkBigE,GAAqBvkE,GAA+BiK,OAAO7xB,GAC5FksB,EAAmB1mE,KAAK0mE,iBAAmBigE,EAC3CP,EAAiBpmI,KAAKomI,eAAiB/iI,EACvC+iI,EAAe7lI,UAAUgB,IAAI,8BAA+B,qCAEzDsJ,EAAA,oCACD67D,EAAiBH,eAAc,GAQhC4/D,IACoBM,EAAgBL,EAAiBI,GACzCljI,MAAMspC,YAAY,gBAAiB,GAAK5pC,KAAK4yB,IAAIg0C,IAGhE,MAAMvhE,EAAU,IAAI7E,SAAe2E,IACjC,MAAMy0C,EAAK,KACT,GAAG58C,KAAKimI,mBAAqBxkG,EAS3B,OARG0kG,GACDA,EAAgBh7H,QAAQq7H,QAGvB9/D,GACDA,EAAiBv7D,WAMrB,MAAMiS,EAAOpd,KAAK+lI,aAAahvF,iBAE/B,GAAG35B,IAASxV,EAEV,YADAO,IAIF,MAAM7D,EAAS,CAAC8hI,EAAgBK,OAAgBlgI,EAAYigI,GAAe18H,OAAOa,SAC/ErG,EAAOzD,QACR+G,EAAKtD,UAAUA,GAGjBtE,KAAK+lI,aAAazhI,OAAOsD,IAEzB,QAAcA,EAAM,cAAc,EAAOq6G,EAAsB,EAAN,IAAS7kG,EAAO,KACpEkpH,GACDA,EAAwBn7H,QAAQo7H,GAG/BF,GACDA,EAAyBl7H,UAG3BiS,EAAK5c,UACH,KAAM,GAEV2H,KAGCg+H,EAC4BA,EAAgBlB,eAAeuB,GACvCzkI,MAAK,KACxB,IAAIsG,EAEFA,EADCo+H,EACSN,EAAgBX,2BAA2BgB,GAAezkI,MAAKsW,IACpErY,KAAKimI,mBAAqBxkG,IAI7B2kG,EAAe9iI,MAAMgqE,gBAAkB,OAAOj1D,SAGtC7U,QAAQ2E,UAGpBE,EAAQtG,KAAK66C,MAEPvkC,GACR,EAAAunC,GAAA,IAAmBh4C,EAAMyQ,EAAKukC,GAE9BA,OAIJ,OAAO58C,KAAK4mI,qBAAuBpjI,QAAQ+lC,KAAK,EAC9C,EAAAlnC,GAAA,GAAM,KACNgG,IAIGw+H,QAAQ5mI,GACbD,KAAKC,KAAOA,EAEK,cAAdD,KAAKC,OACND,KAAKisD,mBAAqB,IAAMjsD,KAAKiJ,mBAAmB+iD,4BAA4BhsD,KAAKmJ,SAKtFyG,OAGL5P,KAAKi+F,OAAS,IAAImiC,GAAWpgI,KAAM,GAAiBA,KAAKiJ,mBAAoBjJ,KAAKoc,gBAAiBpc,KAAK8T,gBAAiB9T,KAAKsqC,wBAAyBtqC,KAAK49B,kBAAmB59B,KAAKiV,gBAAiBjV,KAAKqgI,sBAC1MrgI,KAAK45B,QAAU,IAAI4/D,GAAYx5F,KAAMA,KAAKiJ,mBAAoBjJ,KAAK2jD,mBAAoB3jD,KAAKiV,gBAAiBjV,KAAK4wF,qBAAsB5wF,KAAKkc,iBAAkBlc,KAAKoc,gBAAiBpc,KAAK49B,kBAAmB59B,KAAK8gE,iBAAkB9gE,KAAKgJ,sBAAuBhJ,KAAK8T,gBAAiB9T,KAAKmnC,qBAC3RnnC,KAAKD,MAAQ,IAAIinH,GAAUhnH,KAAMA,KAAKiJ,mBAAoBjJ,KAAKgJ,sBAAuBhJ,KAAK8X,eAAgB9X,KAAK8T,gBAAiB9T,KAAKoc,gBAAiBpc,KAAKinH,mBAAoBjnH,KAAK27F,aAAc37F,KAAK8gE,iBAAkB9gE,KAAKk6C,kBAAmBl6C,KAAKsqC,wBAAyBtqC,KAAKgtF,gBAAiBhtF,KAAKiV,gBAAiBjV,KAAK4wF,qBAAsB5wF,KAAK49B,mBAC5V59B,KAAK8zC,UAAY,IAAIia,GAAc/tD,KAAMA,KAAK45B,QAAS55B,KAAKD,MAAOC,KAAKiJ,oBACxEjJ,KAAK8mI,YAAc,IAAIrxB,GAAgBz1G,KAAK45B,QAAQo0B,iBAAkBhuD,KAAMA,KAAKiJ,mBAAoBjJ,KAAKoc,gBAAiBpc,KAAK61C,gBAAiB71C,KAAK8X,eAAgB9X,KAAKgJ,sBAAuBhJ,KAAKmnC,qBAEtL,SAAdnnC,KAAKC,MACND,KAAKi+F,OAAOykC,iBACZ1iI,KAAKi+F,OAAOoC,wBACU,WAAdrgG,KAAKC,KACbD,KAAKi+F,OAAO0F,yBACU,eAAd3jG,KAAKC,OACbD,KAAKi+F,OAAOykC,iBACZ1iI,KAAKi+F,OAAOulC,8BAGdxjI,KAAKi+F,OAAOh2E,YACZjoB,KAAKD,MAAMkoB,YAEM,SAAdjoB,KAAKC,MACND,KAAK45B,QAAQymE,uBACbrgG,KAAKD,MAAMsgG,wBACW,WAAdrgG,KAAKC,MACbD,KAAK45B,QAAQ+pE,yBACb3jG,KAAKD,MAAM4jG,0BACW,cAAd3jG,KAAKC,MACbD,KAAK45B,QAAQgqE,4BACb5jG,KAAKD,MAAMsgG,wBACW,eAAdrgG,KAAKC,OACbD,KAAK45B,QAAQymE,uBACbrgG,KAAKD,MAAMsgG,wBAGI,cAAdrgG,KAAKC,MAAyB,GAAA2c,oBAC/B5c,KAAK45B,QAAQ+oE,6BAGf3iG,KAAKoB,UAAUb,UAAUgB,IAAI,QAAUvB,KAAKC,MAC5CD,KAAKoB,UAAUkD,OAAOtE,KAAKi+F,OAAO78F,UAAWpB,KAAK45B,QAAQo0B,iBAAkBhuD,KAAKD,MAAM6jH,WAEvF5jH,KAAK45B,QAAQpqB,eAAejO,IAAIsJ,EAAA,QAAhC7K,CAA2C,kBAAkB,EAAEumC,YAAAA,EAAaC,UAAAA,MACvExmC,KAAKmJ,SAAWo9B,GACjBvmC,KAAKyvC,QAAQjJ,MAIjBxmC,KAAK45B,QAAQpqB,eAAejO,IAAIsJ,EAAA,QAAhC7K,CAA2C,eAAgBM,IACtDA,EAAE6I,SAAWnJ,KAAKmJ,QACnBnJ,KAAK27F,aAAalsD,aAKjBs3F,gBACL/mI,KAAK45B,QAAQzuB,UAGP67H,sBACJhnI,KAAKimI,iBACJjmI,KAAKmmI,kBACNnmI,KAAKmmI,gBAAgBh7H,QAAQnL,KAAKwmI,eAClCxmI,KAAKmmI,qBAAkB5/H,GAGtBvG,KAAK0mE,mBACN1mE,KAAK0mE,iBAAiBv7D,UACtBnL,KAAK0mE,sBAAmBngE,GAIrB+/F,UAGLtmG,KAAKi+F,OAAOqI,UACZtmG,KAAK45B,QAAQ0sE,UACbtmG,KAAKD,MAAMumG,UACXtmG,KAAK8mI,aAAe9mI,KAAK8mI,YAAYxgC,UAErCtmG,KAAKgnI,2BAEEhnI,KAAKi+F,cACLj+F,KAAK45B,eACL55B,KAAKD,aACLC,KAAK8zC,iBACL9zC,KAAK8mI,YAEZ9mI,KAAKoB,UAAUZ,SAKV2K,QAAQqmH,GAAY,GACzBxxH,KAAKD,MAAMoL,QAAQqmH,GACnBxxH,KAAK8zC,UAAU3oC,UAGVskC,QAAQtmC,EAAgBkzF,EAAoBpK,GAC7C9oF,EAEOnJ,KAAK60F,SACX70F,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd5P,KAAK60F,QAAS,GAPd70F,KAAK60F,YAAStuF,EAUhB,MAAMsgG,EAAW7mG,KAAKmJ,SAAWA,EACjC,GAAI09F,GAGG,GAAG7mG,KAAKg+F,eACb,YAHAnzF,EAAA,sBAAwB,gBAAiB7K,MACzCA,KAAKmJ,OAASA,GAAU,MAQ1B,IAAIA,EAOF,OANA,kBAA8B,GAC9BnJ,KAAKmL,SAAQ,GACbnL,KAAKi+F,OAAOxuD,QAAQtmC,GACpBnJ,KAAK45B,QAAQ6V,QAAQtmC,QACrB0B,EAAA,sBAAwB,eAAgB1B,GAM1C,IAAI09F,EAAU,CACZ,MAAMogC,EAAY,UAAuBpD,IACtCoD,GACDA,EAAUx3H,QAGZzP,KAAKk2G,WAAal2G,KAAKoc,gBAAgB85F,WAAW/sG,GAClDnJ,KAAK8mG,aAAe9mG,KAAKoc,gBAAgB0qF,aAAa39F,GACtDnJ,KAAKoB,UAAUb,UAAUsD,OAAO,cAAe7D,KAAKk2G,YAEpD,0BAAuC/sG,EAAQnJ,KAAK2M,UACpD3M,KAAKD,MAAM+7G,cACX97G,KAAK8zC,UAAU3oC,UACfnL,KAAKknI,uBAGPlnI,KAAKo0C,YAAcyyD,OAEDtgG,IAAf0rF,GAA4BjyF,KAAKixH,wBAClCh/B,EAAa,OAGf,MAAM1pF,EAASvI,KAAK45B,QAAQ6V,QAAQtmC,EAAQkzF,EAAWpK,GACvD,IAAI1pF,EACF,OAGF,MAAM,QAACF,GAAWE,EAIZy1F,EAAiBh+F,KAAKg+F,eAAiB31F,EAAQid,SAAQ,KACxDtlB,KAAKg+F,iBAAmBA,IACzBh+F,KAAKg+F,eAAiB,SAY1B,OARI6I,IACF,+BAA4C7mG,KAAKg+F,gBACjD,oCAAgD,IAM3Cz1F,EAGF2+H,uBACLlnI,KAAK+uB,aCndM,SAAyC5lB,GACtD,IAAIlJ,EAEAknI,EAAe,EAAGC,EAAe,EAAGC,EAAc,EACtD,MAAM7mE,EAAW31D,EAAA,iBAmBjB,OAlBI21D,EAASmX,gBAAgB38D,OAAO1G,UAAYnL,IAG1ClJ,EAFDkJ,EAAO+4B,SACL/4B,EAAO8wE,YACD,WAEA,UAED9wE,EAAO4zB,cACR,WAEA,SAGNyjC,EAASzxC,aAAa1oB,MAAMpG,KAAOknI,EAAe3mE,EAASmX,gBAAgB2vD,gBAC3E9mE,EAASzxC,aAAa9X,MAAMhX,KAAOmnI,EAAe5mE,EAASmX,gBAAgB4vD,gBAC3E/mE,EAASzxC,aAAa27C,KAAKzqE,KAAOonI,EAAc7mE,EAASmX,gBAAgBM,gBAGvE,CACL5xE,MAAO8gI,EACPlwH,MAAOmwH,EACP18D,KAAM28D,GDybcG,CAAgCxnI,KAAKmJ,QAGpDm1F,aAAavB,GAClB,OAAO/8F,KAAKyvC,QAAQzvC,KAAKmJ,OAAQ4zF,GAG5B2D,iBAAiBuG,EAAmBU,EAAiBtL,EAAmBpK,GAC7E,GAAGjyF,KAAKo0C,YAAa,OAErB,IAAIjrC,EAASnJ,KAAKmJ,OAClBnJ,KAAKo0C,aAAc,EAEnBp0C,KAAKmL,SAAQ,GAEbnL,KAAKi+F,OAAOxuD,QAAQtmC,GACpBnJ,KAAKi+F,OAAOyC,iBAAiBuG,EAAUU,EAAQtL,GAC/Cr8F,KAAK45B,QAAQ8mE,mBACb1gG,KAAKD,MAAM2gG,iBAAiBzO,GAE5B,wCAEAjyF,KAAK0nB,IAAI+/G,UAAU,QAAUt+H,EAAS,IAAMnJ,KAAKC,MAEjD4K,EAAA,sBAAwB,eAAgB1B,GACxCnJ,KAAK0nI,gBAAiB,EAGjBz7E,qBACL,OAAOjsD,KAAKiJ,mBAAmBgjD,mBAAmBjsD,KAAKmJ,QAGlD48C,WAAWh9C,GAChB,OAAO/I,KAAKiJ,mBAAmBijD,sBAAsBlsD,KAAKisD,qBAAsBljD,GAI3EqlD,aAAarlD,GAClB,OAAO/I,KAAKiJ,mBAAmBw0F,iBAAiBz9F,KAAK+lD,WAAWh9C,IAG3Dg/F,aACL,OAAO/nG,KAAKmJ,SAAW0B,EAAA,cAAkB7K,KAAKmJ,SAAW,OAAmBnJ,KAAKoc,gBAAgB2rF,WAAW/nG,KAAKmJ,QAG5G20E,WAAWrxE,GAChB,GAAIzM,KAAKmJ,OAET,GAAG4hB,EAAA,YACG/qB,KAAK2sF,OAGP3sF,KAAK2sF,OAAOt4C,SAAS5nC,GAFrBzM,KAAK2sF,OAAS,IAAIq3C,GAAWhkI,KAAKi+F,OAAQj+F,KAAMyM,OAI7C,CACL,IAAIyE,EAAM,UAAuB2yH,IAC7B3yH,IACFA,EAAM,IAAI2yH,GAAoB,KAGhC3yH,EAAIvB,KAAK3P,KAAKmJ,OAAQnJ,KAAK2M,SAAU3M,KAAK45B,QAAQ6hE,WAAYhvF,IAI3DwzF,QAAQ75F,GACb,OAAOpG,KAAKiJ,mBAAmB0+H,cAAc3nI,KAAKmJ,OAAQnJ,KAAK2M,SAAUvG,GAGpE6qH,sBACL,OAAOjxH,KAAKoc,gBAAgB4rF,MAAMhoG,KAAKmJ,UACpCnJ,KAAKiJ,mBAAmBs+F,cAAcvnG,KAAKmJ,UAC3CnJ,KAAKiJ,mBAAmBq6F,kBAAkBtjG,KAAKmJ,QAAQlD,QAAQpF,OAG7D+6G,0BACL,MAAO,CACLjvG,SAAU3M,KAAK2M,SACfwxG,aAAcn+G,KAAKD,MAAMo+G,aACzBtG,aAAc73G,KAAKD,MAAM83G,aACzBwC,WAAYr6G,KAAKD,MAAMs6G,WACvB8X,aAAcnyH,KAAKD,MAAMoyH,e,cE5hBhB,MAAMyV,GAcnBjoI,YAAoBg8F,GAAA,KAAAA,aAAAA,EAXZ,KAAA/5E,QAAiD,GAIjD,KAAAimH,eAAgB,EAChB,KAAAC,mBAAoB,EAGpB,KAAAC,eAAyB,EAiTzB,KAAAC,gBAAmB1nI,IAIzB,GAFAN,KAAK8nI,mBAAoB,EAEtB,GAAAlrH,mBAAoB,CAErB,GADAtc,IAAK,EAAAohB,EAAA,GAAYphB,GACY,GAA1BN,KAAK+nI,iBAIN,YADA/nI,KAAK6jC,OAFL7jC,KAAKioI,eAAejoI,KAAKg2F,YAO7Bh2F,KAAK0iB,QAxTC9S,OACN5P,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,iBAAkB,YAAa,QAE5DvB,KAAK6kB,QAAUxjB,SAASC,cAAc,OACtCtB,KAAK6kB,QAAQtkB,UAAUgB,IAAI,0BAE3B,MAAM2mI,EAAS7mI,SAASC,cAAc,OAChC6mI,EAAS9mI,SAASC,cAAc,OACtC4mI,EAAO3nI,UAAUgB,IAAI,wBACrB4mI,EAAO5nI,UAAUgB,IAAI,wBAET,CAAC,OAAQ,SAAU,YAAa,gBAAiB,YAAa,UAAW,QACjFwD,SAAQkzB,IACV,MAAM1Z,EAAS,EAAW0Z,EAAG,CAAC7oB,UAAU,IACxC84H,EAAO5jI,OAAOtE,KAAK4hB,QAAQqW,GAAK1Z,GAEvB,SAAN0Z,EACD1Z,EAAOle,iBAAiB,aAAcC,KACpC,EAAAohB,EAAA,GAAYphB,GACZN,KAAK27F,aAAat+D,KAAKt9B,MAAM+oH,cAAc7wF,GAC3Cj4B,KAAKooI,sBAOP,QAAiB7pH,GAASje,KACxB,EAAAohB,EAAA,GAAYphB,GACZN,KAAK+oH,iBACL/oH,KAAKooI,wBAKXpoI,KAAKqoI,eAAiB,EAAW,OAAQ,CAACj5H,UAAU,IACpDpP,KAAKsoI,UAAYjnI,SAASC,cAAc,UACxC,IAAAo4B,OAAM15B,KAAKsoI,UAAW,qCAAiC/hI,EAAW,eAClEvG,KAAKsoI,UAAU/nI,UAAUgB,IAAI,eAC7BvB,KAAKsoI,UAAUjoI,iBAAiB,WAAYC,IAC1C,MAAMmnE,GAASznE,KAAKsoI,UAAU5nI,MAAMG,UAAY,aAA2Bb,KAAKsoI,UAAU5nI,OAE7E,UAAVJ,EAAE6P,MACCs3D,EAQFznE,KAAKuoI,UAAUjoI,IAPZN,KAAKsoI,UAAU/nI,UAAUmT,SAAS,WACnC1T,KAAKsoI,UAAU/nI,UAAUC,OAAO,SAC3BR,KAAKsoI,UAAU55F,YAGtB1uC,KAAKsoI,UAAU/nI,UAAUgB,IAAI,cAOnCvB,KAAKsoI,UAAUjoI,iBAAiB,SAAUC,IACxC,MAAMmnE,EAAQznE,KAAKwoI,cAEnBxoI,KAAKsoI,UAAU/nI,UAAUsD,OAAO,WAAY4jE,GAC5CznE,KAAKsoI,UAAU/nI,UAAUC,OAAO,YAGlCR,KAAKqoI,eAAehoI,iBAAiB,aAAcC,KAEjD,EAAAohB,EAAA,GAAYphB,GACZN,KAAKoB,UAAUb,UAAUC,OAAO,WAEhCR,KAAKioI,iBACLjoI,KAAKyoI,qBACLzoI,KAAKooI,qBAGPpoI,KAAK0oI,gBAAkB,EAAW,kCAAmC,CAACt5H,UAAU,IAChFpP,KAAK0oI,gBAAgBroI,iBAAiB,aAAcC,IAElDN,KAAKuoI,UAAUjoI,MAGjB,MAAMqoI,EAAWtnI,SAASC,cAAc,OACxCqnI,EAASpoI,UAAUgB,IAAI,uCAEvB,MAAMqnI,EAAavnI,SAASC,cAAc,QACpCunI,EAAaxnI,SAASC,cAAc,QACpCwnI,EAAaznI,SAASC,cAAc,QAC1CsnI,EAAWroI,UAAUgB,IAAI,4BACzBsnI,EAAWtoI,UAAUgB,IAAI,4BACzBunI,EAAWvoI,UAAUgB,IAAI,4BACzB2mI,EAAO/jI,aAAaykI,EAAY5oI,KAAK4hB,QAAQ6b,MAC7CkrG,EAASrkI,OAAOwkI,EAAY9oI,KAAK0oI,iBACjCP,EAAO7jI,OAAOtE,KAAKqoI,eAAgBQ,EAAY7oI,KAAKsoI,UAAWK,GAG/D3oI,KAAK6kB,QAAQvgB,OAAO4jI,EAAQC,GAC5BnoI,KAAKoB,UAAUkD,OAAOtE,KAAK6kB,SAC3BxjB,SAASwY,KAAKvV,OAAOtE,KAAKoB,WAE1B+L,OAAO9M,iBAAiB,UAAU,KAChCL,KAAK6jC,UAIFklF,iBACD/oH,KAAKoB,WAAcpB,KAAKoB,UAAUb,UAAUmT,SAAS,eACvD1T,KAAK0iB,OAGP,MAAMnE,EAASve,KAAK4hB,QAAQ6b,KAC5Bz9B,KAAKoB,UAAUb,UAAUgB,IAAI,WAE7B,MAAMuyC,EAAYzyC,SAASsnD,eAG3B,GAFA3oD,KAAKg2F,WAAaliD,EAAUijD,WAAW,GAEpCx4E,EAAOhe,UAAUmT,SAAS,UAAW,CACtC,MACMtL,EADiBpI,KAAKg2F,WAAWktB,eACTj/G,cAC9BjE,KAAKsoI,UAAU5nI,MAAQ0H,EAAOwrD,UAE9B5zD,KAAKsoI,UAAU5nI,MAAQ,GAGzBV,KAAKyoI,oBAAmB,GAExBr7H,YAAW,KACTpN,KAAKsoI,UAAUh7H,UACd,KACHtN,KAAKsoI,UAAU/nI,UAAUsD,OAAO,WAAY7D,KAAKwoI,eAG3CD,UAAUjoI,IAChB,EAAAohB,EAAA,GAAYphB,GACZN,KAAKioI,iBACL,IAAI5vH,EAAMrY,KAAKsoI,UAAU5nI,MACtB2X,IAAQ,qBAAmCA,KAC5CA,EAAM,WAAaA,GAErBrY,KAAK27F,aAAat+D,KAAKt9B,MAAM+oH,cAAc,OAAQzwG,GACnDjL,YAAW,KACTpN,KAAK6jC,SACJ,GAGG2kG,cACN,OAAQxoI,KAAKsoI,UAAU5nI,MAAMG,UAAY,aAA2Bb,KAAKsoI,UAAU5nI,OAG7EunI,eAAez5D,EAAexuE,KAAKg2F,YACzC,MAAMliD,EAAY3mC,OAAOw7C,eACzB7U,EAAU+U,kBACV/U,EAAUigF,SAASvlD,GACnBxuE,KAAK27F,aAAat+D,KAAKt9B,MAAM2lG,aAAap4F,QAGrCu2B,OAGF7jC,KAAK4P,OAER5P,KAAKoB,UAAUb,UAAUC,OAAO,cAEhCa,SAASuN,oBAAoB,UAAW5O,KAAKgoI,iBAC7ChoI,KAAK8nI,mBAAoB,EAEzBn3H,EAAA,eAAqC,UAElC3Q,KAAK+oI,aAAax6H,aAAavO,KAAK+oI,aACvC/oI,KAAK+oI,YAAc57H,OAAOC,YAAW,KACnCpN,KAAK+oI,iBAAcxiI,EACnBvG,KAAKoB,UAAUb,UAAUgB,IAAI,QAC7BvB,KAAKoB,UAAUb,UAAUC,OAAO,aAC/B,MAGEwoI,wBACL,MAAMC,ECjNK,WACb,MAAMA,EAAgB,GAChBn1F,EAAY3mC,OAAOw7C,eACzB,IAAI,IAAIpjD,EAAI,EAAGA,EAAIuuC,EAAU+iD,aAActxF,EAAG,CAC5C,MAAMipE,EAAQ16B,EAAUijD,WAAWxxF,GACnC,IAAI,eAAC29G,EAAc,aAAEC,GAAgB30C,EAGrC,IAF6B,IAA1B20C,EAAa51B,WAAgB41B,EAAeA,EAAatvD,YAEtDqvD,GAAkBA,IAAmBC,GACzC8lB,EAAMnhI,KAAiC,IAA5Bo7G,EAAe31B,SAAiB21B,EAAiBA,EAAervD,YAC3EqvD,EAAiBA,EAAe7+G,YAG/B4kI,EAAMA,EAAMpoI,OAAS,KAAOsiH,GAC7B8lB,EAAMnhI,KAAKq7G,GAKf,OAAO8lB,EAAMn/H,QAAOw5G,KAAUA,ID8Ld4lB,GACR5rC,EAAU,IAAI,IAAI53F,IAAIujI,EAAMv+H,KAAI44G,GAAQA,EAAKv+F,eAG7CokH,EAAmC,IAAIzjI,IAY7C,OAXC43F,EAA0Bv4F,SAAQu+G,IACjC,IAAI,MAAMrjH,KAAQ,KAAc,CAC9B,MAAM00H,EAAM,KAAa10H,GACTqjH,EAAK8lB,QAAQzU,EAAIv+G,MAAQ,yBAC1BpW,KAAK27F,aAAat+D,KAAKt9B,MAAM2lG,cAC1CyjC,EAAe5nI,IAAIvB,KAAK4hB,QAAQ3hB,QAM/B,IAAIkpI,GAGNtU,wBACL,MAAMwU,EAAgBrpI,KAAKgpI,wBAE3B,IAAI,MAAMzjI,KAAKvF,KAAK4hB,QAAS,CAE3B,MAAMrD,EAASve,KAAK4hB,QAAQrc,GAC5BgZ,EAAOhe,UAAUsD,OAAO,SAAUwlI,EAAc9pG,SAAShhB,KAIrDkqH,mBAAmBa,GAAe,GACxC,MACM96D,EADYntE,SAASsnD,eACHouC,WAAW,GAE7BwyC,EAAWloI,SAASwY,KAAK4F,wBACzB+pH,EAAgBh7D,EAAM/uD,wBACtBgqH,EAAYzpI,KAAK27F,aAAat+D,KAAKt9B,MAAMyrH,YAAY/rG,wBAE3Dzf,KAAKoB,UAAUkC,MAAMquB,SAAW83G,EAAU7nI,MAAQ,KAElD,MAEM8nI,EAFcnyC,QAAehxF,EAAWvG,KAAK27F,aAAat+D,KAAKt9B,MAAM2lG,cAAc,EAAO8jC,GAE/DhqH,KAAKoZ,KAA8C,EAAhB2wG,EAAS3wG,IAIvE+wG,GAFe3pI,KAAKoB,UAAUb,UAAUmT,SAAS,WAAa1T,KAAK6kB,QAAQkyB,iBAAmB/2C,KAAK6kB,QAAQgF,mBAElFpK,wBACzBmZ,EAAM8wG,EAAeC,EAAU9nI,OAAS,EAExCgtC,EAAO46F,EAAU5oH,KACjBmoD,EAAQygE,EAAU5oH,KAAO4oH,EAAU7nI,MAASoB,KAAKC,IAAIwmI,EAAU7nI,MAAO+nI,EAAU/nI,OACtF,IAAIif,EACJ,GAAGyoH,EAAc,CACf,MAAMM,EAAgB5pI,KAAKoB,UAAUqe,wBACrCoB,GAAO,EAAAL,GAAA,GAAMopH,EAAc/oH,KAAMguB,EAAMm6B,OAClC,CACL,MAAM/qD,EAAIurH,EAAc3oH,MAAQ2oH,EAAc5nI,MAAQ+nI,EAAU/nI,OAAS,EACzEif,GAAO,EAAAL,GAAA,GAAMvC,EAAG4wB,EAAMm6B,GAOxBhpE,KAAKoB,UAAUkC,MAAMmd,UAAY,eAAeI,QAAW+X,UAGtDlW,OAML,GALG1iB,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGX4iG,KAED,YADAxyG,KAAK6jC,OAQP,QAJwBt9B,IAArBvG,KAAK+oI,aACNx6H,aAAavO,KAAK+oI,aAGjB/oI,KAAKoB,UAAUb,UAAUmT,SAAS,cACnC,OAGF1T,KAAK60H,wBAEL70H,KAAKoB,UAAUb,UAAUC,OAAO,WAChC,MAAMqpI,EAAc7pI,KAAKoB,UAAUb,UAAUmT,SAAS,QACnDm2H,IACD7pI,KAAKoB,UAAUb,UAAUC,OAAO,QAChCR,KAAKoB,UAAUb,UAAUgB,IAAI,kBAG/BvB,KAAKyoI,qBAEFoB,IACI7pI,KAAKoB,UAAUstC,WACpB1uC,KAAKoB,UAAUb,UAAUC,OAAO,kBAGlCR,KAAKoB,UAAUb,UAAUgB,IAAI,cAEzB,GAAA64E,WACFzpE,EAAA,WAAiC,CAC/B1Q,KAAM,SACN4R,MAAO,KACL7R,KAAK6jC,UAmCNimG,kBACF9pI,KAAK8nI,oBACR9nI,KAAK8nI,mBAAoB,EAIzBzmI,SAAShB,iBAAiB,UAAWL,KAAKgoI,gBAAiB,CAAC7sH,MAAM,KAG7DitH,kBACF,GAAAxrH,qBAAuB,GAAAD,WACxBtb,SAASuN,oBAAoB,UAAW5O,KAAKgoI,iBAC7C3mI,SAAShB,iBAAiB,WAAYC,KACpC,EAAAohB,EAAA,GAAYphB,GACZN,KAAK+nI,eAAiB,EACtB/nI,KAAK8nI,mBAAoB,EACzB9nI,KAAK8pI,oBACJ,CAAC3uH,MAAM,KAIP4uH,kBACF/pI,KAAK6nI,gBACR7nI,KAAK6nI,eAAgB,EACrBxmI,SAAShB,iBAAiB,mBAAoBC,IAG5C,GAAGe,SAASy1F,gBAAkB92F,KAAKsoI,UACjC,OAGF,MAAM5iC,EAAe1lG,KAAK27F,aAAat+D,KAAKt9B,MAAM2lG,aAClD,GAAGrkG,SAASy1F,gBAAkB4O,EAE5B,YADA1lG,KAAK6jC,OAIP,MAAMiQ,EAAYzyC,SAASsnD,eAC3B,GAAG6pD,GAAiB1+D,GAClB9zC,KAAK6jC,YAIP,GAAG,GAAAjnB,mBACD,GAAG,GAAAD,SACD3c,KAAK0iB,OACL1iB,KAAKyoI,yBACA,CACL,GAA2B,IAAxBzoI,KAAK+nI,eAEN,YADA/nI,KAAK+nI,eAAiB,GAIxB/nI,KAAKg2F,WAAaliD,EAAUijD,WAAW,GACvC/2F,KAAK8pI,uBAOC9pI,KAAKoB,WAAapB,KAAKoB,UAAUb,UAAUmT,SAAS,cAC5D1T,KAAKyoI,qBACG/iC,EAAah9E,QAAQ,WAC7B1oB,KAAK8pI,kBAEL9pI,KAAK0iB,YE5Zb,SAASsnH,GAAaC,EAAYC,EAAYC,EAAuBC,EAAsBC,EAAmBpsH,EAAWE,GACvH,MAAO,CAAC8rH,EAAI,IAAKC,EAAI,IACbC,EAAe,IACfC,EAAc,IACdC,EAAW,IACXpsH,EAAG,IAAKE,GAAI0K,KAAK,IAGZ,SAASyhH,GAAiBrsH,EAAWE,EAAWvc,EAAeC,EAAgB0oI,EAAYC,EAAYxZ,EAAYyZ,GAChI,MAAMhnF,EAAiB,GAwCvB,OArCAA,EAAK37C,KAAK,KAAOmW,EAAIrc,EAAQ,GAAK,IAAMuc,GAGxCslC,EAAK37C,KAAK,KAAOmW,EAAIrc,EAAQ4oI,IAE1BA,EAAK,GAEN/mF,EAAK37C,KAAK,IAAMkiI,GAAaQ,EAAIA,EAAI,EAAG,EAAG,EAAIvsH,EAAIrc,EAASuc,EAAIqsH,IAIlE/mF,EAAK37C,KAAK,KAAOqW,EAAItc,EAASmvH,IAE3BA,EAAK,GAENvtE,EAAK37C,KAAK,IAAMkiI,GAAahZ,EAAIA,EAAI,EAAG,EAAG,EAAI/yG,EAAIrc,EAAQovH,EAAM7yG,EAAItc,IAIvE4hD,EAAK37C,KAAK,KAAOmW,EAAIwsH,IAElBA,EAAK,GAENhnF,EAAK37C,KAAK,IAAMkiI,GAAaS,EAAIA,EAAI,EAAG,EAAG,EAAIxsH,EAAI,EAAKE,EAAItc,EAAS4oI,IAIvEhnF,EAAK37C,KAAK,KAAOqW,EAAIosH,IAElBA,EAAK,GAEN9mF,EAAK37C,KAAK,IAAMkiI,GAAaO,EAAIA,EAAI,EAAG,EAAG,EAAItsH,EAAIssH,EAAMpsH,EAAI,IAI/DslC,EAAK37C,KAAK,KAEH27C,EAAK56B,KAAK,KAGnB,uBAAkCyhH,GCtDnB,MAAMI,GAMnB/qI,YAAYohC,EAA+BnhC,GAmBzC,IAAI+qI,EAnBqC,KAAA/qI,QAAAA,EA+C3C,KAAAgrI,WAActqI,IACZN,KAAKoB,UAAUb,UAAUgB,IAAI,gBAI/B,KAAAspI,YAAevqI,IACbN,KAAKoB,UAAUb,UAAUC,OAAO,gBAIlC,KAAAsqI,OAAUxqI,IACRN,KAAKJ,QAAQkrI,OAAOxqI,IAnDpBN,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,OAAQ,aAErCvB,KAAK+qI,eAAiB1pI,SAASC,cAAc,OAC7CtB,KAAK+qI,eAAexqI,UAAUgB,IAAI,wBAElCvB,KAAK2qB,IAAMtpB,SAAS6pB,gBAAgB,6BAA8B,OAClElrB,KAAK2qB,IAAIpqB,UAAUgB,IAAI,gBAEvBvB,KAAK26H,KAAOt5H,SAAS6pB,gBAAgB,6BAA8B,QACnElrB,KAAK26H,KAAKp6H,UAAUgB,IAAI,qBAGrB3B,EAAQiP,OACT87H,EAAWtpI,SAASC,cAAc,OAClCqpI,EAASpqI,UAAUgB,IAAI,YAAa,SAAW3B,EAAQiP,OAGzD,MAAMm8H,EAAa3pI,SAASC,cAAc,OAI1C,IAAI2pI,EAHJD,EAAWzqI,UAAUgB,IAAI,eACzBypI,EAAW1mI,QAAO,IAAAsH,MAAKhM,EAAQsP,OAAQtP,EAAQsrI,aAG5CtrI,EAAQwwB,WACT66G,EAAe5pI,SAASC,cAAc,OACtC2pI,EAAa1qI,UAAUgB,IAAI,iBAC3B0pI,EAAa3mI,QAAO,IAAAsH,MAAKhM,EAAQwwB,YAGnCpwB,KAAK2qB,IAAIrmB,OAAOtE,KAAK26H,MACrB36H,KAAK+qI,eAAezmI,OAAOtE,KAAK2qB,KAEhC3qB,KAAKoB,UAAUkD,UAAU,CAACtE,KAAK+qI,eAAgBJ,EAAUK,EAAYC,GAAcnhI,OAAOa,UAC1Fo2B,EAASz8B,OAAOtE,KAAKoB,WAErBpB,KAAKoB,UAAUf,iBAAiB,WAAYL,KAAK4qI,YACjD5qI,KAAKoB,UAAUf,iBAAiB,YAAaL,KAAK6qI,aAClD7qI,KAAKoB,UAAUf,iBAAiB,OAAQL,KAAK8qI,QAiB/CxkC,iBACStmG,KAAKJ,QACZI,KAAKoB,UAAUZ,SACfR,KAAKoB,UAAUwN,oBAAoB,WAAY5O,KAAK4qI,YACpD5qI,KAAKoB,UAAUwN,oBAAoB,YAAa5O,KAAK6qI,aACrD7qI,KAAKoB,UAAUwN,oBAAoB,OAAQ5O,KAAK8qI,QAGlDK,UACE,MAAM3rH,EAAOxf,KAAK+qI,eAAetrH,wBACjCzf,KAAK2qB,IAAIxC,eAAe,KAAM,sBAAuB,QACrDnoB,KAAK2qB,IAAIxC,eAAe,KAAM,UAAW,OAAO3I,EAAK5d,SAAS4d,EAAK3d,UACnE7B,KAAK2qB,IAAIxC,eAAe,KAAM,QAAS,GAAG3I,EAAK5d,SAC/C5B,KAAK2qB,IAAIxC,eAAe,KAAM,SAAU,GAAG3I,EAAK3d,UAEhD,MAAMg4C,EAAS,GAKTjY,EAAI0oG,GADEzwF,EAAAA,EAFEr6B,EAAK5d,MAAQi4C,EACbr6B,EAAK3d,OAASg4C,EAEuBA,EAAQA,EAAQA,EAAQA,GAC3E75C,KAAK26H,KAAKxyG,eAAe,KAAM,IAAKyZ,ICzFzB,SAASwpG,GAAkBtiH,GACxCA,EAAS/jB,SAAQ0M,GAAMA,EAAGlR,UAAUgB,IAAI,oBAExC,WAAYQ,MAAK,KACf+mB,EAAS/jB,SAAQ0M,GAAMA,EAAGlR,UAAUC,OAAO,sB,+CCMhC,MAAM6qI,GASnB1rI,YAAY2/G,GACVt/G,KAAKsrI,UAAY,GACjBtrI,KAAKurI,UAAY,EAEjBvrI,KAAKwrI,EAAIlsB,EACTt/G,KAAK65C,OAAS,IAAIxvC,MAAMi1G,EAAI,GAE5Bt/G,KAAKyrI,WAAa,IAAIphI,MAAMi1G,EAAI,GAChCt/G,KAAKqlB,SAAW,IAAIhb,MAAMi1G,EAAI,GAC9Bt/G,KAAK0rI,MAAQ,IAAIrhI,MAAMi1G,EAAI,GAE3B,IAAI,IAAI/5G,EAAI,EAAGA,GAAK+5G,EAAG/5G,IACrBvF,KAAK2rI,aAAa3rI,KAAK65C,OAAQt0C,GAC/BvF,KAAK2rI,aAAa3rI,KAAKyrI,WAAYlmI,GACnCvF,KAAKqlB,SAAS9f,GAAK,EAIfomI,aAAa9xF,EAAgBt0C,GACnC,MAAM,UAAC+lI,EAAS,UAAEC,EAAS,MAAEG,GAAS1rI,KAEhC4rI,EAASN,EAAYC,EAC3B1xF,EAAOt0C,GAAKgmI,EAAYvoI,KAAKg6B,SAAW4uG,EACxCF,EAAMnmI,GAAK,KAAQ,KAAQvC,KAAKg6B,SAG1B6uG,mBACN,MAAM,OAAChyF,EAAM,WAAE4xF,EAAU,SAAEpmH,EAAQ,EAAEmmH,GAAKxrI,KAC1C,IAAI,IAAIuF,EAAI,EAAGA,EAAIimI,EAAGjmI,IACpBvF,KAAK2rI,aAAa9xF,EAAQt0C,GAC1BvF,KAAK2rI,aAAaF,EAAYlmI,GAC9B8f,EAAS9f,GAAK,EAIXsgC,OAAOimG,EAAmBC,GAC/B,MAAM,EAACP,EAAC,SAAEnmH,EAAQ,MAAEqmH,EAAK,OAAE7xF,EAAM,WAAE4xF,GAAczrI,KACjD,IAAI,IAAIuF,EAAI,EAAGA,GAAKimI,EAAGjmI,IACrB8f,EAAS9f,IArDU,GAqDHmmI,EAAMnmI,GAAkBumI,EAAYJ,EAAMnmI,GAtDvC,IAsDwDwmI,EACxE1mH,EAAS9f,IAAM,IAChB8f,EAAS9f,GAAK,EACds0C,EAAOt0C,GAAKkmI,EAAWlmI,GACvBvF,KAAK2rI,aAAaF,EAAYlmI,IAK7BymI,KAAKnrH,EAAc+X,EAAa4V,EAAe5tB,EAAgBvd,EAA2B4oI,EAAgDC,EAAmBC,GAClK,GAAG9oI,EAAOqP,WAAY,CACpB,MAAM2rC,EAAMh7C,EAAOqP,WAAW,MAI9B2rC,EAAI+tF,YACJ/tF,EAAIguF,OAAO79F,EAAO5tB,GAClBy9B,EAAIiuF,OAAOzrH,EAAMD,GAEjB,MAAM,OAACi5B,EAAM,WAAE4xF,EAAU,EAAED,GAAKxrI,KAChC,IAAI,IAAIuF,EAAI,EAAGA,GAAKimI,EAAGjmI,IACrB,GAAS,IAANA,EAAS,CACV,MAAM8f,EAAWrlB,KAAKqlB,SAAS9f,GAEzB4Y,GAAKya,GADAihB,EAAOt0C,IAAM,EAAM8f,GAAYomH,EAAWlmI,GAAK8f,IACnC8mH,EAAmBD,GAAa,EAAMC,GAC7D9tF,EAAIiuF,OAAOzrH,EAAM1C,OACZ,CACL,MAAMkH,EAAWrlB,KAAKqlB,SAAS9f,EAAI,GAC7BgnI,EAAK1yF,EAAOt0C,EAAI,IAAM,EAAM8f,GAAYomH,EAAWlmI,EAAI,GAAK8f,EAC5DmnH,EAAexsI,KAAKqlB,SAAS9f,GAE7BknI,GAAMj+F,EAAQ3tB,GAAQ2qH,GAAKjmI,EAAI,GAC/BmnI,GAAMl+F,EAAQ3tB,GAAQ2qH,EAAIjmI,EAC1BonI,EAAKF,GAAMC,EAAKD,GAAM,EAEtBG,GAAMh0G,EAAM2zG,GAAMJ,EAAmBD,GAAa,EAAMC,GACxDU,GAAMj0G,GANDihB,EAAOt0C,IAAM,EAAMinI,GAAgBf,EAAWlmI,GAAKinI,IAMtCL,EAAmBD,GAAa,EAAMC,GAC9D9tF,EAAIyuF,cAAcH,EAAIC,EAAID,EAAIE,EAAIH,EAAIG,GACnCtnI,IAAMimI,GACPntF,EAAIiuF,OAAO99F,EAAO5tB,GAMxBqrH,EAAM5tF,GACNA,EAAInuB,OACJmuB,EAAI0uF,cClGH,MAAMC,GAGXrtI,YAAmBstI,GAAA,KAAAA,QAAAA,EACjBjtI,KAAKktI,eAAeD,GAGfC,eAAeD,GACpBjtI,KAAKmtI,OAAS,CAAC9uF,EAAKx9B,EAAM+X,EAAK4V,EAAO5tB,KACpCy9B,EAAI2nB,UAAYgnE,GAAaI,oBAAoB/uF,EAAK4uF,EAASpsH,EAAM+X,EAAK4V,EAAO5tB,IAKrFuT,2BAA2BkqB,EAA+Bp+C,EAAwBotI,EAAYC,EAAYb,EAAYG,GACpH,MAAMh/F,EAAWyQ,EAAIkvF,qBAAqBF,EAAIC,EAAIb,EAAIG,GAgBtD,OAfG3sI,IAAS,qBACV2tC,EAAS4/F,aAAa,EAAG,WACzB5/F,EAAS4/F,aAAa,GAAI,WAC1B5/F,EAAS4/F,aAAa,EAAG,YACjBvtI,IAAS,cACjB2tC,EAAS4/F,aAAa,EAAG,WACzB5/F,EAAS4/F,aAAa,EAAG,YACjBvtI,IAAS,YACjB2tC,EAAS4/F,aAAa,EAAG,WACzB5/F,EAAS4/F,aAAa,EAAG,YACjBvtI,IAAS,kBACjB2tC,EAAS4/F,aAAa,EAAG,WACzB5/F,EAAS4/F,aAAa,EAAG,YAGpB5/F,EAGT/H,OAAOhkC,EAAgBD,EAAe6rI,EAAY3B,KAKrC,MAAM4B,GAmCnB/tI,cAmEQ,KAAAguI,8BAAiCrtI,IACvCN,KAAK4tI,UACL5tI,KAAK6tI,eAGC,KAAAC,aAAe,KAClB9tI,KAAK+tI,gBACNx/H,aAAavO,KAAK+tI,eAClB/tI,KAAK+tI,cAAgB,MAGvB/tI,KAAK6hG,UAAW,EAChB7hG,KAAKguI,eACLhuI,KAAK+tI,cAAgB5gI,OAAOC,YAAW,KACrCpN,KAAK6hG,UAAW,EAChB7hG,KAAKiuI,eACJ,MAWE,KAAAC,YAAc,KACnBluI,KAAKmuI,SAAU,EACfnuI,KAAKiuI,cAGA,KAAAG,WAAa,KAClBpuI,KAAKmuI,SAAU,GAGT,KAAAF,WAAa,KAChBjuI,KAAKquI,KAERruI,KAAKgsI,QAGC,KAAAA,KAAO,CAACzwB,GAAQ,KAEtB,GADAv7G,KAAKquI,IAAM,MACPruI,KAAKyuD,QACP,OAEF,MAAM,IAAC6/E,EAAG,KAAEC,EAAI,KAAEC,EAAI,MAAE1d,EAAK,KAAEjwG,EAAI,IAAE+X,EAAG,MAAE4V,EAAK,OAAE5tB,EAAM,aAAE6tH,EAAY,cAAEC,EAAa,QAAEP,EAAO,SAAEtsC,EAAQ,OAAEx+F,GAAUrD,KACnH,IAAImuI,IAAYtsC,GAAY7hG,KAAK2uI,iBAAmB,EAClD,OAMF,IAAIlB,EADYpzF,KAAKC,MACDt6C,KAAK4uI,eACtBnB,EAAK,KACNA,EAAK,IAIJztI,KAAK6uI,qBAAuB7uI,KAAK8rI,YAClC9rI,KAAK8rI,WAAa9rI,KAAK8uI,qBAAuBrB,EAC3CztI,KAAK8uI,qBAAuB,EAC1B9uI,KAAK8rI,UAAY9rI,KAAK6uI,qBACvB7uI,KAAK8rI,UAAY9rI,KAAK6uI,oBAGrB7uI,KAAK8rI,UAAY9rI,KAAK6uI,qBACvB7uI,KAAK8rI,UAAY9rI,KAAK6uI,qBAKzB7uI,KAAK6uI,qBAAuB7uI,KAAK+uI,aAClC/uI,KAAK+uI,YAAc/uI,KAAKgvI,sBAAwBvB,EAC7CztI,KAAKgvI,sBAAwB,EAC3BhvI,KAAK+uI,WAAa/uI,KAAK6uI,qBACxB7uI,KAAK+uI,WAAa/uI,KAAK6uI,oBAGtB7uI,KAAK+uI,WAAa/uI,KAAK6uI,qBACxB7uI,KAAK+uI,WAAa/uI,KAAK6uI,qBAK1BH,IACD1uI,KAAK2uI,iBAAmBlB,EAAK,IAC1BztI,KAAK2uI,gBAAkB,IACxB3uI,KAAK2uI,gBAAkB,EACvB3uI,KAAK0uI,cAAgB,OAIzB,MAAM,UAAC5C,EAAS,WAAEiD,EAAU,gBAAEJ,GAAmB3uI,KAE3CivI,EAAO,EAAIF,EAAaje,EACxBoe,EAAO,EAAIH,EAAaje,EAElBztH,EAAOqP,WAAW,MAC1BC,UAAU,EAAG,EAAGtP,EAAOzB,MAAOyB,EAAOxB,QAEzCysI,EAAI/C,UAAY,EAChB+C,EAAIhD,WAAa,EAAI,EAAIQ,GAAahb,EACtCyd,EAAKhD,UAAY,EACjBgD,EAAKjD,WAAa,EAAI,EAAIQ,GAAahb,EACvC0d,EAAKjD,UAAY,EACjBiD,EAAKlD,WAAa,EAAI,EAAIQ,GAAahb,EAEvCwd,EAAIzoG,OAAOimG,EAAW,IACtByC,EAAK1oG,OAAOimG,EAAW,IACvB0C,EAAK3oG,OAAOimG,EAAW,IAEvB,IAAI,IAAIvmI,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACzB,GAAS,IAANA,IAAYmpI,EACb,SAGF,IAAI3nE,EAAQ,EACRztC,EAAsB,KACjB,IAAN/zB,GACDwhE,EAAQ,EAAI4nE,EACZr1G,EAAQo1G,IAGR3nE,EAAQ2nE,EAAgBC,EAAkB,EAC1CF,EAAa5oG,OAAOjlB,EAASgY,EAAK4V,EAAQ3tB,EAAM4sH,EAAI3B,GACpDxyG,EAAQm1G,GAIV,MAAMU,EAAU9wF,IACdA,EAAI+wF,YAAc,GAAMroE,EACxBztC,EAAM6zG,OAAO9uF,EAAKx9B,EAAM+X,EAAK4V,EAAO5tB,IAEhCqrH,EAAS5tF,IACbA,EAAI+wF,YAAoB,IAAN7pI,EAAU,EAAIwhE,EAChCztC,EAAM6zG,OAAO9uF,EAAKx9B,EAAM+X,EAAK4V,EAAO5tB,IAGtC2tH,EAAKvC,KAAKnrH,EAAM+X,EAAMq2G,EAAMzgG,EAAO5tB,EAAQvd,EAAQ8rI,EAAQv2G,EAAK,GAChE41G,EAAKxC,KAAKnrH,EAAM+X,EAAMs2G,EAAM1gG,EAAO5tB,EAAQvd,EAAQ8rI,EAAQv2G,EAAK,GAChE01G,EAAItC,KAAKnrH,EAAM+X,EAAK4V,EAAO5tB,EAAQvd,EAAQ4oI,EAAOrzG,EAAK,GAGrD2iF,IACFv7G,KAAKquI,IAAM9qH,uBAAsB,IAAMvjB,KAAKgsI,WAIzC,KAAAqD,gBAAkB,CAACpC,EAA2BzoF,KACnD,MAAM,aAACiqF,EAAY,OAAEa,GAAUtvI,MAE5ByuI,MAAAA,OAAY,EAAZA,EAAcxB,WAAYA,IAI7BjtI,KAAK0uI,cAAgBlqF,EAAWiqF,EAAe,KAC/CzuI,KAAKyuI,aAAea,EAAO59H,IAAIu7H,GAC/BjtI,KAAK2uI,gBAAkB3uI,KAAK0uI,cAAgB,EAAM,IAlOlD1uI,KAAKmuI,SAAU,EACfnuI,KAAK6hG,UAAW,EAChB7hG,KAAK4uI,eAAiBv0F,KAAKC,MAC3Bt6C,KAAK8rI,UAAY,EACjB9rI,KAAK+uI,WAAa,EAElB/uI,KAAKsvI,OAAS,IAAIl+H,IAAI,CACpB,CAAC,aAA0B,IAAI47H,GAAa,eAC5C,CAAC,WAAwB,IAAIA,GAAa,aAC1C,CAAC,oBAAiC,IAAIA,GAAa,sBACnD,CAAC,gBAA6B,IAAIA,GAAa,oBAEjDhtI,KAAK0uI,cAAgB,KACrB1uI,KAAKyuI,aAAezuI,KAAKsvI,OAAO59H,IAAI,iBACpC1R,KAAK2uI,gBAAkB,EAGlBY,oBACFvvI,KAAKyuD,UAIRzuD,KAAKyuD,SAAU,EAGfthD,OAAO9M,iBAAiB,SAAUL,KAAK8tI,cACvC9tI,KAAKsW,MAAQnJ,OAAOqiI,WAAW,sCAC/BxvI,KAAKsW,MAAMjW,iBAAiB,SAAUL,KAAK2tI,+BAE3C3tI,KAAK4tI,UACL5tI,KAAK6tI,cAEL7tI,KAAKsuI,IAAM,IAAIjD,GAAiB,GAChCrrI,KAAKuuI,KAAO,IAAIlD,GAAiB,GACjCrrI,KAAKwuI,KAAO,IAAInD,GAAiB,GACjCrrI,KAAKyvI,aAAazvI,KAAK8rI,WAEvB9rI,KAAKgsI,QAGA0D,uBACL1vI,KAAKyuD,SAAU,EAGfthD,OAAOyB,oBAAoB,SAAU5O,KAAK8tI,cAC1C9tI,KAAKsW,MAAMjW,iBAAiB,SAAUL,KAAK2tI,+BAE3C,MAAM,OAACtqI,GAAUrD,KACLqD,EAAOqP,WAAW,MAC1BC,UAAU,EAAG,EAAGtP,EAAOzB,MAAOyB,EAAOxB,QAGnC+rI,UACN5tI,KAAK8wH,MAAQ3jH,OAAOk3C,iBACpBrkD,KAAK44B,IAAM,GAAK54B,KAAK8wH,MACrB9wH,KAAKwuC,OAASxuC,KAAKyuD,QAAUzuD,KAAKoB,UAAUgiC,YAAc,MAAQpjC,KAAK8wH,MACvE9wH,KAAK4gB,QAAU5gB,KAAKyuD,QAAUzuD,KAAKoB,UAAUwgG,aAAe,IAAM5hG,KAAK8wH,MACvE9wH,KAAK6gB,KAAO,EAAI7gB,KAAK8wH,MACrB9wH,KAAK2vI,gBAGCA,gBACN3vI,KAAKqD,OAAOzB,MAAQ5B,KAAKwuC,MACzBxuC,KAAKqD,OAAOxB,OAAS7B,KAAK4gB,OAsBpBotH,eACNhuI,KAAK8wH,MAAQ3jH,OAAOk3C,iBACpBrkD,KAAKwuC,MAAQxuC,KAAKoB,UAAUgiC,YAAcpjC,KAAK8wH,MAE/C9wH,KAAK6tI,cACL7tI,KAAKiuI,aA2IAwB,aAAa/uI,GAClB,MAAM,UAACorI,GAAa9rI,KACpBA,KAAK6uI,mBAAqBnuI,EAC1BV,KAAK8uI,sBAAwBpuI,EAAQorI,GAAa,IAClD9rI,KAAKgvI,uBAAyBtuI,EAAQorI,GAAa,IAG7C+B,cACN7tI,KAAK2vI,gBAGApmH,OAAOje,GACZ,MAAMlK,EAAYpB,KAAKoB,UAAYC,SAASC,cAAc,OAC1DF,EAAUb,UAAUgB,IAAI+J,GAExB,MAAMjI,EAASrD,KAAKqD,OAAShC,SAASC,cAAc,UAKpD,OAJA+B,EAAO9C,UAAUgB,IAAI+J,EAAY,WAEjClK,EAAUkD,OAAOjB,GAEVjC,GCvSX,MACA,GADyB,IAjClB,MAILzB,cACEK,KAAKk+E,MAAQ,GAEbrzE,EAAA,yBAA2B,gBAAgB,KACzC7K,KAAK4vI,mBAAgBrpI,EACrB,MAAM23E,EAAQl+E,KAAKk+E,MACnBl+E,KAAKk+E,MAAQ,GAEb,IAAI,IAAI34E,KAAK24E,EACXl+E,KAAK6vI,YAAYtqI,MAKhBsqI,YAAY/rI,GACjB,IAAIpD,EAAQV,KAAKk+E,MAAMp6E,GACvB,OAAGpD,IAICV,KAAK4vI,gBACP5vI,KAAK4vI,cAAgBziI,OAAO2iI,iBAAiBzuI,SAASg0C,kBAGxD30C,EAAQV,KAAK4vI,cAAcG,iBAAiB,KAAOjsI,GAAMoJ,OAClDlN,KAAKk+E,MAAMp6E,GAAQpD,KCHvB,MAAMsvI,GAKXrwI,YAAmBiI,EAAuBhI,GAAvB,KAAAgI,KAAAA,GACjB,EAAAX,EAAA,GAAWjH,KAAMJ,GAGZ8C,KAAKi6B,GACV,OAAO38B,KAAK4H,KAAKqoI,SAASjwI,KAAM28B,IAM7B,MAAMuzG,GAYXvwI,YAAmBkP,EAAmBjP,GAAnB,KAAAiP,KAAAA,EACjB7O,KAAK2B,UAAW,GAEhB,EAAAsF,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAK0sB,MAAQ1sB,KAAK0sB,MAAMhiB,KAAI9K,GAAWI,KAAKmwI,WAAWvwI,KAGlD4B,O,MACL,IAAIC,EAAczB,KAAKyB,YACvB,GAAGA,EACD,OAAOA,EAGT,MAAM,UAACL,EAAS,OAAEiC,EAAM,MAAEzB,EAAK,OAAEC,GAAU7B,KAAK6O,KA+BhD,OA9BApN,EAAcijD,GAAA,uBAAkC,CAC9CtjD,UAAAA,EACAiC,OAAAA,EACAzB,MAAAA,EACAC,OAAAA,EACAqvB,MAAO,OACPxvB,MAAM,EACNC,SAAuB,QAAb,EAAA3B,KAAK2B,gBAAQ,SACvByuI,UAAWpwI,KAAKowI,UAChBC,6BAA4C9pI,IAAnBvG,KAAKowI,UAC9B51F,MAAOx6C,KAAKw6C,MACZ81F,aAActwI,KAAKswI,cAClBtwI,KAAK8D,MAAM/B,MAAK6kB,GACV89B,GAAA,oBAA+B99B,KACrC7kB,MAAK6kB,IACN5mB,KAAK4mB,OAASA,EAEX5mB,KAAKuwI,iBACNvwI,KAAKuwI,iBACLvwI,KAAKuwI,oBAAiBhqI,GAGrBvG,KAAKwwI,gBACNxwI,KAAKwwI,gBACLxwI,KAAKwwI,mBAAgBjqI,MAIzBvG,KAAKyB,YAAcA,EACnBzB,KAAK6O,KAAK0f,aAAatpB,IAAIjF,KAAK8D,KAAMrC,GAC/BA,EAGF0uI,WAAWvwI,GAChB,OAAO,IAAIowI,GAAoBhwI,KAAMJ,GAGhC6wI,QAAQtpI,GACb,OAAGA,aAAiB6oI,GAA4B7oI,EACtB,iBAAZ,EAA6BnH,KAAK0sB,MAAMra,MAAK2vF,GAAQA,EAAKl+F,OAASqD,IACrEnH,KAAK0sB,MAAMvlB,GAGlB8oI,SAASjuC,EAA2BrlE,GACzC,OAAO38B,KAAK6O,KAAKohI,SAASjwI,KAAMgiG,EAAMrlE,IAI3B,MAAM+zG,GAWnB/wI,YAAYC,IACV,EAAAqH,EAAA,GAAWjH,KAAMJ,GAEbI,KAAKoB,YAAWpB,KAAKoB,UAAYC,SAASC,cAAc,QAC5DtB,KAAKoB,UAAUb,UAAUgB,IAAI,gBAE7B,MAAM,MAACK,EAAK,OAAEC,GAAU7B,KACxBA,KAAKoB,UAAUkC,MAAM1B,MAAQA,EAAQ,KACrC5B,KAAKoB,UAAUkC,MAAMzB,OAASA,EAAS,KAEvC,MAAMwB,EAASrD,KAAKqD,OAAShC,SAASC,cAAc,UACpD+B,EAAO9C,UAAUgB,IAAI,WACrB8B,EAAOzB,MAAQA,EACfyB,EAAOxB,OAASA,EAEhB7B,KAAK2H,MAAQ,IAAIyJ,IACjBpR,KAAKuuB,aAAe,IAAInd,IAGf3P,kBACT,OAAO+B,QAAQC,IAAI,IAAIzD,KAAKuuB,aAAaiV,WAAWzhC,KAAKwqB,GAAA,GAGpDokH,QAAQ7sI,GACb,OAAQA,GAA4B,IAApB9D,KAAK2H,MAAMzG,KAAgDlB,KAAK2H,MAAM+J,IAAI5N,GAAlD9D,KAAK2H,MAAM67B,SAAS78B,OAAOjG,MAG9Da,IAAI3B,GACT,MAAMgI,EAAO,IAAIsoI,GAAgBlwI,KAAMJ,GAGvC,OAFAI,KAAK2H,MAAM1C,IAAIrF,EAAQkE,KAAM8D,GAEtBA,EAGFqoI,SAASroI,EAAuBT,EAAkDw1B,GACvF,IAAI/0B,EAAKgf,OAKP,YAJAhf,EAAK4oI,cAAgB,KACnBxwI,KAAKiwI,SAASroI,EAAMT,EAAOw1B,KAM/B,MAAMqlE,EAAOp6F,EAAK6oI,QAAQtpI,GAC1BS,EAAKgf,OAAOqpH,SAAS,CACnB3lI,KAAMO,EAAA,qCAAyC7K,KAAKiiH,cAAgBjgB,EAAK4uC,WAAa5uC,EAAK6uC,SAC3F/7F,GAAIktD,EAAK6uC,SACTl0G,SAAAA,IAaGxI,0BAA0BtzB,EAAgBiwI,GAC/C,OAAO,IAAIzmI,MAAMxJ,GAAQqvB,KAAK,GAAGxlB,KAAI,CAACpB,EAAGnD,KACvC,MAAMyqI,EAAazqI,EAAM2qI,EACzB,MAAO,CAACF,WAAAA,EAAYC,SAAUD,EAAaE,EAAa,OC3LvD,MAAMC,WAMFL,GAQT/wI,YAAYC,GAOVC,MAAM,CACJ+B,MAAOhC,EAAQgC,MACfC,OAAQjC,EAAQiC,UAGlB,EAAAoF,EAAA,GAAWjH,KAAMJ,GAWZ4B,KAAKwvI,EAAiCC,GAC3C,GAAGjxI,KAAKw+B,OACN,OAAOx+B,KAAKyB,YAGdzB,KAAKw+B,QAAS,EACdx+B,KAAKgxI,UAAYA,EACjBhxI,KAAKixI,WAAaA,EAElB,MAAMjvC,EAAOhiG,KAAKywI,QAAQO,GACpBx2F,OAAuBj0C,IAAf0qI,GAA4BjxI,KAAKkxI,UAAYlxI,KAAKkxI,SAASD,GAEnErpI,EAAOo6F,EAAKp6F,KAClBA,EAAKwoI,UAAYpuC,EAAK6uC,SACtBjpI,EAAK4yC,MAAQA,EAEb,MAAM1X,EAAW,IAAI9iC,KAAK2H,MAAM67B,UAAU94B,KAAI9C,GAAQA,EAAKpG,SAC3D,OAAOgC,QAAQC,IAAIq/B,GAAU/gC,KAAKwqB,GAAA,GAM7BwO,SAASi2G,EAAiCC,EAAoCE,GAC/EnxI,KAAKw+B,QAAQx+B,KAAKwB,KAAKwvI,EAAWC,GAEtC,IAAIG,GAAmB,EAAOC,GAAoB,EAIlD,YAHiB9qI,IAAdyqI,EAAyBI,EAAmBpxI,KAAKsxI,aAAaN,EAAWC,EAAYE,QACjE5qI,IAAf0qI,IAA0BI,EAAoBrxI,KAAKuxI,cAAcN,IAElEG,GAAoBC,EAGtBC,aAAah4G,EAA6B23G,EAAoCt0G,GACnF,MAAOq0G,UAAWQ,GAAaxxI,KAC/B,OAAGwxI,IAAcl4G,OACO/yB,IAAf0qI,GAA2BjxI,KAAKuxI,cAAcN,SAGrC1qI,IAAf0qI,GACDjxI,KAAKuxI,cAAcN,GAAY,GAGjCjxI,KAAKgxI,UAAY13G,EAEJt5B,KAAKywI,QAAQn3G,EAAOk4G,GAC5B9uI,KAAKi6B,IAEH,GAGF40G,cAAcj4G,EAA8Bm4G,GAAiB,GAClE,MAAOR,WAAYO,GAAaxxI,KAChC,GAAGwxI,IAAcl4G,IAAUt5B,KAAKkxI,SAC9B,OAAO,EAGTlxI,KAAKixI,WAAa33G,EAElB,MAAM1xB,EAAO5H,KAAK2wI,UACZn2F,EAAQx6C,KAAKkxI,SAAS53G,EAAOk4G,GAC7BE,EAAS,KACb9pI,EAAKgf,OAAO8gD,SAASltB,EAAOi3F,IAS9B,OANG7pI,EAAKgf,OACN8qH,IAEA9pI,EAAK2oI,eAAiBmB,GAGjB,EAGFprC,UACLtmG,KAAK2H,MAAM5C,SAAQ6C,IACjBA,EAAKnG,YAAYM,MAAK,KACpB6F,EAAKgf,OAAOpmB,gBCtHL,MAAMmxI,WAAgCZ,GAGnDpxI,cACEE,MAAM,CACJ+B,MAAO,GACPC,OAAQ,GACR4uI,QAAS,CAACn3G,EAAOk4G,KACf,MAAMlC,EAASsC,GACf,IAAIC,EACJ,OAAOv4G,GACL,KAAKg2G,EAAOwC,KACVD,EAAWL,IAAclC,EAAOyC,MAAQ,gBAAkB,kBAC1D,MACF,KAAKzC,EAAOyC,MACVF,EAAWL,IAAclC,EAAOwC,KAAO,gBAAkB,OACzD,MACF,KAAKxC,EAAO0C,QACVH,EAAW,SAIf,OAAO7xI,KAAK2wI,UAAUF,QAAQoB,MAKlC7xI,KAAKoB,UAAUb,UAAUgB,IAAI+J,wCAoD7BtL,KAAKuB,IAAI,CACPuC,KAAM,cACN4oB,MApD0C,CAAC,CAC3CkkH,WAAY,EACZC,SAAU,GACV/sI,KAAM,iBACL,CACD8sI,WAAY,GACZC,SAAU,GACV/sI,KAAM,UACL,CACD8sI,WAAY,GACZC,SAAU,GACV/sI,KAAM,QACL,CACD8sI,WAAY,GACZC,SAAU,IACV/sI,KAAM,iBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,mBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,sBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,sBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,qBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,6BACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,wBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,sBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,qBC5EG,MAAMmuI,WAAsClB,GAIzDpxI,YAAoBuyI,GAClBryI,MAAM,CACJ+B,MAAO,GACPC,OAAQ,GACR4uI,QAAS,CAACn3G,EAAOk4G,KACf,MAAMlC,EAAS6C,GAEf,IAAIhrI,EACJ,OAAOmyB,GACL,KAAKg2G,EAAOwC,KACV3qI,EAAQ,EACR,MACF,KAAKmoI,EAAOyC,MACV5qI,EAAQqqI,IAAclC,EAAOwC,KAAO,EAAI,EACxC,MACF,KAAKxC,EAAO0C,QACV7qI,EAAQ,EAIZ,OAAOnH,KAAK2wI,UAAUF,QAAQtpI,IAEhC+pI,SAAUgB,EAAU,CAAC54G,EAAOk4G,ICoC3B,SAA8Bl4G,GACnC,MAAMg2G,EAAS6C,GACf,IAAI33F,EAAqB43F,EACzB,OAAO94G,GACL,KAAKg2G,EAAOwC,KACVM,EAAW,OACX,MACF,KAAK9C,EAAOyC,MACZ,KAAKzC,EAAO+C,aACZ,KAAK/C,EAAOgD,eACVF,EAAW94G,IAAUg2G,EAAOyC,MAAQ,YAAc,MAClD,MACF,KAAKzC,EAAO0C,QACVI,EAAW,QAOf,OAFA53F,EAAQunB,GADc,eAA6B,MAAQqwE,EAAW,gBAG/D53F,EDvDM+3F,CAAqBj5G,QAC1B/yB,IAxBY,KAAA2rI,QAAAA,EA4BlBlyI,KAAKoB,UAAUb,UAAUgB,IAAI+J,+CAE7B,MAAMohB,EAAQgkH,GAAY8B,mBAAmB,EAAG,IAChDxyI,KAAKuB,IAAI,CACPuC,KAAM,kBACN4oB,MAAAA,IAIGqO,SAASzB,GACd,OAAOz5B,MAAMk7B,SCSV,SAAiCzB,GACtC,MAAMg2G,EAAS6C,GACf,OAAO74G,GACL,KAAKg2G,EAAOgD,eACZ,KAAKhD,EAAO+C,aACV,OAAO/C,EAAOyC,MAChB,QACE,OAAOz4G,GDhBam5G,CAAwBn5G,GAAQA,IEtC1D,MAAM,GAAY,gCACH,MAAMo5G,GAGnB/yI,YAAoBgzI,GAAA,KAAAA,UAAAA,EAClB3yI,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,GAAY,cAGpCw5B,SAASzB,EAA2CuJ,GACzD,MAAMysG,EAAS6C,GACTS,EAAQ5yI,KAAK2yI,UAAU7oI,QAAO7J,KAAU4iC,EAAY5iC,KAAOyK,KAAIzK,IACnE,MAAM4yI,EAAgB,UAAkB,iBAAT5yI,EAA0B,kBAAoB,sBACvEsF,EAAIlE,SAASC,cAAc,KAEjC,OADAiE,EAAEhF,UAAUgB,IAAI,GAAY,QAAS,GAAY,SAAWtB,EAAM4yI,GAC3DttI,KAGT,IAAIutI,EAAuBC,EAC3B,GAAGz5G,IAAUg2G,EAAO+C,aAClBS,GAAW,IAAAlnI,MAAK,gCAChBmnI,EAAkB,gBACb,GAAGz5G,IAAUg2G,EAAO0C,QACzBc,GAAW,IAAAlnI,MAAK,6BAChBmnI,EAAkB,mBACb,GAAGz5G,IAAUg2G,EAAOwC,KACzBgB,GAAW,IAAAlnI,MAAK,+BAChBmnI,EAAkB,iBACb,IAAGlwG,EAAY9uB,QAAU6+H,EAAM/xI,OAEpC,YADA8E,EAAa3F,KAAKoB,UAAW,kBAAgCyhC,EAAY9uB,QAGzE++H,GAAW,IAAAlnI,MAAK,8BAChBmnI,EAAkB,eAGpB,MAAM9hF,EAAO5vD,SAASC,cAAc,QACpC2vD,EAAK1wD,UAAUgB,IAAI,GAAWwxI,GAC9B9hF,EAAK3sD,UAAUsuI,EAAOE,IAEtB,EAAA9kI,EAAA,GAAehO,KAAKoB,UAAW6vD,IC7BpB,MAAM+hF,WAAkC5sF,GASrDzmD,YAAoBolI,GAClBllI,MAAM,CACJqnD,SAAWvuC,GAAYA,EAAQkqB,YAAYhW,KAC3Co6B,SAAWtuC,IACTA,EAAQ9D,IAAI+wB,OAAOplC,SACnBR,KAAKizI,iBAAiBt6H,IAExBwuC,SAAWxuC,IACT,MAAM,YAACkqB,GAAelqB,EAEhB2gB,EAAQ45G,GAAkCrwG,GAEhDlqB,EAAQw6H,UAAUp4G,SAASzB,GAC3B3gB,EAAQ4uC,OAAOxsB,SAASzB,EAAOuJ,IAEjC2jB,OAAQ,CAAC7tC,EAASxS,KAChB6/C,GAAuBrtC,EAAQ9D,IAAI+wB,OAAQ5lC,KAAK0L,KAAMvF,IAExD4gD,gBAAkBD,IAChB,MAAM,IAACjyC,GAAO,gBAA+B,CAC3CC,OAAQgyC,EAAKj2C,GACbzP,WAAW,EACXsM,YAAY,EACZC,WAAY3N,KAAK2N,WACjBnC,WAAYxL,KAAKwL,WACjBoC,WAAW,EACXmH,cAAe/U,KAAK+U,cACpB0Z,cAAezuB,KAAKyuB,gBAItB5Z,EAAI+wB,OAAOrlC,UAAUgB,IADH,0BAGlB,MAAMshC,EAAckiG,EAASniG,aAAalxB,IAAIo1C,EAAKj2C,IAC7CuiI,EAAaF,GAAkCrwG,GAE/CswG,EAAY,IAAIlB,IAA8B,GAC9C1qF,EAAS,IAAImrF,GAAkC,CAAC,eAAgB,UAatE,OAXAS,EAAUp4G,SAASq4G,GACnB7rF,EAAOxsB,SAASq4G,EAAYvwG,IAE5B,EAAA70B,EAAA,GAAe6G,EAAIG,gBAAiBuyC,EAAOnmD,WAC3CyT,EAAI+wB,OAAOthC,OAAO6uI,EAAU/xI,WAE3B0lD,EAA2BjyC,IAAMA,EACjCiyC,EAA2BjkB,YAAcA,EACzCikB,EAA2BqsF,UAAYA,EACvCrsF,EAA2BS,OAASA,EAE9BT,GAETT,kBAAmB,QApDH,KAAA0+E,SAAAA,EALV,KAAAp3H,WAAa,GACb,KAAAoH,eAAgB,EAChB,KAAAvJ,YAAa,EACb,KAAAi8C,sBAA4E,CAAkBqzB,WAAY,IAyDlH96E,KAAK0L,KAAO,kBAAiC1L,KAAKynD,uBAG7C6+C,UACLtmG,KAAK8oB,SAAS/jB,SAAS4T,IACrB3Y,KAAKizI,iBAAiBt6H,MAIhBs6H,iBAAiBt6H,GACzBA,EAAQw6H,UAAU7sC,WC3FP,SAAS+sC,GAAoBp8H,GAC1C,MAAM5T,EAAShC,SAASC,cAAc,UACtC+B,EAAO9C,UAAUgB,IAAI,mBAErB8B,EAAOzB,MADM,GAEbyB,EAAOxB,OAFM,GAIb,MAAMw8C,EAAMh7C,EAAOqP,WAAW,MAC9B2rC,EAAIv0C,OAAS,YACb,MAAMwpI,EAAc,KAClBj1F,EAAIK,UAAUznC,EAAO,EAAG,EAAGA,EAAMsnG,WAAYtnG,EAAMunG,YAAa,EAAG,EAAGn7G,EAAOzB,MAAOyB,EAAOxB,SAU7F,OAPA,UAAQ,KACNyxI,IACOjwI,EAAOysB,eAGhBwjH,IAEOjwI,ECXT,MAAM,GAAY,+BAGH,MAAMkwI,GAWnB5zI,YAAoByc,EAA0C2oH,EAAoC1mB,GAA9E,KAAAjiG,gBAAAA,EAA0C,KAAA2oH,SAAAA,EAAoC,KAAA1mB,OAAAA,EAChGr+G,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,GAAY,cAEzCvB,KAAK6kC,KAAOxjC,SAASC,cAAc,OACnCtB,KAAK6kC,KAAKtkC,UAAUgB,IAAI,GAAY,SAEpCvB,KAAK6gB,KAAOxf,SAASC,cAAc,OACnCtB,KAAK6gB,KAAKtgB,UAAUgB,IAAI,GAAY,cAEpCvB,KAAKwuC,MAAQntC,SAASC,cAAc,OACpCtB,KAAKwuC,MAAMjuC,UAAUgB,IAAI,GAAY,eAErCvB,KAAK6kC,KAAKvgC,OAAOtE,KAAK6gB,KAAM7gB,KAAKwuC,OAEjCxuC,KAAKoB,UAAUkD,OAAOtE,KAAK6kC,MAGtB2uG,UAAU9yI,GACf,IAAIA,EAMF,YALGV,KAAKkP,SACNlP,KAAKkP,OAAO1O,SACZR,KAAKkP,YAAS3I,IAIX,GAAGvG,KAAKkP,OACb,OAIAlP,KAAKkP,OAAS7N,SAASC,cAAc,OACrCtB,KAAKkP,OAAO3O,UAAUgB,IAAI,GAAY,WAEtC,MAAMsN,EAAOxN,SAASC,cAAc,KACpCuN,EAAKtO,UAAUgB,IAAI,sBAAuB,aAC1CvB,KAAKkP,OAAO5K,OAAOuK,GAEnB7O,KAAKoB,UAAUkD,OAAOtE,KAAKkP,QAMxBukI,eAAe5wG,EAAmC5iC,EAAqCgX,GAC5F,IAAI0vB,EACD9D,EAAY7nB,OAAO41B,MACpBjK,GAAmB,IAAA/6B,MAAK,wBACxB+6B,EAAiBpmC,UAAUgB,IAAI,gBAE/BvB,KAAK0zI,UAAY,IAAI,KAAU,CAC7BvqI,OAAQnJ,KAAKoc,gBAAgBgtE,UAAUvmD,EAAY8C,QAGrDgB,EAAmB3mC,KAAK0zI,UAAU/6H,SAGpC3Y,KAAK2zI,8BAAgC,IAAI1B,IAA8B,GACvEjyI,KAAK4zI,2BAA6B,IAAIlB,GAAkC,CAACzyI,IAEzED,KAAK6gB,KAAKvc,OAAOqiC,EAAkB3mC,KAAK4zI,2BAA2BxyI,WAEnEpB,KAAKwuC,MAAMlqC,OAAOtE,KAAK2zI,8BAA8BvyI,WAErD6V,EAAM1W,UAAUgB,IAAI,GAAW,cAE5B0V,EAAMmC,QACPnC,EAAMvU,OAGR,MAAMW,EAASgwI,GAAoBp8H,GACnC5T,EAAO9C,UAAUgB,IAAI,GAAY,SAEjCvB,KAAKoB,UAAU8C,QAAQb,EAAQ4T,GAE/BjX,KAAK6zI,kBAAkBhxG,GAGlBgxG,kBAAkBhxG,GACvB,MAAMvJ,EAAQ45G,GAAkCrwG,GAEhD7iC,KAAK2zI,8BAA8B54G,SAASzB,GAC5Ct5B,KAAK4zI,2BAA2B74G,SAASzB,EAAOuJ,GAG3CyjE,UACLtmG,KAAK2zI,8BAA8BrtC,WCnGxB,MAAMwtC,WAA0C7xH,GAU7DtiB,YAAYC,GASVC,SACA,EAAAoH,EAAA,GAAWjH,KAAMJ,GAEjB,MACMwB,EAAYpB,KAAKoB,UAAYC,SAASC,cAAc,OAC1DtB,KAAKoB,UAAUb,UAAUgB,IAAI+J,2CAE7B1L,EAAQmhC,SAASz8B,OAAOlD,GAExBpB,KAAK+zI,qBAAuB,IAAI3iI,IAChCpR,KAAK62D,WAAa,IAAIzlD,IAEtB,MAAM,eAAC5B,GAAkBxP,KAEzBwP,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,0BAA0B,EAAEwkI,YAAAA,EAAanxG,YAAAA,MAClE7iC,KAAK+kI,SAASl0H,KAAOmjI,GACtBh0I,KAAK6zI,kBAAkBhxG,MAI3BrzB,EAAejO,IAAIvB,KAAK+kI,SAAxBv1H,CAAkC,UAAW6uG,IAC3Cr+G,KAAK+zI,qBAAqBhvI,SAAS2F,IACjCA,EAAI3F,SAAS4T,IACX3Y,KAAKi0I,kBAAkBt7H,EAAS0lG,aAKtC,QAAiBr+G,KAAKoB,WAAYd,IAChC,MAAMc,GAAY,EAAAyhB,GAAA,GAAgBviB,EAAEkY,OAAQ,0CAC5C,IAAIpX,EACF,OAGF,MAAMuX,EAAU3Y,KAAK62D,WAAWnlD,IAAItQ,GACjCpB,KAAK+kI,SAASmP,eAAiBv7H,EAAQ0lG,OAK1Cr+G,KAAK+kI,SAASoP,UAAUx7H,EAAQ0lG,QAJ9Br+G,KAAK+kI,SAASqP,aAKf,CAAC5kI,eAAAA,IAEJxP,KAAKq0I,YAAYr0I,KAAK+kI,UAEtB/kI,KAAK2iB,MAAM,CACThK,QAASvX,EACToO,eAAgBA,EAChBuT,uBAAwB,uBAIpBuxH,qBAAqB37H,EAA2Cu7H,GACtE,OAAOl0I,KAAKu0I,eAAiBL,GAAgBv7H,EAAQ0lG,SAAW61B,EAAeA,GAAgBv7H,EAAQ0lG,SAAW61B,EAG5GD,kBAAkBt7H,EAA2Cu7H,GACnE,MAAMM,EAAgBx0I,KAAKs0I,qBAAqB37H,EAASu7H,GACzDv7H,EAAQvX,UAAUb,UAAUsD,OAAO,gBAAiB2wI,GAEpD,MAAMC,EAAW97H,EAAQ0lG,SAAW61B,EACpCv7H,EAAQ66H,UAAUiB,GAGZZ,kBAAkBhxG,GACxB,MAAM15B,EAASnJ,KAAKoc,gBAAgBgtE,UAAUvmD,EAAY8C,MACpD+yB,EAAyC,CAAC,QAAS,gBACnDg8E,EAAch8E,EAAMitB,MAAK1lF,KAAU4iC,EAAY5iC,KACrD,IAAI00I,EAAsB30I,KAAK+zI,qBAAqBriI,IAAIvI,IACpDurI,GAAgBC,KAIhBA,GACF30I,KAAK+zI,qBAAqB9uI,IAAIkE,EAAQwrI,EAAsB,IAAIvjI,KAGlEsnD,EAAM3zD,SAAQ9E,IACZ,IAAI0Y,EAAUg8H,EAAoBjjI,IAAIzR,GACtC,MAAM20I,EAAmB/xG,EAAY5iC,GACrC,KAAK20I,KAAuBj8H,EAA5B,CAQA,GAAGi8H,EAAkB,CACnB,MAAMrsI,EAASvI,KAAK+kI,SAAS8P,qCAAqChyG,EAAa5iC,GAC/E,IAAIsI,EACF,OAGF,MAAM,MAAC0O,EAAK,OAAEonG,GAAU91G,EAExBoQ,EAAU,IAAI46H,GAAiCvzI,KAAKoc,gBAAiBpc,KAAK+kI,SAAU1mB,GAEpFr+G,KAAK62D,WAAW5xD,IAAI0T,EAAQvX,UAAWuX,GAEvC3Y,KAAKi0I,kBAAkBt7H,EAAS3Y,KAAK+kI,SAASmP,cAC9CS,EAAoB1vI,IAAIhF,EAAM0Y,GAC9BA,EAAQ86H,eAAe5wG,EAAa5iC,EAAMgX,GAE1CjX,KAAKoB,UAAU8C,QAAQyU,EAAQvX,gBAE/BuzI,EAAoB3kI,OAAO/P,GAC3B0Y,EAAQvX,UAAUZ,SAEdm0I,EAAoBzzI,OACtBlB,KAAK+zI,qBAAqB/jI,OAAO7G,GACjCnJ,KAAK62D,WAAW7mD,OAAO2I,EAAQvX,WAC/BuX,EAAQ2tF,WAIZtmG,KAAK80I,uBAnCAn8H,GACDA,EAAQk7H,kBAAkBhxG,OAsC1BiyG,kBACN,MAAMj0I,EAASb,KAAKoB,UAAU2K,kBAC9B/L,KAAKoB,UAAU4nB,QAAQnoB,OAAS,GAAKA,EACrCb,KAAKoB,UAAU4nB,QAAQqJ,OAASxxB,GAAU,EAAI,IAAkB,IAAXA,EAAe,IAAM,IAE1Eb,KAAKs5E,gBAAkBt5E,KAAKs5E,eAAez4E,GAGtCwzI,YAAYtP,GACjBA,EAASniG,aAAa79B,SAAS89B,IAC7B7iC,KAAK6zI,kBAAkBhxG,MAIpByjE,UACLtmG,KAAK62D,WAAW9xD,SAAS4T,IACvBA,EAAQ2tF,cChJP,MAAMyuC,GAYXp1I,YAAYC,GA8GJ,KAAAo1I,mBAAqB,KAC3B,MAAM5pC,EAAQ,eAAuB6pC,IAAgB,GAClD7pC,GACDA,EAAMvnE,OAGRh5B,EAAA,sBAAwB,gBAAiB,CACvC1B,OAAQnJ,KAAKk1I,gBAIT,KAAAC,uBAA0Bt6H,IAChC7a,KAAKqgI,qBAAqB+U,gBAAgBp1I,KAAK+kI,SAASl0H,GAAI7Q,KAAK6iC,YAAa,CAC5EhoB,MAAAA,KAnHF7a,KAAK4hB,QAAU,CAAC,CACd/S,KAAM,mBACNoS,KAAM,qBACNvI,OAAQ,IAAM1Y,KAAKq1I,eAAiBr1I,KAAK6iC,YAAY7nB,OAAOs6H,gBAC5Dp0H,QAAS,IAAMlhB,KAAKm1I,wBAAuB,IAC1C,CACDtmI,KAAM,gBACNoS,KAAM,uBACNvI,OAAQ,IAAM1Y,KAAKq1I,gBAAkBr1I,KAAK6iC,YAAY7nB,OAAOs6H,gBAC7Dp0H,QAAS,IAAMlhB,KAAKm1I,wBAAuB,IAC1C,CACDtmI,KAAM,mBACNoS,KAAM,sBACNvI,OAAQ,KAAO1Y,KAAKq1I,gBAAkBr1I,KAAK6iC,YAAY7nB,OAAOu6H,aAC9Dr0H,QAAS,IAAMlhB,KAAKm1I,wBAAuB,IAC1C,CACDtmI,KAAM,gBACNoS,KAAM,wBACNvI,OAAQ,KAAO1Y,KAAKq1I,eAAiBr1I,KAAK6iC,YAAY7nB,OAAOu6H,aAC7Dr0H,QAAS,IAAMlhB,KAAKm1I,wBAAuB,IAC1C,CACDtmI,KAAM,aACNoS,KAAM,wBACNvI,OAAQ,KAAM,EACdwI,QAASlhB,KAAKg1I,oBACb,CACDnmI,KAAM,oBACNoS,KAAM,uBACNvI,OAAQ,IAAM1Y,KAAK8T,gBAAgBy0C,UAAUvoD,KAAKmU,OAAQ,aAC1D+M,QAAS,KACPo1D,GAAkB,CAChBntE,OAAQnJ,KAAKk1I,aACb7lI,MAAO,IAAI,KAAU,CAAClG,OAAQnJ,KAAKk1I,eAAev8H,QAClDyjB,mBAAoBp8B,KAAK8T,gBAAgBipB,YAAY/8B,KAAKmU,QAAU,uCAAyC,+BAC7GooB,oBAAqB,CAAC,IAAI,KAAU,CAACpzB,OAAQnJ,KAAKk1I,eAAev8H,SACjE4F,OAAQ,CACNkb,QAAS,kCACTuN,UAAU,KAEXjlC,MAAK,KACN/B,KAAK8T,gBAAgB0hI,aAAax1I,KAAKmU,OAAQnU,KAAKk1I,gBACnD3oH,GAAA,MAIP,MAAM,eAAC/c,GAAkB5P,EACzBI,KAAK8T,gBAAkBlU,EAAQkU,gBAC/B9T,KAAKoc,gBAAkBxc,EAAQwc,gBAC/Bpc,KAAKqgI,qBAAuBzgI,EAAQygI,qBACpCrgI,KAAK+kI,SAAWnlI,EAAQmlI,SACxB/kI,KAAKmU,OAASnU,KAAK+kI,SAAS5wH,OAE5BnU,KAAK2Y,QAAU,GAAW3Y,KAAK4hB,QAASpS,GACxCxP,KAAK2Y,QAAQpY,UAAUgB,IAAI,8BAA+B,UAE1D,QAA0B3B,EAAQ25G,kBAAmBj5G,IACnD,MAAMigC,GAAK,EAAA1d,GAAA,GAAgBviB,EAAEkY,OAAQ,0BACrC,IAAI+nB,EACF,OAGCvgC,KAAK2Y,QAAQ1U,gBAAkB88B,GAChCA,EAASz8B,OAAOtE,KAAK2Y,SAGvB,MAAMxP,EAASnJ,KAAKk1I,aAAe30G,EAAGvX,QAAQ7f,OAAO8f,WACrDjpB,KAAK6iC,YAAc7iC,KAAK+kI,SAAS0Q,uBAAuBtsI,GACrDnJ,KAAK6iC,YAAY7nB,OAAO41B,OAI3B5wC,KAAKq1I,cAAgBr1I,KAAK8T,gBAAgBy0C,UAAUvoD,KAAKmU,OAAQ,eAEjEnU,KAAK4hB,QAAQ7c,SAAQwZ,IACnBA,EAAO5F,QAAQpY,UAAUsD,OAAO,QAAS0a,EAAO7F,OAAOvP,QAGzD,EAAAuY,EAAA,GAAYphB,IACZ,QAAcA,EAAiBoe,QAAWpe,EAAiBoe,QAAQ,GAAKpe,EAAiBN,KAAK2Y,QAAS,UACvG,QAAY3Y,KAAK2Y,YAChBnJ,GAEHA,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,0BAA0B,EAAEwkI,YAAAA,EAAanxG,YAAAA,MACrE,GAAG7iC,KAAK+kI,SAASl0H,KAAOmjI,EAAa,CACnC,MAAM7qI,EAASnJ,KAAKoc,gBAAgBgtE,UAAUvmD,EAAY8C,MACvD3lC,KAAKk1I,eAAiB/rI,IACvB,cAKN,IAAI43B,EAAwB1/B,SAASwY,MACrC,SAAsBxY,SAASwY,MAAM,KACnC,MAAMmN,GAAS,WACf+Z,EAAW/Z,EAAU,eAAuBiuH,IAAqC,GAAGS,eAAgBr0I,SAASwY,KAEzGmN,IACF,YAEDxX,IAqBQ,MAAMmmI,GAWnBh2I,YAAYC,IAQV,EAAAqH,EAAA,GAAWjH,KAAMJ,GAEjB,MAAM0L,EAAY,0BAEZsB,EAAa,IAAI,UAAWrG,GAClCqG,EAAWxL,UAAUb,UAAUgB,IAAI+J,EAAY,eAE/C,MAAMlK,EAAYpB,KAAKoB,UAAYC,SAASC,cAAc,OAC1DF,EAAUb,UAAUgB,IAAI+J,GAIxB,MAAM4vE,EAAal7E,KAAKk7E,WAAa,IAAI83D,GAA0BhzI,KAAK+kI,WAElE,SAACA,EAAQ,eAAEv1H,GAAkBxP,KACnCA,KAAK8mI,YAAc,IAAIiO,GAAgC,OAAD,wBACjDn1I,GAAO,CACV25G,iBAAkBr+B,EAAWxvE,KAC7B8D,eAAAA,EACAu1H,SAAAA,KAGF/kI,KAAK41I,2BAA6B,IAAI9B,GAAkC,OAAD,wBAClEl0I,GAAO,CACVmhC,SAAUn0B,EAAWxL,UACrBmzI,eAAe,KAGjB3nI,EAAWtI,OAAqB42E,EAAWxvE,MAC3CtK,EAAUkD,OAAOsI,EAAWxL,WAE5BxB,EAAQmhC,SAASz8B,OAAOlD,GAExBoO,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,0BAA0B,EAAEwkI,YAAAA,EAAanxG,YAAAA,MAClE7iC,KAAK+kI,SAASl0H,KAAOmjI,GACtBh0I,KAAK6zI,kBAAkBhxG,MAIF,IAAIvE,GAAiB,CAC5C1xB,WAAAA,EACA6xB,WAAY,IACHz+B,KAAKqgI,qBAAqBwV,yBAAyB71I,KAAK+kI,SAASl0H,IAAI9O,MAAK,EAAE6gC,aAAAA,EAAcb,MAAAA,MAC/Fa,EAAa79B,SAAQ89B,IACnB7iC,KAAK6zI,kBAAkBhxG,MAGlBd,OAKb/hC,KAAKq0I,YAAYtP,GAGX8O,kBAAkBhxG,GACxB,MAAM15B,EAASnJ,KAAKoc,gBAAgBgtE,UAAUvmD,EAAY8C,MACpD97B,EAAM7J,KAAKk7E,WAAWrxE,IAAIV,GAC7B05B,EAAY7nB,OAAO6F,KACjBhX,GACD7J,KAAKk7E,WAAWlrE,OAAO7G,GAMvBU,EAKJ7J,KAAKk7E,WAAWr1C,OAAO18B,GAJrBnJ,KAAKk7E,WAAW35E,IAAI4H,GAOjBkrI,YAAYtP,GAiBjBA,EAASniG,aAAa79B,SAAS89B,IAC7B7iC,KAAK6zI,kBAAkBhxG,MAIpByjE,UACLtmG,KAAKk7E,WAAWorB,UAChBtmG,KAAK41I,2BAA2BtvC,WCnRrB,MAAMwvC,GAGnBn2I,YAAoBohC,GAAA,KAAAA,SAAAA,EAClB/gC,KAAK+1I,gBAAkB,IAAI,sBAAiB,CAC1C5lI,IAAK,gCAGPnQ,KAAK+1I,gBAAgBp9H,QAAQpY,UAAUgB,IAAI,0BAGtC89C,SACLr/C,KAAK+1I,gBAAgBp9H,QAAQnY,SAGxBqlC,OAAOk/F,GACZ,MAAM,MAACzrG,GAASyrG,EAEhB,IAAI50H,EAAkB3L,EACnB80B,IAAU,gBACXnpB,EAAM,+BAENA,EAAM,2BACN3L,EAAO,CAAEugI,EAASjE,UAAkCxsE,qBAGtD,MAAM,gBAACyhF,GAAmB/1I,KAC1B+1I,EAAgB1+D,iBAAiB,CAC/BlnE,IAAAA,EACA3L,KAAAA,IAGExE,KAAK+1I,gBAAgBp9H,QAAQ1U,eAC/BjE,KAAK+gC,SAASz8B,OAAOtE,KAAK+1I,gBAAgBp9H,UChCjC,MAAMq9H,GAGnBr2I,YAAoBohC,GAAA,KAAAA,SAAAA,EAClB/gC,KAAK0zI,UAAY,IAAI,KAAU,CAACvqI,OAAQ,IAGnC08B,OAAOk/F,GACZ,MAAM,UAAC2O,EAAS,SAAE3yG,GAAY/gC,KACxB8gI,EAAYiE,EAASjE,UACrB33H,EAAS47H,EAAS5wH,OAAO8U,UAAS,GACrC63G,EAAUzxH,MACX1J,EAAao7B,EAAU,kBAAgC+/F,EAAUzxH,SAE9DqkI,EAAUvqI,SAAWA,IACtBuqI,EAAUvqI,OAASA,EACnBuqI,EAAU7tG,UAGT6tG,EAAU/6H,QAAQ1U,gBAAkB88B,GACrCA,EAASz8B,OAAOovI,EAAU/6H,WChClC,MAEA,MAFuC,qBAA+B,OAATzD,gBAAS,IAATA,eAAS,EAATA,UAAW+gI,eAAgB,KCWzE,SAAS76D,GAAW9vE,EAAmBkE,EAAgC5P,GAQpF,MAAMs2I,EAAa5qI,EAAY,UACzB6qI,EAAY90I,SAASC,cAAc,OACzC60I,EAAU51I,UAAUgB,IAAI20I,EAAY,cAAe,eAEhDt2I,EAAQiP,MACTsnI,EAAU51I,UAAUgB,IAAI,SAAW3B,EAAQiP,MAGzCjP,EAAQwP,WACV,EAAAiS,GAAAA,QAAO80H,GAGNv2I,EAAQonC,UACTmvG,EAAU51I,UAAUgB,IAAI20I,EAAa,QAGpCt2I,EAAQw2I,WACTD,EAAU51I,UAAUgB,IAAI20I,EAAa,UAGpCt2I,EAAQ+8B,WACT,QAAiBw5G,EAAWv2I,EAAQ+8B,SAAU,CAACntB,eAAAA,IAGjD,IAAI07B,EAAMirG,EACV,GAAGv2I,EAAQqhB,KAAM,CACf,MAAMgQ,EAAM5vB,SAASC,cAAc,OACnC2vB,EAAI1wB,UAAUgB,IAAI20I,EAAa,aAAc,yBAE7C,MAAMv6F,EAAkC,iBAAlB/7C,EAAY,MAAiB,IAAAgM,MAAKhM,EAAQqhB,MAAQrhB,EAAQqhB,KAChF06B,EAAOp7C,UAAUgB,IAAI20I,EAAa,QAAS,oBAE3CjlH,EAAI3sB,OAAO6xI,EAAWx6F,GAEtBzQ,EAAMja,EAGR,OAAOia,EClCT,MAAM,GAAY,kBACZmrG,GAAyB,iCAShB,MAAMC,WAAuB,IAgB1C32I,YAAYC,GACVC,OAAM,GAYA,KAAA0hI,SAAW,KACjBvhI,KAAKu2I,gBACLv2I,KAAKw2I,cACLx2I,KAAKwiD,gBAdL,EAAAv7C,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAK44B,IAAM54B,KAAK6gB,KAAO7gB,KAAK4B,MAAQ5B,KAAK6B,OAAS,EAClD7B,KAAK2Y,QAAQpY,UAAUgB,IAAI,IAE3BvB,KAAKy2I,oBACLz2I,KAAK02I,kBAEL3rH,EAAA,oBAA4B,SAAU/qB,KAAKuhI,UAStCoV,kBACL32I,KAAK2Y,QAAQpY,UAAUC,OAAO,IAE3BR,KAAK42I,UACN52I,KAAK42I,SAAS7xI,SAAQklF,IACpBA,EAAQzpF,YAKP8lG,UACLv7E,EAAA,uBAA+B,SAAU/qB,KAAKuhI,UAC9CvhI,KAAK8uC,aAAa/tB,kBAGZ01H,oBAENz2I,KAAK42I,SADuB,CAAC,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,MAC7ClsI,KAAIi3C,IACxB,MAAM1wB,EAAM5vB,SAASC,cAAc,OAInC,OAHA2vB,EAAIjI,QAAQ24B,KAAOA,EACnB1wB,EAAI1wB,UAAUgB,IAAI80I,GAAwBA,GAAyB,SAAW10F,GAC9E3hD,KAAK2Y,QAAQrU,OAAO2sB,GACbA,KAIHylH,kBACN,IAAIG,EAAkBC,EAAmBC,EAAoBC,EAAqBC,EAClF,MAAMnoG,EAAe9uC,KAAK8uC,aAAe,IAAIlD,GAAa,CACxDjzB,QAAS3Y,KAAK2Y,QACdo0B,QAAS,CAACL,EAAOC,EAAOrsC,KAKtB,GAJAosC,IAAU,EACVC,IAAU,EAGPsqG,EAAc,CACf,GAAGA,EAAa13G,SAAS,MAAQ03G,EAAa13G,SAAS,KAAM,CAC3D,MAAM23G,EAAcD,EAAa13G,SAAS,MAAQmN,EAAQ,GAAKuqG,EAAa13G,SAAS,MAAQmN,EAAQ,EAC/FyqG,EAAan0I,KAAK4yB,IAAI8W,IAAUwqG,EAAc,GAAK,GAEnDE,EAAcH,EAAa13G,SAAS,KAAOiC,GAAA,QAAmBs1G,EAAYC,EAAaD,EAC7F92I,KAAK4B,MAAQoB,KAAKC,IAAIm0I,EAAaL,EAAaI,GAGlD,GAAGF,EAAa13G,SAAS,MAAQ03G,EAAa13G,SAAS,KAAM,CAC3D,MAAM23G,EAAcD,EAAa13G,SAAS,MAAQoN,EAAQ,GAAKsqG,EAAa13G,SAAS,MAAQoN,EAAQ,EAC/FwqG,EAAan0I,KAAK4yB,IAAI+W,IAAUuqG,EAAc,GAAK,GAEnDE,EAAcH,EAAa13G,SAAS,KAAOiC,GAAA,SAAoBq1G,EAAWG,EAAcH,EAC9F72I,KAAK6B,OAASmB,KAAKC,IAAIm0I,EAAaJ,EAAcG,GAGpDn3I,KAAKu2I,gBAEFU,EAAa13G,SAAS,OACvBv/B,KAAK6gB,KAAO7d,KAAKC,IAAI6zI,EAAYC,EAAa/2I,KAAK4xB,SAAUklH,EAAYpqG,IAGxEuqG,EAAa13G,SAAS,OACvBv/B,KAAK44B,IAAM51B,KAAKC,IAAI4zI,EAAWG,EAAch3I,KAAKy2C,UAAWogG,EAAWlqG,SAG1E3sC,KAAK44B,IAAMi+G,EAAWlqG,EACtB3sC,KAAK6gB,KAAOi2H,EAAYpqG,EAG1B1sC,KAAKw2I,cACLx2I,KAAKwiD,eAEPjW,kBAAoBjsC,IAClB,MAAMkY,EAASlY,EAAEkY,OACjB,GAAGxY,KAAKusC,oBAAsBvsC,KAAKusC,kBAAkBjsC,GACnD,OAAO,EAGT,MAAMytI,GAAgB,EAAAlrH,GAAA,GAAgBrK,EAAQ69H,IAS9C,OARGtI,GACDkJ,EAAelJ,EAAc/kH,QAAQ24B,KACrC7S,EAAa9B,UAAU,MAEvBiqG,OAAe1wI,EACfuoC,EAAa9B,UAAU,cAGlB,GAETH,aAAc,KACZgqG,EAAW72I,KAAK44B,IAChBk+G,EAAY92I,KAAK6gB,KACjBk2H,EAAa/2I,KAAK4B,MAClBo1I,EAAch3I,KAAK6B,UAKlBw1I,sBACLr3I,KAAK44B,IAAO4I,GAAA,SAAoB,EAAMxhC,KAAK6B,OAAS,EACpD7B,KAAK6gB,KAAQ2gB,GAAA,QAAmB,EAAMxhC,KAAK4B,MAAQ,EACnD5B,KAAKwiD,cAGC+zF,gBACNv2I,KAAK4B,OAAQ,EAAA4e,GAAA,GAAMxgB,KAAK4B,MAAO5B,KAAK4xB,SAAU4P,GAAA,SAC9CxhC,KAAK6B,QAAS,EAAA2e,GAAA,GAAMxgB,KAAK6B,OAAQ7B,KAAKy2C,UAAWjV,GAAA,UAG3Cg1G,cACNx2I,KAAK44B,KAAM,EAAApY,GAAA,GAAMxgB,KAAK44B,IAAK,EAAG4I,GAAA,SAAoBxhC,KAAK6B,QACvD7B,KAAK6gB,MAAO,EAAAL,GAAA,GAAMxgB,KAAK6gB,KAAM,EAAG2gB,GAAA,QAAmBxhC,KAAK4B,OAGlD4gD,cACNxiD,KAAK2Y,QAAQrV,MAAMs1B,IAAM54B,KAAK44B,IAAM,KACpC54B,KAAK2Y,QAAQrV,MAAMud,KAAO7gB,KAAK6gB,KAAO,KACtC7gB,KAAK2Y,QAAQrV,MAAMkrC,MAAQ,OAC3BxuC,KAAK2Y,QAAQrV,MAAMsd,OAAS,OAC5B5gB,KAAK2Y,QAAQrV,MAAM1B,MAAQ5B,KAAK4B,MAAQ,KACxC5B,KAAK2Y,QAAQrV,MAAMzB,OAAS7B,KAAK6B,OAAS,KAE1C7B,KAAKsQ,cAAc,UAGV1O,YACT,OAAO5B,KAAKqiE,OAGHxgE,aACT,OAAO7B,KAAKsiE,QAGF1gE,UAAMlB,GAChBV,KAAKqiE,OAAS3hE,EAGJmB,WAAOnB,GACjBV,KAAKsiE,QAAU5hE,EAGN44B,YACT,MAAM,IAACV,EAAG,KAAE/X,EAAI,MAAEjf,EAAK,OAAEC,GAAU7B,KACnC,MAAO,CACL44B,IAAAA,EACA/X,KAAAA,EACAjf,MAAAA,EACAC,OAAAA,GAIOy3B,UAAMA,GACf,MAAM,IAACV,EAAG,KAAE/X,EAAI,MAAEjf,EAAK,OAAEC,GAAUy3B,EACnCt5B,KAAK44B,IAAMA,EACX54B,KAAK6gB,KAAOA,EACZ7gB,KAAK4B,MAAQA,EACb5B,KAAK6B,OAASA,EACd7B,KAAKuhI,Y,OXvLG4Q,GAyDAP,G,2WYnFG,MAAM0F,GAOnB33I,YAAYC,GANZ,qBAYE,EAAAqH,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKu3I,eAAe,GAAA36H,oBAEpB5c,KAAKwP,eAAejO,IAAIwpB,EAAA,GAAxB/qB,CAAoC,gBAAgB,CAACsK,EAAMwqC,KACtDA,IAAO,aAAqBxqC,IAAS,aACtCtK,KAAKu3I,eAAe,GAAA36H,uBAKnB0pF,UACL,MAAMkxC,EAAUx3I,KAAKw3I,QAClBA,GACDA,EAAQlxC,UAIDkxC,cACT,O,uSAAO,CAAAx3I,KAAI,QAGFs5B,YACT,OAAOt5B,KAAKw3I,QAAUx3I,KAAKw3I,QAAQl+G,MAAQt5B,KAAK0uI,cAGvCp1G,UAAMA,GACft5B,KAAK0uI,cAAgBp1G,EAGfi+G,cAAc75H,GACpB,IAAI,QAAC85H,GAAWx3I,KAChB,GAAG0d,EAAS,CACV,GAAG85H,EACD,OAGFA,EAAU,GAAAx3I,KAAI,GAAY,IAAIs2I,GAAet2I,KAAKy3I,gBAAe,KAEjED,EAAQl+G,MAAQt5B,KAAK0uI,mBACSnoI,IAA3BvG,KAAK0uI,cAAc91G,KACpB4+G,EAAQH,sBAGPr3I,KAAKuhI,UACNvhI,KAAKwP,eAAejO,IAAIi2I,EAAxBx3I,CAAiC,SAAUA,KAAKuhI,cAE7C,CACL,IAAIiW,EACF,OAGFx3I,KAAK0uI,cAAgB8I,EAAQl+G,MAC7Bk+G,EAAQb,kBACRa,EAAQlxC,UACR,GAAAtmG,KAAI,QAAYuG,EAAS,OC1EhB,SAASmxI,GAAgBpsI,EAAmBwd,EAAyByyC,GAKlF,OAJAzyC,EAAS/jB,SAAS4T,IAChBA,EAAQpY,UAAUsD,OAAOyH,EAAWiwD,MAG/B,IAAMm8E,GAAgBpsI,EAAWwd,GAAWyyC,GbqC9C,SAAS23E,GAAkCrwG,GAChD,MAAMysG,EAAS6C,GACf,OAAGtvG,EAAY7nB,OAAOu6H,aACbjG,EAAO+C,kBAC4B9rI,IAAlCs8B,EAAY80G,kBACbrI,EAAOwC,KACNjvG,EAAY7nB,OAAOH,MACpBgoB,EAAY7nB,OAAOs6H,gBAAkBhG,EAAOyC,MAAQzC,EAAOgD,eAE3DhD,EAAO0C,Q,eAnBlB,SAAYG,GACV,yBACA,qBACA,mCACA,uCACA,mBALF,CAAYA,KAAAA,GAAkC,KAyD9C,SAAYP,GACV,mBACA,qBACA,yBAHF,CAAYA,KAAAA,GAAkC,KAiB9C,IAAIlD,GAA8B,CAChC9sI,MAAO,IACPC,OAAQ,KAGV,MAAM,GAAY,aAEH,MAAMozI,WAAuB,KAsB1Ct1I,YAAYC,GAKVC,MAAM,wBAAoB0G,EAAW,CACnCsT,MAAM,EACN+9H,gBAAgB,EAChBj0G,UAAU,IA6LN,KAAAk0G,kBAAoB,MAC1B,SAAkB73I,KAAKoB,YAGjB,KAAA02I,iBAAoBp1H,IAC1B1iB,KAAKoB,UAAUb,UAAUsD,OAAO,gBAAiB6e,GACjD1iB,KAAK+3I,iBAAiBx3I,UAAUsD,OAAO,gBAAiB6e,IAGlD,KAAAib,iBAAmB+5G,GAAgBlvI,KAAK,KAAM,gBAE9C,KAAAwvI,aAAe,KACrB,MAAMn0I,EAAS7D,KAAK29B,iBAAiB,CAAC39B,KAAKi4I,WAAW,GACtDj4I,KAAK+kI,SAASmT,qBAAqB5yH,SAAQ,KACzCzhB,QAII,KAAAs0I,cAAgB,KACtB,MAAMt0I,EAAS7D,KAAK29B,iBAAiB,CAAC39B,KAAKo4I,YAAY,GACvDp4I,KAAK+kI,SAASsT,sBAAsB/yH,SAAQ,KAC1CzhB,QAII,KAAAygB,YAAc,KACpB,MAAMue,EAAc7iC,KAAK+kI,SAASliG,YAC9BA,EAAY7nB,OAAOs6H,gBAKrBt1I,KAAK+kI,SAASuT,mBAJuB/xI,IAAlCs8B,EAAY80G,mBACb33I,KAAK+kI,SAASwT,iBAAgB,IAO5B,KAAAC,aAAe,KACrB,MAAMC,EAAUC,IACd14I,KAAK+kI,SAAS0T,OAAOC,IAGpB14I,KAAK8T,gBAAgBy0C,UAAUvoD,KAAK+kI,SAAS5wH,OAAQ,eACtD,IAAIynB,GAAU,uBAAwB,CACpC5D,aAAc,sBACdoE,mBAAoB,qBACpBI,WAAY,CAAC,CACXvb,KAAM,wBAERW,QAAS,CAAC,CACR6X,QAAS,mBACTkD,SAAWH,IACTi8G,IAASj8G,EAAWt7B,OAEtB8lC,UAAU,MAEXtkB,OAEH+1H,GAAO,IAQH,KAAAE,mBAAqB,KAC3B34I,KAAK44I,kBACL,MAAM5xH,GAAS,YAET,cAAC6xH,EAAa,kBAAEC,GAAqB94I,KAErC+4I,EAAgB/4I,KAAKoB,UAAUb,UAAUmT,SAAS,kBACxD1T,KAAKoB,UAAUb,UAAUsD,OAAO,iBAAkBmjB,GAClD6xH,GAAiBA,EAAct4I,UAAUsD,OAAO,OAAQmjB,GACxD8xH,GAAqBA,EAAkBv4I,UAAUsD,OAAO,QAASmjB,GACjEhnB,KAAKszG,SAAS/yG,UAAUsD,OAAO,OAAQmjB,GAEpCA,IAAW+xH,IACZx5F,EAAA,kBAAqCv4B,GAErCnc,EAAA,sBAAwBmc,EAAS,eAAYzgB,KAIzC,KAAAqyI,gBAAkB,K,MACxB,MAAM5xH,GAAS,WACTwwH,EAA2B,QAAjB,EAAAx3I,KAAKg5I,oBAAY,eAAExB,QAC7ByB,GAASjyH,MAAawwH,GAAWA,EAAQ51I,OAAS,SAAW5B,KAAKk5I,YAOlEC,EAASn5I,KAAKoB,UAAUb,UAAUmT,SAAS,iBACjD,IAAIkO,EACDq3H,IAAUE,IACXv3H,EAAUvX,MAAMC,KAAKtK,KAAK+3I,iBAAiBnnH,UAC3ChP,EAAQ7c,SAAQ4T,IACdA,EAAQrV,MAAMwqD,QAAU,OAGrB9tD,KAAK+3I,iBAAiBrpG,YAG7B1uC,KAAKoB,UAAUb,UAAUsD,OAAO,gBAAiBo1I,GACjDj5I,KAAKo5I,UAAU74I,UAAUsD,OAAO,OAAQo1I,GACxCj5I,KAAKq5I,cAAc94I,UAAUsD,OAAO,QAASo1I,GAE1Cr3H,GAECA,EAAQ7c,SAAQ4T,IACdA,EAAQrV,MAAMwqD,QAAU,OAMxB,KAAAwrF,kBAAoB,KAC1Bt5I,KAAKoB,UAAUb,UAAUsD,OAAO,2BAjThC,EAAAoD,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKk5I,YAAc,EACnBl5I,KAAKoB,UAAUb,UAAUgB,IAAI,GAAW,SAExC,MAAMwjI,EAAW/kI,KAAK+kI,SAAW/kI,KAAKqgI,qBAAqBS,WACrD,eAACtxH,GAAkBxP,KAEzB,IAAI,GAAA6mB,gBAAiB,CACnB,MAAMgyH,EAAgB74I,KAAK64I,cAAgB,EAAW,cAChDU,EAAiBv5I,KAAKu5I,eAAiB,EAAW,6BAClDT,EAAoB94I,KAAK84I,kBAAoB,EAAW,gBAE9D,QAAiBD,EAAe74I,KAAK63I,kBAAmB,CAACroI,eAAAA,KACzD,QAAiB+pI,EAAgBv5I,KAAK63I,kBAAmB,CAACroI,eAAAA,KAE1D,QAAiBspI,GAAmB,MAClC,aACC,CAACtpI,eAAAA,KAEJ,SAAsBxP,KAAKoB,UAAWpB,KAAK24I,mBAAoBnpI,GAG/CxP,KAAKo5I,UAAY,EAAW,WAA9C,MACMC,EAAgBr5I,KAAKq5I,cAAgB,EAAW,mCAEtD,QAAiBA,EAAer5I,KAAKs5I,kBAAmB,CAAC9pI,eAAAA,IAEzD,MAAMgqI,EAAan4I,SAASC,cAAc,OAC1Ck4I,EAAWj5I,UAAUgB,IAAI,0BAEzBvB,KAAKqP,MAAM9O,UAAUgB,IAAI,2BAEzB,MAAM6uB,EAAW/uB,SAASC,cAAc,OACxC8uB,EAAS7vB,UAAUgB,IAAI,8BAEvBi4I,EAAWl1I,OAAOtE,KAAKqP,MAAO+gB,GAE9BpwB,KAAKkP,OAAO3O,UAAUgB,IAAI,qBAC1BvB,KAAKkP,OAAO5K,UAAU,CAACtE,KAAK84I,kBAAmBU,EAA6Bx5I,KAAK64I,cAAeQ,GAAevvI,OAAOa,UAEtH,MAAM8uI,EAAYz5I,KAAKkP,OAAO9K,WAAU,GAClCs1I,EAAgBF,EAAWp1I,WAAU,GACrCu1I,EAAiB35I,KAAKqP,MAAMjL,WAAU,GAE5Cs1I,EAAcp1I,OAAOq1I,GAErB,MAAMC,EAAgB,EAAW,cACjCH,EAAUn1I,UAAU,CAACs1I,EAAeF,EAAe15I,KAAKu5I,gBAAgBzvI,OAAOa,WAE/E,QAAiBivI,EAAe55I,KAAKs5I,kBAAmB,CAAC9pI,eAAAA,IAEzDxP,KAAK6Z,KAAK3V,QAAQu1I,GAElB,MAAMI,EAAmB,IAAI,UAAWtzI,GACxCszI,EAAiBz4I,UAAUb,UAAUgB,IAAI,kCACzCvB,KAAKoB,UAAUkD,OAAOu1I,EAAiBz4I,WAEvCpB,KAAK85I,eAAiB,IAAI9D,GAAsBh2I,KAAKqP,OACrDrP,KAAK+5I,qBAAuB,IAAIjE,GAA4B1lH,GAC5DpwB,KAAKg6I,+BAAiC,IAAIlE,GAA4B6D,GACtE35I,KAAKi6I,mBAELj6I,KAAK41I,2BAA6B,IAAI9B,GAAkC,OAAD,QACrE/yG,SAAU84G,EAAiBz4I,UAC3B2jI,SAAAA,EACAv1H,eAAAA,EACA+kI,eAAe,EACfj7D,eAAiBz4E,IACfb,KAAKk5I,YAAcr4I,EACnBb,KAAK44I,oBAEJh5I,IAELI,KAAKk6I,sBAAwB,IAAIvE,GAA6B,OAAD,QAC3D50G,SAAU/gC,KAAK6Z,KACfkrH,SAAAA,EACAv1H,eAAAA,GACG5P,IAGLI,KAAKg5I,aAAe,IAAI1B,GAAa,CACnC9nI,eAAAA,EACAioI,eAAgB,CACd7lH,SAAU,IACV6kB,UAAW,IACX99B,QAAS3Y,KAAK2Y,QACd4zB,kBAAoBjsC,IAClB,MAAMkY,EAASlY,EAAEkY,OACjB,SAAG,EAAAqK,GAAA,GAAgBrK,EAAQ,cACzB,EAAAqK,GAAA,GAAgBrK,EAAQ,uBACxB,EAAAqK,GAAA,GAAgBrK,EAAQ,cACxB,EAAAqK,GAAA,GAAgBrK,EAAQ,6CACxB,cAON+oH,SAAU,IAAMvhI,KAAK44I,kBACrBlK,cAAAA,KAGFl/H,EAAejO,IAAIwjI,EAAnBv1H,CAA6B,SAAS,KACpCxP,KAAKm6I,oBAGP3qI,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,qBAAsBsxH,I,OAClC,QAAb,EAAA9gI,KAAK+kI,gBAAQ,eAAEl0H,MAAOiwH,EAAUjwH,IACjC7Q,KAAKm6I,oBAIT3qI,EAAejO,IAAIwjI,EAAnBv1H,CAA6B,UAAU,KACrCxP,KAAKo6I,kBAGP5qI,EAAejO,IAAIvB,KAAK41I,2BAAxBpmI,CAAoD,iBAAkBxP,KAAK83I,kBAE3E93I,KAAKK,iBAAiB,SAAS,KAC7B,MAAM,aAAC24I,GAAgBh5I,KACvB0uI,GAAgBsK,EAAa1/G,MAE7Bt5B,KAAK41I,2BAA2BtvC,UAChCtmG,KAAKk6I,sBAAsB5zC,UAC3BtmG,KAAKq6I,wBAAwB/zC,UAE7B0yC,EAAa1yC,aAGftmG,KAAKs5I,oBACLt5I,KAAK24I,qBAEL34I,KAAKm6I,iBAGCF,mBACN,MAAMr4H,EAAU5hB,KAAK+3I,iBAAmB12I,SAASC,cAAc,OAC/DsgB,EAAQrhB,UAAUgB,IAAI,sBAEtB,MAAM+4I,EAAcl/D,GAAW5yE,KAAK,KAAM,GAAWxI,KAAKwP,gBAEpDyoI,EAAWj4I,KAAKi4I,SAAWqC,EAAY,CAE3C39G,SAAU38B,KAAKg4I,aACfnpI,KAAM,uBAGFupI,EAAYp4I,KAAKo4I,UAAYkC,EAAY,CAE7C39G,SAAU38B,KAAKm4I,cACftpI,KAAM,uBAGRupI,EAAU73I,UAAUsD,OAAO,QAAS,IAEpC,MAAMw+H,EAAUiY,EAAY,CAC1BlrI,UAAU,EACVutB,UAAU,EAAAmnB,GAAA,GAAS9jD,KAAKskB,YAAa,KAAK,KAE5C+9G,EAAQ9hI,UAAUgB,IAAI,gCAEtB,MAAMg5I,EAAiBv6I,KAAKq6I,wBAA0B,IAAI1I,GAC1DtP,EAAQ/9H,OAAOi2I,EAAen5I,WAE9B,MAAMo/H,EAAU8Z,EAAY,CAE1BzrI,KAAM,oBAGR2xH,EAAQjgI,UAAUgB,IAAI,gBACtBi/H,EAAQjgI,UAAUsD,OAAO,QAAS,IAElC,MAAM22I,EAAWF,EAAY,CAE3BtzG,UAAU,EACVrK,SAAU38B,KAAKw4I,aACf3pI,KAAM,UAGR+S,EAAQtd,OAAO2zI,EAAUG,EAAW/V,EAAS7B,EAASga,GAEtDx6I,KAAKoB,UAAUkD,OAAOsd,GAgEjB8zH,eACL,OAAO11I,KAAKoB,UA4DNg5I,eACNp6I,KAAKoB,UAAUb,UAAUsD,OAAO,eAAgB7D,KAAK+kI,SAASmP,cAGxDiG,iBACN,GAAGn6I,KAAK+kI,SAASzrG,QAAU,YAMzB,OALGt5B,KAAKoB,UAAUb,UAAUmT,SAAS,oBACnC,gBAGF1T,KAAK6jC,OAIP,MAAM,YAAChB,EAAW,UAAEi+F,GAAa9gI,KAAK+kI,SACtC,IAAIliG,EACF,OAGF7iC,KAAKkQ,WACLlQ,KAAKy6I,iBACLz6I,KAAKo6I,eAEL,MAAMM,EA9XH,SAA2C5Z,EAAgCj+F,GAChF,MAAMysG,EAASsC,GACf,OAAI/uG,EAAY7nB,OAAOs6H,gBAEbzyG,EAAY7nB,OAAOH,MACpBy0H,EAAOyC,MAEPzC,EAAO0C,QAJP1C,EAAOwC,KA2XgB6I,CAAkC7Z,EAAkBj+F,GAClF7iC,KAAKoB,UAAU4nB,QAAQ4xH,SAAWF,IAA0B9I,GAAmCE,KAAO,OAAU4I,IAA0B9I,GAAmCG,MAAQ,QAAU,UAC/L/xI,KAAKq6I,wBAAwBt/G,SAAS2/G,GAGhCxqI,WACNlQ,KAAK85I,eAAej0G,OAAO7lC,KAAK+kI,UAG1B0V,iBACNz6I,KAAK+5I,qBAAqBl0G,OAAO7lC,KAAK+kI,UACtC/kI,KAAKg6I,+BAA+Bn0G,OAAO7lC,KAAK+kI,W,Icxe/C8V,G,YAAL,SAAKA,GACH,6BACA,+BACA,yCACA,yBACA,+BACA,yBACA,uBAPF,CAAKA,KAAAA,GAAU,KAUf,YCNe,MAAMC,GAKnBn7I,YAAoBohC,GAAA,KAAAA,SAAAA,EAClB/gC,KAAKoB,UAAYC,SAASC,cAAc,OACxCtB,KAAKoB,UAAUb,UAAUgB,IAAI,oBAGxB89C,cACgB94C,IAAlBvG,KAAK+6I,WACNngG,cAAc56C,KAAK+6I,UACnB/6I,KAAK+6I,cAAWx0I,GAGlBvG,KAAKoB,UAAUZ,SACfR,KAAKs5B,WAAQ/yB,EAGRs/B,OAAOk/F,GACZ,MAAM,gBAACiW,GAAmBjW,EAE1B,GAAG/kI,KAAKs5B,QAAU0hH,EAChB,OAKF,IAAIriI,EACJ,GAHA3Y,KAAKs5B,MAAQ0hH,EAGVA,IAAoB,aAAsB,CAC3CriI,EAAUtX,SAASC,cAAc,QACjCqX,EAAQpY,UAAUgB,IAAI,6BAEtB,MAAM4lF,EAAU,KACdxuE,EAAQqV,WAAa,GAAK+2G,EAASttH,UAAUqO,UAAS,IAGxD9lB,KAAK+6I,SAAW5tI,OAAO6jC,YAAYm2C,EAAS,KAC5CA,QACK,CACL,IAAIntD,EACJ,OAAOghH,GACL,KAAK,WACHhhH,EAAc+qG,EAASt7G,WAAa,qBAAuB,qBAC3D,MACF,KAAK,cACHuQ,EAAc,wBACd,MACF,KAAK,mBACHA,EAAc,qBACd,MACF,KAAK,UACHA,OAAuCzzB,IAAzBw+H,EAASkW,YAA4B,mBAAqB,oBACxE,MACF,QACEjhH,EAAc,wBAIlBrhB,GAAU,IAAA/M,MAAKouB,QACMzzB,IAAlBvG,KAAK+6I,WACNngG,cAAc56C,KAAK+6I,UACnB/6I,KAAK+6I,cAAWx0I,GAIpBvG,KAAKoB,UAAUb,UAAUsD,OAAO,eAAgBm3I,IAAoB,eACpE,EAAAhtI,EAAA,GAAehO,KAAKoB,UAAWuX,GAE3B3Y,KAAKoB,UAAU6C,eACjBjE,KAAK+gC,SAASz8B,OAAOtE,KAAKoB,YCzEjB,MAAM85I,WAAoCnK,GAOvDpxI,YAAYuyI,EAAmBjwB,GAC7BpiH,MAAM,CACJ+B,MAAO,GACPC,OAAQ,GACR4uI,QAAUn3G,GACDt5B,KAAK2wI,UAAUF,QAAQn3G,EAAQ,SAAW,QAEnD43G,SAAUgB,EAAW54G,GACZA,EAAQ,CAAC,IAAK,IAAK,KAAO,CAAC,IAAK,IAAK,UAC1C/yB,EACJ07G,cAAAA,IAGFjiH,KAAKuB,IAAI,CACPuC,KAAM,aACN4oB,MAAO,CAAC,CACNkkH,WAAY,EACZC,SAAU,GACV/sI,KAAM,iBACL,CACD8sI,WAAY,GACZC,SAAU,GACV/sI,KAAM,UACL,CACD8sI,WAAY,GACZC,SAAU,GACV/sI,KAAM,QACL,CACD8sI,WAAY,GACZC,SAAU,IACV/sI,KAAM,iBACL,CACD8sI,WAAY,IACZC,SAAU,IACV/sI,KAAM,uBCZd,MAAM,GAAY,OAKZq3I,GAA2B,CAC/Bv5I,MAJgB,IAKhBC,OAJiB,KAOnB,IAAI,GAAa,iBAAqBs5I,IAEvB,MAAMC,WAAkB,KAsCrCz7I,YAAYC,GAMVC,MAAM,kBAAc0G,EAAW,CAC7BqxI,gBAAgB,EAChBj0G,UAAU,IAiNN,KAAAk0G,kBAAoB,MAC1B,SAAkB73I,KAAKoB,YAGjB,KAAAu3I,mBAAqB,KAC3B,MAAM3xH,GAAS,YAET,cAAC6xH,EAAa,kBAAEC,GAAqB94I,KAErC+4I,EAAgB/4I,KAAKoB,UAAUb,UAAUmT,SAAS,kBACxD1T,KAAKoB,UAAUb,UAAUsD,OAAO,iBAAkBmjB,GAClD6xH,GAAiBA,EAAct4I,UAAUsD,OAAO,OAAQmjB,GACxD8xH,GAAqBA,EAAkBv4I,UAAUsD,OAAO,QAASmjB,GACjEhnB,KAAKszG,SAAS/yG,UAAUsD,OAAO,OAAQmjB,GAEpCA,IAAW+xH,IACZx5F,EAAA,kBAAqCv4B,GAErCnc,EAAA,sBAAwBmc,EAAS,eAAYzgB,GAE7CvG,KAAKq7I,2BAlOP,EAAAp0I,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKs7I,gBAAkB,GAEvB,MAAM,UAACl6I,EAAS,eAAEoO,EAAc,SAAEu1H,GAAY/kI,KAC9CoB,EAAUb,UAAUgB,IAAI,GAAW,SAEnC,MAAM+hF,EAAkBjiF,SAASC,cAAc,OAC/CgiF,EAAgB/iF,UAAUgB,IAAI,eAE9B,MAAM4H,EAASnJ,KAAKmJ,OAASnJ,KAAK+kI,SAASwW,mBAAmBtyH,WACxDkkB,EAAS,IAAIpR,GACnBoR,EAAO8rG,OAAQ,EACf9rG,EAAOjtC,aAAa,OAAQ,GAAKiJ,GACjCgkC,EAAO5sC,UAAUgB,IAAI,eACrB+hF,EAAgBh/E,OAAO6oC,GAEvB,MAAM99B,EAAQ,IAAI,KAAU,CAC1BlG,OAAAA,IACCwP,QAEHtJ,EAAM9O,UAAUgB,IAAI,cAEpB,MAAM6uB,EAAW/uB,SAASC,cAAc,OACxC8uB,EAAS7vB,UAAUgB,IAAI,iBAEHvB,KAAKq8B,YAAc,IAAIy+G,GAAuB1qH,GAAlE,MAEMorH,EAAiBx7I,KAAKw7I,eAAiBn6I,SAASC,cAAc,OACpEk6I,EAAej7I,UAAUgB,IAAI,eAE7BH,EAAUkD,OAAOg/E,EAAiBj0E,EAAO+gB,GAErC,GAAAgqD,UAWFp6E,KAAKkP,OAAO5K,OAAOk3I,IAVnBx7I,KAAK64I,cAAgB,EAAW,cAChC74I,KAAK84I,kBAAoB,EAAW,qBACpC,QAAiB94I,KAAK64I,cAAe74I,KAAK63I,kBAAmB,CAACroI,eAAAA,KAC9D,QAAiBxP,KAAK84I,mBAAmB,KAAM,YAAoB,CAACtpI,eAAAA,KACpE,SAAsBxP,KAAKoB,UAAWpB,KAAK24I,mBAAoBnpI,GAC/DxP,KAAKkP,OAAOhL,QAAQlE,KAAK84I,mBACzB94I,KAAKkP,OAAO5K,OAAOtE,KAAK64I,eAExBz3I,EAAUkD,OAAOk3I,IAKnBx7I,KAAKy7I,YAAcp6I,SAASC,cAAc,OAC1CtB,KAAKy7I,YAAYl7I,UAAUgB,IAAI,qBAE/BvB,KAAK07I,gBAAkBr6I,SAASC,cAAc,OAC9CtB,KAAK07I,gBAAgBn7I,UAAUgB,IAAI,oBACnC,MAAMo6I,GAAY,IAAA/vI,MAAK,0BAA2B,CAAC,IAAI,KAAU,CAACzC,OAAAA,EAAQqsD,eAAe,EAAM/kC,aAAc,KAAK9X,UAClHgjI,EAAUp7I,UAAUgB,IAAI,yBACxB,MAAM4xI,EAAY,IAAI+H,IAA4B,GAAO,GACzD/H,EAAUp4G,UAAS,GAAO,GAC1B/6B,KAAK07I,gBAAgBp3I,OACnB6uI,EAAU/xI,UACVu6I,GAGF37I,KAAKy7I,YAAYn3I,OAAOtE,KAAK07I,iBAC7B17I,KAAKoB,UAAUkD,OAAOtE,KAAKy7I,aAE3Bz7I,KAAKo7E,WAAaA,GAAW5yE,KAAK,KAAM,GAAWxI,KAAKwP,gBACxDxP,KAAK47I,wBACL57I,KAAK67I,yBAELrsI,EAAejO,IAAIwjI,EAAnBv1H,CAA6B,SAAS,KACpCxP,KAAKm6I,oBAGP3qI,EAAejO,IAAIwjI,EAAnBv1H,CAA6B,cAAc,KACzCxP,KAAKm6I,oBAGPn6I,KAAKg5I,aAAe,IAAI1B,GAAa,CACnC9nI,eAAAA,EACAioI,eAAgB,CACd7lH,SA1IU,IA2IV6kB,UA1IW,IA2IX99B,QAAS3Y,KAAK2Y,QACd4zB,kBAAoBjsC,IAClB,MAAMkY,EAASlY,EAAEkY,OACjB,SAAG,EAAAqK,GAAA,GAAgBrK,EAAQ,iBACzB,EAAAqK,GAAA,GAAgBrK,EAAQ,cACxB,cAQNk2H,cAAgB1uI,KAAK+kI,SAAS+W,iBAAoB97I,KAAK+kI,SAASt7G,WAA+B,GAAlB,OAAD,UAAK0xH,MAGnF,MAAMY,EAAiB/7I,KAAKg5I,aAAaxB,QACtCuE,GACD/7I,KAAKwP,eAAejO,IAAIw6I,EAAxB/7I,CAAwC,UAAU,KAChDA,KAAKq7I,2BAIT,MAAMW,EAAgBh8I,KAAKg8I,cAAgB,IAAI/5H,GAC/C+5H,EAAcr5H,MAAM,CAClBhK,QAAS3Y,KAAKoB,UACdoO,eAAgBxP,KAAKwP,eACrBuT,uBAAwB,iBAE1Bi5H,EAAcx5H,cAAa,GAE3BxiB,KAAKK,iBAAiB,SAAS,KAC7B,MAAM,aAAC24I,GAAgBh5I,KACvB,GAAgBg5I,EAAa1/G,MAE7Bt5B,KAAKu6I,eAAej0C,UAEpB0yC,EAAa1yC,aAGftmG,KAAKm6I,iBAGA8B,kBACL,OAAOj8I,KAAK+kI,SAGN6W,wBACN,MAAMh6H,EAAU5hB,KAAKk8I,gBAAkB76I,SAASC,cAAc,OAC9DsgB,EAAQrhB,UAAUgB,IAAI,eAAwB,YAE9C,MAAMo8B,EAAmB+5G,GAAgBlvI,KAAK,KAAM,gBAE9CyvI,EAAWj4I,KAAKi4I,SAAWj4I,KAAKo7E,WAAW,CAC/Cn6D,KAAM,cACNpS,KAAM,qBACN8tB,SAAU,KACR,MAAM94B,EAAS85B,EAAiB,CAACs6G,EAAUG,IAAY,GACvDp4I,KAAK+kI,SAASmT,qBAAqB5yH,QAAQzhB,MAIzCu0I,EAAYp4I,KAAKo4I,UAAYp4I,KAAKo7E,WAAW,CACjDn6D,KAAM,cACNpS,KAAM,qBACN8tB,SAAU,KACR,MAAM94B,EAAS85B,EAAiB,CAACs6G,EAAUG,IAAY,GACvDp4I,KAAK+kI,SAASsT,sBAAsB/yH,QAAQzhB,MAI5C,KACFu0I,EAAU73I,UAAUgB,IAAI,QACxBvB,KAAKoB,UAAUb,UAAUgB,IAAI,cAG/BvB,KAAKm8I,gBAAkB,IAAI,sBAAiB,CAC1ChsI,IAAK,cAEP,MAAMkyH,EAAUriI,KAAKqiI,QAAUriI,KAAKo7E,WAAW,CAC7Cn6D,KAAMjhB,KAAKm8I,gBAAgBxjI,QAC3BgkB,SAAU,KACR38B,KAAK+kI,SAASuT,iBAIZiC,EAAiBv6I,KAAKu6I,eAAiB,IAAIW,IAA4B,GAAM,GACnF7Y,EAAQx4G,kBAAkBvlB,OAAOi2I,EAAen5I,WAKhDwgB,EAAQtd,OAAO2zI,EAAUG,EAAW/V,GACpCriI,KAAKoB,UAAUkD,OAAOsd,GAGhBi6H,yBACN,MAAMj6H,EAAU5hB,KAAKo8I,iBAAmB/6I,SAASC,cAAc,OAC/DsgB,EAAQrhB,UAAUgB,IAAI,eAAwB,aAE9CvB,KAAKq8I,mBAAqB,IAAI,sBAAiB,CAC7ClsI,IAAK,iBAEP,MAAMmsI,EAAat8I,KAAKs8I,WAAat8I,KAAKo7E,WAAW,CACnDn6D,KAAMjhB,KAAKq8I,mBAAmB1jI,QAC9B9J,KAAM,iBACN8tB,SAAU,KACR38B,KAAK+kI,SAAS0T,OAAO,iCAEvBzxG,UAAU,IAGNu1G,EAAYv8I,KAAKu8I,UAAYv8I,KAAKo7E,WAAW,CACjDn6D,KAAM,cACNpS,KAAM,eACN8tB,SAAU,KACR38B,KAAK+kI,SAASyX,cAEhBpG,WAAW,IAGbx0H,EAAQtd,OAAOg4I,EAAYC,GAC3Bv8I,KAAKoB,UAAUkD,OAAOsd,GA2BhB66H,qBAAqBxlI,GAC3B,MACM7V,EAAYC,SAASC,cAAc,OACzCF,EAAUb,UAAUgB,IAAI20I,wBAExBj/H,EAAM1W,UAAUgB,IAJG,cAKhB0V,EAAMmC,QACPnC,EAAMvU,QAGR,QAAiBtB,GAAW,KAC1B,IAAIA,EAAUb,UAAUmT,SAAS,SAC/B,OAGF,MAAMgpI,EAAMhiI,OAAO8oB,OAAOxjC,KAAKs7I,iBAAiBjpI,MAAKjR,IAAcA,EAAUb,UAAUmT,SAAS,WAChGgpI,EAAIn8I,UAAUgB,IAAI,SAClBm7I,EAAIp5I,MAAMsW,QAAUxY,EAAUkC,MAAMsW,QACpCxY,EAAUb,UAAUC,OAAO,SAC3BY,EAAUkC,MAAMsW,QAAU,GAE1B5Z,KAAKq7I,2BAGP,MAAMh4I,EAASgwI,GAAoBp8H,GAKnC,OAJA5T,EAAO9C,UAAUgB,IAAI20I,mBAErB90I,EAAUkD,OAAOjB,EAAQ4T,GAElB7V,EAGD+4I,iBACN,MAAM,SAACpV,GAAY/kI,MACb,gBAACg7I,GAAmBjW,EAC1B,GAAGiW,IAAoB,UAQrB,OAPGh7I,KAAKoB,UAAUb,UAAUmT,SAAS,oBACnC,WAGF1T,KAAKi4I,SAAS13I,UAAUgB,IAAI,iBAE5BvB,KAAK6jC,OAIP,MAAM84G,GAAqB5X,EAASt7G,YAAcuxH,IAAoB,WACtEh7I,KAAKq8I,mBAAmBhlE,iBAAiB,CACvClnE,IAAK6qI,IAAoB,WAAqB,eAAiB,aAEjEh7I,KAAKu8I,UAAUh8I,UAAUsD,OAAO,WAAY84I,GAC5C38I,KAAKu8I,UAAUh8I,UAAUsD,OAAO,WAAY84I,GAC5C38I,KAAKoB,UAAUb,UAAUsD,OAAO,kBAAmB84I,GAEnD,MAAMC,EAAU7X,EAAS6X,QACnBn+F,EAAU,KACdz+C,KAAKqiI,QAAQx4G,kBAAkBtpB,UAAUsD,OAAO,SAAU+4I,IAGtDh2H,EAAS5mB,KAAKu6I,eAAe5J,UAAU/pH,OAC7C5mB,KAAKu6I,eAAex/G,UAAU6hH,GAAUA,EAASn+F,GAC7C73B,GACF63B,IAGFz+C,KAAKm8I,gBAAgB9kE,iBAAiB,CACpClnE,IAAKysI,EAAU,aAAe,cAGhC,MAAMC,EAAiB9X,EAAS8X,eAChC78I,KAAKi4I,SAASpuH,kBAAkBtpB,UAAUsD,OAAO,SAAUg5I,GAE3D,MAAMC,EAAkB/X,EAAS+X,gBACjC98I,KAAKo4I,UAAUvuH,kBAAkBtpB,UAAUsD,OAAO,SAAUi5I,GAE5D,MAAMC,EAAchY,EAASiY,cAAc,WAE3C,QAAch9I,KAAK07I,gBAAiB,gBAAgBqB,MAAAA,OAAW,EAAXA,EAAaliI,OAAO,KAExE,MAAMg8C,EAAa72D,KAAKs7I,gBAClB2B,EAAgB,OAAH,UAAOpmF,GAC1B,CAAC,QAAkB,UAAmB9xD,SAAQ9E,IAC5C,MAAMi9I,EAAanY,EAASiY,cAAc/8I,GACpCgX,EAAQ8tH,EAASoY,gBAAgBl9I,GAEjCm9I,KAAcnmI,GAASA,EAAMsnG,YAActnG,EAAMunG,cACpDvnG,GAAUmmI,GAAanmI,EAAM+R,QAAQq0H,aACtCpmI,EAAM+R,QAAQq0H,WAAa,KAE3B,SAAYpmI,GAAOlV,MAAK,YACfkV,EAAM+R,QAAQq0H,WACrBr9I,KAAKm6I,qBAMT,MAAMnlD,IAAa/9E,GAASmmI,MAAeF,GAAyC,WAA1BA,EAAWI,YAA0D,WAA/BJ,EAAWK,iBAC3G,IAAIC,EAAiB3mF,EAAW52D,GAE7B+0F,GAAY/9E,IAAUumI,IACvBA,EAAiB3mF,EAAW52D,GAAQD,KAAKy8I,qBAAqBxlI,GAC9DjX,KAAKoB,UAAUkD,OAAOk5I,KAGpBxoD,GAAYwoD,IACdA,EAAeh9I,gBACRq2D,EAAW52D,OAItB,CACE,MAAMF,EAAQ82D,EAAW92D,MACnB09I,EAAS5mF,EAAW4mF,OACvB/iI,OAAOgzC,KAAKuvF,GAAep8I,SAAW6Z,OAAOgzC,KAAKmJ,GAAYh2D,QAAUd,GACzEA,EAAMQ,UAAUsD,OAAO,UAAW45I,GAGjCA,IAAW19I,GACZ09I,EAAOl9I,UAAUC,OAAO,SAI5BR,KAAKq7I,wBAELr7I,KAAKoB,UAAUb,UAAUsD,OAAO,YAAa6W,OAAOgzC,KAAKmJ,GAAYh2D,SAEjEb,KAAKw7I,eAAe1qH,aAAekqH,EAAkB,oBACvDx3I,QAAQ2E,QAAQ48H,EAAS2Y,wBAAwB37I,MAAK2qF,IACpD1sF,KAAKw7I,eAAe11I,UAAY,kBAAgC4mF,EAAO7jE,KAAK,QAIhF7oB,KAAKy6I,iBAGCY,wBACN3gI,OAAO8oB,OAAOxjC,KAAKs7I,iBAAiBv2I,SAAQ3D,IAE1C,GADgBA,EAAUb,UAAUmT,SAAS,SACjC,CACV,MAAMuD,EAAQ7V,EAAUmQ,cAAc,SAChCosI,EAAa39I,KAAKg5I,aAAa1/G,MAC/BskH,EAAe,IACfC,EAAgB,IAEhBC,EAAa7mI,EAAMunG,YAAcvnG,EAAMsnG,WACvCw/B,EAAWD,EAAaD,EAAgBD,EAExCI,EAAkB,EAAI,IAAK,WAAiB,MAAUF,EAAaH,EAAW97I,OAAS87I,EAAW/7I,OAClGq8I,EAAaH,EAAa7mI,EAAMsnG,WAAatnG,EAAMunG,YAAc,EACjE0/B,EAAcJ,EAAa,EAAI7mI,EAAMunG,YAAcvnG,EAAMsnG,WAC/Dn9G,EAAUkC,MAAM1B,MAAQo8I,EAAkBC,EAAa,KACvD78I,EAAUkC,MAAMzB,OAASm8I,EAAkBE,EAAc,KACzD98I,EAAUkC,MAAMquB,SAAWosH,EAAWE,EAAa,KACnD78I,EAAUkC,MAAMwuB,UAAYisH,EAAWG,EAAc,UAErD98I,EAAUkC,MAAMsW,QAAU,MAKxB6gI,iBACNz6I,KAAKq8B,YAAYwJ,OAAO7lC,KAAK+kI,W,0BChelB,SAASoZ,GAAmBC,GACzC,MAAMv5G,GAAO,EAAAw5G,GAAA,GAAsBD,EAAKA,EAAI9nI,MAAM,IAE5CmtC,EAAuC,CAC3C,QAAS,eACT66F,aAAc,CAACz5G,EAAK05G,aACpBC,MAAO35G,EAAK25G,MACZC,IAAK55G,EAAK45G,IACVvnI,WAAO3Q,EACP0Q,WAAO1Q,EACPm4I,gBAAYn4I,GAGRo4I,EAAiBz8D,GAAmB,GAAKA,EAE/C,IAAI,MAAMjvE,KAAWmrI,EAAI9nI,MAAO,CAC9B,MAAMgH,EAAYrK,EAAQqK,UAC1B,GAAiB,gBAAdA,IAAgCrK,EAAQ2rI,UACzC,SAGF,MAAMC,EAAuBp7F,EAAmB,UAAdnmC,GAAyBmmC,EAAY,MAAI,aAAenmC,GAAa,GACjGunB,GAAO,EAAAw5G,GAAA,GAAsBD,EAAKnrI,GACxC4rI,EAAMC,KAAOH,EAAc95G,EAAKw5E,QAE7Bx5E,EAAKk6G,eACNF,EAAMG,WAAan6G,EAAKk6G,aAAar0I,KAAIu0I,IAAe,CAAEC,UAAWD,EAAYC,UAAWC,MAAOF,EAAYG,QAAQ10I,IAAIi0I,QAG7H,MAAMU,EAAgDR,EAAMQ,cAAgB,GAC5EpsI,EAAQuJ,WAAW9K,IAAI,UAAU3M,SAASwX,IACxC8iI,EAAcv3I,KAAK,CACjB+I,IAAK0L,EAAUpM,IACfwF,IAAK4G,EAAU7b,WAInB,MAAM4+I,EAAiE,IAAIluI,IAErEmuI,EAAkB1uI,IACtB,IAAI2uI,EAAcF,EAAgB5tI,IAAIb,GAOtC,OANI2uI,GACFF,EAAgBr6I,IAAI4L,EAAI2uI,EAAc,CACpC3uI,GAAAA,IAIG2uI,GAGTvsI,EAAQuJ,WAAW9K,IAAI,UAAU3M,SAASwX,IACxC,MAAM1L,GAAM0L,EAAUpM,IAChBqvI,EAAcD,EAAe1uI,GAC7BspD,EAAW59C,EAAU7b,MAAMs/C,MAAM,MAChCl8C,EAAM27I,EAAWprE,GAAYla,EACpCqlF,EAAY17I,KAAOA,EACnB07I,EAAYC,WAAaA,EACzBD,EAAYnrE,SAAWA,GAAYA,EAAW,KAGhDphE,EAAQuJ,WAAW9K,IAAI,WAAW3M,SAASwX,IACzC,MAAM1L,GAAM0L,EAAUpM,IACFovI,EAAe1uI,GACvB6uI,cAAgBnjI,EAAU4mE,MAAMz4E,KAAKgrB,IAC/C,MAAMykC,EAAWzkC,EAAKsqB,MAAM,MACrB//C,EAAM0/I,GAAWxlF,EACxB,MAAO,CACLl6D,KAAAA,EACA0/I,QAASA,GAAW,UAK1B1sI,EAAQuJ,WAAW9K,IAAI,QAAQ3M,SAASwX,IACtC,MAAM1L,GAAM0L,EAAUpM,IAEhByvI,EADcL,EAAe1uI,GAC4C+uI,WAAa,GACtFzlF,EAAW59C,EAAU7b,MAAMs/C,MAAM,KACvC,IAAI,MAAMyvB,KAAOtV,EAAU,CACzB,MAAOhqD,EAAKzP,GAAS+uE,EAAIzvB,MAAM,KAC/B4/F,EAAWzvI,GAAOzP,MAItBm+I,EAAMgB,aAAex1I,MAAMC,KAAKg1I,EAAgB97G,UAOlD,OAAOigB,E,eC1FM,MAAMq8F,WAA+B,KAGlDngJ,YAAYC,GAGVC,MAAMD,GAGQmgJ,oB,qCACd,MAAM,WAACC,EAAU,KAAEC,GAAQjgJ,KAE3B,IAAIggJ,EAAWE,mBAAqBF,EAAWG,oBAAsBF,EAAKx2H,WACxE,OAGF,IAAI22H,EACJ,GAAGH,EAAKI,cAAe,CACrBJ,EAAKI,eAAgB,EAErB,MAAMjqG,EAASgqG,QAAwBJ,EAAWM,eAElDtgJ,KAAK0nB,IAAI,cAAe0uB,EAAOn2C,KAAMm2C,EAAOgoG,WACtC4B,EAAWO,oBAAoBnqG,GAErCp2C,KAAK0nB,IAAI,6BACJ,CACL,MAAM84H,EAAQJ,QAAwBJ,EAAWS,cAEjDzgJ,KAAK0nB,IAAI,cAAe84H,EAAMpC,WACxB4B,EAAWO,oBAAoBC,GAErCP,EAAKS,WAAY,EAEjB1gJ,KAAK0nB,IAAI,yBAGX,MAAMi5H,EAAexC,IAAmB,SAASiC,EAAgBhC,MACjE6B,EAAKW,sBAAsBD,I,yVCjD/B,MAEA,GAFkC,oBAAb,QAA4B,WAAYxzI,OAASA,OAAO0zI,OAAOC,OAASlwG,KAAKiwG,OAAOC,O,2SCiB1F,MAAMC,GAKnBphJ,YAAoB8pB,EAA6Bu3H,GAA7B,KAAAv3H,WAAAA,EAA6B,KAAAu3H,OAAAA,EAC/ChhJ,KAAKC,KAAO,YACZD,KAAKq2D,QAAU,EACfr2D,KAAKihJ,OAAS,IAAI7vI,IAGZ8vI,aAAax0H,GACnB,OCzB2B3Q,GDyBb,EAAAxX,GAAA,MAAiBmoB,GCxB1B,UAAc,UCLR,SAA6B3Q,GAC1C,OAAGA,aAAiBjX,WACXiX,EACmB,iBAAZ,GACP,IAAIolI,aAAcC,OAAOrlI,GAG3B,IAAIjX,WAAWiX,GDFUslI,CAAoBtlI,IAAQha,MAAKiD,GAExD,IAAIF,WAAWE,KAHX,IAAgB+W,ED4BfulI,gBAAgBh3H,G,0CAC5B,MAAM/hB,EAAS,CACb8tD,QAAS,EACTt6C,MAAO,IAAIjX,WAAW,GAAKwlB,EAAOzpB,SAG9Bod,GAAKje,KAAKypB,WAAa,EAAI,IAAoB,cAAdzpB,KAAKC,KAAuB,IAAM,GACnEkQ,EAAMnQ,KAAKghJ,OAEXO,QAAoBvhJ,KAAKkhJ,aAAa,CAAC/wI,EAAIqxI,SAASvjI,EAAI,GAAIA,EAAI,GAAK,IAAKqM,IAC1Em3H,EAASl5I,EAAOwT,MACtB,IAAI,IAAIxW,EAAI,EAAGA,EAAI,KAAMA,EACvBk8I,EAAOl8I,GAAKg8I,EAAYh8I,EAAI,GAG9B,MAAMm8I,QAAiB1hJ,KAAK2hJ,gBAAgBxxI,EAAKsxI,EAAQxjI,GAEnDlC,QAAc/b,KAAK4hJ,cAAct3H,EAAQA,EAAOzpB,OAAQ6gJ,GAAU,GAIxE,OAFAn5I,EAAOwT,MAAQ,IAAIjX,WAAW,IAAIyD,EAAOwT,MAAMylI,SAAS,EAAG,OAAQzlI,IAE5DxT,KAGFs5I,iBAAiBv3H,GACtB,MAAMw3H,IAAQ9hJ,KAAKq2D,QACb7wD,EAAM,IAAIN,YAAY,GACf,IAAImlB,SAAS7kB,GACrBu8I,UAAU,EAAGD,IAAQ,GAAG,GAE7B,MAAMv5I,EAAS,IAAIzD,WAAW,IAAI,IAAIA,WAAWU,MAAS8kB,IAE1D,OAAOtqB,KAAKshJ,gBAAgB/4I,GAGhBo5I,gBAAgBxxI,EAAiBsxI,EAAoBxjI,G,0CACjE,MAAO+jI,EAASC,SAAiBz+I,QAAQC,IAAI,CAC3CzD,KAAKkhJ,aAAa,CAChBO,EAAOD,SAAS,EAAG,IACnBrxI,EAAIqxI,SAASvjI,EAAGA,EAAI,MAGtBje,KAAKkhJ,aAAa,CAChB/wI,EAAIqxI,SAAS,GAAKvjI,EAAG,GAAKA,EAAI,IAC9BwjI,EAAOD,SAAS,EAAG,QAIvB,MAAO,CACLrxI,IAAK,IAAIrL,WAAW,IACfk9I,EAAQR,SAAS,EAAG,MACpBS,EAAQT,SAAS,EAAG,OACpBQ,EAAQR,SAAS,GAAI,MAE1BU,GAAI,IAAIp9I,WAAW,IACdm9I,EAAQT,SAAS,EAAG,MACpBQ,EAAQR,SAAS,EAAG,OACpBS,EAAQT,SAAS,GAAI,UAKhBI,cAAcO,EAA2BC,EAAkBV,EAA6CW,GAAU,G,0CAC9H,MAAMC,QAAkB,aACtB,MACAZ,EAASvxI,IACT,CAACrM,KAAM,YACP,EACA,CAACu+I,EAAU,UAAY,YAGnB/3H,QAA4B,GAAO+3H,EAAU,UAAY,WAAW,CACtEv+I,KAAM,UACNuyD,QAASqrF,EAASQ,GAClBrhJ,OAA6B,EAArB6gJ,EAASQ,GAAGrhJ,QAEtByhJ,EACAH,GAGF,OAAO,IAAIr9I,WAAWwlB,MAGhBi4H,qBAAqB/3I,EAAexF,EAAewB,GACzD,IAAIg8I,GAAe,EACnB,IAAI,IAAIj9I,EAAI,EAAGA,EAAIiB,IAASjB,EACvBiF,EAAEjF,KAAOP,EAAEO,KACZi9I,GAAe,GAInB,OAAQA,EAGGC,iBAAiBn4H,G,0CAC5B,GAAGA,EAAOzpB,OAAS,IAAMypB,EAAOzpB,OAhHL,UAiHzB,OAGF,MAAM,WAAC4oB,EAAU,KAAExpB,GAAQD,KAErBie,GAAKwL,EAAa,EAAI,IAAe,cAATxpB,EAAuB,IAAM,GACzDkQ,EAAMnQ,KAAKghJ,OAEXS,EAASn3H,EAAOk3H,SAAS,EAAG,IAC5BW,EAAgB73H,EAAOk3H,SAAS,IAChCkB,EAAoBp4H,EAAOzpB,OAAS,GAEpC6gJ,QAAiB1hJ,KAAK2hJ,gBAAgBxxI,EAAKsxI,EAAQxjI,GAEnD0kI,QAAyB3iJ,KAAK4hJ,cAAcO,EAAeO,EAAmBhB,GAAU,GAExFH,QAAoBvhJ,KAAKkhJ,aAAa,CAC1C/wI,EAAIqxI,SAAS,GAAKvjI,EAAG,GAAKA,EAAI,IAC9B0kI,IAGF,GAAG3iJ,KAAKuiJ,qBAAqBhB,EAAYC,SAAS,GAAIC,EAAQ,IAC5D,OAGF,MACMK,EADW,IAAIz3H,SAASs4H,EAAiBr4H,QAC1Bs4H,UAAU,GAC/B,OAAG5iJ,KAAKihJ,OAAOp3I,IAAIi4I,QAAnB,GAGA9hJ,KAAKihJ,OAAOh8I,IAAI68I,EAAKA,GAEda,EAAiB/hJ,MAAM,Q,cGlJnB,MAAMiiJ,GACnB1uH,qBAAqB0Q,GACnB,MAAM,aAACy5G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEvnI,EAAK,MAAED,GAAS4tB,EACjD3tB,EAAMjX,KAAO,QACbgX,EAAMhX,KAAO,QACb,MAAMqW,EAAQ,CAACY,EAAOD,GAEhB6rI,EAAgB,IAAI,KAC1BA,EAAcvhJ,IACZ,MACA,2BACA,MACA,SAGC+8I,GACDA,EAAav5I,SAASkZ,IACpB,MAAM,KAACm1C,EAAI,YAAEmrF,EAAW,MAAE57H,GAAS1E,EACnC6kI,EAAcvhJ,IACZ,iBAAiB6xD,KAAQmrF,IACzB,WAAW57H,QAId67H,GAASC,GACVqE,EAAcvhJ,IACZ,eAAei9I,IACf,aAAaC,KAIjBqE,EAAcvhJ,IACZ,uBACA,uBACA,0BAEF,MAAMwhJ,EAAa,SAAWzsI,EAAM5L,KAAIuT,GAAKA,EAAE6gI,OAAMj2H,KAAK,KAC1D,IAAI,IAAItjB,EAAI,EAAGA,EAAI+Q,EAAMzV,OAAQ0E,IAAK,CACpC,MAAMsqC,EAAIv5B,EAAM/Q,IACV,KAACtF,EAAI,KAAE6+I,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAiBxvG,EAC9D,OAAO5vC,GACL,IAAK,QACH6iJ,EAAcvhJ,IACZ,mCAAmCs+I,EAAan1I,KAAKuT,GAAWA,EAAEpN,KAAIgY,KAAK,OAC3E,mBACA,0BACA,wBACA,SAAStjB,IACT,aACAy9I,GAAU3D,IAETP,GACDgE,EAAcvhJ,IAAI,UAAUwhJ,UAAmBjE,KAEjDgE,EAAcvhJ,IACZ,aACA0hJ,GAAgBpD,GAChBqD,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,IAGlC,MAGF,IAAK,QACHD,EAAcvhJ,IACZ,mCAAmCs+I,EAAan1I,KAAKuT,GAAWA,EAAEpN,KAAIgY,KAAK,OAC3E,mBACA,0BACA,wBACA,SAAStjB,IACT,aACAy9I,GAAU3D,IAETP,GACDgE,EAAcvhJ,IAAI,UAAUwhJ,UAAmBjE,KAEjDgE,EAAcvhJ,IACZ,aACA,eACA0hJ,GAAgBpD,GAChBqD,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,KAOxC,OADAD,EAAcvhJ,IC4NT,mJD3NEuhJ,EAAcK,WAGvBhvH,sBAAsB0Q,GACpB,MAAM,aAACy5G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEvnI,EAAK,MAAED,GAAS4tB,EACjD3tB,EAAMjX,KAAO,QACbgX,EAAMhX,KAAO,QACb,MAAMqW,EAAQ,CAACY,EAAOD,GAEhB6rI,EAAgB,IAAI,KAC1BA,EAAcvhJ,IACZ,MACA,2BACA,MACA,SAGC+8I,GACDA,EAAav5I,SAASkZ,IACpB,MAAM,KAACm1C,EAAI,YAAEmrF,EAAW,MAAE57H,GAAS1E,EACnC6kI,EAAcvhJ,IACZ,iBAAiB6xD,KAAQmrF,IACzB,WAAW57H,QAId67H,GAASC,GACVqE,EAAcvhJ,IACZ,eAAei9I,IACf,aAAaC,KAIjBqE,EAAcvhJ,IACZ,uBACA,uBACA,0BAEF,MAAMwhJ,EAAa,SAAWzsI,EAAM5L,KAAIuT,GAAKA,EAAE6gI,OAAMj2H,KAAK,KAC1D,IAAI,IAAItjB,EAAI,EAAGA,EAAI+Q,EAAMzV,OAAQ0E,IAAK,CACpC,MAAMsqC,EAAIv5B,EAAM/Q,IACV,KAACtF,EAAI,KAAE6+I,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAiBxvG,EAC9D,OAAO5vC,GACL,IAAK,QACH6iJ,EAAcvhJ,IACZ,mCAAmCs+I,EAAan1I,KAAKuT,GAAWA,EAAEpN,KAAIgY,KAAK,OAC3E,mBACA,0BACA,wBACA,SAAStjB,IACT,aACAy9I,GAAU3D,IAETP,GACDgE,EAAcvhJ,IAAI,UAAUwhJ,UAAmBjE,KAEjDgE,EAAcvhJ,IACZ,aACA0hJ,GAAgBpD,GAChBqD,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,IAElC,MAGF,IAAK,QACHD,EAAcvhJ,IACZ,mCAAmCs+I,EAAan1I,KAAKuT,GAAWA,EAAEpN,KAAIgY,KAAK,OAC3E,mBACA,0BACA,wBACA,SAAStjB,IACT,aACAy9I,GAAU3D,IAETP,GACDgE,EAAcvhJ,IAAI,UAAUwhJ,UAAmBjE,KAGjDgE,EAAcvhJ,IACZ,aACA,eACA0hJ,GAAgBpD,GAChBqD,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,KAOxC,OADAD,EAAcvhJ,ICmIT,mJDlIEuhJ,EAAcK,YErLlB,MAAMC,GACTjvH,qBAAqB0Q,GACjB,MAAM,aAAEy5G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEvnI,EAAK,MAAED,GAAU4tB,EACnD3tB,EAAMjX,KAAO,QACbgX,EAAMhX,KAAO,QACb,MAAMqW,EAAQ,CAACY,EAAOD,GAEtB,IAAImnI,EAAM,0CAINE,GACAA,EAAav5I,SAAQkZ,IACjB,MAAM,KAAEm1C,EAAI,YAAEmrF,EAAW,MAAE57H,GAAU1E,EACrCmgI,GAAO,mBACPhrF,KAAQmrF,cACd57H,OAGE67H,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM2E,EAAa,SAAWzsI,EAAM5L,KAAIuT,GAAKA,EAAE6gI,OAAMj2H,KAAK,KAC1D,IAAK,IAAItjB,EAAI,EAAGA,EAAI+Q,EAAMzV,OAAQ0E,IAAK,CACnC,MAAMsqC,EAAIv5B,EAAM/Q,IACV,KAAEtF,EAAI,KAAE6+I,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAkBxvG,EAChE,OAAQ5vC,GACJ,IAAK,QACDm+I,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iCAEvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACjBjB,GAAO,eAEPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,GAEvC,MAEJ,IAAK,QACD3E,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iCAEvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACjBjB,GAAO,6BAGPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,IAUnD,OAJA3E,GDsPC,kJCrPDA,GAAO,KAGAA,EAGXjqH,sBAAsB0Q,GAClB,MAAM,aAAEy5G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEvnI,EAAK,MAAED,GAAU4tB,EACnD3tB,EAAMjX,KAAO,QACbgX,EAAMhX,KAAO,QACb,MAAMqW,EAAQ,CAACY,EAAOD,GAEtB,IAAImnI,EAAM,0CAINE,GACAA,EAAav5I,SAAQkZ,IACjB,MAAM,KAAEm1C,EAAI,YAAEmrF,EAAW,MAAE57H,GAAU1E,EACrCmgI,GAAO,mBACPhrF,KAAQmrF,cACd57H,OAGE67H,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM2E,EAAa,SAAWzsI,EAAM5L,KAAIuT,GAAKA,EAAE6gI,OAAMj2H,KAAK,KAC1D,IAAK,IAAItjB,EAAI,EAAGA,EAAI+Q,EAAMzV,OAAQ0E,IAAK,CACnC,MAAMsqC,EAAIv5B,EAAM/Q,IACV,KAAEtF,EAAI,IAAE8I,EAAG,KAAE+1I,EAAI,WAAEE,EAAU,aAAEa,EAAY,IAAEwD,EAAG,cAAEhE,GAAkBxvG,EAC1E,OAAQ5vC,GACJ,IAAK,QACDm+I,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iCAEvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACjBjB,GAAO,eAEPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,GAEvC,MAEJ,IAAK,QACD3E,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iCAEvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACjBjB,GAAO,6BAGPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,IASnD,OAJA3E,GDgLC,kJC/KDA,GAAO,KAGAA,GC3IR,MAAMkF,GACTnvH,qBAAqB0Q,GACjB,MAAM,aAAEy5G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEvnI,EAAK,MAAED,GAAU4tB,EACnD3tB,EAAMjX,KAAO,QACbgX,EAAMhX,KAAO,QACb,MAAMqW,EAAQ,CAACY,EAAOD,GAEtB,IAAKX,EAAMzV,OACP,MAAO,oEAQX,IAAIu9I,EAAM,4CAINE,GACAA,EAAav5I,SAAQkZ,IACjB,MAAM,KAAEm1C,EAAI,YAAEmrF,EAAW,MAAE57H,GAAU1E,EACrCmgI,GAAO,mBACPhrF,KAAQmrF,cACd57H,OAGE67H,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM2E,EAAa,SAAWzsI,EAAM5L,KAAIuT,GAAKA,EAAE6gI,OAAMj2H,KAAK,KAC1D,IAAK,IAAItjB,EAAI,EAAGA,EAAI+Q,EAAMzV,OAAQ0E,IAAK,CACnC,MAAMsqC,EAAIv5B,EAAM/Q,IACV,KAAEtF,EAAI,KAAE6+I,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAkBxvG,EAChE,OAAQ5vC,GACJ,IAAK,QACDm+I,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iFAIvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACbP,IACAV,GAAO,YACtB2E,UAAmBjE,KAERV,GAAO,eAEPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,GAEvC,MAEJ,IAAK,QACD3E,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iFAIvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACbP,IACAV,GAAO,YACtB2E,UAAmBjE,KAERV,GAAO,6BAGPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,IASnD,OAJA3E,GFkOC,kJEjODA,GAAO,KAGAA,EAGXjqH,sBAAsB0Q,GAClB,MAAM,aAAEy5G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEvnI,EAAK,MAAED,GAAU4tB,EACnD3tB,EAAMjX,KAAO,QACbgX,EAAMhX,KAAO,QACb,MAAMqW,EAAQ,CAACY,EAAOD,GAEtB,IAAKX,EAAMzV,OACP,MAAO,oEAQX,IAAIu9I,EAAM,4CAINE,GACAA,EAAav5I,SAAQkZ,IACjB,MAAM,KAAEm1C,EAAI,YAAEmrF,EAAW,MAAE57H,GAAU1E,EACrCmgI,GAAO,mBACPhrF,KAAQmrF,cACd57H,OAGE67H,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM2E,EAAa,SAAWzsI,EAAM5L,KAAIuT,GAAKA,EAAE6gI,OAAMj2H,KAAK,KAC1D,IAAK,IAAItjB,EAAI,EAAGA,EAAI+Q,EAAMzV,OAAQ0E,IAAK,CACnC,MAAMsqC,EAAIv5B,EAAM/Q,IACV,KAAEtF,EAAI,KAAE6+I,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAkBxvG,EAChE,OAAQ5vC,GACJ,IAAK,QACDm+I,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iFAIvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACbP,IACAV,GAAO,YACtB2E,UAAmBjE,KAERV,GAAO,eAEPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,GAEvC,MAEJ,IAAK,QACD3E,GAAO,iCACGyB,EAAan1I,KAAIuT,GAAKA,EAAEpN,KAAIgY,KAAK,iFAIvDtjB,gBAEY64I,GAAO4E,GAAU3D,GACbP,IACAV,GAAO,YACtB2E,UAAmBjE,KAERV,GAAO,6BAGPA,GAAO6E,GAAgBpD,GACvBzB,GAAO8E,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,IASnD,OAJA3E,GFuIC,kJEtIDA,GAAO,KAGAA,GFqDR,SAASmF,KACd,OAAOruI,UAAUiB,UAAUgqC,cAAclgC,QAAQ,YAAc,EAGjE,SAASujI,KACP,OAAOtuI,UAAUiB,UAAUgqC,cAAclgC,QAAQ,WAAa,IAA8D,IAAzD/K,UAAUiB,UAAUgqC,cAAclgC,QAAQ,UAGxG,SAAS+iI,GAAUS,GACxB,IAAIrF,EAAM,GAEV,IAAK,IAAIsF,EAAI,EAAGA,EAAID,EAAO5iJ,OAAQ6iJ,IAAK,CACtC,MAAMzjG,EAAMwjG,EAAOC,IACb,GAAE7yI,EAAE,IAAE8E,GAAQsqC,EAEpBnyC,QAAQ4Z,IAAI,eAAgB7W,EAAI8E,GAChCyoI,EAAIt2I,KAAK,YAAY+I,KAAM8E,KAG7B,OAAOyoI,EAAIv1H,KAAK,MAGX,SAASo6H,GAAgBvqF,GAC9B,IAAI0lF,EAAM,GACVtwI,QAAQ4Z,IAAI,wBAAyBgxC,GACrC,IAAK,IAAInzD,EAAI,EAAGA,EAAImzD,EAAM73D,OAAQ0E,IAAK,CACrC,MAAMtF,EAAOy4D,EAAMnzD,IACb,GAAEsL,EAAE,KAAE/M,EAAI,UAAE27I,EAAS,SAAEprE,EAAQ,cAAEqrE,EAAa,WAAEE,GAAe3/I,EAQrE,GAPAm+I,EAAIt2I,KAAK,YAAY+I,KAAM/M,KAAQ27I,IAAYprE,EAAW,IAAMA,EAAW,MACvEqrE,GACFA,EAAc36I,SAAQkZ,IACpB,MAAM,KAAEhe,EAAI,QAAE0/I,GAAY1hI,EAC1BmgI,EAAIt2I,KAAK,aAAa+I,KAAM,CAAC5Q,EAAM0/I,GAAS92H,KAAK,WAGjD+2H,EAAY,CACd,MAAM+D,EAAO,GACbjpI,OAAOkpI,oBAAoBhE,GAAY76I,SAAQ8+I,IAC7CF,EAAK77I,KAAK,GAAG+7I,KAASjE,EAAWiE,SAGnCzF,EAAIt2I,KAAK,UAAU+I,KAAM8yI,EAAK96H,KAAK,SAIvC,OAAOu1H,EAAIv1H,KAAK,MAGX,SAASq6H,GAAQjjJ,EAAM6+I,EAAME,EAAY+D,GAC9C,IAAI3E,EAAM,GAyBV,OAvBIY,GAAcA,EAAWn+I,OAAS,EACpCm+I,EAAWj6I,SAAQ++I,IACbA,GAAaA,EAAU3E,MAAMt+I,OAAS,IACxCu9I,EAAIt2I,KAAK,gBAAgBg8I,EAAU5E,aAAa4E,EAAU3E,MAAMt2H,KAAK,QACrEi7H,EAAU3E,MAAMp6I,SAAQ+5I,IACtBV,EAAIt2I,KACF,UAAUg3I,iBAAoBA,IAC9B,UAAUA,UAAaiE,KAAc9iJ,IAAO6+I,IAC5C,UAAUA,aAAgB7+I,IAAO6+I,IACjC,UAAUA,WAAc7+I,IAAO6+I,YAK9BA,GACTV,EAAIt2I,KACF,UAAUg3I,iBAAoBA,IAC9B,UAAUA,UAAaiE,KAAc9iJ,IAAO6+I,IAC5C,UAAUA,aAAgB7+I,IAAO6+I,IACjC,UAAUA,WAAc7+I,IAAO6+I,KAI5BV,EAAIv1H,KAAK,MAYX,MAAMk7H,GACX5vH,yBAAyB0Q,GACvB,IAAKA,EAAM,OAAO,KAElB,MAAM,UAAEm/G,EAAS,cAAEC,EAAa,OAAEC,EAAM,WAAEC,EAAU,UAAEC,EAAS,SAAEC,EAAQ,SAAEC,EAAQ,QAAErwI,EAAO,KAAEhU,EAAI,WAAEskJ,EAAU,WAAEC,EAAU,QAAEC,EAAO,UAAEC,EAAS,YAAEC,EAAW,SAAEvpH,GAAayJ,EAExK,GAAIm/G,EACF,MAAO,CACLY,UAAWZ,EACXC,cAAAA,EACAC,OAAAA,GAIN,KAAM,eAiCR/vH,qBAAqB0Q,GACnB,OAAI0+G,KACKH,GAAqByB,cAAchgH,GACjC2+G,KACFF,GAAoBuB,cAAchgH,GAGpCg+G,GAAoBgC,cAAchgH,GAG3C1Q,sBAAsB0Q,GACpB,OAAI0+G,KACKH,GAAqB0B,eAAejgH,GAClC2+G,KACFF,GAAoBwB,eAAejgH,GAGrCg+G,GAAoBiC,eAAejgH,I,sTGxW/B,MAAMkgH,WAAqB,KAsDxCplJ,YAAYC,GAQVC,QAEAG,KAAK0nB,KAAM,EAAA2oC,EAAA,IAAO,QAEdrwD,KAAKqkJ,WACPrkJ,KAAKqkJ,SCrFF,CACL/6I,EAAG,oBACH0R,OAAQ,CACNgqI,SAAS,EACTC,eAAe,GAEjBC,UAAW,GACXC,UAAW,GACXC,iBAAkB,CAAC,YDgFnB,EAAAn+I,EAAA,GAAWjH,KAAMJ,GAEjBI,KAAKqlJ,UAAYhrG,KAAKC,MACtBt6C,KAAKqgJ,eAAgB,EACrBrgJ,KAAK0gJ,WAAY,EACjB1gJ,KAAKslJ,aAAe,GACpBtlJ,KAAKulJ,WAAa,GAElBvlJ,KAAKK,iBAAiB,SAAUi5B,IAC9Bt5B,KAAK0nB,IAAI,QAAS,GAAW4R,IAE1BA,IAAU,WACXt5B,KAAKmL,aAIT,MAAMq6I,EAAgBxlJ,KAAKwlJ,cAAgB,IAAI,KAAc,OAC7DA,EAAcrjJ,UAAY,WAC1BqjJ,EAAc9sF,MAAM5wD,KAAK,cACrB9H,KAAKypB,aACP+7H,EAAc7nB,QAAS,EACvB6nB,EAAcC,0BAA2B,GAG3C,IAAIvI,EAA6B,CAC/B,QAAS,aACTj9I,KAAM,QACNylJ,YAAY,EACZ7qI,OAAO,EACP0iI,gBAAiB,WACjBoI,cAAe,EACfrI,WAAY,YAGd,MAAM1sG,EAAO5wC,KACbk9I,EAAa,IAAI0I,MAAM1I,EAAY,CACjCj4I,IAAK,SAASuT,EAAQrI,EAAKzP,GAKzB,OAHA8X,EAAOrI,GAAOzP,EACdkwC,EAAKi1G,cAAc3I,GACnBtsG,EAAKk1G,kBACE,KAIX9lJ,KAAK+lJ,YAAc,CACjBhmJ,MAAOm9I,GAGTl9I,KAAK8lJ,eAAiB7rH,GAASj6B,KAAKgmJ,gBAAgBx9I,KAAKxI,MAAO,GAAG,GAAO,GAGxEg7I,sBACF,MAAM,iBAACiL,EAAgB,mBAAEC,GAAsBlmJ,KAC/C,QAAwBuG,IAArB0/I,EACD,OAAOA,EACF,GAAIC,EAEJ,CACL,MAAM,mBAACC,GAAsBD,EAAmBlG,WAChD,MAA0B,WAAvBmG,EACM,UACwB,cAAvBA,GAAwC,GAAAjwI,WAAoC,cAAvBiwI,EAGtD,aAFA,cANT,OAAO,cAaPC,gBACF,MAAMpL,EAAkBh7I,KAAKg7I,gBAE7B,IAAI7zI,EAAgB,MADN,UAAoB6zI,EAAkB,GAGpD,OADA7zI,GAAS,cAAiB6zI,IAAoB,YAAsBh7I,KAAKypB,WAAa,EAAIzpB,KAAKqlJ,WACxFl+I,EAGFg2I,gBAAgBl9I,GACrB,GAAY,UAATA,EAAkB,OAAOD,KAAK8oB,SAASpX,IAAI,QACzC,CACH,MAAMwrI,EAAal9I,KAAKg9I,cAAc,UACtC,IAAIE,EACF,OAGF,MAAMj9I,EAAiD,WAA1Bi9I,EAAWI,WAA0B,QAA0C,WAA/BJ,EAAWK,gBAA+B,kBAAeh3I,EACtI,IAAItG,EACF,OAGF,MAAMqvC,EAAQtvC,KAAKq8B,YAAYgqH,WAAW/2G,GAAUA,EAAMrvC,OAASA,IACnE,IAAIqvC,EACF,OAGF,OAAOtvC,KAAK8oB,SAASpX,IAAI,GAAK49B,EAAMg3G,UAAUjoC,SAIrCkoC,6B,0CACX,IACEvmJ,KAAKwmJ,mBAAoB,EACzBxmJ,KAAKymJ,kBAAmB,EACxBzmJ,KAAKwlJ,cAAc9sF,MAAQ,CAAC,QAAS,oBAC/B14D,KAAK0mJ,gBACX,MAAM74I,GACN7N,KAAK0nB,IAAI3Z,MAAM,2BAA4BF,OAIlCwqI,sB,0CAKX,OAJGr4I,KAAK68I,uBACA78I,KAAK2mJ,oBAGV3mJ,KAAK88I,gBACC98I,KAAK2mJ,mBAEL3mJ,KAAKumJ,gCAIHK,4B,0CACX,IACE5mJ,KAAKwmJ,mBAAoB,EACzBxmJ,KAAKymJ,kBAAmB,EACxBzmJ,KAAKwlJ,cAAc9sF,MAAQ,CAAC,QAAS,eAC/B14D,KAAK6mJ,oBAAmB,GAAO,GAAM,GAC3C,MAAMh5I,GACN7N,KAAK0nB,IAAI3Z,MAAM,0BAA2BF,OAIjC84I,mB,0CACX,MAAMzJ,EAAal9I,KAAKg9I,cAAc,SACtCE,EAAWI,WAAaJ,EAAWK,gBAAkB,WAErD,MAAM,cAACiI,EAAa,YAAEnpH,GAAer8B,KAC/B8mJ,EAAQtB,EAAcuB,YAAYC,iBAAiB,GACtDF,KACD,EAAAG,GAAA,GAAUH,GACVtB,EAAc0B,mBAAmB7qH,OAIxB67G,qB,0CAKX,OAJGl4I,KAAK88I,wBACA98I,KAAK2mJ,oBAGV3mJ,KAAK68I,eACC78I,KAAK2mJ,mBAEL3mJ,KAAK4mJ,+BAIT5J,cAAc/8I,GACnB,OAAOD,KAAK+lJ,YAAY9lJ,GAGnB4lJ,cAAc3I,GACnBl9I,KAAK+lJ,YAAY7I,EAAWj9I,MAAQi9I,EACpCl9I,KAAKsQ,cAAc,aAAc4sI,GAG5BiK,mBAAmBlnJ,GACxB,IAEE,OADsBJ,MAAMg9I,mBACA78I,KAAKwmJ,mBAA8B,eAATvmJ,GAA2BD,KAAKymJ,kBAA6B,UAATxmJ,GAI1G,MAAM4N,GACN,OAAO,GAIAgvI,qBACT,OAAO78I,KAAKmnJ,mBAAmB,SAGtBrK,sBACT,OAAO98I,KAAKmnJ,mBAAmB,cAGtBvK,cACT,MAAMwK,EAAapnJ,KAAKwlJ,cAAcuB,YAAYM,iBAAiB,GACnE,QAAQD,MAAAA,OAAU,EAAVA,EAAY1pI,SAGX4pI,gBACT,MAAM,gBAACtM,GAAmBh7I,KAC1B,OAAOg7I,IAAoB,YAAsBA,IAAoB,UAG5D3+G,kB,MACT,OAA8B,QAAvB,EAAAr8B,KAAKkmJ,0BAAkB,eAAE7pH,YAG3BkrH,iBAAiBl5I,EAAiB0+F,GACvC/sG,KAAKwnJ,qBACLxnJ,KAAKynJ,cAAgBppG,GAAA,cAAe,KAClCr+C,KAAKynJ,mBAAgBlhJ,EACrBvG,KAAKy4I,OAAO1rC,KACX1+F,GAGEm5I,0BACqBjhJ,IAAvBvG,KAAKynJ,gBACNl5I,aAAavO,KAAKynJ,eAClBznJ,KAAKynJ,mBAAgBlhJ,GAIlBmhJ,aAAaC,GAClB3nJ,KAAKigJ,KAAO0H,EAEZ,MAAM,GAAC92I,GAAM82I,EACb,GAAG3nJ,KAAK6Q,KAAOA,EAAI,CACjB,MAAMsgD,EAASnxD,KAAK6Q,GACpB7Q,KAAK6Q,GAAKA,EACV7Q,KAAKsQ,cAAc,KAAMO,EAAIsgD,IAIpBqrF,a,gDACX,MAAMoL,EAAsF,QAAzE,SAAMpkJ,QAAQC,IAAIzD,KAAKm1F,wBAAwB,wBAAwB,UAAE,SAC5F,GAAGn1F,KAAKsnJ,YAAcM,EACpB,OAIF5nJ,KAAK6nJ,wBAAwB,oBAE7B,MAAM5H,EAAOjgJ,KAAKigJ,KAClBjgJ,KAAK6mJ,oBAAmB,IAAQ5G,EAAKjlI,OAAO/D,OAAO,GAEnD,MAAM6wI,EAAW7H,EAAK6H,SACtB9nJ,KAAK+nJ,gBAAgBC,aAAajmJ,MAAKkmJ,IACrCjoJ,KAAKioJ,GAAK,CACRH,SAAAA,EACA9iJ,EAAGijJ,EAAGz9I,EACN09I,IAAKD,EAAGE,IACRC,SAAUH,EAAGH,SACbxrH,EAAG2rH,EAAG3rH,GAGDt8B,KAAKuhG,WAAW8mD,UAAU,mBAAoB,CACnD1iH,KAAM3lC,KAAK+nJ,gBAAgBO,aAAatoJ,KAAK6Q,IAC7CwzI,SAAUrkJ,KAAKqkJ,SACf6D,IAAKloJ,KAAKioJ,GAAGC,SAEdnmJ,MAAKwmJ,IACNvoJ,KAAK+nJ,gBAAgBS,mBAAmBD,SAIrCE,WACLzoJ,KAAK0nB,IAAI,YAET1nB,KAAK09I,uBAEL19I,KAAK6nJ,0BAEL,MAAM,WAACp+H,EAAU,cAAEi/H,EAAa,cAAElD,GAAiBxlJ,KAE7C2oJ,EErWK,SAA6B1I,GAC1C,MAAM2I,EAA6B,GAqCnC,OApCA3I,EAAK4I,YAAY9jJ,SAASi7I,IACxB,OAAOA,EAAW12I,GAIhB,IAAK,wBAAyB,CAC5B,MAAM,GAACy0D,EAAE,KAAE+qF,EAAI,KAAEC,EAAI,SAAE3tH,EAAQ,SAAE4tH,GAAYhJ,EACvCiJ,EAAiB,GACpBjJ,EAAWhlI,OAAOkuI,MAChBnrF,GACDkrF,EAAKnhJ,KAAK,QAAQi2D,KAAMgrF,KAEvBD,GACDG,EAAKnhJ,KAAK,SAASghJ,MAASC,MAEtB/I,EAAWhlI,OAAOmuI,OACvBprF,GACDkrF,EAAKnhJ,KAAK,QAAQi2D,KAAMgrF,KAEvBD,GACDG,EAAKnhJ,KAAK,SAASghJ,MAASC,MAI7BE,EAAKpoJ,OAAS,GACf+nJ,EAAW9gJ,KAAK,CACdmhJ,KAAAA,EACA7tH,SAAAA,EACAguH,WAAYJ,IAGhB,WAKC,CACLJ,WAAAA,EACAS,mBAAoBpJ,EAAKjlI,OAAOsuI,YAAc,MAAQ,SF6ThCC,CAAoBvpJ,KAAKigJ,MAE/C,GADAjgJ,KAAK0nB,IAAI,yBAA0BihI,IAC/BA,EAAe,OAEnB,MAAMzC,EAAqBlmJ,KAAKkmJ,mBAAqB,IAAIpG,GAAuB,CAC9EG,KAAMjgJ,KACNwlJ,cAAAA,EACA99H,IAAK1nB,KAAK0nB,IAAI8hI,WAAW,gBAGrBxJ,EAAakG,EAAmBuD,qBAAqBd,GAC3D3I,EAAW3/I,iBAAiB,4BAA4B,KACtD,MAAMi5B,EAAQt5B,KAAKg7I,qBACKz0I,IAArBvG,KAAKi7I,aAA6B3hH,IAAU,eAC7Ct5B,KAAKi7I,YAAc5gG,KAAKC,OAG1Bt6C,KAAKsQ,cAAc,QAASgpB,MAE9B0mH,EAAW3/I,iBAAiB,qBAAqB,KAC/C6lJ,EAAmBwD,eAErB1J,EAAW3/I,iBAAiB,gBAAiB2d,IAC3C,MAAM,UAAC4mI,GAAa5mI,EACpBgiI,EAAWt4H,IAAI,iBAAkBk9H,IAC9BA,MAAAA,OAAS,EAATA,EAAWA,YACZ5kJ,KAAK2pJ,iBAAiB/E,MAG1B5E,EAAW3/I,iBAAiB,SAAU2d,IACpC,MAAM,MAAC8oI,GAAS9oI,EAChBgiI,EAAWt4H,IAAI,UAAWo/H,GAC1B9mJ,KAAK4pJ,QAAQ5rI,MAGKkoI,EAAmB2D,oBAEvC7pJ,KAAK8pJ,UAAY,IAAI/I,GAAat3H,EAAYi/H,GAC9C1oJ,KAAK+pJ,UAAY,IAAIhJ,IAAct3H,EAAYi/H,GAE/C1oJ,KAAK0nB,IAAI,cAAe1nB,MAErBypB,GACDy8H,EAAmB8D,2BAGrBhqJ,KAAKiqJ,oBAELjqJ,KAAKkqJ,sBAGCC,yBACN,MAAMC,EAAmBpqJ,KAAKq8B,YAAYguH,YAAY,eACtDD,EAAiB5nJ,aAAa,YAC9B4nJ,EAAiBE,UAAYF,EAAiB9D,UAAY8D,EAGpDH,oBACN,GAAGjqJ,KAAKkmJ,mBAAmBqE,YACzB,OAGF,MAAMjvH,EAAUt7B,KAAKkmJ,mBAAmB+D,kBAAkB,CACxDp5I,GAAI,EACJ25I,YAAY,IAEdlvH,EAAQj7B,iBAAiB,WAAYC,IACnCN,KAAKyqJ,qBAAqBtmG,KAAKumG,MAAMpqJ,EAAEmjD,UAEzCnoB,EAAQj7B,iBAAiB,QAAQ,KAC/BL,KAAK8lJ,oBAID2E,qBAAqBhnG,GAEpB,eADAA,EAAK,UAERA,EAAKxjD,KAAO,SACZD,KAAK0nB,IAAI,yBAA0B+7B,GACnCzjD,KAAK6lJ,cAAcpiG,IAKnBzjD,KAAK0nB,IAAI3Z,MAAM,6BAA8B01C,GAK3CuiG,kBACN,MAAM,mBAACE,GAAsBlmJ,KAC7B,IAAIkmJ,EAAoB,OAExB,MAAMhJ,EAAa,OAAH,UAAOl9I,KAAKg9I,cAAc,iBAEnCE,EAAWj9I,KAClBD,KAAK0nB,IAAI,iBAAkBw1H,GAE3BgJ,EAAmByE,oBAAoBzN,GAG5B0D,sBAAsBn9F,G,0CAKjC,MAAM3tC,EAAOquC,KAAKC,UAAUX,GACtBj+C,GAAM,IAAI27I,aAAcC,OAAOtrI,IAC/B,MAACiG,SAAe/b,KAAK8pJ,UAAUjI,iBAAiBr8I,GAEtDxF,KAAK0nB,IAAI,wBAAyB1nB,KAAK6Q,GAAIiF,SACrC9V,KAAKuhG,WAAW8mD,UAAU,0BAA2B,CACzD1iH,KAAM3lC,KAAK+nJ,gBAAgBO,aAAatoJ,KAAK6Q,IAC7C4yC,KAAM1nC,OAIH4tI,iBAAiBiB,GACtB5qJ,KAAK0nB,IAAI,mBAAoBkjI,GAC7B,MAAM,UAAChG,EAAS,cAAEX,GAAiB2G,EACnC,GAAqB,IAAlB3G,EACD,OAGF,MAAM4G,EHleH,SAA2BjG,GAChC,IAAIA,IAAcA,EAAUxmC,WAAW,cACrC,OAGF,MAAM4lC,EAAYY,EAClBA,EAAYA,EAAUlhC,OAAO,aAAa7iH,QAE1C,MAAOsjJ,EAAYC,EAAWC,EAAUC,EAAUvmF,EAAIgrF,KAASx3E,GAASqzE,EAAU5kG,MAAM,KAClF/nB,EAAI,CACR+rH,UAAAA,EACAG,WAAAA,EACAC,UAAAA,EACAC,SAAAA,EACAC,SAAAA,EACArwI,QAAS,CAAE8pD,GAAAA,EAAIgrF,KAAAA,IAGjB,IAAI,IAAIxjJ,EAAI,EAAGA,EAAIgsE,EAAM1wE,OAAQ0E,GAAK,EACpC,OAAOgsE,EAAMhsE,IACX,IAAK,MACH0yB,EAAEh4B,KAAOsxE,EAAMhsE,EAAI,GACnB,MAEF,IAAK,QACC0yB,EAAEssH,aACJtsH,EAAEssH,WAAa,IAGjBtsH,EAAEssH,WAAWxmF,GAAKwT,EAAMhsE,EAAI,GAC5B,MAEF,IAAK,QACC0yB,EAAEssH,aACJtsH,EAAEssH,WAAa,IAGjBtsH,EAAEssH,WAAWwE,KAAOx3E,EAAMhsE,EAAI,GAC9B,MAEF,IAAK,aACH0yB,EAAEusH,WAAajzE,EAAMhsE,EAAI,GACzB,MAEF,IAAK,UACH0yB,EAAEwsH,QAAUlzE,EAAMhsE,EAAI,GACtB,MAEF,IAAK,aACH0yB,EAAEysH,UAAYnzE,EAAMhsE,EAAI,GACxB,MAEF,IAAK,eACH0yB,EAAE0sH,YAAcpzE,EAAMhsE,EAAI,GAC1B,MAEF,IAAK,QACH0yB,EAAEmD,SAAWm2C,EAAMhsE,EAAI,GAM7B,OAAO0yB,EGmaU6yH,CAAkBlG,GAMjC5kJ,KAAK4gJ,sBAAsB,CACzB,QAAS,aACT2E,WAAY,CAACsF,KAIJE,c,0CACX,MAAM,gBAAChD,EAAe,WAAExmD,EAAU,SAAE8iD,EAAQ,GAAExzI,EAAE,KAAEovI,GAAQjgJ,KACpDioJ,EAAKjoJ,KAAKioJ,GAGhBjoJ,KAAK6nJ,wBAAwB,oBAC7B,MAAM,IAAC13I,EAAG,gBAAE66I,SAAyBjD,EAAgBkD,WAAYhL,EAAqCiI,IAAKD,EAAGz9I,EAAGy9I,EAAG3rH,GAE9GisH,QAAuBhnD,EAAW8mD,UAAU,oBAAqB,CACrE1iH,KAAMoiH,EAAgBO,aAAaz3I,GACnCwzI,SAAUA,EACV8D,IAAKF,EAAGE,IACR6C,gBAAiBA,IAGnBhrJ,KAAK0oJ,cAAgBv4I,EACrB43I,EAAgBS,mBAAmBD,GACnCvoJ,KAAKyoJ,cAGA/K,uBACL,OAAG19I,KAAKkrJ,kBAA0BlrJ,KAAKkrJ,kBACpClrJ,KAAKmrJ,4BAAoCnrJ,KAAKmrJ,4BAC1CnrJ,KAAKmrJ,4BAA8BnrJ,KAAKuhG,WAAW6pD,aAAa,yBAA0BprJ,KAAK0oJ,cAAe1oJ,KAAKioJ,GAAGE,KAAKpmJ,MAAKspJ,IACrIrrJ,KAAKmrJ,iCAA8B5kJ,EAC5BvG,KAAKkrJ,kBAAoBG,EAAW3gJ,KAAI2gJ,IAAc,SAAoBA,QAI7EC,sBACNtrJ,KAAKkmJ,mBAAmBV,cAAc7nB,QAAS,EAC/C39H,KAAKkmJ,mBAAmB8D,2BAGZuB,a,0CACZvrJ,KAAKkmJ,mBAAmB8D,2BAExB,MAAMhK,EAAahgJ,KAAKkmJ,mBAAmBlG,WAE3C,IAAI5pG,QAAe4pG,EAAWM,eAE9BtgJ,KAAK0nB,IAAI,cAAe0uB,EAAOn2C,KAAMm2C,EAAOgoG,WACtC4B,EAAWO,oBAAoBnqG,GAErC4pG,EAAWwL,kBAAkB1hJ,QAAO2hJ,GAAyC,aAA1BA,EAAYtpJ,YAA0B4C,SAAQ0mJ,IAC/F,MAAMn8G,EAAQtvC,KAAKkmJ,mBAAmB7pH,YAAYqvH,cAAcD,EAAY1iJ,KAC5EumC,EAAMm8G,YAAcn8G,EAAMg3G,UAAUmF,YAAcA,EAClDA,EAAYtpJ,UAAY,cAG1B,MAEMk6B,EAAcr8B,KAAKq8B,YACzB,IAAIsvH,EAAStvH,EAAYgT,QAAQ3kC,KAAI4kC,GAASA,EAAMvmC,MACpD,MAAM6iJ,EAA4C,CAChD3rJ,KAA4B,QAC5Bm+I,IAAK/hH,EAAYwvH,YAAY,CAC3BF,OAAAA,EACAt8G,QAAShT,EAAYgT,QAAQvlC,QAAOwlC,GAASq8G,EAAOpsH,SAAS+P,EAAMvmC,OAEnE+iJ,UAAU,WAIR9L,EAAW+L,qBAAqBH,GAEtCx1G,QAAe4pG,EAAWM,qBAEpBN,EAAWO,oBAAoBnqG,GAErC,MAAMuqG,EAAexC,IAAmB,SAAS/nG,EAAOgoG,MACxDp+I,KAAK0nB,IAAI,yBACT1nB,KAAK4gJ,sBAAsBD,GAE3B3gJ,KAAKsrJ,yBAGAzD,wBAAwBvuH,GAC7Bt5B,KAAKimJ,iBAAmB3sH,EACxBt5B,KAAKsQ,cAAc,QAAStQ,KAAKg7I,iBAGxBvjI,eACT,YAA4BlR,IAArBvG,KAAKi7I,aAA6B5gG,KAAKC,MAAQt6C,KAAKi7I,aAAe,IAAO,EAAI,EAG7E+Q,cAAcC,GACtBpsJ,MAAMmsJ,cAAcC,GAEpB,MAAMC,EAAaD,EAAOjF,iBAAiB,GAC3C,GAAGkF,EAAY,CACb,MAAM5yH,EAAQt5B,KAAKg9I,cAAc,SAG7Bh9I,KAAKwmJ,mBAAsBxmJ,KAAKymJ,mBAClCzmJ,KAAKymJ,kBAAmB,GAGvBzmJ,KAAK68I,eACNvjH,EAAMgkH,WAAa,SACXt9I,KAAK88I,kBACbxjH,EAAMikH,gBAAkB,UAG1B2O,EAAW7rJ,iBAAiB,SAAS,KACnCL,KAAK2mJ,qBACJ,CAACxrI,MAAM,IAGT8wI,EAAO5E,iBAAiBxmJ,QACzBb,KAAKmsJ,gBAIDA,gBACN,MAAMvP,EAAU58I,KAAK48I,QACrB58I,KAAKsQ,cAAc,QAASssI,GAEd58I,KAAKg9I,cAAc,SAC3BniI,MAAQ+hI,EAGTtE,cACL,OAAOt4I,KAAKosJ,oBAAmB,GAAMrqJ,MAAK,KACxC/B,KAAKqsJ,WACLrsJ,KAAKmsJ,mBAII1T,OAAO6T,EAA6CC,G,0CAC/D,IAAGvsJ,KAAKsnJ,YAIRtnJ,KAAKssJ,cAAgBA,EACrBtsJ,KAAK0nB,IAAI,SAAU4kI,GACnBtsJ,KAAK6nJ,wBAAwB,WAE1B7nJ,KAAKkmJ,oBACNlmJ,KAAKkmJ,mBAAmBsG,0BAAyB,GAGhDF,IAAkBC,GAAuB,CAC1C,IAAIE,GAAW,EACf,IAAI,MAAMxsJ,KAAQD,KAAK+lJ,YAAa,CAClC,MAAM7I,EAAal9I,KAAK+lJ,YAAY9lJ,GACpCwsJ,EAAqC,WAA1BvP,EAAWI,YAA0D,WAA/BJ,EAAWK,iBAAgCkP,QAGxFzsJ,KAAK+nJ,gBAAgB2E,YAAY1sJ,KAAK6Q,GAAI7Q,KAAKyX,SAAU60I,EAAeG,OAI1EE,aAAaC,GACnB,MAAM/M,EAA4C+M,EAAO/M,aAAan1I,KAAI80I,GACjE,OAAP,wBACKA,GAAW,CACd,WAAYA,EAAYE,kBAS5B,MAL0B,CACxB,cAAekN,EAAOvN,cACtB,gBAAiBQ,GAMbgN,qBAAqBppG,GAC3BzjD,KAAKq8B,YAAYywH,QAAQ,CACvBC,UAAW,CACTtO,IAAKh7F,EAAKg7F,IACVD,MAAO/6F,EAAK+6F,MACZF,aAAc76F,EAAK66F,aACnB,YAAY,GAEdpnI,MAAOlX,KAAK2sJ,aAAalpG,EAAKvsC,OAC9BD,MAAOwsC,EAAKxsC,MAAQjX,KAAK2sJ,aAAalpG,EAAKxsC,YAAuB1Q,EAClEm4I,WAAYj7F,EAAKi7F,WAAa1+I,KAAK2sJ,aAAalpG,EAAKi7F,iBAA4Bn4I,IAI7EymJ,aAAarM,GACf3gJ,KAAKypB,YACP,CAACk3H,EAAa1pI,MAAO0pI,EAAajC,YAAY50I,OAAOa,SAAS5F,SAAQ85I,IACpE,MAAMgB,EAAehB,EAAMgB,aACrB15I,EAAM05I,EAAa/mI,WAAU0mI,GAAoC,QAArBA,EAAY17I,OACxDmpJ,EAAiBpN,EAAa15I,GAC9B+mJ,EAASrN,EAAa/mI,WAAU0mI,IAAc,MAAC,QAAuB,QAAtB,EAAAA,EAAYI,kBAAU,eAAEuN,OAAQF,EAAep8I,MACrGguI,EAAMgB,aAAe,CAACA,EAAa15I,GAAM05I,EAAaqN,OAK/CE,uBAAuB3pG,G,0CAClCzjD,KAAK0nB,IAAI,yBAA0B1nB,KAAMyjD,GAEzC,MAAM,WAACu8F,EAAU,YAAE3jH,GAAer8B,KAAKkmJ,mBAEvC,OAAOziG,EAAK,UACV,IAAK,eAAgB,CACnBzjD,KAAK0nB,IAAI,qBAAsB+7B,GAE/BzjD,KAAKgtJ,aAAavpG,GAClBzjD,KAAK6sJ,qBAAqBppG,GAE1B,MAAM4pG,EAAqBrO,GAClBA,EAAWt0I,KAAIo5I,IACb,CACLx6I,EAAG,uCACH41I,UAAW4E,EAAU5E,UACrBE,QAAS0E,EAAU3E,MAAMz0I,KAAI2zG,IAAWA,QAKhC,EACZ,SAAa,SAAU56D,EAAKvsC,MAAM4nI,MAClCr7F,EAAKxsC,OAAQ,SAAa,QAASo2I,EAAkB5pG,EAAKxsC,MAAM+nI,kBAAez4I,EAC/Ek9C,EAAKi7F,YAAa,SAAa,aAAc2O,EAAkB5pG,EAAKi7F,WAAWM,kBAAez4I,GAC9FuD,OAAOa,SAEH5F,SAAQ+5I,IACZ,IAAIxvG,EAAQjT,EAAYixH,iBAAiBxO,EAAKzgC,QAC9C,GAAG/uE,EACD,OAGF,MAAMi+G,EAAgBlxH,EAAYmxH,sBAAsB1O,EAAK7+I,MAAM,GACnEqvC,EAAQ,IAAI,MAAgBi+G,EAAcxkJ,IAAK+1I,EAAK7+I,MACpDqvC,EAAM9sC,aAAa,YACnB+qJ,EAAcjH,UAAYh3G,EAE1BjT,EAAYoxH,eAAen+G,EAAOwvG,EAAKC,cAAgBD,EAAKzgC,WAG9Dr+G,KAAKmqJ,yBAEL,MAAM2B,EAAW9rJ,KAAK0gJ,UACtB1gJ,KAAK0gJ,WAAY,EAEjB,IAAIiL,EAAStvH,EAAYgT,QAAQ3kC,KAAI4kC,GAASA,EAAMvmC,MACpD,MAAM6iJ,EAA4C,CAChD3rJ,KAAM6rJ,EAAW,SAAW,QAC5B1N,IAAK/hH,EAAYwvH,YAAY,CAC3BF,OAAAA,EACAt8G,QAAShT,EAAYgT,QAAQvlC,QAAOwlC,GAASq8G,EAAOpsH,SAAS+P,EAAMvmC,OAEnE+iJ,UAAWA,KAIf9rJ,KAAK0nB,IAAI,eAAgBkkI,EAAexN,WAElC4B,EAAW+L,qBAAqBH,SAEhC5rJ,KAAK0tJ,yBAEP5B,UACI9rJ,KAAKurJ,cAGb,MAGF,IAAK,aACH,IAAI,MAAM3G,KAAanhG,EAAK8hG,WAAY,CACtC,MAAM31I,EAA4Bm0I,GAAc4J,kBAAkB/I,GAClEh1I,EAAKq0I,cAAgB,EACrB,MAAM2G,EAAe,IAAIgD,gBAAgBh+I,GACzC5P,KAAKulJ,WAAWz9I,KAAK8iJ,SAGjB5qJ,KAAK0tJ,yBACX,MAGF,QACE1tJ,KAAK0nB,IAAI3Z,MAAM,8BAA+B01C,OAKvCiqG,yB,0CACX,MAAM,mBAACxH,GAAsBlmJ,KAC7B,IAAIkmJ,EACF,OAGF,MAAM,WAAClG,GAAckG,EACrB,GAAGlG,EAAWG,kBAAmB,CAC/B,MAAMr9G,EAA4B9iC,KAAKulJ,WAAW76I,KAAIk6I,GAAa5kJ,KAAK6tJ,gBAAgB7N,EAAY4E,KACpG5kJ,KAAKulJ,WAAW1kJ,OAAS,QAEnB2C,QAAQC,IAAIq/B,QAElB9iC,KAAK0nB,IAAI,4BAICmmI,gBAAgB7N,EAA+B4E,G,0CAC3D5kJ,KAAK0nB,IAAI,oBAAqBk9H,GAC9B,UAEQ5E,EAAW6N,gBAAgBjJ,GACjC5kJ,KAAK0nB,IAAI,kBAAmBk9H,GAC5B,MAAMtkJ,GACNN,KAAK0nB,IAAI3Z,MAAM,oBAAqB62I,EAAWtkJ,OAIrC4pJ,sB,0CACZ,MAAM,UAACJ,GAAa9pJ,KACpB,IAAI8pJ,EAEF,YADA9pJ,KAAK0nB,IAAIpN,KAAK,0DAKhB,IADeta,KAAKslJ,aAAazkJ,OAE/B,OAGF,MAAMqoG,EAAQlpG,KAAKslJ,aAAa1kJ,QAChCZ,KAAKslJ,aAAazkJ,OAAS,EAE3B,IAAI,MAAM4iD,KAAQylD,EAAO,CACvB,MAAM4kD,QAAsBhE,EAAUrH,iBAAiBh/F,GACvD,IAAIqqG,EACF,SAKF,MAAMr+E,GAAM,IAAIs+E,aAAcC,OAAOF,GACrC,IACE,MAAMG,EAAmC9pG,KAAKumG,MAAMj7E,GACpDzvE,KAAK0nB,IAAI,sCAAuCumI,GAChDjuJ,KAAKotJ,uBAAuBa,GAC5B,MAAMpgJ,GACN7N,KAAK0nB,IAAI3Z,MAAM,uBAAwB0hE,GACvCzvE,KAAKy4I,OAAO,yCAKXyV,+BAA+BroH,GACpC7lC,KAAKslJ,aAAax9I,KAAK+9B,EAAO4d,MAC9BzjD,KAAKkqJ,uBGxyBM,MAAMiE,GAenBxuJ,YACU0gI,EACAjkH,EACAtI,EACAuI,EACA0rI,GAJA,KAAA1nB,qBAAAA,EACA,KAAAjkH,gBAAAA,EACA,KAAAtI,gBAAAA,EACA,KAAAuI,kBAAAA,EACA,KAAA0rI,gBAAAA,EAyCF,KAAAqG,QAAU,KAChBpuJ,KAAKm6I,eAAen6I,KAAK+kI,WAxCzB,MAAMv1H,EAAiBxP,KAAKwP,eAAiB,IAAI,IAEjDA,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,iBAAiB,EAAEu1H,SAAAA,MAC3C/kI,KAAK+kI,UACP/kI,KAAKm6I,eAAepV,MAIxBv1H,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,kBAAmBu1H,IAC5C/kI,KAAK+kI,WAAaA,GACnB/kI,KAAKm6I,eAAepV,MAIxBv1H,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,uBAAwBu1H,IACpD/kI,KAAKm6I,eAAepV,MAGtBv1H,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,qBAAsBsxH,IAClD,MAAMiE,EAAW/kI,KAAKqgI,qBAAqBS,WACxCiE,MAAAA,OAAQ,EAARA,EAAUl0H,MAAOiwH,EAAUjwH,IAC5B7Q,KAAKm6I,eAAepV,MAIxBv1H,EAAejO,IAAIsJ,EAAA,QAAnB2E,CAA8B,wBAAwB,EAAE6+I,WAAAA,EAAYpuJ,KAAAA,MAClE,MAAM,MAACquJ,GAAStuJ,KAChB,IAAIquJ,EAAWxtJ,SAAWytJ,EAAiC,OAE3D,IAAIzrJ,EAAM,EACV,IAAI,IAAI0C,EAAI,EAAGA,EAAI8oJ,EAAWxtJ,SAAU0E,EAAG,CACzC,MAAM,KAACtF,EAAI,MAAES,GAAS2tJ,EAAW9oJ,GACjC1C,EAAMnC,EAAQmC,EAAMnC,EAAQmC,EAG9ByrJ,EAAM7e,aAAa5sI,MAQf0rJ,uBACFvuJ,KAAK+kI,WACT/kI,KAAK8uD,OAAOh+B,YAAc,GAEvB9wB,KAAKwuJ,qBACNxuJ,KAAKwuJ,mBAAmBnvG,SACxBr/C,KAAKwuJ,wBAAqBjoJ,GAG5BvG,KAAK+kI,cAAWx+H,EAChBvG,KAAKyuJ,uBAAuBx+I,aAGtBkqI,eAAepV,GAClB/kI,KAAKioB,YACNjoB,KAAKioB,YACLjoB,KAAKioB,eAAY1hB,GAGnB,MAAMmoJ,EAAqB1uJ,KAAK+kI,WAAaA,EAC1C2pB,IACD1uJ,KAAKuuJ,uBAELvuJ,KAAK+kI,SAAWA,EAChB/kI,KAAKyuJ,uBAAyB,IAAI,IAElCzuJ,KAAKyuJ,uBAAuBltJ,IAAIwjI,EAAhC/kI,CAA+D,QAASA,KAAKouJ,SAE1ErpB,aAAoB,KACrB/kI,KAAKwuJ,mBAAqBxuJ,KAAK+5I,sBAE/B/5I,KAAKwuJ,mBAAqBxuJ,KAAK2uJ,gBAC/B3uJ,KAAKyuJ,uBAAuBltJ,IAAIwjI,EAAhC/kI,CAA0C,QAASA,KAAKouJ,UAG1DpuJ,KAAKoB,UAAUb,UAAUsD,OAAO,YAAakhI,aAAoB,QAGnE,MAAM6X,EAAU58I,KAAK+kI,SAAS6X,QAC9B,IAAItjH,EAAQyrG,aAAoB,KAAoBA,EAASzrG,MAtHjE,SAAsCA,EAAmBsjH,GACvD,OAAOtjH,GACL,KAAK,WACL,KAAK,UACH,OAAO,YACT,KAAK,aACH,OAAOsjH,EAAU,WAAyB,aAC5C,QACE,OAAO,iBA8G4DgS,CAA6B7pB,EAASiW,gBAAiB4B,GAE5H,MAAM,MAAC0R,GAAStuJ,KAEhBsuJ,EAAM/e,oBAEN,MAAM93F,EAAWne,IAAU,cACtBj4B,SAASwY,KAAKtZ,UAAUmT,SAAS,eAAiBg7I,GAAuBj3G,KACzEA,GACD62G,EAAM7e,aAAa,IAGrB,QAAcpuI,SAASwY,KAAM,cAAe49B,EAAU,IAAKA,EAAW,KACpE62G,EAAM5e,uBAEN1vI,KAAKuuJ,6BACJhoJ,IAGFkxC,IAIH62G,EAAMjf,gBAAgB/1G,GAAO,GAe7Bt5B,KAAKkQ,SAAS60H,GACd/kI,KAAKy6I,eAAe1V,GACpB/kI,KAAK6uJ,4BAA4B9zH,UAAU6hH,IAGrCnC,eAAe1V,GACrB,OAAO/kI,KAAKwuJ,mBAAmB3oH,OAAOk/F,GAGhC70H,SAAS60H,GACf,GAAGA,aAAoB,KACrB,OAAO/kI,KAAK85I,eAAej0G,OAAOk/F,IAElC,EAAA/2H,EAAA,GAAehO,KAAK8uD,OAAQ,IAAI,KAAU,CAAC3lD,OAAQ47H,EAASwW,mBAAmBtyH,aAAatQ,SAIxFsP,YACN,MAAM,eAACzY,GAAkBxP,KACnBoB,EAAYpB,KAAKoB,UAAYC,SAASC,cAAc,OAC1DF,EAAUb,UAAUgB,IAAI,iBAAkB,yBAE1C,MAAMsf,EAAOxf,SAASC,cAAc,OACpCuf,EAAKtgB,UAAUgB,IAAI,oBAEnB,MAAMstJ,EAA8B7uJ,KAAK6uJ,4BAA8B,IAAI3T,GAErE1lE,EAAO,IACbA,EAAKlxE,OAAOuqJ,EAA4BztJ,WACxCyf,EAAKvc,OAAOkxE,GAEZ,MAAMs5E,GAAqB,EAAAhrG,GAAA,IAAS,KAClC9jD,KAAK+kI,SAASuT,gBACb,KAAK,IAER,QAAiB9iE,GAAOl1E,KACtB,EAAAohB,EAAA,GAAYphB,GACZwuJ,MACC,CAACt/I,eAAAA,IAEJ,MAAMs/C,EAAS9uD,KAAK8uD,OAASztD,SAASC,cAAc,OACpDwtD,EAAOvuD,UAAUgB,IAAI,sBAErBvB,KAAK85I,eAAiB,IAAI9D,GAAsBlnF,GAChD9uD,KAAK+5I,qBAAuB,IAAIjE,GAA4Bj1H,GAE5D7gB,KAAK2uJ,gBAAkB,IAAI7T,GAAuBj6H,GAElD,MAAM2tB,EAAQntC,SAASC,cAAc,OACrCktC,EAAMjuC,UAAUgB,IAAI,qBAEpB,MAAM4iB,EAAM,EAAW,kBACvBqqB,EAAMlqC,OAAO6f,IAEb,QAAiBA,GAAM7jB,KACrB,EAAAohB,EAAA,GAAYphB,GAEZ,MAAM,SAACykI,GAAY/kI,KACf+kI,IAIDA,aAAoB,KACrBA,EAAS0T,SAET1T,EAAS0T,OAAO,mCAEjB,CAACjpI,eAAAA,KAEJ,QAAiBpO,GAAW,KAC1B,GAAGpB,KAAK+kI,oBAAoB,KAAmB,CAC7C,GAAG,eAAuBkQ,IAAgBp0I,OACxC,OAGF,IAAIo0I,GAAe,CACjB5U,qBAAsBrgI,KAAKqgI,qBAC3BjkH,gBAAiBpc,KAAKoc,gBACtBtI,gBAAiB9T,KAAK8T,kBACrB4O,YACE,GAAG1iB,KAAK+kI,oBAAoBggB,GAAc,CAE/C,GADe,eAAuB3J,IAC5B/oI,MAAK+4F,GAASA,EAAM6wC,oBAAsBj8I,KAAK+kI,WACvD,OAGF,IAAIqW,GAAU,CACZ2M,gBAAiB/nJ,KAAK+nJ,gBACtB1rI,kBAAmBrc,KAAKqc,kBACxBD,gBAAiBpc,KAAKoc,gBACtB2oH,SAAU/kI,KAAK+kI,WACdriH,UAEJ,CAAClT,eAAAA,IAEJpO,EAAUkD,OAAOuc,EAAMiuC,EAAQtgB,GAE/B,MAAM8/G,EAAQtuJ,KAAKsuJ,MAAQ,IAAI5gB,GACzBqhB,EAAiBT,EAAM/kI,OAAO,qBACpCnoB,EAAU8C,QAAQ6qJ,GAElB1tJ,SAASuzC,eAAe,iBAAiB1wC,QAAQ9C,GACjDktJ,EAAM/e,qB,4UChQV,MAAMyf,GAAuB,KAsTvBjH,GAAkB,IAlTjB,MAQLpoJ,cACEK,KAAK0nB,KAAM,EAAA2oC,EAAA,IAAO,SAElBrwD,KAAKyhC,OAAS,EACdzhC,KAAKivJ,MAAQ,IAAI79I,IACjBpR,KAAKkvJ,UAAY,IAAI99I,IACrBpR,KAAKmvJ,gBAAkB,GAEnB,KAIJtkJ,EAAA,mCAAqC,CACnCukJ,gBAAuBvpH,GAAW,mC,MAChC,MAAMo6G,EAAOjgJ,KAAKqvJ,SAASxpH,EAAOypH,YAElC,IAAIvqB,EAAW/kI,KAAKkvJ,UAAUx9I,IAAIuuI,EAAKpvI,IAEvC,OAAOovI,EAAK32I,GACV,IAAK,qBACAy7H,GACDA,EAAS0T,OAAkB,QAAX,EAAAwH,EAAKlzC,cAAM,eAAEzjG,GAAG,GAGlC,MAGF,IAAK,oBACAy7H,GACDA,EAASgmB,cAGX,MAGF,IAAK,qBACChmB,IACFA,EAAW/kI,KAAKuvJ,mBAAmB,CACjC9lI,YAAY,EACZ8xH,mBAAoB0E,EAAKuP,WAG3BzqB,EAAS8iB,wBAAwB,YACjC9iB,EAAS2iB,aAAazH,GACtBlb,EAASwiB,iBAAiByH,GAAsB,iCAGlD,MAGF,IAAK,YAAa,CAChB,IAAIjqB,GAAYA,EAAS2jB,cACvB,MAGF,MAAMP,EAAMpjB,EAASkjB,GAAGE,IAAMlI,EAAKwP,SAC7BxH,EAAKljB,EAASkjB,GACdH,QAAiB,kBAAwB,SAAUK,GACzD,KAAI,EAAAhjJ,GAAA,GAAS8iJ,EAAGH,SAAUA,GAAW,CACnC9nJ,KAAK0nB,IAAI3Z,MAAM,qBAAsBk6I,EAAGH,SAAUA,GAClD,MAGF,MAAM,IAAC33I,EAAG,gBAAE66I,SAAyBhrJ,KAAKirJ,WAAW9C,EAAKF,EAAGjjJ,EAAGijJ,EAAG3rH,GACnE,GAAG2jH,EAAK+K,kBAAoBA,EAAiB,CAC3ChrJ,KAAK0nB,IAAI3Z,MAAM,4BAA6BkyI,EAAK+K,gBAAiBA,GAClE,MAGFjmB,EAAS2jB,cAAgBv4I,EACzB40H,EAAS0jB,WAET,WAKNiH,6BAA+B7pH,IAC7B,MAAMk/F,EAAW/kI,KAAKkvJ,UAAUx9I,IAAIm0B,EAAO8pH,gBACxC5qB,MAAAA,OAAQ,EAARA,EAAUl0H,MAAOg1B,EAAO8pH,eAI3B5qB,EAASmpB,+BAA+BroH,MAI5C7lC,KAAK4vJ,WAAa,IAAI,KAAqC,CACzD,gBACA,mBACA,eACA,oBACA,oBACA,qBAIOC,kBACT,OAAO7vJ,KAAKmvJ,gBAAgB,GAGvBW,gBAAgBl7I,GACrB,IAAI,MAAOm7I,EAAQhrB,KAAa/kI,KAAKkvJ,UACnC,GAAGnqB,EAASwW,qBAAuB3mI,EACjC,OAAOmwH,EAKAkmB,WAAW/C,EAAiB19I,EAAe8xB,G,0CACtD,OAAO,kBAAwB,iBAAkB4rH,EAAK19I,EAAG8xB,MAGpD+yH,SAASpP,GACd,MAAM+P,EAAyB,uBAAX/P,EAAK32I,EACnB2mJ,EAAUjwJ,KAAKivJ,MAAMv9I,IAAIuuI,EAAKpvI,IAepC,OAdGo/I,IAED,EAAAC,GAAA,GAAkBD,EAAShQ,GAGxB+P,GACDhwJ,KAAKivJ,MAAMj/I,OAAOiwI,EAAKpvI,IAGzBovI,EAAOgQ,GACED,GACThwJ,KAAKivJ,MAAMhqJ,IAAIg7I,EAAKpvI,GAAIovI,GAGnBA,EAGFkQ,QAAQJ,GACb,OAAO/vJ,KAAKivJ,MAAMv9I,IAAIq+I,GAGjBzH,aAAaz3I,GAClB,MAAMovI,EAAOjgJ,KAAKmwJ,QAAQt/I,GAC1B,MAAO,CACLvH,EAAG,iBACHuH,GAAIovI,EAAKpvI,GACT85D,YAAas1E,EAAKt1E,aAId4kF,mBAAmB3vJ,GAKzB,MAAMqgJ,EAAO,IAAI8E,GAAa,OAAD,QAC3BgD,gBAAiB/nJ,KACjBuhG,WAAU,KACVrpC,kBAAiB,MACdt4D,IA2DL,OAxDAqgJ,EAAK5/I,iBAAiB,SAAUi5B,IAC9B,MAAMu2H,EAAc7vJ,KAAK6vJ,YACtBv2H,IAAU,WACXt5B,KAAKkvJ,UAAUl/I,OAAOiwI,EAAKpvI,KAC3B,EAAAmB,EAAA,GAAiBhS,KAAKmvJ,gBAAiBlP,KAEvC,EAAA74F,GAAA,GAA2BpnD,KAAKmvJ,gBAAiBlP,EAAM,aAGtD3mH,IAAU,qBACX2mH,EAAKnE,iBAAkB,GAGzB,MAAMsU,OAAoC7pJ,IAArB05I,EAAKhF,YACvB3hH,IAAU,oBAA+BA,IAAU,eAAyB82H,EAC7EnQ,EAAKsH,iBAAiByH,GAAsB,oCAE5C/O,EAAKuH,qBAGJqI,IAAgB5P,GAAS4P,IACvBv2H,IAAU,UACP2mH,EAAKx2H,YAAew2H,EAAKnE,gBAEnBmE,EAAKnE,kBAAoBsU,EACjCpwJ,KAAK4vJ,WAAWS,UAAU,mBAE1BrwJ,KAAK4vJ,WAAWS,UAAiC,+BAAvBpQ,EAAKqM,cAAiD,gBAAkB,gBAJlGtsJ,KAAK4vJ,WAAWU,YAMVh3H,IAAU,WAClBt5B,KAAK4vJ,WAAWS,UAAUpQ,EAAKx2H,WAAa,oBAAsB,qBAAqB,GAC/E6P,IAAU,mBAClBt5B,KAAK4vJ,WAAWW,qBAAqB,oBAC7Bj3H,IAAU,cACf2mH,EAAKxoI,UACNzX,KAAK4vJ,WAAWS,UAAU,uBAAuB,GAGnDrwJ,KAAK4vJ,WAAWU,gBAKtBrQ,EAAK5/I,iBAAiB,MAAM,CAACwQ,EAAIsgD,UACjB5qD,IAAX4qD,GACDnxD,KAAKkvJ,UAAUl/I,OAAOmhD,GAGxB,MAAMq/F,IAAexwJ,KAAK6vJ,YAC1B7vJ,KAAKkvJ,UAAUjqJ,IAAI4L,EAAIovI,QAET15I,IAAX4qD,GACDtmD,EAAA,sBAAwB,gBAAiB,CAACk6H,SAAUkb,EAAMuQ,WAAYA,OAInEvQ,EAGFuI,mBAAmBD,GAExB,OADAtzI,EAAA,eAA6BszI,EAAevwF,OACrCh4D,KAAKqvJ,SAAS9G,EAAe+G,YAG/BtH,aACL,OAAO,eAAqB,uBAAwB,CAClD58D,QAAS,EACTqlE,cAAe,MACd1uJ,MAAW2uJ,GAAa,mCACzB,OAAO,kBAAwB,cAAeA,QAI3CC,kBAAkB/7I,EAAgBg8I,GACvC5wJ,KAAK0nB,IAAI,uBAAwB9S,EAAQg8I,GAEzC,MAAMC,EAAWjzH,EAAA,0BAAoChpB,GACrD,IAAIi8I,EAAU,OAEd,MAAM,sBAACzvB,GAAyByvB,EAAS71I,OAEnCilI,EAAOjgJ,KAAKuvJ,mBAAmB,CACnC9lI,YAAY,EACZ8xH,mBAAoB3mI,IAGtBqrI,EAAK4G,oBAAmB,KAAS+J,IAAWxvB,IAAwB,GAEpE6e,EAAK4H,wBAAwB,eAC7B5H,EAAKyH,aAAa,CAChBp+I,EAAG,mBACHqhE,YAAa,GACb6kF,SAAU,MACV3iI,MAAM,EAAAozG,GAAA,IAAM,GACZpvH,KAAM7Q,KAAKyhC,OACXqvH,eAAgBl8I,EAChByvI,SAAUpE,EAAKoE,SACfrpI,OAAQ,CACN/D,MAAO25I,QAAWrqJ,KAKtBvG,KAAKgoJ,aAAajmJ,MAAKkmJ,IACrBhI,EAAKgI,GAAKA,EAEH,eAAqB,oBAAqB,CAC/ChiH,QAAShxB,EAAA,eAA6BL,GACtCyvI,SAAUpE,EAAKoE,SACfptI,MAAO25I,GAAWxvB,EAClB9/B,WAAW,QAAe,IAC1BwmD,SAAU7H,EAAKgI,GAAGH,cAEnB/lJ,MAAKwG,IACN,MAAMo/I,EAAY3nJ,KAAKwoJ,mBAAmBjgJ,GAC1C03I,EAAK4H,wBAAwB,YAC7B5H,EAAKyH,aAAaC,GAClB1H,EAAKsH,iBAAiByH,GAAsB,mCAInCtC,YAAYqD,EAAgBt4I,EAAkBs1F,EAAqC91F,G,0CAC9F,IAAIjX,KAAKmwJ,QAAQJ,GACf,OAGF,MAAMp0E,QAAgB,eAAqB,oBAAqB,CAC9D1kE,MAAAA,EACA0uB,KAAM3lC,KAAKsoJ,aAAayH,GACxBt4I,SAAAA,EACAs1F,OAAQ,CACNzjG,EAAGyjG,GAELgkD,cAAe,MAGjB74F,GAAA,uBAAuCyjB,QAK3C,QAAmB,sBAAiCosE,IACpD,Y,2SC3PO,MAAM52H,GAAuB,OAC9B6/H,GAAmB,GAAAp0I,mBAAqB,aAAe,YAkzDvD++E,GAAe,IA9xDd,MAiCLh8F,cAhCO,KAAAsxJ,SAAW5vJ,SAASuzC,eAAe,iBAGnC,KAAAs8G,SAAU,EACV,KAAAC,qBAAuB,EAIvB,KAAAnzD,eAAgC,KAEhC,KAAAzI,OAAS,EAET,KAAAt9B,MAAgB,GA8rBf,KAAAm5F,aAAe,KACrB,MAAMh+F,EAAO/9C,SAAS+9C,KAChB+G,EAAW/G,EAAKpT,MAAM,KAEtB68D,EAAS78G,KAAKqxJ,eAAej+F,EAAM+G,GAIzC,GAFAn6D,KAAK0nB,IAAI,aAAc0rC,EAAM+G,EAAS,GAAI0iD,GAEvCA,EAAOy0C,OAAV,CACE3gJ,EAAA,iBACA,MAAM,QAAC4gJ,GAAW,YAA0B10C,EAAOy0C,QACnD,GAAGC,EAAS,CACV,MAAM/mJ,EAAInJ,SAASC,cAAc,KACjCkJ,EAAEopD,KAAOipD,EAAOy0C,OACfnkJ,OAAeokJ,GAAS/mJ,SAK7B,GACO,SADA2vD,EAAS,GACD,CACX,MAAM79B,EAAYugF,EAAOvgF,EACzB,IAAIk1H,OAAyBjrJ,IAAhBs2G,EAAO40C,KAAqBzoJ,EAAA,qBAAyC6zG,EAAO40C,WAAQlrJ,EAG1F,MADA+1B,EAAE,GAELt8B,KAAK0xJ,aAAa,CAChBt0E,SAAU9gD,EACV+/D,UAAWm1D,IAMbxxJ,KAAK47F,aAAa,CAChBzyF,OAAQqoJ,EAASl1H,EAAErT,UAAS,GAAQqT,EAAErT,WACtCozE,UAAWm1D,MA2Sf,KAAAG,YAAc,KACpBtwJ,SAASg0C,gBAAgB/xC,MAAMspC,YAAY,uBAAwB/hC,EAAA,kCAAsC,MAEzGxJ,SAASwY,KAAKtZ,UAAUsD,OAAO,qBAAsBgH,EAAA,oCACrDxJ,SAASwY,KAAKtZ,UAAUsD,OAAO,qBAAqB,GACpDxC,SAASwY,KAAKtZ,UAAUsD,OAAO,oBAAqBgH,EAAA,oCAEpD7K,KAAK4xJ,wBAA0B33H,IAAS,KACtC,MAAMgkE,EAASj+F,KAAKq9B,KAAK4gE,OACtBA,EAAOC,eACRD,EAAOC,cAAcC,gBAAgB,GAGvC,gBAAsBn+F,KAAKq9B,KAAKzD,QAAQnL,cAAckxB,WACrD90C,EAAA,mCAAuC,IAAM,GAAG,GAAO,GAE1D65C,GAAA,UAAqB75C,EAAA,gCACrB00C,EAAA,mBAAqC,GAErC,IAAI,MAAMliB,KAAQr9B,KAAKi4D,MACrB56B,EAAK6pG,uBAGP,wBAAmBr8H,EAAA,6BAEnB7K,KAAK6xJ,4BAA4B7xJ,KAAKq9B,OA6LhC,KAAAy0H,gBAAkB,CAACxxJ,EAA+ByxJ,KACxD,MAAMC,EAAgB71C,KACtB,GAAIn8G,KAAKiyJ,WAAcD,EAAvB,CAKA,GAAG1xJ,aAAa4xJ,UAAW,CACzB,MAAMC,EAAS7xJ,EAAE8xJ,aAAa15F,OAEdy5F,EAAOz+I,SAAWy+I,EAAOz+I,SAAS,SAAWy+I,EAAOlyI,QAAQ,UAAY,KAEtF,EAAAyB,EAAA,GAAYphB,IAIhB,SAAkBA,GAAGyB,MAAMs6G,IACzB,GAAGA,EAAMx7G,OAAQ,CACf,GAAGmxJ,EAED,YADAA,EAAcr0C,SAAStB,GAIzB,MAAMuH,EAAY5jH,KAAKq9B,KAAKt9B,MAC5B6jH,EAAUtH,eAAiBy1C,IAAe,MAA+B11C,EAAM,GAAGp8G,MAAQ,QAAU,YACpG,IAAIm8G,GAAcp8G,KAAKq9B,KAAMg/E,EAAOuH,EAAUtH,sBAvuClDpkD,GAAA,WACA5tB,GAAA,UAEAtqC,KAAK0nB,KAAM,EAAA2oC,EAAA,IAAO,KAAM,KAAA21E,IAAe,UAAgB,WAAiB,YAExEhmI,KAAKqyJ,mBAAqB,GAC1B,EAAA5mF,WAAA,yBAAmC9B,IACjC,GAAGA,EAAMD,WAAWG,KAAM,CACxB,MAAMxxD,EAAgE,cAAgBsxD,EAAMD,WAAWG,KAAO,OAC9G7pE,KAAKqyJ,mBAAmB1oF,EAAMD,WAAWG,MAAQrmE,QAAQ2E,QAAQkQ,OAIrErY,KAAK6P,UAAU,GAEf1C,OAAO9M,iBAAiB,QAAQ,KAC9Bk/C,EAAA,mBAAqC,GAErCv/C,KAAKkxJ,QAAUrmJ,EAAA,qBAAwB,EACvC7K,KAAKsyJ,eACL13G,cAAc56C,KAAKmxJ,sBACnBtmJ,EAAA,sBAAwB,OAAQA,EAAA,qBAEhCsC,OAAO9M,iBAAiB,SAAS,KAC/BL,KAAKkxJ,QAAUrmJ,EAAA,qBAAwB,EACvC7K,KAAKsyJ,eACLtyJ,KAAKmxJ,qBAAuBhkJ,OAAO6jC,aAAY,IAAMhxC,KAAKsyJ,gBAAgB,KAG1E/yG,EAAA,mBAAqC,GAErC10C,EAAA,sBAAwB,OAAQA,EAAA,uBAC/B,CAACsQ,MAAM,OAIZhO,OAAO9M,iBAAiB2wJ,IAAkB,KACxChxJ,KAAKmxJ,qBAAuBhkJ,OAAO6jC,aAAY,IAAMhxC,KAAKsyJ,gBAAgB,KAC1EtyJ,KAAKsyJ,eAELtyJ,KAAKkxJ,QAAUrmJ,EAAA,qBAAwB,EACvCA,EAAA,sBAAwB,OAAQA,EAAA,uBAC/B,CAACsQ,MAAM,EAAM6D,SAAS,IAEzBhf,KAAK4+B,eAAiBv9B,SAASC,cAAc,OAC7CtB,KAAK4+B,eAAer+B,UAAUgB,IAAI,kBAAmB,kBACrDvB,KAAK4+B,eAAe5V,QAAQ/mB,UAAY,aAExCjC,KAAKuyJ,wBAA0BlxJ,SAASC,cAAc,OACtDtB,KAAKuyJ,wBAAwBhyJ,UAAUgB,IAAI,6BAC3CvB,KAAKwyJ,8BAA8BznI,EAAA,iBAEnC/qB,KAAKixJ,SAAS3sJ,OAAOtE,KAAK4+B,gBAE1B5+B,KAAKyyJ,gBACLzyJ,KAAK0yJ,eAAe1yJ,KAAKq9B,KAAKj8B,WAE9BuP,EAAA,eAAuC3Q,KAAKoxJ,aAG5CpxJ,KAAK2xJ,cACL9mJ,EAAA,yBAA2B,mBAAoB7K,KAAK2xJ,cAEpD,EAAAr/F,GAAA,KAAuB,KACrB/S,EAAA,0BAA6C,QAC7CA,EAAA,mBAAqC,MACpC,KACDA,EAAA,0BAA6C,IAC7CA,EAAA,mBAAqC,MAIvCv/C,KAAK2yJ,oBAIL5nI,EAAA,oBAA4B,gBAAgB,CAACzgB,EAAMwqC,KAC9CzzC,SAASwY,KAAKtZ,UAAUmT,SAASgpE,KAC/Br7E,SAASwY,KAAKtZ,UAAUmT,SAASghC,KACpC,kBAA8B,GAGhC10C,KAAKwyJ,8BAA8B19G,MAGrC,MAAM89G,EAA4B34H,IAAS,KACzCj6B,KAAKkmI,cAAclmI,KAAK6yJ,mBAAmB,KAC1C,KAAK,GAAO,GACf9nI,EAAA,oBAA4B,UAAU,KACpC6nI,OAGF/nJ,EAAA,yBAA2B,iBAAkBvK,IAC3C,IAAI,OAAC6I,EAAM,SAAEwD,EAAQ,IAAE5D,EAAG,WAAEkpF,GAAc3xF,EACvCqM,IAAUA,EAAW3D,EAAA,oBAAwC2D,IAC7D5D,IAAKA,EAAMC,EAAA,oBAAwCD,IAEtD/I,KAAK47F,aAAa,CAChBzyF,OAAAA,EACAkzF,UAAWtzF,EACX9I,KAAM0M,EAAW,kBAAepG,EAChCoG,SAAAA,EACAslF,WAAAA,OAIJpnF,EAAA,yBAA2B,iBAAkBwyB,IAC3Cr9B,KAAK8yJ,iBAAiBz1H,MAGxBxyB,EAAA,yBAA2B,gBAAgB,KACzC7K,KAAK2yJ,uBAGP9nJ,EAAA,yBAA2B,oBAAqBkoJ,IAC9C/yJ,KAAKgzJ,0BAA0BD,MAGjCloJ,EAAA,yBAA2B,gBAAgB,EAAE1B,OAAAA,EAAQ8pJ,QAAAA,M,MACnD,MAAM51H,EAAOr9B,KAAKq9B,KAClB,IACGA,GACDA,EAAKl0B,SAAWA,GAChB0B,EAAA,wBACEkgB,EAAA,kBAA4B,aACb,IAAf/qB,KAAKu1F,MAGP,OAGF,MAAM29D,EAASD,EAAQ5gJ,MAAK6gJ,GAA8B,gCAApBA,EAAO9sJ,OAAOkD,IACpD,GAAyB,iCAAR,QAAd,EAAA4pJ,MAAAA,OAAM,EAANA,EAAQ9sJ,cAAM,eAAEkD,GAAqC,CACtD,MAAMlD,EAAS8sJ,EAAO9sJ,OAChBy9C,EAASxmB,EAAKzD,QAAQA,QAAQ5wB,EAAA,oBAAwCkqJ,EAAO9sJ,OAAO49C,SAC1F,GAAGH,GAAUA,EAAOtjD,UAAUmT,SAAS,cAAgBmwC,EAAOtjD,UAAUmT,SAAS,YAAc6jF,GAAe1zC,EAAQxmB,EAAKzD,QAAQhtB,WAAWxL,WAAY,CACxJ,MAAM65F,EAA8Bp3C,EAAOtyC,cAAc,qFAEX4yC,KAAKumG,MAAMtkJ,EAAO89C,YAAYT,MACvEj5C,EAAEzF,SAAQyF,IACb4C,YAAW,MACT,QAAmB6tF,KACZ,IAANzwF,EAAE8H,MAGPrJ,EAAA,YAA6BE,EAAQ,CACnCG,EAAG,kCACH26C,SAAU79C,EAAO69C,gBAMzBp5C,EAAA,yBAA2B,wBAAwB,KACjD,MAAMugG,EAAQ,IAAI,KAAa,kCAA8B7kG,EAAW,CAACs1B,iBAAiB,IACpF5D,EAAI52B,SAASC,cAAc,OACjC22B,EAAE13B,UAAUgB,IAAI,kCACf6pG,EAAchqG,UAAUosB,YAAYyK,GAErC,MAAM/oB,EAAS7N,SAASC,cAAc,OACtC4N,EAAO3O,UAAUgB,IAAI,UACrB2N,EAAO5K,QAAO,IAAAsH,MAAK,sBAEnB,MAAMwkB,EAAW/uB,SAASC,cAAc,OACxC8uB,EAAS7vB,UAAUgB,IAAI,YACvB6uB,EAAS9rB,QAAO,IAAAsH,MAAK,yBAErBqsB,EAAE3zB,OAAO4K,EAAQkhB,GAEjB/uB,SAASwY,KAAKtZ,UAAUgB,IAAI,eAE5B6pG,EAAM/qG,iBAAiB,SAAS,KAC9BgB,SAASwY,KAAKtZ,UAAUgB,IAAI,yBAE5B4xJ,GAAA,qBAEA/lJ,YAAW,KACT/L,SAASwY,KAAKtZ,UAAUC,OAAO,cAAe,2BAC7C,QAGL4qG,EAAM1oF,UAIR7X,EAAA,yBAA2B,iBAAiB,EAAEiqC,GAAAA,MAC5C90C,KAAK6xJ,4BAA4B/8G,MAGnC82C,GAAA,MAAiB,iBAAiB7pF,MAAMk2B,IACtC2zD,GAAA,aAAwB,gBAAiB3zD,GAAK,QAG7C,IAAqB,MACtBj4B,KAAKozJ,WAAa,IAAIjF,GAAW9tB,GAAA,EAAsBjkH,EAAA,EAAiBtI,EAAA,EAAiBuI,EAAA,EAAmB,KAG3G,IACDxR,EAAA,yBAA2B,iBAAiB,EAAEk6H,SAAAA,MAK5C,MAAM35B,EAAQ,IAAIgwC,GAAU,CAC1B2M,gBAAe,GACf1rI,kBAAiB,IACjBD,gBAAe,IACf2oH,SAAAA,IAGFA,EAAS1kI,iBAAiB,sBAAsB,IACvCL,KAAKqzJ,mBAAmBtuB,EAASwW,mBAAmBtyH,gBAAY1iB,EAAWw+H,GACjFhjI,MAAK,KACJ8I,EAAA,sBAAwB,iBAAkBk6H,IACnC,KAER92H,OAAM,KAAM,MAGfm9F,EAAM/qG,iBAAiB,SAAS,KAC9B,MAAMwvJ,EAAc,eACjBA,GAAeA,IAAgB9qB,IAAaA,EAAS+W,iBACtD/W,EAAS0T,OAAO,gCAEjB,CAACt9H,MAAM,IAEViwF,EAAM1oF,UAMVywI,GAAA,qBAEA,MAAMG,EAAgB,KACpBC,GAAA,uBAAmC,IAGrCviH,YAAYsiH,EAAe,OAC3BA,IAEAtzJ,KAAKwzJ,kBAAsB,CACzB1vJ,KAAM,kBACN64B,SAAU,CAACkgF,EAAQlkG,KACjB,MAAMi7C,EAAOj7C,EAAQi7C,KAEfppD,EAAImO,EAAQvU,WAAU,GAC5BoG,EAAEc,UAAY,aACdd,EAAEwjB,UAAY4lC,EACdppD,EAAEg/B,gBAAgB,WAElB,IAAI5N,GAAU,mBAAoB,CAChC5D,aAAc,eACdoE,mBAAoB,gBACpBG,oBAAqB,CAAC/xB,GACtBoX,QAAS,CAAC,CACR6X,QAAS,OACTkD,SAAU,KACRnyB,EAAEg2B,aAGL9d,UAIP1iB,KAAKwzJ,kBAA+D,CAClE1vJ,KAAM,iBACN64B,SAAU,EAAE82H,UAAAA,MACV,MAAM,QAAC9uC,EAAO,IAAE5lD,GAAO00F,EAOvBxqJ,EAAA,WAA4BjJ,KAAKq9B,KAAKl0B,OAAQ,IAAMw7G,GAAW5lD,EAAM,IAAMA,EAAM,QAMrF/+D,KAAKwzJ,kBAAkD,CACrD1vJ,KAAM,kBACN64B,SAAU,EAAE82H,UAAAA,MACV,MAAM,QAACC,GAAWD,EACdC,GAIJ1zJ,KAAKq9B,KAAKygD,WAAW,IAAM41E,EAAU,QAIzC1zJ,KAAKwzJ,kBAA6D,CAChE1vJ,KAAM,cACN64B,SAAU,EAAEg3H,eAAAA,MACV,MAAMl2H,EAAqB,CACzBn0B,EAAGivF,GAAmBq7D,YACtB3uJ,IAAK0uJ,EAAe,IAGtB3zJ,KAAKmwG,oBAAoB1yE,MAK7Bz9B,KAAKwzJ,kBAA0D,CAC7D1vJ,KAAM,WACN64B,SAAU,EAAEg3H,eAAAA,MACV,MAAMl2H,EAAqB,CACzBn0B,EAAGivF,GAAmB0X,UACtBC,OAAQyjD,EAAe,IAAMhgG,mBAAmBggG,EAAe,IAAI/yJ,MAAM,IAG3EZ,KAAKmwG,oBAAoB1yE,MAI1B,IACDz9B,KAAKwzJ,kBAEF,CACD1vJ,KAAM,YACNugJ,SAAU,KACV1nH,SAAU,EAAE82H,UAAAA,MACV,MAAMh2H,EAAOz9B,KAAK6zJ,SAASt7D,GAAmBu7D,WAAYL,GAC1DzzJ,KAAKmwG,oBAAoB1yE,MAK/Bz9B,KAAKwzJ,kBAQF,CACD1vJ,KAAM,KACN64B,SAAU,EAAOg3H,eAAAA,EAAgBF,UAAAA,KAAe,mCAC9C,IAAIh2H,EAEFA,EADuB,MAAtBk2H,EAAe,GACT,CACLrqJ,EAAGivF,GAAmBw7D,aACtBz4H,QAASq4H,EAAe,GACxBlC,KAAMkC,EAAe,GACrBK,OAAQ,WAAYP,GAAaA,EAAUO,OAC3CC,QAASR,EAAUQ,SAGd,CACL3qJ,EAAGivF,GAAmB27D,QACtBC,OAAQR,EAAe,GACvBlC,KAAMkC,EAAe,GACrBM,QAASR,EAAUQ,QACnB7vI,MAAO,UAAWqvI,EAAYA,EAAUrvI,WAAQ7d,GAIpDvG,KAAKmwG,oBAAoB1yE,QAI7Bz9B,KAAKwzJ,kBAqBF,CACD1vJ,KAAM,UACNugJ,SAAU,KACV1nH,SAAU,EAAE82H,UAAAA,MACV,IAAIh2H,EACoB,qBAArBg2H,EAAUU,SAGX12H,EAAOz9B,KAAK6zJ,SAASt7D,GAAmB27D,QAAST,IAGnDzzJ,KAAKmwG,oBAAoB1yE,MAI7Bz9B,KAAKwzJ,kBAOF,CACD1vJ,KAAM,cACNugJ,SAAU,KACV1nH,SAAU,EAAE82H,UAAAA,MACV,MAAMh2H,EAAOz9B,KAAK6zJ,SAASt7D,GAAmBw7D,aAAcN,GAC5DzzJ,KAAKmwG,oBAAoB1yE,MAI7Bz9B,KAAKwzJ,kBAIF,CACD1vJ,KAAM,cACNugJ,SAAU,KACV1nH,SAAU,EAAE82H,UAAAA,MACV,MAAMh2H,EAAOz9B,KAAK6zJ,SAASt7D,GAAmBq7D,YAAaH,GAC3DzzJ,KAAKmwG,oBAAoB1yE,MAI7B,CAAC,WAAqB,QAAiB14B,SAAQjB,IAC7C9D,KAAKwzJ,kBAIF,CACD1vJ,KAAAA,EACAugJ,SAAU,KACV1nH,SAAU,EAAE82H,UAAAA,MACV,MAAMh2H,EAAOz9B,KAAK6zJ,SAASt7D,GAAmB0X,UAAWwjD,GACzDzzJ,KAAKmwG,oBAAoB1yE,SAK/Bz9B,KAAKoxJ,eACLpxJ,KAAKo0J,wBAvcHC,WACF,OAAOxpJ,EAAA,aAGLwyB,WACF,OAAOr9B,KAAKi4D,MAAMj4D,KAAKi4D,MAAMp3D,OAAS,GAqchCgxJ,4BAA4ByC,GAClCt0J,KAAKi4D,MAAMlzD,SAAQs4B,IACdA,EAAKqpC,kBACNrpC,EAAKqpC,iBAAiBH,cAAc17D,EAAA,oCAAwCwyB,IAASi3H,MAKnF9B,8BAA8B+B,GACpC,MAAMxzH,EAAWwzH,IAAW,YAAoBv0J,KAAKixJ,SAAW5vJ,SAASwY,KACtE7Z,KAAKuyJ,wBAAwBtuJ,gBAAkB88B,GAChDA,EAASz8B,OAAOtE,KAAKuyJ,yBAIjB6B,wBACN,MAAMI,EAAc,IAAI9uJ,IAAI,CAAC,SAAU,WAAY,OAAQ,YAqF3DrE,SAASwY,KAAKxZ,iBAAiB,WApFZC,I,MACjB,MAAM6P,EAAM7P,EAAE6P,IACd,GAAGtF,EAAA,yBAA6B2pJ,EAAY3qJ,IAAIsG,GAAM,OAEtD,MAAMqI,EAASlY,EAAEkY,OAMX6kB,EAAOr9B,KAAKq9B,KAElB,GAAc,SAAX/8B,EAAE4lB,OAAoB5lB,EAAEqzH,UAAWrzH,EAAEszH,SAA+B,UAAnBp7G,EAAOg4B,QAA3D,CAEO,IAAGlwC,EAAE+lB,QAAmB,YAARlW,GAA6B,cAARA,GAkBrC,GAAW,YAARA,EAAmB,CAC3B,GAAIktB,EAAKt9B,MAAM+pH,YAAazsF,EAAKt9B,MAAM+5G,eA0BrC,OA1BqD,CACrD,MACMl5G,EADiBqI,EAAA,oBAAqCo0B,EAAKl0B,OAAQk0B,EAAK1wB,UACjD1G,QAAQrF,MACrC,GAAGA,EAAMmhC,MAAM,cAAoBnhC,EAAMC,OAAQ,CAC/C,IAAI4zJ,EACJ,IAAI,MAAM1rJ,KAAOnI,EAAO,CACtB,MAAMsF,EAAUm3B,EAAK0oB,WAAWh9C,GAGhC,IAFa/I,KAAKq0J,OAASh3H,EAAKl0B,OAASjD,EAAQuH,SAAWzN,KAAKq0J,KAAOnuJ,EAAQ8U,OAAOiP,MAGlFhhB,EAAA,iBAAkCo0B,EAAK0oB,WAAWh9C,GAAM,QAAS,CAClE0rJ,EAAU1rJ,EACV,OAQH0rJ,IACDp3H,EAAKt9B,MAAM22G,mBAAmB+9C,IAC9B,EAAA/yI,EAAA,GAAYphB,WAMb,GAAW,cAAR6P,EACR,WAhDgE,CAChE,MAAMikE,EAASnrE,EAAA,kCAAmD4B,EAAA,kBAAoB,GACtF,IAAI6pJ,EACJ,GAAI7pJ,EAAA,eAIG,CACL,MAAM1E,EAAMiuE,EAAOt7D,WAAUhE,GAAUA,EAAO3L,SAAW0B,EAAA,kBAC7C,IAAT1E,IAEDuuJ,EAAatgF,EADa,YAARjkE,EAAoBhK,EAAM,EAAIA,EAAM,QAN7C,cAARgK,IACDukJ,EAAatgF,EAAO,IAUrBsgF,GACD10J,KAAKyvC,QAAQ,CAACtmC,OAAQurJ,EAAWvrJ,SAmCrC,IACa,QAAX,EAAAk0B,MAAAA,OAAI,EAAJA,EAAMt9B,aAAK,eAAE2lG,eACbplG,EAAEkY,SAAW6kB,EAAKt9B,MAAM2lG,cACL,UAAnBltF,EAAOg4B,UACNh4B,EAAOi/F,aAAa,qBACpB,GAAA76F,sBACCmO,EAAA,aAAsC,IAAf/qB,KAAKu1F,SAC7Bl4D,EAAKyW,UAAUC,cACf1W,EAAKt9B,MAAMkuD,UACZ,CACA5wB,EAAKt9B,MAAM2lG,aAAap4F,SACxB,EAAAmvG,GAAA,GAAgBp/E,EAAKt9B,MAAM2lG,cAG3B,MAAMivD,EAAW,IAAIC,cAAct0J,EAAEL,KAAMK,GAC3C+8B,EAAKt9B,MAAM2lG,aAAap1F,cAAcqkJ,QAOpCd,SAAuC5zJ,EAASwzJ,GACtD,OAAO,eACLnqJ,EAAGrJ,GACAwzJ,GAIMtjD,oBAAoB1yE,G,0CAC/B,OAAOA,MAAAA,OAAI,EAAJA,EAAMn0B,GACX,KAAKivF,GAAmB27D,QAAS,CAC/B,MAAM1C,EAAS/zH,EAAKg0H,KAAOzoJ,EAAA,qBAAyCy0B,EAAKg0H,WAAQlrJ,EAC3EsuJ,EAAYp3H,EAAKw2H,QAAUjrJ,EAAA,qBAAyCy0B,EAAKw2H,cAAW1tJ,EAE1FvG,KAAK0xJ,aAAa,CAChBt0E,SAAU3/C,EAAK02H,OACf93D,UAAWm1D,EACXqD,UAAAA,EACA5iE,WAAYx0D,EAAKrZ,QAEnB,MAGF,KAAKm0E,GAAmBw7D,aAAc,CACpC,MAAM5/I,EAASspB,EAAKnC,QAAQC,WACtBpyB,EAASgL,EAAO8U,UAAS,GAG/B,GADanV,EAAA,UAAwBK,GAC7B8rB,QACN,UACQnsB,EAAA,iBAA+BK,GACrC,MAAMtG,GAEN,MADAksB,GAAS,CAACC,YAAa,iBACjBnsB,EAIV,MAAM2jJ,EAASxoJ,EAAA,qBAAyCy0B,EAAKg0H,MACvD9kJ,EAAW8wB,EAAKu2H,OAAShrJ,EAAA,qBAAyCy0B,EAAKu2H,aAAUztJ,EAEpFoG,EAAU3M,KAAKu8F,WAAWpzF,EAAQqoJ,EAAQ7kJ,GACxC3M,KAAK47F,aAAa,CACrBzyF,OAAAA,EACAkzF,UAAWm1D,EACX7kJ,SAAAA,IAEF,MAGF,KAAK4rF,GAAmBq7D,YACtB,IAAIpmF,GAAc,CAAC38D,GAAI4sB,EAAKx4B,MAAMyd,OAClC,MAGF,KAAK61E,GAAmB0X,UACtB,eAAqB,2BAA4B,CAC/C78C,KAAM31B,EAAKyyE,SACVnuG,MAAK02F,IACFA,EAAyCp7D,MAC3CvpB,EAAA,cAA6B2kF,EAAyCp7D,MAAM,GAK1D,sBAAjBo7D,EAAWnvF,GACK,mBAAjBmvF,EAAWnvF,EAOb,IAAIkvF,GAAoB/6D,EAAKyyE,OAAQzX,GAAY/1E,OAN/C1iB,KAAK47F,aAAa,CAChBzyF,OAAQsvF,EAAWp7D,KAAKxsB,GAAGoY,UAAS,QAMtCpb,IACc,wBAAbA,EAAI5N,MACL65B,IAAM,IAAAluB,MAAK,qBAGf,MAGF,KAAK2sF,GAAmBu7D,WACnB,IACD9zJ,KAAKshI,cAAc7jG,EAAKwsE,QAAQhhF,UAAS,GAAOwU,EAAK5sB,IAGvD,MAGF,QACE7Q,KAAK0nB,IAAIpN,KAAK,+BAAgCmjB,OAM5C+1H,kBAA0E5zJ,GAQ/EuN,QAAgBvN,EAAQykJ,SAAWzkJ,EAAQykJ,SAAW,IAAM,IAAMzkJ,EAAQkE,MAAS6U,KAClF,EAAA+I,EAAA,GAAY,MAEZ,MAAMkyC,EAAOj7C,EAAQi7C,KACrB,IAAI+/F,EACAF,EAEA7zJ,EAAQk1J,mBAAkBnB,EAAiB,IAAIhvG,IAAIhsC,EAAQi7C,MAAMmhG,SAAS/0G,MAAM,KAAKp/C,MAAM,IAC3FhB,EAAQo1J,cAAavB,EAAYzzJ,KAAKqxJ,eAAez9F,IAEzD,MAAMrmD,EAAM3N,EAAQ+8B,SAAS,CAACg3H,eAAAA,EAAgBF,UAAAA,GAAsB96I,GACpE,YAAepS,IAARgH,GAAoBA,GAIvB8jJ,eAAe17I,EAAawkD,EAAWxkD,EAAIqqC,MAAM,MACvD,MAAM68D,EAAc,GACpB,OAAI1iD,EAAS,IACbA,EAAS,GAAGna,MAAM,KAAKj7C,SAAQ6C,IAC7Bi1G,EAAOj1G,EAAKo4C,MAAM,KAAK,IAAM2T,mBAAmB/rD,EAAKo4C,MAAM,KAAK,OAG3D68D,GALiBA,EAwDnB60C,aAAa9xJ,GAOlB,MAAM,SAACw9E,EAAQ,UAAEif,EAAS,SAAE1vF,EAAQ,UAAEkoJ,EAAS,WAAE5iE,GAAcryF,EAC/D,OAAOqV,EAAA,kBAAgCmoE,GAAUr7E,MAAK4jC,IACpD,MAAMzD,EAAoB,SAAXyD,EAAKr8B,EACdH,EAASw8B,EAAK90B,GAAGoY,UAAUiZ,GAEjC,OAAGv1B,EACM3M,KAAKu8F,WAAWpzF,EAAQkzF,EAAW1vF,GAClCkoJ,EACD70J,KAAKi1J,YAAY9rJ,EAAQkzF,EAAWw4D,GAGtC70J,KAAK47F,aAAa,CACvBzyF,OAAAA,EACAkzF,UAAAA,EACApK,WAAYA,OAEZpkF,IACc,0BAAbA,EAAI5N,KACL85B,GAAS,CAACC,YAAa,oBACF,qBAAbnsB,EAAI5N,MACZ85B,GAAS,CAACC,YAAa,8BAQtBuiE,WAAWpzF,EAAgBkzF,EAAmB1vF,GACnD,OAAO1D,EAAA,oBAAqCE,EAAQwD,GAAU5K,MAAK,KACjE,MAAMmE,EAAmB+C,EAAA,mBAAoCE,EAAQwD,GAOrE,MANiB,iBAAdzG,EAAQoD,EACT+yF,OAAY91F,EAEZ0C,EAAA,oCAAqD/C,GAGhDlG,KAAK47F,aAAa,CACvBzyF,OAAAA,EACAkzF,UAAAA,EACA1vF,SAAAA,EACA1M,KAAM,kBAQLg1J,YAAY9rJ,EAAgBu7F,EAAemwD,GAChD,OAAO5rJ,EAAA,uBAAwCE,EAAQu7F,GAAO3iG,MAAKmE,GAC1DlG,KAAKu8F,WAAWr2F,EAAQiD,OAAQ0rJ,EAAW3uJ,EAAQ6C,OAIjD+yF,SAASlnF,EAAgB3U,G,0CACvB,mBAAgC2U,YAKtBgpB,EAAA,mBAA6BhpB,IACxCoG,OAAOk6I,oBACjB5+E,GAAkB,CAChBl6C,mBAAoB,2BACpBG,oBAAqB,CAAC,IAAI,KAAU,CAACpzB,OAAQyL,EAAOqU,aAAatQ,SACjE4F,OAAQ,CACNkb,QAAS,KACTyiC,UAAU,YAOVl8D,KAAKqzJ,mBAAmBz+I,EAAOqU,YAErC,qBAAkCrU,EAAiB,UAAT3U,QAGpCozJ,mBAAmBpqI,EAAkBksI,EAAqCC,GAChF,OAAG/0B,GAAA,aAAkCA,GAAA,cAAmC80B,EAAwBn1J,KAAKq1J,6BAA6BpsI,GAC1H,gBAA+B,iBAAgCmsI,EAAmBp1J,KAAKs1J,wBAAwBrsI,GAC3GzlB,QAAQ2E,UAGRmtJ,wBAAwBrsI,G,0CACpC,MAAM4mI,EAAc,eACjBA,UACKv5E,GAAkB,CACtBt+C,aAAc,mCACdoE,mBAAoBnT,EAASiZ,SAAW,wCAA0C,yCAClF3F,oBAAqB,CACnB,IAAI,KAAU,CAACpzB,OAAQ0mJ,EAAYtU,mBAAmBtyH,UAAS,KAAStQ,QACxE,IAAI,KAAU,CAACxP,OAAQ8f,IAAWtQ,SAEpC4F,OAAQ,CACNkb,QAAS,QAITo2H,EAAYvI,kBACRuI,EAAYpX,OAAO,yCAKjB4c,6BAA6BpsI,G,0CACzC,MAAM43G,EAAmBR,GAAA,YACtBQ,UACKvqD,GAAkB,CACtBt+C,aAAc,oCACdoE,mBAAoBnT,EAASiZ,SAAW,yCAA2C,0CACnF3F,oBAAqB,CACnB,IAAI,KAAU,CAACpzB,OAAQ03H,EAAiB1sH,OAAO8U,UAAS,KAAQtQ,QAChE,IAAI,KAAU,CAACxP,OAAQ8f,IAAWtQ,SAEpC4F,OAAQ,CACNkb,QAAS,QAIV4mG,GAAA,cAAmCQ,UAC9BA,EAAiB4X,cAKhBnX,cAAcn4H,EAAgB6qI,G,0CACzC,MAAM7/H,EAAShL,EAAOoyB,WAChBgtB,EAAYz0C,EAAA,YAA0BK,EAAQ,eAiBpD,GAAG6/H,GAEkB,8BADK3T,GAAA,mBAAsC2T,IACjD1qI,EAA4B,CACvC,IAAIi/C,EAKF,YAJAxuB,GAAS,CACPC,YAAa,+BAMXs8C,GAAkB,CACtBl6C,mBAAoB,0BACpB7d,OAAQ,CACNkb,QAAS,sCAMXz5B,KAAKqzJ,mBAAmBlqJ,GApCjB,MAAW,mCACtB,MAAMo0B,QAAiBK,EAAA,oBAA8BzpB,GACrD,IAAI8rI,EACJ,GAAI1iH,EAAS0iH,KAOXA,EAAO5f,GAAA,gBAAmC9iG,EAAS0iH,KAAM9rI,OAPxC,CACjB,IAAIo0C,EACF,OAGF03F,QAAa5f,GAAA,kBAAqClsH,GAKpDksH,GAAA,gBAAmClsH,EAAQ8rI,EAAKpvI,IAAI,GAAM,OAyB5DlK,MAGK4uJ,qBAAqBC,GAAiB,GAC3C,MAAM7rF,EAAQ9+D,EAAA,mBAEd,GAAG8+D,EAAMD,WAAWG,KAAM,CACxB,MAAM2B,EAAe,EAAAiqF,gBAAA,iCAAgDnjJ,GAAKA,EAAExO,OAAS6lE,EAAM7lE,OAKzF,OAAO9D,KAAK01J,cAAc/rF,EAAMD,WAAWG,MAAM9nE,MAAMsW,GAC9CrY,KAAKkmI,cAAc7tH,EAAKm9I,KAC9B,KACD7rF,EAAMD,YAAa,EAAAxsD,GAAA,GAAKsuD,EAAa9B,YAC9B1pE,KAAKkmI,cAAc,IAAI,MAKpC,OAAOlmI,KAAKkmI,cAAc,GAAIsvB,GAGxBE,cAAc7rF,GACpB,OAAG7pE,KAAKqyJ,mBAAmBxoF,GAAc7pE,KAAKqyJ,mBAAmBxoF,GAC1D7pE,KAAKqyJ,mBAAmBxoF,GAAQ1xD,GAAA,uBAAwC,eAAiB0xD,GAAM9nE,MAAKwhD,GAClGoB,IAAIC,gBAAgBrB,KAIxB2iF,cAAc7tH,EAAam9I,GAAiB,GACjDx1J,KAAK6yJ,kBAAoBx6I,EACzB,MAAMyqB,EAAW9iC,KAAKi4D,MAAMvtD,KAAI2yB,GAAQA,EAAK6oG,cAAc7tH,KAC3D,OAAOyqB,EAASA,EAASjiC,OAAS,GAAGkB,MAAK,KACrCyzJ,GACD3qJ,EAAA,sBAAwB,wBAKvBioJ,iBAAiBz1H,GACtB,IAAK,CAAC,OAAQ,cAA6BkC,SAASlC,EAAKp9B,QAAUo9B,EAAKl0B,OACtE,OAMA,MAAMwsJ,EAAct4H,EAAKzD,QACnBhB,EAAM+8H,EAAY/oJ,WAAWohC,UAE7B79B,EAAMktB,EAAKl0B,QAAUk0B,EAAK1wB,SAAW,IAAM0wB,EAAK1wB,SAAW,IAE3DipJ,EAAgBhqE,GAAA,eAA0B,iBAChD,GAAK+pE,EAAY/oJ,WAAWkxF,oBAAsB,IAAM63D,EAAY/oJ,WAAWvF,UAAUuZ,SAAWlG,OAAOgzC,KAAKioG,EAAY/7H,SAAS/4B,cAU5H+0J,EAAczlJ,GAErBnQ,KAAK0nB,IAAI,6BAZkI,CAC3I,MAAMmR,EAAW,CACf1uB,MAAM,EAAAgtD,GAAA,GAAqBw+F,EAAY/7H,QAAS,QAChDhB,IAAAA,GAGFg9H,EAAczlJ,GAAO0oB,EAErB74B,KAAK0nB,IAAI,uBAAwBmR,GAOnC+yD,GAAA,MAAiB,CAACgqE,cAAAA,IAAgB,GAI/BvuD,qBAAqBhqE,GAC1B,IAAK,CAAC,OAAQ,cAA6BkC,SAASlC,EAAKp9B,QAAUo9B,EAAKl0B,OACtE,OAGF,MAAMgH,EAAMktB,EAAKl0B,QAAUk0B,EAAK1wB,SAAW,IAAM0wB,EAAK1wB,SAAW,IAC3DuxE,EAAQ0N,GAAA,eAA0B,iBACxC,OAAO1N,GAASA,EAAM/tE,GAGjB0lJ,0BACL,IAAI9sF,EACJ,MAAMY,EAAQ9+D,EAAA,mBACX8+D,EAAMD,WAAWvH,oBAClB4G,EAAOY,EAAMD,WAAWvH,mBACxB9gE,SAASg0C,gBAAgB/xC,MAAMspC,YAAY,gCAAiCm8B,IAE5E1nE,SAASg0C,gBAAgB/xC,MAAMq7E,eAAe,kCAG5C,GAAA/hE,oBAAsBmsD,IACxBl+D,EAAA,mBhJ5+BC,SAAyBk+D,GAC9B,OALK,SAA0BA,GAC/B,OAAO9G,GAtDF,SAA0B8G,GAC/B,MAAM5O,EAAW4O,EAAKnoE,MAAM,GAAI,GAAGo/C,MAAM,MACnC+mB,GAAS5M,EAAStyD,MAClBrC,EAAM20D,EAASzvD,KAAKorJ,GACrBA,EAAIC,SAAS,MACND,EAAIl1J,MAAM,GAAI,IAGhBk1J,IAGV,OAAOp0F,GAAWl8D,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIuhE,GA2CxBivF,CAAiBjtF,IAI5BktF,CAAiBltF,GAAMnoE,MAAM,GAAI,GgJ2+Bbs1J,CAAgBntF,IAIpC4pF,kBAAkB9oF,EAAessF,EAAwBX,GAS9D,OARAx1J,KAAK61J,0BAELhrJ,EAAA,mBAEGsrJ,IACDn2J,KAAKqyJ,mBAAmBxoF,GAAQrmE,QAAQ2E,QAAQguJ,IAG3Cn2J,KAAKu1J,0BAAwChvJ,IAAnBivJ,IAAiC3rF,EAAO2rF,GAiCnE9C,eAAexhJ,EAAkBJ,GACvC,GAAG9Q,KAAKo2J,UAAYllJ,EAApB,CAQA,IAJe,IAAZJ,GAAqB9Q,KAAKo2J,SAC3BhrB,GAAkB,CAACl6H,EAAKlR,KAAKo2J,SAAStsJ,OAAOa,UAG5C3K,KAAKo2J,QAAS,CACfp2J,KAAKo2J,QAAQ71J,UAAUC,OAAO,UAC9BR,KAAK4xJ,0BAGF/mJ,EAAA,qCAAoD,IAAZiG,IACzC,UAA4B,EAAAzO,GAAA,GAAM,KAAY,KAGhD,MAAMg0J,GAAU,EAAAlwG,GAAA,GAAWnmD,KAAKo2J,UACpB,EAAAjwG,GAAA,GAAWj1C,GACdmlJ,GACP1lJ,EAAA,WAAiC,CAC/B1Q,KAAM,OACN4R,MAAQC,IACN9R,KAAKyvC,QAAQ,GAAI39B,IACjB,EAAA06C,GAAA,QAMRt7C,EAAI3Q,UAAUgB,IAAI,UAClBvB,KAAKo2J,QAAUllJ,GAGTtB,OACNvO,SAAShB,iBAAiB,QAASL,KAAK8xJ,iBAAiB,GAErD,GAAAl1I,oBACF5c,KAAKs2J,6BAILt2J,KAAK6oH,cAAgB,IAAI+e,GAAc5nI,MACvCA,KAAK6oH,cAAckhB,kBAIfusB,6BACN,MAAMC,EAA2B,GAC3BC,EAAgC,GACtC,IAAI/nG,GAAU,EACd,MAAM5qD,EAAS,CAAMvD,EAAcm2J,IAAmB,mCACpD,GAAGA,IAAUhoG,EAAS,OAEtB,MAAM0jG,EAAS7xJ,EAAE8xJ,aAAa15F,MAExBg+F,EAAUvE,EAAOz+I,SAAWy+I,EAAOz+I,SAAS,SAAWy+I,EAAOlyI,QAAQ,UAAY,EAElF+xI,EAAgB71C,KACtB,IAAIu6C,IAAa12J,KAAKiyJ,YAAcD,EAElC,YADA37F,EAAU,GAIZ,MAAMsgG,EAAkB3E,EAAgB4E,EAAsBC,EACxDC,EAAS9E,EAAgBwE,EAAaD,EAE5C,GAAGE,IAAUK,EAAOj2J,OAAQ,CAC1B,MAAM63D,QAAwB,SAAkBp4D,GAAG,GAC7Ci7G,EAAQm7C,IAAYh+F,EAAM73D,OAE1Bk2J,EAAar+F,EAAM5uD,QAAOwI,GAAK,MAA+BA,KAAIzR,OAGxEb,KAAK0nB,IAAI,aAAcgxC,GAEpBs5F,GACDA,EAAc10C,YAAYq5C,IAEvBj+F,EAAM73D,QAAU06G,IACjBu7C,EAAOhvJ,KAAK,IAAI4iI,GAAgBisB,EAAiB,CAC/CznJ,OAAQ,4BACRg8H,WAAY,CAACxyE,EAAM73D,QACnBiqI,OAASxqI,IACPuD,EAAOvD,GAAG,GACVq7F,GAAaj0E,IAAI,OAAQpnB,GACzBq7F,GAAam2D,gBAAgBxxJ,EAAG,mBAKnCo4D,EAAM73D,QAAU06G,IACjBu7C,EAAOhvJ,KAAK,IAAI4iI,GAAgBisB,EAAiB,CAC/C9nJ,KAAM,YACNK,OAAQ,iBACRkhB,SAAU,uBACV06G,OAASxqI,IACPuD,EAAOvD,GAAG,GACVq7F,GAAaj0E,IAAI,OAAQpnB,GACzBq7F,GAAam2D,gBAAgBxxJ,EAAG,iBAMnCy2J,GAAcx7C,IACfu7C,EAAOhvJ,KAAK,IAAI4iI,GAAgBisB,EAAiB,CAC/C9nJ,KAAM,YACNK,OAAQ,iBACRkhB,SAAU,qBACV06G,OAASxqI,IACPuD,EAAOvD,GAAG,GACVq7F,GAAaj0E,IAAI,OAAQpnB,GACzBq7F,GAAam2D,gBAAgBxxJ,EAAG,aAKtCN,KAAKq9B,KAAKj8B,UAAUkD,OAAOqyJ,KAM/B,QAAcA,EAAiB,aAAcF,EAAO,KAAK,KACnDA,IACFK,EAAO/xJ,SAAQiyJ,IACbA,EAAK1wD,aAGPwwD,EAAOj2J,OAAS,MAIjB41J,EACDK,EAAO/xJ,SAAQiyJ,IACbA,EAAK7rB,aAGP90E,EAAU,EAGZh1D,SAASwY,KAAKtZ,UAAUsD,OAAO,cAAe4yJ,GAC9ChoG,EAAUgoG,KAOZ,IAAIpgG,EAAU,EACdh1D,SAASwY,KAAKxZ,iBAAiB,aAAcC,IAC3C+1D,OAGFh1D,SAASwY,KAAKxZ,iBAAiB,YAAaC,IAE1CuD,EAAOvD,GAAG,IACV,EAAAohB,EAAA,GAAYphB,MAGde,SAASwY,KAAKxZ,iBAAiB,aAAcC,IAG3C+1D,IACe,IAAZA,GAEDxyD,EAAOvD,GAAG,MAId,MAAMu2J,EAAiBx1J,SAASC,cAAc,OAC9Cu1J,EAAet2J,UAAUgB,IAAI,mBAE7B,MAAMq1J,EAAsBC,EAAezyJ,WAAU,GAG/C6tJ,UACN,MAAM50H,EAAOr9B,KAAKq9B,KAElB,UADeA,MAAAA,OAAI,EAAJA,EAAMl0B,SACD0B,EAAA,0BAA8BwyB,EAAK4iE,QAAQ,eAiC1DpwF,UAAUgB,EAAYC,IACZ,IAAZA,GACDs6H,GAAkB,CAAC,aAA0BprI,KAAKixJ,SAAU,eAG9D5vJ,SAASwY,KAAKtZ,UAAUsD,OAAO64E,GAAqC,IAAP7rE,GAE7D,MAAMm/C,EAAYhwD,KAAKu1F,MAEvBv1F,KAAK0nB,IAAI,YAAa7W,EAAIm/C,GAE1B,IAAIva,EAAiC5qC,EAAA,oCAAuC,WAAcrH,QAAQ2E,UAClG,IAAkB,IAAf6nD,GAAoBA,IAAcn/C,GAAMhG,EAAA,qCAAoD,IAAZiG,EAAmB,CACpG,MAAMmmJ,EAAqD,KAAnClsI,EAAA,YAAsB,IAAM,KACpD0qB,GAAmB,EAAApzC,GAAA,GAAM40J,IACzB,SAA4BxhH,EAAkBwhH,GAgChD,OAvBAj3J,KAAKu1F,MAAQ1kF,GACb,EAAA27C,GAAA,KACGzhC,EAAA,aAAqC,IAAdilC,GAAmBn/C,EAAK,GAChDxP,SAASwY,KAAKtZ,UAAUC,OAAOk0C,KAGf,IAAfsb,GAAoBn/C,EAAKm/C,IACvBn/C,EAAK,IAAMF,EAAA,iBAAuC,QACnDA,EAAA,WAAiC,CAC/B1Q,KAAM,KACN4R,MAAQC,IAEN9R,KAAKyvC,QAAQ,GAAI39B,MAMzBjH,EAAA,sBAAwB,gBAAiBgG,GAKlC4kC,EAGF68G,eACL,OAAItyJ,KAAKq0J,MAETp/I,EAAA,gBAA8BjV,KAAKq0J,KAAMr0J,KAAKkxJ,SACvC,qBAA2B,uBAAwB,CAACA,QAASlxJ,KAAKkxJ,WAHnD1tJ,QAAQ2E,UAMxBsqJ,gBACN,MAAMp1H,EAAO,IAAIyoG,GAAK9lI,KACpB8T,EAAA,EACAgE,EAAA,EACA,GACA7O,EAAA,EACAmT,EAAA,EACAF,EAAA,EACA0hB,EAAA,QACA+lB,GAAA,EACA1uC,EAAA,EACAgyG,GAAA,EACApxE,GAAA,EACA,KACAirB,GAAA,EACA5mB,GAAA,EACA0xC,GAAA,EACAthD,GAAA,EACA,GACAthC,EAAA,EACAq3H,GAAA,EACAl5F,GAAA,GASF,OANGnnC,KAAKi4D,MAAMp3D,QACZw8B,EAAK6oG,cAAclmI,KAAK6yJ,mBAAmB,GAG7C7yJ,KAAKi4D,MAAMnwD,KAAKu1B,GAETA,EAGD65H,YAAYC,EAAmBC,GAAa,EAAMtmJ,EAAmBumJ,GAC3E,GAAGF,GAAan3J,KAAKi4D,MAAMp3D,OAAQ,OAEnC,MAAMy2J,EAAWt3J,KAAKq9B,KACnBr9B,KAAKi4D,MAAMp3D,OAAS,GAAKu2J,GAC1BvsJ,EAAA,sBAAwB,gBAAiB7K,KAAKq9B,MAG5Cg6H,IACFA,EAAUr3J,KAAKi4D,MAAM3xD,OAAO6wJ,EAAWn3J,KAAKi4D,MAAMp3D,OAASs2J,IAG7DtsJ,EAAA,sBAAwB,gBAAiB,CAACP,KAAMgtJ,EAAUxiH,GAAI90C,KAAKq9B,OAGnE,IAAI,IAAI93B,EAAI,EAAGA,EAAI8xJ,EAAQx2J,OAAS,IAAK0E,EACvCoL,EAAA,eAAqC,QAAQ,GAY/C,GARG0mJ,EAAQx2J,OAAS,GAClBw2J,EAAQz2J,MAAM,GAAI,GAAGmE,SAAQs4B,IAC3BA,EAAKj8B,UAAUZ,YAInBR,KAAK0yJ,eAAe1yJ,KAAKq9B,KAAKj8B,UAAW0P,GAEtCsmJ,EAAY,CACbvsJ,EAAA,sBAAwB,eAAgB7K,KAAKq9B,KAAKl0B,QAElD,MAAM89H,EAAY,UAAuBpD,IACtCoD,GACDA,EAAUx3H,QAGE,0BAAuCzP,KAAKq9B,KAAKl0B,OAAQnJ,KAAKq9B,KAAK1wB,YAE/E,oCAAgD,GAChD,yCAQJ0qJ,EAAQtyJ,SAAQs4B,IACdA,EAAK0pG,mBAGP35H,YAAW,KAETiqJ,EAAQtyJ,SAAQs4B,IACdA,EAAKipE,eAEN,KAGE72D,QAAQ7vC,EAA8B,GAAIkR,G,MAC5C9Q,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGA,QAAd,EAAAhQ,EAAQuJ,cAAM,QAAdvJ,EAAQuJ,OAAW,OAEnB,MAAM,OAACA,EAAM,UAAEkzF,GAAaz8F,EAEtBy9B,EAAOr9B,KAAKq9B,KACZk6H,EAAYv3J,KAAKi4D,MAAMh4C,QAAQod,GAErC,GAAIl0B,GAQG,GAAGouJ,EAAY,GAAKl6H,EAAKl0B,QAAUk0B,EAAKl0B,SAAWA,EAAQ,CAO9D,MAAMkuJ,EAAUr3J,KAAKi4D,MAAM3xD,OAAO,EAAGtG,KAAKi4D,MAAMp3D,OAAS,GACzD,GAAGb,KAAKq9B,KAAKl0B,SAAWA,EAEtB,YADAnJ,KAAKk3J,YAAY,GAAG,GAAM,EAAMG,GAE3B,CACL,MAAMnsH,EAAMlrC,KAAKyvC,QAAQ7vC,GAEzB,OADAI,KAAKk3J,YAAY,GAAG,GAAO,EAAOG,GAC3BnsH,QAtBD,CACV,GAAGqsH,EAAY,EAEb,YADAv3J,KAAKk3J,YAAYK,OAAWhxJ,EAAWuK,GAElC,GAAGia,EAAA,kBAA4B,YAEpC,YADA/qB,KAAK6P,YAAY7P,KAAKu1F,MAAOzkF,GA2BjC,GAAG3H,IAAWk0B,EAAKl0B,QAAU4hB,EAAA,iBAA2B,aAAqB1pB,SAASwY,KAAKtZ,UAAUmT,SAASgpE,IAE5G,OADA18E,KAAK6P,UAAU,EAAGiB,IACX,EAGT,GAAG3H,GAAU4hB,EAAA,kBAA4B,YAAmB,CAC1D,MAAMxiB,EAAS80B,EAAKoS,QAAQtmC,EAAQkzF,EAAWz8F,EAAQqyF,YAGjD5pF,GAAUE,MAAAA,OAAM,EAANA,EAAQ+T,QAAS/T,EAAOF,QAAU7E,QAAQ2E,UACvDgB,GACD3F,QAAQC,IAAI,CACV4E,EACAg1B,EAAKupG,uBACJ7kI,MAAK,KAENqL,YAAW,KACTA,YAAW,KACTpN,KAAK0yJ,eAAe1yJ,KAAKq9B,KAAKj8B,aAC7B,GACHpB,KAAK6P,UAAU,EAAGiB,KACjB,MAKT,OAAI3H,OAAJ,GACEnJ,KAAK6P,UAAU,EAAGiB,IACX,GAIJ8qF,aAAah8F,G,MAClB,MAAM,OAACuJ,GAAUvJ,EACjB,GAAGuJ,IAAW,QAAiBA,EAC7B,OAGF,MAAMlJ,EAAmB,QAAf,EAAGL,EAAQK,YAAI,QAAZL,EAAQK,KAAS,OAGxBu3J,EAAgBx3J,KAAKi4D,MAAMn/C,WAAUukB,GAAQA,EAAKl0B,SAAWA,GAAUk0B,EAAKp9B,OAASA,IAC3F,IAAsB,IAAnBu3J,EAED,OADAx3J,KAAKk3J,YAAYM,EAAgB,GAC1Bx3J,KAAKyvC,QAAQ7vC,GAGtB,MAAM63J,EAAUz3J,KAAKq9B,KACrB,IAAIA,EAAOo6H,EAiBX,OAhBGA,EAAQ5iE,SACTx3D,EAAOr9B,KAAKyyJ,iBAGXxyJ,IACDo9B,EAAKwpG,QAAQ5mI,GAEVL,EAAQ+M,WACT0wB,EAAK1wB,SAAW/M,EAAQ+M,WAI5B9B,EAAA,sBAAwB,gBAAiB,CAACP,KAAMmtJ,EAAS3iH,GAAIzX,IAItDr9B,KAAKyvC,QAAQ7vC,GAGfyoH,cAAcl/G,GACnBnJ,KAAK47F,aAAa,CAChBzyF,OAAAA,EACAlJ,KAAM,cAIFy3J,iBAAiBtxJ,GACvB,MAAMqL,EAAKpQ,SAASC,cAAc,QAClC,IAAI22B,EAAI,cAGR,OAFAxmB,EAAGlR,UAAUgB,IAAI02B,GACjBxmB,EAAGuX,QAAQ5iB,OAASA,EAAOkD,EACpBlD,EAAOkD,GACZ,IAAK,0BAEH2uB,GAAK,QACL,IAAI,IAAI1yB,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAMoyJ,EAAMt2J,SAASC,cAAc,QACnCq2J,EAAIrsJ,UAAY2sB,EAAI,OACpBxmB,EAAGnN,OAAOqzJ,GAEZ,MAGF,IAAK,+BACL,IAAK,kCACL,IAAK,+BACL,IAAK,+BACL,IAAK,+BACH1/H,GAAK,UAIL,MAGF,IAAK,+BACL,IAAK,+BACL,IAAK,+BACHA,GAAK,UACL,MAGF,IAAK,kCACL,IAAK,iCACHA,GAAK,oBACL,IAAI,IAAI1yB,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAMqyJ,EAAMv2J,SAASC,cAAc,OACnCs2J,EAAItsJ,UAAY2sB,EAAI,OACpBxmB,EAAGnN,OAAOszJ,IAQhB,OAFAnmJ,EAAGlR,UAAUgB,IAAI02B,GAEVxmB,EAGFomJ,cAAc1uJ,EAAgB/H,GACnC,IAAI6T,EAAA,QAAsB9L,GAAS,CACjC,MAAM8pJ,EAAUr1H,EAAA,uBAAiCz0B,GACjD,IAAI8pJ,IAAYA,EAAQpyJ,OACtB,OAGF,MAAMqyJ,EAASD,EAAQ,GAEjB6E,EAEF,CACFtgF,QAAS,CACP,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,qCAClC,gCAAmC,yCAErCn6C,KAAM,CACJ,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,qCAClC,gCAAmC,yCAErC06H,MAAO,CACL,wBAA2B,uCAC3B,6BAAgC,wCAChC,gCAAmC,wCACnC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,0BAA6B,wCAC7B,+BAAkC,8CAIhCC,EAAO7uJ,EAAO+4B,SAAW41H,EAAatgF,QAAWy7E,EAAQpyJ,OAAS,EAAIi3J,EAAaC,MAAQD,EAAaz6H,KAC9G,IAAIj3B,EAAS8sJ,EAAO9sJ,OAEpB,GAAG6sJ,EAAQpyJ,OAAS,EAAG,CACrB,MAAMyY,EAAS,GACf25I,EAAQluJ,SAAQmuJ,IACd,MAAMjzJ,EAAOizJ,EAAO9sJ,OAAOkD,OACZ/C,IAAZ+S,EAAErZ,KAAqBqZ,EAAErZ,GAAQ,KAClCqZ,EAAErZ,MAGHya,OAAOgzC,KAAKp0C,GAAGzY,OAAS,IACzBuF,EAAS,CACPkD,EAAG,4BAKT,MAAM0wB,EAAcg+H,EAAK5xJ,EAAOkD,GAChC,IAAI0wB,EACF,OAGE54B,IACFA,EAAYC,SAASC,cAAc,SACzBf,UAAUgB,IAAI,SAAU,yBAGpCH,EAAUb,UAAUsD,OAAO,mBAAiC,mCAAbuC,EAAOkD,GAAuD,oCAAblD,EAAOkD,GAEvG,IAUI9E,EAVAyzJ,EAAgB72J,EAAUyoB,kBAkB9B,GAjBIouI,EAICA,EAAcjvI,QAAQ5iB,SAAWA,EAAOkD,GACzC2uJ,EAAczqI,YAAYxtB,KAAK03J,iBAAiBtxJ,KAJlD6xJ,EAAgBj4J,KAAK03J,iBAAiBtxJ,GACtChF,EAAU8C,QAAQ+zJ,IAQjB9uJ,EAAO65B,cACRx+B,EAAO,CACL,IAAI,KAAU,CAAC2E,OAAQ+pJ,EAAOt+I,OAAOqU,UAAS,GAAQusC,eAAe,IAAO78C,QAC5Es6I,EAAQpyJ,OAAS,IAIL,oCAAbuF,EAAOkD,EAAyC,CAC9C9E,EACDA,EAAKqD,MAELrD,EAAO,GAGT,MAAMysD,GAAO,EAAArkC,GAAA,GAAW,kBAAgCxmB,EAAO69C,WAC/Dz/C,EAAKsD,KAAKmpD,GAGZ,MAAMinG,GAAqB,IAAAtsJ,MAAKouB,EAAax1B,GAK7C,OAJA0zJ,EAAmB33J,UAAUgB,IAAI,2BAE9BH,EAAU2K,kBAAoB,EAAG3K,EAAU21C,iBAAiBvpB,YAAY0qI,GACtE92J,EAAUkD,OAAO4zJ,GACf92J,GAIE+2J,cAAchvJ,EAAgBivJ,G,gDACzC,IAAIhoI,EACJ,GAAIjnB,EAAJ,CAEA,GAAGA,EAAO65B,YAAa,CACrB,IAAIiuB,EAAOjxD,KAAK63J,cAAc1uJ,GAC9B,GAAG8nD,EACD,OAAOA,EAGT,MAAM98C,EAAShL,EAAOoyB,WAChBumG,QAAiBlkG,EAAA,oBAA8BzpB,GACrDnU,KAAKq9B,KAAK3V,IAAI,gBAAiBo6G,GAE/B,MAAMxtE,EAAqBwtE,EAASxtE,oBAAuBwtE,EAASl/F,cAAgBk/F,EAASl/F,aAAaA,cAAgBk/F,EAASl/F,aAAaA,aAAa/hC,QAAW,EAItK,GAFAuvB,EAAWwN,EAAA,6BAAuCzpB,GAE/CmgD,EAAqB,EACtB,OAAOlkC,EAGT,MAAMioI,QAAgBz6H,EAAA,mBAA6BzpB,GACnD,GAAGkkJ,EAAU,EAAG,CACd,MAAMpnG,EAAO5vD,SAASC,cAAc,QAEpC2vD,EAAK3sD,WAAU,IAAAukB,MAAK,CAACuH,GAAU,IAAAxkB,MAAK,cAAe,EAAC,EAAAgtF,GAAA,GAAuBy/D,OAAa,IACxFjoI,EAAW6gC,EAGb,OAAO7gC,EAEJ,CACL,MAAM6Z,EAAOh1B,EAAA,UAAwB9L,GAErC,GAAG0B,EAAA,eAAmB1B,IAAWivJ,EAC/B,OACK,GAAGnuH,EAAM,CAGd,GAFA7Z,EAAWnb,EAAA,sBAAoCg1B,EAAKp5B,KAEhDoE,EAAA,QAAsB9L,GAAS,CACjC,IAAI8nD,EAAOjxD,KAAK63J,cAAc1uJ,GAO9B,GANI8nD,GAA2B,sBAAR,QAAX,EAAAhnB,EAAKsd,cAAM,eAAEj+C,KACvB2nD,EAAO5vD,SAASC,cAAc,QAC9B2vD,EAAK1wD,UAAUgB,IAAI,UACnB0vD,EAAK3sD,OAAO8rB,IAGX6gC,EACD,OAAOA,EAIX,OAAO7gC,QAKNigB,cAAclnC,EAAgBwP,EAAsB23B,EAAoBgoH,EAAwBznI,EAA2BunI,GAC7H9nH,IACD33B,EAAQ7S,UAAYwyJ,EAAgB,IAAM,IAI5C,MAAMC,EAAkB5/I,EAAQpH,cAAc,0BAC3CgnJ,GAAmBv4J,KAAK63J,cAAc1uJ,EAAQovJ,IAIjDv4J,KAAKm4J,cAAchvJ,EAAQivJ,GAAYr2J,MAAMquB,IACvCS,MAIJ,EAAA7iB,EAAA,GAAe2K,EAASyX,IAAakoI,EAAgB,IAAM,QAIxDtF,yBAAyB1jI,GAC9BrmB,EAAA,YAA6BjJ,KAAKq9B,KAAKl0B,OAAQ,CAACG,EAAGgmB,EAAS,0BAA4B,qCAK5F,QAAmB,mBAA8BqsE,IACjD,Y,2SC31De,MAAM68D,WAIV,IA+DT74J,YACYiZ,EACV6/I,GAEA54J,OAAM,GAHI,KAAA+Y,WAAAA,EA1DF,KAAA8/I,OAA6E,GAC7E,KAAAppJ,QAAgG,GAChG,KAAAsS,QAAwH,GAIxH,KAAA6f,OAAS,EACT,KAAA1Z,UAAkC,KAClC,KAAA4wI,oBAA4C,KAO5C,KAAAC,aAAc,EAId,KAAAC,OAASx3J,SAASuzC,eAAe,cAejC,KAAAkkH,aAKN,GAGM,KAAAC,gBAAkB,EAClB,KAAAC,gBAAkB,EAClB,KAAAC,WAAa,EACb,KAAAC,WAAa,EAqRb,KAAAC,aAAe,CAACz4J,EAAQV,KAAK84J,aAAaM,cAAc14J,SAtVzC,IAwVpBA,IACDV,KAAKi5J,WAAa,EAClBj5J,KAAKk5J,WAAa,GAGpBl5J,KAAKq5J,gBAAgB/1J,MAAMmd,UAAY,UAAU/f,YAAgBA,MAAUV,KAAKi5J,eAAej5J,KAAKk5J,cAEpGl5J,KAAK84J,aAAaQ,OAAO/4J,UAAUsD,OAAO,WA9VvB,KA8VmCnD,GACtDV,KAAK84J,aAAaS,MAAMh5J,UAAUsD,OAAO,WA9VtB,IA8VkCnD,GAErDV,KAAKw5J,WAlWkB,IAkWP94J,IAuDlB,KAAAwgB,QAAW5gB,IACT,GAAGN,KAAKy5J,yBAA0B,OAElC,MAAMjhJ,EAASlY,EAAEkY,OACjB,GAAsB,MAAnBA,EAAOg4B,QAAiB,OAG3B,IAFA,EAAA9uB,EAAA,GAAYphB,GAET,GAAAsc,mBAYD,OAXG5c,KAAK05J,0BACNnrJ,aAAavO,KAAK05J,2BAElB15J,KAAK25J,SAASp5J,UAAUgB,IAAI,4BAG9BvB,KAAK05J,0BAA4BvsJ,OAAOC,YAAW,KACjDpN,KAAK25J,SAASp5J,UAAUC,OAAO,uBAC/BR,KAAK05J,0BAA4B,IAChC,MAKL,MAAME,EAAY55J,KAAK45J,YACvB,IAAIC,EAAqB,KACzB,MAAMhwD,EAAa,CAAC,eAAgB,uBAAwB,sBAAuB,uBAAwB,kBACxG+vD,GACD/vD,EAAW/hG,KAAK,uBAGlB+hG,EAAWx3F,MAAKiH,IACd,IAEE,GADAugJ,GAAQ,EAAAh3I,GAAA,GAAgBrK,EAAQc,GAC7BugJ,EAAO,OAAO,EACjB,MAAMhsJ,GAAM,OAAO,MAGiBgsJ,IAAWD,GAAiC,QAAnBphJ,EAAOg4B,SAAwC,UAAnBh4B,EAAOg4B,UAClGxwC,KAAKyP,SAID,KAAA+sG,UAAal8G,IAEnB,GAAGuK,EAAA,uBAA2B,EAC5B,OAGF,MAAMsF,EAAM7P,EAAE6P,IAEd,IAAIgW,GAAO,EACA,eAARhW,EACDnQ,KAAK4hB,QAAQjb,KAAK65B,QACF,cAARrwB,EACRnQ,KAAK4hB,QAAQxE,KAAKojB,QACF,MAARrwB,GAAuB,MAARA,EACpBnQ,KAAK85J,aACN95J,KAAK+5J,WAAmB,MAAR5pJ,GAGlBgW,GAAO,GAGN7lB,EAAEqzH,SAAWrzH,EAAEszH,WAChB5zH,KAAK85J,aAAc,GAGlB3zI,IACD,EAAAzE,EAAA,GAAYphB,IAIR,KAAA05J,QAAW15J,IACduK,EAAA,uBAA2B,GAIzBvK,EAAEqzH,SAAWrzH,EAAEszH,UAClB5zH,KAAK85J,aAAc,EAEhB95J,KAAK45J,aACN55J,KAAKm5J,iBAKH,KAAAv2F,QAAWtiE,IACjB,KAAGuK,EAAA,uBAA2B,IAAM,EAAAgY,GAAA,GAAgBviB,EAAEkY,OAAQ,0BAA4BxY,KAAK85J,gBAI/F,EAAAp4I,EAAA,GAAYphB,GAETN,KAAK85J,aAAa,CACnB,MAAMG,EAAc35J,EAAEyiE,OAAS,EAE/B/iE,KAAK+5J,aAAaE,KArapBj6J,KAAK0nB,KAAM,EAAA2oC,EAAA,IAAO,OAClBrwD,KAAK+nB,UAAY,IAAI,KACrB/nB,KAAK24J,oBAAsB,IAAI,KAAqB,CAClD3wI,YAAY,EACZ7E,YAAY,IAEdnjB,KAAK+nB,UAAUE,YACfjoB,KAAK24J,oBAAoB1wI,YACzBjoB,KAAKyuB,cAAgB,IAAI,KAEzBzuB,KAAK25J,SAAWt4J,SAASC,cAAc,OACvCtB,KAAK25J,SAASp5J,UAAUgB,IAAI24J,sBAE5Bl6J,KAAKm6J,YAAc94J,SAASC,cAAc,OAC1CtB,KAAKm6J,YAAY55J,UAAUgB,IAAI,YAE/B,MAAM64J,EAAU/4J,SAASC,cAAc,OACvC84J,EAAQ75J,UAAUgB,IA5FgB,gBA8FlC,MAAM08F,EAASj+F,KAAKi+F,OAAS58F,SAASC,cAAc,OACpD28F,EAAO19F,UAAUgB,IAAI24J,sBAAoCA,uBAEzD,MAAMG,EAAah5J,SAASC,cAAc,OAC1C+4J,EAAW95J,UAAUgB,IAAI24J,4BAEzBl6J,KAAK4hB,QAAQ,gBAAkB,EAAW,QAAS,CAAC04I,YAAY,IAGhEt6J,KAAK04J,OAAOt3J,UAAYC,SAASC,cAAc,OAC/CtB,KAAK04J,OAAOt3J,UAAUb,UAAUgB,IAAI24J,sBAAoC,aACxE,MAAMK,EAAcl5J,SAASC,cAAc,OAE3CtB,KAAK04J,OAAO58H,SAAW,IAAIC,GAC3B/7B,KAAK04J,OAAO58H,SAASv7B,UAAUgB,IAAI24J,uBAAqC,aAExEl6J,KAAK04J,OAAO/sJ,OAAStK,SAASC,cAAc,OAC5CtB,KAAK04J,OAAO/sJ,OAAOpL,UAAUgB,IAAI24J,qBAEjCl6J,KAAK04J,OAAO7rI,KAAOxrB,SAASC,cAAc,OAC1CtB,KAAK04J,OAAO7rI,KAAKtsB,UAAUgB,IAAI24J,qBAE/BK,EAAYj2J,OAAOtE,KAAK04J,OAAO/sJ,OAAQ3L,KAAK04J,OAAO7rI,MAEnD7sB,KAAK04J,OAAOt3J,UAAUkD,OAAOtE,KAAK04J,OAAO58H,SAAUy+H,GAGnD,MAAM3hF,EAAav3E,SAASC,cAAc,OAC1Cs3E,EAAWr4E,UAAUgB,IAAI24J,wBAEzBzB,EAAWhzJ,OAAO,CAAC,WAAY,OAAQ,UAAUV,SAAQjB,IACvD,MAAMya,EAAS,EAAWza,EAAM,CAACsL,UAAU,IAC3CpP,KAAK4hB,QAAQ9d,GAAQya,EACrBq6D,EAAWt0E,OAAOia,MAGpBve,KAAK4hB,QAAQ44I,KAAKj6J,UAAUgB,IAAI,WAGhCvB,KAAK84J,aAAa13J,UAAYC,SAASC,cAAc,OACrDtB,KAAK84J,aAAa13J,UAAUb,UAAUgB,IAAI,kBAE1CvB,KAAK84J,aAAaQ,OAAS,EAAW,UAAW,CAAClqJ,UAAU,KAC5D,QAAiBpP,KAAK84J,aAAaQ,QAAQ,IAAMt5J,KAAK+5J,YAAW,KACjE/5J,KAAK84J,aAAaS,MAAQ,EAAW,SAAU,CAACnqJ,UAAU,KAC1D,QAAiBpP,KAAK84J,aAAaS,OAAO,IAAMv5J,KAAK+5J,YAAW,KAEhE/5J,KAAK84J,aAAaM,cAAgB,IAAIn6I,GAAc,CAClDa,KAvJY,GAwJZ7c,IAtJiB,GAuJjBJ,IAtJiB,EAuJjBuc,gBAAgB,GAzJK,GA2JvBpf,KAAK84J,aAAaM,cAAch5I,eAChCpgB,KAAK84J,aAAaM,cAAcj5I,YAAY,CAC1CP,QAAS5f,KAAKm5J,aACd96I,UAAW,IAAMre,KAAKm5J,iBAGxBn5J,KAAK84J,aAAa13J,UAAUkD,OAAOtE,KAAK84J,aAAaQ,OAAQt5J,KAAK84J,aAAaM,cAAch4J,UAAWpB,KAAK84J,aAAaS,OAE1Hv5J,KAAK25J,SAASr1J,OAAOtE,KAAK84J,aAAa13J,WAGvCpB,KAAKsP,QAAQkqB,KAAOn4B,SAASC,cAAc,OAC3CtB,KAAKsP,QAAQkqB,KAAKj5B,UAAUgB,IAAI24J,wBAEhCl6J,KAAKsP,QAAQlO,UAAYC,SAASC,cAAc,OAChDtB,KAAKsP,QAAQlO,UAAUb,UAAUgB,IAAI24J,0BAErCl6J,KAAKsP,QAAQgH,MAAQjV,SAASC,cAAc,OAC5CtB,KAAKsP,QAAQgH,MAAM/V,UAAUgB,IAAI24J,sBAEjCl6J,KAAKsP,QAAQlO,UAAUkD,OAAOtE,KAAKsP,QAAQgH,OAE3CtW,KAAKsP,QAAQkqB,KAAKl1B,OAAOtE,KAAKsP,QAAQlO,WACtCg5J,EAAQ91J,OAAOtE,KAAKsP,QAAQkqB,MAC5Bx5B,KAAKm6J,YAAY71J,OAAO81J,GAGxBC,EAAW/1J,OAAOtE,KAAK4hB,QAAQ,gBAAiB5hB,KAAK04J,OAAOt3J,WAC5D68F,EAAO35F,OAAO+1J,EAAYzhF,GAE1B54E,KAAK4hB,QAAQxE,KAAO/b,SAASC,cAAc,OAC3CtB,KAAK4hB,QAAQxE,KAAK9R,UAAY,mDAC9BtL,KAAK4hB,QAAQxE,KAAKtX,UAAY,4DAE9B9F,KAAK4hB,QAAQjb,KAAOtF,SAASC,cAAc,OAC3CtB,KAAK4hB,QAAQjb,KAAK2E,UAAY,oDAC9BtL,KAAK4hB,QAAQjb,KAAKb,UAAY,4DAE9B9F,KAAKq5J,gBAAkBh4J,SAASC,cAAc,OAC9CtB,KAAKq5J,gBAAgB94J,UAAUgB,IAAI24J,uBAEnCl6J,KAAK25J,SAASr1J,OAAOtE,KAAKm6J,YAAan6J,KAAK4hB,QAAQxE,KAAMpd,KAAK4hB,QAAQjb,KAAM3G,KAAKi+F,OAAQj+F,KAAKq5J,iBAI/Fr5J,KAAK4Y,WAAWjQ,aAAe,KAC7B3I,KAAK4hB,QAAQxE,KAAK7c,UAAUsD,OAAO,QAAS7D,KAAK4Y,WAAWlS,SAAS7F,QACrEb,KAAK4hB,QAAQjb,KAAKpG,UAAUsD,OAAO,QAAS7D,KAAK4Y,WAAWjS,KAAK9F,SAGnEb,KAAKy6J,cAxIHjiJ,aACF,OAAOxY,KAAK4Y,WAAWtR,QAGrBkR,WAAO9X,GACTV,KAAK4Y,WAAWtR,QAAU5G,EAsIlB0f,gBACR,QAAiBpgB,KAAK4hB,QAAQ8N,SAAU1vB,KAAK06J,iBAC7C,CAAC16J,KAAK4hB,QAAQnS,MAAOzP,KAAK4hB,QAAQ,gBAAiB5hB,KAAK24J,oBAAoB5wI,WAAWhjB,SAAQ0M,KAC7F,QAAiBA,EAAIzR,KAAKyP,MAAMjH,KAAKxI,UAGtC,CAAC,EAAE,EAAGA,KAAK4hB,QAAQxE,MAAO,CAAC,EAAGpd,KAAK4hB,QAAQjb,OAAmC5B,SAAQ,EAAE41J,EAAYp8I,MAEnGA,EAAOle,iBAAiB,SAAUC,KAChC,EAAAohB,EAAA,GAAYphB,GACTN,KAAK46J,iBAER56J,KAAK4Y,WAAWnR,GAAGkzJ,UAIvB,QAAiB36J,KAAK4hB,QAAQ44I,MAAM,KAC/Bx6J,KAAK45J,YAAa55J,KAAKw5J,YAAW,GAEnCx5J,KAAK+5J,YAAW,MAMpB/5J,KAAK25J,SAASt5J,iBAAiB,QAASL,KAAKkhB,SAE7ClhB,KAAK4Y,WAAW3Q,OAAS,CAACL,EAAMM,KAC3BA,EAAOlI,KAAKmhF,YAAYv5E,GACtB5H,KAAK6gF,YAAYj5E,IAGrB,GAAAgV,oBACoB,IAAIgvB,GAAa,CACpCjzB,QAAS3Y,KAAK25J,SACd5sH,QAAS,CAACL,EAAOC,KACf,KAAG,WAMH,OADiB3pC,KAAK4yB,IAAI8W,GAASlL,GAAA,QACrB,IAAMkL,EAAQ,KAGvBA,EAAQ,EACT1sC,KAAK4hB,QAAQxE,KAAKojB,QAElBxgC,KAAK4hB,QAAQjb,KAAK65B,SAGb,IAGSx9B,KAAK4yB,IAAI+W,GAASnL,GAAA,SACrB,IAAMmL,EAAQ,OAC3B3sC,KAAKyP,SACE,IAKX88B,kBAAoBsuH,GAEyB,UAAvCA,EAAIriJ,OAAuBg4B,WAAuB,EAAA3tB,GAAA,GAAgBg4I,EAAIriJ,OAAQ,0BAUhFghJ,WAAWlkH,GACnB,MAAMw5C,EAAY9uF,KAAK45J,YAKvB,IAJG55J,KAAK84J,aAAaM,cAAcl6I,WAAalf,KAAK85J,eACnDxkH,GAAS,GAGRw5C,IAAcx5C,EAAQ,YAEX/uC,IAAX+uC,IACDA,GAAUw5C,GAGZ9uF,KAAK4hB,QAAQ44I,KAAKj6J,UAAUsD,OAAO,WAAYyxC,GAC/Ct1C,KAAK84J,aAAa13J,UAAUb,UAAUsD,OAAO,aAAcyxC,GAC3D,MAAMwlH,EAAYxlH,EAASt1C,KAAK84J,aAAaM,cAAc14J,MAAQ,EAQnE,GAPAV,KAAKm5J,aAAa2B,GAClB96J,KAAK84J,aAAaM,cAAcr5I,YAAY+6I,GAEzC96J,KAAK+6J,aACN/6J,KAAK+6J,YAAY/3I,cAAasyB,QAAiB/uC,GAG9C+uC,EAAQ,CACT,GAAIt1C,KAAKg7J,iBAuBPh7J,KAAKg7J,iBAAiB56I,mBAvBG,CACzB,IAAIwuB,EAAmBqsH,EACvB,MAAM/9G,GAAc,EACpBl9C,KAAKg7J,iBAAmB,IAAIpvH,GAAa,CACvCjzB,QAAS3Y,KAAKq5J,gBACdxsH,aAAc,KACZ+B,EAAYqsH,EAAY,EACxBj7J,KAAKq5J,gBAAgB94J,UAAUgB,IAAI,kBAErCwrC,QAAS,CAACL,EAAOC,MACdD,EAAOC,GAAS,CAACD,EAAQwQ,EAAYvQ,EAAQuQ,GAC9Cl9C,KAAKi5J,YAAcvsH,EAAQkC,EAC3B5uC,KAAKk5J,YAAcvsH,EAAQsuH,GAC1BrsH,EAAWqsH,GAAa,CAACvuH,EAAOC,GAEjC3sC,KAAKm5J,gBAEP/sH,QAAS,KACPpsC,KAAKq5J,gBAAgB94J,UAAUC,OAAO,kBAExCqrC,OAAQ,SAMZ7rC,KAAK84J,aAAaM,cAAcr5I,YAAY+6I,QACnCxlH,GACTt1C,KAAKg7J,iBAAiBj6I,kBAIhBg5I,WAAWx4J,GACnBvB,KAAK84J,aAAaM,cAAc94I,YAnVlB,IAmV2C/e,EAAM,GAAK,IACpEvB,KAAKm5J,eAkBGS,YACR,OAAO55J,KAAK84J,aAAa13J,UAAUb,UAAUmT,SAAS,cAG9CyR,iBAAiBvD,GACzB,MAAMs5I,EAAgB,GAAiB,CAACZ,YAAY,GAAO,cAAe14I,GAC1E5hB,KAAKi+F,OAAO35F,OAAO42J,GAGdzrJ,MAAMnP,G,MAKX,GAJGA,IACD,EAAAohB,EAAA,GAAYphB,GAGXN,KAAKy5J,yBAA0B,OAAOj2J,QAAQgsB,SAEjD7e,EAAA,eAAqC,SAErC3Q,KAAKyuB,cAAc5iB,QAEnB,MAAMxD,EAAUrI,KAAKm7J,iBAA4B,QAAX,EAAAn7J,KAAKwY,cAAM,eAAEG,SAAS,GAAM5W,MAAK,EAAEshC,eAAAA,KAAoBA,IA6B7F,OA3BArjC,KAAK4Y,WAAWxR,QACfpH,KAAK4Y,WAAmBzN,SAAYnL,KAAK4Y,WAAmBzN,UAC7DnL,KAAK46J,gBAAkB,KACvB56J,KAAKyhC,QAAU,EACdt0B,OAAeiuJ,oBAAiB70J,EAE9BvG,KAAKg7J,mBACNh7J,KAAKg7J,iBAAiBj6I,kBACtB/gB,KAAKg7J,sBAAmBz0J,GAS1B4G,OAAOyB,oBAAoB,UAAW5O,KAAKw8G,WAC3CrvG,OAAOyB,oBAAoB,QAAS5O,KAAKg6J,SACzC7sJ,OAAOyB,oBAAoB,QAAS5O,KAAK4iE,QAAS,CAAChzC,SAAS,IAE5DvnB,EAAQid,SAAQ,KACdtlB,KAAK25J,SAASn5J,SACdqK,EAAA,yBAA4B,EAC5B00C,EAAA,mBAAqC,MAGhCl3C,EAsGO8yJ,iBAAiB3iJ,EAAqB6iJ,GAAU,EAAOC,EAAY,G,0CACjFt7J,KAAKsQ,cAAc,kBAEnB,MAAMupJ,EAAQ75J,KAAKsP,QAAQuqJ,MAEvBwB,IACFxB,EAAM/zJ,UAAY,IAIpB,MAAMg1J,EAAY96J,KAAK45J,aAAeyB,EAAyBr7J,KAAK84J,aAAaM,cAAc14J,MAtgBxE,EAugBeV,KAAKu7J,sBAAsB1B,GAEjE,MAAM2B,EAA0B,IAAdF,EAEZpsD,EAAQrkG,EAAA,mCAAwC2wJ,EAAY,IAAM,IAAO,EAY/E,IAAIC,EAEAj8I,EACDhH,IACEA,aAAkBujB,IAAiBvjB,EAAOjY,UAAUmT,SAAS,cAC9D+nJ,EAAajjJ,EACbgH,EAAOhH,EAAOiH,yBACNjH,aAAkBkjJ,iBAAmBljJ,EAAOvU,yBAAyB03J,yBAC7EF,GAAa,EAAA54I,GAAA,GAAgBrK,EAAQ,cACrCgH,EAAOi8I,EAAWh8I,yBACVjH,EAAOjY,UAAUmT,SAAS,4BAClC+nJ,GAAa,EAAA54I,GAAA,GAAgBrK,EAAQ,6BACrCgH,EAAOi8I,EAAWh8I,wBAGf47I,GAAW7iJ,EAAOiH,wBAAwBoB,OAASrB,EAAKqB,OACzDrI,EAASijJ,EAAaj8I,OAAOjZ,KAK/BiS,IACFA,EAASxY,KAAKsP,QAAQgH,OAGpBkJ,IACFi8I,EAAajjJ,EAAOvU,cACpBub,EAAOhH,EAAOiH,yBAGhB,IAAIm8I,GAAc,EAClB,GAAGpjJ,IAAWxY,KAAKsP,QAAQgH,QAAUkC,EAAOjY,UAAUmT,SAAS,0BAA2B,CACxF,MACMqvF,EAAcxL,GAAekkE,GADX,EAAA54I,GAAA,GAAgB44I,EAAY,eACY,IAE7DJ,GAAat4D,GAAiD,IAAlCA,EAAY/K,SAAS14E,UAAsD,IAApCyjF,EAAY/K,SAASC,YAIjF8K,GAAkD,IAAlCA,EAAY/K,SAAS14E,UAAsD,IAApCyjF,EAAY/K,SAASC,aACpF2jE,GAAc,IAHdH,GADAjjJ,EAASxY,KAAKsP,QAAQgH,OACFrS,cACpBub,EAAOhH,EAAOiH,yBAMlB,MAAMmqH,EAAgB5pI,KAAKsP,QAAQgH,MAAMmJ,wBAEzC,IACIoB,EACA+X,EA6BAomB,EA/BAv+B,EAAY,GAgChB,GA5BG+6I,GACD36I,EAAqB,IAAdy6I,EAAkB95H,GAAA,SAAoBooG,EAAchoI,MAC3Dg3B,EAAMgxG,EAAchxG,MAEpB/X,EAAOrB,EAAKqB,KACZ+X,EAAMpZ,EAAKoZ,KAWbnY,GAAa,eAAeI,OAAU+X,UAYnCpgB,aAAkBqjJ,kBAAoBrjJ,aAAkBsjJ,kBAAuC,QAAnBtjJ,EAAOg4B,QAAmB,CACvG,GAAGqpH,EAAMhwI,mBAAqBgwI,EAAMhwI,kBAAkBtpB,UAAUmT,SAAS,yBAA0B,CACjGsrC,EAAW66G,EAAMhwI,kBAEjB,MAAMjD,EAASo4B,EAASztC,cAAc,iBACtC,GAAGqV,EAAQ,CACT,MAAM3P,EAAQ2P,EAAOiD,kBACrBm1B,EAAS16C,OAAO2S,GAChB2P,EAAOpmB,SAGLw+C,EAAS17C,MAAMsW,UACjBigJ,EAAMt5J,UAAUC,OAAO,UACvBR,KAAK+7J,cAAc/8G,EAAU4qF,EAAepqH,GACvCq6I,EAAMnrH,WACXmrH,EAAMt5J,UAAUgB,IAAI,gBAGtBy9C,EAAW39C,SAASC,cAAc,OAClC09C,EAASz+C,UAAUgB,IAAI,yBACvBs4J,EAAM31J,QAAQ86C,GAGhBA,EAAS17C,MAAMsW,QAAU,UAAU4F,EAAK5d,oBAAoB4d,EAAK3d,gCAAgC+nI,EAAchoI,MAAQ4d,EAAK5d,UAAUgoI,EAAc/nI,OAAS2d,EAAK3d,cAGpKg4J,EAAMv2J,MAAM1B,MAAQgoI,EAAchoI,MAAQ,KAC1Ci4J,EAAMv2J,MAAMzB,OAAS+nI,EAAc/nI,OAAS,KAI5C,MAAMm6J,EAASx8I,EAAK5d,MAAQgoI,EAAchoI,MACpCq6J,EAASz8I,EAAK3d,OAAS+nI,EAAc/nI,OACvC25J,IACF/6I,GAAa,WAAWu7I,KAAUC,SAGpC,IAAItrC,EAAexjH,OAAO2iI,iBAAiB2rB,GAAY1rB,iBAAiB,iBACxE,MAAMmsB,ECrrBK,SAA2BzsF,GACxC,IAAItV,EAAWsV,EAAIzvB,MAAM,KACzB,GAAuB,IAApBma,EAASt5D,OAAc,CACpBs5D,EAAS,KAAIA,EAAS,GAAK,OAC/B,IAAI,IAAI50D,EAAI40D,EAASt5D,OAAQ0E,EAAI,IAAKA,EACpC40D,EAAS50D,GAAK40D,EAAS50D,EAAI,IAAM40D,EAAS,IAAM,MAIpD,OAAOA,ED4qBcgiG,CAAkBxrC,GAOrC,GANAA,EAAeurC,EAAWxxJ,KAAI4Y,GAAMw+C,SAASx+C,GAAK04I,EAAU,OAAMnzI,KAAK,KACnE2yI,IACF3B,EAAMv2J,MAAMqtH,aAAeA,GAI1B0qC,GAAyB,IAAdP,EAAiB,CAG7B,MAAMsB,EAAa56H,GAAA,QAAmB,EAAIhiB,EAAK5d,MAAQ,EACjDy6J,EAAY76H,GAAA,SAAoB,EAAIhiB,EAAK3d,OAAS,EAClDgf,EAAOrB,EAAKqB,KAAOu7I,EACnBxjI,EAAMpZ,EAAKoZ,IAAMyjI,EACvBr8J,KAAKq5J,gBAAgB/1J,MAAMmd,UAAY,UAAUu7I,YAAiBC,MAAWp7I,MAAS+X,UAEtFihI,EAAMv2J,MAAMmd,UAAYA,EAS1B,IAAIk6G,EANJihC,IAAgB/B,EAAMv2J,MAAMwqD,QAAU,KAOtC,MAAMxQ,EAAQ9kC,EAAOjY,UAAUmT,SAAS,UAElC0H,EAAWpb,KAAKy5J,0BAA2B,UAC3CvuH,EAAM,CAAC7H,eAAgBjoB,GAEvB/M,EAAUjB,YAAW,KACrBgO,EAASkkC,aAAgBlkC,EAASkhJ,YACpClhJ,EAASjT,YAEV,KAYH,GAVAiT,EAASkK,SAAQ,KACftlB,KAAKsQ,cAAc,iBAEhBtQ,KAAKy5J,2BAA6Br+I,IACnCpb,KAAKy5J,yBAA2B,MAGlClrJ,aAAaF,MAGXgtJ,EA+JF,OArCG7iJ,aAAkB+jJ,gBACnB5hC,EAAOk/B,EAAMtoJ,cAAc,QAExBopH,GACD36H,KAAKw8J,aAAa7hC,EAAMiP,EAAeoyB,EAAQ9sD,GAAO,EAAO5xD,EAAOqzE,IAIrEn4G,EAAOjY,UAAUmT,SAAS,uBAC3BmmJ,EAAMt5J,UAAUgB,IAAI,UAGtBvB,KAAK25J,SAASp5J,UAAUgB,IAAI,aAC5B6L,YAAW,KACTpN,KAAK25J,SAASp5J,UAAUC,OAAO,YAC9B,GAIH4M,YAAW,KACTysJ,EAAMv2J,MAAMqtH,aAAeA,EAExBkpC,EAAMhwI,oBACNgwI,EAAMhwI,kBAAkCvmB,MAAMqtH,aAAeA,KAE/DzhB,EAAQ,GAEX9hG,YAAW,KACTysJ,EAAM/zJ,UAAY,GAClB+zJ,EAAMt5J,UAAUC,OAAO,SAAU,SAAU,UAC3Cq5J,EAAMv2J,MAAMsW,QAAU,iBAEtBwB,EAASjT,YACR+mG,GAEH2qD,EAAMt5J,UAAUC,OAAO,WAEhB0qC,EA/JI,CACX,IAAIuxH,EACArkJ,EAEJ,GAAGI,aAAkBsjJ,iBAAkB,CACrC,MAAMhzI,EAAWze,MAAMC,KAAKkO,EAAOvU,cAAcuN,iBAAiB,QAC/DsX,EAASjoB,SACV2X,EAASsQ,EAASjhB,OAItB,GAAsB,QAAnB2Q,EAAOg4B,SAAwC,mBAAnBh4B,EAAOg4B,QAA8B,CAClE,MACMuQ,EADS12C,MAAMC,KAAKkO,EAAOhH,iBAAiB,QAC7B3J,MAClBk5C,IACD07G,EAAe,IAAIpvH,MACnBj1B,EAAM2oC,EAAM3oC,IACZyhJ,EAAMv1J,OAAOm4J,SAKV,GAAGjkJ,aAAkBqjJ,iBAC1BY,EAAe,IAAIpvH,MACnBj1B,EAAMI,EAAOJ,SACR,GAAGI,aAAkBsjJ,iBAC1BW,EAAep7J,SAASC,cAAc,SACtCm7J,EAAarkJ,IAAMI,EAAOJ,SACrB,GAAGI,aAAkB+jJ,cAAe,CACzC,MAAMG,EAASlkJ,EAAOwQ,QAAQ0zI,OACxBC,EAAYD,EAAS,OAErB,MAAC96J,EAAK,OAAEC,GAAU+nI,EAElBgzB,EAASv7J,SAAS6pB,gBAAgB,6BAA8B,OACtE0xI,EAAOz0I,eAAe,KAAM,QAAS,GAAKvmB,GAC1Cg7J,EAAOz0I,eAAe,KAAM,SAAU,GAAKtmB,GAG3C+6J,EAAOz0I,eAAe,KAAM,UAAW,OAAOvmB,KAASC,KACvD+6J,EAAOz0I,eAAe,KAAM,sBAAuB,iBAEnDy0I,EAAOl3I,mBAAmB,YAAalN,EAAOqR,kBAAkBgzI,UAAUl8J,QAAQ+7J,EAAQC,IAC1FC,EAAOl3I,mBAAmB,YAAalN,EAAOu+B,iBAAiB8lH,UAAUl8J,QAAQ+7J,EAAQC,IAGzF,MAAMhhC,EAAOihC,EAAO/yI,kBACd0hB,EAAMowF,EAAK9xG,kBAAkBA,kBACnC,GAAG0hB,aAAeuxH,cAAe,CAC/B,IAmBIl7H,EAnBAnhB,EAAY8qB,EAAIsT,eAAe,KAAM,aACzCp+B,EAAYA,EAAU9f,QAAQ,mDAAmD,CAACyV,EAAO6H,EAAGE,EAAG4+I,EAAIC,IAU1F,aAPL/+I,EADO,IADTA,GAAKA,GAECrc,EAAS,EAAIo6J,EAEb,EAAIA,MAGNn6J,aAEmCk7J,EAAKf,OAAYgB,EAAKf,OAE/D1wH,EAAIpjB,eAAe,KAAM,YAAa1H,GAGtCk6G,EAAOgB,EAAK9xG,kBAAkBktB,iBAI9B,MAAMi6E,EAAuCL,EAAa3wE,MAAM,KAAKt1C,KAAI/F,GAAKm9D,SAASn9D,KAC7Ei9B,EAAP0b,EAAWgtF,GAAiB,EAAG,EAAG1oI,EAAQ,EAAIo6J,EAAQn6J,KAAWmvH,GAC3DsZ,GAAiB,EAAI0xB,EAAQ,EAAGp6J,EAAQ,EAAIo6J,EAAQn6J,KAAWmvH,GACxE2J,EAAKxyG,eAAe,KAAM,IAAKyZ,GAGjC,MAAMgd,EAAgBg+G,EAAO7lH,iBAC7B6H,EAAcz2B,eAAe,KAAM,QAAS,GAAKyhH,EAAchoI,OAC/Dg9C,EAAcz2B,eAAe,KAAM,SAAU,GAAKyhH,EAAc/nI,QAEhEg4J,EAAM31J,QAAQ04J,GAGb59G,IACDA,EAAS17C,MAAMqtH,aAAeA,EAE3B8rC,GACDz9G,EAAS16C,OAAOm4J,IAIpBA,EAAe5C,EAAMtoJ,cAAc,cAChCkrJ,aAAwBZ,mBACzBY,EAAal8J,UAAUgB,IAAI,aACvBy9C,IACFy9G,EAAan5J,MAAM1B,MAAQgoI,EAAchoI,MAAQ,KACjD66J,EAAan5J,MAAMzB,OAAS+nI,EAAc/nI,OAAS,MAGlDuW,UACK,EAAAwnC,GAAA,IAA0B68G,EAAcrkJ,KAYlDyhJ,EAAMv2J,MAAMC,QAAU,IAEtB,UAAQ,KACNs2J,EAAMt5J,UAAUgB,IAAIi6J,EAAY,SAAW,aA4G/C,OA5DA3B,EAAMt5J,UAAUgB,IAAI,iBAKd,WAONs4J,EAAMv2J,MAAMmd,UAAY,eAAempH,EAAc/oH,UAAU+oH,EAAchxG,0BAE7EgjI,IAAgB/B,EAAMv2J,MAAMwqD,QAAU,IAEnC9O,GACDh/C,KAAK+7J,cAAc/8G,EAAU4qF,EAAepqH,GAK9CpS,YAAW,KACTysJ,EAAMv2J,MAAMqtH,aAAe,GAExBkpC,EAAMhwI,oBACNgwI,EAAMhwI,kBAAkCvmB,MAAMqtH,aAAe,MAE/D,GAEHkpC,EAAM7wI,QAAQ3a,QAAU,GAAKjB,YAAW,KACtCysJ,EAAMt5J,UAAUC,OAAO,SAAU,WAE9Bw+C,IACE66G,EAAMtoJ,cAAc,SACrBsoJ,EAAMt5J,UAAUC,OAAO,UACvBw+C,EAAS17C,MAAMsW,QAAU,GACpBigJ,EAAMnrH,YAOfmrH,EAAMt5J,UAAUgB,IAAI,SAAU,iBAM9Bs4J,EAAMt5J,UAAUgB,IAAI,iBACbs4J,EAAM7wI,QAAQ3a,QAErB+M,EAASjT,YACR+mG,GAEAyrB,GACD36H,KAAKw8J,aAAa7hC,EAAMiP,EAAeoyB,EAAQ9sD,GAAO,EAAM5xD,EAAOqzE,GAG9DzlF,KAGC6wH,cAAc/8G,EAA0B4qF,EAAwBpqH,GAQxE,MAAM01B,EAAa00F,EAAchoI,MAAQgoI,EAAc/nI,OAEvD,IAAI,MAACD,EAAK,OAAEC,GAAU2d,EAIjB01B,EAAa,EACdtzC,EAAQC,EAASqzC,EAEjBrzC,EAASD,EAAQszC,EAKnB8J,EAAS17C,MAAMsW,QAAU,UAAUhY,gBAAoBC,2BAAgC+nI,EAAchoI,MAAQA,MAAUgoI,EAAc/nI,OAASA,SAIxI26J,aAAa7hC,EAAsBn7G,EAAew8I,EAAgB9sD,EAAe+tD,EAAkB3/G,EAAgBqzE,GAC3H,MAAMvsG,EAAQi2B,KAAKC,OACb,MAAC14C,EAAK,OAAEC,GAAU2d,EACxB0vF,GAAgB,EAEhB,MAAM8hB,EAAKL,EAAa3wE,MAAM,KAAKt1C,KAAI/F,GAAKm9D,SAASn9D,KAE/Cmb,EAAO,KACX,MAAM6V,EAAO0kB,KAAKC,MAAQl2B,EAE1B,IAAIiB,EAAW6pF,EAAQv5E,EAAOu5E,EAAQ,EACnC7pF,EAAW,IAAGA,EAAW,GACzB43I,IAAS53I,EAAW,EAAIA,GAE3B,MAAM63I,EAAwClsC,EAAGtmH,KAAI/F,GAAKA,EAAI0gB,IAE9D,IAAIuc,EACMA,EAAP0b,EAAWgtF,GAAiB,EAAG,EAAG1oI,EAAS,EAAIo6J,EAAS32I,EAAWxjB,KAAWq7J,GACxE5yB,GAAiB,EAAI0xB,EAAS32I,EAAU,EAAGzjB,EAA4CC,KAAWq7J,GAC3GviC,EAAKxyG,eAAe,KAAM,IAAKyZ,GAE5BjM,EAAOu5E,IAAO,SAAQpvF,IAI3BA,IAGQy7I,sBAAsB1B,GAC9B,GAAGA,EAAMt5J,UAAUmT,SAAS,UAAW,CAErC,MAAM8L,EAAOxf,KAAKsP,QAAQgH,MAAMmJ,wBAChCo6I,EAAMv2J,MAAMmd,UAAY,eAAejB,EAAKqB,UAAUrB,EAAKoZ,WAC3DihI,EAAMt5J,UAAUC,OAAO,UAClBq5J,EAAMnrH,WACXmrH,EAAMt5J,UAAUC,OAAO,kBAIjB28J,aAAatD,EAAoBuD,GAAS,GAClD,MAAMC,EAAU77H,GAAA,QAEhBxhC,KAAKu7J,sBAAsB1B,GAG3BA,EAAMt5J,UAAUgB,IAAI,UAEjBs4J,EAAM7wI,QAAQ3a,SACfE,cAAcsrJ,EAAM7wI,QAAQ3a,SAG9B,MAAMmR,EAAOq6I,EAAMp6I,wBAEb69I,EAAezD,EAAMv2J,MAAMmd,UAAU9f,QAAQ,uBAAuB,CAACyV,EAAOmnJ,KAChF,MAAMt/I,EAAIm/I,GAAU59I,EAAK5d,MAAQy7J,EAGjC,OAAOjnJ,EAAMzV,QAAQ48J,EAAIt/I,EAAI,SAI/B47I,EAAMv2J,MAAMmd,UAAY68I,EAExBlwJ,YAAW,KACTysJ,EAAMr5J,WACL,KAGKi6J,cACR,MAAM+C,EAAWn8J,SAASC,cAAc,OAWxC,OAVAk8J,EAASj9J,UAAUgB,IAAI,sBACvBi8J,EAASl6J,MAAMC,QAAU,OAEtBvD,KAAKsP,QAAQuqJ,MACG75J,KAAKsP,QAAQuqJ,MACrB51J,cAAcK,OAAOk5J,GAE9Bx9J,KAAKq5J,gBAAgB/0J,OAAOk5J,GAGvBx9J,KAAKsP,QAAQuqJ,MAAQ2D,EAGpBC,kBAAkBjlJ,EAAqBH,EAAam4B,GAE1D,MAAM/+B,EAAK+G,EAAOg4B,QAAQ2P,gBAAkB3P,EAAUh4B,EAASA,EAAOjH,cAAci/B,GACpF,GAAG/+B,KAAO,EAAAoR,GAAA,GAAgBrK,EAAQ,YAAa,CAC7C,IAAG,EAAAqK,GAAA,GAAgBrK,EAAQ,cAAe,CAExC,MAAMuP,EAAYvP,EAAOvU,cAAcA,cAAcsN,cAAc,wBACnE,GAAGwW,EAAW,CACZ,GAAe,UAAZyoB,EAMD,YALGzoB,EAAUxnB,UAAUmT,SAAS,WAC9BqU,EAAUyY,SAOdzY,EAAUvnB,WAId,EAAAo/C,GAAA,IAAmBnuC,EAAI4G,GAGpB5G,EAAGlR,UAAUmT,SAAS,cAAgBjC,EAAGxN,cAAc1D,UAAUmT,SAAS,6BAC3EjC,EAAGlR,UAAUC,OAAO,cAQlBk9J,cAAcjwJ,EAAyB+oD,IAC/C,EAAAxoD,EAAA,GAAehO,KAAK04J,OAAO7rI,MAAM,SAAmB2pC,IAEpD,MAAMx2B,EAAWvyB,EAAOuyB,WACxB,IAAI3wB,EACD2wB,EACD3wB,EAAQ,IAAI,KAAU,CACpBlG,OAAQsE,EACRqH,QAAQ,EACR0gD,eAAe,EACf11D,WAAW,IACV6Y,SAEHtJ,EAAQhO,SAASC,cAAc,QAC/B+N,EAAMvJ,UAAY,kBAAgC2H,GAClD4B,EAAM9O,UAAUgB,IAAI,gBAGtB,EAAAyM,EAAA,GAAehO,KAAK04J,OAAO/sJ,OAAQ0D,GAEnC,IAAIsuJ,EAAY39J,KAAK04J,OAAO58H,SAC5B97B,KAAK04J,OAAO58H,SAAY6hI,EAAUv5J,YAE9B47B,EAGFhgC,KAAK04J,OAAO58H,SAAS0N,gBAAgB,cAFrCxpC,KAAK04J,OAAO58H,SAAS57B,aAAa,aAAc,GAAKuN,GAKvDzN,KAAK04J,OAAO58H,SAAS57B,aAAa,OAAQ,IAAMuN,GAAU,QAE1DkwJ,EAAU15J,cAAc25J,aAAa59J,KAAK04J,OAAO58H,SAAU6hI,GAG7CE,WACdvnJ,EACAkgD,EACA/oD,EACA6tJ,EACA9iJ,EACA5R,GAAU,EACVwnC,EAA4B,GAC5BC,EAA4B,GAC5BnoC,G,0CAGA,GAAGlG,KAAK46J,gBAAiB,OAAO56J,KAAK46J,gBAMrC56J,KAAK09J,cAAcjwJ,EAAQ+oD,GAE3B,MAAMsnG,EAAyB,aAAZxnJ,EAAMhN,EACnBsnJ,EAAUkN,GAAcxnJ,EAAM2nC,YAAe,CAAC,QAAS,OAAgC1e,SAASjpB,EAAMrW,OAA+C,IAAtCqW,EAAM2nC,UAAUh+B,QAAQ,WAE1IjgB,KAAK44J,cAGN54J,KAAK44J,aAAc,EACnB54J,KAAK4Y,WAAW1R,WAAWknC,EAAaC,EAAaznC,GACpDuG,OAAeiuJ,eAAiBp7J,MAShCA,KAAK4Y,WAAWjS,KAAK9F,OAAS,IAC/BuM,YAAW,KACTpN,KAAK4Y,WAAWpX,MAAK,KACpB,GAMLxB,KAAK4hB,QAAQxE,KAAK7c,UAAUsD,OAAO,QAAS7D,KAAK4Y,WAAWlS,SAAS7F,QACrEb,KAAK4hB,QAAQjb,KAAKpG,UAAUsD,OAAO,QAAS7D,KAAK4Y,WAAWjS,KAAK9F,QAEjE,MAAMO,EAAYpB,KAAKsP,QAAQgH,MACzBynJ,GAAwBvlJ,GAAUA,IAAWpX,EAChD28J,IAAsBvlJ,EAASpX,GAElCpB,KAAKwY,OAAS,CAACG,QAASH,GACxB,MAAMipB,IAAWzhC,KAAKyhC,OAStB,GAPGrgC,EAAUyoB,oBACXzoB,EAAU0E,UAAY,IAKQ,IAAdw1J,EAEhBt7J,KAAKm9J,aAAan9J,KAAKsP,QAAQuqJ,MAAqB,IAAdyB,GACtCt7J,KAAKy6J,kBACA,CACL5vJ,EAAA,yBAA4B,EAC5BsC,OAAO9M,iBAAiB,UAAWL,KAAKw8G,WACxCrvG,OAAO9M,iBAAiB,QAASL,KAAKg6J,SAClC,GAAAp9I,oBAAoBzP,OAAO9M,iBAAiB,QAASL,KAAK4iE,QAAS,CAAC5jD,SAAS,EAAO4Q,SAAS,IACjG,MAAMouI,EAAc38J,SAASuzC,eAAe,gBAC5C50C,KAAK64J,OAAO10J,aAAanE,KAAK25J,SAAUqE,GACnCh+J,KAAK25J,SAASjrH,WACnB1uC,KAAK25J,SAASp5J,UAAUgB,IAAI,UAC5Bg+C,EAAA,mBAAqC,GAEjC,GAAAoN,kBACFh8C,EAAA,WAAiC,CAC/B1Q,KAAM,QACN4R,MAAQC,IACN,GAAG9R,KAAKy5J,yBACN,OAAO,EAGTz5J,KAAKyP,WAQb,MAAMoqJ,EAAQ75J,KAAKsP,QAAQuqJ,MAErBloI,EAAW6P,GAAA,QAGjB,IAAIy8H,EAAU,EACd,MAAMC,EAAU18H,GAAA,SACb08H,EAAU,MAAYnzI,EAAA,cACvBkzI,EAAU,KAEZ,MAAMnsI,EAAYosI,EAAU,IAAMD,EAClC,IAAIE,EAA6B36J,QAAQ2E,UACzC,MAAMjH,EAAOgb,EAAA,oBAAmC5F,EAAOlV,EAAWuwB,EAAUG,GAAW/G,EAAA,iBAAoCxkB,KAAcu3J,GAAcxnJ,EAAM+E,GAAK/E,EAAM2F,IAAIklC,UAC5K,GAAG48G,EAAsB,CACvB,MAAM7lJ,EAAeC,GAAA,kBAAmC7B,EAAOpV,EAAKjB,MACpE,IAAI4uB,EACJ,GAAG3W,EAAagnC,WACdrwB,EAAM,IAAIwe,MACVxe,EAAIzW,IAAMF,EAAaG,QAClB,CACL,MAAMymC,EAAW5iC,EAAA,2BAA0C5F,EAAO4B,GAAc,GAC7E4mC,IACDq/G,EAAer/G,EAASr9C,YACxBotB,EAAMiwB,EAASiC,OAIhBlyB,IACDA,EAAItuB,UAAUgB,IAAI,aAClBH,EAAUkD,OAAOuqB,IASrB,MAAM7W,KAAgC8lJ,IAAcxnJ,EAAM0B,mBACpD+P,EAAY/P,EAAoBhY,KAAK24J,oBAAsB34J,KAAK+nB,UAEtE,IAAI6yI,EACJ,GAAGhK,EAAS,CAKV,MAAMwN,EAAgBl4J,GAA0B,QAAfoQ,EAAMrW,KACjCgX,EAED5V,SAASC,cAAc,SAEtB2D,EAAM,IAAMjF,KAAKm7J,iBAAiB3iJ,GAAQ,EAAO8iJ,GAAWv5J,MAAK,EAAEshC,eAAAA,MAKvE,MAAMpS,EAAM4oI,EAAMhwI,mBAAqBgwI,EAAMhwI,kBAAkBtpB,UAAUmT,SAAS,yBAA2BmmJ,EAAMhwI,kBAAoBgwI,EAGjIwE,EAAaxE,EAAMtoJ,cAAc,SACpC8sJ,GACDA,EAAW79J,SAKbyW,EAAM/W,aAAa,cAAe,QAGlC+W,EAAM5W,iBAAiB,cAAc,KAChCL,KAAKyhC,SAAWA,GACjBxqB,EAAM5U,WAIV4U,EAAM5W,iBAAiB,SAAS,KACN,IAArB4W,EAAMlJ,MAAMmY,MACblmB,KAAK0nB,IAAI3Z,MAAM,SAAWkJ,EAAMlJ,MAAMmY,KAAO,cAAgBjP,EAAMlJ,MAAM7H,SAGxE6hB,GACDA,EAAUs3B,WAEX,CAAClkC,MAAM,IAEVnb,KAAKK,iBAAiB,iBAAiB,KACrC4W,EAAMmB,IAAM,GACZnB,EAAMzV,SACL,CAAC2Z,MAAM,IAEP,GAAAjF,YAGDe,EAAMtV,UAAW,GAGD,QAAf2U,EAAMrW,MACPgX,EAAM4D,OAAQ,EACd5D,EAAMtV,UAAW,EACjBsV,EAAMvV,MAAO,GACL4U,EAAMmB,SAAW,KACzBR,EAAMvV,MAAO,GAIbuvB,EAAI3sB,OAAO2S,GAGb,MAAMqnJ,EAAiB,IAAI96J,SAAS2E,IAClC8O,EAAM5W,iBAAiB,UAAW8H,EAAS,CAACgT,MAAM,OAG9CojJ,EAAe,KACD,QAAfjoJ,EAAMrW,OACPgX,EAAM+R,QAAQw1I,KAAO,UACrBvnJ,EAAM+R,QAAQy1I,QAAU,IAExBj7J,QAAQC,IAAI,CAAC66J,EAAgBj7H,IAAiBthC,MAAK,KAC9C/B,KAAKyhC,SAAWA,KAMJzhC,KAAK+6J,YAAc,IAAIp2I,GAAY,CAChD1N,MAAAA,EACAvU,MAHW,EAIXygB,WAAYnL,EACZ4M,yBAA2BjV,IACzB3P,KAAK25J,SAASp5J,UAAUsD,OAAO,iBAAkB8L,OAG9CtP,iBAAiB,kBAAmBqiB,IACzC1iB,KAAK25J,SAASp5J,UAAUsD,OAAO,qBAAsB6e,MAGvD1iB,KAAKK,iBAAiB,kBAAkB,KACtCL,KAAK25J,SAASp5J,UAAUC,OAAO,sBAC/BR,KAAK+6J,YAAYh6I,kBACjB/gB,KAAK+6J,iBAAcx0J,IAClB,CAAC4U,MAAM,IAEPnb,KAAK45J,aACN55J,KAAK+6J,YAAY/3I,cAAa,SAQtC,GAAGhL,EAAmB,CACpBqrB,EAAethC,MAAK,KACfkV,EAAM2W,WAAa3W,EAAMynJ,kBAC1B32I,EAAU+G,OAAO+qI,GAAO,MAQ5B,MAAM8E,EAAgB,KACpB1nJ,EAAM5W,iBAAiB,WAAW,KAEhC0nB,EAAUs3B,SACVpoC,EAAMhT,cAAc1D,UAAUC,OAAO,kBACpC,CAAC2a,MAAM,KAGZlE,EAAM5W,iBAAiB,WAAW,KAChC,MAAMk+B,EAAUtnB,EAAM2nJ,eAAiB3nJ,EAAM4nJ,gBACvCC,EAAiB7nJ,EAAM2W,WAAa3W,EAAMynJ,iBAG7CngI,GAAWugI,IACZH,IAEA52I,EAAU+G,OAAO+qI,GAAO,GAGxB5iJ,EAAMhT,cAAc1D,UAAUgB,IAAI,oBAInCvB,KAAK25J,SAASp5J,UAAUmT,SAAS,gBAClCuD,EAAM5W,iBAAiB,eAAgBC,KACrC,EAAAohB,EAAA,GAAYphB,MAIhBq+J,IAqDA3+J,KAAKyuB,cAAczmB,QAAQ,CAACxG,KAjDf,KAKX,MAAM0W,EAAeC,GAAA,kBAAmC7B,GAClDjO,EAAwB2P,EAAoBxU,QAAQ2E,UAAY2P,EAAA,cAA2BxB,GAwCjG,OAtCI0B,GACFqrB,EAAethC,MAAK,KACdmW,EAAaG,KACf0P,EAAU+G,OAAO+qI,GAAO,EAAMxxJ,MAKpC7E,QAAQC,IAAI,CAAC4E,EAASg7B,IAAiBthC,MAAK,KAC1C,GAAG/B,KAAKyhC,SAAWA,EAEjB,YADAzhC,KAAK0nB,IAAIpN,KAAK,8BAIhB,MAAMjC,EAAMH,EAAaG,IAWzB,GAVGG,aAAkB+jJ,cAEjBtrI,EAAIpH,kBAAkBktB,iBAAiBzyC,OAAO2S,IAGhD,EAAA2oC,GAAA,IAAmB3oC,EAAOoB,GAKzB+lJ,EAAe,CAChB,MAAMW,EAAW,kBAA0C9nJ,EAAO/Q,GAElElG,KAAKK,iBAAiB,kBAAkB,KACtC0+J,MACC,CAAC5jJ,MAAM,IAGZnb,KAAKy9J,kBAAkBjlJ,EAAQH,EAAK,SAEpCkmJ,OAGKl2J,QAObuyJ,EAAkBuD,EAAap8J,KAAKkD,OAC/B,CACL,MAAMA,EAAM,IAAMjF,KAAKm7J,iBAAiB3iJ,GAAQ,EAAO8iJ,GAAWv5J,MAAK,EAAEshC,eAAAA,MAsEvErjC,KAAKyuB,cAAczmB,QAAQ,CAACxG,KAjEf,KACX,MAAM0W,EAAeC,GAAA,kBAAmC7B,EAAOpV,EAAKjB,MAC9D++J,EAAqBlB,EAAahmJ,EAAA,cAA2BxB,GAAS4F,EAAA,eAA8B5F,EAAOpV,GA4DjH,OA1DAmiC,EAAethC,MAAK,KACdmW,EAAaG,KACfrY,KAAK+nB,UAAUk3I,cAAcD,MAKjCx7J,QAAQC,IAAI,CAAC4/B,EAAgB27H,IAAqBj9J,MAAK,K,MACrD,GAAG/B,KAAKyhC,SAAWA,EAEjB,YADAzhC,KAAK0nB,IAAIpN,KAAK,8BAMhB,MAAMjC,EAAMH,EAAaG,IACzB,GAAGG,aAAkB+jJ,eAInB,GAHAv8J,KAAKy9J,kBAAkBjlJ,EAAQH,EAAK,OACpCrY,KAAKy9J,kBAAkB5D,EAAOxhJ,EAAK,OAEhC0S,EAAA,YAAqB,CACtB,MAAMmD,EAAO2rI,EAAMroJ,iBAAiB,OACjC0c,GAAQA,EAAKrtB,QACdqtB,EAAKnpB,SAAQ8pB,IACXA,EAAItuB,UAAUC,OAAO,qBAItB,CACL,MAAMywB,EAAM4oI,EAAMhwI,mBAAqBgwI,EAAMhwI,kBAAkBtpB,UAAUmT,SAAS,yBAA2BmmJ,EAAMhwI,kBAAoBgwI,EACjIqF,EAA+C,SAAd,QAArB,EAAAjuI,EAAIpH,yBAAiB,eAAE2mB,SAAoBvf,EAAIpH,kBAAwC,KACzG,IAAIq1I,GAAaA,EAAU9mJ,MAAQC,EAAM,CACvC,IAAI0oC,EAAQ,IAAI1T,MAChB0T,EAAMxgD,UAAUgB,IAAI,cAIpB,EAAAq+C,GAAA,IAAmBmB,EAAO1oC,GAAK,KAC7BrY,KAAKy9J,kBAAkBjlJ,EAAQH,EAAK,OAEjC6mJ,IACD,UAAQ,KACNA,EAAU1+J,YAIdywB,EAAI3sB,OAAOy8C,WAMhB9yC,OAAMJ,IACP7N,KAAK0nB,IAAI3Z,MAAMF,GACf7N,KAAK+nB,UAAU+G,OAAO+qI,GACtB75J,KAAK+nB,UAAU23B,eAGVs/G,QAMXpE,EAAkBuD,EAAap8J,KAAKkD,GAGtC,OAAOjF,KAAK46J,gBAAkBA,EAAgB3sJ,OAAM,KAClDjO,KAAKy5J,yBAA2B,QAC/Bn0I,SAAQ,KACTtlB,KAAK46J,gBAAkB,YElgDd,MAAM3oG,WAAuBumG,GAU1C74J,cA4BE,IAAIw/J,EA3BJt/J,MAAM,IAAI+I,EAAiB,CACzBF,YAAcd,IACZ,MAAMw3J,EAAqD,gCAArCp/J,KAAKkJ,cAAcG,YAAYC,GAC/C,IAACP,EAAG,OAAEI,GAAUvB,EAChB0O,EAA8BrN,EAAA,sBAAuCrB,GAE3E,GAAI0O,KAED8oJ,GAAkBntG,GAAemrC,mCAAmC9mF,IAIvE,MAAO,CAACqC,QAAS,KAAqB5P,IAAAA,EAAKI,OAAAA,MAE3C,CAAC,SAAU,YA4GjB,KAAA03E,YAAeroE,IACbxY,KAAKmyD,UAAUnyD,KAAKupF,iBAAiB/wE,EAAOrP,OAAQqP,EAAOzP,KAAMyP,EAAOG,SAAU,IAGpF,KAAAwoE,YAAe3oE,IACbxY,KAAKmyD,UAAUnyD,KAAKupF,iBAAiB/wE,EAAOrP,OAAQqP,EAAOzP,KAAMyP,EAAOG,QAAS,IAGnF,KAAAk3C,cAAgB,KACd,MAAMr3C,EAASxY,KAAKwY,OACpB,IAAI2vC,GAAoB3vC,EAAOrP,OAAQ,CAACqP,EAAOzP,KAAM,QAAQ,KAC3D/I,KAAKwY,OAAS,CAACG,QAAS3Y,KAAKsP,QAAQgH,OACrCtW,KAAKyP,YAIT,KAAAigD,eAAiB,KACf,MAAMl3C,EAASxY,KAAKwY,OACjBA,EAAOzP,KAER,IAAIi/C,GAAa,CACf,CAACxvC,EAAOrP,QAAS,CAACqP,EAAOzP,OACxB,IACM/I,KAAKyP,WAKlB,KAAA4vJ,cAAiB/+J,IACf,MAAM,IAACyI,EAAG,OAAEI,GAAUnJ,KAAKwY,OAC3B,GAAGzP,GAAOA,IAAQ4mC,OAAOC,iBAAkB,CACzC,MAAMjjC,EAAW3M,KAAKkJ,cAAcyD,SAC9BzG,EAAUlG,KAAKupF,iBAAiBpgF,EAAQJ,GAC9C/I,KAAKyP,MAAMnP,GAEVyB,MAAK,KACJ,GAAGgpB,EAAA,YAAqB,CACtB,MAAM7Z,EAAM,UAAuB4gC,IAChC5gC,GACDA,EAAIzB,QAIR,gBAA0B,CACxBtG,OAAQjD,EAAQiD,OAChBkzF,UAAWtzF,EACX9I,KAAM0M,EAAW,kBAAepG,EAChCoG,SAAAA,SAMR,KAAA+tJ,gBAAkB,KAChB,MAAM,OAACvxJ,EAAM,IAAEJ,GAAO/I,KAAKwY,OACrBtS,EAAUlG,KAAKupF,iBAAiBpgF,EAAQJ,GAC9C,GAAG7C,EAAQoQ,MAAMjQ,MACf6V,EAAA,gBAA+BhW,EAAQoQ,MAAMjQ,MAAO,2CAC/C,CACL,IAAIhF,EAAuB,KAEDA,EAAvB6E,EAAQoQ,MAAMya,QAAoB7qB,EAAQoQ,MAAMya,QAAQ1vB,SAC3C6E,EAAQoQ,MAAMjV,SAE3BA,GAEDyW,EAAA,cAA2BzW,EAAU,yCA5KzCrB,KAAK4Y,WAAW7O,UAAY,KAC1B/J,KAAKyP,SAOPzP,KAAKsP,QAAQuuB,QAAUx8B,SAASC,cAAc,OAC9CtB,KAAKsP,QAAQuuB,QAAQt9B,UAAUgB,IAAI24J,wBAGnC,MAAMoF,EAAoB,KACrBH,GACD5wJ,aAAa4wJ,GAGfA,EAAiBhyJ,OAAOC,YAAW,KACjC+xJ,OAAiB54J,EACjBvG,KAAKsP,QAAQuuB,QAAQt9B,UAAUC,OAAO,gBACrC,MAELR,KAAKsP,QAAQuuB,QAAQx9B,iBAAiB,cAAc,KAC9C0qB,EAAA,cAEJ/qB,KAAKsP,QAAQuuB,QAAQt9B,UAAUgB,IAAI,cAEhC49J,IACD5wJ,aAAa4wJ,GACbA,OAAiB54J,GAGnBlF,SAAShB,iBAAiB,WAAYi/J,EAAmB,CAACnkJ,MAAM,QAGxC,IAAI,KAAWnb,KAAKsP,QAAQuuB,SACpC2U,mBAAqB8sH,EAGvCt/J,KAAK25J,SAASr1J,OAAOtE,KAAKsP,QAAQuuB,UAElC,QAAiB79B,KAAK4hB,QAAQ5R,OAAQhQ,KAAK6vD,eAE3C,MAAMjuC,EAAmC,CAAC5hB,KAAKu/J,eAAiB,CAC9D1wJ,KAAM,UACNoS,KAAM,UACNC,QAASlhB,KAAK0vD,gBACb1vD,KAAKw/J,gBAAkB,CACxB3wJ,KAAM,WACNoS,KAAM,+BACNC,QAASlhB,KAAK06J,iBACb16J,KAAKy/J,cAAgB,CACtB5wJ,KAAM,gBACNoS,KAAM,SACNC,QAASlhB,KAAK6vD,gBAGhB7vD,KAAKmlB,iBAAiBvD,GAItB5hB,KAAKogB,eAlFHlX,oBACF,OAAOlJ,KAAK4Y,WAAW1P,cAoFfkX,eACRvgB,MAAMugB,gBACN,QAAiBpgB,KAAK4hB,QAAQmpF,QAAS/qG,KAAK0vD,iBAC5C,QAAiB1vD,KAAK04J,OAAOt3J,UAAWpB,KAAKq/J,eAE7C,MAAMK,EAAkBp/J,IACtB,GAAGA,EAAEkY,kBAAkBk7C,kBAAmB,CACxC,MAAM69F,EAAWjxJ,EAAEkY,OAAuBstD,aAAa,WACvD,IAAIyrF,GAAWA,EAAQhyH,SAAS,mBAC9B,OAUF,OAPA,EAAA7d,EAAA,GAAYphB,GAEZN,KAAKyP,QAAQ1N,MAAK,MAChB,QAAiB/B,KAAKsP,QAAQuuB,QAAS6hI,EAAgB,CAAC9vI,SAAS,IAChEtvB,EAAEkY,OAA6BgoB,YAG3B,KAIX,QAAiBxgC,KAAKsP,QAAQuuB,QAAS6hI,EAAgB,CAAC9vI,SAAS,IAezD25D,iBAAiBpgF,EAAgBJ,GACzC,OAAO/I,KAAKkJ,cAAc6B,YAAc9B,EAAA,4BAA6CE,EAAQJ,GAAOE,EAAA,mBAAoCE,EAAQJ,GA0E1I42J,WAAWz5J,GACjB,MAAM23B,EAAW33B,EAA4BA,QAC7C,IAAIL,EAAO,GACRg4B,IACDh4B,EAAO,iBAA+Bg4B,EAAS,CAC7C+d,SAAW11C,EAA4B6sD,iBAK3CptD,EAAa3F,KAAKsP,QAAQuuB,QAAQhU,kBAAmBhkB,GACrD7F,KAAKsP,QAAQuuB,QAAQt9B,UAAUsD,OAAO,QAASg6B,GAI1C7yB,iBAAiBC,GAGtB,OAFAjL,KAAK4Y,WAAW5N,iBAAiBC,GAE1BjL,KAGImyD,UAAUjsD,EAAoBsS,EAAsB8iJ,EAAY,EAAG10J,GAAU,EACxFwnC,EAA0C,GAAIC,EAA0C,I,yGACxF,GAAGruC,KAAK46J,gBAAiB,OAAO56J,KAAK46J,gBAErC,MAAM7xJ,EAAM7C,EAAQ6C,IACd0E,EAAUvH,EAA4B6hF,WAAa7hF,EAAQuH,OAAUvH,EAA4B6hF,SAAS2lB,UAAYxnG,EAAQuH,OAC9H6I,EAAQrN,EAAA,sBAAuC/C,GAE/C05J,EAAmC,mBAAd15J,EAAQoD,IAA2BL,EAAA,aAA8B/C,GAC5F,CAAClG,KAAK4hB,QAAQmpF,QAAS/qG,KAAKu/J,eAAe5mJ,SAAS5T,SAAQwZ,IAC1DA,EAAOhe,UAAUsD,OAAO,OAAQ+7J,MAGlC5/J,KAAK25J,SAASp5J,UAAUsD,OAAO,cAAe+7J,GAE9C,MAAMC,EAAsBD,EAC5B,CAAC5/J,KAAK4hB,QAAQ8N,SAAU1vB,KAAKw/J,gBAAgB7mJ,SAAS5T,SAAQwZ,IAC5DA,EAAOhe,UAAUsD,OAAO,OAAQg8J,MAGlC,MAAMzzG,EAAmBnjD,EAAA,mBAAoC/C,GAC7D,CAAClG,KAAK4hB,QAAQ5R,OAAQhQ,KAAKy/J,cAAc9mJ,SAAS5T,SAAQwZ,IACxDA,EAAOhe,UAAUsD,OAAO,QAASuoD,MAGnCpsD,KAAK2/J,WAAWz5J,GAChB,MAAMmC,EAAU,EAAMw1J,WAAU,UAACvnJ,EAAOpQ,EAAQ2mB,KAAMpf,EAAQ6tJ,EAAW9iJ,EAAQ5R,EAASwnC,EAAaC,EAAanoC,GAIpH,OAHAlG,KAAKwY,OAAOzP,IAAMA,EAClB/I,KAAKwY,OAAOrP,OAASjD,EAAQiD,OAEtBd,G,+RAGF8rB,0CAA0C7d,GAC/C,MAAmB,UAAZA,EAAMhN,GAAiB,MAA+BgN,EAAM2nC,YCzRxD,MAAM6hH,WAAoEr5J,EAGvF9G,YAAYC,GACVC,MAAM,OAAD,wBACAD,GAAO,CACV0I,SAAU,CAACF,EAAQF,EAAOrB,K,MACxB,GAAG7G,KAAKmJ,OAAO65B,cAAgB96B,EAAO,OAAO1E,QAAQ2E,QAAQ,CAAC3B,MAAO,EAAGmB,MAAO,KAE/E,MAAMmB,GAAQV,MAAAA,OAAM,EAANA,EAAQ8kC,WAAuB,QAAZ,EAAAltC,KAAKsH,eAAO,eAAE4lC,SAC/C,OAAOhxB,EAAA,gBAA+Blc,KAAKmJ,OAAQL,EAAOjC,GAAW9E,MAAKrB,IACxE,MAAMiH,EAAQjH,EAAMgvC,OAAOhlC,KAAIwiC,IACtB,CAACv0B,QAAS,KAAqBu0B,QAAAA,MAGxC,MAAO,CAAC1mC,MAAO9F,EAAM8F,MAAOmB,MAAAA,UAKlC3H,KAAK+G,aAAc,EACnB/G,KAAKmJ,OAASvJ,EAAQuJ,QClBX,MAAM42J,WAA6BvH,GAGhD74J,YAAYwJ,GACVtJ,MAAM,IAAIigK,GAAiB,CAAC32J,OAAAA,IAAU,IAmBxC,KAAA03E,YAAeroE,IACbxY,KAAKmyD,UAAU35C,EAAO00B,QAAS10B,EAAOG,SAAU,IAGlD,KAAAwoE,YAAe3oE,IACbxY,KAAKmyD,UAAU35C,EAAO00B,QAAS10B,EAAOG,QAAS,IAGjD,KAAA+hJ,gBAAkB,KAChBx+I,EAAA,gBAA+BA,EAAA,WAA0Blc,KAAKwY,OAAO00B,SAAU,wCA1B/EltC,KAAKmJ,OAASA,EAEdnJ,KAAKmlB,iBAAiB,CAAC,CACrBtW,KAAM,WACNoS,KAAM,+BACNC,QAASlhB,KAAK06J,mBAShB16J,KAAKogB,eAeM+xC,UAAUjlB,EAA4B10B,EAAsB8iJ,EAAY,EAAGltH,EAAgDC,G,yGACtI,GAAGruC,KAAK46J,gBAAiB,OAAO56J,KAAK46J,gBAErC,MAAMv0J,EAAQ6V,EAAA,WAA0BgxB,GAClChC,EAAM,EAAM2yH,WAAU,UAACx3J,EAAOA,EAAMwmB,KAAM7sB,KAAKmJ,OAAQmyJ,EAAW9iJ,GAAQ,EAAO41B,EAAaC,GAGpG,OAFAruC,KAAKwY,OAAO00B,QAAU7mC,EAAMwK,GAErBq6B,G,2kBClCX,MAAM80H,GAAkB72J,IACtBkT,EAAA,yBAAyClT,GACxCkB,MAAMC,KAAKjJ,SAASmQ,iBAAiB,wBAA0BrI,EAAS,OAA2BpE,SAAQa,IAE1GA,EAAKigC,aAWF,SAAeyI,GACpB91B,EACArP,EACA0nB,EACA3qB,EACAkoC,EACAC,G,0CAEA,IAAIhoC,QAAcu3B,EAAA,qBAA+Bz0B,GACjD,IAAI0nB,MAAiBxqB,EACnB,OAGF,MAAM45J,EAAY,IACH51J,MAAMC,KAAKkO,EAAOhH,iBAAiB,QAAQa,MAAKwc,IAAQA,EAAItuB,UAAUmT,SAAS,WAC9E8E,EAAS,KAGzB,GAAGrP,EAAO65B,YAAa,CACrB,MAAMk9H,IAAeh6J,EACfmD,EAAc,gCACpB,IAAInD,IACFA,QAAgB+C,EAAA,YAA6B,CAC3CE,OAAAA,EACAE,YAAa,CAACC,EAAGD,GACjBP,MAAO,EACPM,MAAO,IACNrH,MAAKrB,GAGCA,EAAMuF,QAAQ,MAGnB4qB,KACF,OAIJ,GAAG3qB,EAAS,CAEWA,EAAQE,OAAOC,MACpBwK,KAAOxK,EAAMwK,KACvBqvJ,IACFh6J,EAAU+C,EAAA,4BAA6CE,EAAQ9C,KAMnE,MAAMq5B,EAAKl6B,GAA4BA,EAAIkF,KAAI+G,IAAM,CACnDkH,QAASlH,EAAGkH,QACZ5P,IAAM0I,EAAG7J,KAAgCmB,IACzCI,OAASsI,EAAG7J,KAAgCuB,WAU9C,YAPA,IAAI8oD,IACHjnD,iBAAiB,CAChB7B,OAAAA,EACAE,YAAa,CAACC,EAAGD,KAElB8oD,UAAUjsD,EAAS+5J,SAAa15J,OAAWA,EAAW6nC,EAAc1O,EAAE0O,QAAe7nC,EAAW8nC,EAAc3O,EAAE2O,QAAe9nC,IAMpI,GAAGF,EAAO,GACJ,EAAAylF,GAAA,GAAS5lF,IAAYA,IACvBG,EAAQ6V,EAAA,WAA0BhW,IAGpC,MAAMw5B,EAAKl6B,GAA4BA,EAAIkF,KAAI+G,IAAM,CACnDkH,QAASlH,EAAGkH,QACZu0B,QAASz7B,EAAG7J,SAGd,IAAIm4J,GAAqB52J,GAAQgpD,UAAU9rD,EAAMwK,GAAIovJ,SAAa15J,EAAW6nC,EAAc1O,EAAE0O,QAAe7nC,EAAW8nC,EAAc3O,EAAE2O,QAAe9nC,OAnF1JsE,EAAA,yBAA2B,gBAAiBm1J,IAC5Cn1J,EAAA,yBAA2B,mBAAoB1B,IACzCkT,EAAA,iBAAiClT,IACnC62J,GAAe72J,MAoFnB,MAAMg3J,GAA6C,IAAI/uJ,IACjDk5C,GAAoB,IAAI5kD,IAEf,MAAMq2B,WAAsB5S,YAA3C,c,oBAOU,KAAAi3I,cAAe,EAEvBl7E,oBAKE,GADAllF,KAAKowC,SAA2C,MAAhCpwC,KAAK8lE,aAAa,UACI,KAAnC9lE,KAAK8lE,aAAa,aAAqB,CACxC9lE,KAAKE,aAAa,YAAa,OAC/B,IAAIq+B,GAAU,GACd,QAAiBv+B,MAAYM,GAAM,mCAEjC,IADA,EAAAohB,EAAA,GAAYphB,GACTi+B,EAAS,OAEZ,MAAMp1B,EAASnJ,KAAKmJ,OACpBo1B,GAAU,QACJ+P,GAAiBtuC,KAAMA,KAAKmJ,QAAQ,IAAMnJ,KAAKmJ,SAAWA,IAChEo1B,GAAU,QAKhB1O,uBAGE,MAAM5qB,EAAMk7J,GAAUzuJ,IAAI1R,KAAKmJ,QAC5BlE,GAAOA,EAAI4E,IAAI7J,QAChBiF,EAAI+K,OAAOhQ,MACPiF,EAAI/D,MACNi/J,GAAUnwJ,OAAOhQ,KAAKmJ,SAIvBnJ,KAAKyuB,eACNzuB,KAAKyuB,cAAcwhB,UAAUjwC,MAItBqgK,gCACT,MAAO,CAAC,OAAQ,SAAU,cAG5BC,yBAAyBx8J,EAAcy8J,EAAkBlrC,GAGvD,GAAY,SAATvxH,EAAiB,CAClB,MAAM08J,GAAanrC,GAAY,IAAIpsG,YAAc,MACjD,GAAGjpB,KAAKmJ,SAAWq3J,EACjB,OAGFxgK,KAAKmJ,OAASiT,EAAA,oBAAkCokJ,IAAcA,EAE9D,MAAM98B,GAAa68B,GAAY,IAAIt3I,YAAc,MACjD,GAAGy6G,EAAW,CACZ,MAAMz+H,EAAMk7J,GAAUzuJ,IAAIgyH,GACvBz+H,IACDA,EAAI+K,OAAOhQ,MACPiF,EAAI/D,MACNi/J,GAAUnwJ,OAAO0zH,IAKvB1jI,KAAK6lC,aACY,eAAT/hC,EACR9D,KAAK0zI,UAAYre,EACA,WAATvxH,IACR9D,KAAKowC,SAAwB,MAAbilF,GAIZ/xG,EAAEm/B,GAAY,GACpB,MAAMl1C,EAAM8O,EAAA,WAA2Brc,KAAMA,KAAKmJ,OAAQnJ,KAAKowC,SAAUpwC,KAAK0zI,UAAWjxF,EAAWziD,KAAKi5I,OACnG5wI,EAAUkF,EAAMA,EAAI9L,YAAc+B,QAAQ2E,UAWhD,OAVGnI,KAAKuuB,eACHhhB,GAAOA,EAAI+O,QACZtc,KAAKuuB,aAAazmB,KAAKO,GAGzBA,EAAQid,SAAQ,KACdtlB,KAAKuuB,kBAAehoB,MAIjBgH,EAGFs4B,SACL,GAAG7lC,KAAKyuB,cAAe,CACrB,IAAI67B,GAAKzgD,IAAI7J,KAAKmJ,QAAS,CACzB,GAAGnJ,KAAKogK,aAAc,OACtBpgK,KAAKogK,cAAe,EAEpB,IAAIn7J,EAAMk7J,GAAUzuJ,IAAI1R,KAAKmJ,QAkB7B,OAjBIlE,IACFA,EAAM,IAAIS,IACVy6J,GAAUl7J,IAAIjF,KAAKmJ,OAAQlE,IAG7BA,EAAI1D,IAAIvB,MAERA,KAAKsjB,GAAE,QAEPtjB,KAAKyuB,cAAc3mB,KAAK,CACtBmpB,IAAKjxB,KACLwB,KAAM,KACJ8oD,GAAK/oD,IAAIvB,KAAKmJ,QACPnJ,KAAK6lC,YAKR7lC,KAAKogK,cACbpgK,KAAKyuB,cAAcwhB,UAAUjwC,MAIjCsqD,GAAK/oD,IAAIvB,KAAKmJ,QAEd,MAAMoE,EAAMvN,KAAKsjB,IACXjb,EAAUkF,EAAMA,EAAI9L,YAAc+B,QAAQ2E,UAE7CnI,KAAKogK,cACN/3J,EAAQid,SAAQ,KACdtlB,KAAKogK,cAAe,KAIxB,MAAMn7J,EAAMk7J,GAAUzuJ,IAAI1R,KAAKmJ,QAC/B,GAAGlE,EAAK,CACNA,EAAI+K,OAAOhQ,MACX,MAAMwF,EAAM6E,MAAMC,KAAKrF,GACvBk7J,GAAUnwJ,OAAOhQ,KAAKmJ,QAGtB,IAAI,IAAI5D,EAAI,EAAG1E,EAAS2E,EAAI3E,OAAQ0E,EAAI1E,IAAU0E,EAChDC,EAAID,GAAGsgC,SAIX,OAAOx9B,GAIX0nB,eAAeC,OAAO,iBAAkB+L,ICzPzB,MAAM0kI,GAArB,cAwEU,KAAAC,eAAiB,KACvB,IAAI5rJ,EAAS7L,EAAA,gBAAiCjJ,KAAK2gK,YAChD7rJ,GACD7L,EAAA,kBAAmC,CAAC6L,EAAO3L,UAAW2L,EAAO8rJ,YAIzD,KAAA5pD,WAAa,KACnB/tG,EAAA,kBAAmCjJ,KAAK2gK,WAAY3gK,KAAKs0E,UAAUrmE,OAAMJ,IACvD,4BAAbA,EAAI5N,OACFD,KAAKs0E,UAAY,EAClBv6C,GAAS,CAACC,YAAa,0BAEvB,IAAI4B,GAAU,0BAA2B,CACvCha,QAAS,CAAC,CACR6X,QAAS,KACTyiC,UAAU,GACT,CACDziC,QAAS,uBACTkD,SAAU,KACR,IAAIq3C,GAAkB,IAAgBrkE,UAG1CysB,mBAAoB,wBACpBG,oBAAqB,EAAC,IAAA3wB,MAAK,QAAS,CAACf,EAAA,6CACpC6X,YAMH,KAAAm+I,cAAgB,KACtB53J,EAAA,iBAAkCjJ,KAAK2gK,YAAY,IAG7C,KAAAr8I,YAAc,KACpB,IAAI07G,GAAUhgI,KAAK2gK,aAGb,KAAAG,cAAgB,KACtB,MAAMhsJ,EAAS7L,EAAA,gBAAiCjJ,KAAK2gK,YACjD7rJ,IAEDA,EAAO0yF,cACRv+F,EAAA,cAA+BjJ,KAAK2gK,WAAY7rJ,EAAOisJ,aACvD93J,EAAA,mBAAoCjJ,KAAK2gK,YAAY,IAErD13J,EAAA,mBAAoCjJ,KAAK2gK,cAIrC,KAAA9wG,cAAgB,KACtB,IAAInpB,GAAkB1mC,KAAK2gK,aAG7B,KAAAjrD,cAAiBp1G,IACZN,KAAK4P,OACN5P,KAAK4P,OACL5P,KAAK4P,KAAO,MAGd,IAAI2wB,EAAkB,KAEtB,IACEA,GAAK,EAAAgF,GAAA,GAAUjlC,EAAEkY,OAAQ,MACzB,MAAMlY,IAER,GAAIigC,EAAJ,CAGA,GADGjgC,aAAa+rB,YAAY/rB,EAAEme,iBAC3Bze,KAAK2Y,QAAQpY,UAAUmT,SAAS,UACjC,OAAO,EAENpT,aAAa+rB,aAAY/rB,EAAEwvD,cAAe,GAE7C9vD,KAAKs0E,SAAW,YAEhBt0E,KAAK2gK,WAAapgI,EAAGvX,QAAQ7f,OAAO8f,WACpCjpB,KAAK8U,OAAS7L,EAAA,gBAAiCjJ,KAAK2gK,YAEpD3gK,KAAK4hB,QAAQ7c,SAAQwZ,IACnB,MAAM4H,EAAO5H,EAAO7F,SAEpB6F,EAAO5F,QAAQpY,UAAUsD,OAAO,QAASsiB,MAI3CnmB,KAAK4hB,QAAQ5hB,KAAK4hB,QAAQ/gB,OAAS,GAAG8X,QAAQ4U,UAAUC,aAAY,IAAA5hB,MAAKwQ,EAAA,sBAAoCpc,KAAK2gK,cAElHpgI,EAAGhgC,UAAUgB,IAAI,cACjB,QAAajB,EAAGN,KAAK2Y,UACrB,QAAY3Y,KAAK2Y,SAAS,KACxB4nB,EAAGhgC,UAAUC,OAAO,aACpBR,KAAK2gK,WAAa3gK,KAAK8U,OAAS9U,KAAKs0E,cAAW/tE,OA7J5CqJ,OACN5P,KAAK4hB,QAAU,CAAC,CACd/S,KAAM,SACNoS,KAAM,eACNC,QAASlhB,KAAK8gK,cACdpoJ,OAAQ,KAAOzP,EAAA,iBAAkCjJ,KAAK8U,SACrD,CACDjG,KAAM,YACNoS,KAAM,aACNC,QAASlhB,KAAK8gK,cACdpoJ,OAAQ,IAAMzP,EAAA,iBAAkCjJ,KAAK8U,SACpD,CACDjG,KAAM,MACNoS,KAAM,uBACNC,QAASlhB,KAAKg3G,WACdt+F,OAAQ,K,MAEN,QADiB1Y,KAAKs0E,SAAW,EAAIrrE,EAAA,2BAA4CjJ,KAAKs0E,UAAUjD,cAAc9xC,SAASv/B,KAAK8U,OAAO3L,QAA8B,QAAlB,EAAAnJ,KAAK8U,OAAOkG,cAAM,eAAEotE,UAGpK,CACDv5E,KAAM,QACNoS,KAAM,yBACNC,QAASlhB,KAAKg3G,WACdt+F,OAAQ,K,MAEN,OADiB1Y,KAAKs0E,SAAW,EAAIrrE,EAAA,2BAA4CjJ,KAAKs0E,UAAUjD,cAAc9xC,SAASv/B,KAAK8U,OAAO3L,WAA8B,QAAlB,EAAAnJ,KAAK8U,OAAOkG,cAAM,eAAEotE,UAGpK,CACDv5E,KAAM,OACNoS,KAAM,wBACNC,QAASlhB,KAAKskB,YACd5L,OAAQ,IACC1Y,KAAK2gK,aAAe91J,EAAA,eAAmBy/B,GAAA,mBAAyCtqC,KAAK8U,OAAO3L,SAEpG,CACD0F,KAAM,SACNoS,KAAM,0BACNC,QAASlhB,KAAK6gK,cACdnoJ,OAAQ,IACC1Y,KAAK2gK,aAAe91J,EAAA,cAAkBy/B,GAAA,mBAAyCtqC,KAAK8U,OAAO3L,SAEnG,CACD0F,KAAM,UACNoS,KAAM,UACNC,QAASlhB,KAAK0gK,eACdhoJ,OAAQ,IAAwB,IAAlB1Y,KAAKs0E,UAAkBt0E,KAAK2gK,aAAe91J,EAAA,cACxD,CACDgE,KAAM,YACNoS,KAAM,YACNC,QAASlhB,KAAK0gK,eACdhoJ,OAAQ,IAAwB,IAAlB1Y,KAAKs0E,UAAkBt0E,KAAK2gK,aAAe91J,EAAA,cACxD,CACDgE,KAAM,gBACNoS,KAAM,SACNC,QAASlhB,KAAK6vD,cACdn3C,OAAQ,KAAM,IAGhB1Y,KAAK2Y,QAAU,GAAW3Y,KAAK4hB,SAC/B5hB,KAAK2Y,QAAQ9H,GAAK,sBAClB7Q,KAAK2Y,QAAQpY,UAAUgB,IAAI,eAC3BF,SAASuzC,eAAe,cAActwC,OAAOtE,KAAK2Y,UCrFtD,IAAYqoJ,GCKAC,IDLZ,SAAYD,GACV,6BACA,+BACA,uBACA,2BAJF,CAAYA,KAAAA,GAAgB,KEgBb,MAAME,GAoBnBvhK,YAAYi/B,GAXJ,KAAAuiI,YAAa,EAEb,KAAAC,YAAa,EACb,KAAAC,UAAW,EACX,KAAAC,UAAW,EA4DX,KAAAC,oBAAsB,KAC5BlkF,GAAA,MAAmB,MAAMt7E,MAAKy/J,IACxBA,IACFA,EAAW,eAGVxhK,KAAKyhK,4BACNlzJ,aAAavO,KAAKyhK,2BAClBzhK,KAAKyhK,0BAA4B,GAGnC,MAAMl6G,EAAS18C,EAAA,yBAA2B,OAAS22J,GAC7CE,EAASn6G,GAAUA,EAAOA,SAAWy5G,GAAiBW,UAEzD3hK,KAAKohK,YAAcM,GACpBxpG,GAAA,uBAGCwpG,IAAW1hK,KAAKmhK,aACjBnhK,KAAKmhK,YAAa,GAGpBnhK,KAAKqhK,SAAW95G,GAAUA,EAAOA,SAAWy5G,GAAiBY,SAC7D5hK,KAAKohK,YAAcM,EACnB1hK,KAAK6hK,QAAUt6G,GAAUA,EAAOs6G,QAChC,OAAS7hK,KAAK0nB,IAAI,aAAc1nB,KAAKohK,YACrCphK,KAAK+6B,eAID,KAAA+mI,cAAgB,CAAC9nI,EAA0Bx1B,KAC9CxE,KAAK+hK,qBAAuB/nI,IAC/Bh6B,KAAK+hK,mBAAqB/nI,GAC1B,EAAAhsB,EAAA,GAAehO,KAAKgiK,UAAU,IAAAp2J,MAAKouB,EAAax1B,IAChDxE,KAAKiiK,gBAAgBnzI,OAAO9uB,KAAKgiK,YAe3B,KAAAjnI,SAAW,KACjB,MAAM1sB,EAAU6yJ,GAA0BgB,mBAC1C,GAAGliK,KAAKohK,WACN,GAAGphK,KAAKqhK,SAAU,CAChB,MAAM72J,EAAIxK,KAAKmiK,KAAK,mCAAmC,IAAM,wBAC7DniK,KAAK8hK,cAAc,4BAA6B,CAACt3J,SAC5C,GAAGxK,KAAKmhK,WACb,QAAoB56J,IAAjBvG,KAAK6hK,QAAuB,CAC7B,MAAMO,EAAY/gK,SAASC,cAAc,QACnCugK,EAAU7hK,KAAK6hK,QACf16E,EAAU,KACd,MAAM7sC,EAAMD,KAAKC,MACjB8nH,EAAUp0I,UAAY,GAAKhrB,KAAKE,OAAO2+J,EAAUvnH,GAAO,KACrDA,EAAMunH,GACPjnH,cAAcmgG,IAGZA,EAAW/pG,YAAYm2C,EAAS,KACtCA,IAEA,MAAM38E,EAAIxK,KAAKmiK,KAAK,8BAA8B,IAAM,+BACxDniK,KAAK8hK,cAAc,+BAAgC,CAACM,EAAW53J,SAE/DxK,KAAK8hK,cAAc,sCAGrB9hK,KAAK8hK,cAAc,iCAEb9hK,KAAKshK,UACbthK,KAAK8hK,cAAc,YAGrB,OAAS9hK,KAAK0nB,IAAI,WAAY1nB,KAAKohK,YAAcphK,KAAKshK,UACtDn0J,OAAOoW,uBAAsB,KACxBvjB,KAAKqiK,iBAAiB9zJ,aAAavO,KAAKqiK,iBAQ3CriK,KAAKqiK,gBAAkBl1J,OAAOC,YANnB,MACT,QAAcpN,KAAKsiK,gBAAiB,WAAYtiK,KAAKohK,YAAcphK,KAAKshK,SAAU,KAClFthK,KAAKqiK,gBAAkB,EACvB,OAASriK,KAAK0nB,IAAI,qBAAsB1nB,KAAKohK,YAAcphK,KAAKshK,YAGrBjzJ,OA/I/CrO,KAAK0nB,KAAM,EAAA2oC,EAAA,IAAO,UAAM9pD,OAAWA,GAEnCvG,KAAKsiK,gBAAkBjhK,SAASC,cAAc,OAC9CtB,KAAKsiK,gBAAgB/hK,UAAUgB,IAAI,qBAEnCvB,KAAKgiK,UAAW,OAAO,kDAAmD,CAAC5yJ,UAAU,IACrFpP,KAAKiiK,gBAAkB,IAAI,KAAqB,CAACj6I,YAAY,IAC7DhoB,KAAKiiK,gBAAgBM,mBAAmB,CAAC/nH,MAAO,cAAe05E,MAAM,IACrEl0H,KAAKsiK,gBAAgBh+J,OAAOtE,KAAKgiK,UAEjCpjI,EAAe16B,QAAQlE,KAAKsiK,iBAE5Bz3J,EAAA,yBAA2B,4BAA6B08C,IACtDz5C,QAAQ4Z,IAAI6/B,GAEZvnD,KAAKuhK,yBAGP12J,EAAA,yBAA2B,uBAAwBqzB,IAC7CA,IACFl+B,KAAKshK,UAAW,EAChB,OAASthK,KAAK0nB,IAAI,WAAY1nB,KAAKshK,UACnCthK,KAAK+6B,eAITlwB,EAAA,yBAA2B,sBAAuBqzB,IAChD,OAASl+B,KAAK0nB,IAAI,qBAAsBwW,GACpCA,IACFl+B,KAAKshK,UAAW,EAChB,OAASthK,KAAK0nB,IAAI,WAAY1nB,KAAKshK,UACnCthK,KAAK+6B,eAIT/6B,KAAKyhK,0BAA4Bt0J,OAAOC,WAAWpN,KAAKuhK,oBAAqBL,GAA0BgB,mBAAqB,KAsDtHC,KAAKnoI,EAA0B2C,GACrC,MAAMnyB,EAAInJ,SAASC,cAAc,KAQjC,OAPAkJ,EAAEjK,UAAUgB,IAAI,mBAChBiJ,EAAElG,QAAO,IAAAsH,MAAKouB,KACd,QAAiBxvB,GAAIlK,KACnB,EAAAohB,EAAA,GAAYphB,GACZq8B,OAGKnyB,GC7II,SAASg4J,GACtBnkH,EACApgC,EACAE,EACAvc,EACAC,EACAg4C,EACA3pB,EACAuqB,GAEA,GAAsB,iBAAb,EACPZ,EAAS,CAAC0wF,GAAI1wF,EAAQ2wF,GAAI3wF,EAAQm3E,GAAIn3E,EAAQ4wF,GAAI5wF,OAC7C,CACL,MAAM4oH,EAAgB,CAACl4B,GAAI,EAAGC,GAAI,EAAGxZ,GAAI,EAAGyZ,GAAI,GAChD,IAAI,MAAM9oF,KAAQ8gH,EAEhB5oH,EAAO8H,GAAQ9H,EAAO8H,IAAS8gH,EAAc9gH,GAIjDtD,EAAI+tF,YACJ/tF,EAAIguF,OAAOpuH,EAAI47B,EAAO0wF,GAAIpsH,GAC1BkgC,EAAIiuF,OAAOruH,EAAIrc,EAAQi4C,EAAO2wF,GAAIrsH,GAClCkgC,EAAIqkH,iBAAiBzkJ,EAAIrc,EAAOuc,EAAGF,EAAIrc,EAAOuc,EAAI07B,EAAO2wF,IACzDnsF,EAAIiuF,OAAOruH,EAAIrc,EAAOuc,EAAItc,EAASg4C,EAAOm3E,IAC1C3yE,EAAIqkH,iBAAiBzkJ,EAAIrc,EAAOuc,EAAItc,EAAQoc,EAAIrc,EAAQi4C,EAAOm3E,GAAI7yG,EAAItc,GACvEw8C,EAAIiuF,OAAOruH,EAAI47B,EAAO4wF,GAAItsH,EAAItc,GAC9Bw8C,EAAIqkH,iBAAiBzkJ,EAAGE,EAAItc,EAAQoc,EAAGE,EAAItc,EAASg4C,EAAO4wF,IAC3DpsF,EAAIiuF,OAAOruH,EAAGE,EAAI07B,EAAO0wF,IACzBlsF,EAAIqkH,iBAAiBzkJ,EAAGE,EAAGF,EAAI47B,EAAO0wF,GAAIpsH,GAC1CkgC,EAAI0uF,YAED78G,GACDmuB,EAAInuB,OAGHuqB,GACD4D,EAAI5D,SDdQ,GAAAynH,mBAAqB,IDZrC,SAAYjB,GACV,sBACA,yBACA,mBACA,mBAJF,CAAYA,KAAAA,GAAc,KGC1B,MAAM0B,GAAMx1J,OAAOk3C,iBACbu+G,GAAO,GAAKD,GACZE,GAAS,IAAMF,GACf,GAAQ,EAAIA,GACZG,GAAS,EAAIH,G,2SCqEnB,MAAMI,WAAyB38G,GAC7BzmD,YACS+L,EACAs3J,EACA17G,GAEPznD,MAAM,CACJqnD,SAAWvuC,GAAY1P,EAAA,gBAAiC0P,EAAQ9H,IAAI7Q,KAAKgjK,UACzE/7G,SAAWtuC,IACTA,EAAQ9D,IAAI+wB,OAAOplC,SACnBR,KAAKsnD,oBAAsBtnD,KAAKsnD,sBAElCd,OAAQ,CAAC7tC,EAASxS,KAChB,MAAMqhD,EAAmB7uC,EAAQ9D,IAAI+wB,OAAO3hC,gBAAkBjE,KAAK0L,KACnEs6C,GAAuBrtC,EAAQ9D,IAAI+wB,OAAQ5lC,KAAK0L,KAAMvF,GAEnDqhD,GACDxnD,KAAKsnD,oBAAsBtnD,KAAKsnD,sBAGpCP,gBAAiB,CAACD,EAAMF,KACtB,MAAMr4B,EAA+Bq4B,EAAQ,QAAKrgD,GAE5C,IAACsO,GAAOouJ,GAAkBC,cAAc,CAACpuJ,OAAQgyC,EAAKj2C,GAAI0d,aAAAA,EAAc40I,QAASv8G,IAUvF,OATCE,EAAsBjyC,IAAMA,GAE1B0Z,MAAAA,OAAY,EAAZA,EAAc1tB,UACdimD,EAAsBv4B,aAAeA,EACtC/qB,QAAQC,IAAI8qB,GAAcjJ,SAAQ,YACxBwhC,EAAsBv4B,iBAI3Bu4B,GAETT,kBAAmB,QAjCd,KAAA36C,KAAAA,EACA,KAAAs3J,SAAAA,EACA,KAAA17G,mBAAAA,EAmCFz7C,QACL7L,KAAK0L,KAAK5F,UAAY,GACtBjG,MAAMgM,SAOH,MAAMu3J,GAsDXzjK,cArDQ,KAAAi/B,eAAiBv9B,SAASuzC,eAAe,sBAKzC,KAAA3R,OAAqB,KAErB,KAAAvb,KAAM,EAAA2oC,EAAA,IAAO,UAAW,KAAA21E,IAAe,WAAiB,UAAgB,YAExE,KAAAc,YAAc,IAAI25B,GAGnB,KAAA4C,YAAsD,GACtD,KAAAC,YAAgD,GAE/C,KAAAC,QAA8E,CACpFt1E,KAAM5sF,SAASuzC,eAAe,gBAC9B4uH,oBAAqB,KACrBpiK,UAAWC,SAASuzC,eAAe,sBAE7B,KAAAq/B,gBAOJ,GAMI,KAAAwvF,mBAAuC,IAAI/9J,IAE3C,KAAAg+J,QAAyC,CAAC9qI,IAAK,EAAGhY,OAAQ,GAO1D,KAAA+iJ,iBAAkB,EAGlB,KAAAC,0BAA2B,EA8e5B,KAAAC,YAAc,KACnB7jK,KAAKijC,OAASjjC,KAAKsjK,YAAYtjK,KAAKs0E,UACpCt0E,KAAKijC,OAAO57B,UAAUuxB,KAAM,EAC5B54B,KAAKijC,OAAO57B,UAAUuZ,QAAS,EAC/B5gB,KAAK0jK,QAAQ9qI,IAAM54B,KAAK0jK,QAAQ9iJ,OAAS,EACzC5gB,KAAK8jK,wBAAqBv9J,EAC1BvG,KAAKk7E,WAAal7E,KAAKqjK,YAAYrjK,KAAKs0E,UACxCt0E,KAAK+jK,iBAybC,KAAAC,oBAAsB,KAC5B,IAAIhkK,KAAK4jK,yBACP,OAKF,GAFA5jK,KAAKikK,2BAEFjkK,KAAKs0E,SAAW,EAAG,OAEtB,MAAMiG,EAAWv6E,KAAKu6E,SAChB/zE,EAAQ+zE,EAASxuE,kBAEjB2gB,EAAQ6tD,EAASt2E,cAAcA,cAC/B2c,EAAS25D,EAASt2E,cAAc44B,mBAChCqnI,IAAgBtjJ,EAAO7U,kBAC7B,GAAGvF,GAAS,GAKV,YAJG09J,GACDlkK,KAAKmkK,6BAIF,GAAGD,EAAa,OAEvBx3I,EAAMnsB,UAAUgB,IAAI,iBAEpB,MAAM0R,EAAU,IAAIC,GAAe,CACjCpP,KAAM,WACNg6B,aAAa,EACb6+C,uBAAuB,IAGzB1pE,EAAQ7R,UAAUb,UAAUgB,IAAI,QAEhC0T,EAAA,0BAAmC1O,OAAWA,EAAW,UAAUxE,MAAKigC,IACtE,IAAIsgF,GAAQ,EACZ,MAAMh7D,EAAqB,KACtBg7D,GACDrvG,EAAQ7R,UAAUb,UAAUsD,OAAO,QAASq2E,EAAexuE,KAAKK,mBAGlE/L,KAAKokK,sBAAqB,IAGtBlqF,EAAiB,IAAI7yB,GAAe,CACxC15C,WAAY,GACZ85C,sBAAuB,CACrBqzB,WAAY,GACZpmE,KAAK,GAEPlJ,YAAY,EACZ87C,mBAAAA,IAGFtnD,KAAKqkK,aAAe,KAClB,MAAM9iI,EAAYC,GAAA,SAAoB,GAAK,EAC/BQ,EAAS17B,OAAO,EAAGi7B,GAAWz3B,OAAO9J,KAAKskK,yBAElDv/J,SAASoE,IACX+wE,EAAe34E,IAAI4H,MAGjB64B,EAASnhC,SACXb,KAAKqkK,kBAAe99J,IAIxBvG,KAAKqkK,eAELrkK,KAAKukK,eAAkBp7J,IACrB,GAAGA,EAAO65B,YACR,OAGF,MAAM7c,EAAOnmB,KAAKskK,wBAAwBn7J,GACpCq7J,EAAQtqF,EAAerwE,IAAIV,IAC7Bq7J,GAASr+I,EAAM+zD,EAAe34E,IAAI4H,GAC9Bq7J,IAAUr+I,GAAM+zD,EAAelqE,OAAO7G,IAGhD,MAAMuC,EAAOwuE,EAAexuE,KAC5BA,EAAKnL,UAAUgB,IAAI,gBACnBvB,KAAKykK,qBAAqB/4J,GAC1BuH,EAAQ3D,QAAQhL,OAAOoH,GAEvB42G,GAAQ,EACRh7D,OAGF1mC,EAAOtc,OAAO2O,EAAQ7R,YAGhB,KAAAkjK,wBAA2Bn7J,GAC1BA,EAAO8wE,cAAgBhxE,EAAA,gBAAiCE,GAG1D,KAAAu7J,qBAAuB,KAGzB1kK,KAAK2kK,cAAcp2J,aAAavO,KAAK2kK,cACxC3kK,KAAK2kK,aAAex3J,OAAOC,YAAW,KACpCpN,KAAK2kK,kBAAep+J,EAEhBvG,KAAKu6E,SAASxuE,oBAAqB/L,KAAKukK,iBAY5C,UAAoB,KAEpB,MAAMK,EAAOC,YAAYvqH,MAEnBwqH,EAAe9kK,KAAKijC,OAAO+K,UAE3BnkB,EAAoB7pB,KAAKu6E,SAAS1wD,kBAClCk7I,EAAgB/kK,KAAKijC,OAAO7hC,UAAUqe,wBACtCulJ,EAAan7I,EAAkBpK,wBAC/BmR,EAAWvmB,MAAMC,KAAKtK,KAAKijC,OAAOpD,QAAQjP,UAIhD,IAAIghC,EAAY5xD,KAAKijC,OAAOpD,QAAQ+xB,UACjCA,GAAakzG,EAAelzG,IAAWA,GAAakzG,GAEvD,MAAMG,EAASF,EAAc5mJ,EAAIyzC,EAC3B2tE,EAAQwlC,EAAc5mJ,EAEtB+mJ,GAAe,EAAA3/H,GAAA,GAAUlkC,SAASyoF,iBAAiB9mF,KAAKmsC,KAAK61H,EAAW/mJ,GAAIjb,KAAKmsC,KAAK81H,EAAS,IAAKp7I,EAAkB2mB,SACtH20H,GAAc,EAAA5/H,GAAA,GAAUlkC,SAASyoF,iBAAiB9mF,KAAKmsC,KAAK61H,EAAW/mJ,GAAIjb,KAAKykB,MAAM83G,EAAQwlC,EAAcljK,OAAS,IAAKgoB,EAAkB2mB,SAIlJ,IAAI00H,IAAiBC,EACnB,OAKF,MACMC,EADmBF,EAAazlJ,wBACGtB,EAAI8mJ,EAEvChyG,EAAwB,GACxB/I,EAAat5B,EAAS3Q,QAAQilJ,GAC9B/6G,EAAYv5B,EAAS3Q,QAAQklJ,GAI7BE,EAAiB,GAAAnvJ,UAAY,GAAK0a,EAAShwB,MAAM,EAAGoC,KAAKH,IAAI,EAAGqnD,EAFnD,KAGbo7G,EAAe10I,EAAShwB,MAAMupD,EAHjB,IAiBhBk7G,EAAexkK,SAChBb,KAAKijC,OAAO57B,UAAUuxB,KAAM,GAG3B0sI,EAAazkK,SACdb,KAAKijC,OAAO57B,UAAUuZ,QAAS,GAGjCqyC,EAAOnrD,QAAQu9J,GACfpyG,EAAOnrD,QAAQw9J,GAEfryG,EAAOluD,SAAQ0M,IACb,MAAMtI,EAASsI,EAAGuX,QAAQ7f,OAAO8f,WACjCjpB,KAAKulK,aAAap8J,MAGpBnJ,KAAKwlK,aAQLxlK,KAAKijC,OAAO+K,UAAYk3H,EAAatzG,UAAYwzG,EAEjDplK,KAAK0nB,IAAI,aAAcm9I,YAAYvqH,MAAQsqH,QAM1C,MAiBE,KAAAa,iBAAmB,IACjBzlK,KAAK+jK,cAAc,OAGrB,KAAAA,cAAgB,CAACpiH,EAAmB,WACtC3hD,KAAKijC,OAAO57B,UAAUs6C,IACpB3hD,KAAKqkK,cACNrkK,KAAKqkK,eAGA7gK,QAAQ2E,WACPnI,KAAK8jK,mBAA2B9jK,KAAK8jK,oBAE/C9jK,KAAK0nB,IAAI,gBAAiBi6B,GACnB3hD,KAAK0lK,YAAY/jH,IA5oCxB3hD,KAAK2lK,gBAAiB,QAAa,MAAM,GAEzC3lK,KAAK4lK,eAAiB5lK,KAAKujK,QAAQt1E,KAAK18E,cAAc,UAEtDvR,KAAKujK,QAAQC,oBAAsBxjK,KAAKujK,QAAQt1E,KAAKhqF,cAErDjE,KAAKsnD,mBAAqBrtB,GAASj6B,KAAKgkK,oBAAqB,KAAK,GAAO,GAEzE,MAAM6B,EAAaxkK,SAASC,cAAc,OAC1CukK,EAAWtlK,UAAUgB,IAAI,4BACzBskK,EAAWvhK,OAAOtE,KAAKujK,QAAQniK,WAwB5B,GAAAwb,oBACDmrC,GAAe,CACbpvC,QAAS3Y,KAAKujK,QAAQniK,UACtB2rC,QAAUL,IACR,MAAMykB,EAASthD,EAAUshD,SACzBthD,EAAU68B,EAAQ,EAAIykB,EAAS,EAAIA,EAAS,MAKlDnxD,KAAK8lK,oBAAsB,IAAI,sBAAiB,CAC9C31J,IAAK,wBAEPnQ,KAAK+lK,YAAY,GACjB/lK,KAAKgmK,UAAU,CACbn1J,GAAI7Q,KAAKs0E,SACTjlE,MAAO,GACP0d,QAAS/sB,KAAK8lK,oBAAoBntJ,QAClC47D,WAAY,IAGdv0E,KAAKk7E,WAAal7E,KAAKqjK,YAAYrjK,KAAKs0E,UACxCt0E,KAAKijC,OAASjjC,KAAKsjK,YAAYtjK,KAAKs0E,UAkBpCzpE,EAAA,yBAA2B,iBAAiB,KAE1CwuB,EAAA,mBAA2Bt3B,MAAMu3B,IAC/Bt5B,KAAK4jK,0BAA2B,EAEhC3uJ,EAAA,UACAnB,EAAA,UAEA,MACMoiD,EADiBjtD,EAAA,iBACQitD,QAC/B,IAAI,MAAMoe,KAAYpe,EACpBrrD,EAAA,sBAAwB,qBAAsB,CAC5CvB,EAAG,qBACHuH,IAAKyjE,IAITrrE,EAAA,UAUAjJ,KAAKk7E,WAAWrvE,QAChB7L,KAAK6jK,cACL7jK,KAAKimK,cAAc3sI,SAIvB,MAAM4sI,EAAoB,IAAI,KAAYlmK,KAAKujK,QAAQC,qBACvDqC,EAAW3hK,QAAQlE,KAAKujK,QAAQC,qBAChC,MAAM3zJ,GAAY,EAAA0hD,EAAA,GAAevxD,KAAKujK,QAAQt1E,KAAMjuF,KAAKujK,QAAQniK,WAAW,CAACyP,EAAI2gD,KAK/E3gD,GAAM2gD,EAAWxoC,QAAQsrD,UAAY,EAEjC,GAAA3nB,mBACC97C,EACG7Q,KAAKmmK,wBACPnmK,KAAKmmK,sBAAwB,CAC3BlmK,KAAM,UACN4R,MAAO,KACLhC,EAAU,GACV7P,KAAKmmK,2BAAwB5/J,IAIjCoK,EAAA,cAAoC3Q,KAAKmmK,wBAEnCnmK,KAAKmmK,wBACbx1J,EAAA,aAAmC3Q,KAAKmmK,uBACxCnmK,KAAKmmK,2BAAwB5/J,IAI9BvG,KAAKs0E,WAAazjE,IAErB7Q,KAAKqjK,YAAYxyJ,GAAIhF,QACrB7L,KAAK+lK,YAAYl1J,GACjB7Q,KAAK6jK,kBACJ,KACD,IAAI,MAAM35J,KAAYlK,KAAKqjK,aACrBn5J,IAAalK,KAAKs0E,UACpBt0E,KAAKqjK,YAAYn5J,GAAU2B,eAG9BtF,EAAW2/J,GAGblmK,KAAKujK,QAAQt1E,KAAKpkE,kBAAkC2W,QACrDv3B,EAAA,cACAowB,EAAA,mBAA2Bt3B,MAAMu3B,GACxBt5B,KAAKimK,cAAc3sI,KAkB5BvO,EAAA,oBAA4B,UAAU,KACpC/qB,KAAKomK,8BAGP,IAAIlF,GAA0BlhK,KAAK4+B,gBACnC5+B,KAAK4+B,eAAet6B,OAAOuhK,GAE3Bz4J,YAAW,KACTs3C,GAAA,wBACC,KAGM61B,eACT,OAAOv6E,KAAKk7E,WAAWxvE,KAGlBq6J,YAAYzxF,GACjBt0E,KAAKs0E,SAAWA,EAChBt0E,KAAKgjK,SAAW/5J,EAAA,iBAAoCA,EAAA,mCAAoDjJ,KAAKs0E,UAAY,QACzHzpE,EAAA,iBAAqBypE,EAGf+xF,gBAAgB1tJ,EAAsB+oJ,GAC5C,MAAMp2J,EAAY,YACZg7J,EAAe3tJ,EAAQpY,UAAUmT,SAASpI,IAC/Cg7J,GAAgB5E,GAAU/oJ,EAAQpY,UAAUgB,IAAI+J,IACjD,QAAcqN,EAAS,aAAc+oJ,EAAQ,IAAKA,OAASn7J,EAAY,KACrEoS,EAAQpY,UAAUC,OAAO8K,IACxBo2J,IAAW4E,EAAe,EAAI,GAG3BC,gBACN17J,EAAA,yBAA2B,eAAgB+J,I,MAGzC,MAAMzL,EAASyL,EAAOqU,WAChBpU,EAAM7U,KAAKwmK,aAAar9J,GAC9B,GAAG0L,IAAQI,EAAA,QAAsBL,IAAWzL,IAAW0B,EAAA,aAAgB,CACrE,MACM62J,EAA4B,sBAAR,QAAX,EADFzsJ,EAAA,UAAwBL,GACjB2yC,cAAM,eAAEj+C,GAC5BtJ,KAAKqmK,gBAAgBxxJ,EAAIinB,SAAU4lI,OAIvC72J,EAAA,yBAA2B,eAAgBsJ,IACzC,MAAMhL,EAASgL,EAAO8U,UAAS,GACzBnU,EAAS7L,EAAA,gBAAiCE,GAC7C2L,GACD9U,KAAKymK,2BAA2B3xJ,MAapCjK,EAAA,yBAA2B,iBAAkBupE,IAC3Cp0E,KAAK0mK,qBAAqBtyF,EAAOvjE,OAGnChG,EAAA,yBAA2B,mBAAoB+J,IAC7C5U,KAAKukK,gBAAkBvkK,KAAKukK,eAAe3vJ,EAAOqU,eAGpDpe,EAAA,yBAA2B,gBAAgB,EAAE1B,OAAAA,MAC3C,MAAM2L,EAAS7L,EAAA,gBAAiCE,GAC7C2L,IACD9U,KAAK2mK,eAAe7xJ,OAAQvO,OAAWA,OAAWA,OAAWA,OAAWA,GAAW,GACnFvG,KAAK4mK,wBAAwB9xJ,GAC7B9U,KAAK6mK,4BAITh8J,EAAA,yBAA2B,uBAAwBw2B,IACjD,IAAI,MAAMl4B,KAAUk4B,EAAS,CAC3B,MAAMvsB,EAASusB,EAAQl4B,GACvBnJ,KAAK8mK,aAAahyJ,GAEf9U,KAAKukK,gBACNvkK,KAAKukK,eAAep7J,EAAO8f,YAG7BjpB,KAAK4mK,wBAAwB9xJ,OAIjCjK,EAAA,yBAA2B,eAAe,EAAE1B,OAAAA,MAC1CnJ,KAAKulK,aAAap8J,GAEfnJ,KAAKukK,gBACNvkK,KAAKukK,eAAep7J,MAIxB0B,EAAA,yBAA2B,iBAAiB,EAAE1B,OAAAA,MAC5C,MAAM2L,EAAS7L,EAAA,gBAAiCE,GAC7C2L,IACD9U,KAAK+mK,kBAAkBjyJ,GACvB9U,KAAK4mK,wBAAwB9xJ,OAIjCjK,EAAA,yBAA2B,0BAA2BiK,IACpD9U,KAAK4mK,wBAAwB9xJ,GAC7B9U,KAAK+mK,kBAAkBjyJ,GACvB9U,KAAK6mK,2BAGPh8J,EAAA,yBAA2B,gBAAgB,EAAEiK,OAAAA,EAAQkiJ,KAAAA,EAAM7tJ,OAAAA,MACtD6tJ,EACDh3J,KAAKk7E,WAAWlrE,OAAO7G,GAEvBnJ,KAAK8mK,aAAahyJ,GAGjB9U,KAAKukK,gBACNvkK,KAAKukK,eAAep7J,MAIxB0B,EAAA,yBAA2B,gBAAiB1B,IAE1C,IAAI,MAAMwP,KAAW3Y,KAAKyjK,mBACrB9qJ,EAAQqQ,QAAQ7f,OAAO8f,aAAe9f,GACvCnJ,KAAKgnK,gBAAgBruJ,GAAS,GAIjBtO,MAAMC,KAAKjJ,SAASmQ,iBAAiB,0CAA0CrI,QACvFpE,SAAQ4T,IACf3Y,KAAKgnK,gBAAgBruJ,GAAS,SAKlC9N,EAAA,yBAA2B,iBAAkBf,IAC3C,GAAI9J,KAAKi0E,gBAAgBnqE,EAAO+G,IAAhC,CAGO,GAAG/G,EAAO+G,KAAO7Q,KAAKs0E,SAAU,CACrC,MAAMjzC,EAAUp4B,EAAA,mCAAmD,GACnEjJ,KAAKinK,wBACL,IAAI,IAAI1hK,EAAI,EAAG1E,EAASwgC,EAAQxgC,OAAQ0E,EAAI1E,IAAU0E,EAAG,CACvD,MAAMuP,EAASusB,EAAQ97B,GACvBvF,KAAK8mK,aAAahyJ,IAIL9U,KAAKi0E,gBAAgBnqE,EAAO+G,IACpCxB,MAAMvJ,UAAY,kBAAgCgE,EAAOuF,YAZhErP,KAAKgmK,UAAUl8J,MAenBe,EAAA,yBAA2B,iBAAkBf,IAC3C,MAAMgf,EAAW9oB,KAAKi0E,gBAAgBnqE,EAAO+G,IACzCiY,IAIH9oB,KAAKujK,QAAQt1E,KAAKpkE,kBAAkC2W,QAErD1X,EAAS1nB,UAAUZ,SACnBsoB,EAASmlE,KAAKztF,gBAEPR,KAAKqjK,YAAYv5J,EAAO+G,WACxB7Q,KAAKsjK,YAAYx5J,EAAO+G,WACxB7Q,KAAKi0E,gBAAgBnqE,EAAO+G,IAEnC7Q,KAAKknK,4BAGPr8J,EAAA,yBAA2B,gBAAiBgqE,IAC1C,MAAMsyF,EAAoBnnK,KAAKujK,QAAQt1E,KACvCpZ,EAAM9vE,SAASuvE,IACb,MAAMxqE,EAASb,EAAA,2BAA4CqrE,GACrD8yF,EAAiBpnK,KAAKi0E,gBAAgBK,GAEzBt0E,KAAKqjK,YAAY/uF,GACzB0uF,SAAW/5J,EAAA,mCAAoDqrE,GAE1EtuB,GAAuBohH,EAAen5E,KAAMk5E,EAAmBr9J,EAAOyqE,YACtEvuB,GAAuBohH,EAAehmK,UAAWpB,KAAKujK,QAAQniK,UAAW0I,EAAOyqE,eAGlFv0E,KAAKgjK,SAAW/5J,EAAA,mCAAoDjJ,KAAKs0E,aAQ3EzpE,EAAA,yBAA2B,gBAAgB,EAAE1B,OAAAA,EAAQ8pJ,QAAAA,MACnD,MAAMn+I,EAAS7L,EAAA,gBAAiCE,GAC5C2L,IAEDm+I,EAAQpyJ,OACTb,KAAK0wF,UAAU57E,GAEf9U,KAAKqnK,YAAYvyJ,OAKfkyJ,gBAAgBphI,EAAqB2P,GAE3C,MAAM1gC,EAAM+wB,EAAO0hI,UACnB1hI,EAAOrlC,UAAUsD,OAAO,SAAU0xC,GAC/BA,EACDv1C,KAAKyjK,mBAAmBliK,IAAIqkC,GAE5B5lC,KAAKyjK,mBAAmBzzJ,OAAO41B,IAG9B/wB,MAAAA,OAAG,EAAHA,EAAK0yJ,WACN1yJ,EAAI0yJ,SAASz7J,UAAUypC,GAIb0wH,cAAc3sI,G,0CAC1B,GAAGA,EAAM+7C,eACP,IAAI,MAAMllE,KAAOmpB,EAAM+7C,gBACrB,EAAArzB,GAAA,GAAmD7xC,GACnDm6B,GAAA,mBAAyC,CACvCn6B,IAAAA,EACAqwD,SAAUlnC,EAAM+7C,eAAellE,KAKrCm6B,GAAA,8BAEItqC,KAAK2jK,kBACP3jK,KAAKumK,gBACLvmK,KAAK2jK,iBAAkB,GAGzB,MAAM6D,EAAuBv+J,EAAA,oCAAqDlH,MAAMm0D,IACtF,IAAI,MAAMpsD,KAAUosD,EAClBl2D,KAAKgmK,UAAUl8J,MAenB,OAXGwvB,EAAM48B,SAAWx7C,OAAOgzC,KAAKp0B,EAAM48B,SAASr1D,eACvC2mK,EACHxnK,KAAKynK,2BACAznK,KAAKynK,qBAIZpuI,EAAA,wCACDynC,GAAA,qBAGK9gE,KAAK+jK,gBAAgBhiK,MAAK,KAC/BkH,EAAA,4BAgBIy+J,eAAe/lH,GACrB,MAAO,CAACx6C,MAAOnH,KAAKijC,OAAO57B,UAAUs6C,GAAQ,EAAI3hD,KAAK0jK,QAAQ/hH,IAGxDgmH,yBAAyB7yJ,GAC/B,QAAyBvO,IAAtBuO,EAAO8yJ,aAA6B5nK,KAAK6nK,oBAAoB/yJ,GAAS,OAAO,EAEhF,MAAMgzJ,EAAY9nK,KAAK0nK,eAAe,OAChCK,EAAe/nK,KAAK0nK,eAAe,UAEzC,IAAII,EAAU3gK,QAAU4gK,EAAa5gK,MACnC,OAAO,EAGT,MAAMA,EAAQ2N,EAAO9U,KAAKgjK,UAC1B,QAAS8E,EAAU3gK,OAASA,GAAS2gK,EAAU3gK,UAAY4gK,EAAa5gK,OAASA,GAAS4gK,EAAa5gK,OAGjGo+J,aAAap8J,GACnBnJ,KAAKk7E,WAAWlrE,OAAO7G,GAGjB29J,aAAahyJ,GACnB,IAAG9U,KAAK2nK,yBAAyB7yJ,GAO/B,YADA9U,KAAKulK,aAAazwJ,EAAO3L,QALzB,IAAInJ,KAAKk7E,WAAWrxE,IAAIiL,EAAO3L,QAE7B,YADAnJ,KAAKk7E,WAAW35E,IAAIuT,EAAO3L,QAQ/B,MAAM0L,EAAM7U,KAAKwmK,aAAa1xJ,EAAO3L,QAClC0L,IACD7U,KAAK2mK,eAAe7xJ,OAAQvO,EAAWsO,OAAKtO,OAAWA,OAAWA,GAAW,GAC7EvG,KAAKk7E,WAAWr1C,OAAO/wB,EAAO3L,SAc1Bu9J,qBAAqBpyF,G,MAC3B,MAAM0zF,EAA0B,IAAb1zF,EAAiBt0E,KAAK4lK,eAA+C,QAA9B,EAAA5lK,KAAKi0E,gBAAgBK,UAAS,eAAE01B,OAC1F,IAAIg+D,EACF,OAGF,MAAM5zF,EAASnrE,EAAA,2BAA4CqrE,GACrD2zF,EAA4B,IAAb3zF,KAAoBF,EAAO/yC,QAAQhvB,MAAKyC,IACnDA,EAAO0yF,cAAgB1yF,EAAOkG,OAAO8tF,eAAiBx+D,GAAA,mBAAyCx1B,EAAO3L,QAAQ,KAGxH6+J,EAAWznK,UAAUsD,OAAO,cAAeokK,GAE3C,MAAMxzI,EAAM2/C,EAAO4J,mBACnBgqF,EAAWh6I,UAAYyG,EAAM,GAAKA,EAAM,GAGlCoyI,wBACN,IAAI,MAAMvyF,KAAYt0E,KAAKi0E,gBACzBj0E,KAAK0mK,sBAAsBpyF,GAOvB2yF,wBACN,MAAMn9J,EAASb,EAAA,2BAA4CjJ,KAAKs0E,WAAa,KAC7Et0E,KAAKk7E,WAAWv0B,SAAS5hD,SAAS4T,IAChC,MAAM7D,EAAS7L,EAAA,gBAAiC0P,EAAQ9H,IACpD7Q,KAAK6nK,oBAAoB/yJ,EAAQhL,IACnC9J,KAAKulK,aAAa5sJ,EAAQ9H,OAQxB+1J,wBAAwB9xJ,EAAgBhL,GAC1C9J,KAAKwmK,aAAa1xJ,EAAO3L,UAIzBnJ,KAAK6nK,oBAAoB/yJ,EAAQhL,IACnC9J,KAAKulK,aAAazwJ,EAAO3L,SAItB0+J,oBAAoB/yJ,EAAgBhL,EAASb,EAAA,2BAA4CjJ,KAAKs0E,WACnG,SAAIx/D,GACDhL,IAAWb,EAAA,qCAAsD6L,EAAQhL,KACxEA,GAAU9J,KAAKs0E,WAAax/D,EAAO8rJ,WAOlCsH,mBAAmBx8J,EAAwB4oE,GAChD,MAAM1nE,EAAa,IAAI,KAAW,KAAM,KAAM,KAC9CA,EAAWxL,UAAUf,iBAAiB,SAAUL,KAAK0kK,sBACrD93J,EAAWxL,UAAU4nB,QAAQsrD,SAAW,GAAKA,EAC7C1nE,EAAW23F,cAAgBvkG,KAAKylK,iBAChC74J,EAAWK,iBAAmBjN,KAAK+jK,cACnCn3J,EAAWE,oBAAoBpB,GAE/B,MAAMy8J,EAAmB,IAAIpF,GAC3Br3J,EACAzC,EAAA,iBAAoCA,EAAA,mCAAoDqrE,GAAY,QACpGt0E,KAAKsnD,oBASP,OANAtnD,KAAKsjK,YAAYhvF,GAAY1nE,EAC7B5M,KAAKqjK,YAAY/uF,GAAY6zF,EAKtBv7J,EAGDo5J,UAAUl8J,GAChB,GAAG9J,KAAKi0E,gBAAgBnqE,EAAO+G,IAAK,OAEpC,MAAMmgD,EAAU3vD,SAASC,cAAc,OACvC0vD,EAAQzwD,UAAUgB,IAAI,4BACtB,MAAM0vD,EAAO5vD,SAASC,cAAc,QAC9BqzD,EAAYtzD,SAASC,cAAc,QACzCqzD,EAAUp0D,UAAUgB,IAAI,cACrBuI,EAAOijB,QAAS4nC,EAAUrwD,OAAOwF,EAAOijB,SACtC4nC,EAAU7uD,UAAY,kBAAgCgE,EAAOuF,OAClE,MAAM24J,EAAa3mK,SAASC,cAAc,OAC1C0mK,EAAWznK,UAAUgB,IAAI,QAAS,WAAY,iBAC9C,MAAMgE,EAAIlE,SAASC,cAAc,KACjC2vD,EAAK3sD,OAAOqwD,EAAWqzG,EAAYziK,IACnC,EAAA8b,GAAAA,QAAO2vC,GACPA,EAAQ1sD,OAAO2sD,GAGfjL,GAAuBgL,EADGhxD,KAAKujK,QAAQt1E,KACYnkF,EAAOyqE,YAG1D,MAAMX,EAAK5zE,KAAKooK,iBACVx7J,EAAa5M,KAAKkoK,mBAAmBt0F,EAAI9pE,EAAO+G,IAEtDjE,EAAWxL,UAAUb,UAAUgB,IAAI,WAAY,kBAK/C,MAAMq3B,EAAMv3B,SAASC,cAAc,OACnCs3B,EAAIr4B,UAAUgB,IAAI,gBAElB,MAAMqf,EAASvf,SAASC,cAAc,OACtCsf,EAAOrgB,UAAUgB,IAAI,mBAErBq3B,EAAIt0B,OAAOsvE,GACXhnE,EAAWxL,UAAUkD,OAAOs0B,EAAKhY,GAIjC,MAAMqQ,EAAMrkB,EAAWxL,UAEvB4kD,GAAuBp5C,EAAWxL,UAAWpB,KAAKujK,QAAQniK,UAAW0I,EAAOyqE,YAE5Ev0E,KAAKykK,qBAAqB7wF,EAAI,MAAM,GAEpC5zE,KAAKi0E,gBAAgBnqE,EAAO+G,IAAM,CAChCo9E,KAAMj9B,EACN5vD,UAAW6vB,EACX+4E,OAAQg+D,EACR34J,MAAOslD,GAGT30D,KAAKknK,wBAGCd,2BACN,MAAMx5J,EAAa5M,KAAKujK,QAAQC,oBAAoB35I,kBAC9C1Z,EAAmBvD,EAAWuoC,YAAcvoC,EAAWy7J,YAAc,sBAAwB,iBACnGroK,KAAK8lK,oBAAoBzuF,iBAAiB,CAAClnE,IAAAA,IAGrC+2J,wBAyBN,OAxBIlnK,KAAKynK,qBACPznK,KAAKynK,mBAAqB,IAAIjkK,SAAe2E,IAC3CgF,OAAOC,YAAW,KAChB,MACMsV,EADShI,OAAOgzC,KAAK1tD,KAAKi0E,iBAAiBpzE,OAC3B,EAChBynK,GAActoK,KAAKujK,QAAQC,oBAAoBjjK,UAAUmT,SAAS,QAErEgP,IAAS4lJ,IACVtoK,KAAKujK,QAAQC,oBAAoBjjK,UAAUsD,OAAO,QAAS6e,GACxDA,IAAS4lJ,GACVtoK,KAAK6mK,wBAGP7mK,KAAK4+B,eAAer+B,UAAUsD,OAAO,cAAe6e,IAGtD1iB,KAAKomK,2BAELpmK,KAAKynK,wBAAqBlhK,EAC1B4B,MACC,OAIAnI,KAAKynK,mBAGN/B,YAAY/jH,GAKlB,GAAG3hD,KAAK8jK,mBAAqC,OAAO9jK,KAAK8jK,mBAEzD,MAAMz7J,EAAU,IAAI7E,SAAoB2E,GAAY,mCAClD,MAAM,SAACoyE,EAAQ,SAAEjG,EAAQ,SAAE0uF,GAAYhjK,KAKvC,IAAI6G,EAAY26B,GAAA,SAAoB,GAAK,KAAO,EAC5C1C,EAAc,EAElB,MAAO33B,MAAOohK,GAAsBvoK,KAAK0nK,eAAe/lH,GACxD,GAAG4mH,EACD,GAAY,QAAT5mH,EAAgB,CACjB,MAAM72C,EAAU7B,EAAA,kCAAmDqrE,GAAU,GACvEntE,EAAQ2D,EAAQgO,WAAUhE,GAAUA,EAAOkuJ,IAAauF,IACxDC,EAAYxlK,KAAKH,IAAI,EAAGsE,EAAQN,GACtCA,EAAYM,EAAQqhK,EACpB1pI,EAAch0B,EAAQ09J,GAAWxF,GAAY,OAE7ClkI,EAAcypI,EAMlB,IAGE,MAAME,EAAyBx/J,EAAA,mBAAoC,GAAI61B,EAAaj4B,EAAWytE,GAAU,GACrGm0F,EAAuBnsJ,QAAWi+D,EAASxuE,mBAC3BwuE,EAASt2E,cACjBK,OAAOtE,KAAK2lK,gBAGxB,MAAMp9J,QAAekgK,EAAuBpgK,QAE5C,GAAGrI,KAAK8jK,qBAAuBz7J,EAC7B,OAmBF,GAVY,WAATs5C,EACEp5C,EAAOw5B,QACR/hC,KAAKijC,OAAO57B,UAAUs6C,IAAQ,GAExBp5C,EAAOmgK,WACf1oK,KAAKijC,OAAO57B,UAAUs6C,IAAQ,GAGhC3hD,KAAK4jK,0BAA2B,EAE7Br7J,EAAO84B,QAAQxgC,OAAQ,CACxB,MAAMwgC,EAAmB,QAATsgB,EAAiBp5C,EAAO84B,QAAQzgC,QAAQgG,UAAY2B,EAAO84B,QAErE9S,EAA+B,GAE/Bo6I,EAA4B,GAC5BC,EAAQjsI,IACZgsI,EAAU7gK,KAAK60B,IAGjB0E,EAAQt8B,SAAS+P,IAGf,IADwB7L,EAAA,gBAAiC6L,EAAO3L,QAE9D,OAGF,MAAMwP,EAAU3Y,KAAKk7E,WAAW35E,IAAIuT,EAAO3L,QAAQ,EAAMy/J,GAAM,GAC5DjwJ,EAAQ4V,cACTA,EAAazmB,QAAQ6Q,EAAQ4V,uBAI3B/qB,QAAQC,IAAI8qB,GAAcjJ,UAEhCqjJ,EAAU5jK,SAAQ43B,GAAYA,WAE9B38B,KAAKsnD,qBAGP,MAAMuhH,EAAetgK,EAAO84B,QAAiB,QAATsgB,EAAiB,EAAIp5C,EAAO84B,QAAQxgC,OAAS,GAC9EgoK,IACD7oK,KAAK0jK,QAAQ/hH,GAAQknH,EAAa7F,IAGpChjK,KAAK0nB,IAAIw2G,MAAM,cAAgBr3H,EAAY,sBAAuBi4B,EAAav2B,EAAQgyE,EAASxuE,mBAEhGqB,YAAW,KACTpN,KAAKijC,OAAOwD,aACX,GACH,MAAM54B,GACN7N,KAAK0nB,IAAI3Z,MAAMF,GAGd7N,KAAK2lK,eAAe1hK,eACrBjE,KAAK2lK,eAAenlK,SAGtB2H,SACCmd,SAAQ,KACTtlB,KAAK8jK,wBAAqBv9J,KAG5B,OAAOvG,KAAK8jK,mBAAqBz7J,EAG3BygK,yBAAyBlpK,GAM/B,MAAMwtC,EAAa,oBACbhsC,EAAYC,SAASC,cAAc,OACzCF,EAAUb,UAAUgB,IAAI6rC,EAAYA,EAAa,IAAMxtC,EAAQmpK,eAE/D,MAAM75J,EAAS7N,SAASC,cAAc,OACtC4N,EAAO3O,UAAUgB,IAAI6rC,EAAa,YAClC,IAAA1T,OAAMxqB,EAAQtP,EAAQyP,OAEtB,MAAM+gB,EAAW/uB,SAASC,cAAc,OAQxC,OAPA8uB,EAAS7vB,UAAUgB,IAAI6rC,EAAa,aACjCxtC,EAAQwwB,WACT,IAAAsJ,OAAMtJ,EAAUxwB,EAAQwwB,SAAUxwB,EAAQopK,cAG5C5nK,EAAUkD,OAAO4K,EAAQkhB,GAElB,CAAChvB,UAAAA,EAAW8N,OAAAA,EAAQkhB,SAAAA,GAGrB6zI,2BACN,GAAqB,IAAlBjkK,KAAKs0E,SACN,OAGF,MAAMiG,EAAWv6E,KAAKu6E,SAChBynB,EAAOznB,EAASt2E,cACtB,IAAIglK,EAAwB5+J,MAAMC,KAAK03F,EAAKpxE,UAA4Bve,MAAKZ,GAAMA,EAAGiX,QAAQ,wBAC9F,MAAM4tG,EAAkBt2H,KAAKijC,OAAO57B,UAAUuZ,SAAW25D,EAASxuE,kBAGlE,GAAGuqH,GAAmB2yC,EACpB,OACK,IAAI3yC,EAMT,YALG2yC,IACDjnE,EAAKzhG,UAAUC,OAAO,oBACtByoK,EAAqBzoK,WAMzB,IAAI2N,EAAwElO,EAC5E,GAAID,KAAKs0E,SAyBF,CACLnmE,EAAcnO,KAAK8oK,yBAAyB,CAC1Cz5J,MAAO,yBACP+gB,SAAU,6BACV24I,cAAe9oK,EAAO,WAGxBgpK,EAAuB96J,EAAY/M,UAEnC6nK,EAAqB/kK,QhM4wBpB,UAA0B,MAACw+C,EAAK,MAAE9gD,EAAK,OAAEC,IAO9C,MAAMT,EAAYC,SAASC,cAAc,OAEnCuW,EAAM8rC,GAAA,0BAA2CjB,GAiBvD,OAhBG7qC,EACDmZ,GAAY,CACVnZ,IAAAA,EACAoZ,IAAK7vB,EACLM,MAAM,EACNgB,MAAM,EACNd,MAAAA,EACAC,OAAAA,EACA6gD,MAAAA,IACC3gD,MAAK,SAIRX,EAAUb,UAAUgB,IAAI,yBAGnB,CAACH,UAAAA,GgMtyByB8nK,CAAiB,CAC5CxmH,MAAO,KACP9gD,MAAO,IACPC,OAAQ,MACPT,WAEH,MAAMmd,GAAS,OAAO,kDAAmD,CACvE0C,KAAM,mBACNpS,KAAM,cAGR,QAAiB0P,GAAQ,KACvB,IAAIo0D,GAAiB,IAAgBhjE,KAAK1G,EAAA,2BAA4CjJ,KAAKs0E,cAG7F20F,EAAqB3kK,OAAOia,OAjDX,CACjBpQ,EAAcnO,KAAK8oK,yBAAyB,CAC1Cz5J,MAAO,uCACP05J,cAAe9oK,EAAO,YAGxBgpK,EAAuB96J,EAAY/M,UAEnC,MAAMytB,EAAMxtB,SAASC,cAAc,OACnCutB,EAAItuB,UAAUgB,IAAI,kCAElBvB,KAAKmpK,gCAAkC,IAAI,sBAAiB,CAC1DxwJ,QAASxK,EAAYiiB,WAGvB5sB,QAAQC,IAAI,CACVzD,KAAKokK,sBAAqB,IAC1B,EAAAxkH,GAAA,IAA0B/wB,EAAK,8BAC/B,aACC9sB,MAAK,EAAEqnK,MACRH,EAAqB1oK,UAAUgB,IAAI,WACnCygG,EAAKzhG,UAAUsD,OAAO,iBAAkBulK,MAG1CH,EAAqB/kK,QAAQ2qB,GA4B/BmzE,EAAK19F,OAAO2kK,GACZjnE,EAAKzhG,UAAUgB,IAAI,oBACnBygG,EAAKh5E,QAAQqgJ,gBAAkBppK,EAGzBmkK,qBAAqBkF,GAC3B,OAAGtpK,KAAKupK,4BAAoCvpK,KAAKupK,4BAC1CvpK,KAAKupK,4BAA8Bt0J,EAAA,gBAA8BlT,MAAKi2D,IAC3E,MAAM5nC,EAAWpwB,KAAKmpK,gCACtB,GAAG/4I,EAAU,CACX,IAAIjgB,EAAkB3L,EAEnBwzD,EAAMn3D,QACPsP,EAAM,0CACN3L,EAAO,EAAC,IAAAoH,MAAK,iBAAkB,CAACosD,EAAMn3D,YAEtCsP,EAAM,oDACN3L,EAAO,IAGT4rB,EAASinD,iBAAiB,CACxBlnE,IAAAA,EACA3L,KAAAA,IAYJ,OARG8kK,GACgBtpK,KAAKu6E,SACAt2E,cACjB1D,UAAUsD,OAAO,iBAAkBm0D,EAAMn3D,QAGhDb,KAAKupK,iCAA8BhjK,EAE5ByxD,EAAMn3D,UAITsjK,4BACN,MAAM5pF,EAAWv6E,KAAKu6E,SAChB7tD,EAAQ6tD,EAASt2E,cAAcA,cAC/B2c,EAAS25D,EAASt2E,cAAc44B,mBACtCnQ,EAAMnsB,UAAUC,OAAO,iBACvBogB,EAAO9a,UAAY,GACnB9F,KAAKqkK,kBAAe99J,EACpBvG,KAAKukK,oBAAiBh+J,EA8MhBi/J,aACN,MAAMjrF,EAAWv6E,KAAKu6E,SAChBivF,EAAcxpK,KAAKypK,qBAAqBlvF,EAAS1wD,mBACjD6/I,EAAa1pK,KAAKypK,qBAAqBlvF,EAASxjC,kBAEhDisH,EAAWhjK,KAAKgjK,SACtBhjK,KAAK0jK,QAAQ9qI,IAAM4wI,EAAYxG,GAC/BhjK,KAAK0jK,QAAQ9iJ,OAAS8oJ,EAAW1G,GAG3ByG,qBAAqB9wJ,GAC3B,OAAO1P,EAAA,gBAAiC0P,EAAQqQ,QAAQ7f,OAAO8f,YAoB1Dw7I,qBAAqB/4J,EAAwBD,EAAsBk+J,GAAc,EAAOn+J,GAAa,EAAOo+J,GAAY,GAC7H,IAAIC,EAEJ,MAAMC,GAAeF,EAAY,gBAA4B,YAAsBphK,KAAK,IAExFkD,EAAKsd,QAAQxd,WAAa,KAAMA,EAChCE,EAAKrL,iBAAiB,aAAcC,IAClC,GAAgB,IAAbA,EAAEie,OAAc,OAGnBve,KAAK0nB,IAAI,sBACT,MAAMlP,EAASlY,EAAEkY,OACX5S,GAAO,EAAA2/B,GAAA,GAAU/sB,EAAQ,MAE/B,GAAI5S,EAAJ,CAIA,GAAG4F,EAAY,CACb,MAAMu+J,EAAcF,IAA0BjkK,EAC3CikK,IAA0BE,GAC3BF,EAAsBtpK,UAAUC,OAAO,UAGtCoF,IACDA,EAAKrF,UAAUgB,IAAI,UACnBsoK,EAAwBjkK,EACxB5F,KAAKyjK,mBAAmBliK,IAAIqE,IAIhC,GAAGA,EAAM,CACJ6F,GAASA,IAEZ,MAAMtC,EAASvD,EAAKojB,QAAQ7f,OAAO8f,WAC7BozE,GAAaz2F,EAAKojB,QAAQjgB,UAAOxC,EAEvCujK,EAAY,CACV3gK,OAAAA,EAAQkzF,UAAAA,SAGVytE,OAED,CAACl6I,SAAS,IAEV,OACDlkB,EAAKrL,iBAAiB,YAAaC,IACjC,MAAMigC,GAAK,EAAAgF,GAAA,GAAUjlC,EAAEkY,OAAQ,MAC/B,GAAG+nB,EAAI,CACL,MAAMp3B,EAASo3B,EAAGvX,QAAQ7f,OAAO8f,WACjCjpB,KAAK0nB,IAAI,gBAAiBze,EAAA,oBAAqCE,QAKlEwgK,IACD,QAA0Bj+J,EAAM1L,KAAK8mI,YAAYpxB,eAI9C0yD,eAAexoK,EAMlB,IACF,MAAM8L,EAAOrK,SAASC,cAAc,MAgBpC,OAfAoK,EAAKnL,UAAUgB,IAAI,YAGhB3B,EAAQ8U,KACThJ,EAAKnL,UAAUgB,IAAI,gBAGlB3B,EAAQk7E,YACTpvE,EAAKnL,UAAUgB,IAAI,YAAc3B,EAAQk7E,YAOpCpvE,EAGFi7J,eACL7xJ,EACAk1J,EACAn1J,EACAo1J,EACA17I,EACA40I,GAAU,EACV+G,GAAY,GAGZ,IAAIr1J,KACFA,EAAM7U,KAAKwmK,aAAa1xJ,EAAO3L,SAI7B,OAIJ,IAAIghK,EASJ,GARIH,IACCl1J,EAAOm6G,OAA4B,iBAAnBn6G,EAAOm6G,MAAM3lH,IAC9B6gK,EAAer1J,EAAOm6G,OAGxB+6C,EAAc/gK,EAAA,mBAAoC6L,EAAO3L,OAAQ2L,EAAOisJ,cAGrD,iBAAlBiJ,EAAY1gK,EASb,OARAuL,EAAIG,gBAAgBlP,UAAY,GAChC+O,EAAIu1J,aAAatkK,UAAY,UACtB+O,EAAI+wB,OAAO5c,QAAQjgB,SAEvBmhK,GACDlqK,KAAK+mK,kBAAkBjyJ,EAAQD,EAAKsuJ,IAMxC,MAAMh6J,EAAS2L,EAAO3L,OAChB29F,EAAekjE,GAAe/gK,EAAA,eAAgC+gK,GAKH,CAE/D,IAAI9sD,EACJ,IAAI8sD,EAAY/pI,UAAYkqI,IAAiBrjE,EAAc,CACzD,MAAMxwF,EAA8BrN,EAAA,sBAAuC+gK,GAC3E,GAAG1zJ,IAAsB,UAAZA,EAAMhN,GAAkB,CAAC,QAAS,OAAgCi2B,SAASjpB,EAAMrW,OAAQ,CACpG,MAAMiB,EAAOgb,EAAA,kBAAiC5F,EAAO,GAAI,IAEzD,GAAc,mBAAXpV,EAAKoI,IACN4zG,EAAiB77G,SAASC,cAAc,OACxC47G,EAAe38G,UAAUgB,IAAI,yBAE7B6sB,GAAU,CACR/nB,MAAOiQ,EACPpQ,QAAS8jK,EACT5oK,UAAW87G,EACX1uF,kBAAkB,EAClBttB,KAAAA,EACAqtB,aAAAA,IAGgC,UAA9BjY,EAAqBrW,MAAkB,CACzC,MAAMoqK,EAAWhpK,SAASC,cAAc,QACxC+oK,EAAS9pK,UAAUgB,IAAI,cAEvB27G,EAAe54G,OAAO+lK,KAM9B,MAAMC,IAAqBptD,MAAoB8sD,MAAAA,OAAW,EAAXA,EAAa9jK,SAE5D,IAAIg2B,EAkBJ,GAhBEA,EADC+tI,GAAiBD,EAAY9jK,QACnB+C,EAAA,sBAAuC+gK,OAAazjK,OAAWA,GAAW,EAAO0jK,EAAeK,GACnGH,EACGlhK,EAAA,sBAAuCkhK,GACzCH,EAAY/pI,QAGV5+B,SAAS86B,yBAFTlzB,EAAA,sBAAuC+gK,OAAazjK,OAAWA,GAAW,OAAOA,EAAW+jK,GAKtGptD,GACDhhF,EAASh4B,QAAQg5G,IAGnB,EAAAlvG,EAAA,GAAe6G,EAAIG,gBAAiBknB,GAGjCiuI,EAAc,CACf,MAAMj2C,EAAO7yH,SAASC,cAAc,KACpC4yH,EAAK3zH,UAAUgB,IAAI,UACnB2yH,EAAK5vH,QAAO,IAAAsH,MAAK,SAAU,MAC3BiJ,EAAIG,gBAAgB9Q,QAAQgwH,QACvB,GAAG/qH,EAAO65B,aAAe75B,IAAW6gK,EAAYv8J,SAAWu8J,EAAY5jK,OAAQ,CACpF,MAAMmkK,EAASnuJ,EAAA,UAAwB4tJ,EAAYv8J,QACnD,GAAG88J,GAAUA,EAAO15J,GAAI,CACtB,MAAM25J,EAAanpK,SAASC,cAAc,KAEvCipK,EAAO15J,KAAOhG,EAAA,aACf2/J,EAAWlmK,QAAO,IAAAsH,MAAK,YAGvB4+J,EAAWlmK,OAAO,IAAI,KAAU,CAC9B6E,OAAQ6gK,EAAYv8J,OACpB+nD,eAAe,IACd78C,SAGL6xJ,EAAWlmK,OAAO,MAElBuQ,EAAIG,gBAAgB9Q,QAAQsmK,KAKlC,IAAIR,EAAY/pI,SAAWkqI,EAAwD,CACjF,MAAMt9I,EAAOs9I,EAAennK,KAAKH,IAAIsnK,EAAat9I,KAAMm9I,EAAYn9I,MAAQ,GAAKm9I,EAAYn9I,MAC7F,EAAA7e,EAAA,GAAe6G,EAAIu1J,cAAc,SAA8B,IAAI/vH,KAAY,IAAPxtB,UACnEhY,EAAIu1J,aAAat5I,YAAc,GAErB,OAAdo5I,IACEA,EACDlqK,KAAK+mK,kBAAkBjyJ,EAAQD,EAAKsuJ,GAEpCtuJ,EAAI+wB,OAAO5c,QAAQjgB,IAAMihK,EAAYjhK,KAKnCg+J,kBAAkBjyJ,EAAgBD,EAAM7U,KAAKwmK,aAAa1xJ,EAAO3L,QAASg6J,GAAU,G,MAC1F,IAAItuJ,EAEF,OAGF,IAAIsuJ,EAAS,CACX,MAAMvmB,EAAUtyG,GAAA,mBAAyCx1B,EAAO3L,QAAQ,GAErEyzI,IADc/nI,EAAI+wB,OAAOrlC,UAAUmT,SAAS,cAE7C,QAAcmB,EAAI+wB,OAAQ,WAAYg3G,EAAS,KAInD,IAAI6tB,EACJ,GAAuB,kBAAR,QAAZ,EAAA31J,EAAOm6G,aAAK,eAAE3lH,GAAsB,CACrC,MAAM0gK,EAAyB/gK,EAAA,mBAAoC6L,EAAO3L,OAAQ2L,EAAOisJ,cACrFiJ,EAAY/pI,SAAW+pI,EAAYhvJ,OAAOiP,KAAO+/I,EAAY7gK,SAAW0B,EAAA,eAC1E4/J,EAAmBT,IJliDpB,SACL5oK,EACA8E,EACAwkK,GAEA,IAAIp/J,EAWJ,IAVGpF,MAAAA,OAAO,EAAPA,EAAS8U,OAAOiP,OAEf3e,EADCpF,EAAQ8U,OAAO0O,YACJ,UACJxjB,EAAQ8U,OAAOgvF,OACX,QAEA,WAIZ1+F,EAEF,YADAlK,EAAU0vB,YAAc,IAI1B,MAAM+hH,EAAgB,SAAWvnI,EAC3B65J,EAAc/jK,EAAU21C,iBAC9B,GAAGouH,GAAeA,EAAY5kK,UAAUmT,SAASm/H,GAC/C,OAGF,MAAMl6H,EAAUtX,SAASC,cAAc,KACvCqX,EAAQpY,UAAUgB,IAAI,sBAAgDsxI,GACtEzxI,EAAUkD,OAAOqU,GAEdwsJ,GACDA,EAAY3kK,SIsgDZmqK,CAAiB91J,EAAI+1J,WAAYH,GAEjC,MAAM3gK,EAASb,EAAA,2BAA4CjJ,KAAKs0E,UAChE,IAAImgE,EAEFA,EADC3qI,GAC2D,IAAjDA,EAAOunE,cAAcpxD,QAAQnL,EAAO3L,UAElC2L,EAAOkG,OAAOotE,OAG7B,MAAMyiF,EAAiB5hK,EAAA,iBAAkC6L,GACnDg2J,EAAiBr2B,GAAYo2B,EAG7BE,GAAuB,EAAAxsH,GAAA,GAAQ1pC,EAAIm2J,aACtCF,IAAmBC,GACpBl2J,EAAI0b,WAAWjsB,OAAOuQ,EAAIm2J,aAG5B,MAAMC,EAAmBn2J,EAAOs8G,wBAA0Bt8G,EAAOs8G,sBAAwB,GAAKt8G,EAAO0yF,aAAe,GAC9G0jE,EAAwBr2J,EAAIs2J,gBAAiB,EAAA5sH,GAAA,GAAQ1pC,EAAIs2J,eAC5DF,IACGp2J,EAAIs2J,gBACNt2J,EAAIs2J,cAAgB9pK,SAASC,cAAc,OAC3CuT,EAAIs2J,cAAc7/J,UAAY,6DAC9BuJ,EAAIs2J,cAAcn9I,UAAY,IAC9BnZ,EAAI0b,WAAWpsB,aAAa0Q,EAAIs2J,cAAet2J,EAAIG,gBAAgB3Q,eAIvE,MAAM+mK,EAAqBjI,EAAU,EAAI,IAazC,IAXA,QAActuJ,EAAIm2J,YAAa,aAAcF,EAAgBM,EAAoBN,OAAiBvkK,EAAY,KAC5GsO,EAAIm2J,YAAYxqK,UACduqK,EAA2B,EAAJ,GAExBl2J,EAAIs2J,gBACL,QAAct2J,EAAIs2J,cAAe,aAAcF,EAAkBG,EAAoBH,OAAmB1kK,EAAY,KAClHsO,EAAIs2J,cAAc3qK,gBACXqU,EAAIs2J,eACTD,EAA4B,EAAJ,IAG1BJ,EACF,OAGCr2B,EACD5/H,EAAIm2J,YAAYzqK,UAAUgB,IAAI,oBAAqB,SAEnDsT,EAAIm2J,YAAYzqK,UAAUC,OAAO,oBAAqB,SAGxD,IAAIimF,GAAW,EAAM4kF,GAAY,EAC9Bv2J,EAAOs8G,uBAAiD,IAAxBt8G,EAAO0yF,cACxC3yF,EAAIm2J,YAAYh9I,UAAY,IAC5Bq9I,GAAY,GAEJR,EAERh2J,EAAIm2J,YAAYh9I,UAAY,IAAMlZ,EAAO0yF,cAAgB,MAEzD3yF,EAAIm2J,YAAYh9I,UAAY,GAC5By4D,GAAW,GAGb5xE,EAAIm2J,YAAYzqK,UAAUsD,OAAO,SAAU4iF,GAC3C5xE,EAAIm2J,YAAYzqK,UAAUsD,OAAO,UAAWwnK,GAGtC7E,aAAar9J,GAEnB,MAAMwP,EAAU3Y,KAAKk7E,WAAWxpE,IAAIvI,GACpC,OAAOwP,MAAAA,OAAO,EAAPA,EAAS9D,IAGVy2J,UAAUx2J,GAChB,GAAsB,iBAAb,EAAuB,CAC9B,MAAMy2J,EAAiBtiK,EAAA,gBAAiC6L,GACxD,IAAIy2J,EAAgB,CAClB,MAAMpiK,EAAS2L,GAAU,MACzB,MAAO,CACL3L,OAAAA,EACAw8B,KAAMvpB,EAAA,gBAA8BjT,GACpC6R,OAAQ,IAIZ,OAAOuwJ,EAGT,OAAOz2J,EAGD02J,cAAc32J,EAAgBoO,GACpC,IAAI,SAACskJ,EAAQ,OAAE3hI,GAAU/wB,EACzB,IAAI0yJ,GAAYtkJ,EAAS,CACvB,MAAM,OAAC5f,EAAM,eAAEooK,GAAkB52J,EAAI0yJ,SAAWA,ED3oDvC,SAA6BvyE,GAAW,GACrD,MAAM3xF,EAAShC,SAASC,cAAc,UACtC+B,EAAOzB,MAAQyB,EAAOxB,OAAS+gK,GAC/B,MAAM33J,EAAU5H,EAAOqP,WAAW,MAG5Bg5J,GAAW9I,IAZJ,EAWgB,GAAQ,EAAeC,KACb,EAEjC8I,EAAYtxH,KAAKC,MACvB,IAAIsxH,GAAa,EAEjB,MAAMt4B,EAAc,KAClB,GAAIjwI,EAAOysB,YAIA87I,IACTA,EAAavoK,EAAOysB,kBAJpB,GAAG87I,EACD,OAAO,EAMX,MAKMvmJ,GE/C6B/S,GF0CtB+nC,KAAKC,MAKqBqxH,GA3B1B,KEnBR,IAAU3oK,KAAKmiE,IAAIniE,KAAK+2C,GAAKznC,EFmBrB,KEnB8B,GF8CmB,GE/CnD,IAAwBA,EFiDnCrH,EAAQ0H,UAAU,EAAG,EAAGiwJ,GAAMA,IAC9B33J,EAAQ+6D,UAAYgvB,IAAajqE,EAAA,YAAsB,eAA6B,iBAAmB,OAEvG,IAAI,IAAIxlB,EAAI,EAAGA,EApCJ,IAoCkBA,EAAG,CAG9B,IAAIsmK,EAEFA,EADCxmJ,GAAY,GACE9f,EAAI,EAAI,EAAe,EAAX8f,EAAiC,GAAjBA,EAAW,IAEvC9f,EAAI,EAAe,EAAX8f,EAAe,EAAe,EAAXA,EAG5C,IAAIxjB,EA5CS,EA4C6B,EAAfgqK,EAK3BhqK,GAAU8gK,GAGVH,GAAUv3J,EAjBAygK,EAAWnmK,EAAI,GAAUA,EAAIs9J,IAe5BD,GAAO/gK,GAAU,EAEH,GAAOA,EAAQihK,IAAQ,GAGlD,OAAO,GAGT,MAAO,CACLz/J,OAAAA,EACAooK,eAAgB,MACd,SAAQn4B,GACRA,KAEFxnI,UAAYypC,IACVy/C,EAAWz/C,EACX+9F,MC6kD2Dw4B,CAAoBlmI,EAAOrlC,UAAUmT,SAAS,WACzGrQ,EAAO9C,UAAUgB,IAAI,0BACrBqkC,EAAOthC,OAAOjB,GACdooK,IAGElE,IAIJ,QAAc1yJ,EAAI0yJ,SAASlkK,OAAQ,aAAc4f,EAAS,IAAKA,OAAU1c,EAAY,KACnFsO,EAAI0yJ,SAASlkK,OAAO7C,SACpBqU,EAAI0yJ,cAAWhhK,GACd0c,EAAU,EAAI,GAGZigJ,cAActjK,GACnB,MAAMkV,EAAS9U,KAAKsrK,UAAU1rK,EAAQkV,QAEtClV,EAAQ4L,YAAa,EAErB,MAAM0/B,EAAMlrC,KAAK+rK,aAAansK,GAE9B,GAAGsrC,EAAK,CACN,MAAM,OAAC/hC,GAAU2L,EACDw1B,GAAA,mBAAyCnhC,GAAQ,IAE/D+hC,EAAIr2B,IAAI+wB,OAAOrlC,UAAUgB,IAAI,YAG3B4H,EAAO+4B,UACTliC,KAAKymK,2BAA2B3xJ,EAAQo2B,EAAIr2B,KAG9C7U,KAAK2mK,eAAe7xJ,OAAQvO,EAAW2kC,EAAIr2B,SAAKtO,EAAW3G,EAAQ2uB,aAAc3uB,EAAQujK,SAAS,GAGpG,OAAOj4H,EAGDu7H,2BAA2B3xJ,EAAgBD,GACjD,IAAI,GACF,OAIF,GADIA,IAAKA,EAAM7U,KAAKwmK,aAAa1xJ,EAAO3L,UACpC0L,EAAK,OAET,MAAMwoB,EAAiCvpB,EAAA,UAAwBgB,EAAO3L,OAAOoyB,YAC7Ev7B,KAAKwrK,cAAc32J,KAAQwoB,EAAKriB,OAAOgmH,cAAe3jG,EAAKriB,OAAOgxJ,iBAM7DC,2BAA2BrsK,GAKhC,MAAM,OAACuJ,EAAM,QAAEjD,EAAO,MAAEuG,GAAS7M,EAC3BsrC,EAAM+3H,GAAkB8I,aAAa,OAAD,sCACrCnsK,GACAqJ,EAAA,+BAAgD/C,IAAQ,CAC3D4O,OAAQ9U,KAAKsrK,UAAUniK,MASzB,OANAnJ,KAAK2mK,eAAez7H,EAAIp2B,OAAQ5O,EAASglC,EAAIr2B,IAAKpI,GAE/CvG,EAAQiD,SAAWA,IACpB+hC,EAAIr2B,IAAI+wB,OAAO5c,QAAQ7f,OAAS,GAAKjD,EAAQiD,QAGxC+hC,EAGF6gI,aAAansK,GAclB,OAAOI,KAAKksK,UAAUtsK,EAAQkV,OAAQlV,EAAQwB,UAAWxB,EAAQ8N,WAAY9N,EAAQmV,cAAenV,EAAQ41D,cAAe51D,EAAQgO,UAAWhO,EAAQ0E,OAAQ1E,EAAQ+N,WAAY/N,EAAQ4L,WAAY5L,EAAQ6uB,cAAe7uB,EAAQ2uB,aAAc3uB,EAAQusK,UAGtPD,UACLE,EACAhrK,EACAsM,GAAa,EACbqH,GAAgB,EAChBygD,GAAgB,EAChB5nD,GAAY,EACZtJ,GAAS,EACTqJ,EAAa,GACbnC,IAAepK,EACfqtB,EACAF,EACA49I,G,UAEA,MAAMr3J,EAAS9U,KAAKsrK,UAAUc,GACxBjjK,EAAS2L,EAAO3L,OAEhB2yB,EAAW,IAAIC,GACrBD,EAASvN,aAAeA,EACxBuN,EAASrN,cAAgBA,EACzBqN,EAAS57B,aAAa,SAAU0N,EAAY,IAAM,UAClCrH,IAAb4lK,GAAwBrwI,EAAS57B,aAAa,aAAcisK,GAC/DrwI,EAAS57B,aAAa,OAAQ,GAAKiJ,GACnC2yB,EAASv7B,UAAUgB,IAAI,gBAAiB,UAAYoM,GAEjDD,GAAcvE,IAAW0B,EAAA,cAAkB1B,EAAO+4B,UAE7B,sBAAR,QAAX,EADUjtB,EAAA,UAAwB9L,GAC7Bo+C,cAAM,eAAEj+C,IACdtJ,KAAKqmK,gBAAgBvqI,GAAU,GAInC,MAAMuwI,EAAahrK,SAASC,cAAc,OAC1C+qK,EAAW9rK,UAAUgB,IAAI,gBAEzB,MAAM+qK,EAAqBjrK,SAASC,cAAc,QAClDgrK,EAAmB/rK,UAAUgB,IAAI,cAEjC,MAAMmyI,EAAY,IAAI,KAAU,CAC9BvqI,OAAAA,EACAgjK,SAAAA,EACAr3J,OAAQlH,EACR4nD,cAAAA,EACA11D,WAAW,IAGbwsK,EAAmBhoK,OAAOovI,EAAU/6H,SAOlC2zJ,EAAmB/rK,UAAUgB,IAAI,SAEjC,MAAMokC,EAAOvpB,EAAA,UAAwBjT,IACtB,QAAZ,EAAAw8B,MAAAA,OAAI,EAAJA,EAAM3qB,cAAM,eAAEu2B,WACf+6H,EAAmBhoK,OAAOgnC,MAI9B,MAAM2lB,EAAO5vD,SAASC,cAAc,QACpC2vD,EAAK1wD,UAAUgB,IAAI,qBACnB0vD,EAAK/wD,aAAa,MAAO,QAKzB,MAAMqgC,EAAKl/B,SAASC,cAAc,MAClCi/B,EAAGhgC,UAAUgB,IAAI,iBACdwT,IACD,EAAAsM,GAAAA,QAAOkf,GAGTA,EAAGj8B,OAAOw3B,EAAUuwI,GACpB9rI,EAAGvX,QAAQ7f,OAAS,GAAKA,EAEzB,MAAMyhK,EAAavpK,SAASC,cAAc,QAC1CspK,EAAWrqK,UAAUgB,IAAI,iBAAkB,kBAE3C,MAAM6oK,EAAe/oK,SAASC,cAAc,QAC5C8oK,EAAa7pK,UAAUgB,IAAI,gBAE3B,MAAMypK,EAAc3pK,SAASC,cAAc,OAC3C0pK,EAAY1/J,UAAY,uCAExB,MAAMihK,EAASlrK,SAASC,cAAc,KACtCirK,EAAOhsK,UAAUgB,IAAI,gBAErB,MAAMirK,EAAYnrK,SAASC,cAAc,QACzCkrK,EAAUjsK,UAAUgB,IAAI,wBACxBirK,EAAUloK,OAAOsmK,EAAYR,GAC7BmC,EAAOjoK,OAAOgoK,EAAoBE,GAElC,MAAMj8I,EAAalvB,SAASC,cAAc,KAC1CivB,EAAWhwB,UAAUgB,IAAI,mBACzBgvB,EAAWjsB,OAAO2sD,GAElBo7G,EAAW/nK,OAAOioK,EAAQh8I,GAE1B,MAAM1b,EAAiB,CACrBinB,SAAAA,EACAuwI,WAAAA,EACA13G,UAAW++E,EAAU/6H,QACrB2zJ,mBAAAA,EACA1B,WAAAA,EACAR,aAAAA,EACAY,YAAAA,EACAh2J,gBAAiBi8C,EACjBluB,YAAaxC,EACbqF,OAAQrF,EACRhQ,WAAAA,GAuBF,OAdGnvB,GAEDA,EADekD,EAAS,SAAW,WACjBi8B,GAGhB/0B,IAEF+0B,EAAG+mI,UAAYzyJ,GAEK,QAAjB,iBAAiB,eAAE1L,UAAWA,GAC/BnJ,KAAKgnK,gBAAgBzmI,GAAI,IAItB,CAAC1rB,IAAAA,EAAKC,OAAAA,GAGR47E,UAAU57E,GACf,MAAMD,EAAM7U,KAAKwmK,aAAa1xJ,EAAO3L,QACrC,IAAI0L,EACF,OAGF,MAAM43J,EAAmB53J,EAAIG,gBAAgBzD,cAAc,0BACrDm7J,EAAmB,iBAA2B53J,EAAO3L,OAAQsjK,IAC/DA,GAAoBC,KACtB,EAAA1+J,EAAA,GAAe6G,EAAIG,gBAAiB03J,GACpC73J,EAAIG,gBAAgBzU,UAAUgB,IAAI,gBAI/B8lK,YAAYvyJ,GACjB,MAAMD,EAAM7U,KAAKwmK,aAAa1xJ,EAAO3L,QACjC0L,IAIJA,EAAIG,gBAAgBzU,UAAUC,OAAO,eACrCR,KAAK2mK,eAAe7xJ,EAAQ,KAAMD,OAAKtO,OAAWA,OAAWA,EAAW,QAI5E,MAAM08J,GAAoB,IAAIG,GAC9B,wBAAmCH,GACnC,a,mEEnzDA,MAAM9nG,EAAkB,IAjGjB,MACE0B,WACL,OAAO,cAAqB,uBAAuB96D,MAAMwG,GAChDA,IAIJokK,eAAensG,EAKlB,IAIF,OAAOxgE,KAAK68D,WAAW96D,MAAKu3B,IAC1B,IAAIszI,EACAC,EACJ,MAAMhwD,EAAwC,CAC5CmsC,SAAU,KACV8jB,aAAc,CACZxjK,EAAG,gCACHuyD,KAAM2E,EAAS3E,KACfZ,MAAOuF,EAASvF,QAKlB2xG,EADCpsG,EAAS1E,gBACW,iBAAwB,aAAc0E,EAAS1E,gBAAiBxiC,GAAO,GAEvE91B,QAAQ2E,QAAQ,CACnCmB,EAAG,4BAKP,MAAMyjK,EAAUzzI,EAAM0zI,SAChBC,EAAQ,IAAInoK,WAAWioK,EAAQE,MAAMpsK,OAAS,IAWpD,OAVAosK,EAAMC,YACND,EAAMhoK,IAAI8nK,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdJ,EADCrsG,EAASxE,YACO,iBAAwB,aAAcwE,EAASxE,YAAa1iC,GAAO,GAEnE91B,QAAQ2E,QAAQ,IAAIrD,YAGhCtB,QAAQC,IAAI,CAACmpK,EAAoBC,IAAiB9qK,MAAMorK,IAC7DtwD,EAAOmsC,SAAWmkB,EAAO,GACzBtwD,EAAOiwD,aAAaE,SAAWD,EAC/BlwD,EAAOiwD,aAAaM,kBAAoBD,EAAO,GAExC,cAAqB,iCAAkCtwD,SAK7DwwD,MAAMrkB,EAAkB1vH,EAAwB15B,EAAe,IACpE,OAAO,iBAAwB,aAAcopJ,EAAU1vH,GAAO,GAAOv3B,MAAMurK,GAElE,cAAqB,qBAAsB,CAChDtkB,SAAUskB,GACT1tK,GAASmC,MAAKg7D,IACD,uBAAXA,EAAKzzD,GACN,YAAmByzD,EAAK9yB,MAGnB8yB,OAKNwwG,qBAAqBrnJ,GAC1B,OAAO,cAAqB,+BAAgC,CAACA,KAAAA,IAGxDsnJ,sBACL,OAAO,cAAqB,+BAGvBC,sBACL,OAAO,cAAqB,iCAehC,qBAAiCtyG,EACjC,W,iBClHqM,oBAAoBvqB,MAAKA,KAA7J88H,EAAOC,QAAmL,SAASrtK,GAAG,IAAIgS,EAAE,GAAG,SAASmqB,EAAEl3B,GAAG,GAAG+M,EAAE/M,GAAG,OAAO+M,EAAE/M,GAAGooK,QAAQ,IAAIruD,EAAEhtG,EAAE/M,GAAG,CAACA,EAAIk8D,GAAE,EAAGksG,QAAQ,IAAI,OAAOrtK,EAAEiF,GAAG06I,KAAK3gC,EAAEquD,QAAQruD,EAAEA,EAAEquD,QAAQlxI,GAAG6iF,EAAE79C,GAAE,EAAG69C,EAAEquD,QAAQ,OAAOlxI,EAAEoT,EAAEvvC,EAAEm8B,EAAExE,EAAE3lB,EAAEmqB,EAAEmF,EAAE,SAASthC,EAAEgS,EAAE/M,GAAGk3B,EAAEA,EAAEn8B,EAAEgS,IAAIoI,OAAOkzJ,eAAettK,EAAEgS,EAAE,CAACu7J,YAAW,EAAGn8J,IAAInM,KAAKk3B,EAAEnZ,EAAE,SAAShjB,GAAG,oBAAoBwtK,QAAQA,OAAOC,aAAarzJ,OAAOkzJ,eAAettK,EAAEwtK,OAAOC,YAAY,CAACrtK,MAAM,WAAWga,OAAOkzJ,eAAettK,EAAE,aAAa,CAACI,OAAM,KAAM+7B,EAAEnqB,EAAE,SAAShS,EAAEgS,GAAG,GAAG,EAAEA,IAAIhS,EAAEm8B,EAAEn8B,IAAI,EAAEgS,EAAE,OAAOhS,EAAE,GAAG,EAAEgS,GAAG,iBAAiBhS,GAAGA,GAAGA,EAAE0tK,WAAW,OAAO1tK,EAAE,IAAIiF,EAAEmV,OAAO2xD,OAAO,MAAM,GAAG5vC,EAAEnZ,EAAE/d,GAAGmV,OAAOkzJ,eAAeroK,EAAE,UAAU,CAACsoK,YAAW,EAAGntK,MAAMJ,IAAI,EAAEgS,GAAG,iBAAiBhS,EAAE,IAAI,IAAIg/G,KAAKh/G,EAAEm8B,EAAEmF,EAAEr8B,EAAE+5G,EAAE,SAAShtG,GAAG,OAAOhS,EAAEgS,IAAI9J,KAAK,KAAK82G,IAAI,OAAO/5G,GAAGk3B,EAAE6iF,EAAE,SAASh/G,GAAG,IAAIgS,EAAEhS,GAAGA,EAAE0tK,WAAW,WAAW,OAAO1tK,EAAE2tK,SAAS,WAAW,OAAO3tK,GAAG,OAAOm8B,EAAEmF,EAAEtvB,EAAE,IAAIA,GAAGA,GAAGmqB,EAAEA,EAAE,SAASn8B,EAAEgS,GAAG,OAAOoI,OAAOwzJ,UAAUz7F,eAAewtE,KAAK3/I,EAAEgS,IAAImqB,EAAEH,EAAE,GAAGG,EAAEA,EAAEnjB,EAAE,GAAj5B,CAAq5B,CAAC,SAAShZ,EAAEgS,EAAEmqB,GAAG,cAAa,SAAUnqB,GAAG,IAAImqB,EAAEnqB,EAAE67J,cAAc77J,EAAE87J,mBAAmB7oK,EAAE,SAASjF,GAAG,IAAIiF,EAAE8oK,uBAAuB,MAAM,IAAI9+I,MAAM,8CAA8CjvB,IAAIA,EAAE,IAAIN,KAAKs5B,MAAM,WAAWt5B,KAAKsuK,OAAO5zJ,OAAO49C,OAAO,CAACi2G,aAAa,KAAKC,mBAAmB,KAAKC,iBAAiB,GAAGC,YAAY,uBAAuBt/C,kBAAkB,KAAKu/C,iBAAiB,GAAGC,uBAAsB,EAAGv/C,YAAY,EAAEC,iBAAiB,EAAEC,cAAc,EAAEs/C,gBAAgB,EAAEC,aAAY,EAAGt/C,aAAY,EAAGu/C,YAAY,IAAIzuK,GAAGN,KAAKgvK,sBAAsB,GAAGzpK,EAAE8oK,qBAAqB,WAAW,OAAO5xI,GAAGnqB,EAAE4C,WAAW5C,EAAE4C,UAAU+gI,cAAc3jI,EAAE4C,UAAU+gI,aAAag5B,cAAc38J,EAAE48J,aAAa3pK,EAAE2oK,UAAUiB,YAAY,WAAWnvK,KAAKisJ,SAASjsJ,KAAKisJ,OAAOmjB,UAAUpvK,KAAKisJ,OAAOmjB,YAAYrqK,SAAQ,SAAUzE,GAAGA,EAAE8C,UAAUpD,KAAKisJ,OAAO7oJ,cAAcpD,KAAKisJ,QAAQjsJ,KAAKqvK,cAAcrvK,KAAKsvK,oBAAoBtvK,KAAKqvK,aAAa5/J,eAAezP,KAAKqvK,eAAe9pK,EAAE2oK,UAAUqB,cAAc,SAASjvK,GAAG,GAAG,cAAcN,KAAKs5B,MAAM,CAAC,IAAI,IAAIhnB,EAAE,GAAGmqB,EAAE,EAAEA,EAAEn8B,EAAEgvH,iBAAiB7yF,IAAInqB,EAAEmqB,GAAGn8B,EAAEkvK,eAAe/yI,GAAGz8B,KAAKyvK,QAAQC,YAAY,CAAC/qD,QAAQ,SAASgrD,QAAQr9J,MAAM/M,EAAE2oK,UAAU0B,iBAAiB,SAAStvK,GAAG,OAAOA,GAAGA,EAAE2K,SAASjL,KAAKqvK,aAAa/uK,EAAE2K,QAAQjL,KAAKsvK,mBAAkB,IAAKtvK,KAAKqvK,aAAa,IAAI5yI,EAAEz8B,KAAKsvK,mBAAkB,GAAItvK,KAAKqvK,cAAc9pK,EAAE2oK,UAAU2B,eAAe,WAAW7vK,KAAKuvK,cAAc,kBAAkBvvK,KAAKuvK,eAAevvK,KAAK8vK,oBAAoB9vK,KAAKqvK,aAAaU,sBAAsB/vK,KAAKsuK,OAAOC,aAAavuK,KAAKsuK,OAAOh/C,iBAAiBtvH,KAAKsuK,OAAOh/C,kBAAkBtvH,KAAK8vK,oBAAoBjlD,QAAQ7qH,KAAKqvK,aAAaW,aAAahwK,KAAK8vK,oBAAoBG,eAAe3vK,IAAIN,KAAKuvK,cAAcjvK,EAAE4vK,cAAclwK,KAAKmwK,gBAAgBnwK,KAAKqvK,aAAae,aAAapwK,KAAKqwK,eAAerwK,KAAKsuK,OAAOj/C,aAAarvH,KAAKmwK,gBAAgBtlD,QAAQ7qH,KAAKqvK,aAAaW,aAAahwK,KAAKswK,kBAAkBtwK,KAAKqvK,aAAae,aAAapwK,KAAKuwK,iBAAiBvwK,KAAKsuK,OAAO/+C,eAAevvH,KAAKswK,kBAAkBzlD,QAAQ7qH,KAAK8vK,sBAAsBvqK,EAAE2oK,UAAUsC,eAAe,SAASlwK,GAAG,OAAOA,GAAGA,EAAE2K,QAAQqH,EAAE9O,QAAQ2E,QAAQ7H,GAAGgS,EAAE4C,UAAU+gI,aAAag5B,aAAa,CAAC/3J,MAAMlX,KAAKsuK,OAAOM,wBAAwB7sK,MAAKzB,IAAIN,KAAKisJ,OAAO3rJ,EAAEN,KAAKqvK,aAAaoB,wBAAwBnwK,OAAMiF,EAAE2oK,UAAUwC,WAAW,WAAW1wK,KAAKyvK,UAAUzvK,KAAKyvK,QAAQ,IAAIn9J,EAAEq+J,OAAO3wK,KAAKsuK,OAAOI,eAAenpK,EAAE2oK,UAAU0C,WAAW,WAAW,IAAItwK,GAAGN,KAAKsuK,OAAOQ,YAAY9uK,KAAK6wK,WAAW7wK,KAAK8wK,WAAWtoK,KAAKxI,MAAM,OAAOA,KAAK+wK,cAAc,GAAG/wK,KAAKooB,YAAY,EAAEpoB,KAAK0wK,aAAa,IAAIltK,SAAQ,CAAC8O,EAAEmqB,KAAK,IAAIl3B,EAAEk3B,IAAI,OAAOA,EAAEgnB,KAAKv9C,SAAS,IAAI,QAAQoM,IAAI,MAAM,IAAI,OAAOtS,KAAKgvK,sBAAsBvyI,EAAEgnB,KAAKutH,eAAe1wK,EAAEm8B,EAAEgnB,KAAKwtH,MAAM,MAAM,IAAI,OAAOjxK,KAAKyvK,QAAQ7gK,oBAAoB,UAAUrJ,GAAGvF,KAAK++G,WAAW/+G,KAAKyvK,QAAQpvK,iBAAiB,UAAUkF,GAAGvF,KAAKyvK,QAAQC,YAAYh1J,OAAO49C,OAAO,CAACqsD,QAAQ,OAAOusD,mBAAmBlxK,KAAKqvK,aAAa8B,WAAWC,cAAcpxK,KAAKqvK,aAAa8B,YAAYnxK,KAAKsuK,aAAY/oK,EAAE2oK,UAAU7rK,MAAM,SAAS/B,GAAG,GAAG,cAAcN,KAAKs5B,MAAM,CAAC,GAAGt5B,KAAKs5B,MAAM,SAASh5B,GAAGN,KAAKsuK,OAAOQ,YAAY,CAAC,IAAIx8J,EAAEtS,KAAKyvK,QAAQ,OAAO,IAAIjsK,SAAQ,CAAClD,EAAEm8B,KAAK,IAAIl3B,EAAEk3B,IAAI,YAAYA,EAAEgnB,KAAKv9C,UAAUoM,EAAE1D,oBAAoB,UAAUrJ,GAAGvF,KAAKqxK,UAAU/wK,MAAMgS,EAAEjS,iBAAiB,UAAUkF,GAAG+M,EAAEo9J,YAAY,CAAC/qD,QAAQ,aAAY,OAAO3kH,KAAKqxK,UAAU7tK,QAAQ2E,YAAY5C,EAAE2oK,UAAUoD,OAAO,WAAW,WAAWtxK,KAAKs5B,QAAQt5B,KAAKs5B,MAAM,YAAYt5B,KAAKuxK,aAAahsK,EAAE2oK,UAAUqC,iBAAiB,SAASjwK,GAAGN,KAAKsuK,OAAO/+C,cAAcjvH,EAAEN,KAAKswK,mBAAmBtwK,KAAKqvK,cAAcrvK,KAAKswK,kBAAkBkB,KAAKC,gBAAgBnxK,EAAEN,KAAKqvK,aAAa/3J,YAAY,MAAM/R,EAAE2oK,UAAUmC,eAAe,SAAS/vK,GAAGN,KAAKsuK,OAAOj/C,YAAY/uH,EAAEN,KAAKmwK,iBAAiBnwK,KAAKqvK,cAAcrvK,KAAKmwK,gBAAgBqB,KAAKC,gBAAgBnxK,EAAEN,KAAKqvK,aAAa/3J,YAAY,MAAM/R,EAAE2oK,UAAU9pJ,MAAM,SAAS9jB,GAAG,GAAG,aAAaN,KAAKs5B,MAAM,OAAOt5B,KAAK4vK,iBAAiBtvK,GAAGN,KAAK6vK,iBAAiB7vK,KAAKgvK,sBAAsB,EAAEhvK,KAAK4wK,aAAa7uK,MAAK,IAAI/B,KAAKwwK,eAAelwK,KAAIyB,MAAKzB,IAAIN,KAAK0qH,WAAWpqH,EAAEN,KAAKs5B,MAAM,YAAYt5B,KAAK0xK,UAAU1xK,KAAKyvK,QAAQC,YAAY,CAAC/qD,QAAQ,mBAAmB3kH,KAAK0qH,WAAWG,QAAQ7qH,KAAKmwK,iBAAiBnwK,KAAK0qH,WAAWG,QAAQ7qH,KAAKswK,uBAAsB/qK,EAAE2oK,UAAU9qK,KAAK,WAAW,GAAG,aAAapD,KAAKs5B,MAAM,CAACt5B,KAAKs5B,MAAM,WAAWt5B,KAAKmwK,gBAAgBllF,aAAajrF,KAAK8vK,oBAAoB7kF,aAAajrF,KAAKswK,kBAAkBrlF,aAAajrF,KAAK0qH,WAAWz/B,aAAajrF,KAAKmvK,cAAc,IAAI7uK,EAAEN,KAAKyvK,QAAQ,OAAO,IAAIjsK,SAAQ8O,IAAI,IAAImqB,EAAEl3B,IAAI,SAASA,EAAEk+C,KAAKv9C,UAAU5F,EAAEsO,oBAAoB,UAAU6tB,GAAGnqB,MAAMhS,EAAED,iBAAiB,UAAUo8B,GAAGn8B,EAAEovK,YAAY,CAAC/qD,QAAQ,SAAS3kH,KAAKsuK,OAAO9+C,aAAalvH,EAAEovK,YAAY,CAAC/qD,QAAQ,aAAY,OAAOnhH,QAAQ2E,WAAW5C,EAAE2oK,UAAUyD,cAAc,WAAW,aAAa3xK,KAAKs5B,OAAOt5B,KAAKyvK,UAAUzvK,KAAKyvK,QAAQC,YAAY,CAAC/qD,QAAQ,iBAAiB3kH,KAAKyvK,UAAUlqK,EAAE2oK,UAAU4C,UAAU,SAASxwK,GAAGN,KAAK+wK,cAAcjpK,KAAKxH,GAAGN,KAAKooB,aAAa9nB,EAAEO,QAAQ0E,EAAE2oK,UAAU2C,WAAW,SAASvwK,GAAGN,KAAK2vH,gBAAgBrvH,IAAIiF,EAAE2oK,UAAUnvD,OAAO,WAAW,IAAI/+G,KAAKsuK,OAAOQ,YAAY,CAAC,IAAIxuK,EAAE,IAAIwE,WAAW9E,KAAKooB,aAAapoB,KAAK+wK,cAActsK,QAAO,SAAU6N,EAAEmqB,GAAG,OAAOn8B,EAAE2E,IAAIw3B,EAAEnqB,GAAGA,EAAEmqB,EAAE57B,SAAS,GAAGb,KAAK2vH,gBAAgBrvH,GAAGN,KAAK0vH,SAAS1vH,KAAKsuK,OAAO9+C,oBAAoBxvH,KAAKyvK,SAASlqK,EAAE2oK,UAAUv+C,gBAAgB,aAAapqH,EAAE2oK,UAAUmD,QAAQ,aAAa9rK,EAAE2oK,UAAUqD,SAAS,aAAahsK,EAAE2oK,UAAUwD,QAAQ,aAAansK,EAAE2oK,UAAUx+C,OAAO,aAAapvH,EAAEqtK,QAAQpoK,IAAI06I,KAAKjgJ,KAAKy8B,EAAE,KAAK,SAASn8B,EAAEgS,GAAG,IAAImqB,EAAEA,EAAE,WAAW,OAAOz8B,KAAlB,GAA0B,IAAIy8B,EAAEA,GAAG,IAAIm1I,SAAS,cAAb,GAA8B,MAAMtxK,GAAG,iBAAiB6M,SAASsvB,EAAEtvB,QAAQ7M,EAAEqtK,QAAQlxI","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/components/wrappers.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/helpers/dom/setCaretAt.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/helpers/dom/getSelectedNodes.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/helpers/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./public/recorder.min.js"],"sourcesContent":["/*\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 InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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 InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\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\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\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 setInnerHTML(elem: Element, html: string) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\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 { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport forEachReverse from \"./array/forEachReverse\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\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 forEachReverse from \"./array/forEachReverse\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.loadedAllUp = this.loadedAllDown = loadedAll;\n this.loadPromiseUp = this.loadPromiseDown = null;\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n this.previous.push(this.current, ...items);\n } else {\n items = this.previous.splice(this.previous.length + length, -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n this.next.unshift(...items, this.current);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older && this.loadedAllDown) return Promise.resolve();\n else if(!older && this.loadedAllUp) return Promise.resolve();\n\n if(older && this.loadPromiseDown) return this.loadPromiseDown;\n else if(!older && this.loadPromiseUp) return this.loadPromiseUp;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n const promise = this.loadMore(anchor, older, this.loadCount).then(result => {\n if((older && this.loadPromiseDown !== promise) || (!older && this.loadPromiseUp !== promise)) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n if(older) this.loadedAllDown = true;\n else this.loadedAllUp = true;\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n\n if(older) {\n if(this.reverse) this.previous.unshift(processed);\n else this.next.push(processed);\n } else {\n if(this.reverse) this.next.push(processed);\n else this.previous.unshift(processed);\n }\n });\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\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 { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport appMessagesIdsManager from \"../lib/appManagers/appMessagesIdsManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport forEachReverse from \"./array/forEachReverse\";\nimport filterChatPhotosMessages from \"./filterChatPhotosMessages\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n constructor(options: Omit, 'loadMore'> & {onEmptied?: () => void} = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = this.current?.mid;\n\n if(anchor) maxId = anchor.mid;\n if(!older) maxId = appMessagesIdsManager.incrementMessageId(maxId, 1);\n\n return appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then(value => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: (message) => {\n const filtered = this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n }\n\n protected filterMids(mids: number[]) {\n const storage = this.searchContext.isScheduled ? \n appMessagesManager.getScheduledMessagesStorage(this.searchContext.peerId) : \n appMessagesManager.getMessagesStorage(this.searchContext.peerId);\n const filtered = appMessagesManager.filterMessagesByInputFilter(this.searchContext.inputFilter._, mids, storage, mids.length) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = (obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = this.filterMids(sorted);\n const targets = filtered.map(message => this.processItem(message)).filter(Boolean);\n if(targets.length) {\n this.next.push(...targets);\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(!this.searchContext.useSearch) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\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 appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(public name: LangPackKey | boolean, public type: string, private clearable = true, className?: string, clickable = true, public autonomous = true, public onFound?: () => void) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then(res => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n drawStatus: false,\r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch(err => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\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\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\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 Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\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 \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTab;\r\n}\r\n\r\nexport interface SliderSuperTabEventableConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n this.slider.addTab(this);\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\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 { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type']\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach(el => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find(t => t instanceof tabConstructor) as SliderSuperTab;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\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 { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport type { InputFile } from \"../layer\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n attachClickEvent(this.container, () => {\r\n new PopupAvatar().open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\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 Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\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 appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n if(this.isGeoChat){\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n appChatsManager.createChannel({\r\n title, \r\n about: '', \r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords, \r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length){\r\n appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChat(title, this.peerIds.map(peerId => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n }\r\n });\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n this.peerIds.forEach(userId => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: userId,\r\n container: this.list,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(userId));\r\n });\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private startLocating(){\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = \"https://nominatim.openstreetmap.org/reverse\";\r\n uri += \"?lat=\"+location.coords.latitude;\r\n uri += \"&lon=\"+location.coords.longitude;\r\n uri += \"&format=json\";\r\n uri += \"&addressdetails=1\";\r\n uri += \"&accept-language=en\";\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\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 rootScope from \"../lib/rootScope\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { DocumentAttribute, Message, PhotoSize } from \"../layer\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport { onMediaLoad } from \"../helpers/files\";\r\nimport copy from \"../helpers/object/copy\";\r\nimport deepEqual from \"../helpers/object/deepEqual\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\r\n\r\nclass AppMediaPlaybackController {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n private playingMediaType: PlaybackMediaType;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n \r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n private _volume = 1;\r\n private _muted = false;\r\n private _playbackRate = 1;\r\n private lockedSwitchers: boolean;\r\n private playbackRates: Record = {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n };\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.play,\r\n pause: this.pause,\r\n stop: this.stop,\r\n seekbackward: this.seekBackward,\r\n seekforward: this.seekForward,\r\n seekto: this.seekTo,\r\n previoustrack: this.previous,\r\n nexttrack: this.next\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (doc) => {\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const\r\n ];\r\n keys.forEach(key => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia) {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\r\n this.playbackRates[this.playingMediaType] = value as number;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n const {volume, muted, playbackRate} = this;\r\n rootScope.dispatchEvent('media_playback_params', {\r\n volume, muted, playbackRate\r\n });\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(doc.supportsStreaming || cacheContext.url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDocsManager.downloadDoc(doc);\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = (media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n\r\n if(this.playingMedia === media) {\r\n media.playbackRate = this.playbackRate;\r\n }\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appPhotosManager.preloadPhoto(doc, size);\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n const result = appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n if(result.cached) {\r\n const url = await result.loadPromise;\r\n artwork.push({\r\n src: url,\r\n sizes: '160x160',\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n result.loadPromise.then((url) => {\r\n if(this.playingMedia !== playingMedia || !url) {\r\n return;\r\n }\r\n \r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n\r\n title = appPeersManager.getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute && attribute.title || doc.file_name;\r\n artist = attribute && attribute.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach(size => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n const message = details.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\r\n return message;\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n if(!this.listLoader.current || !verify(this.listLoader.current)) {\r\n let idx = this.listLoader.previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(this.listLoader.previous.length - idx);\r\n } else {\r\n idx = this.listLoader.next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.listLoader.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n\r\n this.setMedia(media, message);\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n if(this.playingMedia !== media) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('media_play', this.getPlayingDetails());\r\n }, 0);\r\n };\r\n\r\n public getPlayingDetails() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) {\r\n return;\r\n }\r\n\r\n const message = this.getMessageByMedia(playingMedia);\r\n return {\r\n doc: appMessagesManager.getMediaFromMessage(message),\r\n message,\r\n media: playingMedia\r\n };\r\n }\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n rootScope.dispatchEvent('media_pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n if(!this.next()) {\r\n this.stop();\r\n rootScope.dispatchEvent('media_stop');\r\n }\r\n };\r\n\r\n public toggle(play?: boolean) {\r\n if(!this.playingMedia) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = this.playingMedia.paused;\r\n }\r\n\r\n if(this.playingMedia.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n this.playingMedia.play();\r\n } else {\r\n this.playingMedia.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = () => {\r\n const media = this.playingMedia;\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n \r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public next = () => {\r\n return !this.lockedSwitchers && this.listLoader.go(1);\r\n };\r\n\r\n public previous = () => {\r\n const media = this.playingMedia;\r\n if(media && (media.currentTime > 5 || !this.listLoader.previous.length)) {\r\n media.currentTime = 0;\r\n this.toggle(true);\r\n return;\r\n }\r\n\r\n return !this.lockedSwitchers && this.listLoader.go(-1);\r\n };\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n if(!this.listLoader) {\r\n this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n rootScope.dispatchEvent('media_stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n this.listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n this.listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n this.listLoader.reverse = reverse;\r\n }\r\n\r\n this.listLoader.setSearchContext(this.searchContext);\r\n this.listLoader.current = current;\r\n\r\n this.listLoader.load(true);\r\n this.listLoader.load(false);\r\n }\r\n\r\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n let mediaType: PlaybackMediaType = 'audio';\r\n if(doc?.type) {\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n mediaType = 'voice';\r\n } else if(doc.type === 'video') {\r\n mediaType = 'video';\r\n }\r\n }\r\n\r\n return mediaType;\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\r\n\r\n this._playbackRate = this.playbackRates[mediaType];\r\n\r\n this.playingMedia = media;\r\n this.playingMediaType = mediaType;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return () => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n if(media && this.playingMedia === media) {\r\n this.stop();\r\n }\r\n\r\n if(wasPlaying) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\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 GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\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 attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport { ripple } from \"./ripple\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n textArgs?: FormatterArguments,\n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) textElement.innerHTML = options.regularText;\n }\n \n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach(b => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\nimport { closeBtnMenu, openBtnMenu } from \"./misc\";\r\n\r\nconst ButtonMenuToggle = (\r\n options: Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n listenerSetter: ListenerSetter, \r\n asDiv: boolean,\r\n container: HTMLElement\r\n }> = {}, \r\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', \r\n buttons: ButtonMenuItemOptions[], \r\n onOpen?: (e: Event) => void,\r\n onClose?: () => void\r\n) => {\r\n options.asDiv = true;\r\n const button = options.container ?? ButtonIcon('more', options);\r\n button.classList.add('btn-menu-toggle');\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options, onClose);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void, options?: AttachClickOptions, onClose?: () => void) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n closeBtnMenu();\r\n } else {\r\n onOpen && onOpen(e);\r\n openBtnMenu(openedMenu, onClose);\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport EventListenerBase from \"../eventListenerBase\";\nimport ListenerSetter from \"../listenerSetter\";\nimport safeAssign from \"../object/safeAssign\";\nimport findUpClassName from \"./findUpClassName\";\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n \n public setup(options: {\n element: HTMLElement, \n listenerSetter: ListenerSetter, \n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n \n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n \n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n \n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n \n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\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 appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport RangeSelector from \"../components/rangeSelector\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\n\nexport class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n\nexport class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01, \n min: 0, \n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n //console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n },\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(rootScope)('media_playback_params', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n private setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach(icon => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle}: {\n video: HTMLVideoElement, \n play?: boolean, \n streamable?: boolean, \n duration?: number,\n onPlaybackRackMenuToggle?: (open: boolean) => void\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper, \n listenerSetter: this.listenerSetter, \n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n \n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n \n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = String(video.duration | 0).toHHMMSS();\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('click', () => {\n this.togglePlay();\n });\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n \n /* player.addEventListener('click', (e) => {\n if(e.target !== player) {\n return;\n }\n\n this.togglePlay();\n }); */\n \n /* video.addEventListener('play', () => {\n }); */\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n listenerSetter.add(fullScreenButton)('click', () => {\n this.toggleFullScreen();\n });\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = String(video.currentTime | 0).toHHMMSS();\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(rootScope)('media_playback_params', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.innerHTML = String(Math.round(video.duration || initDuration)).toHHMMSS();\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS();\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return { \n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x', \n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(\n this.playbackRateButton, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined, \n undefined, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n );\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n \n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n \n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n \n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n \n cancelFullScreen();\n }\n }\n \n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public removeListeners() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = undefined;\n }\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\nimport { fastRaf } from \"../schedulers\";\nimport throttleWith from \"./throttleWith\";\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\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 { i18n, LangPackKey } from \"../lib/langPack\";\n\nexport default function formatBytes(bytes: number, decimals = 2) {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return i18n(sizes[i], [parseFloat((bytes / Math.pow(k, i)).toFixed(dm))]);\n}\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 appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport { MediaProgressLine } from \"../lib/mediaPlayer\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport './middleEllipsis';\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport htmlToSpan from \"../helpers/dom/htmlToSpan\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport formatBytes from \"../helpers/formatBytes\";\nimport { animateSingle } from \"../helpers/animation\";\nimport clamp from \"../helpers/number/clamp\";\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach(mid => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach(elem => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; //mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; //mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nfunction wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n \n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n \n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nfunction wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(appMessagesManager.wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n if(isVoice) {\n middleEllipsisEl.append(appMessagesManager.wrapSenderToPeer(message));\n } else {\n middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(appMessagesManager.wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map(s => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map(element => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public render() {\n this.classList.add('audio');\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(this.message);\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploading = isOutgoing && this.preloader;\n\n const durationStr = String(doc.duration | 0).toHHMMSS();\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploading) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = isVoice ? wrapVoiceMessage(this) : wrapAudio(this);\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => String(audio.currentTime | 0).toHHMMSS() + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID, \n inputFilter: {_: 'inputMessagesFilterEmpty'}, \n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLImageElement[] = [];\n const wrapped = wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach(img => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDocsManager.downloadDoc(doc);\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n \n //setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n //}, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploading) {\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\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 class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\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 replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: appPhotosManager.choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = RichTextProcessor.wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach(child => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, (title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport accumulate from \"../helpers/array/accumulate\";\r\nimport clamp from \"../helpers/number/clamp\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find(r => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map(size => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map(ratio => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map(ratio => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\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 { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.setAttribute('peer', '' + this.peerId);\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach(inputField => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach(inputField => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach(inputField => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\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 RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach(r => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\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 CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport { ripple } from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public titleRight: HTMLElement;\r\n public subtitle: HTMLElement;\r\n public media: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string | HTMLElement,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n titleRightSecondary: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n havePadding = true;\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n \r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n havePadding = true;\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n const titleRight = options.titleRight || options.titleRightSecondary;\r\n if(titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n if(typeof(options.title) === 'string') {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(options.title);\r\n }\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(titleRight) {\r\n const titleRightEl = this.titleRight = document.createElement('div');\r\n titleRightEl.classList.add('row-title', 'row-title-right');\r\n\r\n if(options.titleRightSecondary) {\r\n titleRightEl.classList.add('row-title-right-secondary');\r\n }\r\n\r\n if(typeof(titleRight) === 'string') {\r\n titleRightEl.innerHTML = titleRight;\r\n } else {\r\n titleRightEl.append(titleRight);\r\n }\r\n\r\n c.append(titleRightEl);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n public createMedia(size?: 'small') {\r\n this.container.classList.add('row-with-padding');\r\n \r\n const media = this.media = document.createElement('div');\r\n media.classList.add('row-media');\r\n\r\n if(size) {\r\n media.classList.add('row-media-' + size);\r\n }\r\n\r\n this.container.append(media);\r\n\r\n return media;\r\n }\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);\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// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\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 getDeepProperty from \"../helpers/object/getDeepProperty\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string,\r\n alignRight?: boolean\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n\r\n if(options.alignRight) {\r\n label.classList.add('radio-field-right');\r\n }\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\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 replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey\r\n}>) {\r\n toast(i18n(options.langPackKey));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n) {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n return (...args: Parameters): typeof waitingPromise => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\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 ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(options: UsernameInputField['options']) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!RichTextProcessor.isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = apiManager.invokeApi('channels.checkUsername', {\r\n channel: appChatsManager.getChannelInput(this.options.peerId.toChatId()),\r\n username\r\n });\r\n } else {\r\n this.checkUsernamePromise = apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n this.checkUsernamePromise.then(available => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && RichTextProcessor.isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\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 AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n let avatarEl = new AvatarElement();\n avatarEl.setAttribute('dialog', '1');\n avatarEl.setAttribute('peer', '' + options.peerId);\n avatarEl.classList.add('avatar-32');\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) p.innerHTML = options.description;\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach(o => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach(button => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach(o => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\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 { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n appProfileManager.getChatInviteLink(this.chatId, true).then(link => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n });\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n appChatsManager.migrateChat(this.chatId).then(channelId => {\r\n return appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\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 Scrollable from \"../components/scrollable\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then(done => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\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 appChatsManager, { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport PeerTitle from \"./peerTitle\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport appPeersManager, { IsPeerType } from \"../lib/appManagers/appPeersManager\";\nimport { generateDelimiter, SettingSection } from \"./sidebarLeft\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterUnique from \"../helpers/array/filterUnique\";\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../helpers/object/safeAssign\";\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n \n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n \n constructor(options: {\n appendTo: AppSelectPeers['appendTo'], \n onChange?: AppSelectPeers['onChange'], \n peerType?: AppSelectPeers['peerType'], \n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void, \n renderResultsFunc?: AppSelectPeers['renderResultsFunc'], \n chatRightsAction?: AppSelectPeers['chatRightsAction'], \n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = (peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter(peerId => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = peerIds.filter(peerId => {\n if(peerId.isPeerId()) {\n const peer = appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId));\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n //target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private renderSaved() {\n if(!this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || appUsersManager.testSelfSearch(this.query))) {\n this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true).promise;\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = dialogs[dialogs.length - 1].index || 0;\n\n dialogs = dialogs.slice();\n dialogs.findAndSplice(d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = dialogs.filter(d => this.filterByRights(d.peerId));\n }\n\n this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map(dialog => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private filterByRights(peerId: PeerId) {\n return (\n peerId.isUser() && \n (this.chatRightsAction !== 'send_messages' || appUsersManager.canSendToUser(peerId))\n ) || appChatsManager.hasRights(peerId.toChatId(), this.chatRightsAction);\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = resultPeerIds.filter(peerId => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter(peerId => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map(participant => {\n return appChatsManager.getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = peerIds.filter(peerId => {\n return appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(peerId => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.scrollable,\n drawStatus: false,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = appProfileManager.getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = appUsersManager.getUserStatusString(peerId);\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-32');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center'\n });\n }\n \n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n //const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach(value => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center', \n forceDirection: FocusDirection.Static\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\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 { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n dialog: this.userId.toPeerId(false),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(this.userId));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n });\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\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 { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }) {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? appChatsManager.combineParticipantBannedRights(options.chatId, options.participant.banned_rights) : defaultBannedRights;\n \n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: appChatsManager.hasRights(options.chatId, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n if((\n options.participant && \n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n (chat as Chat.channel).username &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n \n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter(i => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach(info => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach(flag => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n });\n\n this.eventListener.addEventListener('destroy', () => {\n appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = new AppUserPermissionsTab(this.slider);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, 'LI');\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = (li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = (appChatsManager.getChat(this.chatId) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach(info => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map(t => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: appPeersManager.getPeerId(participant.peer),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n if(needAdd) {\n if(!li) {\n add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n } else {\n setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n }\n\n if(update.prev_participant?._ !== 'channelParticipantBanned') {\n ++exceptionsCount;\n }\n } else {\n if(li) {\n li.remove();\n }\n\n if(update.prev_participant?._ === 'channelParticipantBanned') {\n --exceptionsCount;\n }\n }\n\n setLength();\n });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then(res => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\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 appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appPeersManager, { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n peerId: PeerId, \n // actionType: 'leave' | 'delete', \n peerType: PeerType = appPeersManager.getDialogType(peerId), \n onSelect?: (promise: Promise) => void\n ) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n appChatsManager.deleteChannel\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\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 debounce from \"../../../helpers/schedulers/debounce\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\nimport CheckboxField from \"../../checkboxField\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await appReactionsManager.getActiveAvailableReactions();\n const chatFull = await appProfileManager.getChatFull(this.chatId);\n let originalReactions = chatFull.available_reactions ?? [];\n const enabledReactions = new Set(originalReactions);\n\n const toggleSection = new SettingSection({\n caption: appChatsManager.isBroadcast(this.chatId) ? 'EnableReactionsChannelInfo' : 'EnableReactionsGroupInfo'\n });\n\n const toggleCheckboxField = new CheckboxField({toggle: true, checked: !!enabledReactions.size});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions'\n });\n\n toggleSection.content.append(toggleRow.container);\n\n const reactionsSection = new SettingSection({\n name: 'AvailableReactions'\n });\n\n const checkboxFields = availableReactions.map(availableReaction => {\n const checkboxField = new CheckboxField({\n toggle: true, \n checked: enabledReactions.has(availableReaction.reaction)\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n enabledReactions.add(availableReaction.reaction);\n\n if(!toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(true);\n }\n } else {\n enabledReactions.delete(availableReaction.reaction);\n\n if(!enabledReactions.size && toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(false);\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n this.listenerSetter.add(toggleRow.checkboxField.input)('change', () => {\n if(!toggleCheckboxField.checked) {\n checkboxFields.forEach(checkboxField => checkboxField.checked = false);\n saveReactionsDebounced();\n } else if(checkboxFields.every(checkboxField => !checkboxField.checked)) {\n checkboxFields.forEach(checkboxField => checkboxField.checked = true);\n saveReactionsDebounced();\n }\n });\n\n const saveReactions = () => {\n const newReactions = Array.from(enabledReactions);\n if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n return;\n }\n\n const chatFull = appProfileManager.getCachedFullChat(this.chatId);\n if(chatFull) {\n chatFull.available_reactions = newReactions;\n }\n \n appChatsManager.setChatAvailableReactions(this.chatId, newReactions);\n originalReactions = newReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', saveReactions, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\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 { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\r\nimport AppChatReactionsTab from \"./chatReactions\";\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n private tempId: number;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n this.tempId ??= 0;\r\n const tempId = ++this.tempId;\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n let chatFull = await appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(this.chatId);\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach(callback => callback());\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_full_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatFull = appProfileManager.getCachedFullChat(chatId) || chatFull;\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n const canChangeType = appChatsManager.hasRights(this.chatId, 'change_type');\r\n const canChangePermissions = appChatsManager.hasRights(this.chatId, 'change_permissions');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n \r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n \r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n \r\n if(canChangeType) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = new AppChatTypeTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(canChangeType || canChangePermissions) {\r\n const reactionsRow = new Row({\r\n titleLangKey: 'Reactions',\r\n icon: 'reactions',\r\n clickable: () => {\r\n const tab = new AppChatReactionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open().then(() => {\r\n if(this.tempId !== tempId) {\r\n return;\r\n }\r\n \r\n this.listenerSetter.add(tab.eventListener)('destroy', setReactionsLength);\r\n });\r\n }\r\n });\r\n\r\n const availableReactions = await appReactionsManager.getAvailableReactions();\r\n const availableReactionsLength = availableReactions.filter(availableReaction => !availableReaction.pFlags.inactive).length;\r\n const setReactionsLength = () => {\r\n const reactions = chatFull.available_reactions ?? [];\r\n reactionsRow.subtitle.innerHTML = reactions.length + '/' + availableReactionsLength;\r\n };\r\n\r\n setReactionsLength();\r\n\r\n section.content.append(reactionsRow.container);\r\n }\r\n\r\n if(canChangePermissions && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = new AppGroupPermissionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = () => {\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +appChatsManager.hasRights(this.chatId, f, chat.default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && canChangeType) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\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 { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !appUsersManager.isContact(this.peerId.toUserId());\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n appMessagesManager.togglePeerMute(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', (update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = appPeersManager.getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !appNotificationsManager.isMuted(update.notify_settings);\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !appNotificationsManager.isPeerLocalMuted(this.peerId, false);\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n appUsersManager.addContact(this.peerId, this.nameInputField.value, this.lastNameInputField.value, appUsersManager.getUser(this.peerId).phone)\r\n .finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\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 { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map(sel => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\nrootScope.addEventListener('context_menu_toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = (_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !this.verifyTouchTarget(_e)) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\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 IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\nimport appMessagesManager, { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { openAvatarViewer } from \"./avatar\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(public scrollable: Scrollable) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) \n || (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n \n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, lastIndex = 0, minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars, \n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n //console.log(xDiff, yDiff);\n return false;\n }, \n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n }, \n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n \n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n \n //console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = (anchor || listLoader.current) as any;\n return appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then(value => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(Promise.resolve(appProfileManager.getChatFull(peerId.toChatId())));\n }\n \n promises.push(appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then((result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = value.history.findAndSplice(m => {\n return ((m as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = (photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container');\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = () => {\n if(photo) {\n const res = wrapPhoto({\n container: avatar,\n photo,\n size: appPhotosManager.choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach(img => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n appAvatarsManager.putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.avatars.append(avatar);\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach(target => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n }\n}\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 IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport callbackify from \"../helpers/callbackify\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Chat, ChatFull, User } from \"../layer\";\nimport appChatsManager, { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport I18n from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport PeerTitle from \"./peerTitle\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\n\nlet setText = (text: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = text || '';\n row.container.style.display = text ? '' : 'none';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n \n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(\n public scrollable: Scrollable, \n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.setAttribute('dialog', '' + +this.isDialog);\n this.avatar.setAttribute('clickable', '');\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n Promise.resolve(appProfileManager.getProfileByPeerId(this.peerId)).then(full => {\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n });\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n const peer: Channel | User.user = appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: () => {\n const peer: User = appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n copyTextToClipboard(this.link.title.textContent);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then(chatFull => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n toast(I18n.format('LinkCopied', true));\n // });\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n \n //let checked = this.notificationsCheckbox.checked;\n appMessagesManager.togglePeerMute(this.peerId);\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('peer_title_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.fillUsername();\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n // const photo = appPeersManager.getPeerPhoto(peerId);\n // if(!photo && this.avatars) {\n this.setAvatar();\n // }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n public setPeerStatus = (needClear = false) => {\n const peerId = this.peerId;\n if(!peerId || (rootScope.myId === peerId && this.isDialog)) return;\n\n appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, true, () => peerId === this.peerId, !this.isDialog);\n };\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach(row => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n public setAvatar() {\n if(this.canBeDetailed()) {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable);\n this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar.setAttribute('peer', '' + this.peerId);\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n private fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const username = appPeersManager.getPeerUsername(peerId);\n setText(username, this.username);\n }\n }\n\n private fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const user = appUsersManager.getUser(peerId);\n setText(user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined, this.phone);\n }\n }\n\n private fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n notificationsRow.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n });\n }\n }\n\n private fillRows() {\n const peerId = this.peerId;\n\n this.fillUsername();\n this.fillUserPhone();\n this.fillNotifications();\n this.setMoreDetails();\n\n replaceContent(this.name, new PeerTitle({\n peerId,\n dialog: this.isDialog,\n }).element);\n\n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n this.name.append(generateVerifiedIcon());\n }\n\n this.setPeerStatus(true);\n }\n\n public fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n this.cleanupHTML();\n this.setAvatar();\n this.fillRows();\n }\n\n public setMoreDetails(override?: true) {\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId || appPeersManager.isRestricted(peerId) || !this.canBeDetailed()) {\n return;\n }\n\n callbackify(appProfileManager.getProfileByPeerId(peerId, override), (peerFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId || appPeersManager.isRestricted(peerId)) {\n //this.log.warn('peer changed');\n return;\n }\n \n //this.log('chatInfo res 2:', chatFull);\n \n // if(peerFull.about) {\n setText(peerFull.about ? RichTextProcessor.wrapRichText(peerFull.about) : undefined, this.bio);\n // }\n\n if(!peerId.isUser()) {\n const chat: Chat.channel = appChatsManager.getChat(peerId.toChatId());\n if(chat.username) {\n setText('https://t.me/' + chat.username, this.link);\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite) {\n setText(exportedInvite.link, this.link);\n }\n }\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n setText(location.address, this.location);\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n });\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n}\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 appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n } = {};\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n const isSharedMedia = top <= HEADER_HEIGHT;\n animatedCloseIcon.classList.toggle('state-back', isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = new AppEditChatTab(this.slider);\n } else {\n tab = new AppEditContactTab(this.slider);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n rootScope.addEventListener('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n rootScope.addEventListener('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n }\n });\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', () => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map(peerId => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = new AppAddMembersTab(this.slider);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const filtered = this.searchSuper.filterMessagesByType(mids.map(mid => appMessagesManager.getMessageByPeer(peerId, mid)), inputFilter);\n if(filtered.length) {\n const history = this.historiesStorage[peerId][inputFilter];\n if(history) {\n history.unshift(...filtered.map(message => ({mid: message.mid, peerId: message.peerId})));\n }\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = this.historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex(m => m.mid === mid);\n if(idx !== -1) {\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`div[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n \n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n this.searchSuper.usedFromHistory[inputFilter]--;\n }\n }\n\n break;\n }\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n \n this.editBtn.classList.add('hide');\n\n this.searchSuper.cleanupHTML(true);\n\n this.container.classList.toggle('can-add-members', this.searchSuper.canViewMembers() && appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {})\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n\n this.cleanupHTML();\n\n this.profile.fillProfileElements();\n\n this.toggleEditBtn();\n }\n\n private toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad = false) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppSharedMediaTab = AppSharedMediaTab);\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 appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n public sharedMediaTab: AppSharedMediaTab;\r\n private isColumnProportionSet = false;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n\r\n this.sharedMediaTab = new AppSharedMediaTab(this);\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n /* public selectTab(id: number) {\r\n const res = super.selectTab(id);\r\n\r\n if(id !== -1) {\r\n this.toggleSidebar(true);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));\r\n\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n //this.selectTab(this.sharedMediaTab);\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\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 { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport appPollsManager from \"../../../lib/appManagers/appPollsManager\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { ripple } from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public open(message: any) {\r\n const ret = super.open();\r\n const poll = appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n title.innerHTML = poll.poll.rQuestion;\r\n\r\n const percents = poll.results.results.map(v => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n answerTitle.innerHTML = RichTextProcessor.wrapEmojiText(answer.text);\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n appPollsManager.getVotes(message, answer.option, offset, limit).then(votesList => {\r\n votesList.votes.forEach(vote => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: vote.user_id.toPeerId(false),\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then(votes => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\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 mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport appPollsManager from \"../lib/appManagers/appPollsManager\";\r\nimport serverTimeManager from \"../lib/mtproto/serverTimeManager\";\r\nimport { RichTextProcessor } from \"../lib/richtextprocessor\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { ripple } from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Poll, PollResults } from \"../layer\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nrootScope.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n textEl.innerHTML = RichTextProcessor.wrapRichText(solution, {entities: solution_entities});\r\n appImManager.chat.bubbles.bubblesContainer.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: any;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n constructor() {\r\n super();\r\n // элемент создан\r\n }\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n const pollId = this.message.media.poll.id;\r\n const {poll, results} = appPollsManager.getPoll(pollId);\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - serverTimeManager.serverTimeOffset) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = String(timeLeft).toHHMMSS();\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n new AppPollResultsTab(appSidebarRight).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter(el => el.classList.contains('is-chosing')).map(el => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach(el => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find(r => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach(target => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach(target => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map(v => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n let html = '';\r\n /**\r\n * MACOS, ANDROID - без реверса\r\n * WINDOWS DESKTOP - реверс\r\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\r\n */\r\n (results.recent_voters || [])/* .slice().reverse() */.forEach((userId, idx) => {\r\n const style = idx === 0 ? '' : `style=\"transform: translateX(-${idx * 3}px);\"`;\r\n html += ``;\r\n });\r\n this.avatarsDiv.innerHTML = html;\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach(svg => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map(p => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map(p => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach(svg => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\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 Chat from './chat/chat';\r\nimport { getEmojiToneIndex } from '../vendor/emoji';\r\nimport { deferredPromise } from '../helpers/cancellablePromise';\r\nimport { formatFullSentTime } from '../helpers/date';\r\nimport mediaSizes, { ScreenSize } from '../helpers/mediaSizes';\r\nimport { IS_SAFARI } from '../environment/userAgent';\r\nimport { Message, PhotoSize, StickerSet } from '../layer';\r\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport appMessagesManager from '../lib/appManagers/appMessagesManager';\r\nimport appPhotosManager, { MyPhoto } from '../lib/appManagers/appPhotosManager';\r\nimport LottieLoader from '../lib/rlottie/lottieLoader';\r\nimport webpWorkerController from '../lib/webp/webpWorkerController';\r\nimport animationIntersector from './animationIntersector';\r\nimport appMediaPlaybackController, { MediaSearchContext } from './appMediaPlaybackController';\r\nimport AudioElement, { findMediaTargets } from './audio';\r\nimport ReplyContainer from './chat/replyContainer';\r\nimport { Layouter, RectPart } from './groupedLayout';\r\nimport LazyLoadQueue from './lazyLoadQueue';\r\nimport PollElement from './poll';\r\nimport ProgressivePreloader from './preloader';\r\nimport './middleEllipsis';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { onMediaLoad } from '../helpers/files';\r\nimport { animateSingle } from '../helpers/animation';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport { fastRaf } from '../helpers/schedulers';\r\nimport appDownloadManager, { DownloadBlob, ThumbCache } from '../lib/appManagers/appDownloadManager';\r\nimport appStickersManager from '../lib/appManagers/appStickersManager';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent, simulateClickEvent } from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport { clearBadCharsAndTrim } from '../helpers/cleanSearchText';\r\nimport blur from '../helpers/blur';\r\nimport IS_WEBP_SUPPORTED from '../environment/webpSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\r\nimport { MiddleEllipsisElement } from './middleEllipsis';\r\nimport { joinElementsWith } from '../lib/langPack';\r\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\r\nimport { NULL_PEER_ID } from '../lib/mtproto/mtproto_config';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\r\nimport assumeType from '../helpers/assumeType';\r\nimport appMessagesIdsManager from '../lib/appManagers/appMessagesIdsManager';\r\nimport throttle from '../helpers/schedulers/throttle';\r\nimport { SendMessageEmojiInteractionData } from '../types';\r\nimport IS_VIBRATE_SUPPORTED from '../environment/vibrateSupport';\r\nimport Row from './row';\r\nimport { ChatAutoDownloadSettings } from '../helpers/autoDownload';\r\nimport formatBytes from '../helpers/formatBytes';\r\n\r\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\r\n\r\nlet roundVideoCircumference = 0;\r\nmediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\r\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\r\n const width = mediaSizes.active.round.width;\r\n const halfSize = width / 2;\r\n const radius = halfSize - 7;\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n elements.forEach(element => {\r\n element.setAttributeNS(null, 'width', '' + width);\r\n element.setAttributeNS(null, 'height', '' + width);\r\n\r\n const circle = element.firstElementChild as SVGCircleElement;\r\n circle.setAttributeNS(null, 'cx', '' + halfSize);\r\n circle.setAttributeNS(null, 'cy', '' + halfSize);\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n });\r\n }\r\n});\r\n\r\nexport function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, size, searchContext, autoDownload}: {\r\n doc: MyDocument, \r\n container?: HTMLElement, \r\n message?: Message.message, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n noInfo?: true,\r\n noPlayButton?: boolean,\r\n group?: string,\r\n onlyPreview?: boolean,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n autoDownload?: ChatAutoDownloadSettings,\r\n size?: PhotoSize,\r\n searchContext?: MediaSearchContext,\r\n}) {\r\n const autoDownloadSize = autoDownload?.video;\r\n let noAutoDownload = autoDownloadSize === 0;\r\n const isAlbumItem = !(boxWidth && boxHeight);\r\n const canAutoplay = /* doc.sticker || */(\r\n (\r\n doc.type !== 'video' || (\r\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && \r\n !isAlbumItem\r\n )\r\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\r\n );\r\n let spanTime: HTMLElement, spanPlay: HTMLElement;\r\n\r\n if(!noInfo) {\r\n spanTime = document.createElement('span');\r\n spanTime.classList.add('video-time');\r\n container.append(spanTime);\r\n \r\n let needPlayButton = false;\r\n if(doc.type !== 'gif') {\r\n spanTime.innerText = (doc.duration + '').toHHMMSS(false);\r\n\r\n if(!noPlayButton && doc.type !== 'round') {\r\n if(canAutoplay && !noAutoDownload) {\r\n spanTime.classList.add('tgico', 'can-autoplay');\r\n } else {\r\n needPlayButton = true;\r\n }\r\n }\r\n } else {\r\n spanTime.innerText = 'GIF';\r\n\r\n if(!canAutoplay && !noPlayButton) {\r\n needPlayButton = true;\r\n noAutoDownload = undefined;\r\n }\r\n }\r\n\r\n if(needPlayButton) {\r\n spanPlay = document.createElement('span');\r\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\r\n container.append(spanPlay);\r\n }\r\n }\r\n\r\n let res: {\r\n thumb?: typeof photoRes,\r\n loadPromise: Promise\r\n } = {} as any;\r\n\r\n if(doc.mime_type === 'image/gif') {\r\n const photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader,\r\n loadPromises,\r\n autoDownloadSize,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\r\n if(video.parentElement) {\r\n video.remove();\r\n } */\r\n\r\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\r\n\r\n const video = document.createElement('video');\r\n video.classList.add('media-video');\r\n video.setAttribute('playsinline', 'true');\r\n video.muted = true;\r\n if(doc.type === 'round') {\r\n const divRound = document.createElement('div');\r\n divRound.classList.add('media-round', 'z-depth-1');\r\n divRound.dataset.mid = '' + message.mid;\r\n divRound.dataset.peerId = '' + message.peerId;\r\n (divRound as any).message = message;\r\n\r\n const size = mediaSizes.active.round;\r\n const halfSize = size.width / 2;\r\n const strokeWidth = 3.5;\r\n const radius = halfSize - (strokeWidth * 2);\r\n divRound.innerHTML = `\r\n \r\n `;\r\n\r\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\r\n if(!roundVideoCircumference) {\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n }\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n \r\n spanTime.classList.add('tgico');\r\n\r\n const isUnread = message.pFlags.media_unread;\r\n if(isUnread) {\r\n divRound.classList.add('is-unread');\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\r\n\r\n divRound.prepend(canvas, spanTime);\r\n divRound.append(video);\r\n container.append(divRound);\r\n\r\n const ctx = canvas.getContext('2d');\r\n /* ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\r\n ctx.clip(); */\r\n\r\n const onLoad = () => {\r\n const message: Message.message = (divRound as any).message;\r\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\r\n const clear = () => {\r\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\r\n if(isInDOM(globalVideo)) {\r\n return;\r\n }\r\n \r\n globalVideo.removeEventListener('play', onPlay);\r\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.removeEventListener('pause', onPaused);\r\n globalVideo.removeEventListener('ended', onEnded);\r\n });\r\n };\r\n \r\n const onFrame = () => {\r\n ctx.drawImage(globalVideo, 0, 0);\r\n \r\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + offset;\r\n \r\n return !globalVideo.paused;\r\n };\r\n\r\n const onTimeUpdate = () => {\r\n if(!globalVideo.duration) {\r\n return;\r\n }\r\n \r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n\r\n if(globalVideo.paused) {\r\n onFrame();\r\n }\r\n \r\n spanTime.innerText = (globalVideo.duration - globalVideo.currentTime + '').toHHMMSS(false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n \r\n const onPlay = () => {\r\n video.classList.add('hide');\r\n divRound.classList.remove('is-paused');\r\n animateSingle(onFrame, canvas);\r\n \r\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\r\n preloader.onClick();\r\n }\r\n };\r\n \r\n const onPaused = () => {\r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n \r\n divRound.classList.add('is-paused');\r\n };\r\n \r\n const onEnded = () => {\r\n video.classList.remove('hide');\r\n divRound.classList.add('is-paused');\r\n \r\n video.currentTime = 0;\r\n spanTime.innerText = ('' + globalVideo.duration).toHHMMSS(false);\r\n \r\n if(globalVideo.currentTime) {\r\n globalVideo.currentTime = 0;\r\n }\r\n };\r\n \r\n globalVideo.addEventListener('play', onPlay);\r\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.addEventListener('pause', onPaused);\r\n globalVideo.addEventListener('ended', onEnded);\r\n \r\n attachClickEvent(canvas, (e) => {\r\n cancelEvent(e);\r\n \r\n // ! костыль\r\n if(preloader && !preloader.detached) {\r\n preloader.onClick();\r\n }\r\n \r\n // ! can't use it here. on Safari iOS video won't start.\r\n /* if(globalVideo.readyState < 2) {\r\n return;\r\n } */\r\n \r\n if(globalVideo.paused) {\r\n const hadSearchContext = !!searchContext;\r\n if(appMediaPlaybackController.setSearchContext(searchContext || {\r\n peerId: NULL_PEER_ID, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n useSearch: false\r\n })) {\r\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound/* , searchContext.useSearch */);\r\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\r\n }\r\n \r\n globalVideo.play();\r\n } else {\r\n globalVideo.pause();\r\n }\r\n });\r\n \r\n if(globalVideo.paused) {\r\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\r\n onFrame();\r\n onTimeUpdate();\r\n video.classList.add('hide');\r\n } else {\r\n onPaused();\r\n }\r\n } else {\r\n onPlay();\r\n }\r\n };\r\n\r\n if(message.pFlags.is_outgoing) {\r\n (divRound as any).onLoad = onLoad;\r\n divRound.dataset.isOutgoing = '1';\r\n } else {\r\n onLoad();\r\n }\r\n } else {\r\n video.autoplay = true; // для safari\r\n }\r\n\r\n let photoRes: ReturnType;\r\n if(message) {\r\n photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n autoDownloadSize: autoDownload?.photo,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n\r\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n if(withTail) {\r\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\r\n video.width = +foreignObject.getAttributeNS(null, 'width');\r\n video.height = +foreignObject.getAttributeNS(null, 'height');\r\n foreignObject.append(video);\r\n }\r\n } else { // * gifs masonry\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n if(gotThumb) {\r\n gotThumb.promise.then(() => {\r\n video.poster = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n if(!video.parentElement && container) {\r\n (photoRes?.aspecter || container).append(video);\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const isUpload = !!(message?.media as any)?.preloader;\r\n if(isUpload) { // means upload\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n preloader.attach(container, false);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n } else if(doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n cancelable: false,\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const renderDeferred = deferredPromise();\r\n video.addEventListener('error', (e) => {\r\n if(video.error.code !== 4) {\r\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\r\n }\r\n \r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n if(!renderDeferred.isFulfilled) {\r\n renderDeferred.resolve();\r\n }\r\n }, {once: true});\r\n\r\n onMediaLoad(video).then(() => {\r\n if(group) {\r\n animationIntersector.addAnimation(video, group);\r\n }\r\n\r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n renderDeferred.resolve();\r\n });\r\n\r\n if(doc.type === 'video') {\r\n video.addEventListener('timeupdate', () => {\r\n spanTime.innerText = (video.duration - video.currentTime + '').toHHMMSS(false);\r\n });\r\n\r\n if(spanPlay) {\r\n video.addEventListener('timeupdate', () => {\r\n spanPlay.remove();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n video.muted = true;\r\n video.loop = true;\r\n //video.play();\r\n video.autoplay = true;\r\n\r\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\r\n const load = () => {\r\n if(preloader && noAutoDownload && !withoutPreloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n let loadPromise: Promise = Promise.resolve();\r\n if((preloader && !isUpload) || withoutPreloader) {\r\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n const promise = loadPromise = appDocsManager.downloadDoc(doc, lazyLoadQueue?.queueId, noAutoDownload);\r\n if(preloader) {\r\n preloader.attach(container, false, promise);\r\n }\r\n } else if(doc.supportsStreaming) {\r\n if(noAutoDownload) {\r\n loadPromise = Promise.reject();\r\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\r\n preloader.attach(container, false, null);\r\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\r\n preloader.detach();\r\n }, {once: true});\r\n }\r\n }\r\n }\r\n\r\n if(!noAutoDownload && loadPhotoThumbFunc) {\r\n loadPhotoThumbFunc();\r\n loadPhotoThumbFunc = null;\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n loadPromise.then(() => {\r\n if(middleware && !middleware()) {\r\n renderDeferred.resolve();\r\n return;\r\n }\r\n\r\n if(doc.type === 'round') {\r\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\r\n }\r\n\r\n renderImageFromUrl(video, cacheContext.url);\r\n }, () => {});\r\n\r\n return {download: loadPromise, render: renderDeferred};\r\n };\r\n\r\n if(preloader && !isUpload) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n\r\n /* if(doc.size >= 20e6 && !doc.downloaded) {\r\n let downloadDiv = document.createElement('div');\r\n downloadDiv.classList.add('download');\r\n\r\n let span = document.createElement('span');\r\n span.classList.add('btn-circle', 'tgico-download');\r\n downloadDiv.append(span);\r\n\r\n downloadDiv.addEventListener('click', () => {\r\n downloadDiv.remove();\r\n loadVideo();\r\n });\r\n\r\n container.prepend(downloadDiv);\r\n\r\n return;\r\n } */\r\n\r\n if(doc.type === 'gif' && !canAutoplay) {\r\n attachClickEvent(container, (e) => {\r\n cancelEvent(e);\r\n spanPlay.remove();\r\n load();\r\n }, {capture: true, once: true});\r\n } else {\r\n res.loadPromise = !lazyLoadQueue ? load().render : (lazyLoadQueue.push({div: container, load: () => load().render}), Promise.resolve());\r\n }\r\n\r\n return res;\r\n}\r\n\r\nrootScope.addEventListener('download_start', (docId) => {\r\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n if(element.querySelector('.preloader-container.manual')) {\r\n simulateClickEvent(element);\r\n }\r\n });\r\n});\r\n\r\nexport function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue}: {\r\n message: any, \r\n withTime?: boolean,\r\n fontWeight?: number,\r\n voiceAsMusic?: boolean,\r\n showSender?: boolean,\r\n searchContext?: MediaSearchContext,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n lazyLoadQueue?: LazyLoadQueue\r\n}): HTMLElement {\r\n if(!fontWeight) fontWeight = 500;\r\n const noAutoDownload = autoDownloadSize === 0;\r\n\r\n const doc = (message.media.document || message.media.webpage.document) as MyDocument;\r\n const uploading = message.pFlags.is_outgoing && message.media?.preloader;\r\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\r\n const audioElement = new AudioElement();\r\n audioElement.withTime = withTime;\r\n audioElement.message = message;\r\n audioElement.noAutoDownload = noAutoDownload;\r\n audioElement.lazyLoadQueue = lazyLoadQueue;\r\n audioElement.loadPromises = loadPromises;\r\n \r\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\r\n if(searchContext) audioElement.searchContext = searchContext;\r\n if(showSender) audioElement.showSender = showSender;\r\n if(uploading) audioElement.preloader = message.media.preloader;\r\n\r\n audioElement.dataset.fontWeight = '' + fontWeight;\r\n audioElement.render();\r\n return audioElement;\r\n }\r\n\r\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\r\n let ext = '';\r\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \r\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \r\n 'file';\r\n\r\n let docDiv = document.createElement('div');\r\n docDiv.classList.add('document', `ext-${ext}`);\r\n docDiv.dataset.docId = '' + doc.id;\r\n\r\n const icoDiv = document.createElement('div');\r\n icoDiv.classList.add('document-ico');\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\r\n docDiv.classList.add('document-with-thumb');\r\n\r\n let imgs: HTMLImageElement[] = [];\r\n if(message.pFlags.is_outgoing) {\r\n icoDiv.innerHTML = ``;\r\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\r\n } else {\r\n const wrapped = wrapPhoto({\r\n photo: doc, \r\n message: null, \r\n container: icoDiv, \r\n boxWidth: 54, \r\n boxHeight: 54,\r\n loadPromises,\r\n withoutPreloader: true,\r\n lazyLoadQueue,\r\n size: appPhotosManager.choosePhotoSize(doc, 54, 54, true)\r\n });\r\n icoDiv.style.width = icoDiv.style.height = '';\r\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\r\n if(wrapped.images.full) imgs.push(wrapped.images.full);\r\n }\r\n\r\n imgs.forEach(img => img.classList.add('document-thumb'));\r\n } else {\r\n icoDiv.innerText = ext;\r\n }\r\n\r\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\r\n let fileName = doc.fileName || 'Unknown.file';\r\n const descriptionEl = document.createElement('div');\r\n descriptionEl.classList.add('document-description');\r\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\r\n \r\n if(withTime) {\r\n descriptionParts.push(formatFullSentTime(message.date));\r\n }\r\n\r\n if(showSender) {\r\n descriptionParts.push(appMessagesManager.wrapSenderToPeer(message));\r\n }\r\n\r\n docDiv.innerHTML = `\r\n ${cacheContext.downloaded && !uploading ? '' : `
`}\r\n
\r\n
\r\n `;\r\n\r\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\r\n const middleEllipsisEl = new MiddleEllipsisElement();\r\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\r\n middleEllipsisEl.innerHTML = fileName;\r\n\r\n nameDiv.append(middleEllipsisEl);\r\n\r\n if(showSender) {\r\n nameDiv.append(appMessagesManager.wrapSentTime(message));\r\n }\r\n\r\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\r\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\r\n\r\n docDiv.prepend(icoDiv);\r\n\r\n if(!uploading && message.pFlags.is_outgoing) {\r\n return docDiv;\r\n }\r\n\r\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\r\n const onLoad = () => {\r\n if(downloadDiv) {\r\n downloadDiv.classList.add('downloaded');\r\n const _downloadDiv = downloadDiv;\r\n setTimeout(() => {\r\n _downloadDiv.remove();\r\n }, 200);\r\n downloadDiv = null;\r\n }\r\n\r\n if(preloader) {\r\n preloader = null;\r\n }\r\n };\r\n\r\n const load = (e?: Event) => {\r\n const save = !e || e.isTrusted;\r\n const doc = appDocsManager.getDoc(docDiv.dataset.docId);\r\n let download: DownloadBlob;\r\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\r\n if(!save) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else if(doc.type === 'pdf') {\r\n const canOpenAfter = appDocsManager.downloading.has(doc.id) || cacheContext.downloaded;\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n if(canOpenAfter) {\r\n download.then(() => {\r\n setTimeout(() => { // wait for preloader animation end\r\n const url = appDownloadManager.getCacheContext(doc).url;\r\n window.open(url);\r\n }, rootScope.settings.animationsEnabled ? 250 : 0);\r\n });\r\n }\r\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else {\r\n download = appDocsManager.saveDocFile(doc, queueId);\r\n }\r\n\r\n if(downloadDiv) {\r\n download.then(onLoad);\r\n preloader.attach(downloadDiv, true, download);\r\n }\r\n\r\n return {download};\r\n };\r\n\r\n if(appDocsManager.downloading.has(doc.id)) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = new ProgressivePreloader();\r\n preloader.attach(downloadDiv, false, appDocsManager.downloading.get(doc.id));\r\n } else if(!cacheContext.downloaded || uploading) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = message.media.preloader as ProgressivePreloader;\r\n\r\n if(!preloader) {\r\n preloader = new ProgressivePreloader();\r\n\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(downloadDiv);\r\n preloader.setDownloadFunction(load);\r\n\r\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\r\n simulateClickEvent(preloader.preloader);\r\n }\r\n } else {\r\n preloader.attach(downloadDiv);\r\n message.media.promise.then(onLoad);\r\n }\r\n }\r\n\r\n attachClickEvent(docDiv, (e) => {\r\n if(preloader) {\r\n preloader.onClick(e);\r\n } else {\r\n load(e);\r\n }\r\n });\r\n\r\n return docDiv;\r\n}\r\n\r\n/* function wrapMediaWithTail(photo: MyPhoto | MyDocument, message: {mid: number, message: string}, container: HTMLElement, boxWidth: number, boxHeight: number, isOut: boolean) {\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');\r\n \r\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", 'foreignObject');\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, true);\r\n if(gotThumb) {\r\n foreignObject.append(gotThumb.image);\r\n }\r\n appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight);\r\n \r\n const width = +foreignObject.getAttributeNS(null, 'width');\r\n const height = +foreignObject.getAttributeNS(null, 'height');\r\n\r\n svg.setAttributeNS(null, 'width', '' + width);\r\n svg.setAttributeNS(null, 'height', '' + height);\r\n\r\n svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\r\n svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n\r\n const clipId = 'clip' + message.mid + '_' + nextRandomInt(9999);\r\n svg.dataset.clipId = clipId;\r\n \r\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", 'defs');\r\n let clipPathHTML: string = '';\r\n \r\n if(message.message) {\r\n //clipPathHTML += ``;\r\n } else {\r\n if(isOut) {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n } else {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n }\r\n }\r\n\r\n defs.innerHTML = `${clipPathHTML}`;\r\n \r\n container.style.width = parseInt(container.style.width) - 9 + 'px';\r\n container.classList.add('with-tail');\r\n\r\n svg.append(defs, foreignObject);\r\n container.append(svg);\r\n\r\n let img = foreignObject.firstElementChild as HTMLImageElement;\r\n if(!img) {\r\n foreignObject.append(img = new Image());\r\n }\r\n\r\n return img;\r\n} */\r\n\r\nexport function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter}: {\r\n photo: MyPhoto | MyDocument, \r\n message?: any, \r\n container: HTMLElement, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n middleware?: () => boolean, \r\n size?: PhotoSize,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n noBlur?: boolean,\r\n noThumb?: boolean,\r\n noFadeIn?: boolean,\r\n blurAfter?: boolean,\r\n}) {\r\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\r\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\r\n appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: Promise.resolve(),\r\n full: Promise.resolve()\r\n },\r\n images: {\r\n thumb: null,\r\n full: null\r\n },\r\n preloader: null,\r\n aspecter: null\r\n };\r\n }\r\n\r\n let noAutoDownload = autoDownloadSize === 0;\r\n\r\n if(!size) {\r\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\r\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\r\n }\r\n\r\n container.classList.add('media-container');\r\n let aspecter = container;\r\n\r\n let isFit = true;\r\n let loadThumbPromise: Promise = Promise.resolve();\r\n let thumbImage: HTMLImageElement;\r\n let image: HTMLImageElement;\r\n let cacheContext: ThumbCache;\r\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\r\n // if(withTail) {\r\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\r\n // } else {\r\n image = new Image();\r\n\r\n if(boxWidth && boxHeight && !size) { // !album\r\n const set = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\r\n _: 'photoSize',\r\n w: photo.w,\r\n h: photo.h,\r\n size: photo.size,\r\n type: 'full'\r\n } : undefined);\r\n size = set.photoSize;\r\n isFit = set.isFit;\r\n cacheContext = appDownloadManager.getCacheContext(photo, size.type);\r\n\r\n if(!isFit) {\r\n aspecter = document.createElement('div');\r\n aspecter.classList.add('media-container-aspecter');\r\n aspecter.style.width = set.size.width + 'px';\r\n aspecter.style.height = set.size.height + 'px';\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\r\n if(gotThumb) {\r\n loadThumbPromise = gotThumb.loadPromise;\r\n const thumbImage = gotThumb.image; // local scope\r\n thumbImage.classList.add('media-photo');\r\n container.append(thumbImage);\r\n } else {\r\n const res = wrapPhoto({\r\n container,\r\n message,\r\n photo,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n size,\r\n lazyLoadQueue,\r\n isOut,\r\n loadPromises,\r\n middleware,\r\n withoutPreloader,\r\n withTail,\r\n autoDownloadSize,\r\n noBlur,\r\n noThumb: true,\r\n blurAfter: true\r\n //noFadeIn: true\r\n });\r\n const thumbImage = res.images.full;\r\n thumbImage.classList.add('media-photo', 'thumbnail');\r\n //container.append(thumbImage);\r\n }\r\n\r\n container.classList.add('media-container-fitted');\r\n container.append(aspecter);\r\n }\r\n } else {\r\n if(!size) {\r\n size = appPhotosManager.choosePhotoSize(photo, boxWidth, boxHeight, true);\r\n }\r\n \r\n cacheContext = appDownloadManager.getCacheContext(photo, size?.type);\r\n }\r\n\r\n if(!noThumb) {\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\r\n if(gotThumb) {\r\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\r\n thumbImage = gotThumb.image;\r\n thumbImage.classList.add('media-photo');\r\n aspecter.append(thumbImage);\r\n }\r\n }\r\n // }\r\n\r\n image.classList.add('media-photo');\r\n \r\n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\r\n\r\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\r\n\r\n let preloader: ProgressivePreloader;\r\n if(message?.media?.preloader && !withoutPreloader) { // means upload\r\n preloader = message.media.preloader;\r\n preloader.attach(container);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const getDownloadPromise = () => {\r\n const promise = isGif && !size ? \r\n appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \r\n appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\r\n\r\n return promise;\r\n };\r\n\r\n const renderOnLoad = (url: string) => {\r\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\r\n };\r\n\r\n const onLoad = (): Promise => {\r\n if(middleware && !middleware()) return Promise.resolve();\r\n\r\n if(blurAfter) {\r\n return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\r\n });\r\n }\r\n\r\n return renderOnLoad(cacheContext.url);\r\n };\r\n\r\n let loadPromise: Promise;\r\n const canAttachPreloader = (\r\n (size as PhotoSize.photoSize).w >= 150 && \r\n (size as PhotoSize.photoSize).h >= 150\r\n ) || noAutoDownload;\r\n const load = () => {\r\n if(noAutoDownload && !withoutPreloader && preloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n const promise = getDownloadPromise();\r\n\r\n if(preloader && \r\n !cacheContext.downloaded && \r\n !withoutPreloader && \r\n canAttachPreloader\r\n ) {\r\n preloader.attach(container, false, promise);\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n const renderPromise = promise.then(onLoad);\r\n renderPromise.catch(() => {});\r\n return {download: promise, render: renderPromise};\r\n };\r\n\r\n if(preloader) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n \r\n if(cacheContext.downloaded) {\r\n loadThumbPromise = loadPromise = load().render;\r\n } else {\r\n if(!lazyLoadQueue) loadPromise = load().render;\r\n /* else if(noAutoDownload) {\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(container);\r\n } */ else lazyLoadQueue.push({div: container, load: () => load().download});\r\n }\r\n\r\n if(loadPromises && loadThumbPromise) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: loadThumbPromise,\r\n full: loadPromise || Promise.resolve()\r\n },\r\n images: {\r\n thumb: thumbImage,\r\n full: image\r\n },\r\n preloader,\r\n aspecter\r\n };\r\n}\r\n\r\nexport function renderImageWithFadeIn(container: HTMLElement, \r\n image: HTMLImageElement, \r\n url: string, \r\n needFadeIn: boolean, \r\n aspecter = container,\r\n thumbImage?: HTMLImageElement\r\n) {\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve) => {\r\n /* if(photo._ === 'document') {\r\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n return resolve();\r\n } */\r\n\r\n renderImageFromUrl(image, url, () => {\r\n sequentialDom.mutateElement(container, () => {\r\n aspecter.append(image);\r\n\r\n fastRaf(() => {\r\n resolve();\r\n });\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n image.classList.remove('fade-in');\r\n \r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n });\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n });\r\n}\r\n\r\n// export function renderImageWithFadeIn(container: HTMLElement, \r\n// image: HTMLImageElement, \r\n// url: string, \r\n// needFadeIn: boolean, \r\n// aspecter = container,\r\n// thumbImage?: HTMLImageElement\r\n// ) {\r\n// if(needFadeIn) {\r\n// // image.classList.add('fade-in-new', 'not-yet');\r\n// image.classList.add('fade-in');\r\n// }\r\n\r\n// return new Promise((resolve) => {\r\n// /* if(photo._ === 'document') {\r\n// console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n// return resolve();\r\n// } */\r\n\r\n// renderImageFromUrl(image, url, () => {\r\n// sequentialDom.mutateElement(container, () => {\r\n// aspecter.append(image);\r\n// // (needFadeIn ? getHeavyAnimationPromise() : Promise.resolve()).then(() => {\r\n\r\n// // fastRaf(() => {\r\n// resolve();\r\n// // });\r\n\r\n// if(needFadeIn) {\r\n// fastRaf(() => {\r\n// /* if(!image.isConnected) {\r\n// alert('aaaa');\r\n// } */\r\n// // fastRaf(() => {\r\n// image.classList.remove('not-yet');\r\n// // });\r\n// });\r\n\r\n// image.addEventListener('transitionend', () => {\r\n// sequentialDom.mutate(() => {\r\n// image.classList.remove('fade-in-new');\r\n \r\n// if(thumbImage) {\r\n// thumbImage.remove();\r\n// }\r\n// });\r\n// }, {once: true});\r\n// }\r\n// // });\r\n// });\r\n// });\r\n// });\r\n// }\r\n\r\nexport function wrapStickerAnimation({\r\n size,\r\n doc,\r\n middleware,\r\n target,\r\n side,\r\n skipRatio,\r\n play\r\n}: {\r\n size: number,\r\n doc: MyDocument,\r\n middleware?: () => boolean,\r\n target: HTMLElement,\r\n side: 'left' | 'center' | 'right',\r\n skipRatio?: number,\r\n play: boolean\r\n}) {\r\n const animationDiv = document.createElement('div');\r\n animationDiv.classList.add('emoji-animation');\r\n\r\n // const size = 280;\r\n animationDiv.style.width = size + 'px';\r\n animationDiv.style.height = size + 'px';\r\n\r\n const stickerPromise = wrapSticker({\r\n div: animationDiv,\r\n doc,\r\n middleware,\r\n withThumb: false,\r\n needFadeIn: false,\r\n loop: false,\r\n width: size,\r\n height: size,\r\n play,\r\n group: 'none',\r\n skipRatio\r\n }).then(animation => {\r\n assumeType(animation);\r\n animation.addEventListener('enterFrame', (frameNo) => {\r\n if(frameNo === animation.maxFrame) {\r\n animation.remove();\r\n animationDiv.remove();\r\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\r\n }\r\n });\r\n\r\n if(IS_VIBRATE_SUPPORTED) {\r\n animation.addEventListener('firstFrame', () => {\r\n navigator.vibrate(100);\r\n }, {once: true});\r\n }\r\n\r\n return animation;\r\n });\r\n\r\n const generateRandomSigned = (max: number) => {\r\n const r = Math.random() * max * 2;\r\n return r > max ? -r % max : r;\r\n };\r\n\r\n const randomOffsetX = generateRandomSigned(16);\r\n const randomOffsetY = generateRandomSigned(4);\r\n const stableOffsetX = size / 8 * (side === 'right' ? 1 : -1);\r\n const setPosition = () => {\r\n if(!isInDOM(target)) {\r\n return;\r\n }\r\n \r\n const rect = target.getBoundingClientRect();\r\n /* const boxWidth = Math.max(rect.width, rect.height);\r\n const boxHeight = Math.max(rect.width, rect.height);\r\n const x = rect.left + ((boxWidth - size) / 2);\r\n const y = rect.top + ((boxHeight - size) / 2); */\r\n\r\n const rectX = side === 'right' ? rect.right : rect.left;\r\n\r\n const addOffsetX = side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0) + stableOffsetX + randomOffsetX;\r\n const x = rectX + addOffsetX;\r\n // const y = rect.bottom - size + size / 4;\r\n const y = rect.top + ((rect.height - size) / 2) + (side === 'center' ? 0 : randomOffsetY);\r\n // animationDiv.style.transform = `translate(${x}px, ${y}px)`;\r\n animationDiv.style.top = y + 'px';\r\n animationDiv.style.left = x + 'px';\r\n };\r\n\r\n const onScroll = throttleWithRaf(setPosition);\r\n\r\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\r\n\r\n setPosition();\r\n\r\n appImManager.emojiAnimationContainer.append(animationDiv);\r\n\r\n return {animationDiv, stickerPromise};\r\n}\r\n\r\nexport function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic}: {\r\n doc: MyDocument, \r\n div: HTMLElement, \r\n middleware?: () => boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n group?: string, \r\n play?: boolean, \r\n onlyThumb?: boolean,\r\n emoji?: string,\r\n width?: number,\r\n height?: number,\r\n withThumb?: boolean,\r\n loop?: boolean,\r\n loadPromises?: Promise[],\r\n needFadeIn?: boolean,\r\n needUpscale?: boolean,\r\n skipRatio?: number,\r\n static?: boolean\r\n}): Promise {\r\n const stickerType = doc.sticker;\r\n if(stickerType === 1) {\r\n asStatic = true;\r\n }\r\n\r\n if(!width) {\r\n width = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(!height) {\r\n height = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(stickerType === 2) {\r\n //LottieLoader.loadLottie();\r\n LottieLoader.loadLottieWorkers();\r\n }\r\n \r\n if(!stickerType) {\r\n console.error('wrong doc for wrapSticker!', doc);\r\n throw new Error('wrong doc for wrapSticker!');\r\n }\r\n\r\n div.dataset.docId = '' + doc.id;\r\n div.classList.add('media-sticker-wrapper');\r\n\r\n /* if(stickerType === 3) {\r\n const videoRes = wrapVideo({\r\n doc,\r\n boxWidth: width,\r\n boxHeight: height,\r\n container: div,\r\n group,\r\n lazyLoadQueue,\r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n noPlayButton: true,\r\n noInfo: true\r\n });\r\n\r\n if(videoRes.thumb) {\r\n if(videoRes.thumb.images.thumb) {\r\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\r\n }\r\n\r\n if(videoRes.thumb.images.full) {\r\n videoRes.thumb.images.full.classList.add('media-sticker');\r\n }\r\n }\r\n\r\n return videoRes.loadPromise;\r\n } */\r\n \r\n //console.log('wrap sticker', doc, div, onlyThumb);\r\n\r\n let cacheContext: ThumbCache;\r\n if(asStatic && stickerType !== 1) {\r\n const thumb = appPhotosManager.choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\r\n cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\r\n } else {\r\n cacheContext = appDownloadManager.getCacheContext(doc);\r\n }\r\n\r\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\r\n const downloaded = cacheContext.downloaded && !needFadeIn;\r\n\r\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\r\n const isThumbNeededForType = isAnimated;\r\n \r\n let loadThumbPromise = deferredPromise();\r\n let haveThumbCached = false;\r\n if((\r\n doc.thumbs?.length || \r\n doc.stickerCachedThumbs\r\n ) && \r\n !div.firstElementChild && (\r\n !downloaded || \r\n isThumbNeededForType || \r\n onlyThumb\r\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\r\n ) {\r\n let thumb = doc.stickerCachedThumbs && doc.stickerCachedThumbs[toneIndex] || doc.thumbs[0];\r\n \r\n //console.log('wrap sticker', thumb, div);\r\n\r\n let thumbImage: HTMLImageElement;\r\n const afterRender = () => {\r\n if(!div.childElementCount) {\r\n thumbImage.classList.add('media-sticker', 'thumbnail');\r\n \r\n sequentialDom.mutateElement(div, () => {\r\n div.append(thumbImage);\r\n loadThumbPromise.resolve();\r\n });\r\n }\r\n };\r\n\r\n if('url' in thumb) {\r\n thumbImage = new Image();\r\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\r\n haveThumbCached = true;\r\n } else if('bytes' in thumb) {\r\n if(thumb._ === 'photoPathSize') {\r\n if(thumb.bytes.length) {\r\n const d = appPhotosManager.getPathFromPhotoPathSize(thumb);\r\n div.innerHTML = `\r\n \r\n `;\r\n } else {\r\n thumb = doc.thumbs.find(t => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\r\n }\r\n } \r\n \r\n if(thumb && thumb._ !== 'photoPathSize' && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n haveThumbCached = true;\r\n } else {\r\n webpWorkerController.convert('' + doc.id, (thumb as PhotoSize.photoStrippedSize).bytes as Uint8Array).then(bytes => {\r\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\r\n doc.pFlags.stickerThumbConverted = true;\r\n \r\n if(middleware && !middleware()) return;\r\n \r\n if(!div.childElementCount) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n }\r\n }).catch(() => {});\r\n }\r\n }\r\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\r\n thumbImage = new Image();\r\n\r\n const load = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n\r\n const r = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\r\n };\r\n \r\n if(cacheContext.url) {\r\n r();\r\n return Promise.resolve();\r\n } else {\r\n return appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\r\n }\r\n };\r\n \r\n if(lazyLoadQueue && onlyThumb) {\r\n lazyLoadQueue.push({div, load});\r\n return Promise.resolve();\r\n } else {\r\n load();\r\n\r\n if((thumb as any).url) {\r\n haveThumbCached = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(loadPromises && haveThumbCached) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n if(onlyThumb) { // for sticker panel\r\n return Promise.resolve();\r\n }\r\n \r\n const load = async() => {\r\n if(middleware && !middleware()) return;\r\n\r\n if(stickerType === 2 && !asStatic) {\r\n /* if(doc.id === '1860749763008266301') {\r\n console.log('loaded sticker:', doc, div);\r\n } */\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 500));\r\n //return;\r\n\r\n //console.time('download sticker' + doc.id);\r\n\r\n //appDocsManager.downloadDocNew(doc.id).promise.then(res => res.json()).then(async(json) => {\r\n //fetch(doc.url).then(res => res.json()).then(async(json) => {\r\n return await appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId)\r\n .then(async(blob) => {\r\n //console.timeEnd('download sticker' + doc.id);\r\n //console.log('loaded sticker:', doc, div/* , blob */);\r\n if(middleware && !middleware()) {\r\n throw new Error('wrapSticker 2 middleware');\r\n }\r\n\r\n let animation = await LottieLoader.loadAnimationWorker({\r\n container: div,\r\n loop: loop && !emoji,\r\n autoplay: play,\r\n animationData: blob,\r\n width,\r\n height,\r\n name: 'doc' + doc.id,\r\n needUpscale,\r\n skipRatio,\r\n toneIndex\r\n }, group, middleware);\r\n\r\n //const deferred = deferredPromise();\r\n \r\n animation.addEventListener('firstFrame', () => {\r\n const element = div.firstElementChild;\r\n if(needFadeIn !== false) {\r\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\r\n }\r\n\r\n const cb = () => {\r\n if(element && element !== animation.canvas) {\r\n element.remove();\r\n }\r\n };\r\n\r\n if(!needFadeIn) {\r\n if(element) {\r\n sequentialDom.mutate(cb);\r\n }\r\n } else {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.add('fade-in');\r\n if(element) {\r\n element.classList.add('fade-out');\r\n }\r\n \r\n animation.canvas.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.remove('fade-in');\r\n cb();\r\n });\r\n }, {once: true});\r\n });\r\n }\r\n\r\n if(withThumb !== false) {\r\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\r\n }\r\n\r\n //deferred.resolve();\r\n }, {once: true});\r\n \r\n if(emoji) {\r\n const data: SendMessageEmojiInteractionData = {\r\n a: [],\r\n v: 1\r\n };\r\n\r\n let sendInteractionThrottled: () => void;\r\n\r\n appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\r\n\r\n attachClickEvent(div, async(e) => {\r\n cancelEvent(e);\r\n const animation = LottieLoader.getAnimation(div);\r\n \r\n if(animation.paused) {\r\n const doc = appStickersManager.getAnimatedEmojiSoundDocument(emoji);\r\n if(doc) {\r\n const audio = document.createElement('audio');\r\n audio.style.display = 'none';\r\n div.parentElement.append(audio);\r\n\r\n try {\r\n await appDocsManager.downloadDoc(doc);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n audio.src = cacheContext.url;\r\n audio.play();\r\n await onMediaLoad(audio, undefined, true);\r\n \r\n audio.addEventListener('ended', () => {\r\n audio.src = '';\r\n audio.remove();\r\n }, {once: true});\r\n } catch(err) {\r\n \r\n }\r\n }\r\n\r\n animation.autoplay = true;\r\n animation.restart();\r\n }\r\n\r\n const peerId = appImManager.chat.peerId;\r\n if(!peerId.isUser()) {\r\n return;\r\n }\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji, true);\r\n if(!doc) {\r\n return;\r\n }\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n const isOut = bubble.classList.contains('is-out');\r\n\r\n const {animationDiv} = wrapStickerAnimation({\r\n doc,\r\n middleware,\r\n side: isOut ? 'right' : 'left',\r\n size: 280,\r\n target: div,\r\n play: true\r\n });\r\n\r\n if(bubble) {\r\n if(isOut) {\r\n animationDiv.classList.add('is-out');\r\n } else {\r\n animationDiv.classList.add('is-in');\r\n }\r\n }\r\n\r\n if(!sendInteractionThrottled) {\r\n sendInteractionThrottled = throttle(() => {\r\n const length = data.a.length;\r\n if(!length) {\r\n return;\r\n }\r\n \r\n const firstTime = data.a[0].t;\r\n \r\n data.a.forEach((a) => {\r\n a.t = (a.t - firstTime) / 1000;\r\n });\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n appMessagesManager.setTyping(appImManager.chat.peerId, {\r\n _: 'sendMessageEmojiInteraction',\r\n msg_id: appMessagesIdsManager.getServerMessageId(+bubble.dataset.mid),\r\n emoticon: emoji,\r\n interaction: {\r\n _: 'dataJSON',\r\n data: JSON.stringify(data)\r\n }\r\n }, true);\r\n \r\n data.a.length = 0;\r\n }, 1000, false);\r\n }\r\n\r\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\r\n if(e.isTrusted) {\r\n data.a.push({\r\n i: 1,\r\n t: Date.now()\r\n });\r\n \r\n sendInteractionThrottled();\r\n }\r\n });\r\n }\r\n\r\n return animation;\r\n\r\n //return deferred;\r\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\r\n });\r\n\r\n //console.timeEnd('render sticker' + doc.id);\r\n } else if(asStatic || stickerType === 3) {\r\n let media: HTMLElement;\r\n if(asStatic) {\r\n media = new Image();\r\n } else {\r\n media = document.createElement('video');\r\n media.setAttribute('playsinline', 'true');\r\n (media as HTMLVideoElement).muted = true;\r\n\r\n if(play) {\r\n (media as HTMLVideoElement).autoplay = true;\r\n (media as HTMLVideoElement).loop = true;\r\n }\r\n }\r\n\r\n const thumbImage = div.firstElementChild !== media && div.firstElementChild;\r\n if(needFadeIn !== false) {\r\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage : (!thumbImage || thumbImage.tagName === 'svg'))) && rootScope.settings.animationsEnabled;\r\n }\r\n\r\n media.classList.add('media-sticker');\r\n\r\n if(needFadeIn) {\r\n media.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const r = () => {\r\n if(middleware && !middleware()) return resolve();\r\n \r\n const onLoad = () => {\r\n sequentialDom.mutateElement(div, () => {\r\n div.append(media);\r\n if(thumbImage) {\r\n thumbImage.classList.add('fade-out');\r\n }\r\n\r\n if(stickerType === 3 && !appDocsManager.isSavingLottiePreview(doc, toneIndex)) {\r\n // const perf = performance.now();\r\n assumeType(media);\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width * window.devicePixelRatio;\r\n canvas.height = height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(media, 0, 0, canvas.width, canvas.height);\r\n appDocsManager.saveLottiePreview(doc, canvas, toneIndex);\r\n // console.log('perf', performance.now() - perf);\r\n }\r\n\r\n if(stickerType === 3 && group) {\r\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\r\n }\r\n\r\n resolve();\r\n\r\n if(needFadeIn) {\r\n media.addEventListener('animationend', () => {\r\n media.classList.remove('fade-in');\r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n };\r\n\r\n if(asStatic) {\r\n renderImageFromUrl(media, cacheContext.url, onLoad);\r\n } else {\r\n (media as HTMLVideoElement).src = cacheContext.url;\r\n onMediaLoad(media as HTMLVideoElement).then(onLoad);\r\n }\r\n };\r\n\r\n if(cacheContext.url) r();\r\n else {\r\n let promise: Promise;\r\n if(stickerType === 2 && asStatic) {\r\n const thumb = appPhotosManager.choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\r\n promise = appDocsManager.getThumbURL(doc, thumb).promise\r\n } else {\r\n promise = appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId);\r\n }\r\n \r\n promise.then(r, resolve);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || isAnimated) ? \r\n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \r\n load();\r\n\r\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\r\n loadThumbPromise = loadPromise as any;\r\n if(loadPromises) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n }\r\n\r\n return loadPromise;\r\n}\r\n\r\nexport async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height}: {\r\n set: StickerSet.stickerSet,\r\n lazyLoadQueue: LazyLoadQueue,\r\n container: HTMLElement,\r\n group: string,\r\n autoplay: boolean,\r\n width: number,\r\n height: number\r\n}) {\r\n if(set.thumbs?.length) {\r\n container.classList.add('media-sticker-wrapper');\r\n lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n const downloadOptions = appStickersManager.getStickerSetThumbDownloadOptions(set);\r\n const promise = appDownloadManager.download(downloadOptions);\r\n\r\n if(set.pFlags.animated && !set.pFlags.videos) {\r\n return promise\r\n .then((blob) => {\r\n lottieLoader.loadAnimationWorker({\r\n container,\r\n loop: true,\r\n autoplay,\r\n animationData: blob,\r\n width,\r\n height,\r\n needUpscale: true,\r\n name: 'setThumb' + set.id\r\n }, group);\r\n });\r\n } else {\r\n let media: HTMLElement;\r\n if(set.pFlags.videos) {\r\n media = document.createElement('video');\r\n media.setAttribute('playsinline', 'true');\r\n (media as HTMLVideoElement).autoplay = true;\r\n (media as HTMLVideoElement).muted = true;\r\n (media as HTMLVideoElement).loop = true;\r\n } else {\r\n media = new Image();\r\n }\r\n\r\n media.classList.add('media-sticker');\r\n \r\n return promise.then(blob => {\r\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\r\n container.append(media);\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n const stickerSet = await promise;\r\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\r\n wrapSticker({\r\n doc: stickerSet.documents[0],\r\n div: container, \r\n group: group,\r\n lazyLoadQueue\r\n }); // kostil\r\n }\r\n}\r\n\r\nexport function wrapStickerToRow({doc, row, size}: {\r\n doc: MyDocument,\r\n row: Row,\r\n size?: 'small' | 'large',\r\n}) {\r\n const previousMedia = row.media;\r\n const media = row.createMedia('small');\r\n\r\n if(previousMedia) {\r\n media.classList.add('hide');\r\n }\r\n\r\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\r\n\r\n const _size = size === 'small' ? 32 : 48;\r\n const result = wrapSticker({\r\n div: media,\r\n doc: doc,\r\n width: _size,\r\n height: _size,\r\n loadPromises\r\n });\r\n\r\n loadPromises && Promise.all(loadPromises).then(() => {\r\n media.classList.remove('hide');\r\n previousMedia.remove();\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport function wrapLocalSticker({emoji, width, height}: {\r\n doc?: MyDocument,\r\n url?: string,\r\n emoji?: string,\r\n width: number,\r\n height: number,\r\n}) {\r\n const container = document.createElement('div');\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: container,\r\n loop: false,\r\n play: true,\r\n width,\r\n height,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n return {container};\r\n}\r\n\r\nexport function wrapReply(title: Parameters[0], subtitle: Parameters[1], message?: any) {\r\n const replyContainer = new ReplyContainer('reply');\r\n replyContainer.fill(title, subtitle, message);\r\n /////////console.log('wrapReply', title, subtitle, media);\r\n return replyContainer.container;\r\n}\r\n\r\nexport function prepareAlbum(options: {\r\n container: HTMLElement,\r\n items: {w: number, h: number}[],\r\n maxWidth: number,\r\n minWidth: number,\r\n spacing: number,\r\n maxHeight?: number,\r\n forMedia?: true\r\n}) {\r\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\r\n const layout = layouter.layout();\r\n\r\n const widthItem = layout.find(item => item.sides & RectPart.Right);\r\n const width = widthItem.geometry.width + widthItem.geometry.x;\r\n\r\n const heightItem = layout.find(item => item.sides & RectPart.Bottom);\r\n const height = heightItem.geometry.height + heightItem.geometry.y;\r\n\r\n const container = options.container;\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n const children = container.children;\r\n\r\n layout.forEach(({geometry, sides}, idx) => {\r\n let div: HTMLElement;\r\n div = children[idx] as HTMLElement;\r\n if(!div) {\r\n div = document.createElement('div');\r\n container.append(div);\r\n }\r\n\r\n div.classList.add('album-item', 'grouped-item');\r\n\r\n div.style.width = (geometry.width / width * 100) + '%';\r\n div.style.height = (geometry.height / height * 100) + '%';\r\n div.style.top = (geometry.y / height * 100) + '%';\r\n div.style.left = (geometry.x / width * 100) + '%';\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Top) {\r\n div.style.borderTopLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\r\n div.style.borderBottomLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Top) {\r\n div.style.borderTopRightRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\r\n div.style.borderBottomRightRadius = 'inherit';\r\n }\r\n\r\n if(options.forMedia) {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n div.append(mediaDiv);\r\n }\r\n\r\n // @ts-ignore\r\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\r\n });\r\n\r\n /* if(options.forMedia) {\r\n layout.forEach((_, i) => {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n options.container.children[i].append(mediaDiv);\r\n });\r\n } */\r\n}\r\n\r\nexport function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload}: {\r\n groupId: string, \r\n attachmentDiv: HTMLElement,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n uploading?: boolean,\r\n isOut: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n autoDownload?: ChatAutoDownloadSettings,\r\n}) {\r\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\r\n\r\n // !lowest msgID will be the FIRST in album\r\n const storage = appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of storage) {\r\n const m = chat.getMessage(mid);\r\n const media = m.media.photo || m.media.document;\r\n\r\n const size: any = media._ === 'photo' ? appPhotosManager.choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\r\n items.push({size, media, message: m});\r\n }\r\n\r\n /* // * pending\r\n if(storage[0] < 0) {\r\n items.reverse();\r\n } */\r\n\r\n prepareAlbum({\r\n container: attachmentDiv,\r\n items: items.map(i => ({w: i.size.w, h: i.size.h})),\r\n maxWidth: mediaSizes.active.album.width,\r\n minWidth: 100,\r\n spacing: 2,\r\n forMedia: true\r\n });\r\n\r\n items.forEach((item, idx) => {\r\n const {size, media, message} = item;\r\n\r\n const div = attachmentDiv.children[idx] as HTMLElement;\r\n div.dataset.mid = '' + message.mid;\r\n div.dataset.peerId = '' + message.peerId;\r\n const mediaDiv = div.firstElementChild as HTMLElement;\r\n const isPhoto = media._ === 'photo';\r\n if(isPhoto) {\r\n wrapPhoto({\r\n photo: media,\r\n message,\r\n container: mediaDiv,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n size,\r\n loadPromises,\r\n autoDownloadSize: autoDownload.photo\r\n });\r\n } else {\r\n wrapVideo({\r\n doc: message.media.document,\r\n container: mediaDiv,\r\n message,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n autoDownload\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch}: {\r\n albumMustBeRenderedFull: boolean,\r\n message: any,\r\n messageDiv: HTMLElement,\r\n bubble: HTMLElement,\r\n uploading?: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n searchContext?: MediaSearchContext,\r\n useSearch?: boolean,\r\n}) {\r\n let nameContainer: HTMLElement;\r\n const mids = albumMustBeRenderedFull ? chat.getMidsByMid(message.mid) : [message.mid];\r\n /* if(isPending) {\r\n mids.reverse();\r\n } */\r\n\r\n mids.forEach((mid, idx) => {\r\n const message = chat.getMessage(mid);\r\n const div = wrapDocument({\r\n message,\r\n loadPromises,\r\n autoDownloadSize,\r\n lazyLoadQueue,\r\n searchContext\r\n });\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('document-container');\r\n container.dataset.mid = '' + mid;\r\n container.dataset.peerId = '' + message.peerId;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.classList.add('document-wrapper');\r\n \r\n if(message.message) {\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('document-message');\r\n\r\n const richText = RichTextProcessor.wrapRichText(message.message, {\r\n entities: message.totalEntities\r\n });\r\n\r\n messageDiv.innerHTML = richText;\r\n wrapper.append(messageDiv);\r\n }\r\n\r\n if(mids.length > 1) {\r\n const selection = document.createElement('div');\r\n selection.classList.add('document-selection');\r\n container.append(selection);\r\n \r\n container.classList.add('grouped-item');\r\n\r\n if(idx === 0) {\r\n nameContainer = wrapper;\r\n }\r\n }\r\n\r\n wrapper.append(div);\r\n container.append(wrapper);\r\n messageDiv.append(container);\r\n });\r\n\r\n if(mids.length > 1) {\r\n bubble.classList.add('is-multiple-documents', 'is-grouped');\r\n }\r\n\r\n return nameContainer;\r\n}\r\n\r\nexport function wrapPoll(message: any) {\r\n const elem = new PollElement();\r\n elem.message = message;\r\n elem.setAttribute('peer-id', '' + message.peerId);\r\n elem.setAttribute('poll-id', message.media.poll.id);\r\n elem.setAttribute('message-id', '' + message.mid);\r\n elem.render();\r\n return elem;\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 whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\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 insertInDescendSortedArray from \"./array/insertInDescendSortedArray\";\nimport { getMiddleware } from \"./middleware\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach(element => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(id: SortedElementId, batch = false, updateElementWith?: SortedList['updateElementWith'], updateBatch = batch) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public update(id: SortedElementId, batch = false, element = this.get(id), updateElementWith?: SortedList['updateElementWith']) {\n if(!element) {\n return;\n }\n\n element.index = this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\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 { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\nimport appDialogsManager, { AppDialogsManager, DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\nimport safeAssign from \"../helpers/object/safeAssign\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> = {}) {\n super({\n getIndex: options.getIndex || ((element) => appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || ((element) => {\n const status = appUsersManager.getUserStatusString(element.id);\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\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 SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport { cancelEvent } from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\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 { cancelContextMenuOpening } from \"../../components/misc\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\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 appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\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 appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\n\nexport default class PopupDeleteMessages {\n constructor(peerId: PeerId, mids: number[], type: ChatType, onConfirm?: () => void) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = appChatsManager.getChat(peerId.toChatId());\n\n const hasRights = appChatsManager.hasRights(peerId.toChatId(), 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = hasRights ? mids.slice() : mids.filter(mid => {\n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\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 appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { PopupButton } from \".\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n let title: string, description: string, buttons: PopupButton[] = [];\n\n title = `Send Message${mids.length > 1 ? 's' : ''} Now`;\n description = mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?';\n\n const callback = () => {\n onConfirm && onConfirm();\n appMessagesManager.sendScheduledMessages(peerId, mids);\n };\n\n buttons.push({\n langKey: 'Send',\n callback\n });\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n title,\n description,\n buttons\n });\n\n popup.show();\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\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachContextMenuListener } from \"../misc\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n//const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected appMessagesManager: AppMessagesManager;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n\n constructor(options: {\n appMessagesManager: AppMessagesManager,\n listenElement: HTMLElement,\n listenerSetter: ListenerSetter,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(this.listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n this.listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, this.listenerSetter);\n\n return;\n }\n\n const getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n this.listenerSetter.add(this.listenElement)('mousedown', (e) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n \n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(!seenSet.has(mid)) {\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach(element => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n });\n }\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storage = this.isScheduled ? this.appMessagesManager.getScheduledMessagesStorage(peerId) : this.appMessagesManager.getMessagesStorage(peerId);\n for(const mid of mids) {\n const message = this.appMessagesManager.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.appMessagesManager.canForward(message);\n }\n \n if(!cantDelete) {\n cantDelete = !this.appMessagesManager.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = (doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n if(diff < 0) {\n toast(I18n.format('Chat.Selection.LimitToast', true));\n return false;\n /* const it = this.selectedMids.values();\n do {\n const mid = it.next().value;\n const mounted = this.appImManager.getMountedBubble(mid);\n if(mounted) {\n this.toggleByBubble(mounted.bubble);\n } else {\n const mids = this.appMessagesManager.getMidsByMid(mid);\n for(const mid of mids) {\n this.selectedMids.delete(mid);\n }\n }\n } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach(mid => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: searchSuper.container,\n listenerSetter: new ListenerSetter(),\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach(element => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', () => this.cancelSelection(), {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n rootScope.dispatchEvent('history_focus', {\n peerId,\n mid\n });\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(private chat: Chat, private bubbles: ChatBubbles, private input: ChatInput, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: bubbles.bubblesContainer,\n listenerSetter: bubbles.listenerSetter,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach(item => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement) => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.bubbles.peerId);\n if(set) {\n const mids = this.chat.getMidsByMid(mid);\n mids.forEach(mid => set.delete(mid));\n }\n }\n\n this.bubbles.getBubbleGroupedItems(bubble).forEach(this.toggleByElement);\n return;\n }\n\n if(!this.toggleMid(this.bubbles.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(mid);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.bubbles.peerId, mid));\n };\n\n protected toggleByMid = (peerId: PeerId, mid: number) => {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(+element.dataset.mid));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected isGroupedMidsSelected(mid: number) {\n const mids = this.chat.getMidsByMid(mid);\n const selectedMids = mids.filter(mid => this.isMidSelected(this.bubbles.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && \n !bubble.classList.contains('is-outgoing') && \n !bubble.classList.contains('bubble-first') && \n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = this.chat.input.center(animate);\n\n SetTransition(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n this.selectionLeft = \n this.selectionRight = \n null;\n this.selectedText = undefined;\n }\n \n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n });\n\n //const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n \n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = () => {\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n //this.toggleByBubble(mounted.message.grouped_id ? mounted.bubble.querySelector(`.grouped-item[data-mid=\"${mid}\"]`) : mounted.bubble);\n this.toggleByElement(mounted.bubble);\n }\n /* const bubble = this.appImManager.bubbles[mid];\n if(bubble) {\n this.toggleByBubble(bubble);\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\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\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 appChatsManager from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport { logger } from \"../lib/logger\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { attachContextMenuListener, openBtnMenu, positionMenu, putPreloader } from \"./misc\";\nimport { ripple } from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants, Message, MessageMedia, Photo, WebPage } from \"../layer\";\nimport SortedUserList from \"./sortedUserList\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appSidebarRight from \"./sidebarRight\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport cleanSearchText from \"../helpers/cleanSearchText\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport handleTabSwipe from \"../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../helpers/windowSize\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupForward from \"./popups/forward\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport Row from \"./row\";\nimport htmlToDocumentFragment from \"../helpers/dom/htmlToDocumentFragment\";\nimport { SearchSelection } from \"./chat/selection\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, simulateClickEvent } from \"../helpers/dom/clickEvent\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport AppMediaViewer from \"./appMediaViewer\";\nimport lockTouchScroll from \"../helpers/dom/lockTouchScroll\";\nimport copy from \"../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../helpers/object/getObjectKeysAndSort\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport escapeRegExp from \"../helpers/string/escapeRegExp\";\nimport limitSymbols from \"../helpers/string/limitSymbols\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n this.buttons.forEach(button => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n });\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: () => appMessagesManager.canForward(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => appMessagesManager.canDeleteMessage(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n rootScope.dispatchEvent('history_focus', {\n peerId: this.peerId,\n mid: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message, \n middleware: () => boolean, \n promises: Promise[], \n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n \n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n public urlsToRevoke: string[] = [];\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n \n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, appMessagesManager);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && !this.loaded[this.mediaTab.inputFilter]/* && false */) {\n //this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n //this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n return;\n }\n \n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n \n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = (className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map(el => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map(k => +k).sort((a, b) => a - b);\n const idx = targets.findIndex(item => item.mid === mid && item.peerId === peerId);\n \n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n if(type === 'inputMessagesFilterEmpty') return messages;\n\n if(type !== 'inputMessagesFilterUrl') {\n messages = messages.filter(message => !!message.media);\n }\n\n /* if(!this.peerId) {\n messages = messages.filter(message => {\n if(message.peerId === rootScope.myId) {\n return true;\n }\n\n const dialog = appMessagesManager.getDialogByPeerId(message.fromId)[0];\n return dialog && dialog.folder_id === 0;\n });\n } */\n\n let filtered: any[] = [];\n\n switch(type) {\n case 'inputMessagesFilterPhotoVideo': {\n for(let message of messages) {\n let media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n if(!media) {\n //this.log('no media!', message);\n continue;\n }\n \n if(media._ === 'document' && media.type !== 'video'/* && media.type !== 'gif' */) {\n //this.log('broken video', media);\n continue;\n }\n\n filtered.push(message);\n }\n \n break;\n }\n\n case 'inputMessagesFilterDocument': {\n for(let message of messages) {\n if(!message.media.document || ['voice', 'audio', 'gif', 'sticker', 'round'].includes(message.media.document.type)) {\n continue;\n }\n \n filtered.push(message);\n }\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n //this.log('inputMessagesFilterUrl', messages);\n for(let message of messages) {\n //if((message.media.webpage && message.media.webpage._ !== 'webPageEmpty')) {\n filtered.push(message);\n //}\n }\n \n break;\n }\n\n case 'inputMessagesFilterMusic': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'audio') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterVoice': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'voice') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterRoundVoice': {\n for(let message of messages) {\n if(!message.media.document || !(['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n default:\n break;\n }\n\n return filtered;\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: message.peerId, \n container: searchGroup.list, \n drawStatus: false,\n avatarSize: 54\n });\n\n appDialogsManager.setLastMessage(dialog, message, dom, this.searchContext.query);\n }\n\n private processPhotoVideoFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: ReturnType;\n const size = appPhotosManager.choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n }).thumb;\n } else {\n wrapped = wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach(image => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n elemsToAppend.push({element: div, message});\n }\n\n private processDocumentFilter({message, elemsToAppend, inputFilter}: ProcessSearchSuperResult) {\n const document = appMessagesManager.getMediaFromMessage(message);\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n const div = wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n elemsToAppend.push({element: div, message});\n }\n\n private processUrlFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n let webpage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage;\n\n if(!webpage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = RichTextProcessor.matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n //display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webpage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webpage.description = message.message;\n webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\n }\n }\n\n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: appPhotosManager.choosePhotoSize(webpage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\n const aFragment = htmlToDocumentFragment(RichTextProcessor.wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', appMessagesManager.wrapSenderToPeer(message));\n }\n \n if(!title) {\n //title = new URL(webpage.url).hostname;\n title = RichTextProcessor.wrapPlainText(webpage.display_url.split('/', 1)[0]);\n }\n\n const row = new Row({\n title,\n titleRight: appMessagesManager.wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n elemsToAppend.push({element: row.container, message});\n }\n }\n \n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n \n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n for(const message of messages) {\n try {\n options.message = message;\n processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n }\n }\n \n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach(details => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach(child => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.forEach((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const peer = appPeersManager.getPeer(peerId);\n \n //////////this.log('contacts peer', peer);\n \n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId, \n container: group.list, \n drawStatus: false,\n avatarSize: 48,\n autonomous: group.autonomous\n });\n \n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(appProfileManager.getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n \n appMessagesManager.getConversations(query, 0, 20, 0).promise\n .then(onLoad)\n .then(value => {\n if(value) {\n setResults(value.dialogs.map(d => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return appStateManager.getState().then(state => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(peerId => {\n let {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.searchGroups.recent.list,\n drawStatus: false,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(peerId.isUser() ? appUsersManager.getUserStatusString(peerId) : appProfileManager.getChatMembersString(peerId.toChatId()));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n appUsersManager.getTopPeers('correspondents').then(peers => {\n if(!middleware()) return;\n\n const idx = peers.findIndex(peer => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n dialog: peer.id, \n container: this.searchGroups.people.list, \n drawStatus: false,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({lazyLoadQueue: this.lazyLoadQueue, rippleEnabled: false});\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, 'LI');\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n participants.forEach(participant => {\n const peerId = appChatsManager.getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n return;\n }\n\n const user = appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n return;\n }\n\n this.membersList.add(peerId);\n });\n };\n\n if(appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then(participants => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = Promise.resolve(appProfileManager.getChatFull(id)).then(chatFull => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const logStr = 'load [' + type + ']: ';\n\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n //this.log(logStr + 'will render from cache', used, history, ids, loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n messages.push(...this.filterMessagesByType(ids.map(m => appMessagesManager.getMessageByPeer(m.peerId, m.mid)), type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n\n return Promise.resolve();\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n \n //this.log(logStr + 'search house of glass pre', type, maxId);\n \n //let loadCount = history.length ? 50 : 15;\n return this.loadPromises[type] = appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ?? (this.nextRates[type] = 0)\n }).then(value => {\n history.push(...value.history.map(m => ({mid: m.mid, peerId: m.peerId})));\n \n this.log(logStr + 'search house of glass', type, value);\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return Promise.resolve();\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n (this.loadPromises[type] || Promise.resolve()).then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch(err => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n }\n \n public async load(single = false, justLoad = false) {\n // if(testScroll/* || 1 === 1 */) {\n // return;\n // }\n\n //return;\n \n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n if(this.hideEmptyTabs) {\n const mediaTabs = this.mediaTabs.filter(mediaTab => mediaTab.inputFilter !== 'inputMessagesFilterEmpty')\n const filters = mediaTabs.map(mediaTab => ({_: mediaTab.inputFilter}));\n\n const counters = await appMessagesManager.getSearchCounters(peerId, filters);\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach(mediaTab => {\n const counter = counters.find(c => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count && firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n if(counter.count) ++count;\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n const canViewMembers = this.canViewMembers();\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter(t => t !== this.mediaTab);\n toLoad = toLoad.filter(mediaTab => {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n });\n\n if(peerId.isUser()) {\n toLoad.findAndSplice(mediaTab => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map(mediaTab => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware)\n });\n\n return Promise.all(promises).catch(err => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return this.searchContext.peerId.isAnyChat() && !appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()) && appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants');\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach(mediaTab => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach(mediaTab => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach(url => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\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 { cancelEvent } from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\n\r\nexport enum PrivacyType {\r\n Everybody = 2,\r\n Contacts = 1,\r\n Nobody = 0\r\n}\r\n\r\nexport class AppPrivacyManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map(inputRule => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacyRulesDetails(rules: PrivacyRule[]) {\r\n const types: PrivacyType[] = [];\r\n\r\n type peers = {users: UserId[], chats: ChatId[]};\r\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\r\n rules.forEach(rule => {\r\n switch(rule._) {\r\n case 'privacyValueAllowAll':\r\n types.push(2);\r\n break;\r\n case 'privacyValueDisallowAll':\r\n types.push(0);\r\n break;\r\n case 'privacyValueAllowContacts': \r\n types.push(1);\r\n break;\r\n /* case 'privacyValueDisallowContacts':\r\n types.push('Except My Contacts');\r\n break; */\r\n case 'privacyValueAllowChatParticipants':\r\n allowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueAllowUsers':\r\n allowPeers.users.push(...rule.users);\r\n break;\r\n case 'privacyValueDisallowChatParticipants':\r\n disallowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueDisallowUsers':\r\n disallowPeers.users.push(...rule.users);\r\n break;\r\n }\r\n });\r\n\r\n return {type: types[0], disallowPeers, allowPeers};\r\n }\r\n}\r\n\r\nconst appPrivacyManager = new AppPrivacyManager();\r\nMOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;\r\nexport default appPrivacyManager;\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 { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../lib/appManagers/appPrivacyManager\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\ntype PrivacySectionStr = LangPackKey | '';\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey]\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter(r => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n new AppAddMembersTab(options.tab.slider).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = appPrivacyManager.getPrivacy(options.inputKey).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach(k => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map(id => id.toPeerId()));\r\n arr.push(...from.chats.map(id => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', () => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>).forEach(([k, chatKey, usersKey], idx) => {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({_: usersKey, users: splitted.users.map(id => appUsersManager.getUserInput(id))});\r\n }\r\n }\r\n });\r\n }\r\n \r\n appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach(peerId => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\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 { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const phoneCaption: LangPackKey = 'PrivacyPhoneInfo';\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [phoneCaption, phoneCaption, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n }\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\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 { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: true,\r\n play: true,\r\n width: 160,\r\n height: 160\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\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_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n passwordManager.confirmPasswordEmail('' + code)\r\n .then(value => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch(err => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n passwordManager.cancelPasswordEmail().then(value => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n passwordManager.resendPasswordEmail().then(value => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = RichTextProcessor.matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationHintTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\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 AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return passwordManager.getState().then(_state => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n passwordInputField.label.innerHTML = RichTextProcessor.wrapEmojiText(this.state.hint);\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n passwordManager.check(passwordInputField.value, this.state).then(auth => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = new AppTwoStepVerificationTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\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 { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\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 { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport { toast } from \"../../toast\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = authorizations.findAndSplice(auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n apiManager.invokeApi('auth.resetAuthorizations').then(value => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n \r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach(auth => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then(value => {\r\n if(value) {\r\n target.remove();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\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 { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n {\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n this.scrollable.append(list);\r\n\r\n const add = (peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, 'LI');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then(res => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\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 { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../../../lib/appManagers/appPrivacyManager\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport passwordManager from \"../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport appDraftsManager from \"../../../lib/appManagers/appDraftsManager\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppBlockedUsersTab(this.slider);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = new AppTwoStepVerificationTab(this.slider);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.updateActiveSessions();\r\n }, {once: true});\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice(p => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n appUsersManager.getBlocked().then(res => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n passwordManager.getState().then(state => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyPhoneNumberTab(this.slider).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyLastSeenTab(this.slider).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyProfilePhotoTab(this.slider).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyCallsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyForwardMessagesTab(this.slider).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyAddToGroupsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n appPrivacyManager.getPrivacy(key).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(\r\n numberVisibilityRow.container, \r\n lastSeenTimeRow.container, \r\n photoVisibilityRow.container, \r\n callRow.container, \r\n linkAccountRow.container, \r\n groupChatsAddRow.container\r\n );\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(apiManager.invokeApi('account.getContentSettings').then(settings => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then(drafts => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n apiManager.invokeApi('account.getAuthorizations').then(auths => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\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 renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\r\n const context = canvas.getContext('2d');\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n return outPixel;\r\n}\r\n\r\nexport function averageColor(imageUrl: string) {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n resolve(averageColorFromCanvas(canvas));\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 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, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let 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","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\nimport { hexToRgb } from \"../../helpers/color\";\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n /* private readonly _curve = [ \n 0, 25, 50, 75, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, \n 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1830, 1860, 1890, 1920, \n 1950, 1980, 2010, 2040, 2070, 2100, 2130, 2160, 2190, 2220, 2250, 2280, 2310, \n 2340, 2370, 2400, 2430, 2460, 2490, 2520, 2550, 2580, 2610, 2630, 2640, 2650, \n 2660, 2670, 2680, 2690, 2700\n ]; */\n private readonly _curve = [\n 0 , 0.25 , 0.50 , 0.75 , 1 , 1.5 , 2 , 2.5 , 3 , 3.5 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ,\n 13 , 14 , 15 , 16 , 17 , 18 , 18.3 , 18.6 , 18.9 , 19.2 , 19.5 , 19.8 , 20.1 , 20.4 , 20.7 ,\n 21.0 , 21.3 , 21.6 , 21.9 , 22.2 , 22.5 , 22.8 , 23.1 , 23.4 , 23.7 , 24.0 , 24.3 , 24.6 ,\n 24.9 , 25.2 , 25.5 , 25.8 , 26.1 , 26.3 , 26.4 , 26.5 , 26.6 , 26.7 , 26.8 , 26.9 , 27 ,\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n { x: 0.80, y: 0.10 },\n { x: 0.60, y: 0.20 },\n { x: 0.35, y: 0.25 },\n { x: 0.25, y: 0.60 },\n { x: 0.20, y: 0.90 },\n { x: 0.40, y: 0.80 },\n { x: 0.65, y: 0.75 },\n { x: 0.75, y: 0.40 }\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n while(shift > 0) {\n positions.push(positions.shift());\n --shift;\n }\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n \n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax,\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n \n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n \n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private drawOnWheel = () => {\n let diff = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n diff = diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n if(diff) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = () => {\n const frames = this._frames;\n const id = frames.shift();\n if(id) {\n this.drawImageData(id);\n }\n \n const leftLength = frames.length;\n if(!leftLength) {\n this._animatingToNextPosition = undefined;\n }\n\n return !!leftLength;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map(color => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d');\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d');\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n \n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition() {\n if(this._colors.length < 2) {\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n \n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n \n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n \n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animate(this.drawNextPositionAnimated);\n }\n\n public scrollAnimate(start?: boolean) {\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","import { ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla } from \"../helpers/color\";\r\nimport attachGrabListeners from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\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 { SettingSection } from \"..\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStateManager, { Theme } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach(color => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n \r\n background.id = '2';\r\n background.intensity = 0;\r\n background.slug = '';\r\n background.color = hex.toLowerCase();\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n const color = (background.color || '').split(',')[0];\r\n const isColored = !!color && !background.slug;\r\n \r\n // * set active if type is color\r\n if(isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(color || '#cccccc');\r\n \r\n if(!isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\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 { generateSection } from \"..\";\r\nimport { averageColor, averageColorFromCanvas } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { requestFile } from \"../../../helpers/files\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport ChatBackgroundGradientRenderer from \"../../chat/gradientRenderer\";\r\nimport { AccountWallPapers, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager, { DownloadBlob } from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appPhotosManager from \"../../../lib/appManagers/appPhotosManager\";\r\nimport appStateManager, { Theme, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\n\r\nlet uploadTempId = 0;\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private theme: Theme;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n private wallpapersByElement: Map = new Map();\r\n private elementsByKey: Map = new Map();\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n new AppBackgroundColorTab(this.slider).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', () => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n const wallpaper = this.wallpapersByElement.get(active);\r\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\r\n return;\r\n }\r\n \r\n this.setBackgroundDocument(wallpaper);\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\r\n const wallpapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallpapers.forEach((wallpaper) => {\r\n this.addWallPaper(wallpaper);\r\n });\r\n\r\n //console.log(accountWallpapers);\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(file => {\r\n const id = 'wallpaper-upload-' + ++uploadTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: 'full',\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = appDocsManager.saveDoc(document);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = URL.createObjectURL(file);\r\n\r\n let wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n const upload = appDownloadManager.upload(file, file.name);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = upload.addNotifyListener;\r\n deferred.cancel = upload.cancel;\r\n\r\n upload.then(inputFile => {\r\n apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n }\r\n }).then(_wallpaper => {\r\n const newDoc = (_wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const newCacheContext = appDownloadManager.getCacheContext(newDoc);\r\n Object.assign(newCacheContext, cacheContext);\r\n\r\n wallpaper = _wallpaper as WallPaper.wallPaper;\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n this.setBackgroundDocument(wallpaper).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n }, deferred.reject);\r\n\r\n const key = this.getWallpaperKey(wallpaper);\r\n deferred.then(() => {\r\n this.clicked.delete(key);\r\n }, (err) => {\r\n container.remove();\r\n //console.error('i saw the body drop', err);\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallpaper, false);\r\n this.clicked.add(key);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find(t => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private getColorsFromWallpaper(wallpaper: WallPaper) {\r\n return wallpaper.settings ? [\r\n wallpaper.settings.background_color,\r\n wallpaper.settings.second_background_color,\r\n wallpaper.settings.third_background_color,\r\n wallpaper.settings.fourth_background_color\r\n ].filter(Boolean).map(color => '#' + color.toString(16)).join(',') : '';\r\n }\r\n\r\n private getWallpaperKey(wallpaper: WallPaper) {\r\n return '' + wallpaper.id;\r\n }\r\n\r\n private getWallpaperKeyFromTheme(theme: Theme) {\r\n return '' + theme.background.id;\r\n }\r\n\r\n private addWallPaper(wallpaper: WallPaper, append = true) {\r\n const colors = this.getColorsFromWallpaper(wallpaper);\r\n const hasFile = wallpaper._ === 'wallPaper';\r\n if((hasFile && wallpaper.pFlags.pattern && !colors)/* || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\r\n return;\r\n }\r\n\r\n const isDark = !!wallpaper.pFlags.dark;\r\n\r\n const doc: MyDocument = hasFile ? (wallpaper.document = appDocsManager.saveDoc(wallpaper.document)) : undefined;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n container.dataset.id = '' + wallpaper.id;\r\n\r\n const key = this.getWallpaperKey(wallpaper);\r\n this.wallpapersByElement.set(container, wallpaper);\r\n this.elementsByKey.set(key, container);\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n let wrapped: ReturnType, size: PhotoSize;\r\n if(hasFile) {\r\n size = appPhotosManager.choosePhotoSize(doc, 200, 200);\r\n wrapped = wrapPhoto({\r\n photo: doc,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: size,\r\n noFadeIn: wallpaper.pFlags.pattern\r\n });\r\n\r\n (wrapped.loadPromises.thumb || wrapped.loadPromises.full).then(() => {\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n\r\n if(wallpaper.pFlags.pattern) {\r\n media.classList.add('is-pattern');\r\n \r\n if(isDark) {\r\n wrapped.images.full.style.display = 'none';\r\n if(wrapped.images.thumb) {\r\n wrapped.images.thumb.style.display = 'none';\r\n }\r\n } else if(wallpaper.settings?.intensity) {\r\n wrapped.images.full.style.opacity = '' + Math.abs(wallpaper.settings.intensity) / 100;\r\n }\r\n }\r\n } else {\r\n container.append(media);\r\n }\r\n\r\n if(wallpaper.settings && wallpaper.settings.background_color !== undefined) {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\r\n canvas.classList.add('background-colors-canvas');\r\n \r\n if(isDark && hasFile) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n wrapped.loadPromises.full.then(() => {\r\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\r\n canvas.style.opacity = '' + Math.abs(wallpaper.settings.intensity) / 100;\r\n media.append(canvas);\r\n });\r\n } else {\r\n media.append(canvas);\r\n }\r\n }\r\n\r\n if(this.getWallpaperKeyFromTheme(this.theme) === key) {\r\n container.classList.add('active');\r\n }\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const wallpaper = this.wallpapersByElement.get(target);\r\n if(wallpaper._ === 'wallPaperNoFile') {\r\n this.setBackgroundDocument(wallpaper);\r\n return;\r\n }\r\n \r\n const key = this.getWallpaperKey(wallpaper);\r\n if(this.clicked.has(key)) return;\r\n this.clicked.add(key);\r\n \r\n const doc = wallpaper.document as MyDocument;\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const load = () => {\r\n const promise = this.setBackgroundDocument(wallpaper);\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then(response => {\r\n appDownloadManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (wallpaper: WallPaper) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const doc = (wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const deferred = deferredPromise();\r\n let download: Promise | DownloadBlob;\r\n if(doc) {\r\n download = appDocsManager.downloadDoc(doc, appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0);\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n } else {\r\n download = Promise.resolve();\r\n }\r\n\r\n download.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url?: string) => {\r\n //const perf = performance.now();\r\n let getPixelPromise: Promise;\r\n if(url && !this.theme.background.color) {\r\n getPixelPromise = averageColor(url);\r\n } else {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(this.getColorsFromWallpaper(wallpaper));\r\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\r\n }\r\n\r\n getPixelPromise.then((pixel) => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n \r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n // const hsla = 'rgba(0, 0, 0, 0.3)';\r\n //console.log(doc, hsla, performance.now() - perf);\r\n\r\n const slug = (wallpaper as WallPaper.wallPaper).slug ?? '';\r\n background.id = wallpaper.id;\r\n background.intensity = wallpaper.settings?.intensity ?? 0;\r\n background.color = this.getColorsFromWallpaper(wallpaper);\r\n background.slug = slug;\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n if(slug) {\r\n this.saveToCache(slug, url);\r\n }\r\n\r\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\r\n });\r\n };\r\n\r\n if(!doc) {\r\n onReady();\r\n return;\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const target = this.elementsByKey.get(this.getWallpaperKeyFromTheme(this.theme));\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\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 PopupElement from \".\";\r\nimport appStickersManager, { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../misc\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { toastNew } from \"../toast\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return appStickersManager.getStickerSet(this.stickerSetInput).then(set => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n this.h6.innerHTML = RichTextProcessor.wrapEmojiText(set.set.title);\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\r\n}\r\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\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 { SettingSection } from \"..\";\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\nimport RadioField from \"../../radioField\";\nimport Row, { RadioFormFromRows } from \"../../row\";\nimport SliderSuperTab from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n appReactionsManager.getQuickReaction(),\n appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter(reaction => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction === quickReaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n appReactionsManager.setDefaultReaction(value);\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\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 { generateSection, SettingSection } from \"..\";\r\nimport RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport appStateManager, { State } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { wrapStickerSetThumb, wrapStickerToRow } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport IS_GEOLOCATION_SUPPORTED from \"../../../environment/geolocationSupport\";\r\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\r\nimport AppQuickReactionTab from \"./quickReaction\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n public valueContainer: HTMLElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(\r\n name: LangPackKey, \r\n step: number, \r\n initialValue: number, \r\n minValue: number, \r\n maxValue: number,\r\n writeValue = true\r\n ) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = this.valueContainer = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n\r\n if(writeValue) {\r\n valueDiv.innerHTML = '' + initialValue;\r\n }\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step, \r\n min: minValue, \r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n if(writeValue) {\r\n //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n new AppBackgroundTab(this.slider).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers', \r\n name, \r\n value: 'kilometers', \r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles', \r\n stateKey\r\n })\r\n });\r\n \r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'], \r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey, \r\n name, \r\n value: format, \r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString(\"en-us-u-hc-\" + format, {\r\n hour: '2-digit', \r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map(row => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\r\n\r\n const reactionsRow = new Row({\r\n titleLangKey: 'DoubleTapSetting',\r\n havePadding: true,\r\n clickable: () => {\r\n new AppQuickReactionTab(this.slider).open();\r\n }\r\n });\r\n\r\n const renderQuickReaction = () => {\r\n Promise.resolve(appReactionsManager.getQuickReaction()).then(reaction => {\r\n wrapStickerToRow({\r\n row: reactionsRow,\r\n doc: reaction.static_icon,\r\n size: 'small'\r\n });\r\n });\r\n };\r\n\r\n renderQuickReaction();\r\n\r\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const stickersContent = section.generateContentElement();\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n stickersContent[method](row.container);\r\n };\r\n\r\n appStickersManager.getAllStickers().then(allStickers => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n section.content.append(reactionsRow.container, suggestCheckboxField.label, loopCheckboxField.label);\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\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 eachTimeout from \"./eachTimeout\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\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 ctx from \"../environment/ctx\";\nimport noop from \"./noop\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\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 appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { generateSection, SettingSection } from \"..\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: 70\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n });\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = appUsersManager.getSelf();\r\n\r\n const userFull = await appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\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 { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = peerIds.map(peerId => appPeersManager.getInputPeerById(peerId));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter(peerId => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.dialogsByFilters.set(filter, new Set(appMessagesManager.dialogsStorage.getFolderDialogs(filter.id).map(d => d.peerId)));\r\n }\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await appUsersManager.getContacts();\r\n peerIds.forEach(peerId => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: this.selector.scrollable,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n span.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach(el => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n /////////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container, \r\n onChange: this.onSelectChange, \r\n peerType: ['dialogs'], \r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats'\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\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 appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport InputField from \"../../inputField\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, i18n_, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport deepEqual from \"../../../helpers/object/deepEqual\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n appMessagesManager.filtersStorage.updateDialogFilter(this.filter, true).then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach(o => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = appMessagesManager.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = appMessagesManager.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch(err => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = RichTextProcessor.wrapDraftText(filter.title);\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(key => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList();\r\n\r\n const peers = filter[key].slice();\r\n\r\n const renderMore = (_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: ul,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach(el => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') this.onEditOpen();\r\n else this.onCreateOpen();\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 { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private renderFolder(dialogFilter: DialogFilterSuggested | DialogFilter | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: DialogFilter | MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach(key => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n for(const dialog of folder) {\r\n if(appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, () => {\r\n new AppEditFolderTab(this.slider).open(appMessagesManager.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, () => {\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n new AppEditFolderTab(this.slider).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return apiManager.invokeApi('messages.getSuggestedDialogFilters').then(suggestedFilters => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach(el => el.remove());\r\n\r\n suggestedFilters.forEach(filter => {\r\n const div = this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n appMessagesManager.filtersStorage.createDialogFilter(f, true).then(bool => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n });\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 { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport appStateManager from \"../../../lib/appManagers/appStateManager\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = () => {\r\n const muted = appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === appNotificationsManager.isMuted(notifySettings) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? 0x7FFFFFFF : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n appNotificationsManager.getContactSignUpNotification().then(enabled => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\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 { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then(langPack => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\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 { addCancelButton } from \"./popups\";\nimport PopupPeer, { PopupPeerOptions } from \"./popups/peer\";\n\n// type PopupConfirmationOptions = Pick;\ntype PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\n };\n\n const buttons = addCancelButton([button]);\n const cancelButton = buttons.find(button => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes = checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\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 { SettingSection } from \"../..\";\nimport { LangPackKey } from \"../../../../lib/langPack\";\nimport CheckboxField from \"../../../checkboxField\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts', \n name: 'contacts',\n stateKey: key + 'contacts',\n withRipple: true\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats', \n name: 'private',\n stateKey: key + 'private',\n withRipple: true\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats', \n name: 'groups',\n stateKey: key + 'groups',\n withRipple: true\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels', \n name: 'channels',\n stateKey: key + 'channels',\n withRipple: true\n });\n\n section.content.append(\n contactsCheckboxField.label, \n privateCheckboxField.label, \n groupsCheckboxField.label, \n channelsCheckboxField.label\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle');\n this.scrollable.append(section.container);\n }\n}\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 formatBytes from \"../../../../helpers/formatBytes\";\nimport debounce from \"../../../../helpers/schedulers/debounce\";\nimport appStateManager from \"../../../../lib/appManagers/appStateManager\";\nimport I18n from \"../../../../lib/langPack\";\nimport rootScope from \"../../../../lib/rootScope\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { RangeSettingSelector } from \"../generalSettings\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle');\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\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 { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle');\n this.scrollable.append(section.container);\n }\n}\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 { SettingSection } from \"..\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport formatBytes from \"../../../helpers/formatBytes\";\nimport copy from \"../../../helpers/object/copy\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport appStateManager, { AutoDownloadPeerTypeSettings, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\nimport { FormatterArguments, i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport Button from \"../../button\";\nimport CheckboxField from \"../../checkboxField\";\nimport confirmationPopup from \"../../confirmationPopup\";\nimport Row from \"../../row\";\nimport { SliderSuperTabEventable, SliderSuperTabEventableConstructable } from \"../../sliderTab\";\nimport AppAutoDownloadFileTab from \"./autoDownload/file\";\nimport AppAutoDownloadPhotoTab from \"./autoDownload/photo\";\nimport AppAutoDownloadVideoTab from \"./autoDownload/video\";\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n protected async init() {\n this.header.classList.add('with-border');\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await appStateManager.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia', \n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n withRipple: true\n });\n\n const onChange = () => {\n toggleDisability([resetButton], \n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) && \n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo, /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = new tabConstructor(this.slider, true);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n \n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n }\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n }\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n }\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n rootScope.settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n rootScope.settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('settings_updated', {key: 'settings', value: rootScope.settings});\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach(row => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n \n appStateManager.pushToState('settings', settings);\n rootScope.dispatchEvent('settings_updated', {key: 'settings', value: settings});\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoCheckboxField.label,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n \n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n const gifsCheckboxField = new CheckboxField({\n text: 'AutoplayGIF', \n name: 'gifs', \n stateKey: 'settings.autoPlay.gifs',\n withRipple: true\n });\n const videosCheckboxField = new CheckboxField({\n text: 'AutoplayVideo', \n name: 'videos', \n stateKey: 'settings.autoPlay.videos',\n withRipple: true\n });\n\n section.content.append(gifsCheckboxField.label, videosCheckboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey, args: FormatterArguments = [];\n \n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map(key => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n \n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map(key => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n \n replaceContent(row.subtitle, i18n(key, args));\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 { SliderSuperTab } from \"../../slider\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport Button from \"../../button\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport AppGeneralSettingsTab from \"./generalSettings\";\r\nimport AppEditProfileTab from \"./editProfile\";\r\nimport AppChatFoldersTab from \"./chatFolders\";\r\nimport AppNotificationsTab from \"./notifications\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport AppDataAndStorageTab from \"./dataAndStorage\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport PeerProfile from \"../../peerProfile\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SliderSuperTabConstructable } from \"../../sliderTab\";\r\nimport PopupAvatar from \"../../popups/avatar\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { AccountAuthorizations, Authorization } from \"../../../layer\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n storage: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n } = {} as any;\r\n private profile: PeerProfile;\r\n\r\n private languageRow: Row;\r\n private devicesRow: Row;\r\n\r\n private authorizations: Authorization.authorization[];\r\n private getAuthorizationsPromise: Promise;\r\n\r\n protected init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.buttons.edit = ButtonIcon('edit');\r\n\r\n this.header.append(this.buttons.edit, btnMenu);\r\n\r\n this.profile = new PeerProfile(this.scrollable, this.listenerSetter, false);\r\n this.profile.init();\r\n this.profile.setPeer(rootScope.myId);\r\n this.profile.fillProfileElements();\r\n\r\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\r\n changeAvatarBtn.addEventListener('click', () => {\r\n const canvas = document.createElement('canvas');\r\n new PopupAvatar().open(canvas, (upload) => {\r\n upload().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n });\r\n });\r\n });\r\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\r\n \r\n const updateChangeAvatarBtn = () => {\r\n const user = appUsersManager.getSelf();\r\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\r\n };\r\n \r\n updateChangeAvatarBtn();\r\n this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\r\n if(rootScope.myId === peerId) {\r\n updateChangeAvatarBtn();\r\n }\r\n });\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n \r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n \r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const b: [string, LangPackKey, SliderSuperTabConstructable][] = [\r\n ['unmute', 'AccountSettings.Notifications', AppNotificationsTab],\r\n ['data', 'DataSettings', AppDataAndStorageTab],\r\n ['lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab],\r\n ['settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab],\r\n ['folder', 'AccountSettings.Filters', AppChatFoldersTab],\r\n ];\r\n\r\n const rows = b.map(([icon, langPackKey, tabConstructor]) => {\r\n return new Row({\r\n titleLangKey: langPackKey,\r\n icon,\r\n clickable: () => {\r\n new tabConstructor(this.slider, true).open();\r\n }\r\n });\r\n });\r\n\r\n rows.push(\r\n this.devicesRow = new Row({\r\n titleLangKey: 'Devices',\r\n titleRightSecondary: ' ',\r\n icon: 'activesessions',\r\n clickable: async() => {\r\n if(!this.authorizations) {\r\n await this.updateActiveSessions();\r\n }\r\n\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.authorizations = undefined;\r\n this.updateActiveSessions(true);\r\n }, {once: true});\r\n tab.open();\r\n }\r\n }),\r\n\r\n this.languageRow = new Row({\r\n titleLangKey: 'AccountSettings.Language',\r\n titleRightSecondary: i18n('LanguageName'),\r\n icon: 'language',\r\n clickable: () => {\r\n new AppLanguageTab(this.slider).open();\r\n }\r\n })\r\n );\r\n\r\n buttonsDiv.append(...rows.map(row => row.container));\r\n\r\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\r\n // profileSection.content.append(this.profile.element);\r\n\r\n const buttonsSection = new SettingSection();\r\n buttonsSection.content.append(buttonsDiv);\r\n\r\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\r\n\r\n /* rootScope.$on('user_auth', (e) => {\r\n this.fillElements();\r\n }); */\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = new AppEditProfileTab(this.slider);\r\n tab.open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n private getAuthorizations(overwrite?: boolean) {\r\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\r\n\r\n const promise = this.getAuthorizationsPromise = apiManager.invokeApi('account.getAuthorizations')\r\n .finally(() => {\r\n if(this.getAuthorizationsPromise === promise) {\r\n this.getAuthorizationsPromise = undefined;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public updateActiveSessions(overwrite?: boolean) {\r\n return this.getAuthorizations(overwrite).then(auths => {\r\n this.authorizations = auths.authorizations;\r\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\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 appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length && \r\n !this.channelNameInputField.input.classList.contains('error') && \r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChannel({\r\n title, \r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n new AppAddMembersTab(this.slider).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\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 InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = RichTextProcessor.getAbbreviation(name);\n editPeer.avatarElem.setAttribute('peer-title', name);\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\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 { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n new PopupCreateContact();\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n const isContact = appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList();\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach(el => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n appUsersManager.getContactsPeerIds(query, undefined, 'online').then(contacts => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\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 appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId = 1;\n private wasFilterId: number;\n\n init() {\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, AppArchivedTab.filterId).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.wasFilterId = appDialogsManager.filterId;\n appDialogsManager.setFilterId(AppArchivedTab.filterId);\n appDialogsManager.onTabChange();\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterId(this.wasFilterId);\n appDialogsManager.onTabChange();\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\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 { SliderSuperTab } from \"../../slider\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport AppNewGroupTab from \"./newGroup\";\r\nimport { toast } from \"../../toast\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport type { LazyLoadQueueIntersector } from \"../../lazyLoadQueue\";\r\nimport { i18n, join, _i18n } from \"../../../lib/langPack\";\r\nimport rootScope from '../../../lib/rootScope';\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport SortedUserList from \"../../sortedUserList\";\r\nimport { PeerLocated, Update, Updates } from \"../../../layer\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport { SettingChatListSection } from \"..\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueueIntersector;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n protected init() {\r\n this.container.classList.add('people-nearby-container');\r\n this.setTitle('PeopleNearby');\r\n\r\n this.errorCategory = document.createElement('div');\r\n this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n const emoji = '🧭';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n stickerContainer.classList.add('sticker-container');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 86,\r\n height: 86,\r\n emoji,\r\n needUpscale: true\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n this.locatedPeers = new Map();\r\n\r\n const m = () => {\r\n const sortedUserList = new SortedUserList({\r\n avatarSize: 42, \r\n createChatListOptions: {\r\n dialogSize: 48,\r\n new: true\r\n },\r\n autonomous: false,\r\n onUpdate: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n const elements: HTMLElement[] = [\r\n this.parseDistance(peer.distance)\r\n ];\r\n\r\n if(!element.id.isUser()) {\r\n elements.push(appProfileManager.getChatMembersString(element.id.toChatId()));\r\n }\r\n\r\n element.dom.lastMessageSpan.textContent = '';\r\n element.dom.lastMessageSpan.append(...join(elements, false));\r\n },\r\n getIndex: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n return 0x7FFFFFFF - peer.distance;\r\n }\r\n });\r\n\r\n appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n \r\n return sortedUserList;\r\n };\r\n \r\n const peopleSection = this.peopleSection = new SettingChatListSection({\r\n name: 'PeopleNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const chatsSection = this.chatsSection = new SettingChatListSection({\r\n name: 'ChatsNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const btnMakeVisible = peopleSection.makeButton({\r\n text: 'MakeMyselfVisible',\r\n icon: 'location'\r\n });\r\n\r\n const btnMakeInvisible = peopleSection.makeButton({\r\n text: 'StopShowingMe',\r\n icon: 'location'\r\n });\r\n\r\n const btnCreateGroup = chatsSection.makeButton({\r\n text: 'NearbyCreateGroup',\r\n icon: 'newgroup'\r\n });\r\n\r\n attachClickEvent(btnMakeVisible, () => {\r\n confirmationPopup({\r\n titleLangKey: 'MakeMyselfVisibleTitle',\r\n descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n button: {\r\n langKey: 'OK'\r\n }\r\n }).then(() => {\r\n this.startWatching();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnMakeInvisible, () => {\r\n this.stopWatching();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnCreateGroup, () => {\r\n new AppNewGroupTab(this.slider).open([], true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n btnMakeVisible.classList.add('primary');\r\n btnMakeInvisible.classList.add('danger');\r\n btnCreateGroup.classList.add('primary');\r\n\r\n this.content.append(this.retryBtn);\r\n this.scrollable.append(\r\n stickerContainer,\r\n caption,\r\n peopleSection.container,\r\n chatsSection.container,\r\n this.errorCategory\r\n );\r\n }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach(peer => {\r\n const peerId = appPeersManager.getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = \"No groups or channels found around you.\";\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = \"Location permission denied. Click below to retry.\";\r\n } else {\r\n this.errorCategory.innerHTML = \"An error has occurred. Please retry later clicking the button below.\";\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p)\r\n * (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\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 appImManager from \"../../lib/appManagers/appImManager\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport { FormatterArguments, i18n, i18n_, LangPackKey } from \"../../lib/langPack\";\nimport AppPeopleNearbyTab from \"./tabs/peopleNearby\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { attachClickEvent, CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport { closeBtnMenu } from \"../misc\";\nimport ButtonIcon from \"../buttonIcon\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport IS_GEOLOCATION_SUPPORTED from \"../../environment/geolocationSupport\";\nimport type SortedUserList from \"../sortedUserList\";\nimport Button, { ButtonOptions } from \"../button\";\nimport noop from \"../../helpers/noop\";\nimport { ripple } from \"../ripple\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n //private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n \n public archivedCount: HTMLSpanElement;\n\n private newBtnMenu: HTMLElement;\n\n //private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n new AppAddMembersTab(this).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n new AppNewGroupTab(this).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n new AppContactsTab(this).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: ButtonMenuItemOptions & {verify?: () => boolean} = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n new AppArchivedTab(this).open();\n },\n verify: () => {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: rootScope.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', () => {\n rootScope.settings.theme = themeCheckboxField.input.checked ? 'night' : 'day';\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(rootScope.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n new AppPeopleNearbyTab(this).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n new AppSettingsTab(this).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n appImManager.openUsername({\n userName: 'TelegramTips'\n });\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, (e) => {\n filteredButtons.forEach(button => {\n if(button.verify) {\n button.element.classList.toggle('hide', !button.verify());\n }\n });\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n new AppNewChannelTab(this).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n // this.updateBtn.classList.add('btn-update');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\n\n attachClickEvent(this.updateBtn, () => {\n location.reload();\n });\n \n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n appUsersManager.getTopPeers('correspondents');\n\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n appStateManager.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-30');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach(el => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then(dialogs => dialogs.map(d => d.peerId)),\n appMessagesManager.getConversations(value).promise.then(({dialogs}) => dialogs.map(d => d.peerId)),\n appUsersManager.getContactsPeerIds(value, true)\n ]).then(results => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach(peerId => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach(dateData => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, 'LI') as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n \n appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n appStateManager.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType('global-search')) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: 'global-search'\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n appStateManager.getState().then(state => {\n this.searchGroups.recent.clear();\n \n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n appStateManager.releaseSinglePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n appStateManager.pushToState('recentSearch', recentSearch);\n });\n });\n });\n }\n}\n\nexport type SettingSectionOptions = {\n name?: LangPackKey, \n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n if(options.caption) {\n const caption = this.caption = this.generateContentElement();\n caption.classList.add(className + '-caption');\n container.append(caption);\n\n if(options.caption !== true) {\n i18n_({element: caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\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 rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\ntype Group = {bubble: HTMLElement, mid: number, timestamp: number}[];\r\ntype BubbleGroup = {timestamp: number, fromId: PeerId, mid: number, group: Group};\r\nexport default class BubbleGroups {\r\n private bubbles: Array = []; // map to group\r\n private detailsMap: Map = new Map();\r\n private groups: Array = [];\r\n //updateRAFs: Map = new Map();\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeBubble(bubble: HTMLElement) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n if(details.group.length) {\r\n details.group.findAndSplice(d => d.bubble === bubble);\r\n if(!details.group.length) {\r\n indexOfAndSplice(this.groups, details.group);\r\n } else {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n this.detailsMap.delete(bubble);\r\n }\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n details.mid = mid;\r\n }\r\n }\r\n \r\n addBubble(bubble: HTMLElement, message: MyMessage, reverse: boolean) {\r\n //return;\r\n\r\n const timestamp = message.date;\r\n const mid = message.mid;\r\n let fromId = message.viaBotId || message.fromId;\r\n let group: Group;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as any).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n \r\n // try to find added\r\n this.removeBubble(bubble);\r\n \r\n const insertObject = {bubble, mid, timestamp};\r\n if(this.bubbles.length) {\r\n let foundBubble: BubbleGroup;\r\n let foundAtIndex = -1;\r\n for(let i = 0; i < this.bubbles.length; ++i) {\r\n const bubble = this.bubbles[i];\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n const good = bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n\r\n if(good) {\r\n foundAtIndex = i;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n break;\r\n }\r\n } else {\r\n foundAtIndex = -1;\r\n }\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n if(mid > bubble.mid) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(foundAtIndex !== -1) {\r\n foundBubble = this.bubbles[foundAtIndex];\r\n }\r\n /* const foundBubble = this.bubbles.find(bubble => {\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n return bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n }); */\r\n\r\n if(!foundBubble) this.groups.push(group = [insertObject]);\r\n else {\r\n group = foundBubble.group;\r\n \r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < group.length; ++i) {\r\n const _timestamp = group[i].timestamp;\r\n const _mid = group[i].mid;\r\n\r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n group.splice(i, 0, insertObject);\r\n }\r\n } else {\r\n this.groups.push(group = [insertObject]);\r\n }\r\n\r\n //console.log('[BUBBLE]: addBubble', bubble, message.mid, fromId, reverse, group);\r\n\r\n const bubbleGroup = {timestamp, fromId, mid: message.mid, group};\r\n let insertIndex = 0;\r\n for(; insertIndex < this.bubbles.length; ++insertIndex) {\r\n if(this.bubbles[insertIndex].mid < mid) {\r\n break;\r\n }\r\n }\r\n \r\n this.bubbles.splice(insertIndex, 0, {timestamp, fromId, mid: message.mid, group});\r\n this.updateGroup(group);\r\n\r\n this.detailsMap.set(bubble, bubbleGroup);\r\n }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach(object => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n updateGroup(group: Group) {\r\n /* if(this.updateRAFs.has(group)) {\r\n window.cancelAnimationFrame(this.updateRAFs.get(group));\r\n this.updateRAFs.delete(group);\r\n } */\r\n \r\n //this.updateRAFs.set(group, window.requestAnimationFrame(() => {\r\n //this.updateRAFs.delete(group);\r\n \r\n if(!group.length) {\r\n return;\r\n }\r\n \r\n const first = group[0].bubble;\r\n\r\n //console.log('[BUBBLE]: updateGroup', group, first);\r\n \r\n if(group.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n const length = group.length - 1;\r\n for(let i = 1; i < length; ++i) {\r\n const bubble = group[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = group[group.length - 1].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n //}));\r\n }\r\n\r\n updateGroupByMessageId(mid: number) {\r\n const details = this.bubbles.find(g => g.mid === mid);\r\n if(details) {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n cleanup() {\r\n this.bubbles = [];\r\n this.groups = [];\r\n this.detailsMap.clear();\r\n /* for(let value of this.updateRAFs.values()) {\r\n window.cancelAnimationFrame(value);\r\n }\r\n this.updateRAFs.clear(); */\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 PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\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 AvatarElement from \"./avatar\";\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueueIntersector;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: LazyLoadQueueIntersector,\n avatarSize: number\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.setAttribute('dialog', '0');\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\n avatarElem.loadPromises = loadPromises;\n }\n \n avatarElem.setAttribute('peer', '' + peerId);\n \n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach(el => el.remove());\n }\n}\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 callbackify from \"../../helpers/callbackify\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { MessagePeerReaction, ReactionCount } from \"../../layer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport SetTransition from \"../singleTransition\";\nimport StackedAvatars from \"../stackedAvatars\";\nimport { wrapSticker, wrapStickerAnimation } from \"../wrappers\";\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: ReturnType;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n \n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n \n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const availableReaction = appReactionsManager.getReaction(reactionCount.reaction);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc: availableReaction.center_icon ?? availableReaction.static_icon,\n width: size,\n height: size,\n static: true\n }).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n });\n }\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map(reaction => appPeersManager.getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = !!this.reactionCount.pFlags.chosen) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition(this, 'is-chosen', isChosen, this.isConnected ? 300 : 0);\n }\n }\n\n public fireAroundAnimation() {\n callbackify(appReactionsManager.getReaction(this.reactionCount.reaction), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false\n }) as Promise,\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false\n }).stickerPromise\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n fastRaf(() => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n });\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(remove, 1e3);\n });\n } else {\n remove();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\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 forEachReverse from \"../../helpers/array/forEachReverse\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport { Message, ReactionCount } from \"../../layer\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport ReactionElement, { ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT } from \"./reaction\";\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n }\n \n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(message: Message.message, type: ReactionLayoutType, isPlaceholder?: boolean) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.isPlaceholder);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n availableReactionsResult instanceof Promise ? \n reactions.results : \n reactions.results.filter(reactionCount => {\n return appReactionsManager.isReactionActive(reactionCount.reaction);\n })\n ) : [];\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some(reactionCount => reactionCount.reaction === reaction);\n if(!found) {\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && !!reactions.pFlags.can_see_list && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n const reactionElementIdx = this.sorted.findIndex(reactionElement => reactionElement.reactionCount.reaction === reactionCount.reaction);\n let reactionElement = reactionElementIdx !== -1 && this.sorted[reactionElementIdx];\n if(!reactionElement) {\n reactionElement = new ReactionElement();\n reactionElement.init(this.type);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n \n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter(reaction => reaction.reaction === reactionCount.reaction) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== rootScope.peerId) return;\n\n changedResults.forEach(reactionCount => {\n const reactionElement = this.sorted.find(reactionElement => reactionElement.reactionCount.reaction === reactionCount.reaction);\n if(reactionElement) {\n reactionElement.fireAroundAnimation();\n }\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\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 { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\r\nimport { Message } from \"../../layer\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport I18n from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (message) => {\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach(element => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n public stackedAvatars: StackedAvatars;\r\n public text: I18n.IntlElement;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!this.stackedAvatars) {\r\n this.stackedAvatars = new StackedAvatars({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n avatarSize: 30\r\n });\r\n\r\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\r\n }\r\n\r\n leftPart = this.stackedAvatars.container;\r\n\r\n this.stackedAvatars.render(replies.recent_repliers.map(peer => appPeersManager.getPeerId(peer)), this.loadPromises);\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.prepend(leftPart);\r\n }\r\n \r\n if(!this.text) {\r\n this.text = new I18n.IntlElement();\r\n }\r\n\r\n const text = this.text;\r\n if(replies) {\r\n if(replies.replies) {\r\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\r\n } else {\r\n text.compareAndUpdate({key: 'LeaveAComment'});\r\n }\r\n } else {\r\n text.compareAndUpdate({key: 'ViewInChat'});\r\n }\r\n\r\n if(replies) {\r\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n }/* else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n } */\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text.element);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\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 { formatTime, getFullDate } from \"../../helpers/date\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { Message } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat, { ChatType } from \"./chat\";\nimport ReactionsElement from \"./reactions\";\nimport RepliesElement from \"./replies\";\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType, \n message: Message.message | Message.messageService,\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n \n let editedSpan: HTMLElement, sponsoredSpan: HTMLElement, reactionsElement: ReactionsElement, reactionsMessage: Message.message;\n \n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n let hasReactions: boolean;\n \n let time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n \n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n \n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n \n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + NBSP;\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n \n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n if(message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n hasReactions = true;\n\n reactionsMessage = appMessagesManager.getGroupsFirstMessage(message);\n\n reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'inline', true);\n reactionsElement.render();\n args.unshift(reactionsElement);\n }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n \n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n if(reactionsElement) {\n const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n _reactionsElement.init(reactionsMessage, 'inline');\n _reactionsElement.render();\n }\n clonedArgs = clonedArgs.map(a => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueueIntersector\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = ({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? chat.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = chat.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n // need to download separately\n if(originalMessage._ === 'messageEmpty') {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n chat.appMessagesManager.wrapSingleMessage(replyToPeerId, message.reply_to_mid);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n originalPeerTitle = new PeerTitle({\n peerId: originalMessage.fromId || originalMessage.fwdFromId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const wrapped = wrapReply(originalPeerTitle, undefined, originalMessage);\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(wrapped);\n } else {\n bubbleContainer.append(wrapped);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\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 reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\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 class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n let entry = entries.filter(entry => entry.boundingClientRect.top < 0).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n let container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\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 App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport isObject from \"../../helpers/object/isObject\";\nimport validateInitObject from \"../../helpers/object/validateInitObject\";\nimport I18n from \"../langPack\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport appStateManager from \"./appStateManager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then(popEmojis => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then(recentEmojis => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n public indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = appStateManager.getState().then(state => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = RichTextProcessor.fixEmoji(emoji);\n this.getRecentEmojis().then(recent => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n appStateManager.pushToState('recentEmoji', recent);\n rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n\nconst appEmojiManager = new AppEmojiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appEmojiManager = appEmojiManager);\nexport default appEmojiManager;\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 emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport appEmojiManager from \"../../../lib/appManagers/appEmojiManager\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport Config from \"../../../lib/config\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../misc\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: string;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = RichTextProcessor.wrapSingleEmoji(emoji);\n } else {\n emoji = RichTextProcessor.fixEmoji(emoji);\n kek = RichTextProcessor.wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.innerHTML = kek;\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild && !IS_EMOJI_SUPPORTED) {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Config.Emoji) {\n const details = Config.Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach(c => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach(unified => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n appEmojiManager.getRecentEmojis().then(recent => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map(category => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = RichTextProcessor.fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\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 appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport { LazyLoadQueueRepeat2 } from \"./lazyLoadQueue\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n\r\n constructor(private element: HTMLElement, private group: string, private scrollable: Scrollable, attach = true) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter(p => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const promise = this.scrollPromise.then(() => {\r\n const res = wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n\r\n const willBeAPoster = !!gotThumb;\r\n let img: HTMLImageElement;\r\n if(willBeAPoster) {\r\n img = new Image();\r\n img.classList.add('media-poster');\r\n\r\n if(!gotThumb.cacheContext.url) {\r\n gotThumb.promise.then(() => {\r\n img.src = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n const afterRender = () => {\r\n if(img) {\r\n div.append(img);\r\n div.style.opacity = '';\r\n }\r\n };\r\n\r\n (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\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 emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appDocsManager, {MyDocument} from \"../../../lib/appManagers/appDocsManager\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n apiManager.invokeApi('messages.getSavedGifs', {hash: '0'}).then((res) => {\r\n //console.log('getSavedGifs res:', res);\r\n\r\n if(res._ === 'messages.savedGifs') {\r\n res.gifs.forEach((doc, idx) => {\r\n res.gifs[idx] = doc = appDocsManager.saveDoc(doc);\r\n //if(doc._ === 'documentEmpty') return;\r\n masonry.add(doc as MyDocument);\r\n });\r\n }\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\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 emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue, { LazyLoadQueueRepeat } from \"../../lazyLoadQueue\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(private regularLazyLoadQueue: LazyLoadQueue, private group: string) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.animated) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.animated,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach(player => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n });\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n titleDiv.innerHTML = categoryTitle;\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then(documents => {\r\n documents.forEach(doc => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, RichTextProcessor.wrapEmojiText(set.title), promise.then(stickerSet => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n appStickersManager.getRecentStickers().then(stickers => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter(p => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter(p => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach(el => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\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\nimport { toast } from \"../../components/toast\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\r\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\r\nimport appUsersManager, { MyTopPeer } from \"./appUsersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport rootScope from \"../rootScope\";\r\nimport appDraftsManager from \"./appDraftsManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\n\r\nexport class AppInlineBotsManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return apiManagerProxy.invokeApi('messages.getInlineBotResults', {\r\n bot: appUsersManager.getUserInput(botId),\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then(botResults => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach(result => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[this.generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n public generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\r\n return queryId + '_' + resultId;\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex(topPeer => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n rootScope.dispatchEvent('history_focus', {peerId: botId.toPeerId()});\r\n return appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n rootScope.dispatchEvent('history_focus', {peerId, threadId});\r\n appDraftsManager.setDraft(peerId, threadId, '@' + appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return apiManagerProxy.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n msg_id: appMessagesIdsManager.getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(RichTextProcessor.wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = appDocsManager.getMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = appPhotosManager.getMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n\r\nconst appInlineBotsManager = new AppInlineBotsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appInlineBotsManager = appInlineBotsManager);\r\nexport default appInlineBotsManager;\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 { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appInlineBotsManager, { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\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 { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n appStickersManager.toggleStickerSet(full.set).then(changed => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `\r\n
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n appStickersManager.getStickerSet(set).then(set => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach(animation => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return appStickersManager.getFeaturedStickers().then(coveredSets => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex(covered => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return appStickersManager.searchStickerSets(query, false).then(coveredSets => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\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 { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue, { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport { pause } from \"../../helpers/schedulers/pause\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.emojiTab = new EmojiTab();\n this.stickersTab = new StickersTab();\n this.gifsTab = new GifsTab();\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n new AppStickersTab(appSidebarRight).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n new AppGifsTab(appSidebarRight).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n rootScope.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\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 getVisibleRect(element: HTMLElement, overflowElement: HTMLElement, lookForSticky?: boolean, rect = element.getBoundingClientRect()) {\r\n const overflowRect = overflowElement.getBoundingClientRect();\r\n\r\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowLeft\r\n || rect.left >= overflowRight) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\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\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat\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 PopupElement, { addCancelButton } from \".\";\r\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\r\nimport { ChatInvite, Updates } from \"../../layer\";\r\nimport apiUpdatesManager from \"../../lib/appManagers/apiUpdatesManager\";\r\nimport appAvatarsManager from \"../../lib/appManagers/appAvatarsManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { i18n, _i18n } from \"../../lib/langPack\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { toastNew } from \"../toast\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(hash: string, chatInvite: ChatInvite.chatInvite) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n const peerId = chat.id.toPeerId(true);\r\n rootScope.dispatchEvent('history_focus', {peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.header.remove();\r\n\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-100');\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n appAvatarsManager.putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(chatInvite.title);\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n }\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 Scrollable from \"../components/scrollable\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport reflowScrollableElement from \"./dom/reflowScrollableElement\";\n\nexport default class ScrollSaver {\n private previousScrollHeight: number;\n private previousScrollHeightMinusTop: number/* , previousScrollHeight: number */;\n\n /**\n * \n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable, \n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public save() {\n const {scrollTop, scrollHeight} = this.container;\n\n //previousScrollHeight = scrollHeight;\n //previousScrollHeight = scrollHeight + padding;\n this.previousScrollHeight = scrollHeight;\n this.previousScrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n //this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n\n /* if(DEBUG) {\n this.log('performHistoryResult: messagesQueueOnRender, scrollTop:', scrollTop, scrollHeight, previousScrollHeightMinusTop);\n } */\n }\n\n public restore(useReflow?: boolean) {\n const {container, previousScrollHeightMinusTop, scrollable} = this;\n if(previousScrollHeightMinusTop !== undefined) {\n const scrollHeight = container.scrollHeight;\n if(scrollHeight === this.previousScrollHeight) {\n return;\n }\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n \n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop', \n previousScrollHeightMinusTop, scrollHeight, \n newScrollTop, container.container.clientHeight); */\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n \n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n // touchSupport for safari iOS\n //isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n container.scrollTop = newScrollTop;\n //container.scrollTop = scrollHeight;\n //isTouchSupported && isApple && (container.container.style.overflow = '');\n\n scrollable.lastScrollPosition = newScrollTop;\n // scrollable.lastScrollDirection = 0;\n\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(container);\n }\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\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 type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport type { AppMessagesManager, HistoryResult, HistoryStorage, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\r\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\r\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { ripple } from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { ChatInvite, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, WebPage } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport { deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport serverTimeManager from \"../../lib/mtproto/serverTimeManager\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport { cancelContextMenuOpening } from \"../misc\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport Button from \"../button\";\r\nimport { CallType } from \"../../lib/calls/types\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport PopupJoinChatInvite from \"../popups/joinChatInvite\";\r\nimport { InternalLink, INTERNAL_LINK_TYPE } from \"../../lib/appManagers/internalLink\";\r\nimport ReactionsElement, { REACTIONS_ELEMENTS } from \"./reactions\";\r\nimport type ReactionElement from \"./reaction\";\r\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport { pause } from \"../../helpers/schedulers/pause\";\r\nimport ScrollSaver from \"../../helpers/scrollSaver\";\r\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\r\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nconst SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\n\r\nexport default class ChatBubbles {\r\n public bubblesContainer: HTMLDivElement;\r\n private chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n public peerId: PeerId;\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLElement, \r\n firstTimestamp: number, \r\n container: HTMLElement,\r\n timeout?: number \r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreadedObserver: IntersectionObserver;\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n \r\n private loadedTopTimes = 0;\r\n private loadedBottomTimes = 0;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: {message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]}[] = [];\r\n private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n private historyStorage: HistoryStorage;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderMid: number;\r\n\r\n private viewsObserver: IntersectionObserver;\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n \r\n private hoverBubble: HTMLElement;\r\n private hoverReaction: HTMLElement;\r\n\r\n private onUpdateScrollSaver: ScrollSaver;\r\n\r\n // private reactions: Map;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appStickersManager: AppStickersManager, \r\n private appUsersManager: AppUsersManager, \r\n private appInlineBotsManager: AppInlineBotsManager, \r\n private appPhotosManager: AppPhotosManager, \r\n private appPeersManager: AppPeersManager,\r\n private appProfileManager: AppProfileManager,\r\n private appDraftsManager: AppDraftsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appChatsManager: AppChatsManager,\r\n private appReactionsManager: AppReactionsManager\r\n ) {\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.bubblesContainer = document.createElement('div');\r\n this.bubblesContainer.classList.add('bubbles', 'scrolled-down');\r\n\r\n this.chatInner = document.createElement('div');\r\n this.chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n this.bubblesContainer.append(this.scrollable.container);\r\n\r\n // * constructor end\r\n\r\n this.log = this.chat.log;\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // this.reactions = new Map();\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', ({storage, peerId, mid}) => {\r\n if(this.chat.getMessagesStorage() === storage) {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = this.chat.getMessage(mid);\r\n \r\n if(+bubble.dataset.timestamp >= (message.date + serverTimeManager.serverTimeOffset - 1)) {\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n this.setBubblePosition(bubble, message, false);\r\n //this.log('history_update', this.bubbles[mid], mid, message);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n //this.renderMessage(message, false, false, bubble);\r\n }\r\n });\r\n\r\n //this.listenerSetter.add(rootScope)('')\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map(m => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', (e) => {\r\n const {storage, tempId, tempMessage, mid} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.getMessagesStorage() !== storage) {\r\n return;\r\n }\r\n \r\n //this.log('message_sent', e);\r\n\r\n const mounted = this.getMountedBubble(tempId, tempMessage) || this.getMountedBubble(mid);\r\n if(mounted) {\r\n const message = this.chat.getMessage(mid);\r\n const bubble = mounted.bubble;\r\n //this.bubbles[mid] = bubble;\r\n \r\n /////this.log('message_sent', bubble);\r\n\r\n const reactionsElements = Array.from(bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\r\n if(reactionsElements.length) {\r\n reactionsElements.forEach(reactionsElement => {\r\n reactionsElement.changeMessage(message as Message.message);\r\n });\r\n }\r\n\r\n if(message.replies) {\r\n const repliesElement = bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && message.media.document.thumbs?.length) {\r\n div.replaceWith(wrapDocument({message}));\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(message.grouped_id) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n if(message.media?.poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n const newPoll = message.media.poll;\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', newPoll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = message.media.document.id;\r\n }\r\n }\r\n }\r\n\r\n /* bubble.classList.remove('is-sending');\r\n bubble.classList.add('is-sent');\r\n bubble.dataset.mid = '' + mid;\r\n\r\n this.bubbleGroups.removeBubble(bubble, tempId); */\r\n\r\n if(message.media?.webpage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, false, bubble, false);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n this.renderMessage(mounted.message, true, false, mounted.bubble, false); */\r\n }\r\n \r\n //delete this.bubbles[tempId];\r\n } else {\r\n this.log.warn('message_sent there is no bubble', e);\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n if(bubbles[tempId]) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n delete bubbles[tempId];\r\n\r\n //getHeavyAnimationPromise().then(() => {\r\n fastRaf(() => {\r\n if(bubble.classList.contains('is-outgoing')) {\r\n bubble.classList.remove('is-sending', 'is-outgoing');\r\n bubble.classList.add(this.peerId === rootScope.myId && this.chat.type !== 'scheduled' ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n //});\r\n\r\n bubble.dataset.mid = '' + mid;\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n //this.log('scheduled timing:', timestamp, maxTimestamp);\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storage, peerId, mid}) => {\r\n // fastRaf(() => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n const message = this.chat.getMessage(mid);\r\n const mounted = message.grouped_id ? this.getGroupedBubble(message.grouped_id) : this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n\r\n const updatePosition = this.chat.type === 'scheduled';\r\n \r\n this.saveOnUpdateScroll();\r\n this.safeRenderMessage(mounted.message, true, false, mounted.bubble, updatePosition);\r\n\r\n if(updatePosition) {\r\n (this.messagesQueuePromise || Promise.resolve()).then(() => {\r\n this.deleteEmptyDateGroups();\r\n });\r\n }\r\n // });\r\n });\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.listenerSetter.add(rootScope)('missed_reactions_element', ({message, changedResults}) => {\r\n if(this.peerId !== message.peerId || !message.reactions || !message.reactions.results.length) {\r\n return;\r\n }\r\n \r\n const bubble = this.getBubbleByMessage(message);\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n if(message.grouped_id) {\r\n const grouped = this.getGroupedBubble(message.grouped_id);\r\n message = grouped.message;\r\n }\r\n\r\n this.appendReactionsElementToBubble(bubble, message, changedResults);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_reactions', ({message, changedResults}) => {\r\n if(this.peerId !== message.peerId) {\r\n return;\r\n }\r\n\r\n const bubble = this.getBubbleByMessage(message);\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n this.saveOnUpdateScroll();\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n const set = REACTIONS_ELEMENTS.get(key);\r\n if(set) {\r\n for(const element of set) {\r\n element.update(message, changedResults);\r\n }\r\n } else {\r\n rootScope.dispatchEvent('missed_reactions_element', {message, changedResults});\r\n }\r\n });\r\n }\r\n\r\n /* this.listenerSetter.add(rootScope)('message_reactions', ({peerId, mid}) => {\r\n if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n const reactionsElement = this.reactions.get(mid);\r\n if(!reactionsElement) {\r\n return;\r\n }\r\n\r\n \r\n }); */\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, groupId, deletedMids}) => {\r\n //fastRaf(() => { // ! can't use delayed smth here, need original bubble to be edited\r\n if(peerId !== this.peerId) return;\r\n const mids = this.appMessagesManager.getMidsByAlbum(groupId);\r\n const renderedId = mids.concat(deletedMids).find(mid => this.bubbles[mid]);\r\n if(!renderedId) return;\r\n\r\n const renderMaxId = getObjectKeysAndSort(this.appMessagesManager.groupedMessagesStorage[groupId], 'asc').pop();\r\n\r\n this.safeRenderMessage(this.chat.getMessage(renderMaxId), true, false, this.bubbles[renderedId], false);\r\n //});\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_downloaded', ({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n getHeavyAnimationPromise().then(() => {\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach(mid => {\r\n /* const promise = (this.scrollable.scrollLocked && this.scrollable.scrollLockedPromise) || Promise.resolve();\r\n promise.then(() => {\r\n \r\n }); */\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n const {mid, replyMid} = this.needUpdate.splice(idx, 1)[0];\r\n \r\n //this.log('messages_downloaded', mid, replyMid, i, this.needUpdate, this.needUpdate.length, mids, this.bubbles[mid]);\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const message = this.chat.getMessage(mid);\r\n \r\n const repliedMessage = this.appMessagesManager.getMessageByPeer(obj.replyToPeerId, replyMid);\r\n if(repliedMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: this.bubblesContainer,\r\n verifyTouchTarget: (e) => {\r\n if(this.chat.selection.isSelecting || !this.chat.canSend()) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n\r\n attachClickEvent(this.bubblesContainer, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE && this.chat.type !== 'pinned') {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n if(this.chat.selection.isSelecting || \r\n !this.chat.canSend()) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n if(false) this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n dateMessage.div.classList.toggle('is-sticky', stuck);\r\n break;\r\n }\r\n }\r\n });\r\n\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', ({storage, mid}) => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n const gradientRenderer = this.chat.gradientRenderer;\r\n if(gradientRenderer) {\r\n gradientRenderer.toNextPosition();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n this.updateUnreadByDialog();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n this.finishPeerChange();\r\n this.chat.input.finishPeerChange();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', (e) => {\r\n if(e.key === 'settings.emoji.big') {\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(!isScrolledDown) {\r\n this.setMessagesQueuePromise();\r\n }\r\n \r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n mids.forEach(mid => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n const message = this.chat.getMessage(mid);\r\n this.safeRenderMessage(message, undefined, false, bubble);\r\n // this.bubbleGroups.addBubble(bubble, message, false);\r\n }\r\n });\r\n\r\n if(isScrolledDown) {\r\n this.scrollable.scrollTop = 99999;\r\n } else {\r\n this.performHistoryResult([], true, false, undefined);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_views', ({peerId, views, mid}) => {\r\n if(this.peerId !== peerId) return;\r\n\r\n fastRaf(() => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(postViewsElements.length) {\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach(postViews => {\r\n if(different || postViews.innerHTML !== str) {\r\n this.saveOnUpdateScroll();\r\n different = true;\r\n postViews.innerHTML = str;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n this.unreadedObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n });\r\n\r\n this.viewsObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.viewsObserver.unobserve(entry.target);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.chat.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId()),\r\n random_id: sponsoredMessage.random_id\r\n });\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n\r\n if('ResizeObserver' in window) {\r\n let wasHeight = this.scrollable.container.offsetHeight;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n\r\n const onResizeEnd = () => {\r\n const height = this.scrollable.container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.scrollTop += Math.round(part);\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n //this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries = (entries: any) => {\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n \r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n \r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n //if(isSafari) { // * fix opening keyboard while ESG is active \r\n part = -realDiff;\r\n //}\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.scrollTop = needScrollTop;\r\n }\r\n \r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n // @ts-ignore\r\n const resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(this.bubblesContainer);\r\n }\r\n }\r\n\r\n private saveOnUpdateScroll() {\r\n if(!this.onUpdateScrollSaver) {\r\n this.onUpdateScrollSaver = new ScrollSaver(this.scrollable, true);\r\n setTimeout(() => {\r\n this.onUpdateScrollSaver.restore();\r\n this.onUpdateScrollSaver = undefined;\r\n }, 0);\r\n\r\n this.onUpdateScrollSaver.save();\r\n }\r\n }\r\n\r\n private onBubblesMouseMove = (e: MouseEvent) => {\r\n const content = findUpClassName(e.target, 'bubble-content');\r\n if(content && !this.chat.selection.isSelecting) {\r\n const bubble = findUpClassName(content, 'bubble');\r\n if(!this.chat.selection.canSelectBubble(bubble)) {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n let {hoverBubble, hoverReaction} = this;\r\n if(bubble === hoverBubble) {\r\n return;\r\n }\r\n\r\n this.unhoverPrevious();\r\n\r\n hoverBubble = this.hoverBubble = bubble;\r\n hoverReaction = this.hoverReaction;\r\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\r\n if(!hoverReaction) {\r\n hoverReaction = this.hoverReaction = document.createElement('div');\r\n hoverReaction.classList.add('bubble-hover-reaction');\r\n\r\n const stickerWrapper = document.createElement('div');\r\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\r\n hoverReaction.append(stickerWrapper);\r\n\r\n content.append(hoverReaction);\r\n\r\n let message: Message.message = this.chat.getMessage(+bubble.dataset.mid);\r\n message = this.appMessagesManager.getGroupsFirstMessage(message);\r\n\r\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\r\n Promise.all([\r\n this.appReactionsManager.getAvailableReactionsByMessage(message),\r\n pause(400)\r\n ]).then(([availableReactions]) => {\r\n const availableReaction = availableReactions[0];\r\n if(!availableReaction) {\r\n hoverReaction.remove();\r\n return;\r\n }\r\n\r\n wrapSticker({\r\n div: stickerWrapper,\r\n doc: availableReaction.select_animation,\r\n width: 18,\r\n height: 18,\r\n needUpscale: true,\r\n middleware,\r\n group: CHAT_ANIMATION_GROUP,\r\n withThumb: false,\r\n needFadeIn: false\r\n }).then(player => {\r\n assumeType(player);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n player.addEventListener('firstFrame', () => {\r\n if(!middleware()) {\r\n // debugger;\r\n return;\r\n }\r\n\r\n hoverReaction.dataset.loaded = '1';\r\n this.setHoverVisible(hoverReaction, true);\r\n }, {once: true});\r\n\r\n attachClickEvent(hoverReaction, (e) => {\r\n cancelEvent(e); // cancel triggering selection\r\n\r\n this.appReactionsManager.sendReaction(message, availableReaction.reaction);\r\n this.unhoverPrevious();\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n } else if(hoverReaction.dataset.loaded) {\r\n this.setHoverVisible(hoverReaction, true);\r\n }\r\n } else {\r\n this.unhoverPrevious();\r\n }\r\n };\r\n\r\n public setReactionsHoverListeners() {\r\n this.listenerSetter.add(rootScope)('context_menu_toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(rootScope)('overlay_toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.bubblesContainer)('mousemove', this.onBubblesMouseMove);\r\n }\r\n\r\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\r\n SetTransition(hoverReaction, 'is-visible', visible, 200, visible ? undefined : () => {\r\n hoverReaction.remove();\r\n }, 2);\r\n }\r\n\r\n private unhoverPrevious = () => {\r\n const {hoverBubble, hoverReaction} = this;\r\n if(hoverBubble) {\r\n this.setHoverVisible(hoverReaction, false);\r\n this.hoverBubble = undefined;\r\n this.hoverReaction = undefined;\r\n }\r\n };\r\n\r\n public setStickyDateManually() {\r\n const timestamps = Object.keys(this.dateMessages).map(k => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.unreadedObserver.unobserve(target);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = rootScope.idle.focusPromise.then(() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map(i => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max(this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).maxId || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = this.chat.getMessage(mid);\r\n if(this.appMessagesManager.isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = () => {\r\n this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = (e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble) return;\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n new PopupDatePicker(new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const spoiler: HTMLElement = findUpClassName(target, 'spoiler');\r\n if(spoiler) {\r\n const messageDiv = findUpClassName(spoiler, 'message');\r\n\r\n const className = 'is-spoiler-visible';\r\n const isVisible = messageDiv.classList.contains(className);\r\n if(!isVisible) {\r\n cancelEvent(e);\r\n }\r\n\r\n const duration = 400 / 2;\r\n const showDuration = 5000;\r\n const useRafs = !isVisible ? 2 : 0;\r\n if(useRafs) {\r\n messageDiv.classList.add('will-change');\r\n }\r\n\r\n const spoilerTimeout = messageDiv.dataset.spoilerTimeout;\r\n if(spoilerTimeout !== null) {\r\n clearTimeout(+spoilerTimeout);\r\n delete messageDiv.dataset.spoilerTimeout;\r\n }\r\n\r\n SetTransition(messageDiv, className, true, duration, () => {\r\n messageDiv.dataset.spoilerTimeout = '' + window.setTimeout(() => {\r\n SetTransition(messageDiv, className, false, duration, () => {\r\n messageDiv.classList.remove('will-change');\r\n delete messageDiv.dataset.spoilerTimeout;\r\n });\r\n }, showDuration);\r\n }, useRafs);\r\n\r\n return;\r\n }\r\n\r\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\r\n if(reactionElement) {\r\n cancelEvent(e);\r\n if(reactionElement.classList.contains('is-inactive')) {\r\n return;\r\n }\r\n\r\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\r\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\r\n\r\n const message = reactionsElement.getMessage();\r\n this.appReactionsManager.sendReaction(message, reactionCount.reaction);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message = this.appMessagesManager.filterMessages(this.chat.getMessage(bubbleMid), message => !!(message as Message.message).replies)[0] as Message.message;\r\n const replies = message.replies;\r\n if(replies) {\r\n this.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then(message => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion', \r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer');\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n\r\n const doc = message.media?.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\r\n if(preloader) {\r\n simulateClickEvent(preloader);\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : Object.keys(this.bubbles).map(k => +k).filter(id => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find(e => e.element === this.bubbles[id])) return false;\r\n\r\n const message = this.chat.getMessage(id);\r\n const media = this.appMessagesManager.getMediaFromMessage(message);\r\n \r\n return media && f(media);\r\n }).sort((a, b) => a - b);\r\n\r\n ids.forEach(id => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex(t => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: this.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId, \r\n lastMsgId: replyToMid, \r\n type: this.chat.type, \r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public onGoDownClick() {\r\n if(this.replyFollowHistory.length) {\r\n forEachReverse(this.replyFollowHistory, (mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else {\r\n const message = this.chat.getMessage(mid);\r\n if(!message.deleted) {\r\n bad = false;\r\n }\r\n }\r\n \r\n if(bad) {\r\n this.replyFollowHistory.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n } else {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n }\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public getGroupedBubble(groupId: string) {\r\n const group = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n for(const [mid] of group) {\r\n if(this.bubbles[mid]) {\r\n const maxId = Math.max(...group.keys()); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: +mid,\r\n message: this.chat.getMessage(maxId) as Message.message\r\n };\r\n }\r\n }\r\n }\r\n\r\n public getBubbleByMessage(message: Message.message | Message.messageService) {\r\n if(!(message as Message.message).grouped_id) return this.bubbles[message.mid];\r\n const grouped = this.getGroupedBubble((message as Message.message).grouped_id);\r\n return grouped?.bubble;\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public getMountedBubble(mid: number, message = this.chat.getMessage(mid)) {\r\n if(message.grouped_id && this.appMessagesManager.getMidsByAlbum(message.grouped_id).length > 1) {\r\n const a = this.getGroupedBubble(message.grouped_id);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid, message};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number) {\r\n return this.bubbles[getObjectKeysAndSort(this.bubbles).find(id => {\r\n if(id < mid) return false;\r\n return !!this.bubbles[id]?.parentElement;\r\n })];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(!this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n const history = Object.keys(this.bubbles).map(id => +id).sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* if(history.length === 75) {\r\n this.log('load more', this.scrollable.scrollHeight, this.scrollable.scrollTop, this.scrollable);\r\n return;\r\n } */\r\n /* false && */this.getHistory(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n \r\n // if scroll down after search\r\n if(history.indexOf(historyStorage.maxId) !== -1) {\r\n this.setLoaded('bottom', true);\r\n return;\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* false && */this.getHistory(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = () => {\r\n //return;\r\n \r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.isHeavyAnimationInProgress && this.scrolledDown) return;\r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n const distanceToEnd = this.scrollable.getDistanceToEnd();\r\n if(!IS_TOUCH_SUPPORTED && this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n \r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }\r\n \r\n if(distanceToEnd < 300 && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.bubblesContainer.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.bubblesContainer.classList.contains('scrolled-down')) {\r\n this.bubblesContainer.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection);\r\n }\r\n\r\n this.setStickyDateManually();\r\n };\r\n\r\n public setScroll() {\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public updateUnreadByDialog() {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n if(bubble.classList.contains('is-outgoing')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\r\n bubble.classList.add('is-read');\r\n }\r\n \r\n this.unreadOut.delete(msgId);\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true) {\r\n let deleted = false;\r\n mids.forEach(mid => {\r\n if(!(mid in this.bubbles)) return;\r\n \r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n const bubble = this.bubbles[mid];\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeBubble(bubble);\r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.unobserve(bubble);\r\n this.unreaded.delete(bubble);\r\n }\r\n if(this.viewsObserver) {\r\n this.viewsObserver.unobserve(bubble);\r\n this.viewsMids.delete(mid);\r\n }\r\n //this.unreaded.findAndSplice(mid => mid === id);\r\n bubble.remove();\r\n //bubble.remove();\r\n\r\n if(this.emptyPlaceholderMid === mid) {\r\n this.emptyPlaceholderMid = undefined;\r\n }\r\n\r\n // this.reactions.delete(mid);\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n this.onScroll();\r\n }\r\n \r\n public renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(() => {\r\n if(!middleware()) return;\r\n this.renderNewMessagesByIds(mids);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = mids.filter(mid => {\r\n const message = this.chat.getMessage(mid);\r\n const replyTo = message.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter(mid => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble || \r\n this.scrollingToBubble === this.getLastBubble() || \r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.scrollTop = scrollHeight;\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n const promise = this.performHistoryResult(mids, false, true);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n promise.then(() => { // it will be called only once even if was set multiple times (that won't happen)\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n });\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n }\r\n\r\n public getLastBubble() {\r\n const lastDateGroup = this.getLastDateGroup();\r\n if(lastDateGroup) {\r\n return lastDateGroup.lastElementChild as HTMLElement;\r\n }\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end' && whichChild(bubble) === (this.stickyIntersector ? 2 : 1)/* && this.chat.setPeerPromise */) {\r\n const dateGroup = bubble.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n let margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n return this.scrollable.scrollIntoViewNew({\r\n element, \r\n position, \r\n margin, \r\n forceDirection, \r\n forceDuration, \r\n axis: 'y', \r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.bubblesContainer.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering\r\n });\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n private getLastDateGroup() {\r\n let lastTime = 0, lastElem: HTMLElement;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n if(dateMessage.firstTimestamp > lastTime) {\r\n lastElem = dateMessage.container;\r\n lastTime = dateMessage.firstTimestamp;\r\n }\r\n }\r\n\r\n return lastElem;\r\n }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n public getDateContainerByMessage(message: any, reverse: boolean) {\r\n const date = new Date(message.date * 1000);\r\n date.setHours(0, 0, 0);\r\n const dateTimestamp = date.getTime();\r\n if(!this.dateMessages[dateTimestamp]) {\r\n let dateElement: HTMLElement;\r\n \r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n \r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && message.date === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n \r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n ////////this.log('need to render date message', dateTimestamp, str);\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.unreadedObserver && this.unreadedObserver.disconnect();\r\n this.viewsObserver && this.viewsObserver.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.unreadedObserver && delete this.unreadedObserver;\r\n this.viewsObserver && delete this.viewsObserver;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.disconnect();\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n }\r\n\r\n if(this.viewsObserver) {\r\n this.viewsObserver.disconnect();\r\n this.viewsMids.clear();\r\n }\r\n \r\n this.loadedTopTimes = this.loadedBottomTimes = 0;\r\n \r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.emptyPlaceholderMid = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n // this.reactions.clear();\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n }\r\n\r\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string): {cached?: boolean, promise: Chat['setPeerPromise']} {\r\n //console.time('appImManager setPeer');\r\n //console.time('appImManager setPeer pre promise');\r\n ////console.time('appImManager: pre render start');\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.peerId = peerId;\r\n return null;\r\n }\r\n\r\n const samePeer = this.peerId === peerId;\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled' || this.chat.isRestricted) {\r\n lastMsgId = 0;\r\n }\r\n\r\n const historyStorage = this.historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n let topMessage = chatType === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : this.historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let followingUnread: boolean;\r\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId);\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\r\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\r\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\r\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\r\n }\r\n\r\n followingUnread = !isTarget;\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n //lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\r\n\r\n const {scrollable} = this;\r\n \r\n if(samePeer) {\r\n const mounted = this.getMountedBubble(lastMsgId);\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n scrollable.scrollTop = scrollable.scrollHeight;\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.chat.apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.peerId = peerId;\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: this.appPeersManager.isAnyGroup(peerId) || this.appUsersManager.isBot(peerId)\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('setPeer peerId:', peerId, this.historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\r\n\r\n /* this.setPeerPromise = null;\r\n this.preloader.detach();\r\n return true; */\r\n\r\n //////appSidebarRight.toggleSidebar(true);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map(mid => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n let result: ReturnType;\r\n if(!savedPosition) {\r\n result = this.getHistory(lastMsgId, true, isJump, additionMsgId);\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult(savedPosition.mids, true, false, undefined);\r\n }) as any,\r\n cached: true\r\n };\r\n }\r\n\r\n const {promise, cached} = result;\r\n\r\n // clear \r\n if(!cached) {\r\n if(!samePeer) {\r\n scrollable.container.textContent = '';\r\n //oldChatInner.remove();\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam);\r\n this.preloader.attach(this.bubblesContainer);\r\n }\r\n }\r\n\r\n //console.timeEnd('appImManager setPeer pre promise');\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n \r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = promise.then(() => {\r\n ////this.log('setPeer removing preloader');\r\n\r\n if(cached) {\r\n if(!samePeer) {\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam); // * костыль\r\n }\r\n } else {\r\n this.preloader.detach();\r\n }\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollPosition = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = savedPosition.top;\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if((topMessage && isJump) || isTarget) {\r\n const fromUp = maxBubbleId > 0 && (maxBubbleId < lastMsgId || lastMsgId < 0);\r\n if(!fromUp && samePeer) {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = 99999;\r\n } else if(fromUp/* && (samePeer || forwardingUnread) */) {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = 0;\r\n }\r\n\r\n const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n \r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n this.scrollToBubble(bubble, followingUnread ? 'start' : 'center', !samePeer ? FocusDirection.Static : undefined);\r\n if(!followingUnread) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n } else {\r\n scrollable.scrollTop = scrollable.lastScrollPosition = 99999;\r\n }\r\n\r\n this.onScroll();\r\n\r\n const middleware = this.getMiddleware();\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n const needReactionsInterval = this.appPeersManager.isChannel(peerId);\r\n if(needReactionsInterval) {\r\n const middleware = this.getMiddleware();\r\n const fetchReactions = () => {\r\n if(!middleware()) return;\r\n\r\n const mids: number[] = [];\r\n for(const mid in this.bubbles) {\r\n let message: MyMessage = this.chat.getMessage(+mid);\r\n if(message._ !== 'message') {\r\n continue;\r\n }\r\n\r\n message = this.appMessagesManager.getGroupsFirstMessage(message);\r\n mids.push(message.mid);\r\n }\r\n\r\n const promise = mids.length ? this.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\r\n promise.then(() => {\r\n setTimeout(fetchReactions, 10e3);\r\n });\r\n };\r\n\r\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\r\n fetchReactions();\r\n });\r\n }\r\n\r\n const needFetchInterval = this.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n // warning\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n this.setLoaded('bottom', true);\r\n }\r\n } else {\r\n afterSetPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n scrollable.checkForTriggers();\r\n\r\n if(needFetchInterval) {\r\n const f = () => {\r\n this.fetchNewPromise = new Promise((resolve) => {\r\n if(!middleware() || !this.appMessagesManager.isFetchIntervalNeeded(peerId)) {\r\n resolve();\r\n return;\r\n }\r\n \r\n this.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((historyStorage) => {\r\n if(!middleware() || !historyStorage) {\r\n resolve();\r\n return;\r\n }\r\n \r\n const slice = historyStorage.history.slice;\r\n const isBottomEnd = slice.isEnd(SliceEnd.Bottom);\r\n if(scrollable.loadedAll.bottom && scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n });\r\n }\r\n \r\n this.log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(dialog?.pFlags.unread_mark) {\r\n this.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n\r\n /* if(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\r\n return new Promise((resolve) => fastRaf(resolve));\r\n } */\r\n //console.timeEnd('appImManager setPeer');\r\n }).catch(err => {\r\n this.log.error('getHistory promise error:', err);\r\n this.preloader.detach();\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n public onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const storage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n this.appMessagesManager.readHistory(this.peerId, storage.maxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public finishPeerChange() {\r\n const isChannel = this.appPeersManager.isChannel(this.peerId);\r\n const canWrite = this.chat.canSend();\r\n \r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.bubblesContainer.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', this.chat.isAnyGroup());\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n }\r\n\r\n public renderMessagesQueue(message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]) {\r\n /* let dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(reverse) dateMessage.container.insertBefore(bubble, dateMessage.div.nextSibling);\r\n else dateMessage.container.append(bubble);\r\n return; */\r\n\r\n /* if(DEBUG && message.mid === 4314759167) {\r\n this.log('renderMessagesQueue', message, bubble, reverse, promises);\r\n } */\r\n\r\n this.messagesQueue.push({message, bubble, reverse, promises});\r\n\r\n return this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(this.messagesQueuePromise || !this.messagesQueue.length) return Promise.resolve();\r\n\r\n return this.messagesQueuePromise = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n const queue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const promises = queue.reduce((acc, {promises}) => (acc.push(...promises), acc), []);\r\n\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n this.log('promises to call', promises, queue, this.isHeavyAnimationInProgress);\r\n const middleware = this.getMiddleware();\r\n Promise.all(promises).then(() => {\r\n if(!middleware()) {\r\n throw 'setMessagesQueuePromise: peer changed!';\r\n }\r\n\r\n if(this.messagesQueueOnRender) {\r\n this.messagesQueueOnRender();\r\n }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n queue.forEach(({message, bubble, reverse}) => {\r\n this.setBubblePosition(bubble, message, reverse);\r\n });\r\n\r\n //setTimeout(() => {\r\n resolve();\r\n //}, 500);\r\n this.messagesQueuePromise = null;\r\n\r\n if(this.messagesQueue.length) {\r\n this.setMessagesQueuePromise();\r\n }\r\n\r\n this.setUnreadDelimiter(); // не нашёл места лучше\r\n // this.setStickyDateManually();\r\n }).catch(reject);\r\n }, 0);\r\n });\r\n\r\n //this.messagesQueuePromise.catch(() => {});\r\n }\r\n\r\n public setBubblePosition(bubble: HTMLElement, message: Message.message | Message.messageService, reverse: boolean) {\r\n if(message.pFlags.local) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n\r\n const dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(this.chat.type === 'scheduled' || this.chat.type === 'pinned'/* || true */) { // ! TEMP COMMENTED\r\n const offset = this.stickyIntersector ? 2 : 1;\r\n let children = Array.from(dateMessage.container.children).slice(offset) as HTMLElement[];\r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < children.length; ++i) {\r\n const t = children[i];\r\n const timestamp = +t.dataset.timestamp;\r\n if(message.date < timestamp) {\r\n break;\r\n } else if(message.date === timestamp) {\r\n foundMidOnSameTimestamp = +t.dataset.mid;\r\n }\r\n \r\n if(foundMidOnSameTimestamp && message.mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n \r\n // * 1 for date, 1 for date sentinel\r\n let index = offset + i;\r\n /* if(bubble.parentElement) { // * if already mounted\r\n const currentIndex = whichChild(bubble);\r\n if(index > currentIndex) {\r\n index -= 1; // * minus for already mounted\r\n }\r\n } */\r\n \r\n positionElementByIndex(bubble, dateMessage.container, index);\r\n } else {\r\n if(reverse) {\r\n dateMessage.container.insertBefore(bubble, dateMessage.container.children[this.stickyIntersector ? 1 : 0].nextSibling);\r\n } else {\r\n dateMessage.container.append(bubble);\r\n }\r\n }\r\n\r\n if(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._))) {\r\n this.bubbleGroups.addBubble(bubble, message, reverse);\r\n } else {\r\n bubble.classList.add('is-group-first', 'is-group-last');\r\n }\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n \r\n // reverse means top\r\n private renderMessage(message: Message.message | Message.messageService, reverse = false, multipleRender = false, bubble: HTMLElement = null, updatePosition = true) {\r\n /* if(DEBUG) {\r\n this.log.debug('message to render:', message);\r\n } */\r\n if(!bubble && this.bubbles[message.mid]) {\r\n return;\r\n }\r\n\r\n const isMessage = message._ === 'message';\r\n const groupId = isMessage && message.grouped_id;\r\n\r\n //return;\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(message.deleted) return;\r\n else if(groupId && albumMustBeRenderedFull) { // will render only last album's message\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n const maxId = Math.max(...storage.keys());\r\n if(message.mid < maxId) {\r\n return;\r\n }\r\n }\r\n \r\n const peerId = this.peerId;\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = message.fromId === rootScope.myId || (message.pFlags.out && this.appPeersManager.isMegagroup(peerId));\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n //messageDiv.innerText = message.message;\r\n\r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n // bubble\r\n if(!bubble) {\r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble = document.createElement('div');\r\n bubble.classList.add('bubble');\r\n contentWrapper.appendChild(bubbleContainer);\r\n bubble.appendChild(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.unreadedObserver) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n this.appMessagesManager.isMentionUnread(message) || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid);\r\n if(isUnread) {\r\n this.unreadedObserver.observe(bubble); \r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n } else {\r\n const save = ['is-highlighted', 'is-group-first', 'is-group-last'];\r\n const wasClassNames = bubble.className.split(' ');\r\n const classNames = ['bubble'].concat(save.filter(c => wasClassNames.includes(c)));\r\n bubble.className = classNames.join(' ');\r\n\r\n contentWrapper = bubble.lastElementChild as HTMLElement;\r\n if(!contentWrapper.classList.contains('bubble-content-wrapper')) {\r\n contentWrapper = bubble.querySelector('.bubble-content-wrapper');\r\n }\r\n \r\n bubbleContainer = contentWrapper.firstElementChild as HTMLDivElement;\r\n bubbleContainer.innerHTML = '';\r\n bubbleContainer.style.cssText = '';\r\n contentWrapper.innerHTML = '';\r\n contentWrapper.appendChild(bubbleContainer);\r\n //bubbleContainer.style.marginBottom = '';\r\n const transitionDelay = contentWrapper.style.transitionDelay;\r\n contentWrapper.style.cssText = '';\r\n contentWrapper.style.transitionDelay = transitionDelay;\r\n\r\n if(bubble === this.firstUnreadBubble) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n // * Нужно очистить прошлую информацию, полезно если удалить последний элемент из альбома в ПОСЛЕДНЕМ БАББЛЕ ГРУППЫ (видно по аватару)\r\n const originalMid = +bubble.dataset.mid;\r\n const sameMid = +message.mid === originalMid;\r\n /* if(updatePosition) {\r\n bubble.remove(); // * for positionElementByIndex\r\n } */\r\n\r\n if(!sameMid) {\r\n delete this.bubbles[originalMid];\r\n this.skippedMids.delete(originalMid);\r\n }\r\n\r\n //bubble.innerHTML = '';\r\n }\r\n\r\n // ! reset due to album edit or delete item\r\n this.bubbles[+message.mid] = bubble;\r\n bubble.dataset.mid = '' + message.mid;\r\n bubble.dataset.peerId = '' + message.peerId;\r\n bubble.dataset.timestamp = '' + message.date;\r\n\r\n const loadPromises: Promise[] = [];\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n this.skippedMids.add(+message.mid);\r\n return bubble;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n s.append(i18n('ChatMigration.From', [new PeerTitle({peerId: action.chat_id.toPeerId(true)}).element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n s.append(i18n('ChatMigration.To', [new PeerTitle({peerId: action.channel_id.toPeerId(true)}).element]));\r\n } else {\r\n s.append(this.appMessagesManager.wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document && \r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupId && albumMustBeRenderedFull) {\r\n const t = this.appMessagesManager.getAlbumText(groupId);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n \r\n /* let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = this.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n attachmentDiv.innerHTML = richText;\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n\r\n const timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type, \r\n message\r\n });\r\n messageDiv.append(timeSpan);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n bubble.classList.add('channel-post');\r\n\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n if(!message.pFlags.is_outgoing && this.viewsObserver) {\r\n this.viewsObserver.observe(bubble);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = RichTextProcessor.wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = RichTextProcessor.wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.appInlineBotsManager.checkSwitchReturn(botId).then(peerId => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then(peerId => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button);\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n if(isOutgoing) {\r\n bubble.classList.add('is-outgoing');\r\n }\r\n\r\n const messageWithReplies = isMessage && this.appMessagesManager.getMessageWithReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = our && (!fwdFrom || this.peerId !== rootScope.myId);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n \r\n let processingWebPage = false;\r\n \r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n ////////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n \r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n \r\n break;\r\n }\r\n \r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo, \r\n message,\r\n container: attachmentDiv,\r\n withTail, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webpage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webpage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webpage.photo as any;\r\n if(photo || webpage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n \r\n const doc = webpage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message: message as Message.message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n //}\r\n } else {\r\n const docDiv = wrapDocument({\r\n message,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webpage.site_name) {\r\n const html = RichTextProcessor.wrapRichText(webpage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, RichTextProcessor.wrapEmojiText(webpage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, webpage.rTitle);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n this.appPhotosManager.setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n }\r\n \r\n box.append(quote);\r\n \r\n //bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n \r\n //this.log('night running', bubble.scrollHeight);\r\n \r\n break;\r\n }\r\n \r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n this.appPhotosManager.setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\r\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc, \r\n container: attachmentDiv, \r\n message: message as Message.message, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n\r\n const newNameContainer = wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n lastContainer && lastContainer.append(timeSpan);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ? \r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') : \r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const texts = [];\r\n if(contact.first_name) texts.push(RichTextProcessor.wrapEmojiText(contact.first_name));\r\n if(contact.last_name) texts.push(RichTextProcessor.wrapEmojiText(contact.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.setAttribute('peer', '' + contact.user_id.toPeerId());\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.appPeersManager.isAnyGroup(peerId)) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n \r\n let isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + this.appUsersManager.getUser(message.viaBotId).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(fwdFrom.from_name);\r\n title.classList.add('peer-title');\r\n //title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n \r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n \r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n if(!our) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n\r\n const needAvatar = this.chat.isAnyGroup() && !isOut;\r\n if(needAvatar) {\r\n let avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.classList.add('user-avatar', 'avatar-40');\r\n avatarElem.loadPromises = loadPromises;\r\n\r\n if(!fwdFromId && fwdFrom && fwdFrom.from_name) {\r\n avatarElem.setAttribute('peer-title', /* '🔥 FF 🔥' */fwdFrom.from_name);\r\n }\r\n\r\n avatarElem.setAttribute('peer', '' + (((fwdFrom && (this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID));\r\n //avatarElem.update();\r\n \r\n //this.log('exec loadDialogPhoto', message);\r\n\r\n contentWrapper.append(avatarElem);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n }\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n this.appendReactionsElementToBubble(bubble, message);\r\n }\r\n\r\n /* if(isMessage) {\r\n const reactionHover = document.createElement('div');\r\n reactionHover.classList.add('bubble-reaction-hover');\r\n contentWrapper.append(reactionHover);\r\n } */\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n private appendReactionsElementToBubble(bubble: HTMLElement, message: Message.message, changedResults?: ReactionCount[]) {\r\n if(this.peerId.isUser()) {\r\n return;\r\n }\r\n\r\n const reactionsMessage = this.appMessagesManager.getGroupsFirstMessage(message);\r\n if(!reactionsMessage.reactions || !reactionsMessage.reactions.results.length) {\r\n return;\r\n }\r\n\r\n // message = this.appMessagesManager.getMessageWithReactions(message);\r\n\r\n const reactionsElement = new ReactionsElement();\r\n reactionsElement.init(reactionsMessage, 'block');\r\n reactionsElement.render(changedResults);\r\n\r\n if(bubble.classList.contains('is-message-empty')) {\r\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\r\n } else {\r\n const messageDiv = bubble.querySelector('.message');\r\n if(bubble.classList.contains('is-multiple-documents')) {\r\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\r\n let documentMessageDiv = documentContainer.querySelector('.document-message');\r\n\r\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\r\n if(!timeSpan) {\r\n timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message\r\n });\r\n }\r\n \r\n reactionsElement.append(timeSpan);\r\n\r\n if(!documentMessageDiv) {\r\n documentMessageDiv = document.createElement('div');\r\n documentMessageDiv.classList.add('document-message');\r\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\r\n }\r\n\r\n documentMessageDiv.append(reactionsElement);\r\n } else {\r\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\r\n reactionsElement.append(timeSpan);\r\n \r\n messageDiv.append(reactionsElement);\r\n }\r\n }\r\n }\r\n\r\n private safeRenderMessage(message: any, reverse?: boolean, multipleRender?: boolean, bubble?: HTMLElement, updatePosition?: boolean) {\r\n try {\r\n return this.renderMessage(message, reverse, multipleRender, bubble, updatePosition);\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n }\r\n\r\n public async performHistoryResult(history: (Message.message | Message.messageService | number)[], reverse: boolean, isBackLimit: boolean, additionMsgId?: number) {\r\n // commented bot getProfile in getHistory!\r\n // if(!history/* .filter((id: number) => id > 0) */.length) {\r\n // if(!isBackLimit) {\r\n // this.scrollable.loadedAll.top = true;\r\n\r\n // /* if(this.chat.type === 'discussion') {\r\n // const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n // if(serviceStartMessageId) history.push(serviceStartMessageId);\r\n // history.push(this.chat.threadId);\r\n // } */\r\n // } else {\r\n // this.scrollable.loadedAll.bottom = true;\r\n // }\r\n // }\r\n\r\n history = history.slice(); // need\r\n\r\n if(additionMsgId) {\r\n history.unshift(additionMsgId);\r\n }\r\n\r\n /* if(testScroll && additionMsgID) {\r\n for(let i = 0; i < 3; ++i) {\r\n let _history = history.slice();\r\n setTimeout(() => {\r\n this.performHistoryResult(_history, reverse, isBackLimit, 0, resetPromises);\r\n }, 0);\r\n }\r\n } */\r\n\r\n //console.time('appImManager render history');\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 1e3));\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will render some messages:', history.length, this.isHeavyAnimationInProgress, this.messagesQueuePromise);\r\n } */\r\n\r\n let scrollSaver: ScrollSaver;\r\n this.messagesQueueOnRender = () => {\r\n scrollSaver = new ScrollSaver(this.scrollable, reverse);\r\n scrollSaver.save();\r\n };\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (mid: typeof history[0]) => {\r\n const message: Message.message | Message.messageService = typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n if(message.pFlags.local) {\r\n this.processLocalMessageRender(message);\r\n } else {\r\n this.safeRenderMessage(message, reverse, true);\r\n }\r\n };\r\n\r\n const length = history.length;\r\n if(reverse) for(let i = 0; i < length; ++i) cb(history[i]);\r\n else for(let i = length - 1; i >= 0; --i) cb(history[i]);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n this.setLoaded('bottom', true, false);\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n this.setLoaded('top', true, false);\r\n }\r\n } else {\r\n this.setLoaded('top', true);\r\n this.setLoaded('bottom', true);\r\n }\r\n\r\n await this.messagesQueuePromise;//.then(() => new Promise(resolve => setTimeout(resolve, 100)))\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore(history.length === 1 && !reverse ? false : true);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then(history => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n const promise = this.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n })\r\n .then(value => ({history: value.history.map(m => m.mid)}));\r\n\r\n return promise;\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {history: mids.slice().reverse()};\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter(mid => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex(mid => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex(mid => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n this.log('getHistory: targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)), \r\n bottomIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n if(!this.bubbles[mid] || this.skippedMids.has(mid)) {\r\n this.log.warn('animateAsLadder: no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n const contentWrapper = this.bubbles[mid].lastElementChild as HTMLElement;\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n \r\n contentWrapper.classList.add('zoom-fade');\r\n contentWrapper.style.transitionDelay = lastMsDelay + 'ms';\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n \r\n //this.log('supa', bubble);\r\n\r\n setBubbles.push(contentWrapper);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n // fastRaf(() => {\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.classList.remove('zoom-fade');\r\n });\r\n });\r\n // });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.style.transitionDelay = '';\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n if(!IS_SAFARI) {\r\n this.needReflowScroll = true;\r\n }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private renderEmptyPlaceholder(type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted', bubble: HTMLElement, message: any, elements: (Node | string)[]) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n else if(type === 'restricted') {\r\n title = document.createElement('span');\r\n title.innerText = this.appPeersManager.getRestrictionReasonText(this.peerId);\r\n }\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n this.messagesQueue.findAndSplice(q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n const loadPromise = this.appStickersManager.getGreetingSticker().then(doc => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n this.renderMessagesQueue(message, bubble, false, [loadPromise]);\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map(elem => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private processLocalMessageRender(message: Message.message | Message.messageService) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const bubble = this.safeRenderMessage(message, undefined, undefined, undefined, isSponsored);\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.appPeersManager.isBot(this.peerId);\r\n if(this.chat.isRestricted) {\r\n this.renderEmptyPlaceholder('restricted', bubble, message, elements);\r\n } else if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = this.appPeersManager.getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = this.appMessagesIdsManager.generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param || this.appUsersManager.isBot(peerId.toUserId())) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = this.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite).show();\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n \r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.viewsObserver.observe(button); \r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n } else if(this.appPeersManager.isAnyGroup(this.peerId) && this.appPeersManager.getPeer(this.peerId).pFlags.creator) {\r\n this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.appPeersManager.isUser(this.peerId) && !isBot && this.chat.canSend() && this.chat.type === 'chat') {\r\n this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n /* for(let i = 1; i < elements.length; i += 2) {\r\n elements.splice(i, 0, '\\n');\r\n } */\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const method: 'append' | 'prepend' = isSponsored ? 'append' : 'prepend';\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.onAnimateLadder = () => {\r\n this.chatInner[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else {\r\n this.chatInner[method](bubble);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderMid = message.mid;\r\n // }\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n let offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = this.appMessagesIdsManager.generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(this.appMessagesIdsManager.generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): GenerateLocalMessageType {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n const message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: this.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n this.appMessagesManager.saveMessages([message], {storage: new Map()});\r\n message.mid = mid;\r\n return message;\r\n }\r\n\r\n private setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n /* if(!checkPlaceholders) {\r\n return;\r\n } */\r\n\r\n if(side === 'bottom' && this.appPeersManager.isBroadcast(this.peerId) && !this.chat.isRestricted/* && false */) {\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n \r\n const promise = this.getSponsoredMessagePromise = this.chat.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId())\r\n }, {cacheSeconds: 300}).then(sponsoredMessages => {\r\n if(!middleware()) return;\r\n\r\n /* forEachReverse(sponsoredMessages.messages, (message, idx, arr) => {\r\n if(message.chat_invite || message.chat_invite_hash) {\r\n arr.splice(idx, 1);\r\n }\r\n }); */\r\n\r\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\r\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\r\n \r\n const sponsoredMessage = sponsoredMessages.messages.shift();\r\n if(!sponsoredMessage) {\r\n return;\r\n }\r\n\r\n sponsoredMessages.messages.push(sponsoredMessage);\r\n const message = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n \r\n return Promise.all([\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(() => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n const promise = this.performHistoryResult([message], false, true);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n if(side === 'top' && value && this.appPeersManager.isBot(this.peerId) && !this.chat.isRestricted) {\r\n this.log('inject bot description');\r\n\r\n const middleware = this.getMiddleware();\r\n return Promise.resolve(this.appProfileManager.getProfile(this.peerId.toUserId())).then(userFull => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n this.checkIfEmptyPlaceholderNeeded();\r\n return;\r\n }\r\n\r\n const message = this.generateLocalFirstMessage(false, message => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n this.processLocalMessageRender(message);\r\n });\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n public checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderMid === undefined && \r\n (\r\n this.chat.isRestricted || \r\n !this.appMessagesManager.getHistoryStorage(this.peerId).count || \r\n (\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = this.generateLocalFirstMessage(true);\r\n this.processLocalMessageRender(message);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public getHistory(maxId = 0, reverse = false, isBackLimit = false, additionMsgId = 0, justLoad = false): {cached: boolean, promise: Promise} {\r\n const peerId = this.peerId;\r\n\r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 48/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(true)};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = this.chat.getMessage(additionMsgIds[i]);\r\n if(message.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: ReturnType | {history: number[]} = this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: Promise;\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result instanceof Promise && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && result instanceof Promise;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && result instanceof Promise) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result as Promise;\r\n result = {history: additionMsgIds};\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: typeof result) => {\r\n if('offsetIdOffset' in historyResult && historyResult.history.isEnd(SliceEnd.Top)) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n //this.log('discussion got history', loadCount, backLimit, historyResult, isTopEnd);\r\n const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n historyResult.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse());\r\n }\r\n\r\n await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (result: HistoryResult) => {\r\n /* if(maxId && result.history?.length) {\r\n if(this.bubbles[maxId]) {\r\n result.history.findAndSplice(mid => mid === maxId); \r\n }\r\n } */\r\n\r\n ////console.timeEnd('render history total');\r\n \r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(result);\r\n }).then(() => {\r\n return this.performHistoryResult(result.history || [], reverse, isBackLimit, !isAdditionRender && additionMsgId);\r\n });\r\n };\r\n\r\n const processPromise = (result: Promise) => {\r\n const promise = result.then((result) => {\r\n //this.log('getHistory not cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n\r\n if(reverse ? this.getHistoryTopPromise !== promise : this.getHistoryBottomPromise !== promise) {\r\n this.log.warn('getHistory: peer changed');\r\n ////console.timeEnd('render history total');\r\n return Promise.reject();\r\n }\r\n\r\n if(justLoad) {\r\n this.scrollable.onScroll(); // нужно делать из-за ранней прогрузки\r\n return true;\r\n }\r\n //console.timeEnd('appImManager call getHistory');\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(result instanceof Promise) {\r\n cached = false;\r\n promise = processPromise(result);\r\n } else if(justLoad) {\r\n return null;\r\n } else {\r\n cached = true;\r\n //this.log('getHistory cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n promise = sup(result as HistoryResult);\r\n //return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise);\r\n //return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('ship went past rocks of magnets');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n });\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n /* false && */!isFirstMessageRender && promise.then(() => {\r\n if(reverse) {\r\n this.loadedTopTimes++;\r\n this.loadedBottomTimes = Math.max(0, --this.loadedBottomTimes);\r\n } else {\r\n this.loadedBottomTimes++;\r\n this.loadedTopTimes = Math.max(0, --this.loadedTopTimes);\r\n }\r\n\r\n let ids: number[];\r\n if((reverse && this.loadedTopTimes > 2) || (!reverse && this.loadedBottomTimes > 2)) {\r\n ids = getObjectKeysAndSort(this.bubbles);\r\n }\r\n\r\n //let removeCount = loadCount / 2;\r\n const safeCount = realLoadCount * 2; // cause i've been runningrunningrunning all day\r\n //this.log('getHistory: slice loadedTimes:', reverse, pageCount, this.loadedTopTimes, this.loadedBottomTimes, ids?.length, safeCount);\r\n if(ids && ids.length > safeCount) {\r\n if(reverse) {\r\n //ids = ids.slice(-removeCount);\r\n //ids = ids.slice(removeCount * 2);\r\n ids = ids.slice(safeCount);\r\n this.setLoaded('bottom', false);\r\n\r\n //this.log('getHistory: slice bottom messages:', ids.length, loadCount);\r\n //this.getHistoryBottomPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n } else {\r\n //ids = ids.slice(0, removeCount);\r\n //ids = ids.slice(0, ids.length - (removeCount * 2));\r\n ids = ids.slice(0, ids.length - safeCount);\r\n this.setLoaded('top', false);\r\n\r\n //this.log('getHistory: slice up messages:', ids.length, loadCount);\r\n //this.getHistoryTopPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n }\r\n\r\n //this.log('getHistory: will slice ids:', ids, reverse);\r\n\r\n this.deleteMessagesByIds(ids, false);\r\n }\r\n });\r\n\r\n promise.then(() => {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n });\r\n\r\n return {cached, promise};\r\n }\r\n\r\n public setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n let readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter(mid => !this.bubbles[mid].classList.contains('is-out'))\r\n .map(i => +i)\r\n .sort((a, b) => a - b)\r\n .find(i => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyStorage.maxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = 1 + +!!this.stickyIntersector;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\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 appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(peerId: PeerId, mid: number, unpin?: true, onConfirm?: () => void) {\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const canUnpin = appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + (appMessagesManager.pinnedMessages[peerId]?.count || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\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\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\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 { ReportReason } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport { wrapSticker } from \"../wrappers\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then(bool => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const doc = appStickersManager.getAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n const size = 100;\n wrapSticker({\n doc,\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n loop: false,\n play: true\n }).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { ReportReason } from \"../../layer\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach(b => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = appStickersManager.preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\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 I18n, { i18n } from \"../../lib/langPack\";\nimport Scrollable from \"../scrollable\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }]\n });\n\n const scrollable = new Scrollable(undefined);\n scrollable.onAdditionalScroll = () => {\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\n };\n\n this.description.replaceWith(scrollable.container);\n\n scrollable.container.append(this.description);\n scrollable.container.classList.add('scrolled-top');\n\n this.show();\n }\n}\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport PopupElement from \".\";\nimport { Message } from \"../../layer\";\nimport { generateDelimiter, SettingSection } from \"../sidebarLeft\";\nimport ReactionsElement from \"../chat/reactions\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport Scrollable from \"../scrollable\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport appDialogsManager from \"../../lib/appManagers/appDialogsManager\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport { wrapSticker } from \"../wrappers\";\nimport ReactionElement from \"../chat/reaction\";\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private appMessagesManager: AppMessagesManager, \n private message: Message.message\n ) {\n super('popup-reacted-list', /* [{\n langKey: 'Close',\n isCancel: true\n }] */null, {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const message = this.appMessagesManager.getGroupsFirstMessage(this.message);\n\n const canViewReadParticipants = this.appMessagesManager.canViewMessageReadParticipants(message);\n\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map(reactionCount => {\n return {\n ...reactionCount,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block');\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n \n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n \n newMessage.reactions.results.forEach(reactionCount => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = reactionCount.reaction !== 'checks';\n const skipReactionsList = reactionCount.reaction === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction)) {\n reactionCount.reaction = undefined;\n }\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n result.combined.forEach(({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 54,\n rippleEnabled: false,\n meAsSaved: false,\n drawStatus: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n const availableReaction = appReactionsManager.getReactionCached(reaction);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24\n });\n \n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, appUsersManager.getUserStatusString(peerId.toUserId()));\n });\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n \n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n });\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block');\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport noop from \"../../helpers/noop\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { Message, AvailableReaction } from \"../../layer\";\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport Scrollable, { ScrollableBase, ScrollableX } from \"../scrollable\";\nimport { wrapSticker } from \"../wrappers\";\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 28;\nconst PADDING = 4;\nconst REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: string\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n private container: HTMLElement;\n private reactionsMap: Map;\n private scrollable: ScrollableBase;\n private animationGroup: string;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private appReactionsManager: AppReactionsManager,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n ['big'].forEach(type => {\n const bubble = document.createElement('div');\n bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n reactionsContainer.append(bubble);\n });\n\n this.reactionsMap = new Map();\n this.animationGroup = 'CHAT-MENU-REACTIONS-' + Date.now();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach(reaction => {\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(rootScope.settings.animationsEnabled) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: reaction.reaction\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!rootScope.settings.animationsEnabled) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(player => {\n assumeType(player);\n \n players.appear = player;\n \n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n \n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n \n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(player => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n \n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n \n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\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 type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, MenuPositionPadding, openBtnMenu, positionMenu } from \"../misc\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport PopupSponsored from \"../popups/sponsored\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport { IS_APPLE } from \"../../environment/userAgent\";\r\nimport PopupReactedList from \"../popups/reactedList\";\r\nimport { ChatReactionsMenu } from \"./reactionsMenu\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private isSponsored: boolean;\r\n private isOverBubble: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n private reactionsMenu: ChatReactionsMenu;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private viewerPeerId: PeerId;\r\n private middleware: ReturnType;\r\n private canOpenReactedList: boolean;\r\n\r\n constructor(\r\n private attachTo: HTMLElement, \r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appPeersManager: AppPeersManager, \r\n private appPollsManager: AppPollsManager,\r\n private appDocsManager: AppDocsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appReactionsManager: AppReactionsManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.middleware = getMiddleware();\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(attachTo, (e) => {\r\n if(chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n const className = (e.target as HTMLElement).className;\r\n if(!className || !className.includes) return;\r\n\r\n chat.log('touchend', e);\r\n\r\n const good = ['bubble', 'bubble-content-wrapper', 'bubble-content', 'message', 'time', 'inner'].find(c => className.match(new RegExp(c + '($|\\\\s)')));\r\n if(good) {\r\n cancelEvent(e);\r\n //onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n this.onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.chat.bubbles.listenerSetter});\r\n } else attachContextMenuListener(attachTo, this.onContextMenu, this.chat.bubbles.listenerSetter);\r\n }\r\n\r\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n let element = this.element;\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(element && element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n\r\n const isSponsored = this.isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n //this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' || \r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(this.chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find(mid => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n this.isOverBubble = !!contentWrapper;\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = this.chat.getMessage(this.mid);\r\n this.noForwards = !isSponsored && !this.appMessagesManager.canForward(this.message);\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n\r\n const initResult = this.init();\r\n element = initResult.element;\r\n const {cleanup, destroy, menuPadding} = initResult;\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\r\n openBtnMenu(element, () => {\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n cleanup();\r\n\r\n setTimeout(() => {\r\n destroy();\r\n }, 300);\r\n });\r\n };\r\n\r\n public cleanup() {\r\n this.listenerSetter.removeAll();\r\n this.reactionsMenu && this.reactionsMenu.cleanup();\r\n this.middleware.clean();\r\n }\r\n\r\n public destroy() {\r\n this.cleanup();\r\n }\r\n\r\n private filterButtons(buttons: ChatContextMenu['buttons']) {\r\n if(this.isSponsored) {\r\n return buttons.filter(button => {\r\n return button.isSponsored;\r\n });\r\n } else {\r\n return buttons.filter(button => {\r\n let good: boolean;\r\n\r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(this.chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ? \r\n button.verify() : \r\n button.notDirect && button.verify() && button.notDirect();\r\n }\r\n\r\n return good;\r\n });\r\n }\r\n }\r\n\r\n private setButtons() {\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: () => this.chat.canSend() && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: () => this.appMessagesManager.canEditMessage(this.message, 'text') && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n if(!!this.appMessagesManager.getMessageByPeer(peerId, mid).message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: () => this.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: () => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n this.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: () => (this.message as Message.message).pFlags.pinned && this.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n this.appDocsManager.saveDocFile((this.message as any).media.document);\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll;\r\n return this.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || !this.message.pFlags.out) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: () => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && this.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n onClick: () => {\r\n if(this.viewerPeerId) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: this.viewerPeerId\r\n });\r\n } else if(this.canOpenReactedList) {\r\n new PopupReactedList(this.appMessagesManager, this.message as Message.message);\r\n } else {\r\n return false;\r\n }\r\n },\r\n verify: () => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || this.appMessagesManager.canViewMessageReadParticipants(this.message)),\r\n notDirect: () => true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n }\r\n\r\n private init() {\r\n this.cleanup();\r\n this.setButtons();\r\n \r\n const filteredButtons = this.filterButtons(this.buttons);\r\n const element = this.element = ButtonMenu(filteredButtons, this.listenerSetter);\r\n element.id = 'bubble-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n const viewsButton = filteredButtons.find(button => !button.icon);\r\n if(viewsButton) {\r\n const reactions = (this.message as Message.message).reactions;\r\n const recentReactions = reactions?.recent_reactions;\r\n const isViewingReactions = !!recentReactions?.length;\r\n const participantsCount = this.appMessagesManager.canViewMessageReadParticipants(this.message) ? (this.appPeersManager.getPeer(this.peerId) as MTChat.chat).participants_count : undefined;\r\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\r\n\r\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\r\n const i18nElem = new I18n.IntlElement({\r\n key: isViewingReactions ? (\r\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\r\n ) : 'NobodyViewed',\r\n args: isViewingReactions ? (\r\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\r\n ) : undefined,\r\n element: viewsButton.textElement\r\n });\r\n\r\n let fakeText: HTMLElement;\r\n if(isViewingReactions) {\r\n if(participantsCount === undefined) {\r\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\r\n } else {\r\n fakeText = i18n(\r\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n [recentReactions.length, participantsCount]\r\n );\r\n }\r\n } else {\r\n fakeText = i18n('Loading');\r\n }\r\n\r\n fakeText.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeText);\r\n\r\n const MAX_AVATARS = 3;\r\n const PADDING_PER_AVATAR = .875;\r\n i18nElem.element.style.visibility = 'hidden';\r\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\r\n const middleware = this.middleware.get();\r\n this.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(fakeText) {\r\n fakeText.remove();\r\n }\r\n\r\n const reactions = result.combined;\r\n const reactedLength = participantsCount === undefined ? \r\n result.reactionsCount : \r\n (\r\n isViewingReactions ? \r\n reactions.filter(reaction => reaction.reaction).length : \r\n reactions.length\r\n );\r\n\r\n let fakeElem: HTMLElement;\r\n if(reactions.length === 1) {\r\n fakeElem = new PeerTitle({\r\n peerId: reactions[0].peerId,\r\n onlyFirstName: true,\r\n dialog: false,\r\n }).element;\r\n\r\n if(!isViewingReactions || result.readParticipants.length <= 1) {\r\n this.viewerPeerId = reactions[0].peerId;\r\n }\r\n } else if(isViewingReactions) {\r\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\r\n fakeElem = i18n(\r\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n isFull ? [reactedLength] : [reactedLength, reactions.length]\r\n );\r\n } else {\r\n if(!reactions.length) {\r\n i18nElem.element.style.visibility = '';\r\n } else {\r\n fakeElem = i18n('MessageSeen', [reactions.length]);\r\n }\r\n }\r\n\r\n if(fakeElem) {\r\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\r\n fakeElem.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeElem);\r\n }\r\n\r\n if(reactions.length) {\r\n const avatars = new StackedAvatars({avatarSize: 24});\r\n avatars.render(recentReactions ? recentReactions.map(r => this.appPeersManager.getPeerId(r.peer_id)) : reactions.map(reaction => reaction.peerId));\r\n viewsButton.element.append(avatars.container);\r\n\r\n // if(reactions.length > 1) {\r\n // if(isViewingReactions) {\r\n this.canOpenReactedList = true;\r\n // }\r\n }\r\n });\r\n }\r\n\r\n let menuPadding: MenuPositionPadding;\r\n let reactionsMenu: ChatReactionsMenu;\r\n if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n const position: 'horizontal' | 'vertical' = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.appReactionsManager, position, this.middleware);\r\n reactionsMenu.init(this.appMessagesManager.getGroupsFirstMessage(this.message));\r\n element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 42;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n if(position === 'vertical') {\r\n menuPadding = {\r\n top: 24,\r\n // bottom: 36, // positionMenu will detect it itself somehow\r\n left: totalSize\r\n };\r\n } else {\r\n menuPadding = {\r\n top: totalSize,\r\n right: 36,\r\n left: 24\r\n };\r\n }\r\n }\r\n\r\n this.chat.container.append(element);\r\n\r\n return {\r\n element, \r\n cleanup: () => {\r\n this.cleanup();\r\n reactionsMenu && reactionsMenu.cleanup();\r\n },\r\n destroy: () => {\r\n element.remove();\r\n },\r\n menuPadding\r\n };\r\n }\r\n\r\n private onSendScheduledClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = () => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const str = mids.reduce((acc, mid) => {\r\n const message = this.chat.getMessage(mid);\r\n return acc + (message?.message ? message.message + '\\n' : '');\r\n }, '').trim();\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = () => {\r\n let threadMessage: Message.message;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = this.appMessagesManager.getMessageByPeer(this.peerId, this.chat.threadId);\r\n }\r\n\r\n const username = this.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : this.peerId);\r\n const msgId = this.appMessagesIdsManager.getServerMessageId(this.mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? this.appMessagesIdsManager.getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + this.peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + this.appMessagesIdsManager.getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [this.peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid), this.chat.type);\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 { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu } from \"../misc\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\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 Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!this.chat.appPeersManager.isBroadcast(this.chat.peerId)) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map(el => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach(el => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach(el => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter(v => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find(a => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = this.chat.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n ...this.chat.getMessageSendingParams()\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption', \r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId, \r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '', \r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n \r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement, \r\n position: 'center'\r\n });\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then(response => response.arrayBuffer())\n .then(arrayBuffer => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\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 Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { prepareAlbum, wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo, onMediaLoad } from \"../../helpers/files\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport rootScope from \"../../lib/rootScope\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: rootScope.config.caption_length_max\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find(file => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter(file => {\n const found = this.files.find(_file => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > rootScope.config.caption_length_max) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach(d => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.chat.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.chat.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map(d => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private attachMedia(file: File, params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = document.createElement('video');\n const source = document.createElement('source');\n source.src = params.objectURL = URL.createObjectURL(file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n video.setAttribute('playsinline', 'true');\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n return createPosterFromVideo(video).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n });\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then(duration => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = URL.createObjectURL(file);\n }\n\n return promise;\n }\n\n private attachDocument(file: File, params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio) {\n params.objectURL = URL.createObjectURL(file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n fileName: file.name ? RichTextProcessor.wrapEmojiText(file.name) : '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n cacheContext.url = params.objectURL;\n cacheContext.downloaded = file.size;\n\n const docDiv = wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(file, params, itemDiv) : this.attachDocument(file, params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach(file => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter(n => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach(p => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map(s => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map(o => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\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 fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport { cancelEvent } from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string[]\r\n}) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS)); \r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable, \r\n element: target as HTMLElement, \r\n position: 'center', \r\n forceDuration: 100, \r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\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 attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n hiding: () => void\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller?: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller && this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list, \r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\r\n if(this.init) {\r\n return;\r\n }\r\n \r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller && this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController && this.controller) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n const useRafs = this.controller || hide ? 0 : 2;\r\n\r\n if(hide) {\r\n this.dispatchEvent('hiding');\r\n }\r\n\r\n SetTransition(\r\n this.container, \r\n 'is-visible', \r\n !hide, \r\n rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0, \r\n () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n }, \r\n useRafs\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 mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n appStickersManager.preloadAnimatedEmojiSticker(emoticon);\r\n appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach(sticker => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP);\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\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\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\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 ChatInput from \"./input\";\r\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private appEmojiManager: AppEmojiManager) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach(emoji => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.appEmojiManager.getBothEmojiKeywords().then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = this.appEmojiManager.searchEmojis(q);\r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\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 RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n protected className: string, \r\n onSelect: (target: Element) => boolean | void\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach(d => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n if(!doNotShow) {\r\n this.toggle(!data.length);\r\n }\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n \r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + options.peerId);\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n name.innerHTML = RichTextProcessor.wrapEmojiText(options.name);\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n description.innerHTML = RichTextProcessor.wrapEmojiText(options.description);\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\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 ChatInput from \"./input\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { BotInfo, ChatFull, UserFull } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\n\nexport function processPeerFullForCommands(full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex; \n \n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n \n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach(botInfo => {\n botInfo.commands.forEach((botCommand, idx) => {\n const c = '/' + botCommand.command;\n commands.set(botCommand.command, {\n peerId: botInfo.user_id.toPeerId(false), \n command: botCommand.command, \n name: c, \n description: botCommand.description,\n index: idx\n });\n\n if(index) {\n index.indexObject(botCommand.command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map(command => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n \n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId) {\n if(!this.appUsersManager.isBot(peerId)) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n Promise.resolve(this.appProfileManager.getProfileByPeerId(peerId)).then(full => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\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 { getMiddleware } from \"../../helpers/middleware\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach(helper => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\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 ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId());\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n this.render(peerIds.map(peerId => {\n const user = this.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n }).filter(Boolean));\n });\n\n return true;\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 type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { KeyboardButton, ReplyMarkup } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ListenerSetter, { Listener } from \"../../helpers/listenerSetter\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport confirmationPopup from \"../confirmationPopup\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private appMessagesManager: AppMessagesManager;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n appMessagesManager: AppMessagesManager,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', () => {\r\n this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public checkForceReply() {\r\n const replyMarkup = this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private getReplyMarkup(): ReplyMarkup {\r\n return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public render(replyMarkup: ReplyMarkup.replyKeyboardMarkup = this.getReplyMarkup() as any) {\r\n this.element.innerHTML = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n btn.innerHTML = RichTextProcessor.wrapEmojiText(button.text);\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) {\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\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 { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { renderImageWithFadeIn, wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport GifsMasonry from \"../gifsMasonry\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = this.appInlineBotsManager.generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n ...this.chat.getMessageSendingParams(),\r\n clearDraft: true,\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then(botResults => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n preview.innerHTML = RichTextProcessor.wrapEmojiText([...item.title.trim()][0]);\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = RichTextProcessor.wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n });\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then(blob => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then(dataURL => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n btnSwitchToPM.insertAdjacentHTML('beforeend', RichTextProcessor.wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP);\r\n }\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 { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type ChatInput from \"./input\";\nimport callbackify from \"../../helpers/callbackify\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport { processPeerFullForCommands } from \"./commandsHelper\";\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n private chatInput: ChatInput,\n private appProfileManager: AppProfileManager\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(full);\n \n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n \n // this.container.style.top = \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 type { AppNotificationsManager } from '../../lib/appManagers/appNotificationsManager';\r\nimport type { AppChatsManager } from '../../lib/appManagers/appChatsManager';\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from '../../lib/appManagers/appPeersManager';\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { AppDraftsManager, MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type { AppEmojiManager } from '../../lib/appManagers/appEmojiManager';\r\nimport type { ServerTimeManager } from '../../lib/mtproto/serverTimeManager';\r\nimport type { AppUsersManager } from '../../lib/appManagers/appUsersManager';\r\nimport type { AppInlineBotsManager } from '../../lib/appManagers/appInlineBotsManager';\r\nimport type { AppMessagesIdsManager } from '../../lib/appManagers/appMessagesIdsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message, ChatFull, UserFull } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport { tsNow } from '../../helpers/date';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport { emojiFromCodePoints } from '../../vendor/emoji';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { openBtnMenu, putPreloader } from '../misc';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { BOT_START_PARAM, NULL_PEER_ID } from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport AvatarElement from '../avatar';\r\nimport type { AppProfileManager } from '../../lib/appManagers/appProfileManager';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ChatBotCommands from './botCommands';\r\nimport copy from '../../helpers/object/copy';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\nconst SEND_AS_ANIMATION_DURATION = 300;\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n private sendAsAvatar: AvatarElement;\r\n private sendAsContainer: HTMLElement;\r\n private sendAsCloseBtn: HTMLElement;\r\n private sendAsBtnMenu: HTMLElement;\r\n private sendAsPeerIds: PeerId[];\r\n public sendAsPeerId: PeerId;\r\n private updatingSendAsPromise: Promise;\r\n\r\n private botCommandsToggle: HTMLElement;\r\n private botCommands: ChatBotCommands;\r\n private botCommandsIcon: HTMLDivElement;\r\n private hasBotCommands: number;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appMessagesIdsManager: AppMessagesIdsManager, \r\n private appDocsManager: AppDocsManager, \r\n private appChatsManager: AppChatsManager, \r\n private appPeersManager: AppPeersManager, \r\n private appWebPagesManager: AppWebPagesManager, \r\n private appImManager: AppImManager, \r\n private appDraftsManager: AppDraftsManager, \r\n private serverTimeManager: ServerTimeManager, \r\n private appNotificationsManager: AppNotificationsManager,\r\n private appEmojiManager: AppEmojiManager,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager,\r\n private appProfileManager: AppProfileManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input');\r\n this.chatInput.style.display = 'none';\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach(group => {\r\n const container = RadioForm(group.elements.map(e => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.sendAsContainer = document.createElement('div');\r\n this.sendAsContainer.classList.add('new-message-send-as-container');\r\n\r\n this.sendAsCloseBtn = document.createElement('div');\r\n this.sendAsCloseBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\r\n\r\n const sendAsButtons: ButtonMenuItemOptions[] = [{\r\n text: 'SendMessageAsTitle',\r\n onClick: undefined\r\n }];\r\n\r\n let previousAvatar: HTMLElement;\r\n const onSendAsMenuToggle = (visible: boolean) => {\r\n if(visible) {\r\n previousAvatar = this.sendAsAvatar;\r\n }\r\n\r\n const isChanged = this.sendAsAvatar !== previousAvatar;\r\n const useRafs = !visible && isChanged ? 2 : 0;\r\n\r\n SetTransition(this.sendAsCloseBtn, 'is-visible', visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n if(!isChanged) {\r\n SetTransition(previousAvatar, 'is-visible', !visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n }\r\n };\r\n\r\n ButtonMenuToggle({\r\n noRipple: true, \r\n listenerSetter: this.listenerSetter, \r\n container: this.sendAsContainer\r\n }, 'top-right', sendAsButtons, () => {\r\n onSendAsMenuToggle(true);\r\n }, () => {\r\n onSendAsMenuToggle(false);\r\n });\r\n\r\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\r\n this.sendAsBtnMenu = this.sendAsContainer.firstElementChild as any;\r\n this.sendAsBtnMenu.classList.add('scrollable', 'scrollable-y');\r\n this.sendAsContainer.append(this.sendAsCloseBtn);\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n this.appMessagesManager.goToNextMention(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(value => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n appMessagesManager: this.appMessagesManager,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n\r\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.appProfileManager);\r\n this.botCommandsToggle = document.createElement('div');\r\n this.botCommandsToggle.classList.add('new-message-bot-commands');\r\n\r\n const scaler = document.createElement('div');\r\n scaler.classList.add('new-message-bot-commands-icon-scale');\r\n\r\n const icon = this.botCommandsIcon = document.createElement('div');\r\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\r\n scaler.append(icon);\r\n this.botCommandsToggle.append(scaler);\r\n\r\n attachClickEvent(this.botCommandsToggle, (e) => {\r\n cancelEvent(e);\r\n const isShown = icon.classList.contains('state-back');\r\n if(isShown) {\r\n this.botCommands.toggle(true);\r\n icon.classList.remove('state-back');\r\n } else {\r\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\r\n icon.classList.add('state-back');\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.botCommands.addEventListener('visible', () => {\r\n icon.classList.add('state-back');\r\n });\r\n\r\n this.botCommands.addEventListener('hiding', () => {\r\n icon.classList.remove('state-back');\r\n });\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n new PopupCreatePoll(this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n //this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.sendAsContainer, this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.appEmojiManager);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.appUsersManager, this.appInlineBotsManager);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.sendAsContainer) {\r\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\r\n if(peerId.isChannel() && this.chat.peerId === peerId) {\r\n this.updateSendAs();\r\n }\r\n });\r\n }\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.chat.peerId]) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n new PopupNewMedia(this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then(result => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public center(animate = false) {\r\n const neededFakeContainer = this.getNeededFakeContainer();\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n \r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n //scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform, \r\n borderRadius, \r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer && \r\n neededFakeContainer.classList.contains('chat-input-control') && \r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom, \r\n widthTo\r\n };\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public getNeededFakeContainer() {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(this.startParam !== undefined || \r\n !this.chat.canSend() || \r\n this.chat.type === 'pinned' || \r\n this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = (callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && this.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n \r\n const dialog = this.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true) + this.serverTimeManager.serverTimeOffset,\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.style.display = 'none';\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = this.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n if(this.messageInputField.value === draft.rMessage && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(draft.rMessage, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n public finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, sendAsContainer, botCommandsToggle} = this;\r\n chatInput.style.display = '';\r\n \r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', this.appPeersManager.canPinMessage(peerId));\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.appMessagesManager.getScheduledMessages(peerId).then(mids => {\r\n if(!middleware()) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(this.newMessageWrapper) {\r\n this.updateOffset(null, false, true);\r\n }\r\n\r\n if(botCommandsToggle) {\r\n this.hasBotCommands = undefined;\r\n this.botCommands.toggle(true, undefined, true);\r\n this.updateBotCommandsToggle(true);\r\n botCommandsToggle.remove();\r\n if(this.appPeersManager.isBot(peerId)) {\r\n const userId = peerId.toUserId();\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const getUserFullResult = this.appProfileManager.getProfile(userId);\r\n callbackify(getUserFullResult, (userFull) => {\r\n if(!middleware()) return;\r\n this.updateBotCommands(userFull, !(getUserFullResult instanceof Promise));\r\n });\r\n }\r\n }\r\n\r\n if(sendAsContainer) {\r\n if(this.sendAsAvatar) {\r\n this.sendAsAvatar.remove();\r\n this.sendAsAvatar = undefined;\r\n }\r\n \r\n sendAsContainer.remove();\r\n this.sendAsPeerId = undefined;\r\n this.updatingSendAsPromise = undefined;\r\n\r\n this.updateSendAs(true);\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n \r\n if(this.messageInput) {\r\n this.updateMessageInput();\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(this.appPeersManager.canPinMessage(this.chat.peerId) ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n\r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n \r\n this.startParam = startParam;\r\n\r\n this.center(false);\r\n }\r\n\r\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\r\n if(type) {\r\n this.newMessageWrapper.dataset.offset = type;\r\n } else {\r\n delete this.newMessageWrapper.dataset.offset;\r\n }\r\n\r\n SetTransition(this.newMessageWrapper, 'has-offset', forwards, skipAnimation ? 0 : 300, undefined, useRafs);\r\n }\r\n\r\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\r\n this.hasBotCommands = userFull.bot_info && userFull.bot_info.commands.length;\r\n this.updateBotCommandsToggle(skipAnimation);\r\n }\r\n\r\n private updateBotCommandsToggle(skipAnimation?: boolean) {\r\n const {botCommandsToggle, hasBotCommands} = this;\r\n\r\n const show = hasBotCommands && this.isInputEmpty();\r\n if(!hasBotCommands) {\r\n botCommandsToggle.remove();\r\n }\r\n \r\n const forwards = show;\r\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\r\n\r\n if(!botCommandsToggle.parentElement) {\r\n this.newMessageWrapper.prepend(botCommandsToggle);\r\n }\r\n\r\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\r\n }\r\n\r\n private updateSendAsButtons(peerIds: PeerId[]) {\r\n const buttons: ButtonMenuItemOptions[] = peerIds.map((sendAsPeerId, idx) => {\r\n const textElement = document.createElement('div');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('btn-menu-item-subtitle');\r\n if(sendAsPeerId.isUser()) {\r\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\r\n } else if(sendAsPeerId === this.chat.peerId) {\r\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\r\n } else {\r\n subtitle.append(this.appProfileManager.getChatMembersString(sendAsPeerId.toChatId()));\r\n }\r\n\r\n textElement.append(\r\n new PeerTitle({peerId: sendAsPeerId}).element,\r\n subtitle\r\n );\r\n\r\n return {\r\n onClick: idx ? () => {\r\n const currentPeerId = this.chat.peerId;\r\n if(currentPeerId.isChannel()) {\r\n const channelFull = this.appProfileManager.getCachedFullChat(currentPeerId.toChatId()) as ChatFull.channelFull;\r\n if(channelFull) {\r\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\r\n this.sendAsPeerId = sendAsPeerId;\r\n this.updateSendAsAvatar(sendAsPeerId);\r\n this.updateMessageInputPlaceholder();\r\n\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const executeButtonsUpdate = () => {\r\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\r\n const peerIds = this.sendAsPeerIds.slice();\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateSendAsButtons(peerIds);\r\n };\r\n \r\n if(rootScope.settings.animationsEnabled) {\r\n setTimeout(executeButtonsUpdate, 250);\r\n } else {\r\n executeButtonsUpdate();\r\n }\r\n }\r\n }\r\n\r\n // return;\r\n apiManager.invokeApi('messages.saveDefaultSendAs', {\r\n peer: this.appPeersManager.getInputPeerById(currentPeerId),\r\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\r\n });\r\n } : undefined,\r\n textElement\r\n };\r\n });\r\n\r\n const btnMenu = ButtonMenu(buttons/* , this.listenerSetter */);\r\n buttons.forEach((button, idx) => {\r\n const peerId = peerIds[idx];\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-32', 'btn-menu-item-icon');\r\n avatar.setAttribute('peer', '' + peerId);\r\n\r\n if(!idx) {\r\n avatar.classList.add('active');\r\n }\r\n \r\n button.element.prepend(avatar);\r\n });\r\n\r\n Array.from(this.sendAsBtnMenu.children).slice(1).forEach(node => node.remove());\r\n this.sendAsBtnMenu.append(...Array.from(btnMenu.children));\r\n }\r\n\r\n private updateSendAsAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n const previousAvatar = this.sendAsAvatar;\r\n if(previousAvatar) {\r\n if(+previousAvatar.getAttribute('peer') === sendAsPeerId) {\r\n return;\r\n }\r\n }\r\n \r\n if(!previousAvatar) {\r\n skipAnimation = true;\r\n }\r\n \r\n let useRafs = skipAnimation ? 0 : 2;\r\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\r\n const avatar = this.sendAsAvatar = new AvatarElement();\r\n avatar.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + sendAsPeerId);\r\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\r\n\r\n SetTransition(avatar, 'is-visible', true, duration, undefined, useRafs); \r\n if(previousAvatar) {\r\n SetTransition(previousAvatar, 'is-visible', false, duration, () => {\r\n previousAvatar.remove();\r\n }, useRafs);\r\n }\r\n \r\n this.sendAsContainer.append(avatar);\r\n }\r\n\r\n private getDefaultSendAs() {\r\n // return rootScope.myId;\r\n return callbackify(this.appProfileManager.getChannelFull(this.chat.peerId.toChatId()), (channelFull) => {\r\n return channelFull.default_send_as ? this.appPeersManager.getPeerId(channelFull.default_send_as) : undefined;\r\n });\r\n }\r\n\r\n private updateSendAs(skipAnimation?: boolean) {\r\n const peerId = this.chat.peerId;\r\n if(!peerId.isChannel() || this.updatingSendAsPromise) {\r\n return;\r\n }\r\n\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return !this.updatingSendAsPromise || this.updatingSendAsPromise === updatingSendAsPromise;\r\n });\r\n\r\n const {sendAsContainer} = this;\r\n const chatId = peerId.toChatId();\r\n const result = this.getDefaultSendAs();\r\n // const result = Promise.resolve(this.getDefaultSendAs());\r\n\r\n if(result instanceof Promise) {\r\n skipAnimation = undefined;\r\n }\r\n\r\n const updateSendAsResult = callbackify(result, (sendAsPeerId) => {\r\n if(!middleware() || sendAsPeerId === undefined) return;\r\n \r\n this.sendAsPeerId = sendAsPeerId;\r\n this.updateSendAsAvatar(sendAsPeerId, skipAnimation);\r\n this.updateMessageInputPlaceholder();\r\n\r\n this.appChatsManager.getSendAs(chatId).then(peers => {\r\n if(!middleware()) return;\r\n\r\n const peerIds = peers.map((peer) => this.appPeersManager.getPeerId(peer));\r\n this.sendAsPeerIds = peerIds.slice();\r\n\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateSendAsButtons(peerIds);\r\n });\r\n\r\n let useRafs = 0;\r\n if(!sendAsContainer.parentElement) {\r\n this.newMessageWrapper.prepend(sendAsContainer);\r\n useRafs = 2;\r\n }\r\n\r\n this.updateOffset('as', true, skipAnimation, useRafs);\r\n\r\n this.updatingSendAsPromise = undefined;\r\n });\r\n\r\n const updatingSendAsPromise = this.updatingSendAsPromise = Promise.resolve(updateSendAsResult);\r\n return updatingSendAsPromise;\r\n }\r\n\r\n private updateMessageInputPlaceholder() {\r\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\r\n if(i) {\r\n const {peerId, threadId} = this.chat;\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(this.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if((this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) || \r\n this.appMessagesManager.isAnonymousSending(peerId)) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n }\r\n\r\n public updateMessageInput() {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const canWrite = this.chat.canSend();\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canWrite;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canWrite);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n this.updateMessageInputPlaceholder();\r\n\r\n const visible = this.attachMenuButtons.filter(button => {\r\n const good = button.verify(peerId, threadId);\r\n button.element.classList.toggle('hide', !good);\r\n return good;\r\n });\r\n\r\n if(!canWrite) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, 'monospace'),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, 'spoiler')\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //const differentParents = !!nodes.find(node => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace' || type === 'spoiler') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(document.execCommand('fontName', false, 'Roboto'));\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = RichTextProcessor.parseEntities(value);\r\n const value = RichTextProcessor.parseMarkdown(richValue, markdownEntities, true);\r\n const entities = RichTextProcessor.mergeEntities(markdownEntities, RichTextProcessor.parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter(e => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.appWebPagesManager.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n },\r\n }).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n //console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n \r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n const isEmpty = !richValue.trim();\r\n if(isEmpty) {\r\n if(this.lastTimeType) {\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n\r\n if(this.botCommands) {\r\n this.botCommands.toggle(true);\r\n }\r\n }\r\n\r\n if(this.botCommands) {\r\n this.updateBotCommandsToggle();\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = RichTextProcessor.parseEntities(fullValue);\r\n RichTextProcessor.mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach(entity => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n RichTextProcessor.mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = RichTextProcessor.wrapDraftText(newValue, {entities});\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, RichTextProcessor.wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, RichTextProcessor.getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = RichTextProcessor.parseMarkdown(value, entities, true);\r\n entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? this.appMessagesIdsManager.getServerMessageId(this.chat.threadId) : undefined;\r\n if(this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend('send_media')) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach(value => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = ('' + (diff / 1000)).toHHMMSS() + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = RichTextProcessor.parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(copy(this.forwarding), () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach(i => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = RichTextProcessor.parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter(entity => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach(entity => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {peerId} = chat;\r\n const {noWebPage} = this;\r\n const sendingParams = this.chat.getMessageSendingParams();\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n ...sendingParams,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n ...sendingParams,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = this.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend(flag)) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n ...this.chat.getMessageSendingParams(),\r\n isMedia: true, \r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public initMessageEditing(mid: number) {\r\n const message: Message.message = this.chat.getMessage(mid);\r\n\r\n let input = RichTextProcessor.wrapDraftText(message.message, {entities: message.totalEntities});\r\n const f = () => {\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = () => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map(fromPeerId => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n fromPeerIds.forEach(fromPeerId => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n mids.forEach(mid => {\r\n const message: Message.message = this.appMessagesManager.getMessageByPeer(fromPeerId, mid);\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n length += mids.length;\r\n });\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map(smth => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = this.appMessagesManager.getMessageByPeer(fromPeerId, mids[0]);\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = this.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find(mid => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message: Message = this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(message._ === 'messageEmpty') { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(message._ === 'messageEmpty') {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const newReply = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(newReply);\r\n } else {\r\n replyParent.insertBefore(newReply, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n newReply.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return newReply;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\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\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\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 type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { ripple } from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Message } from \"../../layer\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n \r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n \r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n \r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then(needClose => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n \r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n \r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n \r\n // const active = classNames.filter(className => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n \r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n \r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { MediaProgressLine, VolumeSelector } from \"../../lib/mediaPlayer\";\nimport ButtonIcon from \"../buttonIcon\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport { Message } from \"../../layer\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(rootScope)('media_play', this.onMediaPlay);\n this.topbar.listenerSetter.add(rootScope)('media_pause', this.onPause);\n this.topbar.listenerSetter.add(rootScope)('media_stop', this.onStop);\n this.topbar.listenerSetter.add(rootScope)('media_playback_params', ({playbackRate}) => {\n this.onPlaybackRateChange(playbackRate);\n });\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackRateChange(appMediaPlaybackController.playbackRate);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackRateChange = (playbackRate: number) => {\n this.fasterEl.classList.toggle('active', playbackRate > 1);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n \n private onMediaPlay = ({doc, message, media}: {\n doc: MyDocument,\n message: Message.message,\n media: HTMLMediaElement\n }) => {\n let title: string | HTMLElement, subtitle: string | HTMLElement | DocumentFragment;\n if(doc.type === 'voice' || doc.type === 'round') {\n title = new PeerTitle({peerId: message.fromId}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n this.fasterEl.classList.remove('hide');\n } else {\n title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || i18n('AudioUnknownArtist');\n this.fasterEl.classList.add('hide');\n }\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\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 { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n \r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);//this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n //this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map(n => +n);\r\n const byDecimal = Array.from('' + number).map(n => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n //const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n //decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n //this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n public static LOAD_COUNT = 50;\r\n public static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n public pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n public pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n public wasPinnedIndex = 0;\r\n public wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n public waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n public mids: number[] = [];\r\n public offsetIndex = 0;\r\n\r\n public loading = false;\r\n public loadedBottom = false;\r\n public loadedTop = false;\r\n\r\n public animatedSubtitle: AnimatedSuper;\r\n public animatedMedia: AnimatedSuper;\r\n public animatedCounter: AnimatedCounter;\r\n\r\n public listenerSetter: ListenerSetter;\r\n public scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n public getCurrentIndexPromise: Promise = null;\r\n public btnOpen: HTMLButtonElement;\r\n \r\n public setPinnedMessage: () => void;\r\n\r\n private isStatic = false;\r\n\r\n private debug = false;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private appMessagesManager: AppMessagesManager, private appPeersManager: AppPeersManager) {\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(appPeersManager.canPinMessage(this.topbar.peerId)) {\r\n new PopupPinMessage(this.topbar.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.topbar.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n //return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.chat.log('[PM]: setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.chat.log('[PM]: testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex(_mid => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.chat.log('[PM]: testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find(_mid => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n let gotRest = false;\r\n const promises = [\r\n this.appMessagesManager.getSearch({\r\n peerId: this.topbar.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then(r => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(p => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex(message => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map(message => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n this.debug && this.chat.log('[PM]: getCurrentIndex result:', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.chat.log.error('[PM]: getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.chat.log.error('[PM]: handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = this.chat.getMessage(mid);\r\n if(message && !message.deleted) {\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.chat.log('[PM]: setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: message.message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\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 ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\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 tsNow from \"../../helpers/tsNow\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport { MUTE_UNTIL } from \"../../lib/mtproto/mtproto_config\";\nimport RadioField from \"../radioField\";\nimport Row, { RadioFormFromRows } from \"../row\";\nimport { SettingSection } from \"../sidebarLeft\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n appMessagesManager.mutePeer(peerId, time === -1 ? MUTE_UNTIL : tsNow(true) + time);\n }\n }],\n body: true\n });\n\n const ONE_HOUR = 3600;\n const times: {time: number, langKey: LangPackKey}[] = [{\n time: ONE_HOUR, \n langKey: 'ChatList.Mute.1Hour'\n }, {\n time: ONE_HOUR * 4, \n langKey: 'ChatList.Mute.4Hours'\n }, {\n time: ONE_HOUR * 8, \n langKey: 'ChatList.Mute.8Hours'\n }, {\n time: ONE_HOUR * 24, \n langKey: 'ChatList.Mute.1Day'\n }, {\n time: ONE_HOUR * 24 * 3,\n langKey: 'ChatList.Mute.3Days'\n }, {\n time: -1,\n langKey: 'ChatList.Mute.Forever'\n }];\n \n const name = 'mute-time';\n const rows = times.map((time) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: time.langKey, \n name, \n value: '' + time.time\n })\n });\n\n return row;\n });\n\n let time: number;\n const radioForm = RadioFormFromRows(rows, (value) => {\n time = +value;\n });\n\n rows[rows.length - 1].radioField.checked = true;\n\n const section = new SettingSection({noShadow: true, noDelimiter: true});\n section.content.append(radioForm);\n this.body.append(section.container);\n\n this.show();\n }\n}\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 { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppGroupCallsManager, MyGroupCall } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull, Chat as MTChat, GroupCall } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport generateVerifiedIcon from \"../generateVerifiedIcon\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport { CallType } from \"../../lib/calls/types\";\nimport PopupMute from \"../popups/mute\";\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n public peerId: PeerId;\n private wasPeerId: PeerId;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private appMessagesManager: AppMessagesManager, \n private appPeersManager: AppPeersManager, \n private appChatsManager: AppChatsManager, \n private appNotificationsManager: AppNotificationsManager,\n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager,\n private appGroupCallsManager: AppGroupCallsManager\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.appMessagesManager);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null, \n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null, \n this.btnJoin, \n this.btnPinned, \n this.btnCall, \n this.btnGroupCall, \n this.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n \n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n //if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n //}\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n //const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: () => boolean) {\n if(!element) {\n return;\n }\n \n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const verifyButtons = (buttons: ButtonToVerify[]) => {\n buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify());\n });\n };\n\n if(isMenuOpen) {\n verifyButtons(this.menuButtons);\n\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(this.appPeersManager.getDeleteButtonText(this.peerId)));\n }\n\n verifyButtons(this.buttonsToVerify);\n };\n\n private verifyVideoChatButton = (type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = this.appGroupCallsManager.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if((this.peerId.isBroadcast() && type === 'group') || \n (this.peerId.isAnyGroup() && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = this.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || this.appChatsManager.hasRights(chatId, 'manage_call');\n };\n\n private verifyCallButton = (type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = this.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.appMessagesManager.togglePeerMute(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.appProfileManager.getChannelFull(this.peerId.toChatId())).then(channelFull => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: () => {\n const chatFull = this.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n appStateManager.getState().then(state => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = (bubble) => {\n appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!Object.keys(this.chat.bubbles.bubbles).length\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = new AppEditContactTab(this.appSidebarRight);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: () => this.peerId.isUser() && !this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: () => rootScope.myId !== this.peerId && this.peerId.isUser() && this.appPeersManager.isContact(this.peerId) && !!this.appUsersManager.getUser(this.peerId.toUserId()).phone\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.appUsersManager.toggleBlock(this.peerId, true).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: () => {\n if(!this.peerId.isUser()) return false;\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.appUsersManager.toggleBlock(this.peerId, false).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: () => {\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: () => this.chat.type === 'chat' && !!this.appMessagesManager.getDialogOnly(this.peerId)\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n public constructPeerHelpers() {\n this.avatarElement = new AvatarElement();\n this.avatarElement.setAttribute('dialog', '1');\n //this.avatarElement.setAttribute('clickable', '');\n this.avatarElement.classList.add('avatar-42', 'person-avatar');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = this.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId, \n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, \n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n //this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n if(this.chatAudio) {\n this.chatAudio.destroy();\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public setPeer(peerId: PeerId) {\n this.wasPeerId = this.peerId;\n this.peerId = peerId;\n\n this.container.style.display = peerId ? '' : 'none';\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n const peerId = this.peerId;\n\n if(this.avatarElement) {\n this.avatarElement.setAttribute('peer', '' + peerId);\n this.avatarElement.update();\n }\n\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(this.appPeersManager.isAnyChat(peerId)) {\n const chatId = peerId.toChatId();\n replaceContent(this.btnJoin, i18n(this.appChatsManager.isBroadcast(chatId) ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !this.appChatsManager.getChat(chatId)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n const middleware = this.chat.bubbles.getMiddleware();\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.wasPeerId !== undefined) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n \n if(!isTarget) {\n this.pinnedMessage.setCorrectIndex(0);\n }\n });\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n fastRaf(() => {\n this.setTitle();\n this.setPeerStatus(true);\n this.setMutedState();\n });\n }\n\n public setTitle(count?: number) {\n let titleEl: HTMLElement;\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.appMessagesManager.getSearchCounters(this.peerId, [{_: 'inputMessagesFilterPinned'}], false).then(result => {\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(this.peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.appMessagesManager.getHistory(this.peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(() => {\n const count = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).count;\n if(count === null) {\n setTimeout(() => {\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n titleEl = new PeerTitle({\n peerId: this.peerId,\n dialog: true,\n }).element;\n }\n \n replaceContent(this.title, titleEl);\n\n if(this.chat.type === 'chat') {\n const peer = this.appPeersManager.getPeer(this.peerId);\n if(peer?.pFlags?.verified) {\n this.title.append(generateVerifiedIcon());\n }\n }\n }\n\n public setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(this.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.divAndCaption.container.classList.contains('is-floating');\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatus = (needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n this.chat.appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, false, () => peerId === this.peerId);\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 appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n new PopupDatePicker(new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\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 ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport { ripple } from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n \r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n \r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.bubblesContainer.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n \r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n \r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n new PopupDatePicker(new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, 'LI');\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.bubblesContainer.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\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 { IS_SAFARI } from \"../../environment/userAgent\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n private createCanvasPatternPromise: Promise;\n private exportCanvasPatternToImagePromise: Promise;\n // private img: HTMLImageElement;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n return this.createCanvasPattern(canvas).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = new Promise((resolve) => {\n const img = document.createElement('img');\n img.crossOrigin = 'anonymous';\n renderImageFromUrlPromise(img, this.options.url, false).then(() => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n \n // this.img = img;\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n resolve();\n });\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n }\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n context.fillStyle = this.pattern;\n context.fillRect(0, 0, canvas.width, canvas.height);\n // context.drawImage(this.img, 0, 0, canvas.width, canvas.height);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n canvas.width = this.options.width * window.devicePixelRatio;\n canvas.height = this.options.height * window.devicePixelRatio * 1.5;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n}\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 { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, ChatRights } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppDocsManager } from \"../../lib/appManagers/appDocsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\nimport type { ApiManagerProxy } from \"../../lib/mtproto/mtprotoworker\";\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\nimport type { ServerTimeManager } from \"../../lib/mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\nimport type stateStorage from '../../lib/stateStorage';\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport getAutoDownloadSettingsByPeerId, { ChatAutoDownloadSettings } from \"../../helpers/autoDownload\";\nimport ChatBackgroundGradientRenderer from \"./gradientRenderer\";\nimport ChatBackgroundPatternRenderer from \"./patternRenderer\";\nimport { pause } from \"../../helpers/schedulers/pause\";\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n \n constructor(\n public appImManager: AppImManager, \n public appChatsManager: AppChatsManager, \n public appDocsManager: AppDocsManager, \n public appInlineBotsManager: AppInlineBotsManager, \n public appMessagesManager: AppMessagesManager, \n public appPeersManager: AppPeersManager, \n public appPhotosManager: AppPhotosManager, \n public appProfileManager: AppProfileManager, \n public appStickersManager: AppStickersManager, \n public appUsersManager: AppUsersManager, \n public appWebPagesManager: AppWebPagesManager, \n public appPollsManager: AppPollsManager, \n public apiManager: ApiManagerProxy, \n public appDraftsManager: AppDraftsManager, \n public serverTimeManager: ServerTimeManager, \n public storage: typeof stateStorage, \n public appNotificationsManager: AppNotificationsManager,\n public appEmojiManager: AppEmojiManager,\n public appMessagesIdsManager: AppMessagesIdsManager,\n public appGroupCallsManager: AppGroupCallsManager,\n public appReactionsManager: AppReactionsManager\n ) {\n super();\n\n this.type = 'chat';\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n //this.log.error('Chat construction');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = rootScope.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground && \n document.documentElement.style.cursor === 'grabbing' && \n this.gradientRenderer && \n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer = \n this.patternRenderer = \n this.gradientCanvas = \n this.patternCanvas = \n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n \n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + Math.abs(intensity));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [gradientCanvas, isDarkPattern ? undefined : patternCanvas].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition(item, 'is-visible', true, !skipAnimation ? 200 : 0, prev ? () => {\n if(previousPatternRenderer) {\n previousPatternRenderer.cleanup(previousPatternCanvas);\n }\n\n if(previousGradientRenderer) {\n previousGradientRenderer.cleanup();\n }\n\n prev.remove();\n } : null, 2);\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n let promise: Promise;\n if(isDarkPattern) {\n promise = patternRenderer.exportCanvasPatternToImage(patternCanvas).then(url => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n \n gradientCanvas.style.webkitMaskImage = `url(${url})`;\n });\n } else {\n promise = Promise.resolve();\n }\n \n promise.then(cb);\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n\n if(this.type === 'scheduled') {\n this.getMessagesStorage = () => this.appMessagesManager.getScheduledMessagesStorage(this.peerId);\n //this.getMessage = (mid) => this.appMessagesManager.getMessageFromStorage(this.appMessagesManager.getScheduledMessagesStorage(this.peerId), mid);\n }\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.appMessagesManager, this.appPeersManager, this.appChatsManager, this.appNotificationsManager, this.appProfileManager, this.appUsersManager, this.appGroupCallsManager);\n this.bubbles = new ChatBubbles(this, this.appMessagesManager, this.appStickersManager, this.appUsersManager, this.appInlineBotsManager, this.appPhotosManager, this.appPeersManager, this.appProfileManager, this.appDraftsManager, this.appMessagesIdsManager, this.appChatsManager, this.appReactionsManager);\n this.input = new ChatInput(this, this.appMessagesManager, this.appMessagesIdsManager, this.appDocsManager, this.appChatsManager, this.appPeersManager, this.appWebPagesManager, this.appImManager, this.appDraftsManager, this.serverTimeManager, this.appNotificationsManager, this.appEmojiManager, this.appUsersManager, this.appInlineBotsManager, this.appProfileManager);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.appMessagesManager);\n this.contextMenu = new ChatContextMenu(this.bubbles.bubblesContainer, this, this.appMessagesManager, this.appPeersManager, this.appPollsManager, this.appDocsManager, this.appMessagesIdsManager, this.appReactionsManager);\n\n if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n if(this.type !== 'scheduled' && !IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.bubblesContainer, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.selection.cleanup();\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n rootScope.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n } else if(this.setPeerPromise) {\n return;\n }\n\n //console.time('appImManager setPeer');\n //console.time('appImManager setPeer pre promise');\n ////console.time('appImManager: pre render start');\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.topbar.setPeer(peerId);\n this.bubbles.setPeer(peerId);\n rootScope.dispatchEvent('peer_changed', peerId);\n\n return;\n }\n\n // set new\n if(!samePeer) {\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n this.noForwards = this.appPeersManager.noForwards(peerId);\n this.isRestricted = this.appPeersManager.isRestricted(peerId);\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n appSidebarRight.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n this.setAutoDownloadMedia();\n }\n\n this.peerChanged = samePeer;\n\n if(startParam === undefined && this.isStartButtonNeeded()) {\n startParam = BOT_START_PARAM;\n }\n\n const result = this.bubbles.setPeer(peerId, lastMsgId, startParam);\n if(!result) {\n return;\n }\n\n const {promise} = result;\n\n //console.timeEnd('appImManager setPeer pre promise');\n \n const setPeerPromise = this.setPeerPromise = promise.finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n if(!samePeer) {\n appSidebarRight.sharedMediaTab.setLoadMutex(this.setPeerPromise);\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n }\n /* this.setPeerPromise.then(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n\n return result;\n }\n\n public setAutoDownloadMedia() {\n this.autoDownload = getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n let peerId = this.peerId;\n this.peerChanged = true;\n\n this.cleanup(false);\n\n this.topbar.setPeer(peerId);\n this.topbar.finishPeerChange(isTarget, isJump, lastMsgId);\n this.bubbles.finishPeerChange();\n this.input.finishPeerChange(startParam);\n\n appSidebarRight.sharedMediaTab.fillProfileElements();\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n rootScope.dispatchEvent('peer_changed', peerId);\n this.wasAlreadyUsed = true;\n }\n\n public getMessagesStorage() {\n return this.appMessagesManager.getMessagesStorage(this.peerId);\n }\n\n public getMessage(mid: number) {\n return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(), mid);\n //return this.appMessagesManager.getMessageByPeer(this.peerId, mid);\n }\n\n public getMidsByMid(mid: number) {\n return this.appMessagesManager.getMidsByMessage(this.getMessage(mid));\n }\n\n public isAnyGroup() {\n return this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || this.appPeersManager.isAnyGroup(this.peerId);\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = new AppPrivateSearchTab(appSidebarRight);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return this.appPeersManager.isBot(this.peerId) && \n !this.appMessagesManager.getDialogOnly(this.peerId) && \n !this.appMessagesManager.getHistoryStorage(this.peerId).history.length;\n }\n\n public getMessageSendingParams() {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n sendSilent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n}\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 { State } from \"../lib/appManagers/appStateManager\";\nimport rootScope from \"../lib/rootScope\";\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default function getAutoDownloadSettingsByPeerId(peerId: PeerId): ChatAutoDownloadSettings {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(peerId.isContact()) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(peerId.isBroadcast()) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n \n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\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 type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport clamp from \"../../helpers/number/clamp\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach(c => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !RichTextProcessor.matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach(node => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\r\n\r\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\r\n \r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n \r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n \r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n \r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n \r\n this.setTooltipPosition();\r\n \r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n \r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n //this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e?: Event) => {\r\n //this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n e && cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n //this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n //this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n const messageInput = this.appImManager.chat.input.messageInput;\r\n if(document.activeElement !== messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else if(this.container && this.container.classList.contains('is-visible')) {\r\n this.setTooltipPosition();\r\n } else if(messageInput.matches(':active')) {\r\n this.setMouseUpEvent();\r\n } else {\r\n this.show();\r\n }\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 getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter(node => !!node);\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// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\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 generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\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 { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach(el => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach(el => el.classList.remove('no-transition'));\r\n });\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n \n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n \n this.N = n;\n this.radius = new Array(n + 1);\n \n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n \n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n \n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n \n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n \n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n \n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n \n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n \n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n \n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n \n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n \n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n \n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n \n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n \n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n \n return gradient;\n }\n \n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n \n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n \n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n \n private mounted: boolean;\n private media: MediaQueryList;\n \n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n \n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n \n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n \n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)],\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n \n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n \n this.setSize();\n this.forceUpdate();\n \n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n \n this.draw();\n }\n \n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n \n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n \n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n \n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n \n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n \n this.forceUpdate();\n this.invokeDraw();\n }\n \n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n \n public handleBlur = () => {\n this.focused = false;\n }\n \n private invokeDraw = () => {\n if(this.raf) return;\n \n this.draw();\n }\n \n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n \n // console.log('[top] draw', [focused, resizing, this.mounted]);\n \n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n \n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n \n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n \n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n \n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n \n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n \n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n \n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n \n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n \n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n \n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n \n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n \n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n \n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n \n if(currentState?.stateId === stateId) {\n return;\n }\n \n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n \n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n \n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\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 rootScope from \"../../lib/rootScope\";\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(let i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\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 noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport rootScope from \"../rootScope\";\nimport lottieLoader, { LottieAssetName } from \"./lottieLoader\";\nimport type RLottiePlayer from \"./rlottiePlayer\";\nimport { RLottieColor } from \"./rlottiePlayer\";\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n \n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map(options => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then(player => {\n return lottieLoader.waitForFirstFrame(player);\n }).then(player => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find(part => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n \n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame, \n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n \n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\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 noop from \"../helpers/noop\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport { LottieAssetName } from \"../lib/rlottie/lottieLoader\";\nimport RLottieIcon, { RLottieIconItemPartOptions, RLottieIconItemPart } from \"../lib/rlottie/rlottieIcon\";\nimport { RLottieColor } from \"../lib/rlottie/rlottiePlayer\";\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map(item => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n \n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n \n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach(item => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\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 { RLottieIconItemPartOptions } from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_MICROPHONE_BUTTON_STATE } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\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 RLottieIcon from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, \n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\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 PopupElement from \"../popups\";\nimport { hexToRgb } from \"../../helpers/color\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport customProperties from \"../../helpers/dom/customProperties\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport { RLottieColor } from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIcon from \"./microphoneIcon\";\nimport GroupCallParticipantsElement from \"./participants\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\nimport PopupPeer from \"../popups/peer\";\nimport GroupCallDescriptionElement from \"./description\";\nimport GroupCallTitleElement from \"./title\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport Scrollable from \"../scrollable\";\nimport { MovableState } from \"../movableElement\";\nimport animationIntersector from \"../animationIntersector\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport makeButton from \"../call/button\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let color: RLottieColor, colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n color = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private appChatsManager: AppChatsManager;\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor(options: {\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n }) {\n super('popup-group-call', undefined, {\n body: true,\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = this.appGroupCallsManager.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n \n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n \n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n \n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n ...options\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n ...options\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') || \n findUpClassName(target, 'group-call-button') || \n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n \n private onLeaveClick = () => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(this.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true,\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach(element => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach(element => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\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 replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { GROUP_CALL_PARTICIPANT_MUTED_STATE } from \".\";\nimport { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter(type => !!participant[type]).map(type => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, RichTextProcessor.wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n \n replaceContent(this.container, span);\n }\n}\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 positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } from \"../../lib/appManagers/appDialogsManager\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport type GroupCallInstance from \"../../lib/calls/groupCallInstance\";\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n participant: GroupCallParticipant,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 54;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: (element) => element.participant.date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: (element) => {\n const {participant} = element;\n\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const participant = instance.participants.get(base.id);\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n \n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n\n (base as SortedParticipant).dom = dom;\n (base as SortedParticipant).participant = participant;\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\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 { animate } from \"../../helpers/animation\";\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\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 { GroupCallParticipant } from \"../../layer\";\nimport type { GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport { i18n } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport callVideoCanvasBlur from \"../call/videoCanvasBlur\";\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private appPeersManager: AppPeersManager, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n \n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n \n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n \n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n \n this.container.append(this.header);\n // }\n \n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: this.appPeersManager.getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n \n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { AppGroupCallsManager, GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport GroupCallParticipantVideoElement, { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange']\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n \n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return; \n }\n \n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some(type => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach(type => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.appPeersManager, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n \n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n \n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public setInstance(instance: GroupCallInstance) {\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\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 PopupGroupCall from \".\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, isFullScreen } from \"../../helpers/dom/fullScreen\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport { attachContextMenuListener, closeBtnMenu, openBtnMenu, positionMenu } from \"../misc\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport Scrollable from \"../scrollable\";\nimport GroupCallParticipantsList from \"./participantsList\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean})[];\n private element: HTMLDivElement;\n private appChatsManager: AppChatsManager;\n private appPeersManager: AppPeersManager;\n private appGroupCallsManager: AppGroupCallsManager;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n appChatsManager: AppChatsManager,\n appPeersManager: AppPeersManager,\n appGroupCallsManager: AppGroupCallsManager,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: () => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: this.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.appChatsManager = options.appChatsManager;\n this.appPeersManager = options.appPeersManager;\n this.appGroupCallsManager = options.appGroupCallsManager;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n \n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, (e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = this.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n this.buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify(peerId));\n });\n \n cancelEvent(e);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n closeBtnMenu();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? (PopupElement.getPopups(PopupGroupCall) as PopupGroupCall[])[0].getContainer(): document.body;\n\n if(!isFull) {\n closeBtnMenu();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n rootScope.dispatchEvent('history_focus', {\n peerId: this.targetPeerId\n });\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.appGroupCallsManager.editParticipant(this.instance.id, this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private appChatsManager: AppChatsManager;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n \n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach(participant => {\n this.updateParticipant(participant);\n });\n \n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n \n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\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 { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport I18n, { LangPackKey, FormatterArguments } from \"../../lib/langPack\";\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\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 setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, RichTextProcessor.wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n } \n }\n}\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport { ripple } from \"../ripple\";\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\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 findUpClassName from \"../helpers/dom/findUpClassName\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport clamp from \"../helpers/number/clamp\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport windowSize from \"../helpers/windowSize\";\nimport SwipeHandler from \"./swipeHandler\";\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n \n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n \n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach(handler => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map(side => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\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 MovableElement, { MovableElementOptions, MovableState } from \"../components/movableElement\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport ListenerSetter from \"./listenerSetter\";\nimport mediaSizes, { ScreenSize } from \"./mediaSizes\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n \n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n \n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\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\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\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\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\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 replaceContent from \"../../helpers/dom/replaceContent\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = ('' + instance.duration).toHHMMSS(true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\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 { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\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 IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport { IS_MOBILE } from \"../../environment/userAgent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport { onMediaLoad } from \"../../helpers/files\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\nimport type { AppAvatarsManager } from \"../../lib/appManagers/appAvatarsManager\";\nimport type { AppCallsManager } from \"../../lib/appManagers/appCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport CallInstance from \"../../lib/calls/callInstance\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport AvatarElement from \"../avatar\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIconMini from \"../groupCall/microphoneIconMini\";\nimport { MovableState } from \"../movableElement\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport SetTransition from \"../singleTransition\";\nimport makeButton from \"./button\";\nimport CallDescriptionElement from \"./description\";\nimport callVideoCanvasBlur from \"./videoCanvasBlur\";\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private instance: CallInstance;\n private appCallsManager: AppCallsManager;\n private appAvatarsManager: AppAvatarsManager;\n private appPeersManager: AppPeersManager;\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n \n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(options: {\n appCallsManager: AppCallsManager,\n appAvatarsManager: AppAvatarsManager,\n appPeersManager: AppPeersManager,\n instance: CallInstance\n }) {\n super('popup-call', undefined, {\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videoContainers = {};\n\n const {container, listenerSetter, instance} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.isBig = true;\n avatar.setAttribute('peer', '' + peerId);\n avatar.classList.add('avatar-full');\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n \n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container, \n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') || \n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n \n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n \n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true,\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find(container => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition(this.partyMutedState, 'is-visible', !!outputState?.muted, 300);\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach(type => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then(emojis => {\n this.emojisSubtitle.innerHTML = RichTextProcessor.wrapEmojiText(emojis.join(''));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach(container => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n \n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\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 SDP from \"../sdp\";\nimport { CallSignalingData, P2PVideoCodec } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n \n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n fingerprints: [info.fingerprint],\n ufrag: info.ufrag,\n pwd: info.pwd,\n audio: undefined,\n video: undefined,\n screencast: undefined\n };\n \n const convertNumber = (number: number) => '' + number;\n \n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n \n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n \n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map(sourceGroup => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n \n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n \n const payloadTypesMap: Map = new Map();\n \n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n \n return payloadType;\n };\n \n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n \n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n \n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n \n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n \n return data;\n}\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 CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport CallInstance from \"./callInstance\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport { parseSdp } from \"./sdp/utils\";\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n \n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n \n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n \n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, //this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n \n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n \n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n \n return result;\n }\n \n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n \n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n \n return this.encryptPrepared(result);\n }\n \n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n \n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n \n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n \n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n \n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n \n return !msgKeyEquals;\n }\n \n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n \n const {isOutgoing, type} = this;\n \n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n \n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n \n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n \n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n \n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0', \n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`, \n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2', \n 'a=extmap-allow-mixed', \n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux', \n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0',\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\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 ctx from \"../../environment/ctx\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport { GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update } from \"../../layer\";\nimport { emojiFromCodePoints } from \"../../vendor/emoji\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { AppCallsManager, CallId } from \"../appManagers/appCallsManager\";\nimport { logger } from \"../logger\";\nimport type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport CallConnectionInstance from \"./callConnectionInstance\";\nimport CallInstanceBase from \"./callInstanceBase\";\nimport CALL_STATE from \"./callState\";\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"./constants\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription, { ConferenceEntry, generateSsrc } from \"./localConferenceDescription\";\nimport getCallProtocol from \"./p2P/getCallProtocol\";\nimport getRtcConfiguration from \"./p2P/getRtcConfiguration\";\nimport P2PEncryptor from \"./p2P/p2PEncryptor\";\nimport { p2pParseCandidate, P2PSdpBuilder } from \"./p2P/p2PSdpBuilder\";\nimport { parseSdp } from \"./sdp/utils\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec } from \"./types\";\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n \n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private appCallsManager: AppCallsManager;\n private apiManager: ApiManagerProxy;\n private apiUpdatesManager: ApiUpdatesManager;\n \n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n \n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n appCallsManager: CallInstance['appCallsManager'],\n apiManager: CallInstance['apiManager'],\n apiUpdatesManager: CallInstance['apiUpdatesManager'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n \n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n type: 'input',\n lowBattery: false,\n muted: true,\n screencastState: 'inactive',\n videoRotation: 0,\n videoState: 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find(entry => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n \n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.appCallsManager.generateDh().then(dh => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p,\n };\n\n return this.apiManager.invokeApi('phone.acceptCall', {\n peer: this.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(phonePhoneCall => {\n this.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n \n const {isOutgoing, encryptionKey, streamManager} = this;\n \n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection'),\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n \n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n \n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n \n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry; \n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n \n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n \n this.log('sendCallSignalingData', this.id, json);\n await this.apiManager.invokeApi('phone.sendSignalingData', {\n peer: this.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n \n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n \n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates', \n candidates: [parsed]\n });\n }\n\n public async confirmCall() {\n const {appCallsManager, apiManager, protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n \n const phonePhoneCall = await apiManager.invokeApi('phone.confirmCall', {\n peer: appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n \n this.encryptionKey = key;\n appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = this.apiManager.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then(codePoints => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map(codePoints => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter(transceiver => transceiver.direction === 'recvonly').forEach(transceiver => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n let bundle = description.entries.map(entry => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter(entry => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n \n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n \n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n \n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map(payloadType => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n \n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n \n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n pwd: data.pwd,\n ufrag: data.ufrag,\n fingerprints: data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach(codec => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex(payloadType => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex(payloadType => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n \n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map(ssrcGroup => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map(source => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n \n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n let bundle = description.entries.map(entry => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter(entry => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n \n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n \n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map(candidate => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n \n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n \n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n \n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(update: Update.updatePhoneCallSignalingData) {\n this.decryptQueue.push(update.data);\n this.processDecryptQueue();\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCallProtocol } from \"../../../layer\";\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCall } from \"../../../layer\";\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n \n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n \n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport type { AppGroupCallsManager } from \"../lib/appManagers/appGroupCallsManager\";\nimport GROUP_CALL_STATE from \"../lib/calls/groupCallState\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonIcon from \"./buttonIcon\";\nimport TopbarWeave from \"./topbarWeave\";\nimport SetTransition from \"./singleTransition\";\nimport PopupGroupCall from \"./groupCall\";\nimport type { AppPeersManager } from \"../lib/appManagers/appPeersManager\";\nimport type { AppChatsManager } from \"../lib/appManagers/appChatsManager\";\nimport GroupCallDescriptionElement from \"./groupCall/description\";\nimport GroupCallTitleElement from \"./groupCall/title\";\nimport PopupElement from \"./popups\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport GroupCallInstance from \"../lib/calls/groupCallInstance\";\nimport CALL_STATE from \"../lib/calls/callState\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport CallDescriptionElement from \"./call/description\";\nimport PopupCall from \"./call\";\nimport type { AppAvatarsManager } from \"../lib/appManagers/appAvatarsManager\";\nimport GroupCallMicrophoneIconMini from \"./groupCall/microphoneIconMini\";\nimport CallInstance from \"../lib/calls/callInstance\";\nimport type { AppCallsManager } from \"../lib/appManagers/appCallsManager\";\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n \n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n \n constructor(\n private appGroupCallsManager: AppGroupCallsManager,\n private appPeersManager: AppPeersManager,\n private appChatsManager: AppChatsManager,\n private appAvatarsManager: AppAvatarsManager,\n private appCallsManager: AppCallsManager\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(rootScope)('call_instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('call_accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_instance', (instance) => {\n this.updateInstance(instance);\n });\n \n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = this.appGroupCallsManager.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n \n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n \n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n let state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n \n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\n }\n \n if(isClosed) {\n return;\n }\n \n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n \n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n \n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n \n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n \n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n \n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n \n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n \n const end = ButtonIcon('endcall_filled');\n right.append(end);\n \n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n \n new PopupGroupCall({\n appGroupCallsManager: this.appGroupCallsManager,\n appPeersManager: this.appPeersManager,\n appChatsManager: this.appChatsManager\n }).show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall) as PopupCall[];\n if(popups.find(popup => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall({\n appCallsManager: this.appCallsManager,\n appAvatarsManager: this.appAvatarsManager,\n appPeersManager: this.appPeersManager,\n instance: this.instance\n }).show();\n }\n }, {listenerSetter});\n \n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n \n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall } from \"../../layer\";\nimport CallInstance from \"../calls/callInstance\";\nimport CALL_STATE from \"../calls/callState\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appProfileManager from \"./appProfileManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport type CallAudioAssetName = \"call_busy.mp3\" | \"call_connect.mp3\" | \"call_end.mp3\" | \"call_incoming.mp3\" | \"call_outgoing.mp3\" | \"voip_failed.mp3\" | \"voip_connecting.mp3\";\n\nexport class AppCallsManager {\n private log: ReturnType;\n private calls: Map;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n private audioAsset: AudioAssetPlayer;\n \n constructor() {\n this.log = logger('CALLS');\n \n this.tempId = 0;\n this.calls = new Map();\n this.instances = new Map();\n this.sortedInstances = [];\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n \n rootScope.addMultipleEventsListeners({\n updatePhoneCall: async(update) => {\n const call = this.saveCall(update.phone_call);\n\n let instance = this.instances.get(call.id);\n \n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n instance.confirmCall();\n }\n\n break;\n }\n \n case 'phoneCallRequested': {\n if(!instance) {\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n \n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n \n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManager.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint);\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n },\n \n updatePhoneCallSignalingData: (update) => {\n const instance = this.instances.get(update.phone_call_id);\n if(instance?.id !== update.phone_call_id) {\n return;\n }\n \n instance.onUpdatePhoneCallSignalingData(update);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\n ]);\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n public async computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return apiManager.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n \n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n \n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n return call;\n }\n \n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n \n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n \n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n appCallsManager: this,\n apiManager,\n apiUpdatesManager,\n ...options,\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n rootScope.dispatchEvent('call_instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then(async(dhConfig) => {\n return apiManager.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n \n public startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n \n const fullInfo = appProfileManager.getCachedFullUser(userId);\n if(!fullInfo) return;\n \n const {video_calls_available} = fullInfo.pFlags;\n \n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.generateDh().then(dh => {\n call.dh = dh;\n\n return apiManager.invokeApi('phone.requestCall', {\n user_id: appUsersManager.getUserInput(userId),\n protocol: call.protocol,\n video: isVideo && video_calls_available,\n random_id: nextRandomUint(32),\n g_a_hash: call.dh.g_a_hash\n });\n }).then(result => {\n const phoneCall = this.savePhonePhoneCall(result);\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n\nconst appCallsManager = new AppCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appCallsManager = appCallsManager);\nexport default appCallsManager;\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\n//import apiManager from '../mtproto/apiManager';\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport apiUpdatesManager from './apiUpdatesManager';\nimport appUsersManager from \"./appUsersManager\";\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport appChatsManager from './appChatsManager';\nimport appDocsManager from './appDocsManager';\nimport appInlineBotsManager from './appInlineBotsManager';\nimport appMessagesManager from './appMessagesManager';\nimport appPeersManager from './appPeersManager';\nimport appPhotosManager from './appPhotosManager';\nimport appProfileManager from './appProfileManager';\nimport appStickersManager from './appStickersManager';\nimport appWebPagesManager from './appWebPagesManager';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport { IS_TOUCH_SUPPORTED } from '../../environment/touchSupport';\nimport appPollsManager from './appPollsManager';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport appDraftsManager from './appDraftsManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport stateStorage from '../stateStorage';\nimport appDownloadManager from './appDownloadManager';\nimport { AppStateManager, STATE_INIT } from './appStateManager';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport appNotificationsManager from './appNotificationsManager';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatInvite, Dialog, Message, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport { getFilesFromEvent } from '../../helpers/files';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport { SliceEnd } from '../../helpers/slicedArray';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport appEmojiManager from './appEmojiManager';\nimport PopupElement from '../../components/popups';\nimport singleInstance from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport { pause } from '../../helpers/schedulers/pause';\nimport appMessagesIdsManager from './appMessagesIdsManager';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport RichTextProcessor from '../richtextprocessor';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport appGroupCallsManager, { GroupCallId, MyGroupCall } from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport appAvatarsManager from './appAvatarsManager';\nimport appCallsManager from './appCallsManager';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport { CallType } from '../calls/types';\nimport { Modify, SendMessageEmojiInteractionData } from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport { simulateClickEvent } from '../../helpers/dom/clickEvent';\nimport appReactionsManager from './appReactionsManager';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\n\n//console.log('appImManager included33!');\n\nappSidebarLeft; // just to include\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId?: PeerId, \n lastMsgId?: number, \n threadId?: number,\n startParam?: string\n};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n \n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n constructor() {\n apiUpdatesManager.attach();\n appNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach(theme => {\n if(theme.background.slug) {\n const url = /* window.location.origin + window.location.pathname + */'assets/img/' + theme.background.slug + '.svg';\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\n \n window.addEventListener('blur', () => {\n animationIntersector.checkAnimations(true);\n \n this.offline = rootScope.idle.isIDLE = true;\n this.updateStatus();\n clearInterval(this.updateStatusInterval);\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n \n window.addEventListener('focus', () => {\n this.offline = rootScope.idle.isIDLE = false;\n this.updateStatus();\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n \n // в обратном порядке\n animationIntersector.checkAnimations(false);\n\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n this.updateStatus();\n\n this.offline = rootScope.idle.isIDLE = false;\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true, passive: true});\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n // setTimeout(() => {\n this.applyCurrentTheme();\n // }, 0);\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) \n && document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n const resizeBackgroundDebounced = debounce(() => {\n this.setBackground(this.lastBackgroundUrl, false);\n }, 200, false, true);\n mediaSizes.addEventListener('resize', () => {\n resizeBackgroundDebounced();\n });\n\n rootScope.addEventListener('history_focus', (e) => {\n let {peerId, threadId, mid, startParam} = e;\n if(threadId) threadId = appMessagesIdsManager.generateMessageId(threadId);\n if(mid) mid = appMessagesIdsManager.generateMessageId(mid); // because mid can come from notification, i.e. server message id\n \n this.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId,\n startParam\n });\n });\n\n rootScope.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat || \n chat.peerId !== peerId || \n rootScope.overlaysActive || (\n mediaSizes.activeScreen === ScreenSize.mobile && \n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find(typing => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[appMessagesIdsManager.generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && bubble.classList.contains('sticker') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach(a => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n \n appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n rootScope.addEventListener('instance_deactivated', () => {\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n('Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n('Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n popup.addEventListener('close', () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n });\n\n popup.show();\n });\n\n // remove scroll listener when setting chat to tray\n rootScope.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', c || {});\n });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(appGroupCallsManager, appPeersManager, appChatsManager, appAvatarsManager, appCallsManager);\n }\n\n if(IS_CALL_SUPPORTED) {\n rootScope.addEventListener('call_instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n \n const popup = new PopupCall({\n appCallsManager,\n appAvatarsManager,\n appPeersManager,\n instance\n });\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n rootScope.dispatchEvent('call_accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = appCallsManager.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n }\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then(peerId => {\n appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n this.addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n if(pathnameParams[0] === 'c') {\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach(name => {\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange();\n this.attachKeydownListener();\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach(chat => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(rootScope.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(rootScope.filterId, true);\n let nextDialog: Dialog.dialog;\n if(!rootScope.peerId) {\n if(key === 'ArrowDown') {\n nextDialog = folder[0];\n }\n } else {\n const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);\n if(idx !== -1) {\n const nextIndex = key === 'ArrowUp' ? idx - 1 : idx + 1;\n nextDialog = folder[nextIndex];\n }\n }\n \n if(nextDialog) {\n this.setPeer({peerId: nextDialog.peerId});\n }\n } else if(key === 'ArrowUp') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMid: number;\n for(const mid of slice) {\n const message = chat.getMessage(mid);\n const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;\n\n if(good) {\n if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {\n goodMid = mid;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n \n if(goodMid) {\n chat.input.initMessageEditing(goodMid);\n cancelEvent(e); // * prevent from scrolling\n }\n }\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? appMessagesIdsManager.generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? appMessagesIdsManager.generateMessageId(+link.comment) : undefined;\n\n this.openUsername({\n userName: link.domain, \n lastMsgId: postId, \n commentId,\n startParam: link.start\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = appMessagesIdsManager.generateMessageId(+link.post);\n const threadId = link.thread ? appMessagesIdsManager.generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n apiManager.invokeApi('messages.checkChatInvite', {\n hash: link.invite\n }).then(chatInvite => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite).show();\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n \n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach(item => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = () => {\n const hash = location.hash;\n const splitted = hash.split('?');\n\n const params = this.parseUriParams(hash, splitted);\n\n this.log('hashchange', hash, splitted[0], params);\n\n if(params.tgaddr) {\n appNavigationController.replaceState();\n const {onclick} = RichTextProcessor.wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? appMessagesIdsManager.generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p, \n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(), \n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(options: {\n userName: string, \n lastMsgId?: number, \n threadId?: number, \n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return appUsersManager.resolveUsername(userName).then(peer => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n \n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return appMessagesManager.wrapSingleMessage(peerId, threadId).then(() => {\n const message: Message = appMessagesManager.getMessageByPeer(peerId, threadId);\n if(message._ === 'messageEmpty') {\n lastMsgId = undefined;\n } else {\n appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return appMessagesManager.getDiscussionMessage(peerId, msgId).then(message => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = appCallsManager.getCallByUserId(userId);\n if(call) {\n return;\n }\n \n const userFull = await appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n appCallsManager.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(appGroupCallsManager.groupCall && appGroupCallsManager.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(appCallsManager.currentCall && appCallsManager.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = appCallsManager.currentCall;\n if(currentCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = appGroupCallsManager.groupCall;\n if(currentGroupCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appGroupCallsManager.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n \n call = await appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = appGroupCallsManager.saveGroupCall(chatFull.call, chatId);\n }\n \n appGroupCallsManager.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false) {\n const theme = rootScope.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = AppStateManager.STATE_INIT.settings.themes.find(t => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setBackground('', true);\n });\n // }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = appDownloadManager.cacheStorage.getFile('backgrounds/' + slug).then(blob => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map(chat => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n //const bubble = chat.bubbles.getBubbleByPoint('top');\n //if(bubble) {\n //const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const top = chatBubbles.scrollable.scrollTop;\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && Object.keys(chatBubbles.bubbles).length) {\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc'),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = rootScope.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n rootScope.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n this.applyHighlightningColor();\n\n rootScope.setTheme();\n\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом \n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) { \n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat', \n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!isFiles || (!this.canDrag() && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const types: string[] = await getFilesFromEvent(e, true);\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter(t => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach(drop => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach(drop => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || rootScope.isOverlayActive || !chat.canSend('send_media'));\n }\n\n private onDocumentPaste = (e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!this.canDrag() && !newMediaPopup) return;\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n getFilesFromEvent(e).then((files: File[]) => {\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n new PopupNewMedia(this.chat, files, chatInput.willAttachType);\n }\n });\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n rootScope.dispatchEvent('im_tab_change', id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n if(!this.myId) return Promise.resolve();\n \n appUsersManager.setUserStatus(this.myId, this.offline);\n return apiManager.invokeApiSingle('account.updateStatus', {offline: this.offline});\n }\n\n private createNewChat() {\n const chat = new Chat(this, \n appChatsManager, \n appDocsManager, \n appInlineBotsManager, \n appMessagesManager, \n appPeersManager, \n appPhotosManager, \n appProfileManager, \n appStickersManager, \n appUsersManager, \n appWebPagesManager, \n appPollsManager, \n apiManager, \n appDraftsManager, \n serverTimeManager, \n stateStorage, \n appNotificationsManager, \n appEmojiManager,\n appMessagesIdsManager,\n appGroupCallsManager,\n appReactionsManager\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n rootScope.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n rootScope.dispatchEvent('chat_changing', {from: chatFrom, to: this.chat});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach(chat => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(this.chat.container, animate);\n\n if(justReturn) {\n rootScope.dispatchEvent('peer_changed', this.chat.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n \n const isSet = appSidebarRight.sharedMediaTab.setPeer(this.chat.peerId, this.chat.threadId);\n if(isSet) {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n appSidebarRight.sharedMediaTab.fillProfileElements();\n }\n \n /* setTimeout(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n }\n\n spliced.forEach(chat => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach(chat => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public setPeer(options: ChatSetPeerOptions = {}, animate?: boolean): boolean {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && chat.peerId !== peerId) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = chat.setPeer(peerId, lastMsgId, options.startParam);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n //window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex(chat => chat.peerId === peerId && chat.type === type);\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\n }\n\n rootScope.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n //this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId, \n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n //default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n if(!appUsersManager.isBot(peerId)) {\n const typings = appProfileManager.getPeerTypings(peerId);\n if(!typings || !typings.length) {\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = peerId.isUser() ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach(typing => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n return;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n let args: any[];\n if(peerId.isAnyChat()) {\n args = [\n new PeerTitle({peerId: typing.userId.toPeerId(false), onlyFirstName: true}).element,\n typings.length - 1\n ];\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(RichTextProcessor.wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n return container;\n }\n }\n\n public async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean) {\n let subtitle: HTMLElement;\n if(!peerId) return;\n\n if(peerId.isAnyChat()) { // not human\n let span = this.getPeerTyping(peerId);\n if(span) {\n return span;\n }\n\n const chatId = peerId.toChatId();\n const chatInfo = await appProfileManager.getChatFull(chatId) as any;\n this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = chatInfo.participants_count || (chatInfo.participants && chatInfo.participants.participants && chatInfo.participants.participants.length) || 1;\n //if(participants_count) {\n subtitle = appProfileManager.getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n } else { // user\n const user = appUsersManager.getUser(peerId);\n \n if(rootScope.myId === peerId && !ignoreSelf) {\n return;\n } else if(user) {\n subtitle = appUsersManager.getUserStatusString(user.id);\n\n if(!appUsersManager.isBot(peerId)) {\n let span = this.getPeerTyping(peerId);\n if(!span && user.status?._ === 'userStatusOnline') {\n span = document.createElement('span');\n span.classList.add('online');\n span.append(subtitle);\n }\n\n if(span) {\n return span;\n }\n }\n \n return subtitle;\n }\n }\n }\n\n public setPeerStatus(peerId: PeerId, element: HTMLElement, needClear: boolean, useWhitespace: boolean, middleware: () => boolean, ignoreSelf?: boolean) {\n if(needClear) {\n element.innerHTML = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n }\n\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && this.getPeerTyping(peerId, typingContainer)) {\n return;\n }\n\n this.getPeerStatus(peerId, ignoreSelf).then((subtitle) => {\n if(!middleware()) {\n return;\n }\n\n replaceContent(element, subtitle || (useWhitespace ? '‎' : ''));\n });\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\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 { deferredPromise } from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport { LazyLoadQueueBase } from \"./lazyLoadQueue\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach(name => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP, \n min: ZOOM_MIN_VALUE, \n max: ZOOM_MAX_VALUE, \n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n \n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach(el => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv, \n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n //console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n //console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n appNavigationController.removeByType('media');\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as any).cleanup && (this.listLoader as any).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n (window as any).appMediaViewer = undefined;\n\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n this.zoomSwipeHandler = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n\n promise.finally(() => {\n this.wholeDiv.remove();\n rootScope.isOverlayActive = false;\n animationIntersector.checkAnimations(false);\n });\n\n return promise;\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find(s => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(rootScope.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n \n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n \n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map(r => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n //let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = document.createElement('video');\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map(v => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map(v => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map(v => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n\n const isPeerId = fromId.isPeerId();\n let title: HTMLElement;\n if(isPeerId) {\n title = new PeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n } else {\n title = document.createElement('span');\n title.innerHTML = RichTextProcessor.wrapEmojiText(fromId);\n title.classList.add('peer-title');\n }\n\n replaceContent(this.author.nameEl, title);\n\n let oldAvatar = this.author.avatarEl;\n this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n if(!isPeerId) {\n this.author.avatarEl.setAttribute('peer-title', '' + fromId);\n } else {\n this.author.avatarEl.removeAttribute('peer-title');\n }\n\n this.author.avatarEl.setAttribute('peer', '' + (fromId || NULL_PEER_ID));\n\n oldAvatar.parentElement.replaceChild(this.author.avatarEl, oldAvatar);\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n //if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n //if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n \n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n \n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n rootScope.isOverlayActive = true;\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n const mainColumns = document.getElementById('main-columns');\n this.pageEl.insertBefore(this.wholeDiv, mainColumns);\n void this.wholeDiv.offsetLeft; // reflow\n this.wholeDiv.classList.add('active');\n animationIntersector.checkAnimations(true);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n });\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n //const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n let img: HTMLImageElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */document.createElement('video');\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n \n // if(!video.parentElement) {\n div.append(video);\n // }\n \n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n \n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n \n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video, \n play, \n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.removeListeners();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = () => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const cacheContext = appDownloadManager.getCacheContext(media);\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDocsManager.downloadDoc(media);\n \n if(!supportsStreaming) {\n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = cacheContext.url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n const rollback = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n rollback();\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = () => {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n const cancellablePromise = isDocument ? appDocsManager.downloadDoc(media) : appPhotosManager.preloadPhoto(media, size);\n \n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach(img => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch(err => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\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\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\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 MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = appMessagesManager.getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n detachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\n }\n };\n\n attachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = (e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId\n });\n });\n }\n };\n\n onDownloadClick = () => {\n const {peerId, mid} = this.target;\n const message = this.getMessageByPeer(peerId, mid);\n if(message.media.photo) {\n appPhotosManager.savePhotoFile(message.media.photo, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n } else {\n let document: MyDocument = null;\n\n if(message.media.webpage) document = message.media.webpage.document;\n else document = message.media.document;\n\n if(document) {\n //console.log('will save document:', document);\n appDocsManager.saveDocFile(document, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n }\n }\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html = '';\n if(caption) {\n html = RichTextProcessor.wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const cantForwardMessage = message._ === 'messageService' || !appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach(button => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n \n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach(button => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach(button => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\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 { Photo } from \"../layer\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId || this.current?.photoId;\n return appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then(value => {\n const items = value.photos.map(photoId => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\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 AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = () => {\n appPhotosManager.savePhotoFile(appPhotosManager.getPhoto(this.target.photoId), appImManager.chat.bubbles.lazyLoadQueue.queueId);\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\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 appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport isObject from \"../helpers/object/isObject\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n appAvatarsManager.removeFromAvatarsCache(peerId);\r\n (Array.from(document.querySelectorAll('avatar-element[peer=\"' + peerId + '\"]')) as AvatarElement[]).forEach(elem => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n if(!appAvatarsManager.isAvatarCached(peerId)) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find(img => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then(value => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(photo.id, getTarget(), undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n private peerId: PeerId;\r\n private isDialog: boolean;\r\n private peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n public isBig: boolean;\r\n private addedToQueue = false;\r\n\r\n connectedCallback() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n this.isDialog = this.getAttribute('dialog') === '1';\r\n if(this.getAttribute('clickable') === '') {\r\n this.setAttribute('clickable', 'set');\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n //console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n static get observedAttributes(): string[] {\r\n return ['peer', 'dialog', 'peer-title'/* массив имён атрибутов для отслеживания их изменений */];\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n //console.log('avatar changed attribute:', name, oldValue, newValue);\r\n // вызывается при изменении одного из перечисленных выше атрибутов\r\n if(name === 'peer') {\r\n const newPeerId = (newValue || '').toPeerId() || NULL_PEER_ID;\r\n if(this.peerId === newPeerId) {\r\n return;\r\n }\r\n \r\n this.peerId = appPeersManager.getPeerMigratedTo(newPeerId) || newPeerId;\r\n\r\n const wasPeerId = (oldValue || '').toPeerId() || NULL_PEER_ID;\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n this.update();\r\n } else if(name === 'peer-title') {\r\n this.peerTitle = newValue;\r\n } else if(name === 'dialog') {\r\n this.isDialog = newValue === '1';\r\n }\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const res = appAvatarsManager.putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb, this.isBig);\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n if(this.loadPromises) {\r\n if(res && res.cached) {\r\n this.loadPromises.push(promise);\r\n }\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.r(true);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return;\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const res = this.r();\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\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 appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, {Dialog} from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { positionMenu, openBtnMenu } from \"./misc\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\nimport PopupMute from \"./popups/mute\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: () => !appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && !appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = () => {\n let dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(err => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n new AppChatFoldersTab(appSidebarLeft).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [rootScope.config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n appMessagesManager.togglePeerMute(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n new PopupMute(this.selectedId);\n };\n\n private onUnreadClick = () => {\n const dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n appMessagesManager.readHistory(this.selectedId, dialog.top_message);\n appMessagesManager.markDialogUnread(this.selectedId, true);\n } else {\n appMessagesManager.markDialogUnread(this.selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, 'LI');\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.filterId = appDialogsManager.filterId;\n\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = appMessagesManager.getDialogOnly(this.selectedId);\n\n this.buttons.forEach(button => {\n const good = button.verify();\n\n button.element.classList.toggle('hide', !good);\n });\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\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\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\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 { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\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 App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport apiUpdatesManager from \"../lib/appManagers/apiUpdatesManager\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n sessionStorage.get('dc').then(baseDcId => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = rootScope.connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n attachClickEvent(a, (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => apiManager.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => apiManager.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","export default function roundRect(\n ctx: CanvasRenderingContext2D, \n x: number, \n y: number, \n width: number, \n height: number, \n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number, \n fill?: boolean, \n stroke?: boolean\n) {\n if(typeof(radius) === 'number') {\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\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 { animate } from \"../helpers/animation\";\nimport customProperties from \"../helpers/dom/customProperties\";\nimport easeInOutSine from \"../helpers/easing/easeInOutSine\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport roundRect from \"../helpers/roundRect\";\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n \n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n \n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n \n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n \n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n \n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n \n height *= DPR;\n const y = (SIZE - height) / 2;\n \n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\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 DialogsStorage from \"../storages/dialogs\";\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from \"../storages/filters\";\nimport type { LazyLoadQueueIntersector } from \"../../components/lazyLoadQueue\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport { attachContextMenuListener, putPreloader } from \"../../components/misc\";\nimport { ripple } from \"../../components/ripple\";\n//import Scrollable from \"../../components/scrollable\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appPeersManager from './appPeersManager';\nimport appImManager from \"./appImManager\";\nimport appMessagesManager, { Dialog, MyMessage } from \"./appMessagesManager\";\nimport appStateManager, { State } from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../rlottie/lottieLoader\";\nimport { wrapLocalSticker, wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport appChatsManager from \"./appChatsManager\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport generateVerifiedIcon from \"../../components/generateVerifiedIcon\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport groupCallActiveIcon from \"../../components/groupCallActiveIcon\";\nimport { Chat, NotifyPeer } from \"../../layer\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport appNavigationController, { NavigationItem } from \"../../components/appNavigationController\";\nimport assumeType from \"../../helpers/assumeType\";\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLLIElement,\n subtitleEl: HTMLElement\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => appMessagesManager.getDialogOnly(element.id)[this.indexKey],\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({dialog: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n private chatsPreloader: HTMLElement;\n\n private loadDialogsPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu = new DialogsContextMenu();\n\n public sortedList: SortedDialogList;\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n constructor() {\n this.chatsPreloader = putPreloader(null, true);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n this.setFilterId(0);\n this.addFilter({\n id: this.filterId,\n title: '',\n titleEl: this.allChatsIntlElement.element,\n orderIndex: 0\n });\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n appStateManager.getState().then((state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n appUsersManager.clear();\n appChatsManager.clear();\n \n const filtersStorage = appMessagesManager.filtersStorage;\n const filters = filtersStorage.filters;\n for(const filterId in filters) { // delete filters\n rootScope.dispatchEvent('updateDialogFilter', {\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n\n appMessagesManager.clear();\n\n /* const clearPromises: Promise[] = [];\n for(const name in appStateManager.storagesResults) {\n const results = appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(!IS_MOBILE_SAFARI) {\n if(id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n \n appNavigationController.unshiftItem(this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n this.setFilterId(id);\n this.onTabChange();\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n appMessagesManager.construct();\n appStateManager.getState().then((state) => {\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number) {\n this.filterId = filterId;\n this.indexKey = appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId) : 'index';\n rootScope.filterId = filterId;\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', (userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && !appUsersManager.isBot(userId) && peerId !== rootScope.myId) {\n const user = appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n /* rootScope.$on('dialog_top', (e) => {\n const dialog = e;\n\n this.setLastMessage(dialog);\n this.setDialogPosition(dialog);\n\n this.setFiltersUnreadCount();\n }); */\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setLastMessage(dialog, undefined, undefined, undefined, undefined, undefined, true);\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n }\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setUnreadMessages(dialog);\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.validateDialogForFilter(dialog);\n this.setUnreadMessages(dialog); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] li[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach(element => {\n this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', (filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = appMessagesManager.dialogsStorage.getCachedDialogs(true);\n this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n elements.title.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n });\n\n rootScope.addEventListener('filter_order', (order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n order.forEach((filterId) => {\n const filter = appMessagesManager.filtersStorage.getFilter(filterId);\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(filterId);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType>(key);\n appNotificationsManager.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n\n appNotificationsManager.getNotifyPeerTypeSettings();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n \n const renderFiltersPromise = appMessagesManager.filtersStorage.getDialogFilters().then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(state.filters && Object.keys(state.filters).length) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(appStateManager.storagesResults.dialogs.length) {\n appDraftsManager.addMissedDialogs();\n }\n\n return this.onChatsScroll().then(() => {\n appMessagesManager.fillConversations();\n });\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = dialog[this.indexKey];\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessage(dialog, undefined, dom, undefined, undefined, undefined, true);\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n this.onChatsScroll();\n };\n\n private setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const folder = appMessagesManager.dialogsStorage.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find(dialog => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n \n const sum = folder.unreadDialogsCount;\n unreadSpan.innerText = sum ? '' + sum : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private validateListForFilter() {\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId) || null;\n this.sortedList.getAll().forEach((element) => {\n const dialog = appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog, filter?: MyDialogFilter) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog, filter = appMessagesManager.filtersStorage.getFilter(this.filterId)) {\n if(!dialog || \n (filter && !appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) || \n (!filter && this.filterId !== dialog.folder_id)) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filterId: number) {\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n list, \n appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(filterId) : 'index',\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick & Partial<{titleEl: HTMLElement}>) {\n if(this.filtersRendered[filter.id]) return;\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.titleEl) titleSpan.append(filter.titleEl);\n else titleSpan.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter.id);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n \n if(this.loadDialogsPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n\n const promise = new Promise(async(resolve) => {\n const {chatList, filterId, indexKey} = this;\n\n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = appMessagesManager.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex(dialog => dialog[indexKey] <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = storage[needIndex][indexKey] + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n try {\n //console.time('getDialogs time');\n \n const getConversationsResult = appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(!getConversationsResult.cached && !chatList.childElementCount) {\n const container = chatList.parentElement;\n container.append(this.chatsPreloader);\n }\n \n const result = await getConversationsResult.promise;\n \n if(this.loadDialogsPromise !== promise) {\n return;\n }\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n const isBuggedDialog = !appMessagesManager.getDialogOnly(dialog.peerId);\n if(isBuggedDialog) {\n return;\n }\n\n const element = this.sortedList.add(dialog.peerId, true, cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n await Promise.all(loadPromises).finally();\n\n callbacks.forEach(callback => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = offsetDialog[indexKey];\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(this.chatsPreloader.parentElement) {\n this.chatsPreloader.remove();\n }\n \n resolve();\n }).finally(() => {\n this.loadDialogsPromise = undefined;\n });\n\n return this.loadDialogsPromise = promise;\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find(el => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n \n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n placeholderContainer.prepend(wrapLocalSticker({\n emoji: '📂',\n width: 128,\n height: 128\n }).container)\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, () => {\n new AppEditFolderTab(appSidebarLeft).open(appMessagesManager.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\n return this.updateContactsLengthPromise = appUsersManager.getContacts().then(users => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n \n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n \n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then(contacts => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false, \n onListLengthChange\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = (peerId: PeerId) => {\n return peerId.isContact() && !appMessagesManager.getDialogOnly(peerId);\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach(el => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach(el => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private setOffsets() {\n const chatList = this.chatList;\n const firstDialog = this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = firstDialog[indexKey];\n this.offsets.bottom = lastDialog[indexKey];\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n\n return Promise.resolve();\n } else if(this.loadDialogsPromise) return this.loadDialogsPromise;\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n //cancelEvent(e);\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, 'LI');\n\n if(!elem) {\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* , \n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessage(\n dialog: Dialog, \n lastMessage?: any, \n dom?: DialogDom, \n highlightWord?: string, \n loadPromises?: Promise[],\n isBatch = false,\n setUnread = false\n ) {\n ///////console.log('setlastMessage:', lastMessage);\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n //this.log.error('no dom for dialog:', dialog, lastMessage, dom, highlightWord);\n return;\n }\n }\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft && dialog.draft._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n \n lastMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n if(lastMessage._ === 'messageEmpty'/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.innerHTML = '';\n dom.lastTimeSpan.innerHTML = '';\n delete dom.listEl.dataset.mid;\n\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n }\n\n return;\n }\n\n const peerId = dialog.peerId;\n const isRestricted = lastMessage && appMessagesManager.isRestricted(lastMessage);\n //let peerId = appMessagesManager.getMessagePeer(lastMessage);\n\n //console.log('setting last message:', lastMessage);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n\n let mediaContainer: HTMLElement;\n if(!lastMessage.deleted && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = appMessagesManager.getMediaFromMessage(lastMessage);\n if(media && (media._ === 'photo' || (['video', 'gif'] as MyDocument['type'][]).includes(media.type))) {\n const size = appPhotosManager.choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n \n wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size,\n loadPromises\n });\n\n if((media as MyDocument).type === 'video') {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n const withoutMediaType = !!mediaContainer && !!lastMessage?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && lastMessage.message) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType);\n } else if(draftMessage) {\n fragment = appMessagesManager.wrapMessageForReply(draftMessage);\n } else if(!lastMessage.deleted) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType);\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(mediaContainer) {\n fragment.prepend(mediaContainer);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n \n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n dom.lastMessageSpan.prepend(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !lastMessage.action) {\n const sender = appPeersManager.getPeer(lastMessage.fromId);\n if(sender && sender.id) {\n const senderBold = document.createElement('b');\n\n if(sender.id === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n senderBold.append(new PeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n }).element);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n } //////// else console.log('no sender', lastMessage, peerId);\n }\n }\n\n if(!lastMessage.deleted || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null) {\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n } else { // means search\n dom.listEl.dataset.mid = lastMessage.mid;\n }\n }\n }\n\n private setUnreadMessages(dialog: Dialog, dom = this.getDialogDom(dialog.peerId), isBatch = false) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n if(!isBatch) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, 200);\n }\n }\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!lastMessage.deleted && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = appMessagesManager.isDialogUnread(dialog);\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private getDialog(dialog: Dialog | PeerId): Dialog {\n if(typeof(dialog) !== 'object') {\n const originalDialog = appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n const dialog = this.getDialog(options.dialog);\n\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = dialog;\n const isMuted = appNotificationsManager.isPeerLocalMuted(peerId, true);\n if(isMuted) {\n ret.dom.listEl.classList.add('is-muted');\n }\n\n if(!peerId.isUser()) {\n this.processDialogForCallStatus(dialog, ret.dom);\n }\n\n this.setLastMessage(dialog, undefined, ret.dom, undefined, options.loadPromises, options.isBatch, true);\n }\n\n return ret;\n }\n\n private processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage, \n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = appDialogsManager.addDialogNew({\n ...options,\n ...appMessagesManager.getMessageSenderPeerIdOrName(message),\n dialog: this.getDialog(peerId),\n });\n\n this.setLastMessage(ret.dialog, message, ret.dom, query);\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n dialog: Parameters[0],\n container?: Parameters[1],\n drawStatus?: boolean,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n }) {\n return this.addDialog(options.dialog, options.container, options.drawStatus, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName);\n }\n\n public addDialog(\n _dialog: Parameters[0], \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n drawStatus = true, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n ) {\n const dialog = this.getDialog(_dialog);\n const peerId = dialog.peerId;\n\n const avatarEl = new AvatarElement();\n avatarEl.loadPromises = loadPromises;\n avatarEl.lazyLoadQueue = lazyLoadQueue;\n avatarEl.setAttribute('dialog', meAsSaved ? '1' : '0');\n if(fromName !== undefined) avatarEl.setAttribute('peer-title', fromName);\n avatarEl.setAttribute('peer', '' + peerId);\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n\n if(drawStatus && peerId !== rootScope.myId && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(avatarEl, true);\n }\n }\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n titleSpanContainer.append(generateVerifiedIcon());\n }\n //}\n \n const span = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n\n const li = document.createElement('li');\n li.classList.add('chatlist-chat');\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom, dialog};\n }\n\n public setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessage(dialog, null, dom, undefined, undefined, undefined, null);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine (t: number, b: number, c: number, d: number) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\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 * 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 { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","PasswordMonkey","passwordInputField","size","needFrame","container","document","createElement","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","TrackingMonkey","inputField","max","playAnimation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","PasswordInputField","onVisibilityClick","toggleVisible","toggle","name","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","bufferConcats","args","reduce","acc","v","byteLength","tmp","Uint8Array","forEach","b","set","ArrayBuffer","bytesCmp","bytes1","bytes2","len","i","arr","concat","Set","setInnerHTML","elem","html","innerHTML","filterChatPhotosMessages","forEachReverse","history","message","idx","action","photo","splice","undefined","count","ListLoader","previous","next","reverse","loadCount","loadWhenLeft","loadedAllUp","loadedAllDown","safeAssign","setTargets","index","reset","loadedAll","current","loadPromiseUp","loadPromiseDown","go","dispatchJump","items","item","pop","push","shift","unshift","onJump","older","resolve","anchor","promise","loadMore","result","bind","processed","processItem","onLoadedMore","SearchListLoader","backLimit","maxId","mid","appMessagesIdsManager","appMessagesManager","searchContext","peerId","limit","inputFilter","_","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","has","filter","onEmptied","onHistoryMultiappend","obj","folderId","mids","sorted","Array","from","sort","a","targets","map","Boolean","onMessageSent","rootScope","storage","isScheduled","setSearchContext","context","useSearch","cleanup","SearchGroup","clearable","className","clickable","autonomous","onFound","list","nameEl","i18n","clear","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","window","setTimeout","beginSearch","focus","res","searchGroup","fromId","drawStatus","avatarSize","meAsSaved","err","console","error","replaceContent","catch","InputSearch","placeholder","prevValue","timeout","onInput","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","removeEventListener","icon","SliderSuperTab","slider","destroyable","_constructor","header","closeBtn","noRipple","title","content","addTab","listenerSetter","close","closeTab","open","init","selectTab","onCloseAfterTimeout","tabs","delete","removeAll","setTitle","key","SliderSuperTabEventable","eventListener","dispatchEvent","SidebarSlider","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","navigationType","id","animate","isNavigation","closingId","onCloseTab","tab","_selectTab","Map","tabsContainer","sidebarEl","querySelector","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","onPop","canAnimate","removeTabFromHistory","indexOfAndSplice","sliceTabsUntilTab","tabConstructor","preserveTab","getTab","find","t","isTabExists","onClose","AvatarEdit","getContext","clearRect","AppNewGroupTab","uploadAvatar","isGeoChat","avatarEdit","_upload","section","SettingSection","inputWrapper","groupNameInputField","label","maxLength","groupLocationInputField","canBeEdited","valueCheck","contains","userLocationCoords","userLocationAddress","nextBtn","appChatsManager","about","geo_point","address","megagroup","chatId","inputFile","peerIds","disabled","toUserId","chatsSection","nameArgs","new","startLocating","userId","dom","dialog","rippleEnabled","lastMessageSpan","appUsersManager","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","SHOULD_USE_SAFARI_FIX","IS_SAFARI","userAgent","match","appMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","_volume","_muted","_playbackRate","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","seekOffset","seekForward","duration","seekTo","seekTime","onMediaDocumentLoad","doc","appDocsManager","docId","supportsStreaming","handleSafariStreamable","cacheContext","appDownloadManager","src","url","playbackRate","onPlay","target","getMessageByMedia","verify","element","listLoader","jumpLength","findIndex","setMedia","getPlayingDetails","onPause","onEnded","isTrusted","paused","clean","s","playingMediaType","playItem","getMedia","resolveWaitingForLoadMedia","lockedSwitchers","cssText","body","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","volume","muted","addMedia","autoload","pFlags","is_scheduled","media_unread","once","deferred","w","waitingStorage","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","artwork","isVoice","artist","thumbs","bytes","sizes","h","appPhotosManager","peerPhoto","appPeersManager","appAvatarsManager","cached","attribute","attributes","file_name","performer","IS_APPLE","IS_TOUCH_SUPPORTED","metadata","MediaMetadata","willBePlayed","willBePlayedMedia","deepEqual","copy","getSearchContext","prev","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","enabled","attachGrabListeners","onStart","onMove","onEnd","onMouseMove","event","x","pageX","y","pageY","onMouseUp","onMouseDown","button","onTouchMove","preventDefault","touches","clientX","clientY","isTouch","onTouchEnd","onTouchStart","passive","RangeSelector","mousedown","events","withTransition","useTransform","vertical","scrub","rect","getBoundingClientRect","seek","setFilled","onScrub","filled","step","setProgress","stepStr","indexOf","decimals","setHandlers","setListeners","_removeListeners","addProgress","percents","clamp","transform","rectMax","offsetAxisValue","bottom","left","toFixed","removeListeners","ButtonMenuItem","text","onClick","checkboxField","noCheckboxClickListener","ripple","textElement","textArgs","regularText","keepOpen","cancelEvent","checked","buttons","ButtonMenuToggleHandler","openedMenu","asDiv","btnMenu","ControlsHover","hideControls","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","canHideControls","showControls","toggleControls","show","setup","ignoreClickClassName","findUpClassName","relatedTarget","showOnLeaveToClassName","lockControls","visible","MediaProgressLine","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","filledLoad","setSeekMax","scrubTime","buf","buffered","numRanges","nearestStart","end","start","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","btn","VideoPlayer","onPlaybackRackMenuToggle","wrapper","playbackRateButton","parentNode","appendChild","skin","stylePlayer","setBtnMenuToggle","controls","progress","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","fullScreenButton","timeElapsed","String","toHHMMSS","volumeSelector","leftControls","togglePlay","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","onFullScreen","setPlaybackRateIcon","rate","PLAYBACK_RATES_ICONS","player","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","formatBytes","dm","floor","log","parseFloat","pow","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","setAttributeNS","totalLength","attr","findMediaTargets","isBubbles","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","dataset","toPeerId","AudioElement","HTMLElement","withTime","voiceAsMusic","showSender","render","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","firstElementChild","downloadDiv","onTypeLoad","audioEl","out","waveform","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","mediaSizes","minW","maxW","createElementNS","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","wrapVoiceMessage","descriptionEl","parts","audioPerformer","htmlToSpan","date","joinElementsWith","titleEl","middleEllipsisEl","fontWeight","audioTitle","fileName","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","hadSearchContext","imgs","wrapped","wrapPhoto","boxWidth","boxHeight","loadPromises","withoutPreloader","lazyLoadQueue","images","thumb","full","img","attach","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","reject","playListener","download","setDownloadFunction","capture","disconnectedCallback","isConnected","customElements","define","DivAndCaption","fill","border","subtitle","MEDIA_SIZE","wrapReplyDivAndCaption","subtitleEl","mediaEl","limitSymbols","isRound","mediaChildren","children","middleware","textContent","webpage","wrapSticker","div","group","CHAT_ANIMATION_GROUP","noBlur","child","ReplyContainer","isMediaSet","accumulate","initialValue","Layouter","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","static","ratio","cropRatios","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","EditPeer","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","doNotEditAvatar","lockWithPromise","unlockOnSuccess","RadioForm","radios","form","Row","freezed","radioField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","titleRightSecondary","titleRightEl","navigationTab","createMedia","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","top","position","select","execCommand","removeChild","fallbackCopyTextToClipboard","RadioField","alignRight","stateKey","appStateManager","state","getDeepProperty","main","langKey","_i18n","Event","bubbles","toastEl","toast","toastNew","langPackKey","debounce","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","UsernameInputField","checkUsernameDebounced","checkUsername","getValue","originalValue","setState","I","setError","invalidText","head","username","checkUsernamePromise","channel","toChatId","available","availableText","takenText","isValidToChange","PopupPeer","overlayClosable","avatarEl","AvatarElement","noTitle","titleLangArgs","fragment","createDocumentFragment","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","callback","original","nextElementSibling","AppChatTypeTab","isBroadcast","random","privateRow","publicRow","privateSection","publicSection","chat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","appProfileManager","caption","noDelimiter","changed","linkInputField","applyBtn","channelId","setOriginalValue","onChatUpdate","noforwards","ScrollableLoader","loading","loaded","getPromise","checkForTriggers","AppSelectPeers","chatsContainer","selected","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","includes","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","splitUp","notRendered","filterPeerTypeBy","isPeerId","deleted","method","innerContainer","topContainer","selectedContainer","selectedScrollable","li","click","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","renderSaved","getTempId","getMoreDialogs","dialogs","archived","pageCount","windowSize","tempId","newOffsetIndex","findAndSplice","d","chatRightsAction","filterByRights","isEnd","contacts","getMoreContacts","isUser","isGlobalSearch","searchResult","resultPeerIds","my_results","results","filterUnique","getMoreChannelParticipants","channelParticipants","q","participants","participant","promises","containerEl","isAnyChat","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","getSelected","addInitial","values","forceDirection","PopupPickUser","closable","onSelect","hide","peerTypes","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","takeOut","banned_rights","btnDeleteException","btnDelete","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","restrictionText","info","mainFlag","restriction","until_date","flag","AppGroupPermissionsTab","chatPermissions","addExceptionRow","openPermissions","generateContentElement","findUpTag","setSubtitle","bannedRights","cantWhat","peer","listEl","update","needAdd","new_participant","view_messages","user_id","prev_participant","exceptionsCount","setLength","loader","setLoader","migrateFrom","migrateTo","onScroll","PopupDeleteDialog","peerTitleElement","callbackLeave","flush","callbackDelete","descriptionArgs","isDanger","AppChatReactionsTab","availableReactions","appReactionsManager","originalReactions","available_reactions","enabledReactions","toggleSection","toggleCheckboxField","toggleRow","reactionsSection","checkboxFields","availableReaction","reaction","saveReactionsDebounced","wrapStickerToRow","static_icon","every","saveReactions","newReactions","AppEditChatTab","_init","isChannel","chatUpdateListeners","addChatUpdateListener","canChangeType","canChangePermissions","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","reactionsRow","setReactionsLength","availableReactionsLength","inactive","reactions","permissionsRow","setPermissionsLength","race","removeAttribute","signMessagesCheckboxField","signatures","showChatHistoryCheckboxField","hidden_prehistory","AppEditContactTab","isNew","nameInputField","lastNameInputField","user","setDraftValue","first_name","last_name","notificationsCheckboxField","appNotificationsManager","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","phone","notificationsRow","AppAddMembersTab","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","IS_FIREFOX","generateVerifiedIcon","use","use2","getEvent","attachGlobalListenerTo","RESET_GLOBAL","SwipeHandler","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","setProperty","onFirstSwipe","onSwipeResult","onSwipe","setCursor","PeerProfileAvatars","photoId","avatar","BASE_CLASS","Image","draggable","loadCallback","avatars","intersectionObserver","observe","loadCallbacks","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","SWITCH_ZONE","freeze","clickX","prevTargets","nextTargets","openAvatarViewer","toRight","right","distance","offsetLeft","cancelNextClick","lastDiffX","minX","swipeHandler","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","ceil","IntersectionObserver","entries","entry","isIntersecting","loadNearestToTarget","setPeer","photos","Number","MAX_SAFE_INTEGER","m","chat_photo","activeTab","photo_id","unobserve","setText","PeerProfile","isDialog","setPeerStatus","needClear","bio","tagName","notifications","setMoreDetails","fillUsername","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","cleanupHTML","setMoreDetailsTimeout","canBeDetailed","oldAvatars","fillNotifications","fillRows","verified","fillProfileElements","cleaned","override","callbackify","peerFull","exportedInvite","AppSharedMediaTab","historiesStorage","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","deleteDeletedMessages","AppSearchSuper","mediaTabs","onChangeTab","mediaTab","btnAddMembers","showConfirmation","onError","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","setLoadMutex","loadMutex","peerChanged","setQuery","historyStorage","loadSidebarMedia","single","justLoad","RIGHT_COLUMN_ACTIVE_CLASSNAME","appSidebarRight","getElementById","isColumnProportionSet","to","toggleSidebar","setColumnProportion","sharedMediaTab","proportion","scrollWidth","previousElementSibling","documentElement","enable","active","willChange","animationPromise","AppPollResultsTab","resultsDiv","poll","appPollsManager","quiz","rQuestion","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","option","votesList","votes","vote","showMore","lastElementChild","next_offset","down","lineTotalLength","minIndex","minRemainder","k","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","prevQuizHint","hideQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","PollElement","setMaxLength","resizePolls","onHide","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","getTotalLength","pollId","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","strokeWidth","radius","circumference","PI","period","closeTime","serverTimeManager","quizInterval","time","Date","now","timeLeft","color","stroke","strokeDashoffset","strokeDasharray","clearInterval","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","textEl","entities","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","timeEl","setResults","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","cb","getPercentValue","iterate","fullTime","times","votersCount","multiplier","roundVideoCircumference","wrapVideo","withTail","isOut","noInfo","onlyPreview","noPlayButton","autoDownloadSize","noAutoDownload","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","mime_type","photoRes","divRound","halfSize","ctx","globalVideo","isInDOM","onPaused","onFrame","drawImage","detached","foreignObject","getAttributeNS","gotThumb","poster","aspecter","isUpload","downloaded","attachMethod","renderDeferred","detach","isFulfilled","animationIntersector","loadPhotoThumbFunc","loadFunc","setManual","queueId","renderImageFromUrl","wrapDocument","audioElement","extSplitted","split","ext","isArray","toLowerCase","docDiv","icoDiv","descriptionParts","nameDiv","_downloadDiv","save","canOpenAfter","noThumb","noFadeIn","blurAfter","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","needFadeIn","renderOnLoad","renderImageWithFadeIn","canAttachPreloader","renderPromise","sequentialDom","wrapStickerAnimation","side","skipRatio","animationDiv","stickerPromise","withThumb","assumeType","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","stableOffsetX","setPosition","onlyThumb","emoji","needUpscale","asStatic","stickerType","sticker","toneIndex","isAnimated","isThumbNeededForType","haveThumbCached","stickerCachedThumbs","afterRender","stickerThumbConverted","webpWorkerController","blob","animationData","data","sendInteractionThrottled","appStickersManager","restart","bubble","throttle","firstTime","msg_id","emoticon","interaction","JSON","stringify","devicePixelRatio","wrapStickerSetThumb","downloadOptions","animated","videos","lottieLoader","URL","createObjectURL","stickerSet","documents","previousMedia","_size","wrapReply","replyContainer","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","groupId","attachmentDiv","getMessage","positionElementByIndex","pos","prevPos","whichChild","SortedList","updateElementWith","updateListWith","_updateList","onSort","updateList","canUpdate","getAll","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","insertInDescendSortedArray","SortedUserList","onListLengthChange","status","willChangeLength","createChatListOptions","doTimeout","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","PopupForward","peerIdMids","overrideOnSelect","PopupDeleteMessages","onConfirm","revoke","titleArgs","hasRights","canRevoke","PopupSendNow","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","AppSelection","selectedMids","doNotAnimate","onCancelSelection","toggleSelection","listenElement","selectedText","toString","createRange","verifyTouchLongPress","getElementFromTarget","getElementsBetween","last","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","toggleByMid","canceledSelection","verifyMouseMoveTarget","removeManual","documentListenerOptions","isElementShouldBeSelected","appendCheckbox","toggleElementCheckbox","hasCheckbox","getCheckboxInputFromElement","updateContainer","forceSelection","cantForward","cantDelete","cantSend","getScheduledMessagesStorage","getMessagesStorage","getMessageFromStorage","canForward","canDeleteMessage","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","IS_MOBILE_SAFARI","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","keys","fromPeerId","isPrivate","transitionElement","opacity","ChatSelection","bubblesContainer","recording","canSelectBubble","isGroupedBubbleSelected","getMidsByMid","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","isGrouped","groupedCheckboxInput","SearchContextMenu","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","cancelBubble","withSelection","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","span","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","horizontalMenu","tabContent","skipScroll","newMediaTab","fromMediaTab","offsetTop","scrollHeight","rect2","onMediaClick","targetClassName","AppMediaViewer","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","lock","unlockAndRefresh","processEmptyFilter","processPhotoVideoFilter","elemsToAppend","processDocumentFilter","processUrlFilter","entity","totalEntities","display_url","sliced","same","hostname","hash","rDescription","previewDiv","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","sharedMediaDiv","processCallback","monthContainer","getMonthContainerByTimestamp","afterPerforming","loadChats","inputMessagesFilterEmpty","showMembersCount","participants_count","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","formatPhoneNumber","formatted","arg","globalContacts","intlElement","isShort","minDate","renderRecentSearch","recent","recentSearch","peers","people","onlyFirstName","loadMembers","renderParticipants","membersList","LOAD_COUNT","loadType","logStr","used","slicedLength","ids","filters","counters","firstMediaTab","counter","membersTab","toLoad","timestamp","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","goFirst","revokeObjectURL","newInputFilter","maxDate","PrivacyType","appPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","inputKey","privacyRules","users","chats","apiUpdatesManager","convertInputKeyToKey","inputRule","rule","assign","getPrivacy","privacyKey","getPrivacyRulesDetails","types","allowPeers","disallowPeers","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","Everybody","Nobody","radioRows","Contacts","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","setRadio","chatKey","usersKey","splitted","AppPrivacyPhoneNumberTab","phoneCaption","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","goNext","btnChange","btnResend","disable","AppTwoStepVerificationEmailTab","onContinueClick","btnContinue","btnSkip","toggleButtons","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","has_password","labelText","getStateInterval","getState","_state","auth","AppTwoStepVerificationTab","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","country","date_active","date_created","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","otherSection","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","bot","blocked","convertKeyToInputKey","toUpperCase","AppPrivacyAndSecurityTab","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","settings","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","appDraftsManager","auths","averageColorFromCanvas","pixel","pixels","getImageData","pixelsLength","outPixel","Uint8ClampedArray","rgbaToHsla","g","l","hslaToRgba","hue2rgb","hexaToRgba","hexa","parseInt","hexToRgb","hex","rgbaToHexa","rgba","highlightningColor","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","onWheel","_animatingToNextPosition","_scrollDelta","deltaY","_onWheelRAF","drawOnWheel","changeTail","curPos","curPosition","_phase","_tail","drawGradient","drawNextPositionAnimated","frames","_frames","drawImageData","leftLength","_incrementalCurve","getPositions","positions","getNextPositions","phase","curveMax","curve","distances","nextPos","tail","getGradientImageData","_hctx","createImageData","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","colors","getAttribute","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","curves","scrollAnimate","_addedScrollListener","createCanvas","gradientRenderer","ColorPicker","hue","saturation","lightness","alpha","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","hexaToHsla","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hsl","hsla","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","onColorChange","applyColor","gridSection","grid","backgroundColor","isColored","uploadTempId","AppBackgroundTab","clicked","wallpapersByElement","elementsByKey","onUploadClick","file","access_hash","dc_id","file_reference","wallpaper","upload","addNotifyListener","_wallpaper","newDoc","newCacheContext","setBackgroundDocument","getWallpaperKey","addWallPaper","onResetClick","defaultTheme","STATE_INIT","blurCheckboxField","blur","onGridClick","saveToCache","_tempId","onReady","getPixelPromise","imageUrl","naturalWidth","naturalHeight","averageColor","create","getColorsFromWallpaper","getWallpaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","accountWallpapers","wallpapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","ANIMATION_GROUP","PopupStickers","stickerSetInput","onStickersClick","fileId","h6","stickersDiv","stickersFooter","loadStickerSet","installed_date","AppQuickReactionTab","quickReaction","RangeSettingSelector","minValue","writeValue","valueDiv","valueContainer","range","AppGeneralSettingsTab","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","str","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","renderQuickReaction","loopCheckboxField","stickerSets","stickersContent","renderStickerSet","allStickers","sets","AppEditProfileTab","firstNameInputField","bioInputField","i18n_","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","userFull","AppIncludedChatsTab","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","editFolderTab","setFilter","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","hasOwnProperty","originalFilter","AppEditFolderTab","deleteFolderButton","bool","menuBtn","inputSection","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","loadAnimationPromise","onCreateOpen","onEditOpen","ul","renderMore","_length","exclude_peers","AppChatFoldersTab","filtersRendered","renderFolder","dialogFilter","folder","channels","filterId","orderIndex","createFolderBtn","foldersSection","suggestedSection","onFiltersContainerUpdate","getSuggestedFilters","order","suggestedFilters","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","contactsSignUpRow","soundRow","sound","AppLanguageTab","lang_pack","languages","language","lang_code","native_name","langPack","confirmationPopup","cancelButton","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","MIN","MAX_RANGE","MAX","upTo","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","onDisabledChange","gifsCheckboxField","videosCheckboxField","peerKeys","enabledKeys","isAll","edit","changeAvatarBtn","updateChangeAvatarBtn","buttonsDiv","devicesRow","languageRow","buttonsSection","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","PopupCreateContact","withConfirm","btnConfirm","telInputField","validate","country_code","AppContactsTab","inputSearch","openContacts","isContact","sortedUserList","createList","IS_MOBILE","renderPage","AppArchivedTab","chatList","wasFilterId","AppPeopleNearbyTab","isLocationWatched","errorCategory","retryBtn","locatedPeers","dialogSize","parseDistance","peopleSection","SettingChatListSection","sortedList","btnMakeVisible","makeButton","btnMakeInvisible","btnCreateGroup","startWatching","stopWatching","latestLocationSaved","accuracy","updates","orderedPeers","groupsCounter","usersCounter","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","lat1","long1","lat2","long2","asin","formatNumber","LEFT_COLUMN_ACTIVE_CLASSNAME","fakeGradientDelimiter","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","themeCheckboxField","filteredButtons","userName","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","stopPropagation","newBtnMenu","updateBtn","reload","initSearch","archivedCount","unreadDialogsCount","checkUpdateInterval","cache","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","peopleContainer","hideNewBtnMenuTimeout","activeClassName","onFocus","clearRecentSearchBtn","BubbleGroups","detailsMap","newGroupDiff","removeBubble","updateGroup","changeBubbleMid","addBubble","viaBotId","fwdFromId","insertObject","foundBubble","foundAtIndex","foundMidOnSameTimestamp","_timestamp","_mid","bubbleGroup","insertIndex","updateGroupByMessageId","PopupDatePicker","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","setMonth","getMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","setFullYear","getDate","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","getMinutes","getHours","popupCenterer","timeOptions","sendDate","dateOptions","day","weekday","renderElement","firstDate","weekStartDate","getDay","dayIndex","clonedDate","showOverflowMonths","lines","CLASS_NAME","StackedAvatars","avatarContainer","AVATAR_CLASS_NAME","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","center_icon","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","stackedAvatars","peer_id","setIsChosen","isChosen","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","REACTIONS_ELEMENTS","ReactionsElement","connectedCallback","onConnectCallback","getReactionCount","reactionElement","isPlaceholder","changeMessage","changedResults","hasReactions","availableReactionsResult","some","totalReactions","can_see_list","reactionElementIdx","recent_reactions","handleChangedResults","childNodes","timeSpan","RepliesElement","updated","postKey","replies","leftPart","recent_repliers","isUnread","read_max_id","max_id","textSpan","iconSpan","rippleContainer","makeEdited","edited","makeSponsored","MessageRender","setTime","chatType","editedSpan","sponsoredSpan","reactionsElement","reactionsMessage","isSponsored","sponsored","isMessage","views","postAuthor","post_author","fwd_from","postViewsSpan","channelViews","edit_date","edit_hide","pinned","inner","clonedArgs","_reactionsElement","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","reply_to_mid","replyToPeerId","reply_to","reply_to_peer_id","getPeerId","originalPeerTitle","originalMessage","getMessageByPeer","wrapSingleMessage","needUpdate","replyMid","getElementByPoint","verticalSide","horizontalSide","elementFromPoint","reflowScrollableElement","StickyIntersector","handler","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","addSentinel","sentinel","observeStickyHeaderChanges","headerSentinel","disconnect","EMOJI_LANG_PACK","keywords","version","langCode","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","getEmojiKeywords","storageKey","stateStorage","pack","isObject","validateInitObject","from_version","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","getRecentEmojis","indexEmojis","indexObject","searchEmojis","emojis","search","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","pushRecentEmoji","appEmojiManager","loadedURLs","appendEmoji","unify","spanEmoji","kek","getEmojiFromElement","nodeType","nodeValue","EmojiTab","closeScrollTop","onContentClick","divs","category","titleDiv","itemsDiv","unified","menu","emojiScroll","hasRecent","activeId","EmoticonsDropdown","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","GifsMasonry","scrollPromise","processInvisibleDiv","intersector","isVisible","processVisibleDiv","gifWidth","gifHeight","willUseWidth","calcImageInBox","GifsTab","gifsContainer","masonry","EMOTICONSSTICKERGROUP","gifs","SuperStickerRenderer","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","StickersTab","recentStickers","queueCategoryPush","categoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","stickers","menuWrapper","menuScroll","setTyping","pushRecentSticker","appInlineBotsManager","inlineResults","setHash","getGeoInput","geo","accuracy_radius","getInlineResults","botId","stopTime","noErrorBox","botResults","queryId","query_id","generateQId","resultId","pushPopularBot","topPeers","botPeerId","topPeer","rating","switchToPM","startParam","checkSwitchReturn","bot_inline_placeholder","peerData","switchInlineQuery","callbackButtonClick","callbackAnswer","noLinks","noLinebreaks","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","send_message","reply_markup","replyMarkup","inputMedia","sendMessage","geoPoint","provider","venue_id","venue_type","phone_number","vcard","percent","ANIMATIONGROUP","AppGifsTab","nextOffset","onGifsClick","gifsDiv","newSearch","gifBotPeerId","AppStickersTab","setsDiv","renderSet","countDiv","stickerDiv","renderFeatured","coveredSets","filterRendered","covered","DropdownHover","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","dispatchResultableEvent","attachButtonListener","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","savedRange","getGoodRange","unlock","refresh","emojiTab","stickersTab","gifsTab","HIDE_EMOJI_TAB","INIT_TAB_ID","addLazyLoadQueueRepeat","getVisible","clearVisible","getSavedRange","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","SEND_WHEN_ONLINE_TIMESTAMP","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","overflow","horizontal","visualViewport","windowWidth","innerWidth","windowHeight","innerHeight","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","peopleCount","numberThousandSplitter","ScrollSaver","previousScrollHeight","previousScrollHeightMinusTop","restore","useReflow","newScrollTop","lastScrollPosition","IGNORE_ACTIONS","SERVICE_AS_REGULAR","TEST_SCROLL_TIMES","TEST_SCROLL","ChatBubbles","unreadOut","skippedMids","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","loadedTopTimes","loadedBottomTimes","messagesQueuePromise","messagesQueue","messagesQueueOnRender","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getMiddleware","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","chatInner","onDatePick","contactDiv","appImManager","setInnerPeer","callDiv","callUser","spoiler","showDuration","useRafs","spoilerTimeout","bubbleMid","reply_to_top_id","lastMsgId","saved_from_msg_id","openThread","filterMessages","getDiscussionMessage","channel_id","via","setDraft","peerIdStr","savedFrom","messageId","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","getMediaFromMessage","parents","hasAspecter","albumItem","getMidsByMessage","isReplyClick","replyToMid","reply_to_msg_id","distanceToEnd","getDistanceToEnd","lastScrollDirection","setPeerPromise","topbar","pinnedMessage","setCorrectIndex","setStickyDateManually","requestHistory","setMessageId","setScroll","bubbleGroups","setBubblePosition","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","reactionsElements","repliesElement","grouped_id","newPoll","safeRenderMessage","scrollToBubbleIfLast","getGroupedBubble","updatePosition","saveOnUpdateScroll","deleteEmptyDateGroups","getBubbleByMessage","appendReactionsElementToBubble","deletedMids","renderedId","getMidsByAlbum","renderMaxId","groupedMessagesStorage","replyAfter","shouldReply","canSend","_target","initMessageReply","highlightBubble","constructPeerHelpers","renderNewMessagesByIds","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","isScrolledDown","setMessagesQueuePromise","performHistoryResult","postViewsElements","different","postViews","unreadedObserver","onUnreadedInViewport","viewsObserver","sendViewCountersDebounced","sponsoredMessage","random_id","apiManager","invokeApiSingle","getChannelInput","incrementMessageViews","wasHeight","offsetHeight","resizing","skip","scrolled","part","rAF","onResizeEnd","setEndRAF","processEntries","contentRect","realDiff","_part","needScrollTop","ResizeObserver","onUpdateScrollSaver","setReactionsHoverListeners","timestamps","lastVisible","dateMessage","visibleRect","previousStickyDate","needReflow","getRenderedLength","readUnreaded","readPromise","bubblesMaxId","getHistoryStorage","readContents","isMentionUnread","readMessages","readHistory","constructPinnedHelpers","constructScheduledHelpers","onGoDownClick","bad","getBubbleByPoint","grouped","findNextMountedBubbleByMsgId","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory","setLoaded","onScrolledTop","readMaxId","readOutboxMaxId","msgId","permanent","emptyPlaceholderMid","replyTo","getLastBubble","setPaddingTo","isPaddingNeeded","clientHeight","paddingTop","scrollToBubbleEnd","lastDateGroup","getLastDateGroup","scrollToBubble","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","messageInput","margin","axis","getNormalSize","lastElem","lastTime","firstTimestamp","datasetKey","getDateContainerByMessage","today","bubbleContent","serviceMsg","destroy","bubblesToo","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","samePeer","isRestricted","topMessage","pinnedMessages","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","getDialogOnly","unread_count","foundSlice","findSliceOffset","isJump","setStartParam","setQueueId","messageEntityBotCommand","isAnyGroup","isBot","additionMsgId","maxBubbleId","oldChatInner","fromUp","mountedByLastMsgId","afterSetPromise","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","onScrolledAllDown","unread_mark","markDialogUnread","canWrite","renderMessagesQueue","queue","setUnreadDelimiter","local","additionalCallback","renderMessage","multipleRender","albumMustBeRenderedFull","our","isMegagroup","contentWrapper","wasClassNames","classNames","transitionDelay","originalMid","unread","chat_id","wrapMessageActionTextNew","is_single","messageMessage","messageMedia","getAlbumText","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","getAnimatedEmojiSticker","forward","containerDiv","rowDiv","buttonEl","same_peer","popup","column","messageWithReplies","getMessageWithReplies","withReplies","fwdFrom","nameContainer","canHideNameIfMedia","processingWebPage","IS_ANDROID","previewResizer","preview","quote","mediaSize","quoteTextDiv","site_name","strong","textDiv","isSquare","setAttachmentSize","emojiSticker","animatedSticker","staticSticker","newNameContainer","wrapGroupedDocuments","lastContainer","formatCallDuration","reason","contact","texts","wrapPoll","UNSUPPORTED_LANG_PACK_KEY","needName","titleVia","isForwardFromChannel","from_id","isHidden","getUser","from_name","getPeerColorById","goto","generateTail","documentContainer","documentMessageDiv","isBackLimit","scrollSaver","needReflowScroll","processLocalMessageRender","firstSlice","lastSlice","getSearch","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","getServerMessageId","setBubbles","delay","lastMsDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","getPeer","creator","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","getOutputPeer","saveMessages","checkPlaceholders","invokeApiCacheable","cacheSeconds","sponsoredMessages","saveApiUsers","saveApiChats","getProfile","bot_info","checkIfEmptyPlaceholderNeeded","realLoadCount","resultPromise","isFirstMessageRender","processResult","historyResult","serviceStartMessageId","threadsServiceMessagesIdsStorage","sup","processPromise","waitPromise","safeCount","mustBeCount","PopupPinMessage","unpin","canUnpin","oneSide","silent","buttonText","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","PopupReportMessagesConfirm","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","buttonsEl","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","newMessage","btnClose","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","animationGroup","renderReaction","setVisible","scaleContainer","appearWrapper","selectWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","onContextMenu","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","noForwards","viewerPeerId","canOpenReactedList","initResult","menuPadding","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","getPeerUsername","onPinClick","onUnpinClick","onRetractVote","sendVote","onStopPoll","stopPoll","reactionsMenu","filterButtons","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","canPinMessage","saveDocFile","hasTarget","isGoodType","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","MAX_AVATARS","PADDING_PER_AVATAR","visibility","paddingRight","reactionsCount","fakeElem","readParticipants","totalSize","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","questionInputField","sendSilent","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","HTMLInputElement","getRichValue","question","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","placeCaretAtEnd","attachFile","willAttach","shouldCompress","params","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","wasInputValue","messageInputField","attachFiles","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","isMedia","sendingParams","sendText","sendAlbum","replyToMsgId","startsWith","source","objectURL","videoWidth","videoHeight","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onload","isPhoto","isAudio","finish","onerror","mimeType","onRender","foundPhotos","foundVideos","foundFiles","n","appendMediaToContainer","firstType","albumContainer","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","AutocompleteHelper","hidden","onVisible","resetTarget","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","_onKeyDown","attachListNavigation","listType","navigationItem","noBlurOnPop","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","ready","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","node","alt","getRichElementValue","caretPos","substr","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","ignoreCase","commands","botInfo","botCommand","command","found","CommandsHelper","getReadyToSend","getProfileByPeerId","AutocompleteHelperController","helpers","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","InlineHelper","_checkQuery","resolveUsername","gifsMasonry","isGallery","gallery","noCommands","separator","dcId","readBlobAsDataURL","dataURL","switch_pm","btnSwitchToPM","ChatBotCommands","setUserId","POSTING_MEDIA_NOT_ALLOWED","ChatInput","appWebPagesManager","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","shiftKey","onMessageInput","richValue","markdownEntities","urlEntities","getWebPagePromise","webPage","saveWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","sendAsContainer","sendAsCloseBtn","sendAsButtons","previousAvatar","onSendAsMenuToggle","sendAsAvatar","sendAsBtnMenu","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","accept","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","updateSendAs","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","neededFakeContainer","getNeededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","isStartButtonNeeded","isPeerLocalMuted","hasMentions","unread_mentions_count","serverTimeOffset","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","rMessage","setInputValue","inputFake","updateOffset","hasBotCommands","getUserFullResult","updateBotCommands","sendAsPeerId","updatingSendAsPromise","updateMessageInput","updateSendAsButtons","getChatMembersString","currentPeerId","channelFull","getCachedFullChat","default_send_as","updateSendAsAvatar","updateMessageInputPlaceholder","executeButtonsUpdate","sendAsPeerIds","getInputPeerById","send_as","getDefaultSendAs","getChannelFull","updateSendAsResult","getSendAs","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","ctrlKey","metaKey","setStart","collapse","addRange","readAllHistory","commandsMap","bold","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","suffix","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","previousSibling","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","unicode","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","getDoc","hideCaptionCheckboxField","replyFragment","wrapMessageForReply","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","usingFullAlbum","albumMids","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","ChatAudio","onPlaybackRateChange","fasterEl","toggleEl","onStop","onMediaPlay","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","path","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","getRow","animateFirst","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","locked","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","debug","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","lastY","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","PopupMute","tsNow","ONE_HOUR","radioForm","ChatTopbar","appGroupCallsManager","verifyButtons","isMenuOpen","btnMore","menuButtons","getDeleteButtonText","buttonsToVerify","verifyVideoChatButton","currentGroupCall","groupCall","getChatTyped","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","onResize","resize","setUtilsRAF","chatUtils","chatAudio","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","togglePeerMute","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","toggleBlock","attachClickEvent","joinChannel","addChatUser","getChat","setMutedState","isTopMessage","hiddenPinnedMessages","constructDiscussionHelpers","byCurrent","wasPeerId","newPinnedMessage","getSearchCounters","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","instance","INSTANCES","renderToCanvas","createCanvasPattern","fillCanvas","createCanvasPatternPromise","crossOrigin","createPatternFrom","createPattern","exportCanvasPatternToImage","exportCanvasPatternToImagePromise","toBlob","newUrl","objectUrl","setCanvasDimensions","Chat","backgroundEl","Log","backgroundTempId","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","patternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","contextMenu","beforeDestroy","cleanupBackground","searchTab","setAutoDownloadMedia","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","setPrefix","wasAlreadyUsed","canSendToPeer","MarkupTooltip","addedListener","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","hideTimeout","getActiveMarkupButton","nodes","getSelectedNodes","currentMarkups","closest","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","containerRect","isFirstShow","setMouseUpEvent","handleSelection","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","draw","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","createLinearGradient","addColorStop","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","raf","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","computedStyle","getProperty","getComputedStyle","getPropertyValue","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","getItem","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","withIcons","icons","iconClassName","element2","actionClassName","GroupCallParticipantsList","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","mutedState","callVideoCanvasBlur","renderFrame","GroupCallParticipantVideoElement","setPinned","setParticipant","peerTitle","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","isPinned","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getParticipantByPeerId","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","mediaDevices","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","onFullScreenChange","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","isBig","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CALL_STATE","CallDescriptionElement","interval","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","big","isPendingIncoming","isMuted","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","parseSignalingData","sdp","parseMediaSectionInfo","fingerprints","fingerprint","ufrag","pwd","screencast","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","sources","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","negotiateInternal","connection","call","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","TextEncoder","encode","convertToUint8Array","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","dir","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","protocol","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","streamManager","canCreateConferenceEntry","lowBattery","videoRotation","Proxy","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","iceConnectionState","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","appendToConference","isSharingVideoType","audioTrack","getAudioTracks","isClosing","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","invokeApi","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","password","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","bindPrefix","createPeerConnection","negotiate","sendIceCandidate","onTrack","createDescription","encryptor","decryptor","appendStreamToConference","createDataChannel","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","dataChannel","negotiated","applyDataChannelData","parse","sendDataChannelData","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","invokeCrypto","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","closeConnectionAndStream","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","CALL_REQUEST_TIMEOUT","calls","instances","sortedInstances","updatePhoneCall","saveCall","phone_call","createCallInstance","admin_id","g_a_or_b","updatePhoneCallSignalingData","phone_call_id","audioAsset","currentCall","getCallByUserId","callId","isDiscarded","oldCall","safeReplaceObject","getCall","hasConnected","playSound","stopSound","playSoundIfDifferent","hasCurrent","random_length","dhConfig","startCallInternal","isVideo","fullInfo","participant_id","connection_id","FOCUS_EVENT_NAME","columnEl","offline","updateStatusInterval","onHashChange","parseUriParams","tgaddr","onclick","postId","post","openUsername","setSettings","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","canDrag","DragEvent","_types","dataTransfer","backgroundPromises","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","applyCurrentTheme","resizeBackgroundDebounced","lastBackgroundUrl","saveChatPosition","choosing","setChoosingStickerTyping","typings","typing","singleInstance","topbarCall","discardCurrentCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","makeLink","VOICE_CHAT","PRIVATE_POST","thread","comment","MESSAGE","domain","attachKeydownListener","myId","activatingChat","screen","IGNORE_KEYS","goodMid","nextDialog","newEvent","KeyboardEvent","commentId","noPathnameParams","pathname","noUriParams","openComment","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","setCurrentBackground","broadcastEvent","AppStateManager","getBackground","chatBubbles","chatPositions","applyHighlightningColor","val","endsWith","hslaStringToRgba","hslaStringToHexa","hslaStringToHex","backgroundUrl","prevTab","prevIdx","attachDragAndDropListeners","drops","mediaDrops","mount","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","drop","transitionTime","spliceChats","fromIndex","justReturn","spliced","chatFrom","chatIndex","existingIndex","oldChat","getTypingElement","dot","eye","getPeerTyping","langPackKeys","multi","mapa","typingElement","descriptionElement","getPeerStatus","ignoreSelf","onlines","useWhitespace","typingContainer","AppMediaViewerBase","topButtons","author","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","ctrlKeyDown","changeZoom","onKeyUp","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","onlyMobile","authorRight","zoom","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","zoomSwipeHandler","lastDiffY","btnMenuToggle","setMoverToTarget","appMediaViewer","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","setAuthorInfo","oldAvatar","replaceChild","_openMedia","isDocument","useContainerAsTarget","mainColumns","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","rollback","cancellablePromise","attachPromise","haveImage","captionTimeout","isForDocument","onAuthorClick","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","onCaptionClick","setCaption","cantForwardMessage","cantDownloadMessage","AvatarListLoader","AppMediaViewerAvatar","onAvatarUpdate","getTarget","hadMessage","believeMe","addedToQueue","observedAttributes","attributeChangedCallback","oldValue","newPeerId","DialogsContextMenu","onArchiveClick","selectedId","folder_id","onUnmuteClick","onUnreadClick","top_message","ConnectionStatus","SENDING_STATUS","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","baseDcId","setFirstConnectionTimeout","online","Connected","TimedOut","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","timerSpan","setStateTimeout","statusContainer","constructContainer","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","RADIUS","SortedDialogList","indexKey","appDialogsManager","addListDialog","isBatch","AppDialogsManager","sortedLists","scrollables","folders","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","onTabChange","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","setListClickListener","onChatsRegularScroll","sliceTimeout","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","allChatsIntlElement","setFilterId","addFilter","onStateLoaded","foldersScrollable","filtersNavigationItem","changeFiltersAllChatsKey","setOnlineStatus","hasClassName","initListeners","getDialogDom","processDialogForCallStatus","setFilterUnreadCount","setLastMessage","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessages","setDialogActive","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","renderFiltersPromise","showFiltersPromise","getOffsetIndex","isDialogMustBeInViewport","migratedTo","testDialogForFilter","topOffset","bottomOffset","unreadSpan","foundUnmuted","generateScrollable","sortedDialogList","createChatList","clientWidth","wasShowing","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","callbacks","cccc","offsetDialog","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","wrapLocalSticker","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","lastMessage","highlightWord","setUnread","draftMessage","lastTimeSpan","playIcon","withoutMediaType","sender","senderBold","setStatusMessage","disableAnimationIfRippleFound","setSendingStatus","statusSpan","isDialogUnread","hasUnreadBadge","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","transitionDuration","isMention","getDialog","originalDialog","setCallStatus","startAnimation","START_X","startTime","wasMounted","itemProgress","groupCallActiveIcon","addDialogNew","call_not_empty","addDialogAndSetLastMessage","addDialog","fromName","_dialog","captionDiv","titleSpanContainer","titleP","rightSpan","oldTypingElement","newTypingElement","updateSettings","currentHashPromise","newHashPromise","new_settings","newAlgo","new_algo","salt1","randomize","hashes","new_password_hash","check","inputCheckPassword","confirmPasswordEmail","resendPasswordEmail","cancelPasswordEmail","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","default","prototype","AudioContext","webkitAudioContext","isRecordingSupported","config","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","getUserMedia","WebAssembly","clearStream","getTracks","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","gain","setTargetAtTime","onstart","destroyWorker","Function"],"sourceRoot":""} \ No newline at end of file diff --git a/public/687.e9f93733bf343790b37d.chunk.js b/public/687.e9f93733bf343790b37d.chunk.js deleted file mode 100644 index d25a4f64..00000000 --- a/public/687.e9f93733bf343790b37d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[687],{9750:(e,t,s)=>{function i(e,t){const s=t.split(".");let i=e;return s.forEach((e=>{e&&(i=i[e])})),i}s.d(t,{Z:()=>i})},946:(e,t,s)=>{s.d(t,{Z:()=>a});var i=s(8479),n=s(5880);function a(e,t,s,o){for(const r in e)typeof t[r]!=typeof e[r]?(t[r]=(0,i.Z)(e[r]),s&&s(o||r)):(0,n.Z)(e[r])&&a(e[r],t[r],s,o||r)}},4687:(e,t,s)=>{s.r(t),s.d(t,{AppStateManager:()=>w,STATE_INIT:()=>Z,default:()=>k});var i=s(1507),n=s(3241),a=s(3512),o=s(7922),r=s(5003),h=s(4159),d=s(410),l=s(6947),g=s(4762),c=s(3127),u=s(7487),p=s(144);function f(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const s=e.split("."),i=t.split(".");for(let e=0;en)return 1;if(t{this.requestPeerSingle(a.default.myId,"self")}))}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise((e=>{const t=Object.keys(this.storages),s=t.map((e=>this.storages[e].getAll())),i=y.map((e=>o.Z.get(e))).concat(u.Z.get("user_auth"),u.Z.get("state_id")).concat(o.Z.get("user_auth")).concat(s);Promise.all(i).then((s=>{return i=this,n=void 0,l=function*(){let i=this.state={};for(let e=0,t=y.length;eo.Z.get(e))));e.push("user_auth"),t.push("number"==typeof n||"string"==typeof n?{dcID:t[0]||h.Z.baseDcId,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n);let s={};e.forEach(((e,i)=>{s[e]=t[i]})),yield u.Z.set(s)}n&&(i.authState={_:"authStateSignedIn"},a.default.dispatchEvent("user_auth","number"==typeof n||"string"==typeof n?{dcID:0,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n));for(let e=0,i=t.length;e{e.set(s,(0,m.Z)(i[s]))})),i=this.state=(0,m.Z)(Z),e.forEach(((e,t)=>{i[t]=e}));for(const e in this.storagesResults)this.storagesResults[e].length=0;this.storage.set(i)}yield u.Z.set({state_id:i.stateId})}const g=Date.now();if(i.stateCreatedTime+864e5{e.forEach((e=>{this.pushToState(e,(0,m.Z)(Z[e]));const t=this.storagesResults[e];t&&t.length&&(t.length=0)}))})(_)),!i.settings.hasOwnProperty("theme")&&i.settings.hasOwnProperty("nightTheme")&&(i.settings.theme=i.settings.nightTheme?"night":"day",this.pushToState("settings",i.settings)),!i.settings.hasOwnProperty("themes")&&i.settings.background){i.settings.themes=(0,m.Z)(Z.settings.themes);const e=i.settings.themes.find((e=>e.name===i.settings.theme));e&&(e.background=i.settings.background,this.pushToState("settings",i.settings))}const c=i.settings.autoDownload;if(void 0!==(null==c?void 0:c.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const s=c[t]={};e.forEach((e=>{s[e]=c[e]}))})),e.forEach((e=>{delete c[e]})),this.pushToState("settings",i.settings)}if((0,v.Z)(Z,i,(e=>{this.pushToState(e,i[e])})),i.version!==P||i.build!==b){if(-1===f(i.version,"0.8.7")){this.state.allDialogsLoaded=(0,m.Z)(Z.allDialogsLoaded),this.state.filters=(0,m.Z)(Z.filters);const e=this.storagesResults.dialogs;(null==e?void 0:e.length)&&(e.length=0)}if(-1===f(i.version,"1.3.0")){let e=!1;i.settings.themes.forEach(((t,s,i)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const n=Z.settings.themes.find((e=>e.name===t.name));n&&(i[s]=(0,m.Z)(n),e=!0)}})),e&&this.pushToState("settings",i.settings)}0!==f(i.version,P)&&(this.newVersion=P),this.pushToState("version",P),this.pushToState("build",b)}a.default.settings=i.settings,d.ZP&&this.log("state res",i,(0,m.Z)(i)),console.timeEnd("load state"),e(i)},new((r=void 0)||(r=Promise))((function(e,t){function s(e){try{o(l.next(e))}catch(e){t(e)}}function a(e){try{o(l.throw(e))}catch(e){t(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(s,a)}o((l=l.apply(i,n||[])).next())}));var i,n,r,l})).catch(e)}))),this.loaded}getState(){return void 0===this.state?this.loadSavedState():Promise.resolve(this.state)}setByKey(e,t){!function(e,t,s){const i=t.split(".");(0,S.Z)(e,i.slice(0,-1).join("."))[i.pop()]=s}(this.state,e,t),a.default.dispatchEvent("settings_updated",{key:e,value:t});const s=e.split(".")[0];this.pushToState(s,this.state[s])}pushToState(e,t,s=!0){s&&(this.state[e]=t),this.setKeyValueToStorage(e,t)}setKeyValueToStorage(e,t=this.state[e]){this.storage.set({[e]:t})}requestPeer(e,t,s){let i=this.neededPeers.get(e);i&&i.has(t)||(i||(i=new Set,this.neededPeers.set(e,i)),i.add(t),this.dispatchEvent("peerNeeded",e),void 0!==s&&this.keepPeerSingle(e,t))}requestPeerSingle(e,t,s=e){return this.requestPeer(e,t+"_"+s,1)}releaseSinglePeer(e,t){return this.keepPeerSingle(i.NM,t+"_"+e)}isPeerNeeded(e){return this.neededPeers.has(e)}keepPeerSingle(e,t){const s=this.singlePeerMap.get(t);if(s&&s!==e&&this.neededPeers.has(s)){const e=this.neededPeers.get(s);e.delete(t),e.size||(this.neededPeers.delete(s),this.dispatchEvent("peerUnneeded",s))}e?this.singlePeerMap.set(t,e):this.singlePeerMap.delete(t)}}w.STATE_INIT=Z;const T=new w;d.GO.appStateManager=T;const k=T}}]); -//# sourceMappingURL=687.e9f93733bf343790b37d.chunk.js.map \ No newline at end of file diff --git a/public/687.e9f93733bf343790b37d.chunk.js.map b/public/687.e9f93733bf343790b37d.chunk.js.map deleted file mode 100644 index 7a226bbb..00000000 --- a/public/687.e9f93733bf343790b37d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"687.e9f93733bf343790b37d.chunk.js","mappings":"2FAAe,SAASA,EAAgBC,EAAaC,GACnD,MAAMC,EAAWD,EAAIE,MAAM,KAC3B,IAAIC,EAASJ,EAUb,OATAE,EAASG,SAAQJ,IACXA,IAKJG,EAAIA,EAAEH,OAGDG,E,yECTM,SAASE,EAAmBC,EAAiBC,EAAoBC,EAAmCC,GACjH,IAAI,MAAMT,KAAOM,SACLC,EAAcP,WAAiBM,EAAWN,IAClDO,EAAcP,IAAO,OAAKM,EAAWN,IACrCQ,GAAaA,EAAUC,GAAeT,KAC9B,OAASM,EAAWN,KAC5BK,EAAmBC,EAAWN,GAAMO,EAAcP,GAAMQ,EAAWC,GAAeT,K,8MCTzE,SAASU,EAAeC,EAAYC,GACjDD,EAAKA,EAAGT,MAAM,IAAK,GAAG,GACtBU,EAAKA,EAAGV,MAAM,IAAK,GAAG,GACtB,MAAMW,EAAKF,EAAGT,MAAM,KACdY,EAAKF,EAAGV,MAAM,KAEpB,IAAI,IAAIa,EAAI,EAAGA,EAAIF,EAAGG,SAAUD,EAAG,CACjC,MAAMJ,GAAME,EAAGE,GACTH,GAAME,EAAGC,GACf,GAAGJ,EAAKC,EAAI,OAAO,EACd,GAAGD,EAAKC,EAAI,OAAQ,EAG3B,OAAO,E,iCCiBT,MAGMK,EAAgB,YAChBC,EAAQ,UA0FDC,EAAoB,CAC/BC,iBAAkB,GAClBC,aAAc,GACdC,aAAc,GACdC,QAAS,GACTC,QAAS,GACTC,aAAc,EACdC,iBAAkBC,KAAKC,MACvBC,YAAa,GACbC,cAAe,GACfC,aAAc,GACdC,QAASf,EACTgB,MAAOf,EACPgB,UAAW,CACTC,EAAG,EAAAC,UAAY,kBAAoB,mBAErCC,qBAAsB,GACtBC,SAAU,CACRC,iBAAkB,GAClBC,aAAc,aACdC,aAAc,QACdC,mBAAmB,EACnBC,aAAc,CACZC,MAAO,CACLC,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZC,MAAO,CACLJ,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZE,KAAM,CACJL,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,IAGdG,gBAAiB,CACfhB,EAAG,uBACHiB,cAAe,QACfC,OAAQ,CACNC,qBAAqB,EACrBC,oBAAoB,GAEtBC,eAAgB,QAChBC,eAAgB,SAChBC,wBAAyB,KAE3BC,SAAU,CACRC,MAAM,EACNC,QAAQ,GAEVC,SAAU,CACRC,SAAS,EACTC,MAAM,GAERC,MAAO,CACLF,SAAS,EACTG,KAAK,GAEPC,OAAQ,CAAC,CACPC,KAAM,MACNC,WAAY,CACVC,MAAM,EACNC,KAAM,UACNC,MAAO,kCACPC,mBAAoB,yCACpBC,UAAW,GACXC,GAAI,MAEL,CACDP,KAAM,QACNC,WAAY,CACVC,MAAM,EACNC,KAAM,UAENC,MAAO,kCACPC,mBAAoB,+CACpBC,WAAY,GACZC,GAAI,QAGRC,MAAO,SACPC,cAAe,CACbC,OAAO,GAETC,YC9MO,IAAIpD,MAAOqD,iBAAiBC,MAAM,aAAe,MAAQ,ODgNlEC,YAAY,EACZC,6BAA6B,EAC7BC,SAAS,OAAe,IACxBC,eAAgB,IAGZC,EAAWC,OAAOC,KAAKrE,GAEvBsE,EAAe,CAAC,eAAgB,mBACpC,eAAgB,UAAW,YAMtB,MAAMC,UAAwB,IA8BnCC,cACEC,QAxBM,KAAAC,KAAM,EAAAC,EAAA,IAAO,SAIb,KAAAC,YAAwC,IAAIC,IAC5C,KAAAC,cAAqC,IAAID,IAE1C,KAAAE,SAAW,CAChBC,MAAO,IAAI,IAAwD,IAAgB,SACnFC,MAAO,IAAI,IAAwD,IAAgB,SACnFC,QAAS,IAAI,IAA0D,IAAgB,YAGlF,KAAAC,gBAIH,GAEG,KAAAC,QAAUC,EAAA,EAMfC,KAAKC,iBAELC,EAAA,yBAA2B,aAAa,KACtCF,KAAKG,kBAAkBD,EAAA,aAAgB,WAIpCD,iBACL,OAAGD,KAAKI,SACRC,QAAQC,KAAK,cACbN,KAAKI,OAAS,IAAIG,SAASC,IACzB,MAAMC,EAAe3B,OAAOC,KAAKiB,KAAKP,UAChCiB,EAAmCD,EAAaE,KAAIpH,GAAOyG,KAAKP,SAASlG,GAAKqH,WAE9EC,EAAiChC,EAAS8B,KAAIpH,GAAOwG,EAAA,MAAiBxG,KAC3EuH,OAAOC,EAAA,MAAmB,aAAcA,EAAA,MAAmB,aAC3DD,OAAOf,EAAA,MAAiB,cACxBe,OAAOJ,GAERH,QAAQS,IAAIH,GAAUI,MAAWC,IAAQ,O,EAAD,K,OAAA,E,EAAA,YAiCtC,IAAIC,EAAenB,KAAKmB,MAAQ,GAGhC,IAAI,IAAI7G,EAAI,EAAGC,EAASsE,EAAStE,OAAQD,EAAIC,IAAUD,EAAG,CACxD,MAAMf,EAAMsF,EAASvE,GACf8G,EAAQF,EAAI5G,QACL+G,IAAVD,EAEDD,EAAM5H,GAAO6H,EAEbpB,KAAKsB,YAAY/H,GAAK,EAAAgI,EAAA,GAAK7G,EAAWnB,KAI1C2H,EAAIM,OAAO,EAAG3C,EAAStE,QAGvB,IAAIkH,EAAOP,EAAIQ,QACf,MAAM/C,EAAUuC,EAAIQ,QACdC,EAAkBT,EAAIQ,QAC5B,IAAID,GAAQE,EAAiB,CAC3BF,EAAOE,EACP,MAAM5C,EAAiB,CAAC,KAAM,qBAAsB,eACpD,IAAI,IAAIzE,EAAI,EAAGA,GAAK,IAAKA,EACvByE,EAAK6C,KAAK,KAAKtH,iBACfyE,EAAK6C,KAAK,KAAKtH,cAGjB,MAAMuH,QAAetB,QAAQS,IAAIjC,EAAK4B,KAAIpH,GAAOwG,EAAA,MAAiBxG,MAClEwF,EAAK6C,KAAK,aACVC,EAAOD,KAAsB,iBAAX,GAAwC,iBAAX,EAAsB,CAACE,KAAMD,EAAO,IAAM,aAAcE,KAAM7G,KAAKC,MAAQ,IAAO,EAAG+C,GAAIuD,EAAKO,UAAS,IAAsBP,GAE5K,IAAIQ,EAAW,GACflD,EAAKpF,SAAQ,CAACJ,EAAK2I,KACjBD,EAAI1I,GAAOsI,EAAOK,YAGdnB,EAAA,MAAmBkB,GA2BxBR,IAEDN,EAAM1F,UAAY,CAACC,EAAG,qBACtBwE,EAAA,sBAAwB,YAA8B,iBAAX,GAAwC,iBAAX,EACtE,CAAC4B,KAAM,EAAGC,KAAM7G,KAAKC,MAAQ,IAAO,EAAG+C,GAAIuD,EAAKO,UAAS,IACzDP,IAIJ,IAAI,IAAInH,EAAI,EAAGC,EAASkG,EAAalG,OAAQD,EAAIC,IAAUD,EACzD0F,KAAKH,gBAAgBY,EAAanG,IAAM4G,EAAI5G,GAK9C,GAFA4G,EAAIM,OAAO,EAAGf,EAAalG,QAExB4G,EAAMxC,UAAYA,EAAS,CAC5B,QAAe0C,IAAZ1C,EAAuB,CACxB,MAAMwD,EAAiD,IAAI5C,IAAI,CAC7D,CAAC,iBAAa8B,GACd,CAAC,eAAWA,KAGdc,EAASxI,SAAQ,CAAC+B,EAAGnC,KACnB4I,EAASC,IAAI7I,GAAK,EAAAgI,EAAA,GAAKJ,EAAM5H,QAG/B4H,EAAQnB,KAAKmB,OAAQ,EAAAI,EAAA,GAAK7G,GAE1ByH,EAASxI,SAAQ,CAACyH,EAAO7H,KAEvB4H,EAAM5H,GAAO6H,KAGf,IAAI,MAAM7H,KAAOyG,KAAKH,gBACpBG,KAAKH,gBAAgBtG,GAAiDgB,OAAS,EAGjFyF,KAAKF,QAAQsC,IAAIjB,SAGbJ,EAAA,MAAmB,CACvBsB,SAAUlB,EAAMxC,UAIpB,MAAM2B,EAAOpF,KAAKC,MAsClB,GArCIgG,EAAMlG,iBA5YI,MA4YgCqF,IACzC,MACDN,KAAKZ,IAAI,qBAAsB+B,EAAMlG,iBAAkBqF,GAG/C,CAACvB,IACTA,EAAKpF,SAAQJ,IACXyG,KAAKsB,YAAY/H,GAAK,EAAAgI,EAAA,GAAK7G,EAAWnB,KAGtC,MAAM+I,EAAItC,KAAKH,gBAAgBtG,GAC5B+I,GAAKA,EAAE/H,SACR+H,EAAE/H,OAAS,OAKjBgI,CAAEvD,KAcAmC,EAAMtF,SAAS2G,eAAe,UAAYrB,EAAMtF,SAAS2G,eAAe,gBAC1ErB,EAAMtF,SAASsC,MAAQgD,EAAMtF,SAAS4G,WAAa,QAAU,MAC7DzC,KAAKsB,YAAY,WAAYH,EAAMtF,YAIjCsF,EAAMtF,SAAS2G,eAAe,WAAarB,EAAMtF,SAAS+B,WAAY,CACxEuD,EAAMtF,SAAS6B,QAAS,EAAA6D,EAAA,GAAK7G,EAAWmB,SAAS6B,QACjD,MAAMS,EAAQgD,EAAMtF,SAAS6B,OAAOgF,MAAKC,GAAKA,EAAEhF,OAASwD,EAAMtF,SAASsC,QACrEA,IACDA,EAAMP,WAAauD,EAAMtF,SAAS+B,WAClCoC,KAAKsB,YAAY,WAAYH,EAAMtF,WAKvC,MAAM+G,EAAuBzB,EAAMtF,SAASK,aAC5C,QAAqCmF,KAAlCuB,MAAAA,OAAoB,EAApBA,EAAsBvG,SAAuB,CAC9C,MAAMwG,EAAW,CACf,WACA,UACA,SACA,YAGiB,CACjB,QACA,QACA,QAGSlJ,SAAQmJ,IACjB,MAAMC,EAAiDH,EAAqBE,GAAa,GACzFD,EAASlJ,SAAQqJ,IACfD,EAAiBC,GAAYJ,EAAqBI,SAItDH,EAASlJ,SAAQqJ,WACRJ,EAAqBI,MAG9BhD,KAAKsB,YAAY,WAAYH,EAAMtF,UAQrC,IALA,EAAAjC,EAAA,GAAmBc,EAAYyG,GAAQ8B,IAErCjD,KAAKsB,YAAY2B,EAAY9B,EAAM8B,OAGlC9B,EAAM5F,UAAYf,GAAiB2G,EAAM3F,QAAUf,EAAqB,CAEzE,IAA+C,IAA5CR,EAAekH,EAAM5F,QAAS,SAAiB,CAChDyE,KAAKmB,MAAMxG,kBAAmB,EAAA4G,EAAA,GAAK7G,EAAWC,kBAC9CqF,KAAKmB,MAAMpG,SAAU,EAAAwG,EAAA,GAAK7G,EAAWK,SACrC,MAAMmI,EAASlD,KAAKH,gBAAgBD,SACjCsD,MAAAA,OAAM,EAANA,EAAQ3I,UACT2I,EAAO3I,OAAS,GAKpB,IAA+C,IAA5CN,EAAekH,EAAM5F,QAAS,SAAiB,CAChD,IAAI4H,GAAW,EACfhC,EAAMtF,SAAS6B,OAAO/D,SAAQ,CAACwE,EAAO+D,EAAKhB,KACzC,GACiB,QAAf/C,EAAMR,MACoB,gCAA1BQ,EAAMP,WAAWE,MACS,UAA1BK,EAAMP,WAAWwF,MAEF,UAAfjF,EAAMR,MACqB,YAA3BQ,EAAMP,WAAWG,OACS,UAA1BI,EAAMP,WAAWwF,KAChB,CACD,MAAMC,EAAW3I,EAAWmB,SAAS6B,OAAOgF,MAAKW,GAAYA,EAAS1F,OAASQ,EAAMR,OAClF0F,IACDnC,EAAIgB,IAAO,EAAAX,EAAA,GAAK8B,GAChBF,GAAW,OAKdA,GACDnD,KAAKsB,YAAY,WAAYH,EAAMtF,UAIa,IAAjD5B,EAAekH,EAAM5F,QAASf,KAC/BwF,KAAKsD,WAAa9I,GAGpBwF,KAAKsB,YAAY,UAAW9G,GAC5BwF,KAAKsB,YAAY,QAAS7G,GAI5ByF,EAAA,iBAAqBiB,EAAMtF,SAExB,MACDmE,KAAKZ,IAAI,YAAa+B,GAAO,EAAAI,EAAA,GAAKJ,IAKpCd,QAAQkD,QAAQ,cAChB/C,EAAQW,I,YAvR8B,K,iRAwRrCqC,MAAMhD,OAnSYR,KAAKI,OAySvBqD,WACL,YAAsBpC,IAAfrB,KAAKmB,MAAsBnB,KAAKC,iBAAmBM,QAAQC,QAAQR,KAAKmB,OAG1EuC,SAASnK,EAAa6H,IE3jBhB,SAAyB9H,EAAaC,EAAa6H,GAChE,MAAM5H,EAAWD,EAAIE,MAAM,MAC3B,EAAAJ,EAAA,GAAgBC,EAAQE,EAASmK,MAAM,GAAI,GAAGC,KAAK,MAAMpK,EAASqK,OAASzC,EF0jBzE0C,CAAgB9D,KAAKmB,MAAO5H,EAAK6H,GACjClB,EAAA,sBAAwB,mBAAoB,CAAC3G,IAAAA,EAAK6H,MAAAA,IAElD,MAAM2C,EAAQxK,EAAIE,MAAM,KAAK,GAE7BuG,KAAKsB,YAAYyC,EAAO/D,KAAKmB,MAAM4C,IAG9BzC,YAAmC/H,EAAQ6H,EAAiB4C,GAAS,GACvEA,IACDhE,KAAKmB,MAAM5H,GAAO6H,GAGpBpB,KAAKiE,qBAAqB1K,EAAK6H,GAG1B6C,qBAA4C1K,EAAQ6H,EAAkBpB,KAAKmB,MAAM5H,IACtFyG,KAAKF,QAAQsC,IAAI,CACf,CAAC7I,GAAM6H,IAIJ8C,YAAYC,EAAgBf,EAAqBgB,GACtD,IAAIhC,EAAMpC,KAAKV,YAAY+E,IAAIF,GAC5B/B,GAAOA,EAAIkC,IAAIlB,KAIdhB,IACFA,EAAM,IAAImC,IACVvE,KAAKV,YAAY8C,IAAI+B,EAAQ/B,IAG/BA,EAAIoC,IAAIpB,GAERpD,KAAKyE,cAAc,aAAcN,QAEpB9C,IAAV+C,GACDpE,KAAK0E,eAAeP,EAAQf,IAIzBjD,kBAAkBgE,EAAgBf,EAAqBuB,EAA2BR,GACvF,OAAOnE,KAAKkE,YAAYC,EAAQf,EAAO,IAAMuB,EAAyB,GAGjEC,kBAAkBT,EAAgBf,GACvC,OAAOpD,KAAK0E,eAAe,KAActB,EAAO,IAAMe,GAGjDU,aAAaV,GAClB,OAAOnE,KAAKV,YAAYgF,IAAIH,GAGvBO,eAAeP,EAAgBf,GACpC,MAAM0B,EAAe9E,KAAKR,cAAc6E,IAAIjB,GAC5C,GAAG0B,GAAgBA,IAAiBX,GAAUnE,KAAKV,YAAYgF,IAAIQ,GAAe,CAChF,MAAM1C,EAAMpC,KAAKV,YAAY+E,IAAIS,GACjC1C,EAAI2C,OAAO3B,GAEPhB,EAAI4C,OACNhF,KAAKV,YAAYyF,OAAOD,GACxB9E,KAAKyE,cAAc,eAAgBK,IAIpCX,EACDnE,KAAKR,cAAc4C,IAAIgB,EAAMe,GAE7BnE,KAAKR,cAAcuF,OAAO3B,IAtZhB,EAAA1I,WAAaA,EAua7B,MAAMuK,EAAkB,IAAIhG,EAC5B,qBAAiCgG,EACjC","sources":["webpack://tweb/./src/helpers/object/getDeepProperty.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts"],"sourcesContent":["export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach(key => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\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 { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { AutoDownloadSettings, Chat, NotifyPeer, PeerNotifySettings } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\nimport getTimeFormat from '../../helpers/getTimeFormat';\nimport copy from '../../helpers/object/copy';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport validateInitObject from '../../helpers/object/validateInitObject';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string, \n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n }\n }, {\n name: 'night',\n background: {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\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);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const, \n 'private' as const, \n 'groups' as const, \n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach(mediaType => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach(peerType => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach(peerType => {\n delete autoDownloadSettings[peerType];\n });\n\n this.pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find(newTheme => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n this.pushToState('settings', state.settings);\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","import getDeepProperty from \"./getDeepProperty\";\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n"],"names":["getDeepProperty","object","key","splitted","split","o","forEach","validateInitObject","initObject","currentObject","onReplace","previousKey","compareVersion","v1","v2","s1","s2","i","length","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","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","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","ALL_KEYS","Object","keys","REFRESH_KEYS","AppStateManager","constructor","super","log","logger","neededPeers","Map","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","this","loadSavedState","rootScope","requestPeerSingle","loaded","console","time","Promise","resolve","storagesKeys","storagesPromises","map","getAll","promises","concat","sessionStorage","all","then","arr","state","value","undefined","pushToState","copy","splice","auth","shift","shiftedWebKAuth","push","values","dcID","date","toPeerId","obj","idx","preserve","set","state_id","s","r","hasOwnProperty","nightTheme","find","t","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","missingKey","result","migrated","type","newTheme","newVersion","timeEnd","catch","getState","setByKey","slice","join","pop","setDeepProperty","first","direct","setKeyValueToStorage","requestPeer","peerId","limit","get","has","Set","add","dispatchEvent","keepPeerSingle","keepPeerIdSingle","releaseSinglePeer","isPeerNeeded","existsPeerId","delete","size","appStateManager"],"sourceRoot":""} \ No newline at end of file diff --git a/public/688.1806b16f238474b55289.chunk.js b/public/688.1806b16f238474b55289.chunk.js deleted file mode 100644 index 2f11347a..00000000 --- a/public/688.1806b16f238474b55289.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[688,465,810],{9638:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(3910),o=n(2738),i=n(4541),r=n(4727),s=n(9518),d=n(3512),l=n(4494),c=n(6858);let u,p=!1;function g(e){p||(u||(u=s.Z.getConfig().then((e=>e.suggested_lang_code!==r.default.lastRequestedLangCode?Promise.all([e,r.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),r.default.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const s=[];n.forEach((e=>{const t=r.default.strings.get(e.key);t&&(s.push(t),r.default.strings.set(e.key,e))}));const u=(0,l.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),(0,i.Z)().then((()=>{window.requestAnimationFrame((()=>{e.append(u)}))})),d.default.addEventListener("language_change",(()=>{u.remove()}),{once:!0}),s.forEach((e=>{r.default.strings.set(e.key,e)})),(0,o.fc)(u,(e=>{(0,a.d)(e),p=!0,u.disabled=!0,(0,c.y7)(u),r.default.getLangPack(t.suggested_lang_code)}))}))}},4484:(e,t,n)=>{function a(e,t){const n=e.length;if(n!==t.length)return!1;for(let a=0;aa})},8079:(e,t,n)=>{function a(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,{Z:()=>a})},8045:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(410),o=n(7487),i=n(9518);const r=new class{constructor(){this.serverTimeOffset=0,o.Z.get("server_time_offset").then((e=>{e&&(this.serverTimeOffset=e)})),i.Z.addTaskListener("applyServerTimeOffset",(e=>{this.serverTimeOffset=e.payload}))}};a.GO&&(a.GO.serverTimeManager=r);const s=r},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>M});var a=n(6858),o=n(8805),i=n(4687),r=n(9518),s=n(8598),d=n(4874),l=n(503),c=n(9807),u=n(4494),p=n(4789),g=n(5432),h=n(4159),m=n(4727),f=n(2897),v=n(1405),y=n(4668),L=n(8497),E=n(144),_=n(6947),w=n(8576),Z=n(4465),b=n(9638),S=n(3910),k=n(2738),T=n(5565),x=n(1656),P=n(7487),C=n(2398),O=n(671),R=n(6669),A=n(7922),N=n(3512),D=n(709),I=n(9976);let q,Q=null;const H=new d.Z("page-sign",!0,(()=>{const e=()=>{t=m.default.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let t;e(),N.default.addEventListener("language_change",(()=>{e()}));const d=new Map;let v,M;const $=document.createElement("div");$.classList.add("input-wrapper");const B=new l.Z({label:"Login.CountrySelectorLabel",name:(0,E.a)()});B.container.classList.add("input-select");const F=B.input,U=document.createElement("div");U.classList.add("select-wrapper","z-depth-3","hide");const V=document.createElement("span");V.classList.add("arrow","arrow-down"),B.container.append(V);const W=document.createElement("ul");U.appendChild(W),new o.ZP(U);let j=()=>{j=null,t.forEach((e=>{const t=(0,O.Ml)(e.iso2),n=[];e.country_codes.forEach((a=>{const o=document.createElement("li");let i=s.o.wrapEmojiText(t);if(I.Z){const e=document.createElement("span");e.innerHTML=i,o.append(e)}else o.innerHTML=i;const r=(0,m.i18n)(e.default_name);r.dataset.defaultName=e.default_name,o.append(r);const d=document.createElement("span");d.classList.add("phone-code"),d.innerText="+"+a.country_code,o.appendChild(d),n.push(o),W.append(o)})),d.set(e.iso2,n)})),W.addEventListener("mousedown",(e=>{if(0!==e.button)return;const t=(0,y.Z)(e.target,"LI");z(t)})),B.container.appendChild(U)};const z=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,o=a.replace(/\D/g,"");(0,T.Z)(F,(0,m.i18n)(n)),(0,R.Z)(F,"input"),v=t.find((e=>e.default_name===n)),M=v.country_codes.find((e=>e.country_code===o)),Y.value=Y.lastValue=a,X(),setTimeout((()=>{ee.focus(),(0,C.Z)(ee,!0)}),0)};let G;j(),F.addEventListener("focus",(function(e){j?j():t.forEach((e=>{d.get(e.iso2).forEach((e=>e.style.display=""))})),clearTimeout(G),G=void 0,U.classList.remove("hide"),U.offsetWidth,U.classList.add("active"),B.select(),(0,p.Z)({container:H.pageEl.parentElement.parentElement,element:F,position:"start",margin:4}),setTimeout((()=>{K||(document.addEventListener("mousedown",J,{capture:!0}),K=!0)}),0)}));let K=!1;const J=e=>{(0,L.Z)(e.target,"input-select")||e.target!==F&&(X(),document.removeEventListener("mousedown",J,{capture:!0}),K=!1)},X=()=>{void 0===G&&(U.classList.remove("active"),G=window.setTimeout((()=>{U.classList.add("hide"),G=void 0}),200))};F.addEventListener("keyup",(e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=B.value.toLowerCase(),o=[];t.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const n=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");n.length>1&&t.push(n)}));let n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(a)));d.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&o.push(e)})),0===o.length?t.forEach((e=>{d.get(e.iso2).forEach((e=>e.style.display=""))})):1===o.length&&"Enter"===n&&z(d.get(o[0].iso2)[0])})),V.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),F.matches(":focus")?F.blur():F.focus()}));const Y=new D.Z({onInput:e=>{f.Z.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===B.value||v&&t&&n&&(v===t||M.country_code===n.country_code)||((0,T.Z)(F,t?(0,m.i18n)(t.default_name):a),v=t,M=n),t||Y.value.length-1>1?Q.style.visibility="":Q.style.visibility="hidden"}}),ee=Y.input;ee.addEventListener("keypress",(e=>{if(!Q.style.visibility&&"Enter"===e.key)return ne()}));const te=new c.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});te.input.addEventListener("change",(()=>{const e=te.checked;i.default.pushToState("keepSigned",e),_.Z.toggleStorage(e),w.Z.toggleStorage(e),r.Z.toggleStorage(e),P.Z.toggleStorage(e)})),i.default.getState().then((e=>{i.default.storage.isAvailable()?te.checked=e.keepSigned:(te.checked=!1,te.label.classList.add("checkbox-disabled"))})),Q=(0,u.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),Q.style.visibility="hidden";const ne=e=>{e&&(0,S.d)(e);const t=(0,x.Z)([Q,q],!0);(0,T.Z)(Q,(0,m.i18n)("PleaseWait")),(0,a.y7)(Q);let o=Y.value;r.Z.invokeApi("auth.sendCode",{phone_number:o,api_id:h.Z.id,api_hash:h.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:o}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(Y.setError(),(0,T.Z)(Y.label,(0,m.i18n)("Login.PhoneLabelInvalid")),ee.classList.add("error"),(0,T.Z)(Q,(0,m.i18n)("Login.Next"))):(console.error("auth.sendCode error:",e),Q.innerText=e.type)}))};(0,k.fc)(Q,ne),q=(0,u.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),q.addEventListener("click",(()=>{Z.default.mount()})),$.append(B.container,Y.container,te.label,Q,q);const ae=document.createElement("h4");ae.classList.add("text-center"),(0,m._i18n)(ae,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),(0,m._i18n)(oe,"Login.StartText"),H.pageEl.querySelector(".container").append(ae,oe,$),g.IS_TOUCH_SUPPORTED||setTimeout((()=>{ee.focus()}),0),(0,b.Z)($),r.Z.invokeApi("help.getNearestDc").then((e=>{var t;const n=A.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&m.default.getLangPack(n.lang_code).then((()=>{(0,R.Z)(ee,"input")}));const a=new Set([1,2,3,4,5]),o=[e.this_dc];let i;return e.nearest_dc!==e.this_dc&&(i=r.Z.getNetworker(e.nearest_dc).then((()=>{o.push(e.nearest_dc)}))),(i||Promise.resolve()).then((()=>{o.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,i=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield P.Z.get(a))return t();setTimeout((()=>{r.Z.getNetworker(n).finally(t)}),3e3)},new((o=void 0)||(o=Promise))((function(e,t){function r(e){try{d(i.next(e))}catch(e){t(e)}}function s(e){try{d(i.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(r,s)}d((i=i.apply(n,a||[])).next())}));var n,a,o,i};t()})),e})).then((e=>{B.value.length||Y.value.length||z(d.get(e.country)[0])}))}),(()=>{Q&&((0,T.Z)(Q,(0,m.i18n)("Login.Next")),(0,v.ripple)(Q,void 0,void 0,!0),Q.removeAttribute("disabled")),q&&q.removeAttribute("disabled"),i.default.pushToState("authState",{_:"authStateSignIn"})})),M=H},4465:(e,t,n)=>{n.r(t),n.d(t,{default:()=>E});var a=n(9518),o=n(4874),i=n(8045),r=n(4159),s=n(4494),d=n(4727),l=n(4687),c=n(3512),u=n(6858),p=n(9638),g=n(5418),h=n(8079),m=n(4484);function f(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var v=function(e,t,n,a){return new(n||(n=Promise))((function(o,i){function r(e){try{d(a.next(e))}catch(e){i(e)}}function s(e){try{d(a.throw(e))}catch(e){i(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,s)}d((a=a.apply(e,t||[])).next())}))};let y;const L=new o.Z("page-signQR",!0,(()=>y),(()=>{y||(y=v(void 0,void 0,void 0,(function*(){const e=L.pageEl.querySelector(".auth-image");let t=(0,u.y7)(e,!0);const o=document.createElement("div");o.classList.add("input-wrapper");const l=(0,s.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});o.append(l),(0,p.Z)(o);const E=e.parentElement,_=document.createElement("h4");(0,d._i18n)(_,"Login.QR.Title");const w=document.createElement("ol");w.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,d.i18n)(e)),w.append(t)})),E.append(_,w,o),l.addEventListener("click",(()=>{Promise.all([n.e(458),n.e(325),n.e(810)]).then(n.bind(n,810)).then((e=>e.default.mount())),b=!0}));const Z=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let b=!1;c.default.addEventListener("user_auth",(()=>{b=!0,y=null}),{once:!0});let S,k={ignoreErrors:!0};const T=o=>v(void 0,void 0,void 0,(function*(){try{let s=yield a.Z.invokeApi("auth.exportLoginToken",{api_id:r.Z.id,api_hash:r.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===s._&&(k.dcId||(k.dcId=s.dc_id,a.Z.setBaseDcId(s.dc_id)),s=yield a.Z.invokeApi("auth.importLoginToken",{token:s.token},k)),"auth.loginTokenSuccess"===s._){const e=s.authorization;return a.Z.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!S||!(0,m.Z)(S,s.token)){S=s.token;let n=function(e){let t,n="";for(let a=e.length,o=0,i=0;i>>t&24),2!==t&&a-i!=1||(n+=String.fromCharCode(f(o>>>18&63),f(o>>>12&63),f(o>>>6&63),f(63&o)),o=0);return n.replace(/A(?=A$|$)/g,"=")}(s.token),a="tg://login?token="+(0,h.Z)(n,!0);const o=window.getComputedStyle(document.documentElement),i=o.getPropertyValue("--surface-color").trim(),r=o.getPropertyValue("--primary-text-color").trim(),d=o.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${d}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)}))})),c=new Z({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:a,image:l,dotsOptions:{color:r,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,g.w)(1e3),new Promise((e=>{c._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield u.then((()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout((()=>{n.style.display=""}),150),setTimeout((()=>{n.style.animation=""}),500),t=void 0}else Array.from(e.children).slice(0,-1).forEach((e=>{e.remove()}))}))}if(o){let e=Date.now()/1e3,t=s.expires-e-i.Z.serverTimeOffset;yield(0,g.w)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,Promise.all([n.e(458),n.e(442)]).then(n.bind(n,9437)).then((e=>e.default.mount())),b=!0,y=null):(console.error("pageSignQR: default error:",e),b=!0),!0}return!1}));return()=>v(void 0,void 0,void 0,(function*(){for(b=!1;!b&&!(yield T(!0)););}))}))),y.then((e=>{e()})),l.default.pushToState("authState",{_:"authStateSignQr"})})),E=L}}]); -//# sourceMappingURL=688.1806b16f238474b55289.chunk.js.map \ No newline at end of file diff --git a/public/688.1806b16f238474b55289.chunk.js.map b/public/688.1806b16f238474b55289.chunk.js.map deleted file mode 100644 index bcf2629d..00000000 --- a/public/688.1806b16f238474b55289.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"688.1806b16f238474b55289.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/mtproto/serverTimeManager.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.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 apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = 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;\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 btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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","/*\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 { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\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 { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\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 findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\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 { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet 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 const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\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 let 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 replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\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 appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.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 let phone_number = telInputField.value;\r\n 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 let 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 let tryAgain = () => {\r\n 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 simulateEvent(telEl, 'input');\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;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(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 => {\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 apiManager.getNetworker(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 selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\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 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 type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\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 appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\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\nlet 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 let 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 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 apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await 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 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 let encoded = bytesToBase64(loginToken.token);\r\n let 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((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;\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((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 let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\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 console.warn('pageSignQR: 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>;\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 appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\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","bytesCmp","bytes1","bytes2","len","length","i","fixBase64String","str","toUrl","replace","serverTimeManager","constructor","this","serverTimeOffset","to","task","payload","btnQr","btnNext","page","setCountries","countries","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","document","createElement","add","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","selectList","appendChild","initSelect","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","spanEmoji","innerHTML","el","i18n","dataset","defaultName","span","innerText","country_code","addEventListener","button","target","selectCountryByTarget","childNodes","phoneCode","querySelector","find","_countryCode","telInputField","value","lastValue","hidePicker","setTimeout","telEl","focus","hideTimeout","get","style","display","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","good","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","code","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","_i18n","subtitle","IS_TOUCH_SUPPORTED","nearestDcResult","langPack","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","ripple","removeAttribute","uint6ToBase64","nUint6","imageDiv","preloader","btnBack","helpList","stop","QRCodeStyling","rootScope","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","user","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","children","Array","from","slice","timestamp","Date","now","diff","expires","warn","handled","func","appStateManager"],"sourceRoot":""} \ No newline at end of file diff --git a/public/690.8669226af7b8cc74abde.chunk.js b/public/690.8669226af7b8cc74abde.chunk.js deleted file mode 100644 index bae771c4..00000000 --- a/public/690.8669226af7b8cc74abde.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[690],{4903:(t,r,n)=>{function e(...t){const r=t.reduce(((t,r)=>t+(r.byteLength||r.length)),0),n=new Uint8Array(r);let e=0;return t.forEach((t=>{n.set(t instanceof ArrayBuffer?new Uint8Array(t):t,e),e+=t.byteLength||t.length})),n}n.d(r,{Z:()=>e})},3306:(t,r,n)=>{function e(t){const r=t.length,n=new Uint8Array(Math.ceil(r/2));let e=0;r%2&&(n[e++]=parseInt(t.charAt(0),16));for(let o=e;oe})},1549:(t,r,n)=>{function e(t){const r=t.length,n=new Array(r);for(let e=0;ee})},690:(t,r,n)=>{n.r(r);var e=n(4903),o=n(3306),i=n(1549);Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return(0,i.Z)(this)},set:function(t){this.set((0,o.Z)(t))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...t){return(0,e.Z)(this,...t)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(t){let r=this.findIndex(t);return-1!==r?this.splice(r,1)[0]:void 0},String.prototype.toHHMMSS=function(t=!1){const r=parseInt(this+"",10),n=Math.floor(r/3600);let e=Math.floor((r-3600*n)/60),o=r-3600*n-60*e;return n&&(t=!0),e<10&&(e=t?"0"+e:e),o<10&&(o="0"+o),(n?n+":":"")+e+":"+o},Promise.prototype.finally=Promise.prototype.finally||function(t){const r=r=>Promise.resolve(t()).then(r);return this.then((t=>r((()=>t))),(t=>r((()=>Promise.reject(t)))))},Promise.prototype.safeFinally=function(t){return this.catch((()=>{})).finally(t)}}}]); -//# sourceMappingURL=690.8669226af7b8cc74abde.chunk.js.map \ No newline at end of file diff --git a/public/690.8669226af7b8cc74abde.chunk.js.map b/public/690.8669226af7b8cc74abde.chunk.js.map deleted file mode 100644 index 41de9f8f..00000000 --- a/public/690.8669226af7b8cc74abde.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"690.8669226af7b8cc74abde.chunk.js","mappings":"2FAAe,SAASA,KAAiBC,GACvC,MAAMC,EAASD,EAAKE,QAAO,CAACC,EAAKC,IAAMD,GAAQC,EAAkBC,YAAeD,EAAiBH,SAAS,GAEpGK,EAAM,IAAIC,WAAWN,GAE3B,IAAIO,EAAa,EAMjB,OALAR,EAAKS,SAAQC,IACXJ,EAAIK,IAAID,aAAaE,YAAc,IAAIL,WAAWG,GAAKA,EAAGF,GAC1DA,GAAeE,EAAkBL,YAAeK,EAAiBT,UAG5DK,E,iCCXM,SAASO,EAAaC,GACnC,MAAMC,EAAMD,EAAUb,OAChBe,EAAQ,IAAIT,WAAWU,KAAKC,KAAKH,EAAM,IAC7C,IAAII,EAAQ,EAETJ,EAAM,IACPC,EAAMG,KAAWC,SAASN,EAAUO,OAAO,GAAI,KAGjD,IAAI,IAAIC,EAAIH,EAAOG,EAAIP,EAAKO,GAAK,EAC/BN,EAAMG,KAAWC,SAASN,EAAUS,OAAOD,EAAG,GAAI,IAGpD,OAAON,E,iCCbM,SAASQ,EAAWR,GACjC,MAAMf,EAASe,EAAMf,OACfwB,EAAgB,IAAIC,MAAMzB,GAChC,IAAI,IAAIqB,EAAI,EAAGA,EAAIrB,IAAUqB,EAC3BG,EAAIH,IAAMN,EAAMM,GAAK,GAAK,IAAM,KAAON,EAAMM,IAAM,GAAGK,SAAS,IAEjE,OAAOF,EAAIG,KAAK,I,yECIlBC,OAAOC,eAAevB,WAAWwB,UAAW,MAAO,CACjDC,IAAK,WACH,OAAO,OAAWC,OAGpBtB,IAAK,SAASuB,GACZD,KAAKtB,KAAI,OAAauB,KAExBC,YAAY,EACZC,cAAc,IAGhB7B,WAAWwB,UAAUM,UAAY,WAC/B,IAAGC,UAAU,oBAAqBA,QAGhC,MAAM,IAAIC,MAAM,oBAGlB,OALED,OAAOE,gBAAgBP,MAKlBA,MAGT1B,WAAWwB,UAAUU,OAAS,YAAYzC,GACxC,OAAO,OAAciC,QAASjC,IAOhCO,WAAWwB,UAAUW,OAAS,WAC5B,MAAO,IAAIT,OAIbP,MAAMK,UAAUY,cAAgB,SAAYC,GAC1C,IAAIC,EAAQZ,KAAKa,UAAUF,GAC3B,OAAkB,IAAXC,EAAeZ,KAAKc,OAAOF,EAAO,GAAG,QAAKG,GAGnDC,OAAOlB,UAAUmB,SAAW,SAASC,GAAW,GAC9C,MAAMC,EAAUhC,SAASa,KAAO,GAAI,IAC9BoB,EAAQpC,KAAKqC,MAAMF,EAAU,MACnC,IAAIG,EAAetC,KAAKqC,OAAOF,EAAmB,KAARC,GAAiB,IACvDG,EAAeJ,EAAmB,KAARC,EAA2B,GAAVE,EAK/C,OAHGF,IAAOF,GAAW,GAClBI,EAAU,KAAIA,EAAUJ,EAAW,IAAMI,EAAUA,GACnDC,EAAU,KAAIA,EAAU,IAAMA,IACzBH,EAAqCA,EAAQ,IAAM,IAAME,EAAU,IAAMC,GAYnFC,QAAQ1B,UAAU2B,QAAUD,QAAQ1B,UAAU2B,SAAW,SAA8BC,GACrF,MAAMC,EAAaC,GAAwBJ,QAAQK,QAAQH,KAAMI,KAAKF,GACtE,OAAO5B,KAAK8B,MACVC,GAAUJ,GAAU,IAAMI,MAC1BC,GAAUL,GAAU,IAAMH,QAAQS,OAAOD,QAI7CR,QAAQ1B,UAAUoC,YAAc,SAA8BR,GAC5D,OAAO1B,KAAKmC,OAAM,SAAUV,QAAQC","sources":["webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/polyfill.ts"],"sourcesContent":["export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\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 bufferConcats from \"../helpers/bytes/bufferConcats\";\nimport bytesFromHex from \"../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../helpers/bytes/bytesToHex\";\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n};\n\n/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n }\n}.finally; */\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n"],"names":["bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","bytesFromHex","hexString","len","bytes","Math","ceil","start","parseInt","charAt","i","substr","bytesToHex","arr","Array","toString","join","Object","defineProperty","prototype","get","this","str","enumerable","configurable","randomize","crypto","Error","getRandomValues","concat","toJSON","findAndSplice","verify","index","findIndex","splice","undefined","String","toHHMMSS","leadZero","sec_num","hours","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","result","reason","reject","safeFinally","catch"],"sourceRoot":""} \ No newline at end of file diff --git a/public/7.267799b59034d0b41841.chunk.js b/public/7.267799b59034d0b41841.chunk.js new file mode 100644 index 00000000..a0802504 --- /dev/null +++ b/public/7.267799b59034d0b41841.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[7],{108:function(e,t,n){"use strict";function o(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function i(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function s(e,t,n){const o=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{o(e,t,!1)})}function r(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function a(){return!!r()}n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return a}))},122:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i}));function o(e,t){const n=""["".length-1]||"";let o;switch(e._){case"inputPhotoFileLocation":o=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":o=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":o=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":o=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":o=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":o=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),o=""}return o+(n?"."+n:n)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},136:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(73);var i=function(e,t){let n,o,i,s={},r=0,a=0,c=0,l=0,d=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,i=new Image,i.src=e.src,i.draggable=!1,i.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),o=document.createElement("div"),o.classList.add("crop-overlay");const s=document.createElement("div");s.classList.add("crop-overlay-color"),n.appendChild(o);e.parentNode.appendChild(n),n.appendChild(i),n.appendChild(e),n.appendChild(s),o.appendChild(i),i.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const r=e.offsetWidth/2-100,a=e.offsetHeight/2-100;u(200,200),p(r,a),m(r,a),o.addEventListener("mousedown",g,!1),o.addEventListener("touchstart",g,!1),o.addEventListener("wheel",b,!1),document.addEventListener("keypress",v,!1)}function u(e,t){c=e*d,l=t*d,o.style.width=e+"px",o.style.height=t+"px"}function p(e,t){a=t*d,r=e*d,i.style.top=-t+"px",i.style.left=-e+"px"}function m(e,t){o.style.top=t+"px",o.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,s,r,a=Math.floor(o.clientWidth+e),c=Math.floor(o.clientHeight+e),l=i.clientWidth,d=i.clientHeight;a<50||a>l||(t=o.offsetLeft-e/2,n=o.offsetTop-e/2,s=t+a,r=n+c,t<0&&(t=0),n<0&&(n=0),s>l||r>d||(u(a,a),p(t,n),m(t,n)))}function v(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function b(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){s.container_width=o.offsetWidth,s.container_height=o.offsetHeight,s.container_left=o.offsetLeft,s.container_top=o.offsetTop,s.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,s.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",y),document.addEventListener("touchmove",y),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y)}function y(e){let t,n,r,a,c={x:0,y:0};e.preventDefault(),e.stopPropagation(),c.x=e.pageX||e.touches&&e.touches[0].pageX,c.y=e.pageY||e.touches&&e.touches[0].pageY,t=c.x-(s.mouse_x-s.container_left),n=c.y-(s.mouse_y-s.container_top),r=o.offsetWidth,a=o.offsetHeight,t<0?t=0:t>i.offsetWidth-r&&(t=i.offsetWidth-r),n<0?n=0:n>i.offsetHeight-a&&(n=i.offsetHeight-a),p(t,n),m(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=c,t.height=l,t.getContext("2d").drawImage(e,r,a,c,l,0,0,c,l)},removeHandlers:function(){o.removeEventListener("mousedown",g),o.removeEventListener("touchstart",g),o.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y),document.removeEventListener("keypress",v),n.remove(),o.remove(),i.remove()}}},s=n(54),r=n(16),a=n(29),c=n(144);class l extends s.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(r._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(c.a)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=i(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(a.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>o.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},143:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var o=n(15),i=n(0);function s(e){if("Enter"===e.key&&!i.IS_MOBILE&&!e.isComposing){if("enter"===o.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=i.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(i.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},144:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var o=n(97);function i(e){return Object(o.a)(e,"readAsDataURL")}},54:function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"a",(function(){return E}));var o=n(15),i=n(18),s=n(62),r=n(70),a=n(16),c=n(6),l=n(8),d=n(63),h=n(29),u=n(143),p=n(5),m=n(50),f=n(108),v=n(59);const b=document.body;let g=b;const w=()=>{g=Object(f.c)()||b,y.reAppend()};Object(f.a)(b,w);class y extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{r.a.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(h.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&Object(h.b)(this.element,e=>{Object(c.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(a.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(i.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let o=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(i.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(a.i18n)(e.langKey,e.langArgs)),Object(h.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!o&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(o=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=o,this.element.append(this.container),y.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},r.a.pushItem(this.navigationItem),Object(l.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(o.default.isOverlayActive=!0,s.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(u.a)(e):"Enter"===e.key)&&(Object(h.d)(this.btnConfirmOnEnter),Object(p.a)(e))})},0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(o.default.isOverlayActive=!1),r.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(v.a)(y.POPUPS,this),w(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.a.checkAnimations(!1)},150)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,o=t.parentElement;o&&o!==g&&g!==n&&g.append(t)})}static getPopups(e){return this.POPUPS.filter(t=>t instanceof e)}}y.POPUPS=[];const E=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},63:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));class o{constructor(){this.listeners=new Set}add(e){return(t,n,o)=>{const i={element:e,event:t,callback:n,options:o};return this.addManual(i),i}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,o){let i;for(const s of this.listeners)if(s.element===e&&s.event===t&&s.callback===n&&s.options===o){i=s;break}i&&this.remove(i)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}},73:function(e,t,n){"use strict";var o=n(15),i=n(32),s=n(52),r=n(122),a=n(112),c=n(30);const l=new class{constructor(){this.cacheStorage=new a.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},o.default.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const o=this.downloads[t.fileName];o&&o.notifyAll(t)})}getNewDeferred(e){const t=Object(s.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",i.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(r.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),o=e=>{n.reject(e)};return(()=>{if(!i.a.worker||e.onlyCache){const s=this.cacheStorage.getFile(t).then(t=>{if(t.sizei.a.downloadFile(e).then(n.resolve,o))}i.a.downloadFile(e).then(n.resolve,o)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return i.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const o=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),o&&t(o)}createDownloadAnchor(e,t,n){const o=document.createElement("a");o.href=e,o.download=t,o.target="_blank",o.style.position="absolute",o.style.top="1px",o.style.left="1px",document.body.append(o);try{var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(i)}catch(t){console.error("Download click error",t);try{o.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{o.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,o;const i=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(o=i[t])&&void 0!==o?o:i[t]={downloaded:0,url:""}}};c.a&&(c.a.appDownloadManager=l),t.a=l}}]); +//# sourceMappingURL=7.267799b59034d0b41841.chunk.js.map \ No newline at end of file diff --git a/public/7.267799b59034d0b41841.chunk.js.map b/public/7.267799b59034d0b41841.chunk.js.map new file mode 100644 index 00000000..c7e0222a --- /dev/null +++ b/public/7.267799b59034d0b41841.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/helpers/blob/readBlobAsDataURL.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/helpers/listenerSetter.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","e","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","file","target","files","readBlobAsDataURL","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","isSendShortcutPressed","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","title","onEscape","backByItem","navigationItem","confirmShortcutIsSendShortcut","prepend","once","withoutOverlay","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","destroy","find","isCancel","POPUPS","push","onPop","pushItem","isOverlayActive","checkAnimations","setTimeout","dispatchEvent","removeAll","removeItem","undefined","cleanup","popup","parentElement","popupConstructor","addCancelButton","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","_listener","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","deferred","cancel","Error","name","cancelDownload","reject","finally","catch","clearDownload","getNewDeferred","fetch","response","hasOwnProperty","onError","err","worker","onlyCache","promise","getFile","size","downloadFile","tryDownload","mimeType","indexOf","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","open","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded"],"mappings":"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","file":"7.267799b59034d0b41841.chunk.js","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 type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\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 { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\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\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\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 appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\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 rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\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 rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\r\nimport { addFullScreenListener, getFullScreenElement } from \"../../helpers/dom/fullScreen\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: () => this.destroy(),\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n protected destroy() {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\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 EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\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 { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/714.57babe030f5e6d0e0a5d.chunk.js b/public/714.57babe030f5e6d0e0a5d.chunk.js deleted file mode 100644 index 28f13dba..00000000 --- a/public/714.57babe030f5e6d0e0a5d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[714],{1425:(e,t,s)=>{s.d(t,{lh:()=>l,dJ:()=>u,br:()=>p,ZP:()=>h});var i=s(5003);class n{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const s=[];t.forEach((e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),s[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))})),s.forEach((t=>{e(t.target,t.visible)}))}))}getVisible(){const e=[];return this.items.forEach(((t,s)=>{t&&e.push(s)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}var a=s(6724);function r(e,t){const s=[];let i=-1;for(;-1!==(i=e.findIndex(t));)s.push(e.splice(i,1)[0]);return s}var o=s(1655),d=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class l{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=(0,i.kg)("LL",i.v9.Error),this.processQueue=(0,a.Z)((()=>this._processQueue()),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise(((e,t)=>{this.unlockResolve=e})))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return d(this,void 0,void 0,(function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}}))}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit))do{if(e?(0,o.Z)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.sizee.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){r(this.queue,(t=>t.div===e)),this.intersector.unobserve(e)}}class h extends c{constructor(e=8){super(e),this.parallelLimit=e,this.onVisibilityChange=(e,t)=>{t&&(r(this.queue,(t=>t.div===e)).forEach((e=>{e.wasSeen=!0,this.queue.unshift(e)})),this.setProcessQueueTimeout())},this.intersector=new n(this.onVisibilityChange)}getItem(){return this.queue.findAndSplice((e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return d(this,void 0,void 0,(function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)}))}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}class u extends c{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this._queue=new Map,this.intersector=new n(((e,t)=>{const s=r(this.queue,(t=>t.div===e));t&&(s.length?s:[this._queue.get(e)]).forEach((t=>{this.queue.unshift(t||this._queue.get(e))})),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()}))}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}class p extends c{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this.intersector=new n(((e,t)=>{const s=r(this.queue,(t=>t.div===e));t&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()}))}observe(e){this.intersector.observe(e)}}},3251:(e,t,s)=>{s.d(t,{I:()=>p,P:()=>r});var i=s(3228);const n=new Map,a=new Set,r='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let o;const d=()=>{cancelAnimationFrame(o),o=window.requestAnimationFrame(l)},l=()=>{a.forEach(c),a.clear()};window.addEventListener("resize",(()=>{for(const[e]of n)a.add(e);d()}),{capture:!0,passive:!0});const c=e=>{let t=n.get(e);const s=!t;let{text:a,textLength:o,from:d,multiplier:l,font:c,textWidth:h,elementWidth:p}=t||{};s&&(a=e.textContent,o=a.length,d=50,l=d>0&&d/100,c=`${e.dataset.fontWeight||400} 16px ${r}`,h=u(a,c),p=e.getBoundingClientRect().width,t={text:a,textLength:o,from:d,multiplier:l,font:c,textWidth:h,elementWidth:p},n.set(e,t));const g=e.getBoundingClientRect().width,f=s||p!==g;if(!s&&f&&(t.elementWidth=p=g),f)if(h>p){e.setAttribute("title",a);let s=a,n=p;for(;s.length>3;){let t=s.length;const a=l&&(0,i.Z)(l*t<<0,1,t-2)||Math.max(t+d-1,1),r=s.substr(0,a).replace(/\s*$/,""),o=s.substr(a+1).replace(/^\s*/,"");if(s=r+o,n=u(s+"…",c),n{s.d(t,{Z:()=>p});var i=s(410),n=s(6440),a=s(3512),r=s(4727),o=s(5565),d=s(5555),l=s(8598),c=s(1507),h=s(8456);const u=new WeakMap;i.GO.peerTitleWeakMap=u,a.default.addEventListener("peer_title_edit",(e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach((e=>{const t=u.get(e);t&&t.update()}))}));class p{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.update(e),u.set(this.element,this)}update(e){if(e)for(let t in e)this.element.dataset[t]=e[t]?""+("boolean"==typeof e[t]?+e[t]:e[t]):"0",this[t]=e[t];let t=this.fromName;if(void 0!==t)return void 0!==this.limitSymbols&&(t=(0,h.Z)(t,this.limitSymbols,this.limitSymbols)),void(this.element.innerHTML=l.Z.wrapEmojiText(t));void 0===this.peerId&&(this.peerId=c.NM),this.peerId===a.default.myId&&this.dialog?(0,o.Z)(this.element,(0,r.i18n)(this.onlyFirstName?"Saved":"SavedMessages")):this.peerId.isUser()&&d.Z.getUser(this.peerId).pFlags.deleted?(0,o.Z)(this.element,(0,r.i18n)(this.onlyFirstName?"Deleted":"HiddenName")):this.element.innerHTML=n.Z.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols)}}},1964:(e,t,s)=>{s.d(t,{Z:()=>l});var i=s(9099),n=s(3035),a=s(3910),r=s(2738),o=s(8487),d=s(5953);class l{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.d)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,d.Z)(this,e)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,r.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,s=Date.now(),i=i=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-s;if(!i&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>i(null))).catch((e=>i(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const s=e.done/e.total*100;this.setProgress(s)}))}attach(e,t=!1,s){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,s&&this.attachPromise(s),this.detached||this.preloader.parentElement!==e){const t=(0,o.Z)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),(0,i.Z)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&(0,i.Z)(this.preloader,"is-visible",!1,200,(()=>{this.preloader.remove()}),1))}setProgress(e){if(this.totalLength||(0,o.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},1174:(e,t,s)=>{s.d(t,{Z:()=>a});var i=s(5269);const n=new Set(["image/jpeg","image/png","image/bmp"]);i.Z&&n.add("image/webp");const a=n},2131:(e,t,s)=>{s.d(t,{Z:()=>i});const i=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},5844:(e,t,s)=>{s.d(t,{Z:()=>r});var i=s(4762);const n=!!document.createElement("video").canPlayType("video/quicktime")||i.IS_SAFARI||i.IS_APPLE_MOBILE,a=new Set(["image/gif","video/mp4","video/webm"]);n&&a.add("video/quicktime");const r=a},393:(e,t,s)=>{s.d(t,{Z:()=>a});var i=s(4762);const n=!!document.createElement("video").canPlayType("video/webm")&&!i.IS_SAFARI&&!i.IS_APPLE_MOBILE;window.IS_WEBM_SUPPORTED=n;const a=n},6690:(e,t,s)=>{function i(e){return[...new Set(e)]}s.d(t,{Z:()=>i})},6519:(e,t,s)=>{function i(e,t,s,i){const n=t[s];if(void 0===i&&-1!==(i=e.indexOf(t))){const t=e[i-1],a=e[i+1];if((!t||t[s]>=n)&&(!a||a[s]<=n))return i;e.splice(i,1)}const a=e.length;if(!a||n<=e[a-1][s])return e.push(t)-1;if(n>=e[0][s])return e.unshift(t),0;for(let i=0;ie[i][s])return e.splice(i,0,t),i;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,{Z:()=>i})},8938:(e,t,s)=>{function i(e){}s.d(t,{Z:()=>i})},5916:(e,t,s)=>{s.d(t,{Z:()=>i});class i{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const s=this.createAudio();s.autoplay=!0,s.src="assets/audio/"+e,s.loop=t,s.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,s){const i=++this.tempId;setTimeout((()=>{this.tempId===i&&this.playSound(e,t)}),s)}}},6705:(e,t,s)=>{s.d(t,{Z:()=>f});var i=s(3725),n=s(8594),a=s(3035);const r=[];let o=!1;function d(e,t="push"){return e.items.length?(e.promise=(0,i.b)(),r[t](e),l(),e.promise):Promise.resolve([])}function l(){o||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),s=[];return new Promise(((i,r)=>{const o=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const i=e.process.apply(e.context,t.shift());let a;if(i instanceof Promise)try{a=yield i}catch(e){return void r(e)}else a=i;s.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(o):i(s)},new((c=void 0)||(c=Promise))((function(e,t){function s(e){try{n(h.next(e))}catch(e){t(e)}}function i(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(s,i)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(o)})).then(e.promise.resolve,e.promise.reject)}(r.shift()).finally((()=>{o=!1,r.length&&l()}))}const c="filter"in(document.createElement("canvas").getContext("2d")||{});let h,u;function p(e,t,s){return new Promise((i=>{const n=document.createElement("canvas");n.width=e.width,n.height=e.height;const a=n.getContext("2d",{alpha:!1});c?(a.filter=`blur(${t}px)`,a.drawImage(e,2*-t,2*-t,n.width+4*t,n.height+4*t)):(a.drawImage(e,0,0),u(a,0,0,n.width,n.height,t,s)),i(n.toDataURL())}))}h=c?Promise.resolve():s.e(77).then(s.bind(s,7077)).then((e=>{u=e.default}));const g=new Map;function f(e,t=2,s=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(g.size>1e3&&g.clear(),g.has(e))return g.get(e);const i=new Promise((i=>{h.then((()=>{const n=new Image;n.onload=()=>{c?p(n,t,s).then(i):d({items:[[n,t,s]],context:null,process:p},"unshift").then((e=>{i(e[0])}))},n.src=e}))}));return g.set(e,i),i}},3306:(e,t,s)=>{function i(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let i=0;t%2&&(s[i++]=parseInt(e.charAt(0),16));for(let n=i;ni})},1549:(e,t,s)=>{function i(e){const t=e.length,s=new Array(t);for(let i=0;ii})},6654:(e,t,s)=>{function i(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,{Z:()=>i})},467:(e,t,s)=>{s.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var i=s(6718);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g;function r(e){return e.replace(n,"").replace(a,"")}function o(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=i.ZP.LatinizeMap[e];return void 0!==t?t:e}))}function d(e,t=!0){const s="%"===e.charAt(0);return e=r(e),t&&(e=o(e)),e=e.toLowerCase(),s&&(e="%"+e),e}function l(e,t={}){const s=t.includeTag&&"%"===e.charAt(0);return t.clearBadChars&&(e=r(e)),t.latinize&&(e=o(e)),t.ignoreCase&&(e=e.toLowerCase()),s&&(e="%"+e),e}},5705:(e,t,s)=>{function i(e){var t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}s.d(t,{Z:()=>i})},2614:(e,t,s)=>{function i(e){const t=document.createElement("span");return t.innerHTML=e,t}s.d(t,{Z:()=>i})},6740:(e,t,s)=>{s.d(t,{ZP:()=>a,cj:()=>r});const i={},n=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function a(e,t,s,a=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(s&&s());if(i[t]&&a||e instanceof HTMLVideoElement)e&&n(e,t),s&&s();else{const a=e instanceof HTMLImageElement,r=a?e:new Image;r.src=t,r.addEventListener("load",(()=>{!a&&e&&n(e,t),i[t]=!0,s&&s()}),{once:!0}),s&&r.addEventListener("error",(e=>{console.error("Render image from url failed:",e,t,r),s()}))}}function r(e,t,s){return new Promise((i=>{a(e,t,i,s)}))}},6056:(e,t,s)=>{s.d(t,{hf:()=>u,il:()=>d,nD:()=>h,ud:()=>l,xD:()=>c,zr:()=>o});var i=s(4755),n=s(5418),a=s(4762),r=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function o(e){let t,s;return e instanceof HTMLVideoElement?(t=e.videoWidth,s=e.videoHeight):(t=e.naturalWidth,s=e.naturalHeight),n={media:e,mediaSize:(0,i.CJ)(t,s),boxSize:(0,i.CJ)(320,240),quality:.9},new Promise((e=>{var t,s;const i=document.createElement("canvas"),a=n.mediaSize.aspectFitted(n.boxSize);i.width=a.width*window.devicePixelRatio,i.height=a.height*window.devicePixelRatio,i.getContext("2d").drawImage(n.media,0,0,i.width,i.height),i.toBlob((t=>{e({blob:t,size:a})}),null!==(t=n.mimeType)&&void 0!==t?t:"image/jpeg",null!==(s=n.quality)&&void 0!==s?s:1)}));var n}function d(e){return new Promise(((t,s)=>{e.onseeked=()=>{e.onseeked=()=>{o(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=s,e.currentTime=Math.min(e.duration,1)}))}function l(e){return r(this,void 0,void 0,(function*(){const t=yield function(e){return new Promise(((t,s)=>{const i=document.createElement("video");i.volume=0,i.addEventListener("loadedmetadata",(()=>t(i)),{once:!0}),i.addEventListener("error",s,{once:!0}),i.src=e}))}(e);return Promise.race([(0,n.w)(2e3),d(t)])}))}function c(e,t=e.HAVE_METADATA,s){return new Promise((i=>{e.readyState>=t?i():e.addEventListener(a.IS_APPLE_MOBILE&&!s?"loadeddata":"canplay",(()=>i()),{once:!0})}))}function h(e,t=!1){return r(this,void 0,void 0,(function*(){const s=[],i=(e,n)=>r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,s)=>{t.readEntries((t=>r(this,void 0,void 0,(function*(){for(const e of t)yield i(e,n);e()}))))}))}else if(e)if(t)s.push(e.type);else{const t=n.getAsFile(),i=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((s,i)=>e.file(s,(e=>s(t)))));if(!i)return;s.push(i)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let i=0;i{t.addEventListener("change",(t=>{const i=t.target.files[0];i?e(i):s("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),s}},8079:(e,t,s)=>{function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}s.d(t,{Z:()=>i})},8939:(e,t,s)=>{s.d(t,{Z:()=>a});var i=s(4727);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function a(e,t){const s=function(e,t=2){e||(e=1);let s=[];const i=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;i.forEach(((t,a)=>{if(n*=t.m,e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=s.map((e=>i.default.format(n[e.type],!0,[e.duration])));return(0,i.join)(e,!1,t)}const a=s.map((e=>(0,i.i18n)(n[e.type],[e.duration]))),r=document.createElement("span");return r.append(...(0,i.join)(a,!1)),r}},3624:(e,t,s)=>{s.d(t,{k:()=>i});const i=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const s=e;return()=>!s.cleaned&&(!t||t())}}}},2575:(e,t,s)=>{function i(e,t=" "){const s=e.toString().split(".");return s[0]=s[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),s.join(".")}s.d(t,{Z:()=>i})},8027:(e,t,s)=>{function i(e,t){const s={writable:!0,configurable:!0},i={};t.forEach((t=>{e.hasOwnProperty(t)||(i[t]=s)})),Object.defineProperties(e,i)}s.d(t,{Z:()=>i})},7401:(e,t,s)=>{function i(e,t="asc"){if(!e)return[];const s=e instanceof Map?[...e.keys()]:Object.keys(e).map((e=>+e));return"asc"===t?s.sort(((e,t)=>e-t)):s.sort(((e,t)=>t-e))}s.d(t,{Z:()=>i})},4463:(e,t,s)=>{function i(e,t,s){"byteLength"in s[e]&&(s[e]=[...s[e]]),t&&t[e]!==s[e]&&(t[e].length=s[e].length,s[e].forEach(((s,i)=>{t[e][i]=s})),s[e]=t[e])}s.d(t,{Z:()=>i})},3442:(e,t,s)=>{function i(e,t){if(!e)return t;for(var s in e)t.hasOwnProperty(s)||delete e[s];for(var s in t)e[s]=t[s];return e}s.d(t,{Z:()=>i})},5393:(e,t,s)=>{s.d(t,{D:()=>i,Z:()=>a});var i,n=s(410);!function(e){e[e.None=0]="None",e[e.Top=1]="Top",e[e.Bottom=2]="Bottom",e[e.Both=3]="Both"}(i||(i={}));class a{constructor(){this.sliceConstructor=a.getSliceConstructor(this);const e=this.constructSlice();this.slices=[e]}static getSliceConstructor(e){return class extends Array{constructor(){super(...arguments),this.end=i.None}isEnd(t){if((this.end&t)===t)return!0;let s=!1;if(t===i.Top){const i=e.last;s=!!(i.end&t)&&this.includes(i[i.length-1])}else if(t===i.Bottom){const i=e.first;s=!!(i.end&t)&&this.includes(i[0])}else if(t===i.Both)return this.isEnd(i.Top)&&this.isEnd(i.Bottom);return s&&this.setEnd(t),s}setEnd(e){this.end|=e}unsetEnd(e){this.end&=~e}splice(t,s,...n){const a=super.splice(t,s,...n);if(!this.length){const t=e.slices,s=t.indexOf(this);-1!==s&&(1===t.length?this.unsetEnd(i.Both):t.splice(s,1))}return a}}}constructSlice(...e){const t=new this.sliceConstructor(e.length);for(let s=0,i=e.length;ss[0])break}this.slices.splice(t,0,this.constructSlice(...e)),d=t}return t?this.flatten(d):void 0}flatten(e){if(this.slices.length>=2)for(let t=0,s=this.slices.length;t=t[i])return{slice:t,offset:e===t[i]?i:i-1}}if(t&&t.isEnd(i.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let n=this.slice,a=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;n=t.slice,a=r=t.offset,n.includes(e)&&(r+=1)}let o=Math.max(r+t,0),d=r+t+s;const l=n.slice(o,d),c=t<0?s+t:s,h=Math.abs(t),u=n.length-r>=c||!!n.isEnd(i.Top)&&(l.setEnd(i.Top),!0),p=r-h>=0||!!n.isEnd(i.Bottom)&&(l.setEnd(i.Bottom),!0);return{slice:l,offsetIdOffset:a,fulfilled:i.None|(u&&p?i.Both:(u?i.Top:i.None)|(p?i.Bottom:i.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(i.Bottom)||(t=this.constructSlice(),t.setEnd(i.Bottom),this.slices.unshift(t)):t.setEnd(i.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(i.Top)||(t=this.constructSlice(),t.setEnd(i.Top),this.slices.push(t)):t.setEnd(i.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}}n.GO&&(n.GO.SlicedArray=a)},4847:(e,t,s)=>{function i(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}s.d(t,{Z:()=>i})},3738:(e,t,s)=>{function i(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}s.d(t,{Z:()=>i})},8456:(e,t,s)=>{function i(e,t,s=t+10){return(e=e.trim()).length>s&&(e=e.slice(0,t)+"..."),e}s.d(t,{Z:()=>i})},241:(e,t,s)=>{s.d(t,{Z:()=>i});const i=new class{constructor(){this.width=0,this.height=0;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},5185:(e,t,s)=>{s.d(t,{Z:()=>v});var i=s(410),n=s(5003),a=s(9518),r=s(3512),o=s(5555),d=s(8138),l=s(6440),c=s(4687),h=s(8045),u=s(8938),p=s(319),g=s(8598),f=s(4159);const m=new class{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,n.kg)("UPDATES",n.v9.Error|n.v9.Warn|n.v9.Log),this.debug=i.ZP,this.processUpdateMessage=(e,t={})=>{const s={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,s);break;case"updateShortMessage":case"updateShortChatMessage":{(0,u.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,i=e.from_id||(t?r.default.myId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||r.default.myId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:l.Z.getOutputPeer(i.toPeerId()),peer_id:l.Z.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},s);break}case"updatesCombined":case"updates":o.Z.saveApiUsers(e.users,t.override),d.Z.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,s)}));break;default:this.log.warn("Unknown update message",e)}}}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,s,i){return t[s]=i,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;c.default.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,s=e.pendingSeqUpdates[t];if(!s)return!1;const i=s.updates;for(let e=0,t=i.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let s=t.pts,i=0,n=0;for(let e=0,a=t.pendingPtsUpdates.length;e=a.pts&&(i=a.pts,n=e)}if(!i)return!1;this.debug&&this.log.debug("pop pending pts updates",i,t.pendingPtsUpdates.slice(0,n+1)),t.pts=i;for(let e=0;e<=n;++e){const s=t.pendingPtsUpdates[e];this.saveUpdate(s)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let s=t.syncLoading;s||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=a.Z.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((s=>{if(this.debug&&this.log.debug("Get diff result",s),"updates.differenceEmpty"===s._)return this.debug&&this.log.debug("apply empty diff",s.seq),t.date=s.date,void(t.seq=s.seq);if(e&&r.default.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==s._){o.Z.saveApiUsers(s.users),d.Z.saveApiChats(s.chats),s.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),s.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===s._?s.state:s.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=s.pts,t.date=(Date.now()/1e3|0)+h.Z.serverTimeOffset,delete t.seq,this.channelStates={},this.log.warn("getDifference:",s._),r.default.dispatchEvent("state_cleared");if("updates.differenceSlice"===s._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return s||this.justAName(t,i),i}getChannelDifference(e){const t=this.getChannelState(e),s=t.syncLoading;s||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=a.Z.invokeApi("updates.getChannelDifference",{channel:d.Z.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then((s=>{if(this.debug&&this.log.debug("Get channel diff result",s),t.pts="pts"in s?s.pts:void 0,"updates.channelDifferenceEmpty"!==s._){if("updates.channelDifferenceTooLong"===s._)return this.debug&&this.log.debug("channel diff too long",s),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(o.Z.saveApiUsers(s.users),d.Z.saveApiChats(s.chats),this.debug&&this.log.debug("applying",s.other_updates.length,"channel other updates"),s.other_updates.forEach((e=>{this.saveUpdate(e)})),this.debug&&this.log.debug("applying",s.new_messages.length,"channel new messages"),s.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===s._&&!s.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",s)}));return s||this.justAName(t,i,e),i}justAName(e,t,s){e.syncLoading=t,r.default.dispatchEvent("state_synchronizing",s),t.then((()=>{e.syncLoading=null,r.default.dispatchEvent("state_synchronized",s)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var s;let i;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":i=l.Z.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(i=e.channel_id,!(i in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(i=e.channel_id)}const{pts:n,pts_count:a}=e,r=i?this.getChannelState(i,n):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(i?this.getChannelDifference(i):this.getDifference())}),6)}),r.syncPending.ptsAwaiting=!0,!1;if(n>r.pts)r.pts=n,c=!0,r.lastPtsUpdateTime=Date.now();else if(a)return!1;i&&t.date&&this.updatesState.date0){const s=t.seq,i=t.seqStart||s;if(i!==r.seq+1&&i>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[i]&&(r.pendingSeqUpdates[i]={seq:s,date:t.date,updates:[]}),r.pendingSeqUpdates[i].updates.push(e),r.syncPending||(r.syncPending={timeout:window.setTimeout((()=>{r.syncPending=null,r.syncLoading||this.getDifference()}),6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const t=c.default.newVersion;e&&e.pts&&e.date?(Object.assign(this.updatesState,e),this.log("will get difference",Object.assign({},e)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{a.Z.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),a.Z.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),t&&this.updatesState.syncLoading.then((()=>{fetch("changelogs/"+t.split(" ")[0]+".md").then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((e=>{e=`**Telegram Web${f.Z.suffix} was updated to version ${t}**\n\n`+e;const s=[],i={_:"updateServiceNotification",entities:s,message:g.Z.parseMarkdown(e,s),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(i)})).catch(p.Z)}))})))}};i.GO.apiUpdatesManager=m;const v=m},9256:(e,t,s)=>{s.d(t,{Z:()=>p});var i=s(6740),n=s(5565),a=s(9674),r=s(1507),o=s(8598),d=s(3512),l=s(7309),c=s(6440),h=s(3714),u=s(5555);const p=new class{constructor(){this.savedAvatarURLs={}}isAvatarCached(e){return!!this.savedAvatarURLs[e]}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,s){const i=c.Z.getInputPeerById(e);let n,a=!1,r=this.savedAvatarURLs[e];if(r&&r[s])"string"!=typeof r[s]?n=r[s]:(n=Promise.resolve(r[s]),a=!0);else{r||(r=this.savedAvatarURLs[e]={});const a={_:"inputPeerPhotoFileLocation",pFlags:{},peer:i,photo_id:t.photo_id};"photo_big"===s&&(a.pFlags.big=!0);const o={dcId:t.dc_id,location:a},d=l.Z.download(o);n=r[s]=d.then((e=>r[s]=URL.createObjectURL(e)))}return{cached:a,loadPromise:n}}putAvatar(e,t,s,r,o=new Image,l=!1){let c,u,p,{cached:g,loadPromise:f}=this.loadAvatar(t,s,r);if(o.classList.add("avatar-photo"),g)u=()=>{(0,n.Z)(e,o),e.dataset.color=""};else{const l=d.default.settings.animationsEnabled;if(l&&o.classList.add("fade-in"),"photo_big"===r){const i=this.putAvatar(e,t,s,"photo_small");c=i.loadPromise,p=i.thumbImage}else if(s.stripped_thumb){p=new Image,e.classList.add("avatar-relative"),p.classList.add("avatar-photo","avatar-photo-thumbnail");const t=h.Z.getPreviewURLFromBytes(s.stripped_thumb);c=(0,i.cj)(p,t).then((()=>{(0,n.Z)(e,p)}))}u=()=>{p?e.append(o):(0,n.Z)(e,o),setTimeout((()=>{e.childElementCount&&a.Z.mutateElement(o,(()=>{e.dataset.color="",l&&o.classList.remove("fade-in"),p&&p.remove()}))}),l?200:0)}}const m=f.then((e=>(0,i.cj)(o,e))).then(u);return{cached:g,loadPromise:c||m,thumbImage:p}}s(e,t,s,i){e.innerHTML=t,e.dataset.color=s,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),i&&e.classList.add(i)}putPhoto(e,t,s=!1,i="",n=!1,a){var l;const h=d.default.myId;if(t===h&&s)return void this.s(e,"","","tgico-saved");if(t!==r.NM&&t.isUser()){const s=u.Z.getUser(t);if(s&&s.pFlags&&s.pFlags.deleted)return void this.s(e,"",c.Z.getPeerColorById(t),"tgico-deletedaccount")}const p=c.Z.getPeerPhoto(t),g=!!p,f=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!g||!f||!this.savedAvatarURLs[t]){let n,a="";if(!t||t===h&&s||(a=c.Z.getPeerColorById(t)),t===r.hj)return void this.s(e,"",a,"tgico-reply_filled");n=i?o.Z.getAbbreviation(i):null!==(l=c.Z.getPeer(t).initials)&&void 0!==l?l:"",this.s(e,n,a,"")}if(g){const s=a?"photo_big":"photo_small";return this.putAvatar(e,t,p,s,void 0,n)}}}},8138:(e,t,s)=>{s.d(t,{Z:()=>v});var i=s(410),n=s(8479),a=s(6848),r=s(5880),o=s(3442),d=s(9518),l=s(8598),c=s(3512),h=s(5185),u=s(6440),p=s(4687),g=s(5555),f=s(677);const m=new class{constructor(){this.storage=p.default.storages.chats,this.onChatUpdated=(e,t)=>{var s;h.Z.processUpdateMessage(t),(null===(s=null==t?void 0:t.updates)||void 0===s?void 0:s.length)&&this.isChannel(e)&&c.default.dispatchEvent("invalidate_participants",e)},this.clear(!0),c.default.addMultipleEventsListeners({updateChannelParticipant:e=>{d.Z.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=u.Z.getPeerId(e.peer).toChatId(),s=this.chats[t];s&&(s.default_banned_rights=e.default_banned_rights,c.default.dispatchEvent("chat_update",t))}}),p.default.getState().then((e=>{const t=p.default.storagesResults.chats;if(t.length)for(let e=0,s=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),p.default.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}clear(e=!1){if(e)this.chats={};else{const e=p.default.storagesResults.chats;for(const t in this.chats)t&&(p.default.isPeerNeeded(t.toPeerId(!0))||(e.findAndSplice((e=>e.id===t)),this.storage.delete(t),delete this.chats[t]))}}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var s,i;if("chatEmpty"===e._)return;const n=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;e.initials=l.o.getAbbreviation(e.title),"channel"===e._&&void 0===e.participants_count&&void 0!==n&&n.participants_count&&(e.participants_count=n.participants_count);let a=!1,r=!1;void 0===n?this.chats[e.id]=e:((null===(s=n.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(a=!0),n.title!==e.title&&(r=!0),(0,o.Z)(n,e),c.default.dispatchEvent("chat_update",e.id));const d=e.id.toPeerId(!0);a&&c.default.dispatchEvent("avatar_update",d),r&&c.default.dispatchEvent("peer_title_edit",d),p.default.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}combineParticipantBannedRights(e,t){const s=this.getChat(e);if(s.default_banned_rights){t=(0,n.Z)(t);const e=s.default_banned_rights.pFlags;for(let s in e)t.pFlags[s]=e[s]}return t}hasRights(e,t,s,i){const n=this.getChat(e);if("chatEmpty"===n._)return!1;if(n.pFlags.deactivated&&"view_messages"!==t)return!1;const a=void 0===s;if(n.pFlags.creator&&a)return!0;if("chatForbidden"===n._||"channelForbidden"===n._||n.pFlags.kicked||n.pFlags.left&&!n.pFlags.megagroup)return!1;if(!s&&!(s=n.admin_rights||n.banned_rights||n.default_banned_rights))return!1;let r={};switch(s&&(r=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!i&&n.pFlags.left)return!1;if("chatBannedRights"===s._&&r[t])return!1;if("channel"===n._&&!n.pFlags.megagroup&&!r.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!r[t];case"pin_messages":return"chatAdminRights"===s._?r[t]||!!r.post_messages:!r[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?r[t]:!r[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!r.ban_users;case"view_participants":return!("chat"!==n._&&n.pFlags.broadcast&&!n.pFlags.creator&&!n.admin_rights)}return!0}editChatDefaultBannedRights(e,t){const s=this.getChat(e);return s.default_banned_rights&&s.default_banned_rights.until_date===t.until_date&&(0,a.Z)(s.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():d.Z.invokeApi("messages.editChatDefaultBannedRights",{peer:u.Z.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){const t=this.chats[e];return!(!t||"channel"!==t._||!t.pFlags.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const s=this.getChat(e);return("channelForbidden"===s._||"chatForbidden"===s._||"chatEmpty"===s._||s.pFlags.left||s.pFlags.kicked||s.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const s=this.chats[e];return(0,r.Z)(s)&&(t||!s.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return d.Z.invokeApi("channels.createChannel",e).then((e=>{h.Z.processUpdateMessage(e);const t=e.chats[0].id;return c.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t}))}inviteToChannel(e,t){const s=this.getChannelInput(e),i=t.map((e=>g.Z.getUserInput(e)));return d.Z.invokeApi("channels.inviteToChannel",{channel:s,users:i}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return d.Z.invokeApi("messages.createChat",{users:t.map((e=>g.Z.getUserInput(e))),title:e}).then((e=>{h.Z.processUpdateMessage(e);const t=e.chats[0].id;return c.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t}))}leaveChannel(e){return d.Z.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return d.Z.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,s=100){return d.Z.invokeApi("messages.addChatUser",{chat_id:e,user_id:g.Z.getUserInput(t),fwd_limit:s}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return d.Z.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:g.Z.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,g.Z.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return d.Z.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return d.Z.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):d.Z.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t){return d.Z.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then((s=>(s&&(this.getChat(e).username=t),s)))}editPhoto(e,t){const s={_:"inputChatUploadedPhoto",file:t};let i;return i=this.isChannel(e)?d.Z.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:s}):d.Z.invokeApi("messages.editChatPhoto",{chat_id:e,photo:s}),i.then((e=>{h.Z.processUpdateMessage(e)}))}editTitle(e,t){let s;return s=this.isChannel(e)?d.Z.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):d.Z.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),s.then((e=>{h.Z.processUpdateMessage(e)}))}editAbout(e,t){const s=e.toPeerId(!0);return d.Z.invokeApi("messages.editChatAbout",{peer:u.Z.getInputPeerById(s),about:t}).then((e=>(e&&c.default.dispatchEvent("peer_bio_edit",s),e)))}getParticipantPeerId(e){return e.peer?u.Z.getPeerId(e.peer):e.user_id.toPeerId()}editBanned(e,t,s){const i="object"!=typeof t?t:this.getParticipantPeerId(t);return d.Z.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:u.Z.getInputPeerById(i),banned_rights:s}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;h.Z.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:i,prev_participant:t,new_participant:Object.keys(s.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:s,kicked_by:g.Z.getSelf().id,peer:u.Z.getOutputPeer(i),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return d.Z.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>d.Z.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}))).then((e=>{h.Z.processUpdateMessage(e)}))}toggleSignatures(e,t){return d.Z.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then((e=>{h.Z.processUpdateMessage(e)}))}toggleNoForwards(e,t){return d.Z.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then((e=>{h.Z.processUpdateMessage(e)}))}setChatAvailableReactions(e,t){return d.Z.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then((e=>{h.Z.processUpdateMessage(e)}))}isRestricted(e){const t=this.getChat(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&(0,f.X)(s))}getSendAs(e){return d.Z.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(g.Z.saveApiUsers(e.users),m.saveApiChats(e.chats),e.peers)})}};i.GO.appChatsManager=m;const v=m},1592:(e,t,s)=>{s.d(t,{Z:()=>P});var i=s(8801),n=s(2003),a=s(9043),r=s(8598),o=s(7309),d=s(3714),l=s(6705),c=s(9518),h=s(410),u=s(632),p=s(3512),g=s(5269),f=s(393),m=s(8027),v=s(5880),_=s(4463);const y={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"},I=new class{constructor(){this.docs={},this.savingLottiePreview={},this.downloading=new Map,this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,delete o.Z.getCacheContext(t).url)}},c.Z.onServiceWorkerFail=this.onServiceWorkerFail}saveDoc(e,t){if("documentEmpty"===e._)return;const s=this.docs[e.id];e.file_reference&&((0,_.Z)("file_reference",s,e),n.Z.saveContext(e.file_reference,t)),s||(this.docs[e.id]=e);for(let t=0,s=e.attributes.length;t8e6||"audio"===e.type||"video"===e.type)){e.supportsStreaming=!0;const t=o.Z.getCacheContext(e);t.url||(t.url=this.getFileURL(e))}return e.file_name||(e.file_name=e.fileName=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),s?Object.assign(s,e):e}getDoc(e){return(0,v.Z)(e)?e:this.docs[e]}getMediaInput(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}getInput(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}getFileDownloadOptions(e,t,s,i){const n=this.getInput(e,null==t?void 0:t.type);let a;return a=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:n,size:t?t.size:e.size,mimeType:a,fileName:e.file_name,queueId:s,onlyCache:i}}getFileURL(e,t=!1,s){let n;return n=t?"download":s?"thumb":e.supportsStreaming?"stream":"document",(0,i.q)(n,this.getFileDownloadOptions(e,s))}getThumbURL(e,t){let s=Promise.resolve();const i=o.Z.getCacheContext(e,t.type);return i.url||(s="bytes"in t?(0,l.Z)(d.Z.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then((e=>{i.url=e})):d.Z.preloadPhoto(e,t)),{thumb:t,cacheContext:i,promise:s}}getThumb(e,t=!0){const s=d.Z.choosePhotoSize(e,0,0,!t);return"photoSizeEmpty"===s._?null:this.getThumbURL(e,s)}getInputFileName(e,t){return(0,i.P)(this.getInput(e,t),{fileName:e.file_name})}downloadDoc(e,t,s){const i=this.getInputFileName(e);let n=o.Z.getDownload(i);if(n)return n;const r=this.getFileDownloadOptions(e,void 0,t,s);n=o.Z.download(r),this.downloading.set(e.id,n),p.default.dispatchEvent("download_start",e.id);const d=o.Z.getCacheContext(e),l=n;return l.then((e=>{d.url=URL.createObjectURL(e),d.downloaded=e.size}),(()=>{})).finally((()=>{this.downloading.delete(e.id)})),"voice"!==e.type||a.Z.isPlaySupported()||(n=l.then((e=>{return t=this,s=void 0,n=function*(){const t=new FileReader;return yield new Promise(((s,i)=>{t.onloadend=e=>{const t=new Uint8Array(e.target.result);a.Z.decode(t).then((e=>{d.url=e.url,s()}),(e=>{delete d.downloaded,i(e)}))},t.readAsArrayBuffer(e)})),e},new((i=void 0)||(i=Promise))((function(e,a){function r(e){try{d(n.next(e))}catch(e){a(e)}}function o(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(r,o)}d((n=n.apply(t,s||[])).next())}));var t,s,i,n}))),n.then((()=>{p.default.dispatchEvent("document_downloaded",e)})),n}isSavingLottiePreview(e,t){const s=e.id+"-"+t;return!!this.savingLottiePreview[s]}saveLottiePreview(e,t,s){const i=e.id+"-"+s;if(this.savingLottiePreview[i])return;e.stickerCachedThumbs||((0,m.Z)(e,["stickerCachedThumbs"]),e.stickerCachedThumbs={});const n=e.stickerCachedThumbs[s];n&&n.w>=t.width&&n.h>=t.height||(this.savingLottiePreview[i]=!0,t.toBlob((n=>{const a={url:URL.createObjectURL(n),w:t.width,h:t.height};e.stickerCachedThumbs[s]=a,delete this.savingLottiePreview[i]})))}saveDocFile(e,t){const s=this.downloadDoc(e,t);return s.then((()=>{const t=o.Z.getCacheContext(e);o.Z.createDownloadAnchor(t.url,e.file_name)})),s}};h.GO.appDocsManager=I;const P=I},5667:(e,t,s)=>{s.d(t,{Z:()=>_});var i=s(3512),n=s(6440),a=s(7223),r=s(5185),o=s(8598),d=s(8045),l=s(9518),c=s(632),h=s(410),u=s(7922),p=s(9492),g=s(8938),f=s(5880),m=s(6848);const v=new class{constructor(){this.drafts={},this.getAllDraftPromise=null,u.Z.get("drafts").then((e=>{this.drafts=e||{}})),i.default.addMultipleEventsListeners({updateDraftMessage:e=>{const t=n.Z.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}})}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();a.Z.getDialogOnly(t)||a.Z.reloadConversation(t)}}))}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=l.Z.invokeApi("messages.getAllDrafts").then((e=>{(r.Z.updatesState.syncLoading||Promise.resolve()).then((()=>{r.Z.processUpdateMessage(e)}))})))}saveDraft(e,t,s,n={}){const a=this.processApiDraft(s),r=this.getKey(e,t);return a?this.drafts[r]=a:delete this.drafts[r],u.Z.set({drafts:this.drafts}),n.notify&&i.default.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:a,force:n.force}),a}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!(0,f.Z)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!(0,m.Z)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(!e||"draftMessage"!==e._)return;const t=o.Z.parseEntities(e.message),s=e.entities||[],i=o.Z.mergeEntities(s.slice(),t);return e.rMessage=o.Z.wrapDraftText(e.message,{entities:i}),e.reply_to_msg_id&&(e.reply_to_msg_id=p.Z.generateMessageId(e.reply_to_msg_id)),e}syncDraft(e,t,s,i=!0,r=!1){return o=this,h=void 0,f=function*(){const o=this.getDraft(e,t);if(this.draftsAreEqual(o,s))return!0;let h,u={peer:n.Z.getInputPeerById(e),message:""};if(this.isEmptyDraft(s))h={_:"draftMessageEmpty"};else{(0,g.Z)(s);let e=s.message,t=s.entities;s.reply_to_msg_id&&(u.reply_to_msg_id=p.Z.getServerMessageId(s.reply_to_msg_id)),(null==t?void 0:t.length)&&(u.entities=a.Z.getInputEntities(t)),s.pFlags.no_webpage&&(u.no_webpage=s.pFlags.no_webpage),u.message=e}const f=h||s;return f.date=(0,c.bz)(!0)+d.Z.serverTimeOffset,this.saveDraft(e,t,f,{notify:!0,force:r}),!(i&&!t)||l.Z.invokeApi("messages.saveDraft",u)},new((u=void 0)||(u=Promise))((function(e,t){function s(e){try{n(f.next(e))}catch(e){t(e)}}function i(e){try{n(f.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof u?n:new u((function(e){e(n)}))).then(s,i)}n((f=f.apply(o,h||[])).next())}));var o,h,u,f}clearAllDrafts(){return l.Z.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,s]=e.split("_");i.default.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:s?+s:void 0,draft:void 0})}}))}clearDraft(e,t){const s={_:"draftMessageEmpty"};t?this.syncDraft(e,t,s,!1,!0):this.saveDraft(e,t,s,{notify:!0,force:!0})}setDraft(e,t,s,i){const n={_:"draftMessage",date:Date.now()/1e3|0,message:s,pFlags:{},entities:i};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft(e,t,n,{notify:!0,force:!0})}};h.GO.appDraftsManager=v;const _=v},2459:(e,t,s)=>{s.d(t,{Z:()=>Z});var i=s(410),n=s(5916),a=s(3442),r=s(144),o=s(7298),d=s(9078),l=s(2207),c=s(1677),h=s(4081),u=s(9125),p=s(5424),g=s(312),f=s(6752),m=s(5003),v=s(9518),_=s(1507),y=s(3512),I=s(5185),P=s(8138),S=s(6440),M=s(5555),w=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const C=new class{constructor(){this.makeSsrcsFromParticipant=e=>{var t,s;return[this.makeSsrcFromParticipant(e,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.video.audio_source),e.video&&this.makeSsrcFromParticipant(e,"video",e.video.source_groups,e.video.endpoint),(null===(s=e.presentation)||void 0===s?void 0:s.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.presentation.audio_source),e.presentation&&this.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)},this.log=(0,m.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,y.default.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),y.default.addEventListener("group_call_update",(e=>{if("groupCallDiscarded"===e._){const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&t.hangUp(!1,!1,!0),this.participants.delete(e.id)}})),this.audioAsset=new n.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"])}get groupCall(){return this.currentGroupCall}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,s=t.get(e);return{nextOffset:s,setNextOffset:i=>{t.get(e)===s&&t.set(e,i)}}}saveApiParticipant(e,t,s){const{currentGroupCall:i}=this,n=this.getCachedParticipants(e),r=S.Z.getPeerId(t.peer),o=n.get(r),d=t.pFlags.left;if(!o&&d)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0);const l=(null==i?void 0:i.id)===e;o?((0,a.Z)(o,t),t=o):n.set(r,t),l&&i.onParticipantUpdate(t,this.doNotDispatchParticipantUpdate);const c=this.getGroupCall(e);if("groupCall"===(null==c?void 0:c._)){let e=!1;d?(--c.participants_count,e=!0):!t.pFlags.just_joined||o||t.pFlags.self||(++c.participants_count,e=!0),e&&y.default.dispatchEvent("group_call_update",c)}d&&n.delete(r),o&&this.doNotDispatchParticipantUpdate!==r&&y.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,s){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,s))))}editParticipant(e,t,s){return w(this,void 0,void 0,(function*(){if(!Object.keys(s).length)return;if(t){const{currentGroupCall:i}=this,n=(null==i?void 0:i.id)===e&&t.pFlags.self;if(n&&void 0!==s.muted&&!i.isSharingAudio&&(delete s.muted,!Object.keys(s).length))return;const a=s.muted;void 0!==a&&t.pFlags.self&&(a?t.pFlags.muted=!0:t.pFlags.can_self_unmute&&delete t.pFlags.muted),void 0!==s.raiseHand&&(s.raiseHand?t.raise_hand_rating="1":delete t.raise_hand_rating),n&&(void 0!==s.videoStopped&&(s.videoStopped?delete t.video:t.video=this.generateSelfVideo(i.connections.main.sources.video)),!t.pFlags.muted&&t.pFlags.can_self_unmute&&i.setMuted(!1),i.dispatchEvent("state",i.state)),y.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}const i=t.pFlags.self?_.NM:S.Z.getPeerId(t.peer),n=yield v.Z.invokeApiSingle("phone.editGroupCallParticipant",{call:C.getGroupCallInput(e),participant:i===_.NM?S.Z.getInputPeerSelf():S.Z.getInputPeerById(i),muted:s.muted,volume:s.volume,raise_hand:s.raiseHand,video_paused:s.videoPaused,video_stopped:s.videoStopped,presentation_paused:s.presentationPaused});I.Z.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return w(this,void 0,void 0,(function*(){const s=this.getGroupCall(e);if(s&&"inputGroupCall"!==s._&&!t)return s;const i=this.getCachedParticipants(e).size?0:100;return v.Z.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:i},processResult:t=>{M.Z.saveApiUsers(t.users),P.Z.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const s=this.saveGroupCall(t.call);return i&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),s}})}))}saveGroupCall(e,t){const s=this.groupCalls.get(e.id),i="inputGroupCall"!==e._&&(!s||"groupCallDiscarded"!==s._);return s?(i&&(0,a.Z)(s,e),e=s):this.groupCalls.set(e.id,e),i&&y.default.dispatchEvent("group_call_update",e),e}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}setCurrentGroupCall(e){this.currentGroupCall=e,e&&y.default.dispatchEvent("group_call_instance",e)}createGroupCall(e,t,s){return w(this,void 0,void 0,(function*(){const i=yield v.Z.invokeApi("phone.createGroupCall",{peer:S.Z.getInputPeerById(e.toPeerId(!0)),random_id:(0,r.d)(32),schedule_date:t,title:s});return I.Z.processUpdateMessage(i),i.updates.find((e=>"updateGroupCall"===e._)).call}))}joinGroupCall(e,t,s=!0,i,n){return w(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${s} rejoin=${i}`),a=i?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return s=this,i=void 0,a=function*(){const s={audio:(0,u.Z)(),video:t&&(0,g.Z)()},i=new h.Z(c.iK);try{const t=yield(0,p.Z)(s,e);i.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,s),i.inputStream=new MediaStream}return i},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{d(a.next(e))}catch(e){t(e)}}function o(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,o)}d((a=a.apply(s,i||[])).next())}));var s,i,n,a}(s,n),this.joinGroupCallInternal(e,t,a,s,i,n)}))}joinGroupCallInternal(e,t,s,i,n=!1,a){return w(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);const o="main";let{currentGroupCall:c}=this;if(!c||!n){c=new d.Z({chatId:e,id:t}),c.fixSafariAudio(),c.addEventListener("state",(e=>{this.currentGroupCall===c&&e===l.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),y.default.dispatchEvent("chat_update",c.chatId))})),c.groupCall=yield this.getGroupCallFull(t);const h=c.createConnectionInstance({streamManager:s,type:o,options:{type:o,isMuted:i,joinVideo:a,rejoin:n}}),u=h.createPeerConnection();return u.addEventListener("negotiationneeded",(()=>{h.negotiate()})),u.addEventListener("track",(e=>{r("ontrack",e),c.onTrack(e)})),u.addEventListener("iceconnectionstatechange",(()=>{c.dispatchEvent("state",c.state);const{iceConnectionState:e}=u;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":c.hangUp();break;case"connected":c.joined||(c.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.getGroupCallParticipants(t).then((({participants:e})=>{this.saveApiParticipants(t,[...e.values()])})))}})),h.createDescription(),h.createDataChannel(),h.appendStreamToConference(),this.setCurrentGroupCall(c),r("set currentGroupCall",t,c),this.startConnectingSound(),h.negotiate()}c.handleUpdateGroupCallParticipants=!1,c.updatingSdp=!1,r("update currentGroupCall",t,c)}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}generateSelfVideo(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}generateSelfParticipant(){var e,t;const s=this.currentGroupCall.connections.main.sources,i=null===(e=this.currentGroupCall.connections.presentation)||void 0===e?void 0:e.sources;return{_:"groupCallParticipant",pFlags:{can_self_unmute:!0,self:!0},source:s.audio.source,video:this.generateSelfVideo(s.video),presentation:i&&this.generateSelfVideo(i.video,null===(t=i.audio)||void 0===t?void 0:t.source),date:(0,o.Z)(!0),peer:S.Z.getOutputPeer(y.default.myId)}}makeSsrcFromParticipant(e,t,s,i){return(0,f.z_)(t,s,i)}getGroupCallParticipants(e){return w(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:s}=this.prepareToSavingNextOffset(e);return""!==t&&(yield v.Z.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const i=t.count===t.participants.length?"":t.next_offset;P.Z.saveApiChats(t.chats),M.Z.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),s(i)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t=!1,s=!1){return w(this,void 0,void 0,(function*(){this.log(`hangUp start id=${e} discard=${t} rejoin=${s}`);const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.hangUp(t,s)}))}toggleMuted(e){return this.changeUserMuted(_.NM,e)}changeUserMuted(e,t){const{currentGroupCall:s}=this;if(!s)return;const i=s.getParticipantByPeerId(e);return _.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(s.id,i,{muted:t})}};i.GO&&(i.GO.appGroupCallsManager=C);const Z=C},9492:(e,t,s)=>{s.d(t,{Z:()=>r});var i=s(410);class n{constructor(){this.tempNum=0}generateMessageId(e,t=!1){const s=n.MESSAGE_ID_OFFSET,i=t?++this.tempNum:0;return e>=s?t?e+(i&n.MESSAGE_ID_INCREMENT-1):e:s+(e*n.MESSAGE_ID_INCREMENT+(i&n.MESSAGE_ID_INCREMENT-1))}getServerMessageId(e){return this.clearMessageId(e,!0)}clearMessageId(e,t){const s=n.MESSAGE_ID_OFFSET;if(e{s.d(t,{Z:()=>pe});var i=s(1425),n=s(1964),a=s(3725),r=s(632),o=s(6056),d=s(144),l=s(4727),c=s(5003),h=s(9518),u=s(2003),p=s(8045),g=s(8598),f=s(3512),m=s(7381),v=s(5393),_=s(1507),y=s(6761),I=s(6947),P=s(7625),S=s(1655),M=s(6519),w=s(8027),C=s(3442);const Z=void 0;class b{constructor(e,t,s,i,n,a,r,o,d,l){this.appMessagesManager=e,this.appChatsManager=t,this.appPeersManager=s,this.appUsersManager=i,this.appDraftsManager=n,this.appNotificationsManager=a,this.appStateManager=r,this.apiUpdatesManager=o,this.serverTimeManager=d,this.appMessagesIdsManager=l,this.folders={},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:s,peer:i}=e,n=this.appPeersManager.getPeerId(i),a=this.dropDialog(n)[0];a&&((null===(t=a.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(a,s),a.folder_id=s,this.generateIndexForDialog(a),this.pushDialog(a)),this.appMessagesManager.scheduleHandleNewDialogs(n,a)}))},this.onUpdateDialogPinned=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(i);n&&(e.pFlags.pinned?n.pFlags.pinned=!0:this.handleDialogUnpinning(n,s),this.generateIndexForDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(i,n)},this.onUpdatePinnedDialogs=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=e=>{this.pinnedOrders[s].length=0,e.reverse(),e.forEach((e=>{n[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))}));const t=this.getFolderDialogs(s,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;n[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},n={};e.order?i(e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):h.Z.invokeApi("messages.getPinnedDialogs",{folder_id:s}).then((e=>{this.applyDialogs(e),i(e.dialogs.map((e=>e.peerId)))}))},this.storage=this.appStateManager.storages.dialogs,this.dialogs=this.storage.getCache(),this.clear(!0),f.default.addEventListener("language_change",(()=>{const e=i.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=s.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const c=e=>{const t=this.getCachedDialogs(!1);for(let s=0;s{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),s=`index_${e.orderIndex}`;for(let e=0;e{this.processDialogForFilters(e)})),f.default.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),s=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(s)&&this.dropDialogOnDeletion(s)})),f.default.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),r.getState().then((e=>{this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]);const t=r.storagesResults.dialogs;t.length&&I.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{}}))}setDialogsFromState(e){for(let t=0,s=e.length;tvoid 0===e.migratedTo)):s.dialogs}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,s){var i;let n;if(this.appMessagesManager.filtersStorage.testDialogForFilter(e,s)){const t=s.pinnedPeerIds.indexOf(e.peerId);n=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(s.pinned_peers.length-1-t),!0):(null===(i=e.pFlags)||void 0===i?void 0:i.pinned)?this.generateIndexForDialog(e,!0):e.index}return e[t]=n}getDialog(e,t,s=!0){const i=[];void 0===t?i.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):i.push(this.getFolderDialogs(t,!1));for(let t of i){let i=0,n=0;for(let a=t.length;it.peerId===e.peerId)),a=i[n],r=a&&a[s],o=this.setDialogIndexInFilter(e,s,t);r!==o&&((!r&&o||n&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==n&&i.splice(n,1),o&&(0,M.Z)(i,e,s,-1))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],s=this.appMessagesManager.filtersStorage.filters;for(const i in s){const n=s[i];this.appMessagesManager.filtersStorage.testDialogForFilter(e,n)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}return()=>t.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,s){const i=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===s)return()=>{const s=this.appMessagesManager.getDialogUnreadCount(t),n=s-i,a=s&&!i||!s&&i?i?-1:1:0;this.modifyFolderUnreadCount(e,n,a)};this.modifyFolderUnreadCount(e,s?i:-i,i?s?1:-1:0)}modifyFolderUnreadCount(e,t,s){if(!t&&!s)return;const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t)),s&&(i.unreadDialogsCount=Math.max(0,i.unreadDialogsCount+s)),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=y.Z.setTimeout((()=>{i.dispatchUnreadTimeout=void 0,f.default.dispatchEvent("folder_unread",i)}),0))}generateIndexForDialog(e,t=!1,s){var i;let n,a=0;if(e.pFlags.pinned&&!t)a=this.generateDialogPinnedDate(e),n=!0;else{s||(s=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),a=s.date||a;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!a||e.date&&e.date>a)&&(a=e.date)}"draftMessage"===(null===(i=e.draft)||void 0===i?void 0:i._)&&e.draft.date>a&&(a=e.draft.date)}a||(a=(0,r.bz)(!0));const o=this.generateDialogIndex(a,n);if(t)return o;e.index=o}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],s=t.indexOf(e.peerId);let i=s;return-1===s&&(i=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(i)}setDialogToState(e){const{peerId:t,pts:s}=e,i=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getMessagesStorage(t),a=i.history.slice;let r;for(let e=0,s=a.length;ee.peerId===a));if(-1!==o&&r.splice(o,1),this.dialogs[a]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(i){const e=this.dialogsOffsetDate[void 0];(!e||t{"dialogFolder"===t._&&e.dialogs.splice(s,1)})),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach((e=>{const s=this.appPeersManager.getPeerId(e.peer);let i=e.top_message;const n=this.appMessagesManager.pendingTopMsgs[s];n&&(!i||this.appMessagesManager.getMessageByPeer(s,n).date>this.appMessagesManager.getMessageByPeer(s,i).date)&&(e.top_message=i=n,this.appMessagesManager.getHistoryStorage(s).maxId=n),i||e.draft&&"draftMessage"===e.draft._?(this.saveDialog(e),t[s]=e):this.dropDialogWithEvent(s);const a=this.appMessagesManager.newUpdatesAfterReloadToHandle[s];if(void 0!==a){for(const e of a)a.delete(e),this.apiUpdatesManager.saveUpdate(e);a.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[s]}})),Object.keys(t).length&&f.default.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){return this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message).date||0}saveDialog(e,t,s,i){var n,a;void 0===t&&(t=null!==(n=e.folder_id)&&void 0!==n?n:0);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const o=this.appPeersManager.isChannel(r)?r.toChatId():_.NM;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left||e.pFlags.kicked)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const l=this.getDialogOnly(r);let c,h;if(e.top_message){c=this.appMessagesIdsManager.generateMessageId(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(r,l.top_message);(null===(a=null==t?void 0:t.pFlags)||void 0===a?void 0:a.is_outgoing)&&l.top_message>=c&&(c=l.top_message),h=this.appMessagesManager.getMessageByPeer(r,c)}else c=this.appMessagesManager.generateTempMessageId(r),h={_:"message",id:c,mid:c,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([h],{isOutgoing:!0});if((null==h?void 0:h.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,h),!o&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const s=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=s,this.appMessagesManager.migratedToFrom[s]=r,e.migratedTo=s}}if(e.top_message=c,e.read_inbox_max_id=this.appMessagesIdsManager.generateMessageId(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=this.appMessagesIdsManager.generateMessageId(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,h.pFlags.is_outgoing){const t=h.pFlags.out;c>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(h.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete h.pFlags.unread}const u=this.appMessagesManager.getHistoryStorage(r),p=u.history.slice;p.length?p.isEnd(v.D.Bottom)||(u.history.insertSlice([c]).setEnd(v.D.Bottom),u.count||(u.count=1),this.appMessagesManager.mergeReplyKeyboard(u,h)&&f.default.dispatchEvent("history_reply_markup",{peerId:r})):(u.history.unshift(c),u.count||(u.count=1),this.appMessagesManager.mergeReplyKeyboard(u,h)&&f.default.dispatchEvent("history_reply_markup",{peerId:r})),u.maxId=c,u.readMaxId=e.read_inbox_max_id,u.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),o&&e.pts&&this.apiUpdatesManager.addChannelState(o,e.pts),this.generateIndexForDialog(e),(0,w.Z)(e,["index_0","index_1","index_2","index_3","index_4","index_5","index_6","index_7","index_8","index_9","index_10"]),l&&(0,C.Z)(l,e),this.pushDialog(e,h.date,s,i)}getDialogIndexKey(e){return e>1?`index_${this.appMessagesManager.filtersStorage.getFilter(e).orderIndex}`:"index"}getDialogs(e="",t,s=20,i=0,n=!1){const a={};if(i>1){const r=[],o=this.appUsersManager.fillContacts();o.cached||r.push(o.promise);const d=this.appMessagesManager.filtersStorage.reloadMissingPeerIds(i);if(d&&r.push(d),r.length)return a.cached=!1,a.promise=Promise.all(r).then((()=>this.getDialogs(e,t,s,i,n).promise)),a}const r=i>1||this.getOffsetDate(i)?Z:i;let o=this.getFolderDialogs(i,n);const d=this.getDialogIndexKey(i);if(e){if(!s||this.cachedResults.query!==e||this.cachedResults.folderId!==i){this.cachedResults.query=e,this.cachedResults.folderId=i;const t=this.dialogsIndex.search(e),s=[];for(const e in this.dialogs){const n=this.dialogs[e];t.has(n.peerId)&&n.folder_id===i&&s.push(n)}s.sort(((e,t)=>t[d]-e[d])),this.cachedResults.dialogs=s,this.cachedResults.count=s.length}o=this.cachedResults.dialogs}else this.cachedResults.query="";let l=0;if(t>0)for(let e=o.length;lo[l][d]);++l);const c=this.isDialogsLoaded(r),h=o.length>=l+s;if(e||c||h){const i=o.slice(l,l+s);return a.cached=!0,a.promise=Promise.resolve({dialogs:i,count:c?o.length:null,isTopEnd:o.length&&(i[0]&&i[0]===o[0]||o[0][d]=o.length}),a}return a.cached=!1,a.promise=this.appMessagesManager.getTopMessages(s,r).then((e=>{if(n&&(o=this.getFolderDialogs(i,n)),l=0,t>0)for(let e=o.length;lo[l][d]);++l);const a=o.slice(l,l+s);return{dialogs:a,count:void 0===e.count?o.length:e.count,isTopEnd:o.length&&(a[0]&&a[0]===o[0]||o[0][d]{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=1,e.order.forEach(((e,t)=>{const s=this.filters[e];delete s.orderIndex,this.setOrderIndex(s)})),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)},this.clear(!0),this.filters={},this.appStateManager.getState().then((e=>{(0,C.Z)(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}})),r.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=(0,k.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const s in t){const t=+s;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},updateDialogFilterOrder:this.onUpdateDialogFilterOrder})}clear(e=!1){e?(this.filters={},this.reloadedPeerIds=new Set):((0,C.Z)(this.filters,{}),this.reloadedPeerIds.clear()),this.orderIndex=1}testDialogForFilter(e,t){const s=e.peerId;if(!this.appMessagesManager.getDialogOnly(s))return!1;if(t.excludePeerIds.includes(s))return!1;if(t.includePeerIds.includes(s))return!0;const i=t.pFlags;if(i.exclude_archived&&1===e.folder_id)return!1;if(i.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(i.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(s)&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(s)){if(i.broadcasts&&this.appPeersManager.isBroadcast(s))return!0;if(i.groups&&this.appPeersManager.isAnyGroup(s))return!0}else{const e=s.toUserId();if(this.appUsersManager.isBot(e))return!!i.bots;if(i.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(i.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}toggleDialogPin(e,t){const s=this.filters[t],i=s.pinnedPeerIds.indexOf(e),n=-1!==i;if(n&&(s.pinned_peers.splice(i,1),s.pinnedPeerIds.splice(i,1)),!n){if(s.pinned_peers.length>=this.rootScope.config.pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});s.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),s.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(s)}createDialogFilter(e,t){const s=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,k.Z)(e)).id=s+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,s=!1){const i=t?0:1;return h.Z.invokeApi("messages.updateDialogFilter",{flags:i,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((i=>{if(i&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),s)){const t=[];for(const e in this.filters){const s=this.filters[e];++s.orderIndex,t.push(s)}e.orderIndex=1;const s=t.sort(((e,t)=>e.orderIndex-t.orderIndex)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:s})}return i}))}getOutputDialogFilter(e){const t=(0,k.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,P.Z)(e.includePeerIds,((t,s)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(s,1),e.includePeerIds.splice(s,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const s=[],i=this.getFilter(e),n=i&&i[t];if(null==n?void 0:n.length){const e=n.filter(((e,t)=>{const s=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(s)&&!this.appMessagesManager.getDialogOnly(s)}));if(e.length){const t=e.map((e=>{const t=this.appPeersManager.getPeerId(e),s=this.appMessagesManager.reloadConversation(e);return s.then((()=>{this.reloadedPeerIds.add(t)})),s})),i=Promise.all(t);s.push(i)}}return s.length?Promise.all(s):void 0}getDialogFilters(e=!1){return t=this,s=void 0,n=function*(){const t=Object.keys(this.filters);if(t.length&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.orderIndex-t.orderIndex));const s=yield h.Z.invokeApiSingle("messages.getDialogFilters");for(const t of s)this.saveDialogFilter(t,e);return s},new((i=void 0)||(i=Promise))((function(e,a){function r(e){try{d(n.next(e))}catch(e){a(e)}}function o(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(r,o)}d((n=n.apply(t,s||[])).next())}));var t,s,i,n}saveDialogFilter(e,t=!0){E.forEach((([t,s])=>{e[s]=e[t].map((e=>this.appPeersManager.getPeerId(e)))})),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const s=this.filters[e.id];s?Object.assign(s,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var D=s(5185),T=s(8138),F=s(1592),U=s(7309),x=s(6440),L=s(3714),R=s(7995),O=s(4687),N=s(5555),B=s(646),j=s(5667),G=s(8801),H=s(8209),z=s(410),q=s(9090),V=s(1431),W=s(5705),$=s(2614),K=s(8939),J=s(9256),Q=s(5228),Y=s(3624),X=s(8938),ee=s(9492),te=s(1174),se=s(5844),ie=s(2459),ne=s(6689),ae=s(677),re=s(7401),oe=s(6848),de=s(3738),le=s(8456);function ce(e,t){if(e.length{let o=e.slice(i,r);const d=n++;o.length>t&&(ce(o.slice(t),t).forEach((e=>{a[n++]=e})),o=o.slice(0,t)),i=r,s=0,a[d]=(a[d]||"")+o};let o=0;for(;;){let i=e.indexOf(" ",o);if(-1===i){o!==e.length-1&&r();break}i+=" ".length;const n=i-o;s+n>t&&r(s),o=i,s+=n}return a}var he=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const ue=new class{constructor(){this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new i.lh(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,c.kg)("MESSAGES",c.v9.Error|c.v9.Debug|c.v9.Log|c.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,f.default.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const s in t){const i=t[s];i?(this.dialogsStorage.pushDialog(i),x.Z.isChannel(s.toPeerId())||(e=Math.max(e,i.top_message||0))):(this.reloadConversation(s.toPeerId()),delete t[s])}0!==e&&this.incrementMaxSeenId(e),f.default.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{window.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId();if(f.default.peerId===t&&!f.default.idle.isIDLE)continue;const s=this.notificationsToHandle[t];this.getNotifyPeerSettings(t).then((({muted:e,peerTypeNotifySettings:t})=>{const i=s.topMessage;!e&&i.pFlags.unread&&i.pFlags.unread&&this.notifyAboutMessage(i,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,s=this.pendingByRandomId[t];if(s){const{peerId:i,tempId:n,threadId:a,storage:r}=s,o=ee.Z.generateMessageId(e.id),d=this.getMessageFromStorage(r,o);d.deleted?this.pendingByMessageId[o]=t:([this.getHistoryStorage(i),a?this.getHistoryStorage(i,a):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)})),this.finalizePendingMessageCallbacks(r,n,d))}},this.onUpdateNewMessage=e=>{var t;const s=e.message,i=this.getMessagePeer(s),n=this.getMessagesStorage(i),a=this.getDialogOnly(i),r="updateNewDiscussionMessage"===e._;this.saveMessages([s],{storage:new Map});const o=this.getThreadKey(s),d=o?+o.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[i]&&this.threadsStorage[i][d]){const e={_:"updateNewDiscussionMessage",message:s};this.onUpdateNewMessage(e)}if(!a&&!r){let s=!0;if(i.isAnyChat()&&(s=T.Z.isInChat(i.toChatId())),s){const s=null!==(t=this.newUpdatesAfterReloadToHandle[i])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[i]=new Set;if(s.has(e))return void this.log.error("here we go again",i);e.ignoreExisting=!0,s.add(e),this.scheduleHandleNewDialogs(i)}return}this.saveMessages([s],{storage:n});const l=this.checkPendingMessage(s),c=this.getHistoryStorage(i,r?d:void 0);r||this.updateMessageRepliesIfNeeded(s);const h=e.ignoreExisting;if(c.history.findSlice(s.mid)){if(!h)return!1}else{const e=c.history.first;if(e.isEnd(v.D.Bottom)){let t=0;for(const i=e.length;te[t]);++t);e.splice(t,0,s.mid)}else c.history.unshift(s.mid);null!==c.count&&c.count++}this.mergeReplyKeyboard(c,s)&&f.default.dispatchEvent("history_reply_markup",{peerId:i});const u=s.fromId;if(u.isUser()&&!s.pFlags.out&&s.from_id){N.Z.forceUserOnline(u,s.date);const e={_:"sendMessageCancelAction"};let t;t=i.isUser()?{_:"updateUserTyping",action:e,user_id:u}:x.Z.isChannel(i)?{_:"updateChannelUserTyping",action:e,channel_id:i.toChatId(),from_id:x.Z.getOutputPeer(u),top_msg_id:d?ee.Z.getServerMessageId(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:i.toChatId(),from_id:x.Z.getOutputPeer(u)},D.Z.processLocalUpdate(t)}if(l||this.handleNewMessage(i,s.mid),r)return;const p=!s.pFlags.out&&s.pFlags.unread;if(a){if(p&&s.mid>a.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(a);++a.unread_count,s.pFlags.mentioned&&(++a.unread_mentions_count,this.modifyCachedMentions(i,s.mid,!0)),e()}s.mid>=a.top_message&&this.setDialogTopMessage(s,a)}if(p){const e=i;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:_.NM}),t.fromId!==u&&(t.fromId=u,t.fwdCount=0),s.fwd_from&&++t.fwdCount,t.topMessage=s,this.notificationsHandlePromise||(this.notificationsHandlePromise=window.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{var t,s,i;const{peer:n,msg_id:a,reactions:r}=e,o=ee.Z.generateMessageId(a),d=x.Z.getPeerId(n),l=this.getMessageByPeer(d,o);if("message"!==l._)return;const c=null==r?void 0:r.recent_reactions;if((null==c?void 0:c.length)&&l.pFlags.out){const e=c[c.length-1],t=l.reactions,s=null==t?void 0:t.recent_reactions;x.Z.getPeerId(e.peer_id)===f.default.myId||s&&!(s.length<=c.length)||s&&(0,oe.Z)(e,s[s.length-1])||this.getNotifyPeerSettings(d).then((({muted:t,peerTypeNotifySettings:s})=>{!t&&s.show_previews&&this.notifyAboutMessage(l,{userReaction:e,peerTypeNotifySettings:s})}))}const h=null!==(t=null==r?void 0:r.results)&&void 0!==t?t:[],u=null!==(i=null===(s=l.reactions)||void 0===s?void 0:s.results)&&void 0!==i?i:[],p=h.filter((e=>{const t=u.find((t=>t.reaction===e.reaction));return l.pFlags.out&&(!t||e.count>t.count)||e.pFlags.chosen&&(!t||!t.pFlags.chosen)}));l.reactions=r,f.default.dispatchEvent("message_reactions",{message:l,changedResults:p}),e.local||this.setDialogToStateIfMessageIsTop(l)},this.onUpdateDialogUnreadMark=e=>{const t=x.Z.getPeerId(e.peer.peer),s=this.getDialogOnly(t);if(s){const i=this.dialogsStorage.prepareDialogUnreadCountModifying(s);e.pFlags.unread?s.pFlags.unread_mark=!0:delete s.pFlags.unread_mark,i(),f.default.dispatchEvent("dialogs_multiupdate",{[t]:s}),this.dialogsStorage.setDialogToState(s)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=ee.Z.generateMessageId(t.id),n=this.getMessagesStorage(s);if(!n.has(i))return;const a=this.getMessageFromStorage(n,i);this.saveMessages([t],{storage:n});const r=this.getMessageFromStorage(n,i);this.handleEditedMessage(a,r);const o=this.getDialogOnly(s),d=o&&o.top_message===i;if(t.clear_history)d&&f.default.dispatchEvent("dialog_flush",{peerId:s});else{if("message"===(null==a?void 0:a._)&&!(0,oe.Z)(a.reactions,r.reactions)){const e=r.reactions;return r.reactions=a.reactions,void D.Z.processLocalUpdate({_:"updateMessageReactions",peer:x.Z.getOutputPeer(s),msg_id:t.id,reactions:e})}if(f.default.dispatchEvent("message_edit",{storage:n,peerId:s,mid:i}),d||t.grouped_id){const e={};e[s]=o,f.default.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}}},this.onUpdateReadHistory=e=>{const t=e.channel_id,s=ee.Z.generateMessageId(e.max_id||e.read_max_id),i=ee.Z.generateMessageId(e.top_msg_id),n=t?t.toPeerId(!0):x.Z.getPeerId(e.peer),a="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getMessagesStorage(n),o=(0,re.Z)(r,"desc"),d=this.getDialogOnly(n),l=e.still_unread_count;let c=0,h=0,u=!1;const p=this.getHistoryStorage(n,i);if(n.isUser()&&a&&N.Z.forceUserOnline(n),i){const e=this.threadsToReplies[n+"_"+i];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}const g=!i&&d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);for(let e=0,t=o.length;es)continue;const p=r.get(t);if(p.pFlags.out===a){if(!p.pFlags.unread)break;if(i){const e=p.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==i)continue}p.pFlags.unread&&(delete p.pFlags.unread,u||(u=!0),p.pFlags.out||i||!d||(void 0===l&&(c=--d.unread_count),p.pFlags.mentioned&&(h=--d.unread_mentions_count,this.modifyCachedMentions(n,p.mid,!1))),q.Z.cancel("msg"+t))}}if(a?p.readOutboxMaxId=s:p.readMaxId=s,!i&&d){if(a?d.read_outbox_max_id=s:d.read_inbox_max_id=s,!a){let e;void 0!==l?e=l:c<0||!this.getReadMaxIdIfUnread(n)?e=0:c&&d.top_message>s&&(e=c),void 0!==e&&(d.unread_count=e),(h<0||!d.unread_count)&&(d.unread_mentions_count=0)}g&&g(),this.dialogsStorage.processDialogForFilters(d),f.default.dispatchEvent("dialog_unread",{peerId:n}),this.dialogsStorage.setDialogToState(d)}if(u&&f.default.dispatchEvent("messages_read"),!i&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,s]=this.threadsToReplies[t].split("_");f.default.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+s))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,s=e.messages.map((e=>ee.Z.generateMessageId(e))),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;for(let e=0,t=s.length;e{const t=e.channel_id.toPeerId(!0),s=this.getHistoryStorage(t).history.slice,i=ee.Z.generateMessageId(e.available_min_id),n=s.filter((e=>e<=i));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,s=e.messages.map((e=>ee.Z.generateMessageId(e))),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;if(!i)return;h.Z.clearCache("messages.getSearchCounters",(e=>x.Z.getPeerId(e.peer)===i));const n=new Set;for(const e of s){const t=this.getMessageByPeer(i,e),s=this.getThreadKey(t);s&&this.threadsStorage[i]&&this.threadsStorage[i][+s.split("_")[1]]&&n.add(s)}const a=this.handleDeletedMessages(i,this.getMessagesStorage(i),s),r=Array.from(n).map((e=>{const[t,s]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+s)})),o=this.getHistoryStorage(i);[o].concat(r).forEach((e=>{for(const t of a.msgs)e.history.delete(t);a.count&&e.count&&(e.count=Math.max(0,e.count-a.count))})),f.default.dispatchEvent("history_delete",{peerId:i,msgs:a.msgs});const d=this.getDialogOnly(i);if(d){const e=a.unreadMentions||a.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);if(a.unread&&(d.unread_count=Math.max(0,d.unread_count-a.unread)),a.unreadMentions&&(d.unread_mentions_count=d.unread_count?Math.max(0,d.unread_mentions_count-a.unreadMentions):0),e&&(t(),f.default.dispatchEvent("dialog_unread",{peerId:i})),a.msgs.has(d.top_message)){const e=o.history.first;if(e.isEnd(v.D.Bottom)&&e.length){const t=e[0],s=this.getMessageByPeer(i,t);this.setDialogTopMessage(s,d)}else this.reloadConversation(i)}}},this.onUpdateChannel=e=>{const t=e.channel_id,s=t.toPeerId(!0),i=T.Z.getChat(t),n=T.Z.isInChat(t);(!!i.username||!i.pFlags.left)!=(void 0!==this.historiesStorage[s])&&(delete this.historiesStorage[s],f.default.dispatchEvent("history_forbidden",s)),!!this.getDialogOnly(s)!==n&&(n?this.reloadConversation(s):this.dialogsStorage.dropDialogOnDeletion(s)),f.default.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then((()=>{f.default.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{const t=e.views,s=e.channel_id.toPeerId(!0),i=ee.Z.generateMessageId(e.id),n=this.getMessageByPeer(s,i);!n.deleted&&void 0!==n.views&&n.views{const t=_.yF,s=t,i=this.generateTempMessageId(s),n={_:"message",id:i,from_id:x.Z.getOutputPeer(t),peer_id:x.Z.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,r.bz)(!0))+p.Z.serverTimeOffset,message:e.message,media:e.media,entities:e.entities};N.Z.hasUser(t)||N.Z.saveApiUsers([{_:"user",id:t,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([n],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=i,this.onUpdateNewMessage({_:"updateNewMessage",message:n,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,s=t?t.toPeerId(!0):x.Z.getPeerId(e.peer),i=e.messages.map((e=>ee.Z.generateMessageId(e))),n=this.getMessagesStorage(s),a=i.filter((e=>!n.has(e)));(a.length?Promise.all(a.map((e=>this.wrapSingleMessage(s,e)))):Promise.resolve()).finally((()=>{var t;const a=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(a)for(const e of i)n.get(e).pFlags.pinned=!0;else for(const e of i)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[s],O.default.getState().then((e=>{delete e.hiddenPinnedMessages[s],f.default.dispatchEvent("peer_pinned_messages",{peerId:s,mids:i,pinned:a})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:s}=e;if("notifyPeer"===t._){const e=x.Z.getPeerId(t.peer),i=this.getDialogOnly(e);i&&(i.notify_settings=s,f.default.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=this.scheduledMessagesStorage[s];if(i){const e=ee.Z.generateMessageId(t.id),n=this.getMessageFromStorage(i,e);this.saveMessages([t],{storage:i,isScheduled:!0});const a=this.getMessageFromStorage(i,e);n.deleted?this.checkPendingMessage(t)||f.default.dispatchEvent("scheduled_new",{peerId:s,mid:t.mid}):(this.handleEditedMessage(n,a),f.default.dispatchEvent("message_edit",{storage:i,peerId:s,mid:t.mid}))}},this.onUpdateDeleteScheduledMessages=e=>{const t=x.Z.getPeerId(e.peer),s=this.scheduledMessagesStorage[t];if(s){const i=e.messages.map((e=>ee.Z.generateMessageId(e)));this.handleDeletedMessages(t,s,i),f.default.dispatchEvent("scheduled_delete",{peerId:t,mids:i})}},this.clear(),f.default.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages}),f.default.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let s;s="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>e.peerId.isBroadcast():e=>x.Z.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(s).forEach((e=>{f.default.dispatchEvent("dialog_notify_settings",e)}))})),f.default.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:s,isScheduled:i})=>{const n=i?this.getScheduledMessagesStorage(t):this.getMessagesStorage(t),a=this.getMessageFromStorage(n,s);a&&(a.media={_:"messageMediaWebPage",webpage:B.Z.getWebPage(e)},f.default.dispatchEvent("message_edit",{storage:n,peerId:t,mid:s}))}))})),f.default.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:s})=>{if(t)return;const i=this.getDialogOnly(e);if(i){if(!t){i.draft=s;let t=!1;s||ee.Z.getServerMessageId(i.top_message)?(this.dialogsStorage.generateIndexForDialog(i),this.dialogsStorage.pushDialog(i)):(this.dialogsStorage.dropDialog(e),t=!0),f.default.dispatchEvent("dialog_draft",{peerId:e,dialog:i,drop:t,draft:s,index:i.index})}}else this.reloadConversation(e)})),f.default.addEventListener("poll_update",(({poll:e})=>{const t=R.Z.pollToMessages[e.id];if(t)for(const e of t){const[t,s]=e.split("_"),i=this.getMessageByPeer(t.toPeerId(),+s);this.setDialogToStateIfMessageIsTop(i)}})),O.default.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}clear(){this.middleware?this.middleware.clean():this.middleware=(0,Y.k)(),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(),this.filtersStorage&&this.filtersStorage.clear()}construct(){this.filtersStorage=new A(this,x.Z,N.Z,q.Z,O.default,D.Z,f.default),this.dialogsStorage=new b(this,T.Z,x.Z,N.Z,j.Z,q.Z,O.default,D.Z,p.Z,ee.Z)}getInputEntities(e){const t=(0,k.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=N.Z.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,s){var i,n;const r=null!==(i=this.tempFinalizeCallbacks[e])&&void 0!==i?i:this.tempFinalizeCallbacks[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,a.b)()};return o.callback=s,o.deferred}editMessage(e,t,s={}){const{mid:i,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(i,"edit",(e=>this.editMessage(e,t,s)));let a=s.entities||[];t&&(t=g.o.parseMarkdown(t,a));const r=s.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return h.Z.invokeApi("messages.editMessage",{peer:x.Z.getInputPeerById(n),id:e.id,message:t,media:s.newMedia,entities:a.length?this.getInputEntities(a):void 0,no_webpage:s.noWebPage,schedule_date:r}).then((e=>{D.Z.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,s={}){if(!t.trim())return Promise.resolve();s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId);const i=f.default.config.message_length_max;if(t.length>i){const n=ce(t,i);t=n[0],n.length>1&&delete s.webPage;for(let t=1;t{this.sendText(e,n[t],s)}),t)}e=x.Z.getPeerMigratedTo(e)||e;let n=s.entities||[];s.viaBotId||(t=g.o.parseMarkdown(t,n));let a=this.getInputEntities(n);a.length||(a=void 0);const r=this.generateOutgoingMessage(e,s);r.entities=n,r.message=t;const o=s.replyToMsgId?ee.Z.getServerMessageId(s.replyToMsgId):void 0,d=x.Z.isChannel(e);s.webPage&&(r.media={_:"messageMediaWebPage",webpage:s.webPage});const l=e=>{e?r.error=!0:delete r.error,f.default.dispatchEvent("messages_pending")};return r.send=()=>{l(!1);const i={};this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=s.sendAsPeerId?x.Z.getInputPeerById(s.sendAsPeerId):void 0;let c;return c=s.viaBotId?h.Z.invokeApiAfter("messages.sendInlineBotResult",{peer:x.Z.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,send_as:n},i):h.Z.invokeApiAfter("messages.sendMessage",{no_webpage:s.noWebPage,peer:x.Z.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:a,clear_draft:s.clearDraft,schedule_date:s.scheduleDate||void 0,silent:s.silent,send_as:n},i),this.pendingAfterMsgs[e]=i,c.then((e=>{if("updateShortSentMessage"===e._){const t=r.promise;delete r.promise;const i=(0,k.Z)(r);r.promise=t,i.date=e.date,i.id=e.id,i.media=e.media,i.entities=e.entities,this.wrapMessageEntities(i),e.pFlags.out&&(i.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:i.id},{_:s.scheduleDate?"updateNewScheduledMessage":d?"updateNewChannelMessage":"updateNewMessage",message:i,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));D.Z.processUpdateMessage(e),r.promise.resolve()}),(e=>{l(!0),r.promise.reject(e)})).finally((()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(r,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),r.promise}sendFile(e,t,s={}){e=x.Z.getPeerMigratedTo(e)||e;const i=this.generateOutgoingMessage(e,s),r=s.replyToMsgId?ee.Z.getServerMessageId(s.replyToMsgId):void 0;let d,l;const c="mime_type"in t?t.mime_type:t.type,u=t instanceof File?t.name:"",p=!(t instanceof File||t instanceof Blob);let m=s.caption||"";this.log("sendFile",t,c);const v=s.entities||[];m&&(m=g.o.parseMarkdown(m,v));const _=[],y=te.Z.has(c);let I,P,S;if(p)d="document",l="";else if(0===c.indexOf("audio/")||["video/ogg"].indexOf(c)>=0){d="audio",l="audio."+("ogg"===c.split("/")[1]?"ogg":"mp3"),S="sendMessageUploadAudioAction",s.isVoiceMessage&&(d="voice",i.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:s.isVoiceMessage},waveform:s.waveform,duration:s.duration||0};_.push(e)}else if(s.isMedia)if(y){d="photo",l="photo."+c.split("/")[1],S="sendMessageUploadPhotoAction";const e={_:"photoSize",w:s.width,h:s.height,type:"full",location:null,size:t.size};I={_:"photo",id:""+i.id,sizes:[e],w:s.width,h:s.height};const n=U.Z.getCacheContext(I,e.type);n.downloaded=t.size,n.url=s.objectURL||"",I=L.Z.savePhoto(I)}else if(se.Z.has(c)){d="video",l="video.mp4",S="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:s.isRoundMessage,supports_streaming:!0},duration:s.duration,w:s.width,h:s.height};_.push(e),s.noSound&&t.size>10240&&t.size<10485760&&_.push({_:"documentAttributeAnimated"})}else d="document",l="document."+c.split("/")[1],S="sendMessageUploadDocumentAction";else d="document",l="document."+c.split("/")[1],S="sendMessageUploadDocumentAction";if(_.push({_:"documentAttributeFilename",file_name:u||l}),-1!==["document","video","audio","voice"].indexOf(d)&&!p){const e=[];P={_:"document",id:""+i.id,duration:s.duration,attributes:_,w:s.width,h:s.height,thumbs:e,mime_type:c,size:t.size};const n=U.Z.getCacheContext(P);let a;if(n.downloaded=t.size,n.url=s.objectURL||"",y)_.push({_:"documentAttributeImageSize",w:s.width,h:s.height}),a={_:"photoSize",w:s.width,h:s.height,type:"full",size:t.size};else if("video"===d&&s.thumb){a={_:"photoSize",w:s.thumb.size.width,h:s.thumb.size.height,type:"local-thumb",size:s.thumb.blob.size};const e=U.Z.getCacheContext(P,a.type);e.downloaded=a.size,e.url=s.thumb.url}a&&e.push(a),P=F.Z.saveDoc(P)}this.log("sendFile",d,l,t.type,s);const M=p?void 0:new n.Z({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),w=(0,a.b)();M&&(M.attachPromise(w),w.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",w.reject(e)},w.catch((t=>{"AbortError"!==t.name||b||(this.log("cancelling upload",C),this.cancelPendingMessage(i.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),(null==k?void 0:k.cancel)&&k.cancel())})));const C=p?void 0:{_:I?"messageMediaPhoto":"messageMediaDocument",pFlags:{},preloader:M,photo:I,document:P,promise:w};i.entities=v,i.message=m,i.media=p?{_:"messageMediaDocument",pFlags:{},document:t}:C;const Z=e=>{e?i.error=!0:delete i.error,f.default.dispatchEvent("messages_pending")};let b=!1,k=null;return i.send=()=>{if(p){const{id:e,access_hash:s,file_reference:i}=t,n={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:s,file_reference:i}};w.resolve(n)}else if(t instanceof File||t instanceof Blob){const n=()=>{let n;return b&&!i.error||(b=!1,k=U.Z.upload(t),w.notifyAll({done:0,total:t.size})),"video"===d&&s.objectURL&&(n=new Promise(((e,t)=>{(s.thumb&&s.thumb.blob?Promise.resolve(s.thumb):(0,o.ud)(s.objectURL)).then((s=>{s?U.Z.upload(s.blob).then(e,t):e(null)}),t)}))),k&&k.then((e=>he(this,void 0,void 0,(function*(){let t;if(delete i.media.preloader,e.name=l,b=!0,t="photo"===d?{_:"inputMediaUploadedPhoto",file:e}:{_:"inputMediaUploadedDocument",file:e,mime_type:c,pFlags:{force_file:"sendMessageUploadDocumentAction"===S||void 0},attributes:_},n)try{const e=yield n;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}w.resolve(t)}))),(()=>{Z(!0)})),k.addNotifyListener((t=>{const s=Math.max(1,Math.floor(100*t.done/t.total));S&&this.setTyping(e,{_:S,progress:0|s}),w.notifyAll(t)})),w};s.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return w},this.beforeMessageSending(i,{isGroupedItem:s.isGroupedItem,isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),s.isGroupedItem||(w.then((t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),h.Z.invokeApi("messages.sendMedia",{background:s.background,peer:x.Z.getInputPeerById(e),media:t,message:m,random_id:i.random_id,reply_to_msg_id:r,schedule_date:s.scheduleDate,silent:s.silent,entities:v,clear_draft:s.clearDraft,send_as:s.sendAsPeerId?x.Z.getInputPeerById(s.sendAsPeerId):void 0}).then((e=>{D.Z.processUpdateMessage(e)}),(e=>{if("photo"===d&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,d="document",void i.send();throw Z(!0),e}))))),w.then(i.promise.resolve,i.promise.reject)),{message:i,promise:w}}sendAlbum(e,t,s={}){return he(this,void 0,void 0,(function*(){if(s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},s),s.sendFileDetails[0]));e=x.Z.getPeerMigratedTo(e)||e;const i=s.replyToMsgId?ee.Z.getServerMessageId(s.replyToMsgId):void 0;let n=s.caption||"",r=s.entities||[];n&&(n=g.o.parseMarkdown(n,r)),this.log("sendAlbum",t,s);const o=""+ ++this.groupedTempId,d=t.map(((t,a)=>{const d=s.sendFileDetails[a],l=Object.assign({isGroupedItem:!0,isMedia:s.isMedia,scheduleDate:s.scheduleDate,silent:s.silent,replyToMsgId:i,threadId:s.threadId,sendAsPeerId:s.sendAsPeerId,groupId:o},d);return 0===a&&(l.caption=n,l.entities=r),this.sendFile(e,t,l).message}));s.clearDraft&&setTimeout((()=>{j.Z.clearDraft(e,s.threadId)}),0);const l=(e,t)=>{t?e.error=!0:delete e.error,f.default.dispatchEvent("messages_pending")},c=x.Z.getInputPeerById(e),u=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const n=(0,a.b)();return this.sendSmthLazyLoadQueue.push({load:()=>h.Z.invokeApi("messages.sendMultiMedia",{peer:c,multi_media:t,reply_to_msg_id:i,schedule_date:s.scheduleDate,silent:s.silent,clear_draft:s.clearDraft,send_as:s.sendAsPeerId?x.Z.getInputPeerById(s.sendAsPeerId):void 0}).then((e=>{D.Z.processUpdateMessage(e),n.resolve()}),(e=>{d.forEach((e=>l(e,!0))),n.reject(e)}))}),n},p=d.map((e=>e.send().then((e=>h.Z.invokeApi("messages.uploadMedia",{peer:c,media:e}))).then((t=>{let s;if("messageMediaPhoto"===t._){const e=L.Z.savePhoto(t.photo);s=L.Z.getMediaInput(e)}else if("messageMediaDocument"===t._){const e=F.Z.saveDoc(t.document);s=F.Z.getMediaInput(e)}const i={_:"inputSingleMedia",media:s,random_id:e.random_id,message:n,entities:r};return n&&(n="",r=[]),i})).catch((t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),l(e,!0),t}))));return Promise.all(p).then((e=>u(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,N.Z.getContactMediaInput(t))}sendOther(e,t,s={}){var i;e=x.Z.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,s),a=s.replyToMsgId?ee.Z.getServerMessageId(s.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,R.Z.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:s,results:i}=R.Z.getPoll(e);r={_:"messageMediaPoll",poll:s,results:i};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:L.Z.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:F.Z.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(i=t.user_id)&&void 0!==i?i:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:s.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:s.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}return n.media=r,n.send=()=>{const i={};this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=s.sendAsPeerId?x.Z.getInputPeerById(s.sendAsPeerId):void 0;let o;return o=s.viaBotId?h.Z.invokeApiAfter("messages.sendInlineBotResult",{peer:x.Z.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:a||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent,send_as:r},i):h.Z.invokeApiAfter("messages.sendMedia",{peer:x.Z.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:a||void 0,message:"",clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent,send_as:r},i),this.pendingAfterMsgs[e]=i,o.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),D.Z.processUpdateMessage(e)}),(e=>{f.default.dispatchEvent("messages_pending")})).finally((()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),n.promise}beforeMessageSending(e,t={}){const s=e.id,i=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(i):this.getMessagesStorage(i);if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),setTimeout((()=>{f.default.dispatchEvent("scheduled_new",{peerId:i,mid:s})}),0);else{const a=[this.getHistoryStorage(i),t.threadId?this.getHistoryStorage(i,t.threadId):void 0];for(const e of a)e&&e.history.unshift(s);this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout((()=>{f.default.dispatchEvent("history_append",{storage:n,peerId:i,mid:s})}),0)}this.pendingByRandomId[e.random_id]={peerId:i,tempId:s,threadId:t.threadId,storage:n},!t.isGroupedItem&&e.send&&setTimeout((()=>{t.clearDraft&&j.Z.clearDraft(i,t.threadId),e.send()}),0)}generateOutgoingMessage(e,t){let s;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const i=x.Z.isBroadcast(e);if(i&&x.Z.getPeer(e).pFlags.signatures){const e=N.Z.getSelf();s=e.first_name+(e.last_name?" "+e.last_name:"")}return{_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?x.Z.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:x.Z.getOutputPeer(e),post_author:s,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,r.bz)(!0)+p.Z.serverTimeOffset,message:"",grouped_id:t.groupId,random_id:(0,d.a)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:i&&1,pending:!0,promise:void 0===t.groupId?(0,a.b)():void 0}}generateReplyHeader(e,t){const s={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&s.reply_to_msg_id!==t&&(s.reply_to_top_id=t),s}generateReplies(e){let t;if(x.Z.isBroadcast(e)){const s=H.default.getCachedFullChat(e.toChatId());(null==s?void 0:s.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:s.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return e.isAnyChat()&&(e.isBroadcast()||this.isAnonymousSending(e))?void 0:x.Z.getOutputPeer(N.Z.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==N.Z.getSelf().id&&(t.out=!0,x.Z.isChannel(e)||N.Z.isBot(e)||(t.unread=!0)),x.Z.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const s=N.Z.getSelf().id.toPeerId(),i=t.fromId;if(i===s&&t.peerId===s&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let a=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,i.isUser()){const e=H.default.getCachedFullUser(i.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,a=!0)}a||(n.from_id=x.Z.getOutputPeer(i))}return x.Z.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==s||a||(n.saved_from_msg_id=t.id,n.saved_from_peer=x.Z.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const s=Number.MAX_SAFE_INTEGER,i={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:s,peer_id:x.Z.getOutputPeer(e),mid:s,peerId:e,date:t.date,fromId:e};return this.getMessagesStorage(e).set(s,i),i}isAnonymousSending(e){var t,s;return e.isAnyChat()&&(null===(s=null===(t=x.Z.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:s,tempId:i,storage:n}=t,a=this.getHistoryStorage(s);return D.Z.processLocalUpdate({_:"updateDeleteMessages",messages:[i],pts:void 0,pts_count:void 0}),a.history.delete(i),delete this.pendingByRandomId[e],n.delete(i),!0}return!1}fillConversations(){return he(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(Z);){const t=yield this.getTopMessages(100,Z);if(!e()||t.isEnd)break}}))}getConversations(e="",t,s,i=0,n){return this.dialogsStorage.getDialogs(e,t,s,i,n)}getReadMaxIdIfUnread(e,t){var s;const i=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),n=Math.max(null!==(s=t.readMaxId)&&void 0!==s?s:0,i.readMaxId);return!this.getMessageByPeer(e,i.maxId).pFlags.out&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;z.ZP&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),s||t===Z||this.dialogsStorage.resetPinnedOrder(t),s||Q.default.setAuthorized(!0),N.Z.saveApiUsers(r.users),T.Z.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!s,d=!1;const l={},c=t===Z?0:t,h=t===Z;(0,P.Z)(r.dialogs,(e=>{void 0===e.folder_id&&(e.folder_id=c),this.dialogsStorage.saveDialog(e,void 0,!0,h),o||x.Z.isChannel(e.peerId||x.Z.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(i&&e.index>i&&(this.scheduleHandleNewDialogs(e.peerId,e),d=!0),ee.Z.getServerMessageId(e.read_inbox_max_id)||ee.Z.getServerMessageId(e.read_outbox_max_id)||(l[e.peerId]=e,this.log.error("noIdsDialogs",e,a)))}));const u=Object.keys(l);if(u.length){const e=u.map((e=>e.toPeerId())),t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{f.default.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=p||!r.dialogs.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),d?this.scheduleHandleNewDialogs():f.default.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,y=100===e?_:_.slice(0,e);return{isEnd:v&&y[y.length-1]===_[_.length-1],count:p,dialogs:y}}))}forwardMessages(e,t,s,i={}){e=x.Z.getPeerMigratedTo(e)||e;for(let n=0,a=(s=s.slice().sort(((e,t)=>e-t))).length;n{var a,r,o;const d=this.getMessageByPeer(t,s),l=this.generateOutgoingMessage(e,i),c=["entities","media"];i.dropAuthor||(l.fwd_from=this.generateForwardHeader(e,d),c.push("views","forwards"),(null===(a=l.fwd_from)||void 0===a?void 0:a.from_name)&&e===f.default.myId&&delete l.from_id),i.dropCaptions&&d.media||c.push("message"),c.forEach((e=>{l[e]=d[e]}));const h=null===(r=l.media)||void 0===r?void 0:r.document;return h&&["round","voice"].includes(h.type)&&(l.pFlags.media_unread=!0),d.grouped_id&&(null!==(o=n[d.grouped_id])&&void 0!==o?o:n[d.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(l),l}));for(const e in n){const t=n[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}a.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!i.scheduleDate||void 0})}));const r={};this.pendingAfterMsgs[e]&&(r.afterMessageId=this.pendingAfterMsgs[e].messageId);const o=h.Z.invokeApiAfter("messages.forwardMessages",{from_peer:x.Z.getInputPeerById(t),id:s.map((e=>ee.Z.getServerMessageId(e))),random_id:a.map((e=>e.random_id)),to_peer:x.Z.getInputPeerById(e),with_my_score:i.withMyScore,silent:i.silent,schedule_date:i.scheduleDate,drop_author:i.dropAuthor,drop_media_captions:i.dropCaptions,send_as:i.sendAsPeerId?x.Z.getInputPeerById(i.sendAsPeerId):void 0},r).then((e=>{this.log("forwardMessages updates:",e),D.Z.processUpdateMessage(e)})).finally((()=>{this.pendingAfterMsgs[e]===r&&delete this.pendingAfterMsgs[e]}));return this.pendingAfterMsgs[e]=r,o}generateEmptyMessage(e){return{_:"messageEmpty",id:ee.Z.getServerMessageId(e),mid:e,deleted:!0,pFlags:{}}}getMessageFromStorage(e,t){return e&&e.get(t)||this.generateEmptyMessage(t)}createMessageStorage(){return new Map}getMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage()}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(x.Z.isChannel(t.toPeerId()))continue;const s=this.messagesStorageByPeerId[t].get(e);if(s)return s}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&x.Z.getPeerId(e.peer_id)||_.NM}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}reloadConversation(e){let t;if(void 0!==e){const s=x.Z.getPeerId(e);let i=this.reloadConversationsPeers.get(s);if(i&&(t=i.promise),t)return t;t=(0,a.b)(),this.reloadConversationsPeers.set(s,i={inputDialogPeer:x.Z.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise(((e,t)=>{setTimeout((()=>{const s=[],i={};for(const[e,{inputDialogPeer:t,promise:n}]of this.reloadConversationsPeers)s.push(t),i[e]=n;this.reloadConversationsPeers.clear();const n=()=>{for(const e in i)i[e].resolve(void 0)};h.Z.invokeApi("messages.getPeerDialogs",{peers:s}).then((t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach((e=>{const t=e.peerId;t&&(i[t].resolve(e),delete i[t])})),n(),e()}),(e=>{n(),t(e)})).finally((()=>{this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}),0)}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,s){return h.Z.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:s,peer:e,max_id:0}).then((i=>(D.Z.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:i.pts,pts_count:i.pts_count}}),!i.offset||this.doFlushHistory(e,t,s))))}flushHistory(e,t,s){return he(this,void 0,void 0,(function*(){if(x.Z.isChannel(e)){const t=this.getHistory(e,0,1),s=t instanceof Promise?yield t:t,i=e.toChatId(),n=s.history[0]||0;return h.Z.invokeApiSingle("channels.deleteHistory",{channel:T.Z.getChannelInput(i),max_id:ee.Z.getServerMessageId(n)}).then((e=>(e&&D.Z.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:i,available_min_id:n}),e)))}return this.doFlushHistory(x.Z.getInputPeerById(e),t,s).then((()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));const s=this.needSingleMessages.get(e);if(s&&s.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const s=t[e];s&&s.clear()})),t)f.default.dispatchEvent("dialog_flush",{peerId:e});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}}))}))}onPeerDeleted(e){}hidePinnedMessages(e){return Promise.all([O.default.getState(),this.getPinnedMessage(e)]).then((([t,s])=>{t.hiddenPinnedMessages[e]=s.maxId,f.default.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:s.maxId})}))}getPinnedMessage(e){var t;const s=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return s.promise?s.promise:s.maxId?Promise.resolve(s):s.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then((e=>{var t;return s.count=e.count,s.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,s})).finally((()=>{delete s.promise}))}updatePinnedMessage(e,t,s,i,n){return h.Z.invokeApi("messages.updatePinnedMessage",{peer:x.Z.getInputPeerById(e),unpin:s,silent:i,pm_oneside:n,id:ee.Z.getServerMessageId(t)}).then((e=>{D.Z.processUpdateMessage(e)}))}unpinAllMessages(e){return h.Z.invokeApiSingle("messages.unpinAllMessages",{peer:x.Z.getInputPeerById(e)}).then((t=>(D.Z.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),f.default.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];let s,i,n,a=0;for(const[e,r]of t)if(r.message){if(++a>1)break;s=r.message,i=r.totalEntities,n=r.entities}return a>1&&(s=void 0,i=void 0,n=void 0),{message:s,entities:n,totalEntities:i}}getGroupsFirstMessage(e){if(!e.grouped_id)return e;const t=this.groupedMessagesStorage[e.grouped_id];let s=Number.MAX_SAFE_INTEGER;for(const[e,i]of t)i.midc[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=ee.Z.generateMessageId(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=ee.Z.generateMessageId(e.reply_to.reply_to_top_id))),d&&e.replies&&(e.replies.max_id&&(e.replies.max_id=ee.Z.generateMessageId(e.replies.max_id)),e.replies.read_max_id&&(e.replies.read_max_id=ee.Z.generateMessageId(e.replies.read_max_id)));const h=!!n;h||(e.date-=p.Z.serverTimeOffset);const u=N.Z.getSelf().id.toPeerId(),g=d&&e.fwd_from;if(e.peerId=n,e.fromId=n===u?g?g.from_id?x.Z.getPeerId(g.from_id):_.NM:u:e.pFlags.post||!e.from_id?n:x.Z.getPeerId(e.from_id),g){g.saved_from_msg_id&&(g.saved_from_msg_id=ee.Z.generateMessageId(g.saved_from_msg_id)),g.channel_post&&(g.channel_post=ee.Z.generateMessageId(g.channel_post));const t=g.saved_from_peer||g.from_id,s=g.saved_from_msg_id||g.channel_post;if(t&&s){const i=x.Z.getPeerId(t),n=ee.Z.generateMessageId(s);e.savedFrom=i+"_"+n}e.fwdFromId=x.Z.getPeerId(g.from_id),h||(g.date-=p.Z.serverTimeOffset)}const f={type:"message",peerId:n,messageId:l};if(d&&e.media){let s=!1;switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?s=!0:e.media.photo=L.Z.savePhoto(e.media.photo,f),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=R.Z.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":if(e.media.ttl_seconds)s=!0;else{const t=e.media.document;e.media.document=F.Z.saveDoc(t,f),e.media.document||"documentEmpty"===t._||(s=!0)}break;case"messageMediaWebPage":{const s=B.Z.getMessageKeyForPendingWebPage(n,l,t.isScheduled);e.media.webpage=B.Z.saveWebPage(e.media.webpage,s,f);break}case"messageMediaInvoice":s=!0,e.media={_:"messageMediaUnsupported"};break;case"messageMediaUnsupported":s=!0}s&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities)}if(!d&&e.action){const t=e.action;let s,a;const d=e.fromId===N.Z.getSelf().id?"You":"";switch(t.photo&&(t.photo=L.Z.savePhoto(t.photo,f)),t.document&&(t.document=F.Z.saveDoc(t.photo,f)),t._){case"messageActionChatEditPhoto":(null===(i=t.photo)||void 0===i?void 0:i.video_sizes)?t._=o?"messageActionChannelEditVideo":"messageActionChatEditVideo":o&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;ie.Z.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",o||(e+="_by"+d),t.type=e;break}case"messageActionChatEditTitle":o&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":o&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+d:"messageActionChatReturn"+d)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+d);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),a=n;break;case"messageActionChatMigrateTo":s=n,a=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&a&&!this.migratedFromTo[s]&&!this.migratedToFrom[a]&&this.migrateChecks(s,a)}d&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),a.set(l,e)}saveMessages(e,t={}){e.saved||(e.saved=!0,e.forEach((e=>{this.saveMessage(e,t)})))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=g.o.fixEmoji(e.message,t);const s=g.o.parseEntities(e.message);e.totalEntities=g.o.mergeEntities(t,s)}wrapMessageForReply(e,t=e.message,s,i,n,a){const r=[];let o=!1;const d=(e,t)=>{if(e){if(void 0===t&&o)return;t=i?l.default.format(e,!0):(0,l.i18n)(e)}if(i)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}},c=this.isRestricted(e);let h=e.totalEntities;if(e.media&&!c){(0,X.Z)(e);let n=!0;if(e.grouped_id){if(s){const t=this.getMidsByMessage(e);if(s.length===t.length){for(const e of t)if(!s.includes(e)){n=!1;break}}else n=!1}if(n){const s=this.getAlbumText(e.grouped_id);t=s.message,h=s.totalEntities,a||(d("AttachAlbum"),o=!0)}}else n=!1;if(!n&&!a||!t){const s=e.media;switch(s._){case"messageMediaPhoto":d("AttachPhoto");break;case"messageMediaDice":d(void 0,i?s.emoticon:g.o.wrapEmojiText(s.emoticon));break;case"messageMediaVenue":t=s.title,d("AttachLocation");break;case"messageMediaGeo":d("AttachLocation");break;case"messageMediaGeoLive":d("AttachLiveLocation");break;case"messageMediaPoll":d(void 0,i?"📊 "+(s.poll.question||"poll"):s.poll.rReply);break;case"messageMediaContact":d("AttachContact");break;case"messageMediaGame":{const e="🎮 "+s.game.title;d(void 0,i?e:g.o.wrapEmojiText(e));break}case"messageMediaDocument":{const e=s.document;if("video"===e.type)d("AttachVideo");else if("voice"===e.type)d("AttachAudio");else if("gif"===e.type)d("AttachGif");else if("round"===e.type)d("AttachRound");else if("sticker"===e.type)e.stickerEmojiRaw&&d(void 0,(i?e.stickerEmojiRaw:e.stickerEmoji)+" "),d("AttachSticker"),t="";else if("audio"===e.type){const t=e.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),s="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);d(void 0,i?s:g.o.wrapEmojiText(s))}else d(void 0,i?e.file_name:g.o.wrapEmojiText(e.file_name));break}case"messageMediaUnsupported":d(l.UNSUPPORTED_LANG_PACK_KEY)}}const c=r.length;t&&c&&r.push(", ")}if(e.action){const t=this.wrapMessageActionTextNew(e,i);t&&d(void 0,t)}if(c&&(t=(0,ae.RP)(e.restriction_reason).text,h=[]),t)if(t=(0,le.Z)(t,100),h||(h=[]),i)r.push(g.o.wrapPlainText(t,h));else{if(n){n=n.trim();let e,s=!1,i=new RegExp((0,de.Z)(n),"gi");for(;null!==(e=i.exec(t));)h.push({_:"messageEntityHighlight",length:n.length,offset:e.index}),s=!0;s&&g.o.sortEntities(h)}const e=g.o.wrapRichText(t,{noLinebreaks:!0,entities:h,noLinks:!0,noTextFormat:!0});r.push((0,W.Z)(e))}if(i)return r.join("");{const e=document.createDocumentFragment();return e.append(...r),e}}wrapSenderToPeer(e){const t=document.createElement("span");t.classList.add("sender-title");const s=e.fromId===f.default.myId&&e.peerId!==f.default.myId;if(t.append(s?(0,l.i18n)("FromYou"):new V.Z(Object.assign(Object.assign({},this.getMessageSenderPeerIdOrName(e)),{dialog:e.peerId===f.default.myId})).element),x.Z.isAnyGroup(e.peerId)||s){const s=new V.Z({peerId:e.peerId}).element;t.append(" ➝ ",s)}return t}getMessageSenderPeerIdOrName(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}wrapSentTime(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,r.zM)(new Date(1e3*e.date))),t}wrapJoinVoiceChatAnchor(e){const t=e.action,{onclick:s,url:i}=g.o.wrapUrl(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!s)return document.createElement("span");const n=document.createElement("a");return n.href=i,n.setAttribute("onclick",s+"(this)"),n}wrapMessageActionTextNewUnsafe(e,t){const s=t?void 0:document.createElement("span"),i="action"in e&&e.action;if(i.message){const e=i.message;return t?g.o.wrapPlainText(e):(s.innerHTML=g.o.wrapRichText(e,{noLinebreaks:!0}),s)}{let n,a,o=i._;const d=(e,t)=>t?x.Z.getPeerTitle(e,t):new V.Z({peerId:e}).element;switch(i._){case"messageActionPhoneCall":o+="."+i.type,a=[(0,K.Z)(i.duration,t)];break;case"messageActionGroupCall":o+="."+i.type,a=[],o.endsWith("You")||e.pFlags.post||a.push(d(e.fromId,t)),void 0!==i.duration?a.push((0,K.Z)(i.duration,t)):a.push(this.wrapJoinVoiceChatAnchor(e));break;case"messageActionInviteToGroupCall":{const s=[e.fromId,i.users[0].toPeerId()];let r="Chat.Service.VoiceChatInvitation";const o=N.Z.getSelf().id;s[0]===o?r+="ByYou":s[1]===o&&(r+="ForYou"),(0,S.Z)(s,o),n=r,a=s.map((e=>d(e,t))),a.push(this.wrapJoinVoiceChatAnchor(e));break}case"messageActionGroupCallScheduled":{const s=new Date,o=new Date(1e3*i.schedule_date),c=(o.getTime()-s.getTime())/864e5,h=new Date(s);h.setDate(h.getDate()+1);const u=x.Z.isBroadcast(e.peerId);n=u?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",a=[];const p=N.Z.getSelf().id;e.fromId===p?n+="You":u||a.push(d(e.fromId,t));let g,f=[];c<1&&o.getDate()===s.getDate()?g="TodayAtFormattedWithToday":c<2&&o.getDate()===h.getDate()?g="Time.TomorrowAt":(g="formatDateAtTime",f.push(new l.default.IntlDateElement({date:o,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),f.push((0,r.mr)(o));const m=(0,l.i18n)(g,f);a.push(m);break}case"messageActionChatCreate":{const s=N.Z.getSelf().id;e.fromId===s?o+="You":a=[d(e.fromId,t)];break}case"messageActionPinMessage":{const s=e.peerId,i=this.getMessageByPeer(s,e.reply_to_mid);if(a=[d(e.fromId,t)],i.deleted)n="ActionPinnedNoText",e.reply_to_mid&&this.fetchMessageReplyTo(e).then((t=>{t.deleted||e.deleted||(f.default.dispatchEvent("message_edit",{storage:this.getMessagesStorage(s),peerId:s,mid:e.mid}),this.isMessageIsTopMessage(e)&&f.default.dispatchEvent("dialogs_multiupdate",{[s]:this.getDialogOnly(s)}))}));else{const e=document.createElement("i");e.dataset.savedFrom=i.peerId+"_"+i.mid,e.dir="auto",e.append(this.wrapMessageForReply(i,void 0,void 0,t)),a.push(e)}break}case"messageActionChatJoinedByRequest":{const s=x.Z.isBroadcast(e.peerId);e.pFlags.out?n=s?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(n=s?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",a=[d(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":a=[d(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":a=[],"messageActionChatEditTitle"===i._&&a.push(d(e.fromId,t)),a.push(t?i.title:(0,$.Z)(g.o.wrapEmojiText(i.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const s=i.users||[i.user_id];if(a=[d(e.fromId,t)],s.length>1){const e=(0,l.join)(s.map((e=>d(e.toPeerId(),t))),!1,t);if(t)a.push(...e);else{const t=document.createElement("span");t.append(...e),a.push(t)}}else a.push(d(s[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=g.o.wrapRichText(i.domain,{entities:[{_:"messageEntityUrl",length:i.domain.length,offset:0}]});a=[(0,$.Z)(e)];break}default:n=l.langPack[o]||`[${i._}]`}return n||(n=l.langPack[o],void 0===n&&(n="["+o+"]")),t?l.default.format(n,!0,a):(0,l._i18n)(s,n,a)}}wrapMessageActionTextNew(e,t){try{return this.wrapMessageActionTextNewUnsafe(e,t)}catch(e){return this.log.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}}reportMessages(e,t,s,i){return h.Z.invokeApiSingle("messages.report",{peer:x.Z.getInputPeerById(e),id:t.map((e=>ee.Z.getServerMessageId(e))),reason:{_:s},message:i})}startBot(e,t,s){const i=t?t.toPeerId(!0):e.toPeerId();if(s){const t=(0,d.a)();return h.Z.invokeApi("messages.startBot",{bot:N.Z.getUserInput(e),peer:x.Z.getInputPeerById(i),random_id:t,start_param:s}).then((e=>{D.Z.processUpdateMessage(e)}))}const n="/start";if(t){let s;return s=T.Z.isChannel(t)?T.Z.inviteToChannel(t,[e]):T.Z.addChatUser(t,e,0),s.catch((e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0})).then((()=>{const t=N.Z.getUser(e);return this.sendText(i,n+"@"+t.username)}))}return this.sendText(i,n)}editPeerFolders(e,t){h.Z.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:x.Z.getInputPeerById(e),folder_id:t})))}).then((e=>{D.Z.processUpdateMessage(e)}))}toggleDialogPin(e,t){var s;if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const i=this.getDialogOnly(e);if(!i)return Promise.reject();const n=!(null===(s=i.pFlags)||void 0===s?void 0:s.pinned)||void 0;if(n){const e=1===t?f.default.config.pinned_infolder_count_max:f.default.config.pinned_dialogs_count_max;if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return h.Z.invokeApi("messages.toggleDialogPin",{peer:x.Z.getInputDialogPeerById(e),pinned:n}).then((s=>{if(s){const s=n?{pinned:n}:{};D.Z.saveUpdate({_:"updateDialogPinned",peer:x.Z.getDialogPeer(e),folder_id:t,pFlags:s})}}))}markDialogUnread(e,t){var s;const i=this.getDialogOnly(e);if(!i)return Promise.reject();const n=!t&&!(null===(s=i.pFlags)||void 0===s?void 0:s.unread_mark)||void 0;return h.Z.invokeApi("messages.markDialogUnread",{peer:x.Z.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:x.Z.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&T.Z.hasChat(t.toChatId())){const s=T.Z.getChat(e.toChatId());s&&s.migrated_to&&s.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,f.default.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){if(e.pFlags.is_outgoing)return!1;const s=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&s.push("messageMediaPoll"),!("message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===s.indexOf(e.media._)||e.fromId&&N.Z.isBot(e.fromId)||e.media&&"messageMediaDocument"===e.media._&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var s;return!(!e||!this.canMessageBeEdited(e,t)||this.getMessagePeer(e)!==N.Z.getSelf().id&&(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date<(0,r.bz)(!0)-f.default.config.edit_time_limit&&"messageMediaPoll"!==(null===(s=e.media)||void 0===s?void 0:s._)))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===T.Z.getChat(e.peerId.toChatId())._||T.Z.hasRights(e.peerId.toChatId(),"delete_messages"))&&!e.pFlags.is_outgoing}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var s,i;let n=t.reply_markup;if(!n&&!(null===(s=t.pFlags)||void 0===s?void 0:s.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const a=e.replyMarkup;if(n)return!(a&&a.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.mida.mid||t.pFlags.is_outgoing)&&t.message)return a.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,X.Z)(t),!("messageActionChatDeleteUser"!==(null===(i=t.action)||void 0===i?void 0:i._)||!(a?t.action.user_id===a.fromId:N.Z.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,s=!0){return x.Z.isRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(s?h.Z.invokeApiCacheable:h.Z.invokeApi).bind(h.Z)("messages.getSearchCounters",{peer:x.Z.getInputPeerById(e),filters:t})}filterMessagesByInputFilter(e,t,s,i){const n=[];if(!t.length)return n;let a=!0;const r={},o=[],d=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,d.push("video");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,o.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,o.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,o.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,o.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:a=!1}if(!a)return n;for(let e=0,a=t.length;ee.includes(t._)))||g.o.matchUrl(a.message))&&(l=!0)}}else r.avatar&&a.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(a.action._)&&(l=!0);if(l&&(n.push(a),n.length>=i))break}return n}getSearch({peerId:e,query:t,inputFilter:s,maxId:i,limit:n,nextRate:a,backLimit:r,threadId:o,folderId:d,minDate:l,maxDate:c}){if(x.Z.isRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),s||(s={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),a||(a=0),r||(r=0),l=l?l/1e3|0:0,c=c?c/1e3|0:0;let u=[];r&&(n+=r);let p;if(!e||r||i||t||1===n||o||(p=this.getHistoryStorage(e),u=this.filterMessagesByInputFilter(s._,p.history.slice,this.getMessagesStorage(e),n)),u.length){if(!(u.length{N.Z.saveApiUsers(e.users),T.Z.saveApiChats(e.chats),this.saveMessages(e.messages),z.ZP&&this.log("getSearch result:",s,e);const t=e.count||u.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=T.Z.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}u.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:u}}))}subscribeRepliesThread(e,t){const s=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===s)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const s=ee.Z.getServerMessageId(Math.max(...this.getMidsByMessage(e))),i={_:"messageService",pFlags:{is_single:!0},id:ee.Z.generateMessageId(s,!0),date:e.date,from_id:{_:"peerUser",user_id:_.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([i],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=i.mid}getDiscussionMessage(e,t){return h.Z.invokeApiSingle("messages.getDiscussionMessage",{peer:x.Z.getInputPeerById(e),msg_id:ee.Z.getServerMessageId(t)}).then((s=>{var i;T.Z.saveApiChats(s.chats),N.Z.saveApiUsers(s.users),this.saveMessages(s.messages);const n=this.filterMessages(s.messages[0],(e=>!!e.replies))[0],a=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid);return s.max_id=r.maxId=ee.Z.generateMessageId(s.max_id)||0,s.read_inbox_max_id=r.readMaxId=ee.Z.generateMessageId(null!==(i=s.read_inbox_max_id)&&void 0!==i?i:n.mid),s.read_outbox_max_id=r.readOutboxMaxId=ee.Z.generateMessageId(s.read_outbox_max_id)||0,this.threadsToReplies[a]=e+"_"+t,n}))}handleNewMessage(e,t){void 0===this.newMessagesToHandle[e]&&(this.newMessagesToHandle[e]=new Set),this.newMessagesToHandle[e].add(t),this.newMessagesHandleTimeout||(this.newMessagesHandleTimeout=window.setTimeout(this.handleNewMessages,0))}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise((e=>{setTimeout((()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}),0)}))}deleteMessages(e,t,s){var i,n;let a;const r=t.map((e=>ee.Z.getServerMessageId(e)));if(e.isAnyChat()&&x.Z.isChannel(e)){const s=e.toChatId(),o=T.Z.getChat(s);if(!o.pFlags.creator&&!(null===(n=null===(i=o.admin_rights)||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;a=h.Z.invokeApi("channels.deleteMessages",{channel:T.Z.getChannelInput(s),id:r}).then((e=>{D.Z.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:s,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else a=h.Z.invokeApi("messages.deleteMessages",{revoke:s,id:r}).then((e=>{D.Z.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));return a}readHistory(e,t=0,s,i=!1){if(this.log("readHistory:",e,t,s),!this.getReadMaxIdIfUnread(e,s)&&!i)return this.log("readHistory: isn't unread"),Promise.resolve();const n=this.getHistoryStorage(e,s);if(n.triedToReadMaxId>=t)return Promise.resolve();let a;return s?(n.readPromise||(a=h.Z.invokeApi("messages.readDiscussion",{peer:x.Z.getInputPeerById(e),msg_id:ee.Z.getServerMessageId(s),read_max_id:ee.Z.getServerMessageId(t)})),D.Z.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:s,read_max_id:t})):x.Z.isChannel(e)?(n.readPromise||(a=h.Z.invokeApi("channels.readHistory",{channel:T.Z.getChannelInput(e.toChatId()),max_id:ee.Z.getServerMessageId(t)})),D.Z.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(a=h.Z.invokeApi("messages.readHistory",{peer:x.Z.getInputPeerById(e),max_id:ee.Z.getServerMessageId(t)}).then((e=>{D.Z.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),D.Z.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:x.Z.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),q.Z.soundReset(x.Z.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,a.finally((()=>{delete n.readPromise;const{readMaxId:i}=n;this.log("readHistory: promise finally",t,i),i>t&&this.readHistory(e,i,s,!0)})),n.readPromise=a)}readAllHistory(e,t,s=!1){const i=this.getHistoryStorage(e,t);i.maxId&&this.readHistory(e,i.maxId,t,s)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,s){const i=this.unreadMentions[e];i&&(s?i.first.isEnd(v.D.Top)&&i.insertSlice([t]):i.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const s=this.getDialogOnly(e);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const s=this.goToNextMentionPromises[e];if(s)return s;const i=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new v.Z,n=i.length,a=i.first.isEnd(v.D.Top);if(!n&&a)return this.fixUnreadMentionsCountIfNeeded(e,i),Promise.resolve();let r=Promise.resolve();return!a&&n<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then((()=>{const t=i.last,s=t&&t[t.length-1];s?(i.delete(s),f.default.dispatchEvent("history_focus",{peerId:e,mid:s})):this.fixUnreadMentionsCountIfNeeded(e,i)})).finally((()=>{delete this.goToNextMentionPromises[e]}))}loadNextMentions(e){const t=this.unreadMentions[e],s=t.first[0]||1;return this.getUnreadMentions(e,s,-50,50).then((e=>{this.mergeHistoryResult(t,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,s,i,n=0,a=0){return h.Z.invokeApiSingle("messages.getUnreadMentions",{peer:x.Z.getInputPeerById(e),offset_id:ee.Z.getServerMessageId(t),add_offset:s,limit:i,max_id:ee.Z.getServerMessageId(n),min_id:ee.Z.getServerMessageId(a)}).then((e=>((0,X.Z)(e),N.Z.saveApiUsers(e.users),T.Z.saveApiChats(e.chats),this.saveMessages(e.messages),e)))}readMessages(e,t){if(!t.length)return Promise.resolve();let s,i;if(t=t.map((e=>ee.Z.getServerMessageId(e))),e.isAnyChat()&&x.Z.isChannel(e)){const n=e.toChatId();i={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},s=h.Z.invokeApi("channels.readMessageContents",{channel:T.Z.getChannelInput(n),id:t})}else i={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},s=h.Z.invokeApi("messages.readMessageContents",{id:t}).then((e=>{i.pts=e.pts,i.pts_count=e.pts_count,D.Z.processLocalUpdate(i)}));return D.Z.processLocalUpdate(i),s}getHistoryStorage(e,t){var s,i;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(s=this.threadsStorage[e][t])&&void 0!==s?s:this.threadsStorage[e][t]={count:null,history:new v.Z}):null!==(i=this.historiesStorage[e])&&void 0!==i?i:this.historiesStorage[e]={count:null,history:new v.Z}}getNotifyPeerSettings(e){return Promise.all([q.Z.getNotifyPeerTypeSettings(),q.Z.getNotifySettings(x.Z.getInputNotifyPeerById(e,!0))]).then((([t,s])=>({muted:q.Z.isPeerLocalMuted(e,!0),peerTypeNotifySettings:s})))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let s="";if((null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())&&e.reply_to){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;s=e.peerId+"_"+t}return s}updateMessage(e,t,s){return this.wrapSingleMessage(e,t,!0).then((()=>{const i=this.getMessageByPeer(e,t);return s&&f.default.dispatchEvent(s,i),i}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let s;if(t){const i=this.pendingByRandomId[t];(s=this.finalizePendingMessage(t,e))&&f.default.dispatchEvent("history_update",{storage:i.storage,peerId:e.peerId,mid:e.mid}),delete this.pendingByMessageId[e.mid]}return s}mutePeer(e,t){const s={_:"inputPeerNotifySettings"};return s.mute_until=t,q.Z.updateNotifySettings({_:"inputNotifyPeer",peer:x.Z.getInputPeerById(e)},s)}togglePeerMute(e,t){return void 0===t&&(t=!q.Z.isPeerLocalMuted(e,!1)),this.mutePeer(e,t?_.rU:0)}canSendToPeer(e,t,s="send_messages"){if(x.Z.isRestricted(e))return!1;if(e.isAnyChat()){const i=T.Z.getChat(e.toChatId());return T.Z.hasRights(e.toChatId(),s,void 0,!!t)&&(!i.pFlags.left||!!t)}return N.Z.canSendToUser(e)}finalizePendingMessage(e,t){const s=this.pendingByRandomId[e];if(s){const{peerId:i,tempId:n,threadId:a,storage:r}=s;[this.getHistoryStorage(i),a?this.getHistoryStorage(i,a):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o.deleted||(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),f.default.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}}finalizePendingMessageCallbacks(e,t,s){const i=this.tempFinalizeCallbacks[t];if(void 0!==i){for(const e in i){const{deferred:t,callback:n}=i[e];n(s).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(s.media){(0,X.Z)(s);const{photo:e,document:i}=s.media;if(e){const s=L.Z.getPhoto(""+t);if(s){const t=e.sizes[e.sizes.length-1],i=U.Z.getCacheContext(e,t.type),n=U.Z.getCacheContext(s,"full");Object.assign(i,n);const a=e.sizes[e.sizes.length-1],r=L.Z.getPhotoDownloadOptions(e,a),o=(0,G.P)(r.location);U.Z.fakeDownload(o,n.url)}}else if(i){const e=F.Z.getDoc(""+t);if(e&&e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type){const t=U.Z.getCacheContext(i),s=U.Z.getCacheContext(e);Object.assign(t,s);const n=F.Z.getInputFileName(i);U.Z.fakeDownload(n,s.url)}}else s.media.poll&&(delete R.Z.polls[t],delete R.Z.results[t])}const n=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(n,e),f.default.dispatchEvent("message_sent",{storage:e,tempId:t,tempMessage:n,mid:s.mid,message:s})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,O.default.pushToState("maxSeenMsgId",e),h.Z.invokeApi("messages.receivedMessages",{max_id:ee.Z.getServerMessageId(e)})}getMessageReactionsListAndReadParticipants(e,t,s,i,n,a){var r,o;const d={reactions:[],count:0,next_offset:void 0},l=this.canViewMessageReadParticipants(e);return l&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!l||s||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!a?ne.Z.getMessageReactionsList(e.peerId,e.mid,t,s,i).catch((e=>d)):d]).then((([e,t])=>{const s=e.map((e=>e.toPeerId())),i=s.slice();(0,P.Z)(i,((e,s,i)=>{t.reactions.some((t=>x.Z.getPeerId(t.peer_id)===e))&&i.splice(s,1)}));let n=t.reactions.map((e=>({peerId:x.Z.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(i.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:s,combined:n,nextOffset:t.next_offset}}))}getMessageReadParticipants(e,t){return h.Z.invokeApiSingle("messages.getMessageReadParticipants",{peer:x.Z.getInputPeerById(e),msg_id:ee.Z.getServerMessageId(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return!("message"!==e._||e.pFlags.is_outgoing||!e.pFlags.out||!x.Z.isAnyGroup(e.peerId))&&(T.Z.getChat(e.peerId.toChatId()).participants_countee.Z.getServerMessageId(e))),increment:!0}).then((s=>{const i=new Array(t.length),n=e.toChatId();for(let e=0,a=t.length;e{f.default.dispatchEvent("history_focus",{peerId:s,mid:e.mid})},n.message=r,n.key="msg"+e.mid,n.tag=a,n.silent=!0;const o=x.Z.getPeerPhoto(s);o?J.Z.loadAvatar(s,o,"photo_small").loadPromise.then((s=>{(e.pFlags.unread||t.userReaction)&&(n.image=s,q.Z.notify(n))})):q.Z.notify(n)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage()}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return Promise.resolve([]);const t=this.getScheduledMessagesStorage(e);return t.size?Promise.resolve([...t.keys()]):h.Z.invokeApiSingle("messages.getScheduledHistory",{peer:x.Z.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){N.Z.saveApiUsers(t.users),T.Z.saveApiChats(t.chats);const s=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:s,isScheduled:!0}),[...s.keys()]}return[]}))}sendScheduledMessages(e,t){return h.Z.invokeApi("messages.sendScheduledMessages",{peer:x.Z.getInputPeerById(e),id:t.map((e=>ee.Z.getServerMessageId(e)))}).then((e=>{D.Z.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return h.Z.invokeApi("messages.deleteScheduledMessages",{peer:x.Z.getInputPeerById(e),id:t.map((e=>ee.Z.getServerMessageId(e)))}).then((e=>{D.Z.processUpdateMessage(e)}))}getMessageWithReplies(e){if(e.peerId===_.hj||(e=this.filterMessages(e,(e=>!!e.replies))[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!T.Z.isInChat(e.toChatId())}isRestricted(e){return!(!e.restriction_reason||!(0,ae.X)(e.restriction_reason))}getNewHistory(e,t){var s;return he(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const i=this.getHistoryStorage(e,t),n=i.history.slice;if(!n.isEnd(v.D.Bottom))return;delete i.maxId,n.unsetEnd(v.D.Bottom);let a=this.getHistory(e,null!==(s=n[0])&&void 0!==s?s:1,0,50,t);a instanceof Promise&&(a=yield a);for(let t=0,s=a.history.length;t{const e=a.history.sliceMe(t,r,s);return{count:a.count,history:(null==e?void 0:e.slice)||a.history.constructSlice(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||a.count}})):{count:a.count,history:o.slice,offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,s){const{offset_id_offset:i,messages:n}=e,a=e.count||n.length,r=i||0,o=s<0?t+s:t;return{count:a,offsetIdOffset:r,isTopEnd:r>=a-o||ae.mid));if(s&&ee.Z.getServerMessageId(s)&&!h.includes(s)&&dh[e]);++e);h.splice(e,0,s)}const u=e.insertSlice(h)||e.slice;return l&&u.setEnd(v.D.Top),c&&u.setEnd(v.D.Bottom),Object.assign({slice:u,mids:h,messages:a},r)}fillHistoryStorage(e,t,s,i,n,a){return this.requestHistory(e,t,s,i,void 0,a).then((a=>{const{count:r,isBottomEnd:o,slice:d,messages:l}=this.mergeHistoryResult(n.history,a,t,s,i);n.count=r;for(let t=0,s=l.length;t{z.ZP&&this.log("requestHistory result:",e,r,t,s,i),N.Z.saveApiUsers(r.users),T.Z.saveApiChats(r.chats),this.saveMessages(r.messages),x.Z.isChannel(e)&&D.Z.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,d=r.count;o&&r.messages[o-1].deleted&&(r.messages.splice(o-1,1),o--,d--);const l=this.getHistoryStorage(e,a),c=r.messages[o-1];if(o&&c.grouped_id){const t=l.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=T.Z.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},D.Z.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise((e=>{setTimeout((()=>{const t=[];for(const[e,s]of this.needSingleMessages){const i=[...s.keys()],n=i.map((e=>({_:"inputMessageID",id:ee.Z.getServerMessageId(e)})));let a;a=e.isAnyChat()&&x.Z.isChannel(e)?h.Z.invokeApiSingle("channels.getMessages",{channel:T.Z.getChannelInput(e.toChatId()),id:n}):h.Z.invokeApiSingle("messages.getMessages",{id:n});const r=a.then((e=>{(0,X.Z)(e),N.Z.saveApiUsers(e.users),T.Z.saveApiChats(e.chats),this.saveMessages(e.messages);for(let t=0;t{f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:i})}));t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally((()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()}))}),0)}))}wrapSingleMessage(e,t,s=!1){const i=this.getMessageByPeer(e,t);if(i.deleted||s){let s=this.needSingleMessages.get(e);s||this.needSingleMessages.set(e,s=new Map);let i=s.get(t);return i||(i=(0,a.b)(),s.set(t,i),this.fetchSingleMessages(),i)}return f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?x.Z.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then((t=>(t.deleted&&delete e.reply_to_mid,t)))}setTyping(e,t,s){var i;let n=this.typings[e];return f.default.myId&&e&&this.canSendToPeer(e)&&e!==f.default.myId&&(s||(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)!==t._)?((null==n?void 0:n.timeout)&&clearTimeout(n.timeout),n=this.typings[e]={action:t},h.Z.invokeApi("messages.setTyping",{peer:x.Z.getInputPeerById(e),action:t}).finally((()=>{n===this.typings[e]&&(n.timeout=window.setTimeout((()=>{delete this.typings[e]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const s=e.media;if(s){const i=s.webpage||s,n=i.photo||i.document;if((null==n?void 0:n.file_reference)&&u.Z.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in s&&s.webpage){const i=this.getScheduledMessagesStorage(e.peerId)===t,n=B.Z.getMessageKeyForPendingWebPage(e.peerId,e.mid,i);B.Z.deleteWebPageFromPending(s.webpage,n)}s.poll&&R.Z.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,s){const i={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of s){const s=this.getMessageFromStorage(t,n);if(s.deleted){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(s,t),this.updateMessageRepliesIfNeeded(s),s.pFlags.out||s.pFlags.is_outgoing||!s.pFlags.unread||(++i.unread,q.Z.cancel("msg"+n),s.pFlags.mentioned&&(++i.unreadMentions,this.modifyCachedMentions(e,n,!1))),++i.count,i.msgs.add(n),s.deleted=!0;const a=s.grouped_id;if(a){const e=this.groupedMessagesStorage[a];e&&(e.delete(n),i.albums||(i.albums={}),(i.albums[a]||(i.albums[a]=new Set)).add(n),e.size||(delete i.albums,delete this.groupedMessagesStorage[a]))}t.delete(n);const r=this.newMessagesToHandle[e];r&&r.has(n)&&r.delete(n)}if(i.albums)for(const t in i.albums)f.default.dispatchEvent("album_edit",{peerId:e,groupId:t,deletedMids:[...i.albums[t]]});return i}handleEditedMessage(e,t){var s;if("message"===e._&&(null===(s=e.media)||void 0===s?void 0:s.webpage)){const t=B.Z.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);B.Z.deleteWebPageFromPending(e.media.webpage,t)}}getMediaFromMessage(e){return e.action?e.action.photo:e.media&&(e.media.photo||e.media.document||e.media.webpage&&(e.media.webpage.document||e.media.webpage.photo))}isMentionUnread(e){var t;const s=null===(t=e.media)||void 0===t?void 0:t.document;return e.pFlags.media_unread&&e.pFlags.mentioned&&(!s||!["voice","round"].includes(s.type))}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return!e.pFlags.noforwards&&!x.Z.noForwards(e.peerId)}};z.GO.appMessagesManager=ue;const pe=ue},9090:(e,t,s)=>{s.d(t,{Z:()=>C});var i=s(3251),n=s(410),a=s(3725),r=s(632),o=s(4762),d=s(4727),l=s(9518),c=s(6702),h=s(3512),u=s(7922),p=s(5185),g=s(8138),f=s(6440),m=s(1722),v=s(4687),_=s(5555),y=s(2131),I=s(1507),P=s(6724),S=s(6848),M=s(4847);const w=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=y.Z,this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.faviconEl=document.head.querySelector('link[rel="icon"]'),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{Promise.all(["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((e=>u.Z.get(e)))).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&c.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?c.default.subscribe():c.default.unsubscribe())}c.default.setSettings(this.settings)})),v.default.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,r.bz)(!0);let t=I.rU;for(const s in this.peerSettings.notifyPeer){const i=this.peerSettings.notifyPeer[s];if(i instanceof Promise)continue;const n=i.mute_until;n&&(n<=e?(i.mute_until=0,h.default.dispatchEvent("updateNotifySettings",{_:"updateNotifySettings",peer:{_:"notifyPeer",peer:f.Z.getOutputPeer(s.toPeerId())},notify_settings:i})):n{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)},navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.topMessagesDeferred=(0,a.b)(),this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.checkMuteUntilThrottled=(0,P.Z)(this.checkMuteUntil,1e3,!1),h.default.addEventListener("instance_deactivated",(()=>{this.stop()})),h.default.addEventListener("instance_activated",(()=>{this.stopped&&this.start()})),h.default.addEventListener("idle",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),h.default.addMultipleEventsListeners({updateNotifySettings:e=>{const t="notifyPeer"===e.peer._&&f.Z.getPeerId(e.peer.peer),s="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:s,peerId:t,settings:e.notify_settings}),h.default.dispatchEvent("notify_settings",e)}}),h.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):c.default.subscribe()})),h.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),h.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),h.default.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),h.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void l.Z.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>{e.custom.channel_id&&!g.Z.hasChat(e.custom.channel_id)||t.isUser()&&!_.Z.hasUser(t)||h.default.dispatchEvent("history_focus",{peerId:t,mid:+e.custom.msg_id})}))}))}toggleToggler(e=h.default.idle.isIDLE){if(o.IS_MOBILE)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval((()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=d.default.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const s=t.getContext("2d");s.beginPath(),s.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),s.fillStyle="#3390ec",s.fill();let n=24,a=""+e;e<10?n=22:e<100?n=20:(a="99+",n=16),n*=window.devicePixelRatio,s.font=`700 ${n}px ${i.P}`,s.textBaseline="middle",s.textAlign="center",s.fillStyle="white",s.fillText(a,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}getLocalSettings(){return this.settings}getNotifySettings(e){let t,s=(0,M.Z)(e._),i=this.peerSettings[s];return"inputNotifyPeer"===e._&&(t=s=f.Z.getPeerId(e.peer),i=i[s]),i||((i||this.peerSettings)[s]=l.Z.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:s,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return l.Z.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((s=>{s&&p.Z.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:(0,M.Z)(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getNotifyExceptions(){l.Z.invokeApi("account.getNotifyExceptions",{compare_sound:!0}).then((e=>{p.Z.processUpdateMessage(e)}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=l.Z.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){l.Z.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}savePeerSettings({key:e,peerId:t,settings:s}){let i;t&&(e=t,i=this.peerSettings.notifyPeer),(i||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(h.default.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),v.default.getState().then((t=>{const i=t.notifySettings;i[e]=s,v.default.pushToState("notifySettings",i)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,r.bz)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:f.Z.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings(e,t=!0){const s={_:"peerNotifySettings"},i=this.peerSettings.notifyPeer[e];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=f.Z.getInputNotifyPeerById(e,!0),i=(0,M.Z)(t._),n=this.peerSettings[i];if(n&&!(n instanceof Promise))for(let e in n)void 0===s[e]&&(s[e]=n[e])}return s}isPeerLocalMuted(e,t=!0){if(e===h.default.myId)return!1;const s=this.getPeerLocalSettings(e,t);return this.isMuted(s)}start(){if(this.updateLocalSettings(),h.default.addEventListener("settings_updated",this.updateLocalSettings),c.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),this.notificationsCount++,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,s=e.key||"k"+t;this.notificationsShown[s]=!0;const i=(0,r.bz)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=i),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const s=this.notificationsShown[t];"boolean"!=typeof s&&s.tag===e.tag&&(s.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void c.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),m.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[s],this.clear())},n.show&&n.show(),this.notificationsShown[s]=n,o.IS_MOBILE||setTimeout((()=>{this.hide(s)}),8e3)}}testSound(e){const t=(0,r.bz)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(i),i.addEventListener("ended",(()=>{i.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,c.default.hidePushNotifications()}registerDevice(e){if(this.registeredDevice&&(0,S.Z)(this.registeredDevice,e))return!1;l.Z.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;l.Z.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}getVibrateSupport(){return this.vibrateSupport}};n.GO.appNotificationsManager=w;const C=w},6440:(e,t,s)=>{s.d(t,{Z:()=>v});var i=s(410),n=s(8598),a=s(3512),r=s(8138),o=s(5555),d=s(4727),l=s(1507),c=s(677),h=s(5880),u=s(8456);const p=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],g=["red","green","yellow","blue","violet","pink","cyan","orange"],f=[0,7,4,1,6,3,5];["isChannel","isMegagroup","isAnyGroup","isBroadcast","isBot","isContact","isUser","isAnyChat"].forEach((e=>{const t=Array.isArray(e)?e[0]:e,s=Array.isArray(e)?e[1]:e;String.prototype[t]=function(){return m[s](this.toString())},Number.prototype[t]=function(){return m[s](this)}}));const m=new class{canPinMessage(e){return e.isUser()||r.Z.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){if(this.isRestricted(e))return;const t=e.isUser()?o.Z.getUserPhoto(e.toUserId()):r.Z.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:void 0}getPeerMigratedTo(e){if(e.isUser())return!1;const t=r.Z.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&this.getPeerId(t.migrated_to)}getPeerTitle(e,t=!1,s=!1,i){e||(e=a.default.myId);let l="";if(e.isUser()){const t=o.Z.getUser(e.toUserId());t.first_name&&(l+=t.first_name),!t.last_name||s&&l||(l+=" "+t.last_name),l=l?l.trim():t.pFlags.deleted?d.default.format("HiddenName",!0):t.username}else l=r.Z.getChat(e.toChatId()).title,s&&(l=l.split(" ")[0]);return void 0!==i&&(l=(0,u.Z)(l,i,i)),t?l:n.o.wrapEmojiText(l)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return r.Z.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?o.Z.getUserString(e.toUserId()):r.Z.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?o.Z.getUser(e.toUserId()):r.Z.getChat(e.toChatId())}getPeerId(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,h.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const s=e.channel_id||e.chat_id;return void 0!==s?s.toPeerId(!0):a.default.myId}if(!e)return l.NM;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&r.Z.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&r.Z.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!r.Z.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&o.Z.isBot(e.toUserId())}isContact(e){return e.isUser()&&o.Z.isContact(e.toUserId())}isUser(e){return+e>=0}isAnyChat(e){return!this.isUser(e)}isRestricted(e){return e.isUser()?o.Z.isRestricted(e.toUserId()):r.Z.isRestricted(e.toChatId())}getRestrictionReasonText(e){const t=this.getPeer(e),s=t.restriction_reason?(0,c.RP)(t.restriction_reason):void 0;return s?s.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return r.Z.getInputPeer(t)}const t=e.toUserId();return o.Z.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,h.Z)(e)?e:this.getInputPeerById(e)}}getPeerColorById(e,t=!0){if(!e)return"";const s=f[Math.abs(+e)%7];return(t?g:p)[s]}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+o.Z.getUserSearchText(e.toUserId()):"%pg "+(r.Z.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===a.default.myId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return r.Z.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return r.Z.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=r.Z.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}};i.GO.appPeersManager=m;const v=m},3714:(e,t,s)=>{s.d(t,{Z:()=>I});var i=s(8801),n=s(4762),a=s(9518),r=s(2003),o=s(7309),d=s(5555),l=s(6705),c=s(410),h=s(6740),u=s(9897),p=s(4755),g=s(241),f=s(3306),m=s(5880),v=s(4463);class _{constructor(){this.photos={}}savePhoto(e,t){var s;if("photoEmpty"===e._)return;const i=this.photos[e.id];if(e.file_reference&&((0,v.Z)("file_reference",i,e),r.Z.saveContext(e.file_reference,t)),null===(s=e.sizes)||void 0===s?void 0:s.length){const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return i?Object.assign(i,e):this.photos[e.id]=e}choosePhotoSize(e,t=0,s=0,i=!1,n=!1){window.devicePixelRatio>1&&(t*=2,s*=2);let a={_:"photoSizeEmpty",type:""},r=e.sizes||e.thumbs;if(n&&r&&"document"===e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==r?void 0:r.length){for(let e=0,i=r.length;e=t||n.height>=s)break}i&&"photoSizeEmpty"===a._&&"photoStrippedSize"===r[0]._&&(a=r[0])}return a}getUserPhotos(e,t="0",s=20){const i=d.Z.getUserInput(e);return a.Z.invokeApiCacheable("photos.getUserPhotos",{user_id:i,offset:0,limit:s,max_id:t},{cacheSeconds:60}).then((s=>{d.Z.saveApiUsers(s.users);const i=s.photos.map(((t,i)=>(s.photos[i]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}return{count:s.count||i.length,photos:i}}))}getPreviewURLFromBytes(e,t=!1){let s,i;t?s=e instanceof Uint8Array?e:new Uint8Array(e):(s=new Uint8Array(_.jpegHeader.concat(Array.from(e.slice(3)),_.jpegTail)),s[164]=e[1],s[166]=e[2]),i=t?n.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const a=new Blob([s],{type:i});return URL.createObjectURL(a)}getPathFromPhotoPathSize(e){const t=e.bytes;let s="M";for(let e=0,i=t.length;e=192?s+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[i-128-64]:(i>=128?s+=",":i>=64&&(s+="-"),s+=""+(63&i))}return s+="z",s}getPreviewURLFromThumb(e,t,s=!1){const i=o.Z.getCacheContext(e,t.type);return i.url||(i.url=this.getPreviewURLFromBytes(t.bytes,s))}getImageFromStrippedThumb(e,t,s){const i=this.getPreviewURLFromThumb(e,t,!1),n=new Image;n.classList.add("thumbnail");const a=(s?(0,l.Z)(i):Promise.resolve(i)).then((e=>(0,h.cj)(n,e)));return{image:n,loadPromise:a}}setAttachmentSize(e,t,s,i,n=!0,a,r,o){let d;o||(o=this.choosePhotoSize(e,s,i,void 0,r));const l="document"===e._;d=l?(0,p.CJ)(e.w||o.w||512,e.h||o.h||512):(0,p.CJ)(o.w||100,o.h||100);let c=(0,p.CJ)(s,i);c=d=d.aspect(c,n);let h=!0;return l&&!["video","gif"].includes(e.type)||(c.width<200&&c.height<200&&(c=d=d.aspectCovered((0,p.CJ)(200,200))),a&&(a.message||a.reply_to_mid||a.media.webpage||a.replies&&a.replies.pFlags.comments&&777!==a.replies.channel_id)&&c.width<320&&(c=(0,p.CJ)(320,c.height),h=!1),h&&c.width<120&&a&&(c=(0,p.CJ)(120,c.height),h=!1)),t.style.width=c.width+"px",t.style.height=c.height+"px",{photoSize:o,size:d,isFit:h}}getStrippedThumbIfNeeded(e,t,s,i=!1){if(!t.downloaded||["video","gif"].includes(e.type)||i){if("document"===e._&&t.downloaded&&!i)return null;const n=e.sizes||e.thumbs,a=(null==n?void 0:n.length)?n.find((e=>"photoStrippedSize"===e._)):null;if(a&&"bytes"in a)return this.getImageFromStrippedThumb(e,a,s)}return null}getPhotoDownloadOptions(e,t,s,i){const n="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const a=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,r={_:n?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:r,size:a?t.size:void 0,queueId:s,onlyCache:i}}preloadPhoto(e,t,s,n){const a=this.getPhoto(e);if(!a||"photoEmpty"===a._)throw new Error("preloadPhoto photoEmpty!");if(!t){const e=g.Z.width,s=g.Z.height;t=this.choosePhotoSize(a,e,s)}const r=o.Z.getCacheContext(a,t.type);if(r.downloaded>=("size"in t?t.size:0)&&r.url)return Promise.resolve();const d=this.getPhotoDownloadOptions(a,t,s,n),l=(0,i.P)(d.location);let c=o.Z.getDownload(l);return c||(c=o.Z.download(d),c.then((e=>{if(!r.downloaded||r.downloaded{})),c)}getPhoto(e){return(0,m.Z)(e)?e:this.photos[e]}getInput(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}getMediaInput(e){return{_:"inputMediaPhoto",id:this.getInput(e),ttl_seconds:0}}savePhotoFile(e,t){const s=this.choosePhotoSize(e,65535,65535);if("photoSize"!==s._&&"photoSizeProgressive"!==s._)return;const i=this.getPhotoDownloadOptions(e,s,t);i.fileName="photo"+e.id+".jpg",o.Z.downloadToDisc(i,i.fileName)}}_.jpegHeader=(0,f.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),_.jpegTail=(0,f.Z)("ffd9");const y=new _;c.GO&&(c.GO.appPhotosManager=y);const I=y},7995:(e,t,s)=>{s.d(t,{Z:()=>f});var i=s(410),n=s(8479),a=s(5003),r=s(9518),o=s(8598),d=s(3512),l=s(5185),c=s(9492),h=s(7223),u=s(6440),p=s(5555);const g=new class{constructor(){this.polls={},this.results={},this.pollToMessages={},this.log=(0,a.kg)("POLLS",a.v9.Error),d.default.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let s=e.results;const i=this.savePoll(t,s);t=i.poll,s=i.results,d.default.dispatchEvent("poll_update",{poll:t,results:s})}})}savePoll(e,t,s){s&&this.updatePollToMessage(s,!0);const i=e.id;return this.polls[i]?(e=Object.assign(this.polls[i],e),t=this.saveResults(e,t)):(this.polls[i]=e,e.rQuestion=o.o.wrapEmojiText(e.question),e.rReply=o.o.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var s;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(s=null==t?void 0:t.results)||void 0===s?void 0:s.length)&&t.results.forEach(((t,s)=>{var i;(null===(i=t.pFlags)||void 0===i?void 0:i.chosen)&&e.chosenIndexes.push(s)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,s,i){return s?(i||(i=[]),s=o.o.parseMarkdown(s,i)):s=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:s,solution_entities:s?i:void 0}}updatePollToMessage(e,t){const{id:s}=e.media.poll;let i=this.pollToMessages[s];if(!t&&!i)return;i||(i=this.pollToMessages[s]=new Set);const n=e.peerId+"_"+e.mid;t?i.add(n):i.delete(n),t||i.size||(delete this.polls[s],delete this.results[s],delete this.pollToMessages[s])}sendVote(e,t){const s=e.media.poll,i=t.map((e=>s.answers[e].option)),n=e.mid,a=e.peerId,o=u.Z.getInputPeerById(a);return e.pFlags.is_outgoing?h.Z.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):r.Z.invokeApi("messages.sendVote",{peer:o,msg_id:c.Z.getServerMessageId(e.mid),options:i}).then((e=>{this.log("sendVote updates:",e),l.Z.processUpdateMessage(e)}))}getResults(e){const t=u.Z.getInputPeerById(e.peerId);return r.Z.invokeApi("messages.getPollResults",{peer:t,msg_id:c.Z.getServerMessageId(e.mid)}).then((e=>{l.Z.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,s,i=20){return r.Z.invokeApi("messages.getPollVotes",{peer:u.Z.getInputPeerById(e.peerId),id:c.Z.getServerMessageId(e.mid),option:t,offset:s,limit:i}).then((e=>(this.log("getPollVotes messages:",e),p.Z.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const s=(0,n.Z)(t);return s.pFlags.closed=!0,h.Z.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(s)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}};i.GO.appPollsManager=g;const f=g},8209:(e,t,s)=>{s.r(t),s.d(t,{AppProfileManager:()=>_,default:()=>I});var i=s(410),n=s(632),a=s(2575),r=s(4727),o=s(9518),d=s(3512),l=s(7381),c=s(5185),h=s(8138),u=s(9492),p=s(9090),g=s(6440),f=s(3714),m=s(5555),v=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class _{constructor(){this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const s=e.user_id?e.user_id.toPeerId():g.Z.getPeerId(e.from_id);if(d.default.myId===s||"speakingInGroupCallAction"===e.action._)return;const i=g.Z.getPeerId(e),n=null!==(t=this.typingsInPeer[i])&&void 0!==t?t:this.typingsInPeer[i]=[];let a=n.find((e=>e.userId===s));const r=()=>{delete a.timeout;const e=n.indexOf(a);-1!==e&&n.splice(e,1),d.default.dispatchEvent("peer_typings",{peerId:i,typings:n}),n.length||delete this.typingsInPeer[i]};if(a&&void 0!==a.timeout&&clearTimeout(a.timeout),"sendMessageCancelAction"===e.action._){if(!a)return;return void r()}a||(a={userId:s},n.push(a)),a.action=e.action;const o=m.Z.hasUser(s);o?m.Z.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&h.Z.hasChat(e.chat_id)&&!h.Z.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==a.timeout&&m.Z.hasUser(s)&&d.default.dispatchEvent("peer_typings",{peerId:i,typings:n})})),a.timeout=window.setTimeout(r,6e3),o&&d.default.dispatchEvent("peer_typings",{peerId:i,typings:n})},this.onUpdatePeerBlocked=e=>{const t=g.Z.getPeerId(e.peer_id);if(g.Z.isUser(t)){const s=t.toUserId(),i=this.usersFull[s];i&&(e.blocked?i.pFlags.blocked=!0:delete i.pFlags.blocked),d.default.dispatchEvent("user_full_update",s)}d.default.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})},d.default.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,s=this.chatsFull[e];void 0!==s&&(s.participants=t,d.default.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,s=i.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,n=i.length;t{var t,s;const i=this.chatsFull[e],n=h.Z.getChat(e);if(!i||!n)return;let a=!1;!!i.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(a=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!i.chat_photo||"photoEmpty"===i.chat_photo._)||e&&r.photo_id!==(null===(s=i.chat_photo)||void 0===s?void 0:s.id))&&(a=!0)}a&&this.refreshFullPeer(e.toPeerId(!0))})),d.default.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),d.default.addEventListener("chat_full_update",(e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!0))})),d.default.addEventListener("user_full_update",(e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!1))})),d.default.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t?this.usersFull[e]:o.Z.invokeApiSingleProcess({method:"users.getFullUser",params:{id:m.Z.getUserInput(e)},processResult:t=>{h.Z.saveApiChats(t.chats,!0),m.Z.saveApiUsers(t.users);const s=t.full_user,i=e.toPeerId(!1);return s.profile_photo&&(s.profile_photo=f.Z.savePhoto(s.profile_photo,{type:"profilePhoto",peerId:i})),p.Z.savePeerSettings({peerId:i,settings:s.notify_settings}),this.usersFull[e]=s,d.default.dispatchEvent("user_full_update",e),s}})}getProfileByPeerId(e,t){return g.Z.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return v(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(h.Z.isChannel(e))return this.getChannelFull(e,t);const s=this.chatsFull[e];if(s&&!t){const t=h.Z.getChat(e);if(t.version===s.participants.version||t.pFlags.left)return s}return o.Z.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{h.Z.saveApiChats(t.chats,!0),m.Z.saveApiUsers(t.users);const s=t.full_chat,i=e.toPeerId(!0);return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=f.Z.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:i})),p.Z.savePeerSettings({peerId:i,settings:s.notify_settings}),this.chatsFull[e]=s,d.default.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return v(this,void 0,void 0,(function*(){const s=yield this.getChatFull(e);return!t&&s.exported_invite&&"chatInviteExported"==s.exported_invite._?s.exported_invite.link:o.Z.invokeApi("messages.exportChatInvite",{peer:g.Z.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},s=200,i=0){if("channelParticipantsRecent"===t._){const t=h.Z.getChat(e);if(t&&t.pFlags&&(t.pFlags.kicked||t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights))return Promise.reject()}return o.Z.invokeApiCacheable("channels.getParticipants",{channel:h.Z.getChannelInput(e),filter:t,offset:i,limit:s,hash:"0"},{cacheSeconds:60}).then((e=>(m.Z.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return o.Z.invokeApiSingle("channels.getParticipant",{channel:h.Z.getChannelInput(e),participant:g.Z.getInputPeerById(t)}).then((e=>(m.Z.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){return void 0===this.chatsFull[e]||t?o.Z.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:h.Z.getChannelInput(e)},processResult:t=>{const s=e.toPeerId(!0);h.Z.saveApiChats(t.chats,!0),m.Z.saveApiUsers(t.users);const i=t.full_chat;return i&&i.chat_photo.id&&(i.chat_photo=f.Z.savePhoto(i.chat_photo,{type:"profilePhoto",peerId:s})),p.Z.savePeerSettings({peerId:s,settings:i.notify_settings}),this.chatsFull[e]=i,d.default.dispatchEvent("chat_full_update",e),i},processError:t=>{if("CHANNEL_PRIVATE"===t.type){let t=h.Z.getChat(e);t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},c.Z.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[t],users:[]})}throw t}}):this.chatsFull[e]}getMentions(e,t,s){let i;return i=h.Z.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:u.Z.getServerMessageId(s)},50,0).then((e=>e.participants.map((e=>h.Z.getParticipantPeerId(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([m.Z.getTopPeers("bots_inline").catch((()=>[])),i]).then((e=>(e=>{"@"===t.charAt(0)&&(t=t.slice(1));const s=new l.Z({ignoreCase:!0}),i=new Map;e.forEach((e=>{s.indexObject(e.id,m.Z.getUserSearchText(e.id)),i.set(e.id,e.rating)}));const n=Array.from(s.search(t));return n.sort(((e,t)=>i.get(t)-i.get(e))),n})(e[0].concat(e[1].map((e=>({id:e,rating:0})))))))}invalidateChannelParticipants(e){o.Z.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],d.default.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],d.default.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,s){return o.Z.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:s}).then((e=>{if(m.Z.saveApiUser(e),void 0!==s){const t=e.id.toPeerId(),i=this.usersFull[e.id];i&&(i.about=s),d.default.dispatchEvent("peer_bio_edit",t)}return this.getProfile(d.default.myId,!0)}))}uploadProfilePhoto(e){return o.Z.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const s=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},m.Z.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==s?void 0:s.bytes,pFlags:{}}}))}m.Z.saveApiUsers(e.users);const s=d.default.myId;f.Z.savePhoto(e.photo,{type:"profilePhoto",peerId:s});const i=s.toUserId();c.Z.processLocalUpdate({_:"updateUserPhoto",user_id:i,date:(0,n.bz)(!0),photo:m.Z.getUser(i).photo,previous:!0})}))}deletePhotos(e){return o.Z.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>{const t=f.Z.getPhoto(e);return f.Z.getInput(t)}))}).then((e=>{}))}getChatMembersString(e){var t,s;const i=h.Z.getChat(e);if("chatForbidden"===i._)return(0,r.i18n)("YouWereKicked");const n=this.chatsFull[e];let o;o=n?"channelFull"===n._?n.participants_count:null===(t=n.participants.participants)||void 0===t?void 0:t.length:i.participants_count||(null===(s=i.participants)||void 0===s?void 0:s.participants.length),o=o||1;let d=h.Z.isBroadcast(e)?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,r.i18n)(d,[(0,a.Z)(o)])}verifyParticipantForOnlineCount(e){const t=m.Z.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return v(this,void 0,void 0,(function*(){if(h.Z.isBroadcast(e))return 1;const s=yield this.getChatFull(e);if(h.Z.isMegagroup(e)){if(s.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const i=yield o.Z.invokeApiCacheable("messages.getOnlines",{peer:h.Z.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=i.onlines)&&void 0!==t?t:1}const i=s.participants;return(null==i?void 0:i.participants)?this.reduceParticipantsForOnlineCount(i.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}const y=new _;i.GO.appProfileManager=y;const I=y},6689:(e,t,s)=>{s.d(t,{Z:()=>y});var i=s(410),n=s(8938),a=s(6654);function r(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var o=s(8479),d=s(9518),l=s(3512),c=s(5185),h=s(1592),u=s(9492),p=s(6440),g=s(8209),f=s(5555);const m=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],v={type:"reactions"},_=new class{constructor(){l.default.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>{return t=this,s=void 0,n=function*(){for(const t of e)yield Promise.all([t.around_animation&&h.Z.downloadDoc(t.around_animation),t.static_icon&&h.Z.downloadDoc(t.static_icon),t.appear_animation&&h.Z.downloadDoc(t.appear_animation),t.center_icon&&h.Z.downloadDoc(t.center_icon)])},new((i=void 0)||(i=Promise))((function(e,a){function r(e){try{d(n.next(e))}catch(e){a(e)}}function o(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(r,o)}d((n=n.apply(t,s||[])).next())}));var t,s,i,n}))}),7500)}getAvailableReactions(){return this.availableReactions?this.availableReactions:d.Z.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,n.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of m)e[t]&&(e[t]=h.Z.saveDoc(e[t],v));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,a.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):r([t,g.default.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,s])=>{var i;const n=(null!==(i=t.available_reactions)&&void 0!==i?i:[]).map((t=>e.find((e=>e.reaction===t)))).filter(Boolean);return this.unshiftQuickReactionInner(n,s)}))}unshiftQuickReactionInner(e,t){const s=e.findAndSplice((e=>e.reaction===t.reaction));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return r([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;const s=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&p.Z.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(s)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return r([d.Z.getAppConfig(),this.getAvailableReactions()],(([e,t])=>t.find((t=>t.reaction===e.reactions_default))))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,a.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return d.Z.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>u.Z.getServerMessageId(e))),peer:p.Z.getInputPeerById(e)},processResult:e=>{c.Z.processUpdateMessage(e)}})}getMessageReactionsList(e,t,s,i,n){return d.Z.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:p.Z.getInputPeerById(e),id:u.Z.getServerMessageId(t),limit:s,reaction:i,offset:n},processResult:e=>(f.Z.saveApiUsers(e.users),e)})}setDefaultReaction(e){return d.Z.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>{if(t){const t=l.default.appConfig;t?t.reactions_default=e:d.Z.getAppConfig(!0),l.default.dispatchEvent("quick_reaction",e)}return t}))}sendReaction(e,t,s){const i=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(i))return;this.lastSendingTimes.set(i,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(i)}),333);const{peerId:a,mid:r}=e,h=l.default.myId;let g=s?e.reactions:(0,o.Z)(e.reactions),f=g?g.results.findIndex((e=>e.pFlags.chosen)):-1,m=-1!==f&&g.results[f];if(m&&(--m.count,delete m.pFlags.chosen,t===m.reaction&&(t=void 0),m.count||g.results.splice(f,1),g.recent_reactions&&g.recent_reactions.findAndSplice((e=>p.Z.getPeerId(e.peer_id)===h)),g.results.length||(g=void 0)),t){g||(g={_:"messageReactions",results:[],pFlags:{}},p.Z.isBroadcast(e.peerId)||(g.pFlags.can_see_list=!0));let s=g.results.findIndex((e=>e.reaction===t)),i=-1!==s&&g.results[s];if(i||(i={_:"reactionCount",count:0,reaction:t,pFlags:{}},s=g.results.push(i)-1),++i.count,i.pFlags.chosen=!0,!g.recent_reactions&&g.pFlags.can_see_list&&(g.recent_reactions=[]),g.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:p.Z.getOutputPeer(h)};p.Z.isMegagroup(a)?(g.recent_reactions.unshift(e),g.recent_reactions=g.recent_reactions.slice(0,3)):(g.recent_reactions.push(e),g.recent_reactions=g.recent_reactions.slice(-3))}}const v=this.availableReactions;if(g&&(null==v?void 0:v.length)){const e=new Map;v.forEach(((t,s)=>{e.set(t.reaction,s)})),g.results.sort(((t,s)=>s.count-t.count||e.get(t.reaction)-e.get(s.reaction)))}if(s)return e.reactions=g,l.default.dispatchEvent("message_reactions",{message:e,changedResults:[]}),Promise.resolve();c.Z.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:g,local:!0});const _=[a,r].join("-"),y=u.Z.getServerMessageId(r),I=d.Z.invokeApi("messages.sendReaction",{peer:p.Z.getInputPeerById(a),msg_id:y,reaction:t}).then((e=>{(0,n.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const s=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:y,peer:p.Z.getOutputPeer(a),reactions:s.message.reactions,pts:s.pts,pts_count:s.pts_count}}c.Z.processUpdateMessage(e)})).catch((t=>{"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===I&&this.sendReaction(e,null==m?void 0:m.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===I&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,I),I}};i.GO&&(i.GO.appReactionsManager=_);const y=_},3847:(e,t,s)=>{s.d(t,{Z:()=>S});var i=s(9518),n=s(3512),a=s(1592),r=s(6947),o=s(410),d=s(3127),l=s(2897),c=s(4755),h=s(671),u=s(8598),p=s(8938),g=s(8079),f=s(393),m=s(7625),v=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const _="emoji",y="emojiAnimations",I=new Set([_,y]),P=new class{constructor(){this.storage=new r.Z(d.Z,"stickerSets"),this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.getAnimatedEmojiStickerSet(),n.default.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),n.default.dispatchEvent("stickers_installed",t.set)}}),this.getGreetingStickersTimeout=window.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3)}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),a.Z.downloadDoc(this.greetingStickers[0]),t}))}saveStickers(e){(0,m.Z)(e,((t,s)=>{(t=a.Z.saveDoc(t))?e[s]=t:e.splice(s,1)}))}getStickerSet(e,t={}){return v(this,void 0,void 0,(function*(){const s=e.id;return this.getStickerSetPromises[s]?this.getStickerSetPromises[s]:this.getStickerSetPromises[s]=new Promise((n=>v(this,void 0,void 0,(function*(){var a;if(!t.overwrite){const e=yield this.storage.get(s);if(e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),n(e),void delete this.getStickerSetPromises[s]}try{const a=yield i.Z.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),r=t.saveById?s:a.set.id;this.saveStickerSet(a,r),n(a)}catch(e){n(null)}delete this.getStickerSetPromises[s]}))))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:_},{saveById:!0}),this.getStickerSet({id:y},{saveById:!0}),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.resolve(i.Z.getAppConfig(e)).then((e=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],i=atob((0,g.Z)(s.file_reference_base64,!1)),r=new Uint8Array(i.length);for(let e=0,t=r.length;e((0,p.Z)(e),this.saveStickers(e.stickers),e)})}))}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const s=this.storage.getFromCache(t?y:_);if(!s||!s.documents)return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const i=s.packs.find((t=>t.emoticon===e));return i?a.Z.getDoc(i.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e,t,s){const i=this.getAnimatedEmojiStickerSet().then((()=>{const i=this.getAnimatedEmojiSticker(e);if(i)return a.Z.downloadDoc(i).then((n=>v(this,void 0,void 0,(function*(){const r=c.ZP.active.emojiSticker,o=(0,h.tB)(e),d=yield l.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:r.width,height:null!=s?s:r.height,name:"doc"+i.id,autoplay:!1,loop:!1,toneIndex:o},"none");d.addEventListener("firstFrame",(()=>{a.Z.saveLottiePreview(i,d.canvas,o),d.remove()}),{once:!0})}))))}));return Promise.all([i,this.preloadAnimatedEmojiStickerAnimation(e)])}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>{const t=this.getAnimatedEmojiSticker(e,!0);if(t){const s=this.getAnimatedEmojiSoundDocument(e);return Promise.all([a.Z.downloadDoc(t),s?a.Z.downloadDoc(s):void 0])}}))}saveStickerSet(e,t){const s={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let i=this.storage.getFromCache(t);i?Object.assign(i,s):i=this.storage.setToCache(t,s),this.saveStickers(e.documents);const n=i.set.installed_date||I.has(t);i.refreshTime=Date.now(),this.storage.set({[t]:i},!n)}getStickerSetThumbDownloadOptions(e){var t;const s=e.thumbs.find((e=>"photoSize"===e._)),i=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:i,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:s.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return e.id===_?{_:"inputStickerSetAnimatedEmoji"}:e.id===y?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return v(this,void 0,void 0,(function*(){return(yield i.Z.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,p.Z)(e),(0,m.Z)(e.sets,((e,t,s)=>{e.set.pFlags.videos&&!f.Z&&s.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)})),e)})).sets}))}toggleStickerSet(e){return v(this,void 0,void 0,(function*(){if(e.installed_date){if(yield i.Z.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,n.default.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield i.Z.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,n.default.dispatchEvent("stickers_installed",e),!0;return!1}))}searchStickerSets(e,t=!0){return v(this,void 0,void 0,(function*(){const s=t?1:0,n=yield i.Z.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:s,exclude_featured:t||void 0,q:e},processResult:e=>((0,p.Z)(e),(0,m.Z)(e.sets,((e,t,s)=>{e.set.pFlags.videos&&!f.Z&&s.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)})),e)}),a=[],r=this.storage.getCache();for(let t in r){const{set:s}=r[t];s.title.toLowerCase().includes(e.toLowerCase())&&!n.sets.find((e=>e.set.id===s.id))&&a.push({_:"stickerSetCovered",set:s,cover:null})}return n.sets.concat(a)}))}getAllStickers(){return i.Z.invokeApiHashable({method:"messages.getAllStickers",processResult:e=>((0,p.Z)(e),(0,m.Z)(e.sets,((e,t,s)=>{e.pFlags.videos&&!f.Z&&s.splice(t,1)})),e)})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=u.Z.fixEmoji(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([i.Z.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,s,i])=>{const n=t.stickers.map((e=>a.Z.saveDoc(e))),r=[],o=[],d=t=>{for(const s of t)if(u.Z.fixEmoji(s.emoticon).includes(e))for(const e of s.documents){const t=a.Z.getDoc(e);(t.animated?r:o).push(t)}};if(i){d(i.packs);const e=i.stickers;[r,o].forEach((t=>{t.sort(((t,s)=>e.indexOf(t)-e.indexOf(s)))}))}for(const e of s)d(e.packs);const l=[...new Set(r.concat(o,n))];return(0,m.Z)(l,((e,t,s)=>{3!==e.sticker||f.Z||s.splice(t,1)})),l}))}pushRecentSticker(e){const t=u.Z.fixEmoji(e.stickerEmojiRaw);for(const s in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[s].then((i=>{const n=i.findAndSplice((t=>t.id===e.id));n?i.unshift(n):s.includes(t)&&i.unshift(e)}))}};o.GO.appStickersManager=P;const S=P},5555:(e,t,s)=>{s.d(t,{Z:()=>Z});var i=s(410),n=s(6690),a=s(1655),r=s(3725),o=s(467);function d(e){return e&&e.toLowerCase()||""}var l=s(632),c=s(6272),h=s(5880),u=s(3442),p=s(677),g=s(4727),f=s(9518),m=s(1507),v=s(8045),_=s(8598),y=s(3512),I=s(7381),P=s(5185),S=s(8138),M=s(6440),w=s(4687);const C=new class{constructor(){this.storage=w.default.storages.users,this.updateUsersStatuses=()=>{const e=(0,l.bz)(!0);for(const t in this.users){const s=this.users[t];this.updateUserStatus(s,e)}},this.clear(!0),setInterval(this.updateUsersStatuses,6e4),y.default.addEventListener("state_synchronized",this.updateUsersStatuses),y.default.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,s=this.users[t];s&&(s.status=e.status,s.status&&("expires"in s.status&&(s.status.expires-=v.Z.serverTimeOffset),"was_online"in s.status&&(s.status.was_online-=v.Z.serverTimeOffset)),y.default.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(s))},updateUserPhoto:e=>{var t,s;const i=e.user_id,n=this.users[i];if(n){if((null===(t=n.photo)||void 0===t?void 0:t.photo_id)===(null===(s=e.photo)||void 0===s?void 0:s.photo_id))return;this.forceUserOnline(i,e.date),"userProfilePhotoEmpty"===e.photo._?delete n.photo:n.photo=(0,u.Z)(n.photo,e.photo),this.setUserToStateIfNeeded(n),y.default.dispatchEvent("user_update",i),y.default.dispatchEvent("avatar_update",i.toPeerId())}else console.warn("No user by id:",i)},updateUserName:e=>{const t=e.user_id,s=this.users[t];s&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},s),{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),y.default.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),w.default.getState().then((e=>{const t=w.default.storagesResults.users;if(t.length)for(let e=0,s=t.length;e{this.pushContact(e)})),s.length&&(this.contactsFillPromise=(0,r.b)(),this.contactsFillPromise.resolve(this.contactsList))),w.default.addEventListener("peerNeeded",(e=>{if(!M.Z.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),w.default.addEventListener("peerUnneeded",(e=>{if(!M.Z.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}clear(e=!1){if(e)this.users={},this.usernames={};else{const e=w.default.storagesResults.users;for(const t in this.users){if(!t)continue;const s=t.toPeerId();if(!w.default.isPeerNeeded(s)){const s=this.users[t];s.username&&delete this.usernames[d(s.username)],e.findAndSplice((e=>e.id===t)),this.storage.delete(t),delete this.users[t]}}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1}onContactsModified(){const e=[...this.contactsList];w.default.pushToState("contactsList",e)}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,r.b)();return f.Z.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){return"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase(),this.usernames[e]?Promise.resolve(this.users[this.usernames[e]]):f.Z.invokeApi("contacts.resolveUsername",{username:e}).then((e=>(this.saveApiUsers(e.users),S.Z.saveApiChats(e.chats),M.Z.getPeer(M.Z.getPeerId(e.peer)))))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),w.default.requestPeerSingle(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),w.default.releaseSinglePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?g.default.format("SavedMessages",!0):"",t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,s="name"){return this.fillContacts().promise.then((i=>{let n=[...i];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===s?n.sort(((e,t)=>{const s=(this.users[e]||{}).sortName||"",i=(this.users[t]||{}).sortName||"";return s.localeCompare(i)})):"online"===s&&n.sort(((e,t)=>{const s=C.getUserStatusForSort(C.getUser(e).status);return C.getUserStatusForSort(C.getUser(t).status)-s}));const r=y.default.myId.toUserId();return(0,a.Z)(n,r),t&&this.testSelfSearch(e)&&n.unshift(r),n}))}getContactsPeerIds(e,t,s){return this.getContacts(e,t,s).then((e=>e.map((e=>e.toPeerId(!1)))))}toggleBlock(e,t){return f.Z.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:M.Z.getInputPeerById(e)}).then((s=>(s&&P.Z.processLocalUpdate({_:"updatePeerBlocked",peer_id:M.Z.getOutputPeer(e),blocked:t}),s)))}testSelfSearch(e){const t=this.getSelf(),s=this.createSearchIndex();return s.indexObject(t.id,this.getUserSearchText(t.id)),s.search(e).has(t.id)}createSearchIndex(){return new I.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=d(t.username);delete this.usernames[e]}if(e.username){const t=d(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var s,i;if("userEmpty"===e._)return;const n=e.id,a=this.users[n];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==a)return;if(this.setUserNameToCache(e,a),a&&void 0!==a.initials&&void 0!==a.sortName&&a.first_name===e.first_name&&a.last_name===e.last_name)e.sortName=a.sortName,e.initials=a.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,o.ZP)(t,!1),e.initials=_.o.getAbbreviation(t)}e.status&&(e.status.expires&&(e.status.expires-=v.Z.serverTimeOffset),e.status.was_online&&(e.status.was_online-=v.Z.serverTimeOffset));let r=!1,d=!1;if(void 0===a)this.users[n]=e;else{e.first_name===a.first_name&&e.last_name===a.last_name&&e.username===a.username||(d=!0),(null===(s=a.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(r=!0);const t=!!a.pFlags.contact,o=!!e.pFlags.contact;(0,u.Z)(a,e),y.default.dispatchEvent("user_update",n),t!==o&&this.onContactUpdated(n,o,t)}r&&y.default.dispatchEvent("avatar_update",e.id.toPeerId()),d&&y.default.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){w.default.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}formatUserPhone(e){return"+"+(0,c.u)(e).formatted}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,h.Z)(e)?e:this.users[e]||{id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(y.default.myId)}getUserStatusString(e){var t;let s,i;switch(e){case m.hj:s="Peer.RepliesNotifications";break;case m.yF:s="Peer.ServiceNotifications";break;default:{if(this.isBot(e)){s="Bot";break}const n=this.getUser(e);if(!n){s="";break}if(n.pFlags.support){s="SupportStatus";break}switch(null===(t=n.status)||void 0===t?void 0:t._){case"userStatusRecently":s="Lately";break;case"userStatusLastWeek":s="WithinAWeek";break;case"userStatusLastMonth":s="WithinAMonth";break;case"userStatusOffline":{const e=n.status.was_online,t=new Date,a=(t.getTime()/1e3|0)-e;if(a<60)s="Peer.Status.justNow";else if(a<3600)s="Peer.Status.minAgo",i=[a/60|0];else if(a<86400&&t.getDate()===new Date(1e3*e).getDate())s="LastSeen.HoursAgo",i=[a/3600|0];else{s="Peer.Status.LastSeenAt";const{dateEl:t,timeEl:n}=(0,l.rz)(e);i=[t,n]}break}case"userStatusOnline":s="Online";break;default:s="ALongTimeAgo"}break}}return(0,g.i18n)(s,i)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e.toPeerId()!==y.default.myId}hasUser(e,t){const s=this.users[e];return(0,h.Z)(s)&&(t||!s.pFlags.min)}canSendToUser(e){const t=this.getUser(e);return!t.pFlags.deleted&&t.id.toPeerId()!==m.hj}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,l.bz)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(P.Z.updatesState.syncLoading)return;const i=this.getUser(e);i&&i.status&&"userStatusOnline"!==i.status._&&"userStatusEmpty"!==i.status._&&!i.pFlags.support&&!i.pFlags.deleted&&(i.status={_:"userStatusOnline",expires:s+60},y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(i))}importContact(e,t,s){return this.importContacts([{first_name:e,last_name:t,phones:[s]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let s=0;s(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=w.default.getState().then((t=>{const s=t.topPeersCache[e];return s&&s.cachedTime+864e5>Date.now()&&s.peers?s.peers:f.Z.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((s=>{let i=[];return"contacts.topPeers"===s._&&(this.saveApiUsers(s.users),S.Z.saveApiChats(s.chats),s.categories.length&&(i=s.categories[0].peers.map((e=>{const t=M.Z.getPeerId(e.peer);return w.default.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:i,cachedTime:Date.now()},w.default.pushToState("topPeersCache",t.topPeersCache),i}))}))}getBlocked(e=0,t=0){return f.Z.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),S.Z.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,s,i=!1,n=0){const a={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:s};return f.Z.invokeApi("contacts.getLocated",{geo_point:a,background:i}).then((e=>(P.Z.processUpdateMessage(e),e)))}searchContacts(e,t=20){const s=_.o.parseEntities(e);if(s.length&&s[0].length===e.trim().length&&"messageEntityUrl"===s[0]._)try{const t=new URL(_.o.wrapUrl(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return f.Z.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),S.Z.saveApiChats(e.chats),{my_results:(0,n.Z)(e.my_results.map((e=>M.Z.getPeerId(e)))),results:e.results.map((e=>M.Z.getPeerId(e)))})))}onContactUpdated(e,t,s=this.isContact(e)){t!==s&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),y.default.dispatchEvent("contacts_update",e))}updateUsername(e){return f.Z.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const s=this.users[e];if(s){const i=t?{_:"userStatusOffline",was_online:(0,l.bz)(!0)}:{_:"userStatusOnline",expires:(0,l.bz)(!0)+50};s.status=i,y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s)}}addContact(e,t,s,i,n){return f.Z.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:s,phone:i,add_phone_privacy_exception:n}).then((t=>{P.Z.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return f.Z.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{P.Z.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}isRestricted(e){const t=this.getUser(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&(0,p.X)(s))}};i.GO.appUsersManager=C;const Z=C},646:(e,t,s)=>{s.d(t,{Z:()=>u});var i=s(3714),n=s(1592),a=s(8598),r=s(3512),o=s(410),d=s(3442),l=s(8456);const c=new Set(["photo","video","gif","document"]),h=new class{constructor(){this.webpages={},this.pendingWebPages={},r.default.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,s){var o,h;if("webPageNotModified"===e._)return;const{id:u}=e,p=this.webpages[u],g=p&&p._===e._&&p.hash==p.hash;if("webPage"===e._){"photo"===(null===(o=e.photo)||void 0===o?void 0:o._)?e.photo=i.Z.savePhoto(e.photo,s):delete e.photo,"document"===(null===(h=e.document)||void 0===h?void 0:h._)?e.document=n.Z.saveDoc(e.document,s):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let r=e.title||e.author||t||"";t&&r===t&&delete e.site_name,r=(0,l.Z)(r,80,100),e.rTitle=a.o.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let d="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(d=t[0]+"/issues/{1}")}const u=(0,l.Z)(e.description||"",150,180);e.rDescription=a.o.wrapRichText(u,{contextSite:t||"external",contextHashtag:d}),c.has(e.type)||e.description||!e.photo||(e.type="photo")}let f=this.pendingWebPages[u];if(t&&(f||(f=this.pendingWebPages[u]=new Set),f.add(t)),void 0===p?this.webpages[u]=e:(0,d.Z)(p,e),!t&&void 0!==f&&g){const e=[];f.forEach((t=>{const[s,i,n]=t.split("_");e.push({peerId:s.toPeerId(),mid:+i,isScheduled:!!n})})),r.default.dispatchEvent("webpage_updated",{id:u,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,s){return e+"_"+t+(s?"_s":"")}deleteWebPageFromPending(e,t){const s=e.id;if(!s)return;const i=this.pendingWebPages[s];i&&i.has(t)&&(i.delete(t),i.size||delete this.pendingWebPages[s])}getWebPage(e){return this.webpages[e]}};o.GO&&(o.GO.appWebPagesManager=h);const u=h},3075:(e,t,s)=>{s.d(t,{Z:()=>r});var i=s(5953),n=s(5003),a=s(6752);class r{constructor(e){var t;(0,i.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const s=new RTCPeerConnection(e);return s.addEventListener("track",(e=>{t("ontrack",e)})),s.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",s.signalingState)})),s.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",s.connectionState)})),s.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",s.signalingState)})),s.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),s.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",s.iceConnectionState)})),s.addEventListener("datachannel",(()=>{t("ondatachannel")})),s.log=t,{connection:s}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,s){s||(s=(0,n.kg)("RTCDataChannel"));const i=e.createDataChannel("data",t);return i.addEventListener("message",(e=>{s("onmessage",e)})),i.addEventListener("open",(()=>{s("onopen")})),i.addEventListener("close",(()=>{s("onclose")})),i.log=s,i}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},8500:(e,t,s)=>{s.d(t,{Z:()=>p});var i=s(3241),n=s(319),a=s(9125),r=s(9337),o=s(382),d=s(5424);function l(){const e={main:{},screen:{}};return t=>{return s=this,i=void 0,a=function*(){const{isScreen:s,constraints:i}=t,n=e[s?"screen":"main"];let a=n[i.audio?"audio":"video"];a||(a=(s?o.Z:d.Z)(i,t.muted),i.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),i.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{d(a.next(e))}catch(e){t(e)}}function o(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,o)}d((a=a.apply(s,i||[])).next())}));var s,i,n,a}}window.getStreamCached=l;var c=s(312),h=s(49),u=s(4081);class p extends i.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,s){const{streamManager:i}=this;if(i){const s=!e||this.isSharingAudio,i=!t||this.isSharingVideo;if(s&&i)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:s}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,r.Z)(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const s=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:s,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:s,source:i}){i||(i=u.Z.getSource(e,s)),this.log("tryAddTrack",e,t,s,i);const a="output"===s,{player:r,elements:o,streamManager:d}=this,l=t.kind,c="video"===l,h=c?i:l;let p=o.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),o.delete(h)}),{once:!0}),a&&d.addTrack(e,t,s);const g=c?e:d.outputStream;if(p)p.paused&&p.play().catch(n.Z),p.srcObject=g;else{if(p=document.createElement(l),p.autoplay=!0,p.srcObject=g,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}c?(p.setAttribute("playsinline","true"),p.muted=!0):r.appendChild(p),o.set(h,p)}return i}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:s}=this;t.addStream(e,"input"),s&&t.appendToConference(s)}}}},1677:(e,t,s)=>{s.d(t,{KM:()=>i,iK:()=>n});const i=50,n=100},9078:(e,t,s)=>{s.d(t,{Z:()=>T});var i=s(4762),n=s(1655),a=s(5953),r=s(6724),o=s(5185),d=s(2459),l=s(6440),c=s(5003),h=s(9518),u=s(1507),p=s(3512),g=s(8500),f=s(7625),m=s(3075),v=s(8479),_=s(6752),y=s(9124),I=s(4373),P=s(3773),S=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class M extends m.Z{constructor(e){super(e),this.negotiateThrottled=(0,r.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,s){return S(this,void 0,void 0,(function*(){const{groupCall:i,description:n}=this,a=i.id,r=t.map((t=>{const s=function(e,t){const s=(0,P.Z)(e,t),i=t.mediaType,n={source:s.source,sourceGroups:s.sourceGroups,type:i};s.fingerprint.setup="active";const a={fingerprints:[s.fingerprint],pwd:s.pwd,ssrc:s.source,"ssrc-groups":s.sourceGroups||[],ufrag:s.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:s.source,media:t,sourceGroups:s.sourceGroups,entry:n}}(e,t);return this.sources[s.entry.type]=s.entry,s}));let l;const c=r.find((e=>"audio"===e.media.mediaType)),u=r.find((e=>"video"===e.media.mediaType));let{source:g,params:m}=c||{};const v=u||c,_={audio:c,video:u};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=_[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,p.default.myId)}})),m!==v.params){const e=JSON.parse(v.params.data);g?e.ssrc=g:delete e.ssrc,m={_:"dataJSON",data:JSON.stringify(e)}}const y=d.Z.getGroupCallInput(a);if("main"===s.type){const e={call:y,join_as:{_:"inputPeerSelf"},params:m,muted:s.isMuted,video_stopped:!s.joinVideo};l=h.Z.invokeApi("phone.joinGroupCall",e),this.log(`[api] joinGroupCall id=${a}`,e)}else{const e={call:y,params:m};l=h.Z.invokeApi("phone.joinGroupCallPresentation",e),this.log(`[api] joinGroupCallPresentation id=${a}`,e)}const I=yield l;o.Z.processUpdateMessage(I);const S=I.updates.find((e=>"updateGroupCallConnection"===e._)),M=JSON.parse(S.params.data);return M.audio=M.audio||i.connections.main.description.audio,n.setData(M),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,s])=>{const i=e.find((e=>e.mediaType===s));if(!i)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const s=e.key.split("/",1)[0];t[s]=e.value})),t})(i);(0,f.Z)(t["rtp-hdrexts"],((e,t,i)=>{n[e.id]!==e.uri&&(i.splice(t,1),console.log("[sdp] filtered extmap:",e,t,s))}))}))}(t,M),M}))}negotiateInternal(){return S(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,s="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,i=this.log.bindPrefix("startNegotiation");i("start");const n=yield e.createOffer({iceRestart:!1});s&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:r}=function(e){const{offer:t,data:s}=e,i=(0,y.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,y.e6)(i)||n),(0,f.Z)(i.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const r=e.mediaLine,o=r.mediaLineParts,d=(o.ids,r.toString()),l=s[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,I.Px)(e.mediaType,void 0,l)){const r=(0,P.Z)(i,e);let d=Object.assign({},s);d.transport=(0,v.Z)(d.transport),d.transport.ufrag=r.ufrag,d.transport.pwd=r.pwd,d.transport.fingerprints=[r.fingerprint],d.transport.candidates=[];const l=new _.Lp(r.mid,o.type);l.setPort(o.port),r.source&&l.setSource(r.sourceGroups||r.source),l.setDirection(e.direction);const c=(new I.DY).addSsrcEntry(l,d).finalize(),h=(0,y.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=i.toString();t.sdp=e}return{offer:t,sdp:i}}({offer:n,data:t});i("[sdp] setLocalDescription",r.sdp),yield e.setLocalDescription(r);const o=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(s)try{yield this.invokeJoinGroupCall(a,o,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,f.Z)(l,((e,s,i)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(i.splice(s,1),d.push(n))}));const c=a.media.map((e=>{const s=e.mid;let i=t.getEntryByMid(s);return i||(i=new _.Lp(s,e.mediaType),i.setDirection("inactive")),i})),h={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),i(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,h.sdp),yield e.setRemoteDescription(h),i("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,s;"video"===(null===(s=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===s?void 0:s.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:s}=t;e.onStageEndpoints.push(s),e.constraints[s]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var w=s(2207),C=s(9337),Z=s(382),b=s(5424),k=s(312),E=s(49),A=s(4081),D=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function r(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class T extends g.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,c.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,r.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||i.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return d.Z.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return u.NM===e?this.participant:this.participants.get(e)}toggleMuted(){return this.requestAudioSource(!0).then((()=>d.Z.toggleMuted()))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let s;s=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const i=this.getElement(s);if(!i)return;const n=i.cloneNode();return n.srcObject=i.srcObject,{video:n,source:s}}createConnectionInstance(e){return this.connections[e.type]=new M(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type)},e))}changeRaiseHand(e){return d.Z.editParticipant(this.id,this.participant,{raiseHand:e})}startScreenSharingInternal(){return D(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,Z.Z)((0,C.Z)()),s=new A.Z,i=this.createConnectionInstance({streamManager:s,type:e,options:{type:e}});i.createPeerConnection().addEventListener("negotiationneeded",(()=>{i.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),i.createDescription(),i.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){return this.startScreenSharingPromise||(this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0})))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,d.Z.saveApiParticipant(this.id,this.participant),h.Z.invokeApi("phone.leaveGroupCallPresentation",{call:d.Z.getGroupCallInput(this.id)}).then((e=>{o.Z.processUpdateMessage(e)}))):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return D(this,void 0,void 0,(function*(){const e={video:(0,k.Z)()};try{const t=yield(0,b.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield d.Z.editParticipant(this.id,this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){return this.startVideoSharingPromise||(this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0})))}stopVideoSharing(){return D(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,E.Z)(t),e.streamManager.appendToConference(e.description),yield d.Z.editParticipant(this.id,this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,s=!1){return D(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!s&&!t){let t;const s=d.Z.getGroupCallInput(this.id);if(e)this.log(`[api] discardGroupCall id=${this.id}`),t=h.Z.invokeApi("phone.discardGroupCall",{call:s});else if(this.joined){this.log(`[api] leaveGroupCall id=${this.id}`);const e=this.connections.main;t=h.Z.invokeApi("phone.leaveGroupCall",{call:s,source:e.sources.audio.source})}else this.log(`[api] id=${this.id} payload=null`),t=h.Z.invokeApi("phone.joinGroupCall",{call:s,join_as:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}});const i=yield t;o.Z.processUpdateMessage(i)}}))}tryAddTrack(e){const{description:t}=this,s=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+s),i=this.participants.get(e.peerId);i&&p.default.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:i})}return s}onParticipantUpdate(e,t){const s=this.connections.main,{connection:i,description:n}=s,a=l.Z.getPeerId(e.peer),r=!!e.pFlags.left,o=this.participantsSsrcs.get(a)||[];if(e.presentation&&!r){const{source:t}=d.Z.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,s.sources.audio.source!==e.source&&this.hangUp();let i=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(i=!0):(this.stopScreenSharing(),this.stopVideoSharing(),i=!0),i&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const c=r?[]:d.Z.makeSsrcsFromParticipant(e);r?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,c);const h=new Set;o.forEach((e=>{const t=e.source;if(!c.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),h.add(e.type))}})),c.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),h.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(i,{direction:"recvonly"}),h.add(t.type))})),h.size&&(h.has("video")&&(s.updateConstraints=!0),s.negotiateThrottled())}}},2207:(e,t,s)=>{var i;s.d(t,{Z:()=>n}),function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(i||(i={}));const n=i},9125:(e,t,s)=>{function i(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach((t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)})),e}s.d(t,{Z:()=>i})},9337:(e,t,s)=>{function i(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}s.d(t,{Z:()=>i})},382:(e,t,s)=>{s.d(t,{Z:()=>i});function i(e){return t=this,s=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((i=void 0)||(i=Promise))((function(e,a){function r(e){try{d(n.next(e))}catch(e){a(e)}}function o(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(r,o)}d((n=n.apply(t,s||[])).next())}));var t,s,i,n}},5424:(e,t,s)=>{s.d(t,{Z:()=>i});function i(e,t){return s=this,i=void 0,a=function*(){const s=yield navigator.mediaDevices.getUserMedia(e);return s.getTracks().forEach((e=>{e.enabled=!t})),s},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{d(a.next(e))}catch(e){t(e)}}function o(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,o)}d((a=a.apply(s,i||[])).next())}));var s,i,n,a}window.getStream=i},312:(e,t,s)=>{function i(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}s.d(t,{Z:()=>i})},3773:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(8957);function n(e,t){const s=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!s.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));s.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...s]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:s.map((e=>(0,i.Fk)(+e)))}}));return t.length?t:void 0}(s["ssrc-group"]),[a,r]=s.fingerprint.split(" ",2),o=s.ssrc&&(0,i.Fk)(+s.ssrc.split(" ",1)[0]);return{raw:s,ufrag:s["ice-ufrag"],pwd:s["ice-pwd"],fingerprint:{fingerprint:r,setup:s.setup,hash:a},source:o,sourceGroups:n,mid:s.mid}}},49:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(6669);function n(e){e.stop(),(0,i.Z)(e,"ended")}},6752:(e,t,s)=>{s.d(t,{Lp:()=>r,ZP:()=>d,z_:()=>o});var i=s(1655),n=s(5953),a=s(4373);class r{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver((0,a.pl)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function o(e,t,s){let i;if(Array.isArray(t)){if(!t[0])return;i=t,t=i[0].sources[0]}return{endpoint:s,type:e,source:t,sourceGroups:i}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,s=new r(t,e);return this.entries.push(s),this.entriesByMid.set(t,s),s}deleteEntry(e){(0,i.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let s=this.entriesByPeerId.get(t);s||this.entriesByPeerId.set(t,s=new Set),s.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let s=this.entries.find((s=>"sendrecv"===s.direction&&s.type===e&&!(t?s.sendEntry:s.recvEntry)));return s||(s=this.createEntry(e),s.setDirection("sendrecv")),s}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,s)=>{s.d(t,{e6:()=>de,DV:()=>re});var i,n,a=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},r=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class o{constructor(e,t){i.set(this,void 0),n.set(this,void 0),a(this,i,e,"f"),a(this,n,t,"f")}get session(){return r(this,i,"f")}get media(){return r(this,n,"f")}get bundle(){return this.session.lines.find((e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)})).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map((e=>e.lines))).map((e=>e.toString())).join("\r\n")+"\r\n"}}function d(e,t,s){const i=e.split(t),n=[];for(;s>0&&i.length;)n.push(i.shift()),--s;return i.length&&n.push(i.join(t)),n}i=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},p=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class g{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,c,"f"),t=p(this,h,"f"),s=p(this,l,"f"),i=t-e+1;let n=Math.floor(e+i*Math.random()),a=0;for(;s.has(n);)if(n=i)return null;return s.add(n),n}add(e){p(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var f,m,v=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},_=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class y{constructor(e,t){f.set(this,void 0),m.set(this,void 0),v(this,f,e,"f"),v(this,m,t,"f")}get key(){return _(this,f,"f")}get value(){return _(this,m,"f")}}f=new WeakMap,m=new WeakMap;var I,P,S,M,w=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},C=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class Z{constructor(e,t,s,i){I.set(this,void 0),P.set(this,void 0),S.set(this,void 0),M.set(this,void 0),w(this,I,e,"f"),w(this,P,t,"f"),w(this,S,s,"f"),w(this,M,i,"f")}get type(){return C(this,I,"f")}get port(){return C(this,P,"f")}get protocol(){return C(this,S,"f")}get ids(){return C(this,M,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}I=new WeakMap,P=new WeakMap,S=new WeakMap,M=new WeakMap;var b,k,E,A,D=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},T=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class F{constructor(e,t){if(b.set(this,void 0),k.set(this,void 0),E.set(this,void 0),A.set(this,void 0),D(this,b,e,"f"),"string"==typeof t){if(D(this,k,t,"f"),"m"===e){const e=t.split(" ");D(this,E,new Z(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],D(this,A,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof Z?(D(this,E,t,"f"),D(this,k,t.toString(),"f")):t instanceof y&&(D(this,A,t,"f"),D(this,k,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return T(this,b,"f")}get value(){return T(this,k,"f")}get parsed(){return T(this,A,"f")}get mediaLineParts(){return T(this,E,"f")}toString(){return`${this.key}=${this.value}`}}b=new WeakMap,k=new WeakMap,E=new WeakMap,A=new WeakMap;var U,x,L,R,O,N,B=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},j=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class G{constructor(e,t,s=":",i=!1){U.set(this,void 0),x.set(this,void 0),L.set(this,void 0),R.set(this,void 0),O.set(this,void 0),N.set(this,void 0),B(this,U,e,"f"),B(this,x,t,"f"),B(this,L,s,"f"),B(this,O,i,"f"),B(this,R,i?new Map:null,"f"),B(this,N,i?[]:null,"f")}get lines(){return j(this,x,"f")}get value(){return j(this,O,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!j(this,O,"f")}get key(){return j(this,U,"f")}get keys(){return G.fill(this),j(this,N,"f")}forEach(e){G.fill(this),j(this,R,"f").forEach(e)}get(e){return G.fill(this),j(this,R,"f").get(e)||new G(e,[],":",!0)}static fill(e){if(null!==j(e,R,"f"))return;const t=new Map;e.lines.forEach((s=>{const[i,n]=d(s,j(e,L,"f"),1),a=t.get(i)||[];t.set(i,[...a,n||""])}));const s=B(e,R,G.makeAttributes(t),"f");B(e,N,Array.from(s.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,s)=>{t.set(s,new G(s,e))})),t}}U=new WeakMap,x=new WeakMap,L=new WeakMap,R=new WeakMap,O=new WeakMap,N=new WeakMap;var H,z,q=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},V=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class W{constructor(e){H.set(this,void 0),z.set(this,void 0),q(this,H,e,"f"),q(this,z,new Map,"f"),W.fillAttributes(this)}get(e){return V(this,z,"f").get(e)||new G(e,[]," ",!0)}static fillAttributes(e){const t=new Map;V(e,H,"f").forEach((e=>{if("a"===e.key){const{key:s,value:i}=e.parsed;let n=t.get(s);n||(n=[],t.set(s,n)),n.push(i||"")}})),t.forEach(((t,s)=>{V(e,z,"f").set(s,new G(s,t," ",!1))}))}}H=new WeakMap,z=new WeakMap;var $,K,J,Q,Y=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},X=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),K.set(this,void 0),J.set(this,void 0),Q.set(this,void 0),Y(this,$,e,"f"),Y(this,K,e[0],"f"),Y(this,J,Y(this,Q,null,"f"),"f")}get lines(){return X(this,$,"f")}get mediaLine(){return X(this,K,"f")}get mediaLineParts(){return X(this,K,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!X(this,Q,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",Y(this,Q,t,"f")}return X(this,Q,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return X(this,J,"f")||Y(this,J,new W(this.lines),"f"),X(this,J,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const s in e){const i=this.attributes.get(s),n=!e[s];t[s]=i?n?i.lines:i.value:n?[]:void 0}return t}}$=new WeakMap,K=new WeakMap,J=new WeakMap,Q=new WeakMap;var te,se,ie=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},ne=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),se.set(this,void 0),ie(this,te,e,"f"),ie(this,se,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,se,"f")}}function re(e){function t(){s?i.push(new ee(n)):s=new ae(n)}let s=null,i=[],n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const s=oe(e);"m"===s.key&&(t(),n=[]),n.push(s)}})),t(),new o(s,i)}function oe(e){const t=d(e,"=",1);return new F(t[0],t[1])}function de(e){let t;return e.media.forEach(((s,i)=>{if("video"===s.mediaType&&s.isSending&&!s.attributes.get("ssrc-group").get("SIM").exists){t||(t=new g(2,4294967295));const n=s.attributes.get("ssrc-group").get("FID").value.split(" "),a=s.lines;n.forEach((e=>t.add(+e)));const r=[n[0],t.generate(),t.generate()],o=[n[1],t.generate(),t.generate()];a.push(oe("a=ssrc-group:SIM "+r.join(" ")));const d=s.attributes.get("ssrc").get(n[0]).lines;r.forEach(((e,t)=>{const s=o[t];t>0&&(a.push(oe("a=ssrc-group:FID "+e+" "+s)),d.forEach((t=>{a.push(oe("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(oe("a=ssrc:"+s+" "+e))})))})),e.media[i]=new ee(a)}})),!!t}te=new WeakMap,se=new WeakMap},4373:(e,t,s)=>{s.d(t,{DY:()=>c,Px:()=>l,_D:()=>r,pl:()=>o});var i=s(4762),n=s(630),a=s(8957);const r="9";function o(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=r,s){const i=d(e);return`m=${o(e)} ${t} ${i} ${s.join(" ")}`}class c extends n.Z{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const s=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${s}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:s,sourceGroups:i}=e;const n=(0,a.h)(e.source);t+=n,s+=n;const r=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${s}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${s}`)};return(()=>{this.add(`a=msid:${t} ${s}`)})(),(null==i?void 0:i.length)?i.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(r)}})):r(n),this}addSsrcEntry(e,t,s){const i=(...e)=>this.add(...e),{type:n,mid:a,direction:r,port:c}=e,h=t.transport,u="application"===n,p=u?void 0:t[n],g="inactive"===r;if(e.shouldBeSkipped(s))return i(`m=${o(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const f=u?[{id:5e3}]:p["payload-types"],m=f.map((e=>e.id));i(l(n,c,m),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&i("a=rtcp-mux"),i(`a=mid:${a}`);let v=r;if("sendrecv"===r||!s||g||u||(v="sendonly"===r?"recvonly":"sendonly"),i(`a=${v}`),this.addTransport(h),u)i(`a=sctpmap:${f[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{i(`a=extmap:${e.id} ${e.uri}`)})),f.forEach((e=>{i(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const s=[];for(const e in t)s.push(`${e}=${t[e]}`);i(`a=fmtp:${e.id} ${s.join(";")}`)}const s=e["rtcp-fbs"];(null==s?void 0:s.length)&&s.forEach((t=>{i(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:s,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),i.IS_FIREFOX&&this.addTransport(t.transport);for(const e of s)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},4081:(e,t,s)=>{s.d(t,{Z:()=>c});var i=s(5003),n=s(3512),a=s(1677),r=s(49),o=s(4373),d=s(8957);class l{constructor(e,t){const s=this.streamSource=e.createMediaStreamSource(t),i=this.analyser=e.createAnalyser();this.gain=e.createGain(),i.minDecibels=-100,i.maxDecibels=-30,i.smoothingTimeConstant=.05,i.fftSize=1024,s.connect(i)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:s,track:i,source:n,type:a}=e,r=t.analyser;if(!r)return;const o=new Uint8Array(r.frequencyBinCount);return r.getByteFrequencyData(o),{type:a,source:n,stream:s,track:i,value:(0,d.UN)(o)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter((e=>"input"===e.type))).filter((e=>"audio"===e.kind)).slice(0,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),n.default.dispatchEvent("group_call_amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,i.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((s=>{this.addTrack(e,s,t)}))}addTrack(e,t,s){this.log("addTrack",s,t,e);const{context:i,items:n,inputStream:a,outputStream:r}=this,o=t.kind,d=c.getSource(e,s);switch(s){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let s=!1;for(let i=0,n=t.length;!s&&i[e,n])),r=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===s&&e.type===t));if(!a){if(!i)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,o.pl)(t),c=r.findIndex((e=>e.kind===l)),h=-1!==c?r.splice(c,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{(0,r.Z)(e)}))}catch(e){this.log.error(e)}}}},630:(e,t,s)=>{s.d(t,{Z:()=>i});class i{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}},8957:(e,t,s)=>{function i(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:s}=e;let i=0;for(let t=0;ti,UN:()=>a,h:()=>n})},2003:(e,t,s)=>{s.d(t,{Z:()=>u});var i=s(7223),n=s(3847),a=s(410),r=s(9518),o=s(8938),d=s(5003),l=s(1549),c=s(6848);const h=new class{constructor(){this.contexts=new Map,this.links={},this.log=(0,d.kg)("RD",void 0,!0),r.Z.addTaskListener("refreshReference",(e=>{const t=e.payload;(0,o.Z)(e),e.originalPayload=t,this.refreshReference(t).then((t=>{e.payload=t}),(t=>{e.error=t})).then((()=>r.Z.postMessage(e)))}))}saveContext(e,t,s){[s,e]=this.getContexts(e),s||(s=new Set,this.contexts.set(e,s)),this.links[(0,l.Z)(e)]=e;for(const e of s)if((0,c.Z)(e,t))return;s.add(t)}getReferenceByLink(e){return this.links[(0,l.Z)(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,s){if([s,e]=this.getContexts(e),s)for(const i of s)if((0,c.Z)(i,t))return s.delete(i),s.size||(this.contexts.delete(e),delete this.links[(0,l.Z)(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const s=this.getContext(e);if(!s)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=s}let s;switch(null==t?void 0:t.type){case"message":s=i.Z.wrapSingleMessage(t.peerId,t.messageId,!0);break;case"emojiesSounds":s=this.refreshEmojiesSoundsPromise||n.Z.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const a=(0,l.Z)(e);return this.log("refreshReference: refreshing reference:",a),s.then((()=>{const s=(0,l.Z)(e);if(this.log("refreshReference: refreshed, reference before:",a,"after:",s),a!==s)return e;this.deleteContext(e,t);const i=this.getContext(e);if(i)return this.refreshReference(e,i[0]);throw this.log.error("refreshReference: no new context, reference before:",a,"after:",s,t),"NO_NEW_CONTEXT"}))}};a.GO.referenceDatabase=h;const u=h},8045:(e,t,s)=>{s.d(t,{Z:()=>o});var i=s(410),n=s(7487),a=s(9518);const r=new class{constructor(){this.serverTimeOffset=0,n.Z.get("server_time_offset").then((e=>{e&&(this.serverTimeOffset=e)})),a.Z.addTaskListener("applyServerTimeOffset",(e=>{this.serverTimeOffset=e.payload}))}};i.GO&&(i.GO.serverTimeManager=r);const o=r},9043:(e,t,s)=>{s.d(t,{Z:()=>o});var i=s(410),n=s(4762),a=s(5003);const r=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,a.kg)("OPUS",a.v9.Error)}isPlaySupported(){if(void 0!==this.isPlaySupportedResult)return this.isPlaySupportedResult;const e=document.createElement("audio");return this.isPlaySupportedResult=!(!e.canPlayType||!e.canPlayType("audio/ogg;").replace(/no/,""))}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},n.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},n.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((s,i)=>{const n={pages:e,withWaveform:t,callback:{resolve:s,reject:i},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(n)&&this.executeNewTask(n)}))}decode(e,t=!1){return s=this,i=void 0,a=function*(){return this.pushDecodeTask(e,t).then((e=>{const t=new Blob([e.bytes],{type:"audio/wav"});return{url:URL.createObjectURL(t),waveform:e.waveform}}))},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{d(a.next(e))}catch(e){t(e)}}function o(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,o)}d((a=a.apply(s,i||[])).next())}));var s,i,n,a}};i.GO.opusDecodeController=r;const o=r},7381:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(467);class n{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=(0,i.gV)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}search(e){const t=this.fullTexts;this.options&&(e=(0,i.gV)(e,this.options));const s=[],n=e.split(" "),a=n.length;return t.forEach(((e,t)=>{let i=!0,r=0;for(let t=0;te.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars)),new Set(s.map((e=>e.what)))}}}}]); -//# sourceMappingURL=714.57babe030f5e6d0e0a5d.chunk.js.map \ No newline at end of file diff --git a/public/714.57babe030f5e6d0e0a5d.chunk.js.map b/public/714.57babe030f5e6d0e0a5d.chunk.js.map deleted file mode 100644 index 6173ad02..00000000 --- a/public/714.57babe030f5e6d0e0a5d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"714.57babe030f5e6d0e0a5d.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/files.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/object/defineNotNumerableProperties.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/lib/mtproto/serverTimeManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/searchIndex.ts"],"sourcesContent":["/*\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\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\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 { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise\r\n};\r\n\r\ntype LazyLoadElement = Omit & {\r\n load: (target?: HTMLElement) => Promise,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n protected lockPromise: Promise = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return this.queue.findAndSplice(item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\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 clamp from \"../helpers/number/clamp\";\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet timeoutId: number;\r\n\r\nconst setTestQueue = () => {\r\n cancelAnimationFrame(timeoutId);\r\n timeoutId = window.requestAnimationFrame(testQueueElements);\r\n};\r\n\r\nconst testQueueElements = () => {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nconst testElement = (element: HTMLElement) => {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = element.getBoundingClientRect().width;\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = element.getBoundingClientRect().width;\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = element.getBoundingClientRect().width;\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n};\r\n\r\nlet context: CanvasRenderingContext2D;\r\n/**\r\n * Get the text width\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\nfunction getTextWidth(text: string, font: string) {\r\n //const perf = performance.now();\r\n if(!context) {\r\n const canvas = document.createElement('canvas');\r\n context = canvas.getContext('2d');\r\n context.font = font;\r\n }\r\n\r\n //context.font = font;\r\n const metrics = context.measureText(text);\r\n //console.log('getTextWidth perf:', performance.now() - perf);\r\n return metrics.width;\r\n //return Math.round(metrics.width);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n testQueue.add(this);\r\n setTestQueue();\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\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 appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport limitSymbols from \"../helpers/string/limitSymbols\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean,\r\n limitSymbols?: number\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public fromName: string;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n public limitSymbols: number;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n let fromName = this.fromName;\r\n if(fromName !== undefined) {\r\n if(this.limitSymbols !== undefined) {\r\n fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols);\r\n }\r\n\r\n this.element.innerHTML = RichTextProcessor.wrapEmojiText(fromName);\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n this.element.innerHTML = appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\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 { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\n(window as any).IS_WEBM_SUPPORTED = IS_WEBM_SUPPORTED;\nexport default IS_WEBM_SUPPORTED;\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\n const sortProperty: number = element[property];\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n \n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= array[len - 1][property]) {\n return array.push(element) - 1;\n } else if(sortProperty >= array[0][property]) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > array[i][property]) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\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\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n \n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\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 { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: T;\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\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 fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n \r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(isFilterAvailable) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n \r\n resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const promise = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n if(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\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 {Awaited} from '../types';\n\nexport default function callbackify, R>(\n smth: T, \n callback: (result: Awaited) => R\n): PromiseLike | R {\n if(smth instanceof Promise) {\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from \"../lib/config\";\n\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = Config.LatinizeMap[ch];\n return latinizeCh !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n return text;\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\nexport default function htmlToDocumentFragment(html: string) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\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 htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\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\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: (err?: Event) => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', (err) => {\n console.error('Render image from url failed:', err, url, loader);\n callback();\n });\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\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 { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport { pause } from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\r\n return promise;\r\n}\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","/*\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 I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map(d => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\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 type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\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// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join(\".\");\n}\n","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n //const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach(name => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","export default function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key \n * @param wasObject \n * @param newObject \n */\n export default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n //if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n //}\n }\n \n return wasObject;\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n new(...items: ItemType[]): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as number[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: ItemType[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: ItemType[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(slice[0] > s[0]) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: ItemType) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: number) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; offset++) {\r\n if(maxId >= slice[offset]) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: number, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: ItemType[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: ItemType[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: ItemType) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\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\nexport class WindowSize {\n public width = 0;\n public height = 0;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach() {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(() => {\n fetch('changelogs/' + newVersion.split(' ')[0] + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n this.processLocalUpdate(update);\n })\n .catch(noop);\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\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 { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n }\n\n const downloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: string, color: string, icon: string) {\n div.innerHTML = innerHTML;\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false, isBig?: boolean) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nexport default appAvatarsManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport copy from \"../../helpers/object/copy\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport { isRestricted } from \"../../helpers/restrictions\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n chats.findAndSplice((chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n chat.initials = RichTextProcessor.getAbbreviation(chat.title);\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n (chat as Chat.chat).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n || (chat as Chat.chat).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: Array) {\n return apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public isRestricted(chatId: ChatId) {\n const chat: Chat.channel = this.getChat(chatId);\n const restrictionReasons = chat.restriction_reason;\n\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public getSendAs(channelId: ChatId) {\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs', \n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n appUsersManager.saveApiUsers(sendAsPeers.users);\n appChatsManager.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!IS_WEBM_SUPPORTED) {\n return;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.fileName = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = doc.fileName = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public isSavingLottiePreview(doc: MyDocument, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n return !!this.savingLottiePreview[key];\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\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 rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities});\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { GroupCall, GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup, InputGroupCall, Peer, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport GroupCallInstance from \"../calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../calls/groupCallState\";\nimport createMainStreamManager from \"../calls/helpers/createMainStreamManager\";\nimport { generateSsrc } from \"../calls/localConferenceDescription\";\nimport { WebRTCLineType } from \"../calls/sdpBuilder\";\nimport StreamManager from \"../calls/streamManager\";\nimport { Ssrc } from \"../calls/types\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nlet IS_MUTED = true;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\n\nexport class AppGroupCallsManager {\n private log: ReturnType;\n \n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n \n // private audioAsset: AudioAsset;\n \n private currentGroupCall: GroupCallInstance;\n private connectionAudio: HTMLAudioElement;\n private doNotDispatchParticipantUpdate: PeerId;\n private audioAsset: AudioAssetPlayer;\n\n constructor() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n rootScope.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.hangUp(false, false, true);\n }\n\n this.participants.delete(groupCall.id);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const {currentGroupCall} = this;\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n const isCurrentGroupCall = currentGroupCall?.id === groupCallId;\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n if(isCurrentGroupCall) {\n currentGroupCall.onParticipantUpdate(participant, this.doNotDispatchParticipantUpdate);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant && this.doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach(p => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n let processUpdate = true;\n if(participant) {\n const {currentGroupCall} = this;\n const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !currentGroupCall.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = this.generateSelfVideo(currentGroupCall.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n currentGroupCall.setMuted(false);\n }\n\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n }\n\n rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : appPeersManager.getPeerId(participant.peer);\n const updates = await apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: appGroupCallsManager.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? appPeersManager.getInputPeerSelf() : appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n if(!processUpdate) this.doNotDispatchParticipantUpdate = appPeersManager.getPeerId(participant.peer);\n apiUpdatesManager.processUpdateMessage(updates);\n if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n appUsersManager.saveApiUsers(groupCall.users);\n appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n \n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n \n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n rootScope.dispatchEvent('group_call_instance', groupCall);\n }\n /* TdLibController.clientUpdate({\n '@type': 'clientUpdateGroupCall',\n call\n }); */\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await apiManager.invokeApi('phone.createGroupCall', {\n peer: appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n \n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n \n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\n }\n\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n \n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n \n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n \n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n \n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n \n case 'completed': {\n break;\n }\n \n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n \n this.getGroupCallParticipants(groupCallId).then(({participants}) => {\n this.saveApiParticipants(groupCallId, [...participants.values()]);\n });\n }\n \n break;\n }\n \n case 'disconnected': {\n break;\n }\n \n case 'failed': {\n //TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n \n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n \n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n public generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n }\n \n public generateSelfParticipant(): GroupCallParticipant {\n const mainSources = this.currentGroupCall.connections.main.sources;\n const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n return {\n _: 'groupCallParticipant',\n pFlags: {\n can_self_unmute: true,\n self: true\n },\n source: mainSources.audio.source,\n video: this.generateSelfVideo(mainSources.video),\n presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n date: tsNow(true),\n peer: appPeersManager.getOutputPeer(rootScope.myId)\n };\n }\n\n public makeSsrcsFromParticipant = (participant: GroupCallParticipant) => {\n return [\n this.makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && this.makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && this.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n };\n\n public makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n appChatsManager.saveApiChats(groupCallParticipants.chats);\n appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public async hangUp(groupCallId: GroupCallId, discard = false, rejoin = false) {\n this.log(`hangUp start id=${groupCallId} discard=${discard} rejoin=${rejoin}`);\n const {currentGroupCall} = this;\n if(currentGroupCall?.id !== groupCallId) return;\n\n currentGroupCall.hangUp(discard, rejoin);\n }\n\n public toggleMuted(muted?: boolean) {\n return this.changeUserMuted(NULL_PEER_ID, muted);\n }\n \n public changeUserMuted(peerId: PeerId, muted?: boolean) {\n const {currentGroupCall} = this;\n if(!currentGroupCall) return;\n\n const participant = currentGroupCall.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(currentGroupCall.id, participant, {muted});\n }\n}\n\nconst appGroupCallsManager = new AppGroupCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appGroupCallsManager = appGroupCallsManager);\nexport default appGroupCallsManager;\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 { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../constants\";\nimport StreamManager from \"../streamManager\";\nimport getAudioConstraints from \"./getAudioConstraints\";\nimport getStream from \"./getStream\";\nimport getVideoConstraints from \"./getVideoConstraints\";\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n \n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport rootScope from \"../rootScope\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\nimport AppStorage from \"../storage\";\nimport type DATABASE_STATE from \"../../config/databases/state\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\nimport defineNotNumerableProperties from \"../../helpers/object/defineNotNumerableProperties\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processDialogForFilters(dialog);\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, -1);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\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 { DialogFilter, Update } from \"../../layer\";\nimport type { Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport copy from \"../../helpers/object/copy\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear(true);\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n } else {\n this.filters = {};\n this.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(peers?.length) {\n const reloadDialogs = peers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';//'\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n let overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach(part => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n \n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { randomLong } from \"../../helpers/random\";\nimport { Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\nimport './appGroupCallsManager';\nimport appGroupCallsManager from \"./appGroupCallsManager\";\nimport appReactionsManager from \"./appReactionsManager\";\nimport { getRestrictionReason, isRestricted } from \"../../helpers/restrictions\";\nimport copy from \"../../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport escapeRegExp from \"../../helpers/string/escapeRegExp\";\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport splitStringByLength from \"../../helpers/string/splitStringByLength\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: any) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true,\n sendAsPeerId: PeerId,\n }> = {}) {\n if(!text.trim()) {\n return Promise.resolve();\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n //this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n //this.log('sendText sent', message.mid);\n //if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n //assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(error);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n return Promise.all(promises).then(inputs => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n sendAsPeerId: PeerId, \n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n promise: options.groupId === undefined ? deferredPromise() : undefined\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n \n if(fromId.isUser()) {\n const userFull = appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === rootScope.myId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n fullfillLeft();\n resolve();\n }, (err) => {\n fullfillLeft();\n reject(err);\n }).finally(() => {\n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getGroupsFirstMessage(message: Message.message): Message.message {\n if(!message.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return storage.get(minMid);\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message) {\n if((message as Message.message)?.grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(isMessage && message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id.toPeerId();\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from as MessageFwdHeader;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find(entity => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n if(isMessage && message.media) {\n let unsupported = false;\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = message.media.document;\n message.media.document = appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!message.media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n unsupported = true;\n message.media = {_: 'messageMediaUnsupported'};\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n\n if(unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed'\n ? 'missed'\n : 'cancelled'\n )\n );\n break;\n }\n \n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n \n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const isRestricted = this.isRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = this.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n if(document.stickerEmojiRaw) {\n addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\n }\n \n addPart('AttachSticker');\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name));\n }\n \n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n /* for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n } */\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(RichTextProcessor.wrapPlainText(text, entities));\n } else {\n // let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n \n if(found) {\n RichTextProcessor.sortEntities(entities);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped) as any);\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n ...this.getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n }\n\n public wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n }\n\n private wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = RichTextProcessor.wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n }\n\n private wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n element.innerHTML = RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true});\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain)),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n try {\n return this.wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n this.log.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peer_id._ !== 'peerChannel' && \n message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.pFlags.out \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise {\n if(appPeersManager.isRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n excludeDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = storage.get(history[i]);\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(appPeersManager.isRestricted(peerId)) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilter(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0] as Message.message, message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then(messages => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private getNotifyPeerSettings(peerId: PeerId) {\n return Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: appNotificationsManager.isPeerLocalMuted(peerId, true),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if(muted || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = appMessagesIdsManager.generateMessageId(msg_id);\n const peerId = appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n appPeersManager.getPeerId(recentReaction.peer_id) !== rootScope.myId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions || \n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(muted || !peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n userReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const results = reactions?.results ?? [];\n const previousResults = message.reactions?.results ?? [];\n const changedResults = results.filter(reactionCount => {\n const previousReactionCount = previousResults.find(_reactionCount => _reactionCount.reaction === reactionCount.reaction);\n return (\n message.pFlags.out && (\n !previousReactionCount || \n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.pFlags.chosen && (\n !previousReactionCount || \n !previousReactionCount.pFlags.chosen\n )\n );\n });\n\n message.reactions = reactions;\n\n rootScope.dispatchEvent('message_reactions', {message, changedResults});\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n return;\n }\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n rootScope.dispatchEvent('message_views', {peerId, mid, views});\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, muteUntil: number) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(appPeersManager.isRestricted(peerId)) {\n return false;\n }\n \n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const doc = appDocsManager.getDoc('' + tempId);\n if(doc) {\n if(/* doc._ !== 'documentEmpty' && */doc.type && doc.type !== 'sticker' && doc.mime_type !== 'image/gif') {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n const oldCacheContext = appDownloadManager.getCacheContext(doc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public getMessageReactionsListAndReadParticipants(\n message: Message.message, \n limit?: number, \n reaction?: string, \n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch(err => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map(userId => userId.toPeerId());\n \n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some(reaction => appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: string}[] = messageReactionsList.reactions.map(reaction => ({peerId: appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map(readPeerId => ({peerId: readPeerId})));\n \n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(userIds => { // ! convert long to number\n return userIds.map(userId => userId.toUserId());\n });\n }\n\n public canViewMessageReadParticipants(message: Message) {\n if(\n message._ !== 'message' || \n message.pFlags.is_outgoing || \n !message.pFlags.out || \n !appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(message.peerId.toChatId());\n return chat.participants_count < rootScope.appConfig.chat_read_mark_size_threshold && \n (tsNow(true) - message.date) < rootScope.appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n userReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(appPeersManager.isRestricted(peerId)) {\n return;\n }\n\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n\n if(options.userReaction) {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n options.userReaction.reaction, \n notificationMessage\n ];\n \n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n \n notificationMessage = I18n.format(langPackKey, true, args);\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(isAnyChat && message.fromId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(message.fromId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread || options.userReaction) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id !== '777')) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public isRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(appPeersManager.isRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n \n return {\n count: 0,\n history: slice,\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId);\n }\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\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 { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\r\nimport { MUTE_UNTIL } from \"../mtproto/mtproto_config\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n rootScope.dispatchEvent('updateNotifySettings', {\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = window.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n appStateManager.getState().then(state => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n this.notificationsCount++;\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n \r\n \r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\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 { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\nimport { getRestrictionReason } from \"../../helpers/restrictions\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false, _limitSymbols?: number) {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n\r\n if(_limitSymbols !== undefined) {\r\n title = limitSymbols(title, _limitSymbols, _limitSymbols);\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n const userId = (peerId as Peer.peerUser).user_id;\r\n if(userId !== undefined) {\r\n return userId.toPeerId(false);\r\n }\r\n\r\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\r\n if(chatId !== undefined) {\r\n return chatId.toPeerId(true);\r\n }\r\n\r\n return rootScope.myId; // maybe it is an inputPeerSelf\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return NULL_PEER_ID;\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? appUsersManager.isRestricted(peerId.toUserId()) : appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceArrayInObject from \"../../helpers/object/safeReplaceArrayInObject\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id !== 777)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.width;\n const fullHeight = windowSize.height;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\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 copy from \"../../helpers/object/copy\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto && \n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n rootScope.addEventListener('chat_full_update', (chatId) => {\n rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n rootScope.addEventListener('user_full_update', (userId) => {\n rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override) {\n return this.usersFull[id];\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n appChatsManager.saveApiChats(usersUserFull.chats, true);\n appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n //appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return fullChat as ChatFull;\n }\n }\n \n return apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n \n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n if(this.chatsFull[id] !== undefined && !override) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then(chatFull => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n \n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find(size => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...appUsersManager.getSelf(), \n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(chatId: ChatId) {\n const chat: Chat = appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[chatId];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(chatId);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n rootScope.dispatchEvent('user_full_update', userId);\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\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 {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T, \n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): PromiseLike | R {\n if(values.some(value => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport callbackifyAll from \"../../helpers/callbackifyAll\";\nimport copy from \"../../helpers/object/copy\";\nimport { AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Update, Updates } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appDocsManager from \"./appDocsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appProfileManager from \"./appProfileManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n constructor() {\n rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && appDocsManager.downloadDoc(availableReaction.around_animation),\n availableReaction.static_icon && appDocsManager.downloadDoc(availableReaction.static_icon),\n availableReaction.appear_animation && appDocsManager.downloadDoc(availableReaction.appear_animation),\n availableReaction.center_icon && appDocsManager.downloadDoc(availableReaction.center_icon)\n ]);\n }\n });\n }, 7.5e3);\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n \n reaction[key] = appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter(availableReaction => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? [];\n\n const filteredChatAvailableReactions = chatAvailableReactions.map(reaction => {\n return activeAvailableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }).filter(Boolean);\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction.availableReaction[], quickReaction: AvailableReaction.availableReaction) {\n const availableReaction = availableReactions.findAndSplice(availableReaction => availableReaction.reaction === quickReaction.reaction);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction.availableReaction[] | PromiseLike, \n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n const peerId = (message.fwd_from?.channel_post && appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n apiManager.getAppConfig(),\n this.getAvailableReactions()\n ], ([appConfig, availableReactions]) => {\n return availableReactions.find(reaction => reaction.reaction === appConfig.reactions_default);\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n peer: appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find(update => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: string, offset?: string) {\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: appPeersManager.getInputPeerById(peerId),\n id: appMessagesIdsManager.getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: string) {\n return apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(value => {\n if(value) {\n const appConfig = rootScope.appConfig;\n if(appConfig) {\n appConfig.reactions_default = reaction;\n } else { // if no config or loading it - overwrite\n apiManager.getAppConfig(true);\n }\n\n rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public sendReaction(message: Message.message, reaction?: string, onlyLocal?: boolean) {\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = rootScope.myId;\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n let chosenReactionIdx = reactions ? reactions.results.findIndex((reactionCount) => reactionCount.pFlags.chosen) : -1;\n let chosenReaction = chosenReactionIdx !== -1 && reactions.results[chosenReactionIdx];\n if(chosenReaction) { // clear current reaction\n --chosenReaction.count;\n delete chosenReaction.pFlags.chosen;\n\n if(reaction === chosenReaction.reaction) {\n reaction = undefined;\n }\n\n if(!chosenReaction.count) {\n reactions.results.splice(chosenReactionIdx, 1);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n reactions.recent_reactions.findAndSplice((recentReaction) => appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n }\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(!appPeersManager.isBroadcast(message.peerId)) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionCount.reaction === reaction);\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction,\n pFlags: {}\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.pFlags.chosen = true;\n\n if(!reactions.recent_reactions && reactions.pFlags.can_see_list) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const userReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!appPeersManager.isMegagroup(peerId)) {\n reactions.recent_reactions.push(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n return (b.count - a.count) || (indexes.get(a.reaction) - indexes.get(b.reaction));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n rootScope.dispatchEvent('message_reactions', {message, changedResults: []});\n return Promise.resolve();\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = appMessagesIdsManager.getServerMessageId(mid);\n const promise = apiManager.invokeApi('messages.sendReaction', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction\n }).then((updates) => {\n assumeType(updates);\n \n const editMessageUpdateIdx = updates.updates.findIndex(update => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }).catch(err => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReaction?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n \n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n\nconst appReactionsManager = new AppReactionsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appReactionsManager = appReactionsManager);\nexport default appReactionsManager;\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 { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport DATABASE_STATE from '../../config/databases/state';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport forEachReverse from '../../helpers/array/forEachReverse';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n \n constructor() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {}; \n this.sounds = {};\n\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.resolve(apiManager.getAppConfig(overwrite)).then(appConfig => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n \n const doc = appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: rootScope.config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg',\n size: 1\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(): Promise> {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const stickerSet = this.storage.getFromCache(isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID);\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n \n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]);\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji, true);\n if(doc) {\n const soundDoc = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n appDocsManager.downloadDoc(doc),\n soundDoc ? appDocsManager.downloadDoc(soundDoc) : undefined\n ]);\n }\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets', \n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable({\n method: 'messages.getAllStickers', \n processResult: (allStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n }\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable({\n method: 'messages.getStickers', \n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if(sticker.sticker === 3 && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = stickers.findAndSplice(_doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\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 cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport filterUnique from \"../../helpers/array/filterUnique\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { formatFullSentTimeRaw, tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { isRestricted } from \"../../helpers/restrictions\";\nimport { Chat, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser({\n ...user, \n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n users.findAndSplice((user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer));\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser \n || oldUser.initials === undefined \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false); \n user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {id, pFlags: {deleted: true}, access_hash: ''} as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n \n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number, \n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return apiManager.invokeApi('contacts.getLocated', {\n geo_point, \n background\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then(results => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map(p => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map(p => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = RichTextProcessor.parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(RichTextProcessor.wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public isRestricted(userId: UserId) {\n const user: MTUser.user = this.getUser(userId);\n const restrictionReasons = user.restriction_reason;\n\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\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 appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n let contextHashtag = '';\r\n if(siteName === 'GitHub') {\r\n const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n if(matches) {\r\n contextHashtag = matches[0] + '/issues/{1}';\r\n }\r\n }\r\n\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\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 safeAssign from \"../../helpers/object/safeAssign\";\nimport { logger } from \"../logger\";\nimport createDataChannel from \"./helpers/createDataChannel\";\nimport createPeerConnection from \"./helpers/createPeerConnection\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\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 { Logger, logger } from \"../../logger\";\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\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 { Logger, logger } from \"../../logger\";\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\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 getScreenStream from \"./getScreenStream\";\nimport getStream from \"./getStream\";\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true, \n constraints: DisplayMediaStreamConstraints,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints, \n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then(stream => out.audio = stream),\n constraints.video && cache.video.then(stream => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\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 EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\nimport noop from \"../../helpers/noop\";\nimport { logger } from \"../logger\";\nimport getAudioConstraints from \"./helpers/getAudioConstraints\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getStreamCached from \"./helpers/getStreamCached\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager, { StreamItem } from \"./streamManager\";\n\nexport type TryAddTrackOptions = {\n stream: MediaStream, \n track: MediaStreamTrack, \n type: StreamItem['type'], \n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n \n return this.getStream({\n constraints, \n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0], \n track: event.track, \n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream, \n track, \n type: 'input', \n source: type || 'main'\n });\n }\n \n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n \n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n \n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n \n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n \n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach(track => {\n stopTrack(track);\n });\n }\n }\n}\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\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 forEachReverse from \"../../helpers/array/forEachReverse\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { Updates, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, JoinGroupCallJsonPayload } from \"../appManagers/appGroupCallsManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport GroupCallInstance from \"./groupCallInstance\";\nimport filterServerCodecs from \"./helpers/filterServerCodecs\";\nimport fixLocalOffer from \"./helpers/fixLocalOffer\";\nimport processMediaSection from \"./helpers/processMediaSection\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({ \n iceServers: [], \n iceTransportPolicy: 'all', \n bundlePolicy: 'max-bundle', \n rtcpMuxPolicy: 'require', \n iceCandidatePoolSize: 0, \n // sdpSemantics: \"unified-plan\", \n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach(type => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map(section => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n let promise: Promise;\n const audioChannel = processedChannels.find(channel => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find(channel => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach(entry => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n \n const groupCallInput = appGroupCallsManager.getGroupCallInput(groupCallId);\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n \n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer, \n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter(media => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n \n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n \n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find(section => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle, \n entries, \n isAnswer\n })\n };\n\n entriesToDelete.forEach(entry => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find(transceiver => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n \n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n \n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\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 { DataJSON } from \"../../../layer\";\nimport { JoinGroupCallJsonPayload } from \"../../appManagers/appGroupCallsManager\";\nimport SDP from \"../sdp\";\nimport { Ssrc } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n fingerprints: [sectionInfo.fingerprint],\n pwd: sectionInfo.pwd,\n ssrc: sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n ufrag: sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params, \n source: sectionInfo.source, \n media, \n sourceGroups: sectionInfo.sourceGroups, \n entry\n };\n}\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 forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { UpdateGroupCallConnectionData, Codec } from \"../types\";\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map(data => {\n return */['audio' as const, 'video' as const].filter(type => data[type]).map(type => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find(line => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec[\"rtp-hdrexts\"], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\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 forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport copy from \"../../../helpers/object/copy\";\nimport { ConferenceEntry } from \"../localConferenceDescription\";\nimport { parseSdp, addSimulcast } from \"../sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"../sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find(line => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map(payload => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\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 { IS_SAFARI } from \"../../environment/userAgent\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCall, GroupCallParticipant, Updates } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, GroupCallId, GroupCallOutputSource } from \"../appManagers/appGroupCallsManager\";\nimport appPeersManager from \"../appManagers/appPeersManager\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport CallInstanceBase, { TryAddTrackOptions } from \"./callInstanceBase\";\nimport GroupCallConnectionInstance from \"./groupCallConnectionInstance\";\nimport GROUP_CALL_STATE from \"./groupCallState\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getScreenStream from \"./helpers/getScreenStream\";\nimport getStream from \"./helpers/getStream\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription from \"./localConferenceDescription\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n \n // will be set with negotiation\n public joined: boolean;\n \n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections']\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : this.participants.get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => appGroupCallsManager.toggleMuted());\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return appGroupCallsManager.editParticipant(this.id, this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise || (this.startScreenSharingPromise = this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n }));\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: appGroupCallsManager.getGroupCallInput(this.id)\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise || (this.startVideoSharingPromise = this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n }));\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let promise: Promise;\n const groupCallInput = appGroupCallsManager.getGroupCallInput(this.id);\n\n if(discard) {\n this.log(`[api] discardGroupCall id=${this.id}`);\n promise = apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(this.joined) {\n this.log(`[api] leaveGroupCall id=${this.id}`);\n const connectionInstance = this.connections.main;\n promise = apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: connectionInstance.sources.audio.source\n });\n } else {\n this.log(`[api] id=${this.id} payload=null`);\n promise = apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n \n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n const participant = this.participants.get(entry.peerId);\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n }\n\n return source;\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = appGroupCallsManager.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : appGroupCallsManager.makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach(oldSsrc => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find(ssrc => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\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\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","import constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../../environment/constraintSupport\";\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach(constraint => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean, \n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamConstraints = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n \n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach(x => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\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 SDP from \"../sdp\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { toTelegramSource } from \"../utils\";\nimport { parseSourceGroups } from \"./parseSourceGroups\";\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n fingerprint: true,\n setup: true,\n ssrc: true,\n mid: true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find(line => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\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 { GroupCallParticipantVideoSourceGroup } from \"../../../layer\";\nimport { toTelegramSource } from \"../utils\";\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map(str => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map(ssrc => +ssrc)\n sources: rest.map(ssrc => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex(g => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","import simulateEvent from \"../../../helpers/dom/dispatchEvent\";\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT } from './sdpBuilder';\nimport { AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec } from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n \n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n \n return {\n endpoint,\n type,\n source,\n sourceGroups,\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n \n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n \n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n \n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find(entry => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n \n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\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 SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find(line => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map(section => section.lines))\n .map(line => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\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\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\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\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\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 { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\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\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\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 splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\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 splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach(str => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\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 SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\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 { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\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 SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter(line => line.key === 'o').map(line => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\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 SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach(lineStr => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach(ssrc => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport LocalConferenceDescription, { ConferenceEntry } from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport { GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n \n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n \n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach(ssrcGroup => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n \n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n \n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n \n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map(type => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`,\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n \n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach(hdrext => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n \n payloadTypes.forEach(type => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n \n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n \n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach(fb => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n \n public addConference(options: {\n conference: LocalConferenceDescription, \n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean, \n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n \n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { fixMediaLineType, WebRTCLineType } from './sdpBuilder';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach(track => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find(item => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter(x => x.type === 'input');\n const audioItems = filteredItems.filter(x => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n rootScope.dispatchEvent('group_call_amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach(track => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n \n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map(type => {\n return [\n type, \n /* type === 'video' || type === 'screencast' ? \n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry(entry => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find(transceiver => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex(track => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch(err => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach(track => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n \n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\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 * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\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 { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport appStickersManager from \"../appManagers/appStickersManager\";\nimport { Photo } from \"../../layer\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\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 { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\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_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\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 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 isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\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(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.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;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' ')) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map(o => o.what));\n\n /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\n }\n}\n"],"names":["VisibilityIntersector","constructor","onVisibilityChange","items","Map","locked","this","observer","IntersectionObserver","entries","changed","forEach","entry","target","get","isIntersecting","set","visible","smth","getVisible","value","key","push","clearVisible","isVisible","disconnect","clear","refresh","targets","keys","observe","refreshVisible","unobserve","delete","unlock","unlockAndRefresh","lock","findAndSpliceAll","array","verify","out","idx","findIndex","splice","LazyLoadQueueBase","parallelLimit","queueId","queue","inProcess","Set","lockPromise","unlockResolve","log","logger","processQueue","throttle","_processQueue","length","Promise","resolve","reject","processItem","item","add","loadItem","err","includes","error","load","getItem","shift","addElement","method","el","size","indexOfAndSplice","unshift","LazyLoadQueueIntersector","super","intersector","div","find","i","setProcessQueueTimeout","intersectorTimeout","window","setTimeout","LazyLoadQueue","wasSeen","findAndSplice","hasOwnProperty","LazyLoadQueueRepeat","_queue","spliced","LazyLoadQueueRepeat2","map","testQueue","fontFamily","timeoutId","setTestQueue","cancelAnimationFrame","requestAnimationFrame","testQueueElements","testElement","addEventListener","capture","passive","element","mapped","firstTime","text","textLength","from","multiplier","font","textWidth","elementWidth","textContent","dataset","fontWeight","getTextWidth","getBoundingClientRect","width","newElementWidth","widthChanged","setAttribute","smallerText","smallerWidth","smallerTextLength","half","Math","max","half1","substr","replace","half2","removeAttribute","context","canvas","document","createElement","getContext","measureText","MiddleEllipsisElement","HTMLElement","connectedCallback","disconnectedCallback","customElements","define","weakMap","WeakMap","peerId","Array","querySelectorAll","peerTitle","update","PeerTitle","options","plainText","onlyFirstName","dialog","classList","fromName","undefined","limitSymbols","innerHTML","i18n","isUser","pFlags","deleted","ProgressivePreloader","tempId","detached","promise","isUpload","cancelable","streamable","tryAgainOnFail","attachMethod","onClick","e","preloader","contains","loadFunc","cancel","constructContainer","color","bold","constructDownloadIcon","construct","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","setDownloadFunction","func","setManual","setProgress","attachPromise","startTime","Date","now","onEnd","notify","notifyAll","elapsedTime","delay","TRANSITION_TIME","detach","attach","parentElement","then","catch","addNotifyListener","details","percents","done","total","elem","reset","remove","useRafs","getTotalLength","style","strokeDasharray","IMAGE_MIME_TYPES_SUPPORTED","navigator","vibrate","canPlayType","IS_SAFARI","IS_APPLE_MOBILE","VIDEO_MIME_TYPES_SUPPORTED","IS_WEBM_SUPPORTED","filterUnique","arr","insertInDescendSortedArray","property","pos","sortProperty","indexOf","prev","next","len","console","assumeType","x","AudioAssetPlayer","assets","playSound","name","loop","assetName","audio","createAudio","autoplay","src","play","playSoundIfDifferent","Audio","stopSound","pause","cancelDelayedPlay","playSoundWithTimeout","timeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","slice","results","f","start","performance","possiblePromise","process","apply","realResult","timedChunk","finally","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","img","radius","iterations","height","ctx","alpha","filter","drawImage","toDataURL","m","default","blurPromises","dataUri","has","Image","onload","bytesFromHex","hexString","bytes","Uint8Array","ceil","parseInt","charAt","bytesToHex","toString","join","callbackify","callback","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","cleanSearchText","latinize","hasTag","toLowerCase","processSearchText","includeTag","clearBadChars","ignoreCase","htmlToDocumentFragment","html","template","trim","content","htmlToSpan","span","loadedURLs","url","HTMLImageElement","HTMLVideoElement","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","useCache","isImage","loader","once","renderImageFromUrlPromise","createPosterFromMedia","media","videoWidth","videoHeight","naturalWidth","naturalHeight","mediaSize","boxSize","quality","aspectFitted","devicePixelRatio","toBlob","blob","mimeType","createPosterFromVideo","video","onseeked","currentTime","onerror","min","duration","createPosterForVideo","volume","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","files","scanFiles","isDirectory","directoryReader","createReader","readEntries","type","itemFile","getAsFile","file","File","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","promises","kind","webkitGetAsEntry","all","requestFile","accept","input","display","body","append","click","fixBase64String","str","toUrl","CALL_DURATION_LANG_KEYS","s","h","d","w","formatCallDuration","plain","a","showLast","p","t","o","modulus","reverse","formatDuration","strings","elements","fragment","getMiddleware","cleanupObj","cleaned","clean","additionalCallback","_cleanupObj","numberThousandSplitter","joiner","parts","split","defineNotNumerableProperties","obj","names","props","writable","configurable","Object","defineProperties","getObjectKeysAndSort","object","sort","ids","b","safeReplaceArrayInObject","wasObject","newObject","v","safeReplaceObject","SliceEnd","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","end","None","isEnd","side","Top","last","Bottom","Both","setEnd","unsetEnd","deleteCount","ret","insertSlice","flatten","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","convertInputKeyToKey","inputKey","escapeRegExp","limitFrom","visualViewport","innerWidth","innerHeight","apiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","Log","debug","processUpdateMessage","updateMessage","processOpts","date","seq","seqStart","seq_start","_","forceGetDifference","processUpdate","isOut","fromId","from_id","user_id","toId","chat_id","toPeerId","message","id","peer_id","fwd_from","reply_to","entities","pts","pts_count","users","override","chats","updates","warn","setProxy","self","Proxy","saveUpdatesState","us","popPendingSeqUpdate","state","nextSeq","pendingUpdatesData","saveUpdate","seqAwaiting","ptsAwaiting","clearTimeout","popPendingPtsUpdate","channelId","curState","getChannelState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","getChannelDifference","channelState","channel","channel_id","addChannelState","Error","toChatId","lastPtsUpdateTime","fwdHeader","reason","post","isAnyChat","popPts","popSeq","newVersion","assign","noErrorBox","stateResult","fetch","res","status","ok","inbox_date","savedAvatarURLs","isAvatarCached","removeFromAvatarsCache","loadAvatar","photo","inputPeer","getAvatarPromise","cached","saved","peerPhotoFileLocation","peer","photo_id","big","downloadOptions","dcId","dc_id","location","URL","createObjectURL","loadPromise","putAvatar","onlyThumb","renderThumbPromise","thumbImage","animate","stripped_thumb","childElementCount","renderPromise","icon","putPhoto","isDialog","title","isBig","myId","user","avatarAvailable","avatarRendered","abbr","initials","appChatsManager","storage","onChatUpdated","chatId","isChannel","updateChannelParticipant","params","updateChatDefaultBannedRights","chat","default_banned_rights","getFromCache","getChat","init","saveApiChats","apiChats","saveApiChat","oldChat","participants_count","changedPhoto","changedTitle","access_hash","getChatTyped","combineParticipantBannedRights","rights","defaultRights","hasRights","action","isThread","deactivated","isCheckingRightsForSelf","creator","kicked","left","megagroup","admin_rights","banned_rights","myFlags","post_messages","broadcast","editChatDefaultBannedRights","until_date","bind","isMegagroup","isBroadcast","isInChat","good","getChannelInput","getInputPeer","getChannelInputPeer","getChatInputPeer","hasChat","allowMin","getChatPhoto","getChatString","createChannel","inviteToChannel","userIds","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","userId","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","bool","editPhoto","inputFile","inputChatPhoto","editTitle","editAbout","about","getParticipantPeerId","participant","editBanned","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","toUserId","resolveChannel","messagesChats","togglePreHistoryHidden","enabled","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","available_reactions","isRestricted","restrictionReasons","restriction_reason","restricted","getSendAs","processResult","sendAsPeers","peers","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","appDocsManager","docs","savingLottiePreview","downloading","onServiceWorkerFail","doc","supportsStreaming","saveDoc","oldDoc","file_reference","attributes","attribute","file_name","fileName","audioTitle","audioPerformer","performer","voice","mime_type","round_message","alt","stickerEmojiRaw","stickerEmoji","noLinks","noLinebreaks","stickerset","stickerSetInput","thumbs","sticker","animated","ext","pop","mappedMimeType","monthAsNumber","leadingZero","cacheContext","getFileURL","getDoc","docId","getMediaInput","ttl_seconds","getInput","thumbSize","thumb_size","getFileDownloadOptions","thumb","onlyCache","inputFileLocation","download","getThumbURL","getThumb","tryNotToUseBytes","getInputFileName","downloadDoc","originalPromise","downloaded","reader","FileReader","onloadend","uint8","result","readAsArrayBuffer","isSavingLottiePreview","toneIndex","saveLottiePreview","stickerCachedThumbs","saveDocFile","appDraftsManager","drafts","getAllDraftPromise","updateDraftMessage","peerID","saveDraft","threadId","draft","getKey","getDraft","addMissedDialogs","getAllDrafts","apiDraft","processApiDraft","force","draftsAreEqual","draft1","draft2","reply_to_msg_id","no_webpage","isEmptyDraft","myEntities","apiEntities","totalEntities","rMessage","syncDraft","localDraft","saveOnServer","serverDraft","draftObj","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","appGroupCallsManager","makeSsrcsFromParticipant","makeSsrcFromParticipant","source","audio_source","source_groups","endpoint","presentation","Boolean","groupCalls","participants","nextOffsets","rootScope","updateGroupCall","saveGroupCall","call","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","currentGroupCall","hangUp","audioAsset","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","appPeersManager","oldParticipant","hasLeft","muted","can_self_unmute","isCurrentGroupCall","onParticipantUpdate","doNotDispatchParticipantUpdate","getGroupCall","modified","just_joined","apiParticipants","editParticipant","isUpdatingMeInCurrentCall","isSharingAudio","raiseHand","raise_hand_rating","videoStopped","generateSelfVideo","connections","main","sources","setMuted","dispatchEvent","getGroupCallInput","raise_hand","video_paused","videoPaused","video_stopped","presentation_paused","presentationPaused","getGroupCallFull","appUsersManager","participants_next_offset","oldCall","shouldUpdate","startConnectingSound","stopConnectingSound","setCurrentGroupCall","createGroupCall","scheduleDate","random_id","schedule_date","joinGroupCall","rejoin","joinVideo","streamManager","constraints","getAudioConstraints","getVideoConstraints","stream","getStream","addStream","inputStream","MediaStream","createMainStreamManager","joinGroupCallInternal","bindPrefix","fixSafariAudio","connectionInstance","createConnectionInstance","isMuted","connection","createPeerConnection","negotiate","event","onTrack","iceConnectionState","joined","getGroupCallParticipants","values","createDescription","createDataChannel","appendStreamToConference","handleUpdateGroupCallParticipants","updatingSdp","audioSource","sourceGroups","generateSelfParticipant","mainSources","presentationSources","tsNow","groupCallParticipants","count","next_offset","discard","toggleMuted","changeUserMuted","getParticipantByPeerId","AppMessagesIdsManager","tempNum","generateMessageId","messageId","temp","q","MESSAGE_ID_OFFSET","num","MESSAGE_ID_INCREMENT","getServerMessageId","clearMessageId","toServer","l","used","incrementMessageId","increment","appMessagesIdsManager","GLOBAL_FOLDER_ID","DialogsStorage","appMessagesManager","appNotificationsManager","appStateManager","serverTimeManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","getPeerId","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","storages","getCache","getSelf","peerText","getPeerSearchText","dialogsIndex","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","getState","storagesResults","setDialogsFromState","allDialogsLoaded","top_message","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","pushToState","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","query","resetPinnedOrder","getPinnedOrders","getOffsetDate","offsetDate","getFolder","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","migratedTo","concat","setDialogIndexInFilter","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","getDialog","skipped","isPinned","serverTimeOffset","filters","getDialogIndexKey","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","prepareDialogUnreadCountModifying","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","dispatchUnreadTimeout","justReturn","topDate","generateDialogPinnedDate","foundIndex","setDialogToState","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","viaBotId","requestPeerSingle","newPts","ignoreOffsetDate","saveGlobalOffset","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","clearDialogFromState","foundDialog","wasPinned","keepLocal","releaseSinglePeer","dropDialogWithEvent","dropped","forEachReverse","saveApiUsers","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","newUpdatesAfterReloadToHandle","wasDialogBefore","wasTopMessage","generateTempMessageId","getOutputPeer","isOutgoing","migrated_to","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","unread","unread_count","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","settings","notify_settings","getFilter","getDialogs","offsetIndex","fillContactsResult","fillContacts","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","indexStr","search","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","FiltersStorage","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","addMultipleEventsListeners","updateDialogFilter","updateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","unread_mentions_count","broadcasts","groups","isAnyGroup","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","config","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","flags","getOutputDialogFilter","c","filterIncludedPinnedPeers","include_peers","reloadDialogs","reloadPromises","reloadPromise","overwrite","to","oldFilter","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","part","_arrayIndex","lastIndex","partLength","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","handleNewMessages","handleNewDialogs","newMaxSeenId","dialogsStorage","incrementMaxSeenId","handleNotifications","_peerId","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","pendingData","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","threadsStorage","ignoreExisting","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","firstSlice","top_msg_id","handleNewMessage","inboxUnread","releaseUnreadCount","mentioned","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","msg_id","recentReactions","recent_reactions","recentReaction","previousReactions","previousRecentReactions","deepEqual","show_previews","userReaction","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reaction","chosen","local","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","replyTo","reply_to_top_id","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","onUpdateServiceNotification","verified","first_name","phone","onUpdatePinnedMessages","missingMessages","wrapSingleMessage","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","isScheduled","onUpdateDeleteScheduledMessages","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","drop","poll","appPollsManager","maxSeenMsgId","middleware","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","getInputEntities","sendEntites","entity","invokeAfterMessageIsSent","callbackName","finalize","deferred","editMessage","is_scheduled","newMedia","noWebPage","handled","sendText","replyToMsgId","MAX_LENGTH","splitted","webPage","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","query_id","queryId","resultId","clear_draft","send_as","silent","wrapMessageEntities","beforeMessageSending","sendFile","attachType","apiFileName","fileType","isDocument","Blob","caption","isPhoto","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","appDownloadManager","objectURL","appPhotosManager","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","uploaded","cancelPendingMessage","setTyping","uploadPromise","inputMedia","thumbUploadPromise","force_file","progress","floor","isGroupedItem","background","code","sendAlbum","sendFileDetails","groupId","invoke","multiMedia","multi_media","messageMedia","inputSingleMedia","inputs","sendContact","contactPeerId","sendOther","pollId","total_voters","recent_voters","phone_number","last_name","vcard","geo","geoPoint","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","originalMessage","isUserHidden","from_name","userFull","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","anonymous","fillConversations","getConversations","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","hash","telegramMeWebManager","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","peerIds","folderDialogs","dialogsLength","slicedDialogs","forwardMessages","fromPeerId","dropCaptions","dropAuthor","newMessages","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","getDialogByPeerId","inputDialogPeer","reloadConversationsPromise","inputDialogPeers","fullfillLeft","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","ss","onPeerDeleted","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","foundMessages","getGroupsFirstMessage","minMid","getMidsByAlbum","getMidsByMessage","filterMessages","saveMessage","isMessage","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","mediaContext","unsupported","originalDoc","messageKey","migrateFrom","migrateTo","suffix","video_sizes","migrateChecks","wrapMessageForReply","usingMids","highlightWord","withoutMediaType","hasAlbumKey","addPart","langKey","usingFullAlbum","albumText","emoticon","question","rReply","game","UNSUPPORTED_LANG_PACK_KEY","actionWrapped","wrapMessageActionTextNew","match","regExp","RegExp","exec","messageWrapped","noTextFormat","createDocumentFragment","wrapSenderToPeer","senderTitle","fromMe","getMessageSenderPeerIdOrName","wrapSentTime","wrapJoinVoiceChatAnchor","onclick","href","wrapMessageActionTextNewUnsafe","unsafeMessage","langPackKey","args","getNameDivHTML","endsWith","today","daysToStart","getTime","tomorrowDate","setDate","getDate","k","_args","day","month","year","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dir","anchorHTML","domain","langPack","_i18n","reportMessages","startBot","botId","startParam","bot","start_param","editPeerFolders","markDialogUnread","read","fromChat","canMessageBeEdited","goodMedias","canEditMessage","canDeleteMessage","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","getSearchStorage","getSearchCounters","canCache","filterMessagesByInputFilter","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","nextRate","backLimit","minDate","maxDate","offset_id_offset","next_rate","min_date","max_date","min_id","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","newDialogsHandlePromise","deleteMessages","localMessageIds","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","readAllHistory","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","threadMessage","broadcastEventName","finalizePendingMessage","mutePeer","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","some","readPeerId","reactionsCount","readParticipants","incrementMessageViews","notification","peerString","notificationMessage","tag","peerPhoto","appAvatarsManager","image","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithReplies","isFetchIntervalNeeded","getNewHistory","haveSlice","fillHistoryStorage","isHistoryResultEnd","isBottomEnd","requestHistory","oldestMessage","_historyResult","fetchSingleMessages","requestPromises","after","getMessagesResult","replyToPeerId","reply_to_peer_id","typing","referenceDatabase","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","getMediaFromMessage","isMentionUnread","canForward","noforwards","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","registeredDevice","nosound","notifications","sound","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","requestPermission","Notification","removeEventListener","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","checkMuteUntilThrottled","stop","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","notificationData","period","custom","enable","IS_MOBILE","resetTitle","setFavicon","clearInterval","titleInterval","setInterval","beginPath","arc","PI","fillStyle","fill","fontSize","textBaseline","textAlign","fillText","getLocalSettings","getNotifySettings","getNotifyPeerTypeSettings","getNotifyPeerTypePromise","getNotifyExceptions","compare_sound","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","prevFavicon","link","cloneNode","parentNode","replaceChild","notifySettings","getPeerMuted","getPeerLocalSettings","respectType","n","inputNotify","typeNotifySettings","permission","data","testSound","close","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","soundReset","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","getVibrateSupport","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","isArray","originMethod","String","prototype","canPinMessage","getPeerPhoto","getPeerMigratedTo","getPeerTitle","_limitSymbols","getPeerString","getPeerUsername","getPeer","isPeerId","peerParams","getDialogPeer","getRestrictionReasonText","getInputNotifyPeerById","ignorePeerId","getInputPeerSelf","getInputDialogPeerById","getPeerColorById","pic","getDialogType","getDeleteButtonText","noForwards","AppPhotosManager","photos","savePhoto","oldPhoto","choosePhotoSize","boxWidth","boxHeight","useBytes","pushDocumentSize","bestPhotoSize","getUserPhotos","inputUser","cacheSeconds","photosResult","photoIds","getPreviewURLFromBytes","isSticker","jpegHeader","jpegTail","getPathFromPhotoPathSize","path","getPreviewURLFromThumb","getImageFromStrippedThumb","useBlur","setAttachmentSize","noZoom","aspect","isFit","aspectCovered","getStrippedThumbIfNeeded","ignoreCache","getPhotoDownloadOptions","preloadPhoto","photoId","getPhoto","fullWidth","fullHeight","savePhotoFile","fullPhotoSize","polls","pollToMessages","updateMessagePoll","poll_id","savePoll","updatePollToMessage","saveResults","rQuestion","chosenIndexes","answer","getPoll","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","closed","newPoll","AppProfileManager","usersFull","chatsFull","onUpdateUserTyping","typingsInPeer","cancelAction","hasUser","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","getProfile","usersUserFull","full_user","profile_photo","getProfileByPeerId","getCachedFullChat","getCachedFullUser","getCachedProfileByPeerId","getFullPhoto","profile","getChannelFull","full_chat","getChatInviteLink","exported_invite","exportedInvite","getChannelParticipants","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","cP","topPeers","ratingMap","rating","processUserIds","updateProfile","uploadProfilePhoto","updateResult","strippedThumb","previous","deletePhotos","deletedList","getChatMembersString","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","reduce","acc","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","appConfig","reactions_default","getReactionCached","getReaction","getMessagesReactions","getMessageReactionsList","setDefaultReaction","sendReaction","onlyLocal","lastSendingTimeKey","myPeerId","chosenReactionIdx","chosenReaction","can_see_list","reactionCountIdx","indexes","promiseKey","editMessageUpdateIdx","editMessageUpdate","EMOJI_SET_LOCAL_ID","EMOJI_ANIMATIONS_SET_LOCAL_ID","LOCAL_IDS_SET","appStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","updateNewStickerSet","stickerSet","saveStickerSet","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","greetingStickers","saveStickers","getStickerSet","cachedSet","documents","refreshTime","getStickerSetInput","saveById","getAnimatedEmojiSounds","emoji","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","bytesStr","atob","file_reference_base64","charCodeAt","getRecentStickers","stickers","cleanEmoji","getAnimatedEmojiSticker","isAnimation","pack","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","animation","container","animationData","preloadAnimatedEmojiStickerAnimation","soundDoc","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","thumb_version","short_name","getFeaturedStickers","sets","covered","videos","toggleStickerSet","archived","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","allStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","pushRecentSticker","docEmoticon","_doc","cleanUsername","updateUsersStatuses","timestampNow","updateUserStatus","expires","was_online","setUserToStateIfNeeded","updateUserPhoto","forceUserOnline","updateUserName","saveApiUser","contactsIndex","getUserSearchText","setUserNameToCache","contactsList","pushContact","contactsFillPromise","getUser","usernames","getTopPeersPromises","createSearchIndex","updatedContactsList","onContactsModified","isFulfilled","contact","resolveUsername","resolvedPeer","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","oldUser","oldSearchUsername","searchUsername","fullName","wasContact","newContact","onContactUpdated","formatUserPhone","formatPhoneNumber","formatted","isUserOnlineVisible","isObject","getUserStatusString","support","diff","dateEl","timeEl","isRegularUser","isNonContactUser","canSendToUser","getUserPhoto","getUserString","getUserInput","getUserInputPeer","getContactMediaInput","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","getTopPeers","topPeersCache","cachedTime","categories","topPeer","getBlocked","contactsBlocked","getLocated","lat","long","accuracy_radius","self_expires","geo_point","searchContacts","pathname","my_results","curIsContact","setUserStatus","offline","addContact","showPhone","add_phone_privacy_exception","deleteContacts","photoTypeSet","webpages","pendingWebPages","updateWebPage","saveWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","description","rDescription","contextSite","pendingSet","getMessageKeyForPendingWebPage","deleteWebPageFromPending","getWebPage","CallConnectionInstanceBase","safeAssign","RTCPeerConnection","signalingState","connectionState","dict","dataChannel","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiating","negotiateInternal","sendDataChannelData","JSON","stringify","getStreamCached","_cache","screen","isScreen","getScreenStream","CallInstanceBase","player","hasInputTrackKind","isSharingVideo","noop","requestAudioSource","requestInputSource","isAudioGood","isVideoGood","onInputStream","requestScreen","getScreenConstraints","getElement","cleanup","tryAddTrack","streams","track","saveInputVideoStream","getVideoTracks","isOutput","tagName","isVideo","elementEndpoint","addTrack","useStream","outputStream","paused","srcObject","sinkId","outputDeviceId","setSinkId","appendChild","getAudioTracks","isClosing","getTracks","stopTrack","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","section","processed","sdp","sectionInfo","parseMediaSectionInfo","mediaType","fingerprint","setup","payload","fingerprints","pwd","ssrc","ufrag","processMediaSection","audioChannel","videoChannel","useChannel","channels","direction","setEntrySource","setEntryPeerId","parse","groupCallInput","request","join_as","setData","codec","line","extmap","performExtmap","uri","filterServerCodecs","isNewConnection","getEntryByMid","originalOffer","createOffer","iceRestart","createEntry","setDirection","offer","hasMunged","skipAddingMulticast","isSending","mediaLine","mediaLineParts","localMLine","codecIds","newData","transport","candidates","setPort","port","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","setLocalDescription","entriesToDelete","bundle","shouldBeSkipped","answerDescription","generateSdp","isAnswer","deleteEntry","iceGatheringState","setRemoteDescription","updateConstraints","getTransceivers","transceiver","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","maxHeight","onStageEndpoints","minHeight","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","isSharingScreen","pinSource","unpinSource","getVideoElementFromParticipantByType","clone","changeRaiseHand","raise","startScreenSharingInternal","stopScreenSharing","startScreenSharing","startScreenSharingPromise","toggleScreenSharing","startVideoSharingInternal","startVideoSharing","startVideoSharingPromise","stopVideoSharing","toggleVideoSharing","isDiscarded","getEntryBySource","oldSsrcs","ssrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","session","lines","parsed","telegramSourceGroups","sdpLines","semantics","rest","parseSourceGroups","raw","ConferenceEntry","setPeerId","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","entriesByMid","entriesBySource","entriesByPeerId","findEntry","findFreeSendRecvEntry","sendEntry","recvEntry","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","separator","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","protocol","SDPLine","SDPAttributeInner","prefix","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","test","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","foundation","component","toUpperCase","priority","ip","generation","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","candidate","addSsrc","streamName","addSource","addMsid","ssrcGroup","isApplication","isInactive","payloadTypes","hdrexts","hdrext","clockrate","parameters","fbs","fb","subtype","addConference","IS_FIREFOX","AudioStreamAnalyser","streamSource","createMediaStreamSource","analyser","createAnalyser","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","connect","StreamManager","interval","getAmplitude","streamAnalyser","frequencyBinCount","getByteFrequencyData","analyse","counter","amplitudes","AudioContext","webkitAudioContext","canCreateConferenceEntry","types","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","strs","word","addJoined","toTelegramSource","fromTelegramSource","scale","rms","sqrt","contexts","links","task","originalPayload","refreshReference","saveContext","reference","getContexts","_context","getReferenceByLink","deleteContext","refreshEmojiesSoundsPromise","hex","newHex","newContext","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupported","isPlaySupportedResult","loadWavWorker","wavWorker","Worker","page","onTaskEnd","loadWorker","worker","postMessage","command","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","SearchIndex","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","fullTextLength"],"sourceRoot":""} \ No newline at end of file diff --git a/public/765.5950c8422ae75da58b30.chunk.js b/public/765.5950c8422ae75da58b30.chunk.js deleted file mode 100644 index 7fe6befd..00000000 --- a/public/765.5950c8422ae75da58b30.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[765],{6765:(e,t,n)=>{n.d(t,{Z:()=>c});var o=n(7309);var s=n(1168),i=n(4727),r=n(2738),a=n(8678);class c extends s.Z{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,i._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,a.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let n,o,s,i={},r=0,a=0,c=0,l=0,d=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,s=new Image,s.src=e.src,s.draggable=!1,s.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),o=document.createElement("div"),o.classList.add("crop-overlay");const i=document.createElement("div");i.classList.add("crop-overlay-color"),n.appendChild(o),e.parentNode.appendChild(n),n.appendChild(s),n.appendChild(e),n.appendChild(i),o.appendChild(s),s.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const r=e.offsetWidth/2-100,a=e.offsetHeight/2-100;u(200,200),p(r,a),m(r,a),o.addEventListener("mousedown",g,!1),o.addEventListener("touchstart",g,!1),o.addEventListener("wheel",b,!1),document.addEventListener("keypress",v,!1)}function u(e,t){c=e*d,l=t*d,o.style.width=e+"px",o.style.height=t+"px"}function p(e,t){a=t*d,r=e*d,s.style.top=-t+"px",s.style.left=-e+"px"}function m(e,t){o.style.top=t+"px",o.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,i,r,a=Math.floor(o.clientWidth+e),c=Math.floor(o.clientHeight+e),l=s.clientWidth,d=s.clientHeight;a<50||a>l||(t=o.offsetLeft-e/2,n=o.offsetTop-e/2,i=t+a,r=n+c,t<0&&(t=0),n<0&&(n=0),i>l||r>d||(u(a,a),p(t,n),m(t,n)))}function v(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function b(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){i.container_width=o.offsetWidth,i.container_height=o.offsetHeight,i.container_left=o.offsetLeft,i.container_top=o.offsetTop,i.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,i.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",y),document.addEventListener("touchmove",y),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y)}function y(e){let t,n,r,a,c={x:0,y:0};e.preventDefault(),e.stopPropagation(),c.x=e.pageX||e.touches&&e.touches[0].pageX,c.y=e.pageY||e.touches&&e.touches[0].pageY,t=c.x-(i.mouse_x-i.container_left),n=c.y-(i.mouse_y-i.container_top),r=o.offsetWidth,a=o.offsetHeight,t<0?t=0:t>s.offsetWidth-r&&(t=s.offsetWidth-r),n<0?n=0:n>s.offsetHeight-a&&(n=s.offsetHeight-a),p(t,n),m(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=c,t.height=l,t.getContext("2d").drawImage(e,r,a,c,l,0,0,c,l)},removeHandlers:function(){o.removeEventListener("mousedown",g),o.removeEventListener("touchstart",g),o.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y),document.removeEventListener("keypress",v),n.remove(),o.remove(),s.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,r.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>o.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},1168:(e,t,n)=>{n.d(t,{Z:()=>y,x:()=>E});var o=n(3512),s=n(1405),i=n(5814),r=n(9818),a=n(4727),c=n(8497),l=n(8799),d=n(3699),h=n(2738),u=n(6299),p=n(3910),m=n(3241),f=n(6733),v=n(1655);const b=document.body;let g=b;const w=()=>{g=(0,f.W7)()||b,y.reAppend()};(0,f.Ms)(b,w);class y extends m.Z{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{r.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.Z,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,h.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&(0,h.fc)(this.element,(e=>{(0,c.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append((0,a.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),(0,s.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let o=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),(0,s.ripple)(t),e.text?t.innerHTML=e.text:t.append((0,a.i18n)(e.langKey,e.langArgs)),(0,h.fc)(t,(()=>{e.callback&&e.callback(),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!o&&2===t.length){const e=t.find((e=>!e.isCancel));e&&(o=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=o,this.element.append(this.container),y.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},r.Z.pushItem(this.navigationItem),(0,l.Z)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(o.default.isOverlayActive=!0,i.Z.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout((()=>{this.listenerSetter.add(document.body)("keydown",(e=>{(this.confirmShortcutIsSendShortcut?(0,u.Z)(e):"Enter"===e.key)&&((0,h.tH)(this.btnConfirmOnEnter),(0,p.d)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(o.default.isOverlayActive=!1),r.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,v.Z)(y.POPUPS,this),w(),setTimeout((()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||i.Z.checkAnimations(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:n}=e,o=t.parentElement;o&&o!==g&&g!==n&&g.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}}y.POPUPS=[];const E=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},8678:(e,t,n)=>{n.d(t,{Z:()=>s});var o=n(3019);function s(e){return(0,o.Z)(e,"readAsDataURL")}},6733:(e,t,n)=>{function o(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function s(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function i(e,t,n){const o=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{o(e,t,!1)}))}function r(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function a(){return!!r()}n.d(t,{C8:()=>s,Dj:()=>o,Ms:()=>i,W7:()=>r,rB:()=>a})},6299:(e,t,n)=>{n.d(t,{Z:()=>i});var o=n(3512),s=n(4762);function i(e){if("Enter"===e.key&&!s.IS_MOBILE&&!e.isComposing){if("enter"===o.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=s.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(s.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},8801:(e,t,n)=>{n.d(t,{P:()=>s,q:()=>i});const o="_";function s(e,t){const n=""["".length-1]||"";let s;switch(e._){case"inputPhotoFileLocation":s=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(o);break;case"inputDocumentFileLocation":s=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(o);break;case"inputPeerPhotoFileLocation":s=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(o);break;case"inputStickerSetThumb":s=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(o);break;case"inputFileLocation":s=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":s=["webFile",e.url].join(o);break;default:console.error("Unrecognized location:",e),s=""}return s+(n?"."+n:n)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},3699:(e,t,n)=>{n.d(t,{Z:()=>o});class o{constructor(){this.listeners=new Set}add(e){return(t,n,o)=>{const s={element:e,event:t,callback:n,options:o};return this.addManual(s),s}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,o){let s;for(const i of this.listeners)if(i.element===e&&i.event===t&&i.callback===n&&i.options===o){s=i;break}s&&this.remove(s)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},7309:(e,t,n)=>{n.d(t,{Z:()=>d});var o=n(3512),s=n(9518),i=n(3725),r=n(8801),a=n(8576),c=n(410);const l=new class{constructor(){this.cacheStorage=new a.Z("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},o.default.addEventListener("download_progress",(e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach((e=>e(t)));const o=this.downloads[t.fileName];o&&o.notifyAll(t)}))}getNewDeferred(e){const t=(0,i.b)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",s.Z.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally((()=>{delete this.progress[e],delete this.progressCallbacks[e]})),t.catch((()=>{this.clearDownload(e)})),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then((e=>e.blob())).then((e=>n.resolve(e))):n.resolve(t),n}download(e){const t=(0,r.P)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),o=e=>{n.reject(e)};return(()=>{if(!s.Z.worker||e.onlyCache){const i=this.cacheStorage.getFile(t).then((t=>{if(t.sizes.Z.downloadFile(e).then(n.resolve,o)))}s.Z.downloadFile(e).then(n.resolve,o)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return s.Z.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally((()=>{this.clearDownload(t)})),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const o=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),o&&t(o)}createDownloadAnchor(e,t,n){const o=document.createElement("a");o.href=e,o.download=t,o.target="_blank",o.style.position="absolute",o.style.top="1px",o.style.left="1px",document.body.append(o);try{var s=document.createEvent("MouseEvents");s.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(s)}catch(t){console.error("Download click error",t);try{o.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{o.remove(),n&&n()}),100)}downloadToDisc(e,t){const n=this.download(e);return n.then((e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,(()=>{URL.revokeObjectURL(n)}))})),n}getCacheContext(e,t="full"){var n,o;const s=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(o=s[t])&&void 0!==o?o:s[t]={downloaded:0,url:""}}};c.GO&&(c.GO.appDownloadManager=l);const d=l}}]); -//# sourceMappingURL=765.5950c8422ae75da58b30.chunk.js.map \ No newline at end of file diff --git a/public/765.5950c8422ae75da58b30.chunk.js.map b/public/765.5950c8422ae75da58b30.chunk.js.map deleted file mode 100644 index b84901ee..00000000 --- a/public/765.5950c8422ae75da58b30.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"765.5950c8422ae75da58b30.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts"],"sourcesContent":["/*\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 appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\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\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\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 rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\r\nimport { addFullScreenListener, getFullScreenElement } from \"../../helpers/dom/fullScreen\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: () => this.destroy(),\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n protected destroy() {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\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 ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\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 rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\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\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\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 EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\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 { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n"],"names":["PopupAvatar","constructor","super","closable","withConfirm","image","Image","cropper","crop","removeHandlers","this","h6","document","createElement","_i18n","btnClose","classList","remove","header","append","cropContainer","add","input","type","style","display","listenerSetter","e","file","target","files","readBlobAsDataURL","then","contents","src","onload","show","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","draggable","overlayColor","appendChild","parentNode","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","addEventListener","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","getContext","drawImage","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","open","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","options","element","title","onEscape","navigationItem","confirmShortcutIsSendShortcut","prepend","once","withoutOverlay","overlayClosable","i18n","ripple","btnConfirmOnEnter","length","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","destroy","find","isCancel","POPUPS","push","onPop","setTimeout","key","dispatchEvent","removeAll","undefined","cleanup","static","forEach","popup","parentElement","popupConstructor","filter","addCancelButton","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","bind","split","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","isSendShortcutPressed","IS_MOBILE","isComposing","shiftKey","ctrlKey","metaKey","secondaryKey","IS_APPLE","FILENAME_JOINER","getFileNameByLocation","location","ext","str","_","id","thumb_size","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","encodeURIComponent","JSON","stringify","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","removeManual","_listener","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","getNewDeferred","deferred","cancel","Error","name","reject","finally","catch","clearDownload","fakeDownload","fetch","response","hasOwnProperty","onError","err","onlyCache","promise","getFile","size","tryDownload","upload","mimeType","indexOf","getDownload","addProgressCallback","createDownloadAnchor","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","downloadToDisc","discFileName","objectURL","URL","createObjectURL","revokeObjectURL","getCacheContext","media","thumbSize","cache","downloaded"],"sourceRoot":""} \ No newline at end of file diff --git a/public/77.d9ff12acb3c5a5858e31.chunk.js b/public/77.d9ff12acb3c5a5858e31.chunk.js deleted file mode 100644 index 9f9b4201..00000000 --- a/public/77.d9ff12acb3c5a5858e31.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[77],{7077:(t,a,e)=>{e.r(a),e.d(a,{default:()=>o});const r=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],f=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function o(t,a,e,o,u,s,i){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(i)&&(i=1),(i|=0)>3&&(i=3),i<1&&(i=1);const n=t.getImageData(a,e,o,u),b=n.data;let c,N,h,k,m,p,w,d,g,l,C,D,I=o-1,j=u-1,q=s+1,v=[],x=[],y=[],z=r[s],A=f[s],B=[],E=[];for(;i-- >0;){for(D=C=0,m=0;mI?I:p)<<2),c+=b[w++],N+=b[w++],h+=b[w++];for(k=0;k0?w<<2:0),d=D+B[k],g=D+E[k],c+=b[d++]-b[g++],N+=b[d++]-b[g++],h+=b[d++]-b[g++],C++;D+=o<<2}for(k=0;kj?0:o,c+=v[l],N+=x[l],h+=y[l];for(C=k<<2,m=0;m>>A,b[C+1]=N*z>>>A,b[C+2]=h*z>>>A,0==k&&(B[m]=((w=m+q)0?w*o:0),d=k+B[m],g=k+E[m],c+=v[d]-v[g],N+=x[d]-x[g],h+=y[d]-y[g],C+=o<<2}}t.putImageData(n,a,e)}}}]); -//# sourceMappingURL=77.d9ff12acb3c5a5858e31.chunk.js.map \ No newline at end of file diff --git a/public/774.5ad3ac1d542a58ab1c8c.chunk.js b/public/774.5ad3ac1d542a58ab1c8c.chunk.js deleted file mode 100644 index 5bd76686..00000000 --- a/public/774.5ad3ac1d542a58ab1c8c.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[774],{4425:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2897);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.d)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return t.innerHTML=e,t}i.d(t,{Z:()=>s})},634:(e,t,i)=>{i.d(t,{Z:()=>r});var s=i(410),n=i(9518);const a=new class{getState(){return n.Z.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let i,s;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};i=e.currentPassword?n.Z.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=t.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,s=e.newPassword?n.Z.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([i,s]).then((e=>(a.password=e[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=e[1],n.Z.invokeApi("account.updatePasswordSettings",a))))}))}check(e,t,i={}){return n.Z.invokeCrypto("computeSRP",e,t,!1).then((e=>n.Z.invokeApi("auth.checkPassword",{password:e},i).then((e=>("auth.authorization"===e._&&n.Z.setUser(e.user),e)))))}confirmPasswordEmail(e){return n.Z.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.Z.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.Z.invokeApi("account.cancelPasswordEmail")}};s.GO.passwordManager=a;const r=a},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(4727);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>k});var s=i(6858),n=i(4755),a=i(4687),r=i(634),o=i(4874),l=i(4494),d=i(6830),c=i(4425),p=i(8598),h=i(4727),u=i(2582),m=i(3910),w=i(2738),g=i(2614),b=i(5565),y=i(1656);let v;const k=new o.Z("page-password",!0,(()=>{const e=new u.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,l.Z)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});t.append(a.element);const o=new d.Z({label:"LoginPassword",name:"password"});let k;v=o.input,e.inputWrapper.append(o.container,t);let P,Z=()=>(k||(k=window.setInterval(Z,1e4)),r.Z.getState().then((e=>{P=e,P.hint?(0,b.Z)(o.label,(0,g.Z)(p.Z.wrapEmojiText(P.hint))):o.setLabel()})));const L=e=>{if(e&&(0,m.d)(e),!v.value.length)return void v.classList.add("error");const n=(0,y.Z)([v,t],!0);let l=v.value;a.update({key:"PleaseWait"});const d=(0,s.y7)(t);o.setValueSilently(""+Math.random()),o.setValueSilently(l),r.Z.check(l,P).then((e=>{"auth.authorization"===e._?(clearInterval(k),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),S&&S.remove()):(t.removeAttribute("disabled"),a.update({key:e._}),d.remove())})).catch((e=>{n(),o.input.classList.add("error"),e.type,a.update({key:"PASSWORD_HASH_INVALID"}),v.select(),d.remove(),Z()}))};(0,w.fc)(t,L),v.addEventListener("keypress",(function(e){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===e.key)return L()}));const E=n.ZP.isMobile?100:166,S=new c.Z(o,E);return e.imageDiv.append(S.container),Promise.all([S.load(),Z()])}),null,(()=>{v.focus(),a.default.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=774.5ad3ac1d542a58ab1c8c.chunk.js.map \ No newline at end of file diff --git a/public/774.5ad3ac1d542a58ab1c8c.chunk.js.map b/public/774.5ad3ac1d542a58ab1c8c.chunk.js.map deleted file mode 100644 index 3a59ac7c..00000000 --- a/public/774.5ad3ac1d542a58ab1c8c.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"774.5ad3ac1d542a58ab1c8c.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\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 lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\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\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\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 htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\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 { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\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 { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\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 { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","passwordManager","getState","result","updateSettings","settings","state","currentHashPromise","newHashPromise","params","password","new_settings","_","hint","email","currentPassword","Promise","resolve","newAlgo","new_algo","salt1","Uint8Array","length","randomize","set","newPassword","all","hashes","new_password_hash","check","inputCheckPassword","auth","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","i18n","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","window","setInterval","_state","setLabel","onSubmit","value","update","preloader","setValueSilently","Math","random","response","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/781.7ae7d8d6f7963805c4b2.chunk.js b/public/781.7ae7d8d6f7963805c4b2.chunk.js deleted file mode 100644 index 6926dc3b..00000000 --- a/public/781.7ae7d8d6f7963805c4b2.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[781,436],{5436:(e,t,a)=>{a.r(t),a.d(t,{default:()=>c});var u=a(8799),n=a(4541),l=a(4687),s=a(4727),d=a(3512);const h=new(a(4874).Z)("page-chats",!1,(()=>(l.default.pushToState("authState",{_:"authStateSignedIn"}),d.default.dispatchEvent("im_mount"),s.default.requestedServerLanguage||s.default.getCacheLangPack().then((e=>{e.local&&s.default.getLangPack(e.lang_code)})),h.pageEl.style.display="",(0,u.Z)(),Promise.all([(0,n.Z)(),Promise.all([a.e(458),a.e(554),a.e(325),a.e(765),a.e(714),a.e(664)]).then(a.bind(a,2664))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),c=h}}]); -//# sourceMappingURL=781.7ae7d8d6f7963805c4b2.chunk.js.map \ No newline at end of file diff --git a/public/781.7ae7d8d6f7963805c4b2.chunk.js.map b/public/781.7ae7d8d6f7963805c4b2.chunk.js.map deleted file mode 100644 index 1b7bc1fc..00000000 --- a/public/781.7ae7d8d6f7963805c4b2.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"781.7ae7d8d6f7963805c4b2.chunk.js","mappings":"mLA0DA,MAAMA,EAAO,I,QAAI,GAAK,cAAc,GA7CjB,KAEjB,sBAA4B,YAAa,CAACC,EAAG,sBAI7C,wBAAwB,YAEpB,mCACF,6BAAwBC,MAAKC,IACxBA,EAASC,OACV,sBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAiB5B,SAEOC,QAAQC,IAAI,EACjB,SACA,4FACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\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 blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n rootScope.dispatchEvent('im_mount');\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then(langPack => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n //alert('pageIm!');\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.25c7f3643f3336533b03.chunk.js b/public/8.25c7f3643f3336533b03.chunk.js new file mode 100644 index 00000000..d005c45c --- /dev/null +++ b/public/8.25c7f3643f3336533b03.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[8],{195:function(e,t,o){"use strict";o.r(t);t.default={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off",PrivacyPhoneInfo4:"This public link opens a chat with you:","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","UsernameSettings.ChangeDescription":"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); +//# sourceMappingURL=8.25c7f3643f3336533b03.chunk.js.map \ No newline at end of file diff --git a/public/8.25c7f3643f3336533b03.chunk.js.map b/public/8.25c7f3643f3336533b03.chunk.js.map new file mode 100644 index 00000000..874c0786 --- /dev/null +++ b/public/8.25c7f3643f3336533b03.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"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","file":"8.25c7f3643f3336533b03.chunk.js","sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterMenuDelete\": \"Delete Folder\",\n \"FilterHeaderEdit\": \"Edit Folder\",\n \"FilterAllGroups\": \"All Groups\",\n \"FilterAllContacts\": \"All Contacts\",\n \"FilterAllNonContacts\": \"All Non-Contacts\",\n \"FilterAllChannels\": \"All Channels\",\n \"FilterAllBots\": \"All Bots\",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\"\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\"\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.TimeFormat\": \"Time Format\",\n \"General.TimeFormat.h12\": \"12-hour\",\n \"General.TimeFormat.h23\": \"24-hour\",\n \"ChatBackground.UploadWallpaper\": \"Upload Wallpaper\",\n \"ChatBackground.Blur\": \"Blur Wallpaper Image\",\n \"Notifications.Sound\": \"Notification Sound\",\n \"NewPrivateChat\": \"New Private Chat\",\n \"NewPoll.OptionLabel\": \"Option %d\",\n \"Message.Context.Selection.Copy\": \"Copy selected\",\n \"Message.Context.Selection.Clear\": \"Clear selection\",\n \"Message.Context.Selection.Delete\": \"Delete selected\",\n \"Message.Context.Selection.Forward\": \"Forward selected\",\n \"Message.Context.Selection.SendNow\": \"Send Now selected\",\n \"Message.Unsupported.Desktop\": \"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__\",\n \"Message.Unsupported.Mobile\": \"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__\",\n \"Checkbox.Enabled\": \"Enabled\",\n \"Checkbox.Disabled\": \"Disabled\",\n \"Error.PreviewSender.CaptionTooLong\": \"Caption is too long.\",\n \"PreviewSender.GroupItems\": \"Group items\",\n \"PreviewSender.SendAlbum\": {\n \"one_value\": \"Send Album\",\n \"other_value\": \"Send %d Albums\"\n },\n \"Presence.YourChat\": \"chat with yourself\",\n \"Privacy.Devices\": {\n \"one_value\": \"%1$d device\",\n \"other_value\": \"%1$d devices\"\n },\n \"Privacy.SensitiveContent\": \"Sensitive Content\",\n \"PrivacyModal.Search.Placeholder\": \"Add Users or Groups...\",\n \"Permissions.NoExceptions\": \"No exceptions\",\n \"Permissions.ExceptionsCount\": {\n \"one_value\": \"%d exception\",\n \"other_value\": \"%d exceptions\"\n },\n \"Link.Available\": \"Link is available\",\n \"Link.Taken\": \"Link is already taken\",\n \"Link.Invalid\": \"Link is invalid\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n //it is from iOS\n \"VoiceChat.DiscussionGroup\": \"discussion group\",\n\n // * android\n \"AccDescrEditing\": \"Editing\",\n \"ActionCreateChannel\": \"Channel created\",\n \"ActionCreateGroup\": \"un1 created the group\",\n \"ActionChangedTitle\": \"un1 changed the group name to un2\",\n \"ActionRemovedPhoto\": \"un1 removed the group photo\",\n \"ActionChangedPhoto\": \"un1 changed the group photo\",\n \"ActionChangedVideo\": \"un1 changed the group video\",\n \"ActionAddUser\": \"un1 added un2\",\n \"ActionAddUserSelf\": \"un1 returned to the group\",\n \"ActionAddUserSelfYou\": \"You returned to the group\",\n \"ActionAddUserSelfMega\": \"un1 joined the group\",\n \"ActionLeftUser\": \"un1 left the group\",\n \"ActionKickUser\": \"un1 removed un2\",\n \"ActionInviteUser\": \"un1 joined the group via invite link\",\n \"ActionPinnedNoText\": \"un1 pinned a message\",\n \"ActionMigrateFromGroup\": \"This group was upgraded to a supergroup\",\n \"ActionYouScored\": \"You scored %1$s\",\n \"ActionUserScored\": \"un1 scored %1$s\",\n \"ActionYouScoredInGame\": \"You scored %1$s in un2\",\n \"ActionUserScoredInGame\": \"un1 scored %1$s in un2\",\n \"AndOther\": {\n \"one_value\": \"and %1$d other\",\n \"other_value\": \"and %1$d others\"\n },\n \"AttachPhoto\": \"Photo\",\n \"AttachVideo\": \"Video\",\n \"AttachGif\": \"GIF\",\n \"AttachLocation\": \"Location\",\n \"AttachLiveLocation\": \"Live Location\",\n \"AttachContact\": \"Contact\",\n //\"AttachDocument\": \"File\",\n \"AttachSticker\": \"Sticker\",\n \"AttachAudio\": \"Voice message\",\n \"AttachRound\": \"Video message\",\n \"AttachGame\": \"Game\",\n \"Bot\": \"bot\",\n //\"ChannelJoined\": \"You joined this channel\",\n \"ChannelMegaJoined\": \"You joined this group\",\n \"EnterChannelName\": \"Channel name\",\n \"DescriptionOptionalPlaceholder\": \"Description (optional)\",\n \"DescriptionPlaceholder\": \"Description\",\n \"DiscussionStarted\": \"Discussion started\",\n \"Draft\": \"Draft\",\n \"FilterAlwaysShow\": \"Include Chats\",\n \"FilterNeverShow\": \"Exclude Chats\",\n \"FilterInclude\": \"Included Chats\",\n \"FilterExclude\": \"Excluded Chats\",\n \"FilterChatTypes\": \"Chat types\",\n \"FilterChats\": \"Chats\",\n \"FilterNew\": \"New Folder\",\n \"Filters\": \"Folders\",\n \"FilterRecommended\": \"Recommended Folders\",\n \"FilterShowMoreChats\": {\n \"one_value\": \"Show %1$d More Chat\",\n \"other_value\": \"Show %1$d More Chats\"\n },\n \"ForwardedMessageCount\": {\n \"one_value\": \"Forwarded message\",\n \"other_value\": \"%1$d forwarded messages\"\n },\n \"FromYou\": \"You\",\n \"Add\": \"Add\",\n \"Chats\": {\n \"one_value\": \"%1$d chat\",\n \"other_value\": \"%1$d chats\"\n },\n \"Channels\": {\n \"one_value\": \"%1$d channel\",\n \"other_value\": \"%1$d channels\"\n },\n \"Comments\": {\n \"one_value\": \"%1$d Comment\",\n \"other_value\": \"%1$d Comments\"\n },\n \"Groups\": {\n \"one_value\": \"%1$d group\",\n \"other_value\": \"%1$d groups\"\n },\n \"Users\": {\n \"one_value\": \"%1$d user\",\n \"other_value\": \"%1$d users\"\n },\n \"Members\": {\n \"one_value\": \"%1$d member\",\n \"other_value\": \"%1$d members\"\n },\n \"messages\": {\n \"one_value\": \"%1$d message\",\n \"other_value\": \"%1$d messages\"\n },\n \"UsernameHelpLink\": \"This link opens a chat with you:\\n%1$s\",\n \"NewChannel\": \"New Channel\",\n \"NewGroup\": \"New Group\",\n \"Contacts\": \"Contacts\",\n \"SavedMessages\": \"Saved Messages\",\n \"Settings\": \"Settings\",\n \"SettingsHelp\": \"Help\",\n \"General\": \"General\",\n \"TextSize\": \"Message Text Size\",\n \"ChatBackground\": \"Chat Background\",\n \"EnableAnimations\": \"Enable Animations\",\n \"AutoDownloadMedia\": \"Auto-Download Media\",\n \"AutodownloadContacts\": \"Contacts\",\n \"AutodownloadPrivateChats\": \"Private Chats\",\n \"AutodownloadGroupChats\": \"Group Chats\",\n \"AutodownloadChannels\": \"Channels\",\n \"AutoplayGIF\": \"GIFs\",\n \"AutoplayVideo\": \"Videos\",\n \"NotificationsForGroups\": \"Notifications for groups\",\n \"NotificationsForPrivateChats\": \"Notifications for private chats\",\n \"NotificationsForChannels\": \"Notifications for channels\",\n \"NotificationsPrivateChats\": \"Private Chats\",\n \"NotificationsGroups\": \"Groups\",\n \"NotificationsChannels\": \"Channels\",\n \"NotificationsOther\": \"Other\",\n \"MarkAsUnread\": \"Mark as unread\",\n \"MarkAsRead\": \"Mark as read\",\n \"ContactJoined\": \"Contact joined Telegram\",\n \"Loading\": \"Loading...\",\n \"Unblock\": \"Unblock\",\n \"BlockedUsers\": \"Blocked Users\",\n \"BlockedUsersInfo\": \"Blocked users will not be able to contact you and will not see your Last Seen time.\",\n \"BlockedEmpty\": \"None\", \n \"TwoStepVerification\": \"Two-Step Verification\",\n \"TwoStepVerificationTitle\": \"Two-Step Verification\",\n \"PinnedMessage\": \"Pinned Message\",\n \"PinnedMessagesCount\": {\n \"one_value\": \"Pinned Message\",\n \"other_value\": \"%1$d Pinned Messages\"\n },\n //\"PreviousPinnedMessage\": \"Previous Message\",\n \"PrivacyExceptions\": \"Exceptions\",\n \"PrivacyLastSeen\": \"Last Seen & Online\",\n \"PrivacySettings\": \"Privacy and Security\",\n \"PrivacyTitle\": \"Privacy\",\n \"PrivacyPhone\": \"Phone Number\",\n \"PrivacyPhoneTitle\": \"Who can see my phone number?\",\n \"PrivacyPhoneTitle2\": \"Who can find me by my number?\",\n \"PrivacyPhoneInfo\": \"Users who have your number saved in their contacts will also see it on Telegram.\",\n \"PrivacyPhoneInfo3\": \"Users who add your number to their contacts will see it on Telegram only if they are your contacts.\",\n \"PrivacyProfilePhoto\": \"Profile Photos\",\n \"PrivacyProfilePhotoTitle\": \"Who can see my profile photos & videos?\",\n \"PrivacyP2PHeader\": \"Peer-to-Peer\",\n \"PrivacyForwardsTitle\": \"Who can add a link to my account when forwarding my messages?\",\n \"Reminders\": \"Reminders\",\n \"ScheduledMessages\": \"Scheduled Messages\",\n \"LastSeenTitle\": \"Who can see your Last Seen time?\",\n \"SessionsTitle\": \"Active Sessions\",\n \"CurrentSession\": \"This device\",\n \"TerminateAllSessions\": \"Terminate All Other Sessions\",\n \"TerminateSessionText\": \"Are you sure you want to terminate this session?\",\n \"OtherSessions\": \"Active sessions\",\n \"AreYouSureDeleteSingleMessage\": \"Are you sure you want to delete this message?\",\n \"AreYouSureDeleteFewMessages\": \"Are you sure you want to delete these messages?\",\n \"AreYouSureDeleteSingleMessageMega\": \"Are you sure you want to delete this message for everyone?\",\n \"AreYouSureDeleteFewMessagesMega\": \"Are you sure you want to delete these messages for everyone?\",\n \"AreYouSureDeleteAndExitName\": \"Are you sure you want to delete and leave the group **%1$s**?\",\n \"AreYouSureDeleteThisChatSavedMessages\": \"Are you sure you want to delete **Saved Messages**?\",\n \"AreYouSureDeleteThisChatWithUser\": \"Are you sure you want to delete the chat with **%1$s**?\",\n \"AreYouSureSessionTitle\": \"Terminate session\",\n \"AreYouSureSessionsTitle\": \"Terminate sessions\",\n \"AreYouSureSessions\": \"Are you sure you want to terminate all other sessions?\",\n \"Terminate\": \"Terminate\",\n \"WhoCanCallMe\": \"Who can call me?\",\n \"WhoCanAddMe\": \"Who can add me to group chats?\",\n \"ArchivedChats\": \"Archived Chats\",\n \"Cancel\": \"Cancel\",\n \"HistoryCleared\": \"History was cleared\",\n \"Archive\": \"Archive\",\n \"Unarchive\": \"Unarchive\",\n \"Delete\": \"Delete\",\n \"Reply\": \"Reply\",\n \"Edit\": \"Edit\",\n \"Forward\": \"Forward\",\n \"CopyLink\": \"Copy Link\",\n \"Copy\": \"Copy\",\n \"Search\": \"Search\",\n \"LinkCopied\": \"Link copied to clipboard\",\n \"LinkCopiedPrivateInfo\": \"This link will only work for members of this chat.\",\n \"GroupAddMembers\": \"Add Members\",\n \"SendMessageTo\": \"Add people...\",\n //\"SelectChat\": \"Select Chat\",\n \"JumpToDate\": \"Jump to Date\",\n \"Caption\": \"Caption\",\n \"Message\": \"Message\",\n \"Poll\": \"Poll\",\n \"SharedFilesTab2\": \"Files\",\n \"SharedMediaTab2\": \"Media\",\n //\"SharedMediaTabFull2\": \"Shared Media\",\n //\"SharedGroupsTab2\": \"Groups\",\n \"SharedLinksTab2\": \"Links\",\n \"SharedMusicTab2\": \"Music\",\n \"SharedVoiceTab2\": \"Voice\",\n //\"SharedGIFsTab2\": \"GIFs\",\n \"NewPoll\": \"New Poll\",\n \"PollOptions\": \"Poll options\",\n \"AskAQuestion\": \"Ask a Question\",\n \"AddAnExplanationInfo\": \"Users will see this text after choosing the wrong answer, good for educational purposes.\",\n \"AccDescrQuizExplanation\": \"Explanation\",\n \"PhoneCopied\": \"Phone copied to clipboard\",\n \"UsernameCopied\": \"Username copied to clipboard.\",\n //\"HashtagCopied\": \"Hashtag copied to clipboard.\",\n \"BioCopied\": \"Bio copied to clipboard.\",\n \"UserBio\": \"Bio\",\n \"Username\": \"Username\",\n \"Phone\": \"Phone\",\n \"Notifications\": \"Notifications\",\n \"AreYouSureDeleteContact\": \"Are you sure you want to delete this contact?\",\n \"AreYouSureDeleteAndExit\": \"Are you sure you want to delete and leave the group?\",\n \"AreYouSureDeleteAndExitChannel\": \"Do you want to delete and leave the channel?\",\n \"DeleteContact\": \"Delete contact\",\n \"GroupType\": \"Group Type\",\n \"ChannelType\": \"Channel Type\",\n \"TypePrivate\": \"Private\",\n \"TypePublic\": \"Public\",\n \"TypePrivateGroup\": \"Private\",\n \"TypePublicGroup\": \"Public\",\n \"GroupMembers\": \"Members\",\n \"DeleteMega\": \"Delete Group\",\n \"DeleteMegaMenu\": \"Delete group\",\n \"DeleteAndExitButton\": \"Delete and Leave Group\",\n \"ChannelDelete\": \"Delete Channel\",\n \"ChannelDeleteMenu\": \"Delete channel\",\n \"ChannelPermissions\": \"Permissions\",\n \"ChannelPermissionsHeader\": \"What can members of this group do?\",\n \"ChannelAddException\": \"Add Exception\",\n \"ChannelBlockedUsers\": \"Removed users\",\n \"NoBlockedUsers\": \"No removed users\",\n \"UserRestrictions\": \"User Permissions\",\n \"UserRestrictionsDisabled\": \"This option is disabled for all members in Group Permissions\",\n \"UserRestrictionsCanDo\": \"What can this user do?\",\n \"UserRestrictionsRead\": \"Read Messages\",\n \"UserRestrictionsSend\": \"Send Messages\",\n \"UserRestrictionsSendMedia\": \"Send Media\",\n \"UserRestrictionsSendPolls\": \"Send Polls\",\n \"UserRestrictionsSendStickers\": \"Send Stickers and GIFs\",\n \"UserRestrictionsEmbedLinks\": \"Embed Links\",\n \"UserRestrictionsChangeInfo\": \"Change Chat Info\",\n \"UserRestrictionsPinMessages\": \"Pin Messages\",\n \"UserRestrictionsInviteUsers\": \"Add Users\",\n //\"UserRestrictionsNoRead\": \"can't read\",\n \"UserRestrictionsNoSend\": \"can't send messages\",\n \"UserRestrictionsNoSendMedia\": \"no media\",\n \"UserRestrictionsNoSendPolls\": \"no polls\",\n \"UserRestrictionsNoSendStickers\": \"no stickers & GIFs\",\n \"UserRestrictionsNoEmbedLinks\": \"no embed links\",\n \"UserRestrictionsNoChangeInfo\": \"can't change Info\",\n \"UserRestrictionsNoPinMessages\": \"no pins\",\n \"UserRestrictionsNoInviteUsers\": \"can't add users\",\n \"UserRestrictionsBlock\": \"Ban and remove from group\",\n \"ChannelPublic\": \"Public Channel\",\n \"MegaPublic\": \"Public Group\",\n //\"MegaLocation\": \"Location-based Group\",\n \"ChannelPublicInfo\": \"Public channels can be found in search, anyone can join them.\",\n \"MegaPublicInfo\": \"Public groups can be found in search, chat history is available to everyone and anyone can join.\",\n \"ChannelPrivate\": \"Private Channel\",\n \"MegaPrivate\": \"Private Group\",\n \"ChannelPrivateInfo\": \"Private channels can only be joined via an invite link.\",\n \"MegaPrivateInfo\": \"Private groups can only be joined if you were invited or have an invite link.\",\n \"ChannelPrivateLinkHelp\": \"People can join your channel by following this link. You can revoke the link any time.\",\n \"MegaPrivateLinkHelp\": \"People can join your group by following this link. You can revoke the link any time.\",\n \"RevokeButton\": \"Revoke\",\n \"RevokeLink\": \"Revoke Link\",\n \"RevokeAlert\": \"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.\",\n \"SetUrlPlaceholder\": \"Link\",\n \"Subscribers\": {\n \"one_value\": \"%1$d subscriber\",\n \"other_value\": \"%1$d subscribers\"\n },\n \"SearchGifsTitle\": \"Search GIFs\",\n \"PinMessageAlert\": \"Pin this message in the group?\",\n \"PinMessageAlertTitle\": \"Pin message\",\n \"PinMessageAlertChannel\": \"Do you want to pin this message in this channel?\",\n \"PinMessageAlertChat\": \"Do you want to pin this message at the top of the chat?\",\n \"UnpinMessageAlertTitle\": \"Unpin message\",\n \"UnpinMessageAlert\": \"Do you want to unpin this message?\",\n \"PinNotify\": \"Notify all members\",\n \"PinMessage\": \"Pin\",\n \"UnpinMessage\": \"Unpin\",\n \"PinAlsoFor\": \"Also pin for %1$s\",\n \"DeleteMessagesTitle\": \"Delete %1$s\",\n \"DeleteSingleMessagesTitle\": \"Delete message\",\n \"DeleteMessagesOption\": \"Unsend My Messages\",\n \"DeleteMessagesOptionAlso\": \"Also delete for %1$s\",\n \"DeleteForAll\": \"Delete for all members\",\n \"DeleteMessagesTextGroup\": \"You can also delete the %1$s you sent from the inboxes of other group members by checking \\\"Unsend my messages\\\".\",\n \"LeaveChannel\": \"Leave Channel\",\n \"LeaveChannelMenu\": \"Leave channel\",\n \"ChannelLeaveAlertWithName\": \"Are you sure you want to leave **%1$s**?\",\n \"LeaveMegaMenu\": \"Leave group\",\n \"DeleteChatUser\": \"Delete chat\",\n \"PleaseEnterCurrentPassword\": \"Enter your password\",\n \"PleaseEnterFirstPassword\": \"Enter a password\",\n \"PleaseReEnterPassword\": \"Re-enter your password\",\n \"Continue\": \"Continue\",\n \"YourEmailSkip\": \"Skip\",\n \"YourEmailSkipWarning\": \"Warning\",\n \"YourEmailSkipWarningText\": \"No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.\",\n \"TurnPasswordOffQuestionTitle\": \"Disable password\",\n \"TurnPasswordOffQuestion\": \"Are you sure you want to disable your password?\",\n \"Disable\": \"Disable\",\n \"TwoStepVerificationSetPassword\": \"Set Password\",\n \"TwoStepVerificationPasswordSet\": \"Password Set!\",\n \"TwoStepVerificationPasswordSetInfo\": \"This password will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepVerificationPasswordReturnSettings\": \"Return to Settings\",\n \"RecoveryEmail\": \"Recovery email\",\n \"RecoveryEmailTitle\": \"Recovery Email\",\n \"ResendCode\": \"Resend code\",\n \"PasswordAsHintError\": \"Hint must be different from your password\",\n \"AddStickersCount\": \"ADD %1$s\",\n \"RemoveStickersCount\": \"REMOVE %1$s\",\n \"Stickers\": {\n \"one_value\": \"%1$d sticker\",\n \"other_value\": \"%1$d stickers\"\n },\n \"HidAccount\": \"The account was hidden by the user\",\n \"TelegramFeatures\": \"Telegram Features\",\n \"SetColor\": \"Set a color\",\n \"Open\": \"Open\",\n \"OpenUrlTitle\": \"Open Link\",\n \"OpenUrlAlert2\": \"Do you want to open %1$s?\",\n \"FilterNoChatsToDisplay\": \"Folder is empty\",\n \"FilterNoChatsToDisplayInfo\": \"No chats currently belong to this folder.\",\n \"SupportStatus\": \"support\",\n \"Lately\": \"last seen recently\",\n \"WithinAWeek\": \"last seen within a week\",\n \"WithinAMonth\": \"last seen within a month\",\n \"ALongTimeAgo\": \"last seen a long time ago\",\n \"Online\": \"online\",\n \"MessageScheduleSend\": \"Send Now\",\n \"MessageScheduleEditTime\": \"Reschedule\",\n \"YouLeft\": \"You left this group\",\n \"Recent\": \"Recent\",\n \"Of\": \"%1$d of %2$d\",\n \"NoResult\": \"No results\",\n \"Updating\": \"Updating...\",\n \"Emoji\": \"Emoji\",\n \"AddContactTitle\": \"Add Contact\",\n \"HiddenName\": \"Deleted Account\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can't add this user to groups because of user's privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can't add this user to channels because of user's privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can't pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n \"GlobalSearch\": \"Global search\",\n \"SearchMessages\": \"Messages\",\n \"SearchAllChatsShort\": \"Chats\",\n \"ClearButton\": \"Clear\",\n \"FilterAllChats\": \"All Chats\",\n \"FilterAllChatsShort\": \"All\",\n \"Call\": \"Call\",\n \"VideoCall\": \"Video Call\",\n \"CallMessageOutgoing\": \"Outgoing Call\",\n \"CallMessageIncoming\": \"Incoming Call\",\n \"CallMessageVideoOutgoing\": \"Outgoing Video Call\",\n \"CallMessageVideoIncoming\": \"Incoming Video Call\",\n \"VoipExchangingKeys\": \"Exchanging encryption keys\",\n \"VoipUnmute\": \"Unmute\",\n \"SavingContentTitle\": \"Saving content\",\n \"RestrictSavingContent\": \"Restrict saving content\",\n \"RestrictSavingContentInfoGroup\": \"Members won't be able to copy, save and forward content from this group.\",\n \"RestrictSavingContentInfoChannel\": \"Subscribers won't be able to copy, save and forward content from this channel.\",\n \"ClearOtherSessionsHelp\": \"Logs out all devices except for this one.\",\n \"SessionsListInfo\": \"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.\",\n \"SponsoredMessage\": \"sponsored\",\n \"OpenChannelPost\": \"VIEW POST\",\n \"FilterNameHint\": \"Folder name\",\n \"BotStart\": \"START\",\n \"BotUnblock\": \"RESTART\",\n \"BotStop\": \"Stop bot\",\n \"BotRestart\": \"Restart bot\",\n \"ShareYouPhoneNumberTitle\": \"Share your phone number?\",\n \"AreYouSureShareMyContactInfoBot\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n \"DistanceUnitsTitle\": \"Distance units\",\n \"DistanceUnitsKilometers\": \"Kilometers\",\n \"DistanceUnitsMiles\": \"Miles\",\n \"PeopleNearby\": \"People Nearby\",\n \"MakeMyselfVisible\": \"Make Myself Visible\",\n \"MakeMyselfVisibleTitle\": \"Show Your Profile?\",\n \"MakeMyselfVisibleInfo\": \"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.\",\n \"StopShowingMe\": \"Stop Showing Me\",\n \"PeopleNearbyInfo2\": \"Exchange contact info with people nearby and find new friends.\",\n \"NearbyCreateGroup\": \"Create a Local group\",\n \"AwayTo\": \"%1$s away\",\n \"MessagePreview\": \"Message Preview\",\n \"KMetersAway2\": \"%1$s km away\",\n \"MetersAway2\": \"%1$s m away\",\n \"MilesAway\": \"%1$s mi away\",\n \"FootsAway\": \"%1$s ft away\",\n \"PeopleNearbyHeader\": \"People nearby\",\n \"ChatsNearbyHeader\": \"Groups nearby\",\n \"ChatLocation\": \"Location\",\n \"RequestToJoinGroupDescription\": \"This group accepts new members only after they are approved by its admins.\",\n \"RequestToJoinChannelDescription\": \"This channel accepts new subscribers only after they are approved by its admins.\",\n \"RequestToJoinSent\": \"Join request sent\",\n \"RequestToJoinGroupApproved\": \"Your request to join the group was approved\",\n \"RequestToJoinChannelApproved\": \"Your request to join the channel was approved\",\n \"Update\": \"UPDATE\",\n \"Reactions\": \"Reactions\",\n \"DoubleTapSetting\": \"Quick Reaction\",\n \"EnableReactions\": \"Enable Reactions\",\n \"EnableReactionsChannelInfo\": \"Allow subscribers to react to channel posts.\",\n \"EnableReactionsGroupInfo\": \"Allow members to react to group messages.\",\n \"AvailableReactions\": \"Available reactions\",\n \"NobodyViewed\": \"Nobody viewed\",\n \"MessageSeen\": {\n \"one_value\": \"Seen\",\n \"other_value\": \"%1$d Seen\"\n },\n // \"Close\": \"Close\",\n \"DataSettings\": \"Data and Storage\",\n \"GroupsAndChannelsHelp\": \"Change who can add you to groups and channels.\",\n \"SessionsInfo\": \"Control your sessions on other devices.\",\n \"StickersBotInfo\": \"Artists are welcome to add their own sticker sets using our @stickers bot.\",\n \"AutomaticMediaDownload\": \"Automatic media download\",\n \"AutoDownloadPhotos\": \"Photos\",\n \"AutoDownloadVideos\": \"Videos\",\n \"AutoDownloadFiles\": \"Files\",\n \"AutoDownloadOnAllChats\": \"On in all chats\",\n \"AutoDownloadUpToOnAllChats\": \"Up to %1$s in all chats\",\n \"AutoDownloadOff\": \"Off\",\n \"AutoDownloadOnUpToFor\": \"Up to %1$s for %2$s\",\n \"AutoDownloadOnFor\": \"On for %1$s\",\n \"AutoDownloadContacts\": \"Contacts\",\n \"AutoDownloadPm\": \"PM\",\n \"AutoDownloadGroups\": \"Groups\",\n \"AutoDownloadChannels\": \"Channels\",\n \"AutoDownloadAudioInfo\": \"Voice messages are tiny, so they're always downloaded automatically.\",\n \"AutoplayMedia\": \"Auto-play media\",\n \"AutoDownloadPhotosTitle\": \"Auto-download photos\",\n \"AutoDownloadVideosTitle\": \"Auto-download videos and GIFs\",\n \"AutoDownloadFilesTitle\": \"Auto-download files and music\",\n \"AutoDownloadMaxFileSize\": \"Maximum file size\",\n \"AutodownloadSizeLimitUpTo\": \"up to %1$s\",\n \"ResetAutomaticMediaDownload\": \"Reset Auto-Download Settings\",\n \"ResetAutomaticMediaDownloadAlertTitle\": \"Reset settings\",\n \"ResetAutomaticMediaDownloadAlert\": \"Are you sure you want to reset auto-download settings?\",\n \"Reset\": \"Reset\",\n \"SendMessageAsTitle\": \"Send message as...\",\n \"Devices\": \"Devices\",\n \"LanguageName\": \"English\",\n \"EditCantEditPermissionsPublic\": \"This permission is not available in public groups.\",\n \"VoipUserMicrophoneIsOff\": \"%s\\'s microphone is off\",\n \"VoipUserCameraIsOff\": \"%s\\'s camera is off\",\n \"PrivacyPhoneInfo4\": \"This public link opens a chat with you:\",\n\n // * macos\n \"AccountSettings.Filters\": \"Chat Folders\",\n \"AccountSettings.Notifications\": \"Notifications and Sounds\",\n \"AccountSettings.PrivacyAndSecurity\": \"Privacy and Security\",\n \"AccountSettings.Language\": \"Language\",\n \"Alert.UserDoesntExists\": \"Sorry, this user doesn't seem to exist.\",\n \"Alert.Confirm.Discard\": \"Discard\",\n \"Appearance.Reset\": \"Reset to Defaults\",\n \"AutoDownloadSettings.Delimeter\": \", \",\n \"AutoDownloadSettings.LastDelimeter\": \" and \",\n \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\n \"Call.Accept\": \"Accept\",\n \"Call.Decline\": \"Decline\",\n \"Call.End\": \"End\",\n \"Call.Camera\": \"Camera\",\n \"Call.Mute\": \"Mute\",\n \"Call.Recall\": \"Recall\",\n \"Call.Close\": \"Close\",\n \"Call.Screen\": \"Screen\",\n \"Call.Confirm.Discard.Voice.Header\": \"Video Chat in Progress\",\n \"Call.Confirm.Discard.Voice.ToVoice.Text\": \"Leave video chat in \\\"%1$@\\\" and start a new one in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Voice.ToCall.Text\": \"Leave video chat in \\\"%1$@\\\" and start a call with \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.Header\": \"Call in Progress\",\n \"Call.Confirm.Discard.Call.ToVoice.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.ToCall.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.PrivacyErrorMessage\": \"Sorry, you cannot call %@ because of their privacy settings.\",\n \"Call.StatusRequesting\": \"Contacting...\",\n \"Call.StatusRinging\": \"Ringing...\",\n \"Call.StatusConnecting\": \"Connecting...\",\n \"Call.StatusEnded\": \"Call Ended\",\n \"Call.StatusFailed\": \"Call Failed\",\n \"Call.StatusBusy\": \"Busy\",\n \"Call.StatusCalling\": \"is calling you...\",\n \"Contacts.PhoneNumber.NotRegistred\": \"The person with this phone number is not registered on Telegram yet.\",\n \"Channel.UsernameAboutChannel\": \"People can share this link with others and can find your channel using Telegram search.\",\n \"Channel.UsernameAboutGroup\": \"People can share this link with others and find your group using Telegram search.\",\n \"Chat.Accessory.Forward\": {\n \"one_value\": \"Forward Message\",\n \"other_value\": \"Forward %d Messages\"\n },\n \"Chat.Accessory.Forward.You\": \"You\",\n \"Chat.Accessory.Forward.From\": \"From\",\n \"Chat.Accessory.Hidden\": {\n \"one_value\": \"Forward Message (sender's name hidden)\",\n \"other_value\": \"Forward %d Messages (senders' names hidden)\"\n },\n \"Chat.Alert.Forward.Action.Another\": \"Forward to Another Chat\",\n \"Chat.Alert.Forward.Action.Hide1\": {\n \"one_value\": \"Hide Sender's Name\",\n \"other_value\": \"Hide Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.Show1\": {\n \"one_value\": \"Show Sender's Name\",\n \"other_value\": \"Show Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.ShowCaption\": {\n \"one_value\": \"Show Caption\",\n \"other_value\": \"Show Captions\"\n },\n \"Chat.Alert.Forward.Action.HideCaption\": {\n \"one_value\": \"Hide Caption\",\n \"other_value\": \"Hide Captions\"\n },\n \"Chat.CopySelectedText\": \"Copy Selected Text\",\n \"Chat.Confirm.Unpin\": \"Would you like to unpin this message?\",\n \"Chat.Context.Reacted\": \"%1$@/%2$@ Reacted\",\n \"Chat.Context.ReactedFast\": {\n \"other_value\": \"%d Reacted\"\n },\n \"Chat.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.Call.Cancelled\": \"Cancelled\",\n \"Chat.Service.Call.Missed\": \"Missed\",\n \"Chat.Service.PeerJoinedTelegram\": \"%@ joined Telegram\",\n \"Chat.Service.Channel.UpdatedTitle\": \"Channel renamed to \\\"%@\\\"\",\n \"Chat.Service.Channel.UpdatedPhoto\": \"Channel photo updated\",\n \"Chat.Service.Channel.RemovedPhoto\": \"Channel photo removed\",\n \"Chat.Service.Channel.UpdatedVideo\": \"Channel video updated\",\n \"Chat.Service.BotPermissionAllowed\": \"You allowed this bot to message you when you logged in on %@\",\n \"Chat.Service.Group.UpdatedPinnedMessage\": \"%@ pinned \\\"%@\\\"\",\n \"Chat.Service.VoiceChatStarted\": \"%1$@ started a [video chat](open)\",\n \"Chat.Service.VoiceChatStartedYou\": \"You started a [video chat](open)\",\n \"Chat.Service.VoiceChatStarted.Channel\": \"[Live Stream](open) started\",\n \"Chat.Service.VoiceChatFinished\": \"%1$@ ended the video chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the video chat (%@)\",\n \"Chat.Service.VoiceChatFinished.Channel\": \"Live Stream ended (%1$@)\",\n \"Chat.Service.VoiceChatInvitation\": \"%1$@ invited %2$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationByYou\": \"You invited %1$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationForYou\": \"%1$@ invited you to the [video chat](open)\",\n \"ChatService.UserJoinedGroupByRequest\": \"%@ was accepted to the group\",\n \"ChatService.UserJoinedChannelByRequest\": \"%@ joined the channel by request\",\n \"ChatList.Service.VoiceChatScheduled\": \"%1$@ scheduled a video chat for %2$@\",\n \"ChatList.Service.VoiceChatScheduledYou\": \"You scheduled a video chat for %2$@\",\n \"Chat.Poll.Unvote\": \"Retract Vote\",\n \"Chat.Poll.Stop\": \"Stop Poll\",\n \"Chat.Poll.ViewResults\": \"View Results\",\n \"Chat.Poll.SubmitVote\": \"Vote\",\n \"Chat.Poll.Type.Anonymous\": \"Anonymous Poll\",\n \"Chat.Poll.Type.Public\": \"Poll\",\n \"Chat.Poll.Type.AnonymousQuiz\": \"Anonymous Quiz\",\n \"Chat.Poll.Type.Quiz\": \"Quiz\",\n \"Chat.Poll.Type.Closed\": \"Final Results\",\n \"Chat.Poll.TotalVotes1\": {\n \"one_value\": \"%d vote\",\n \"other_value\": \"%d votes\"\n },\n \"Chat.Quiz.TotalVotes\": {\n \"one_value\": \"%d answer\",\n \"other_value\": \"%d answers\"\n },\n \"Chat.Poll.TotalVotesEmpty\": \"No votes yet\",\n \"Chat.Poll.TotalVotesResultEmpty\": \"No votes\",\n \"Chat.Quiz.TotalVotesEmpty\": \"No answers yet\",\n \"Chat.Quiz.TotalVotesResultEmpty\": \"No answers\",\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n \"Chat.Pinned.DontShow\": \"Don't Show Pinned Messages\",\n \"Chat.Title.Comments\": {\n \"one_value\": \"%d Comment\",\n \"other_value\": \"%d Comments\"\n },\n \"ChatTitle.ReportMessages\": \"Report Messages\",\n \"Chat.Send.WithoutSound\": \"Send Without Sound\",\n \"Chat.Send.SetReminder\": \"Set a Reminder\",\n \"Chat.Send.ScheduledMessage\": \"Schedule Message\",\n \"Chat.SendAs.PersonalAccount\": \"personal account\",\n \"Chat.UnpinAllMessagesConfirmation\": {\n \"one_value\": \"Do you want to unpin %d message in this chat?\",\n \"other_value\": \"Do you want to unpin all %d messages in this chat?\"\n },\n \"Chat.Message.Ad.Text\": \"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.\",\n \"Chat.Message.Ad.ReadMore\": \"Read More\",\n \"Chat.Message.ViewChannel\": \"VIEW CHANNEL\",\n \"Chat.Message.ViewBot\": \"VIEW BOT\",\n \"Chat.Message.ViewGroup\": \"VIEW GROUP\",\n \"Chat.Message.Sponsored.What\": \"What are sponsored messages?\",\n \"Chat.Message.Sponsored.Link\": \"https://promote.telegram.org\",\n \"ChatList.Context.Mute\": \"Mute\",\n \"ChatList.Context.Unmute\": \"Unmute\",\n \"ChatList.Context.Pin\": \"Pin\",\n \"ChatList.Context.Unpin\": \"Unpin\",\n \"ChatList.Context.DeleteChat\": \"Delete Chat\",\n \"ChatList.Context.DeleteAndExit\": \"Delete and Leave\",\n \"ChatList.Context.LeaveChannel\": \"Leave Channel\",\n \"ChatList.Context.LeaveGroup\": \"Leave Group\",\n \"ChatList.Service.Call.incoming\": \"Incoming Call (%@)\",\n \"ChatList.Service.Call.outgoing\": \"Outgoing Call (%@)\",\n \"ChatList.Service.VideoCall.incoming\": \"Incoming Video Call (%@)\",\n \"ChatList.Service.VideoCall.outgoing\": \"Outgoing Video Call (%@)\",\n \"ChatList.Service.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed Call\",\n \"ChatList.Service.VideoCall.Cancelled\": \"Cancelled Video Call\",\n \"ChatList.Service.VideoCall.Missed\": \"Missed Video Call\",\n \"ChatList.Service.VoiceChatScheduled.Channel\": \"Voice chat scheduled for %@\",\n \"ChatList.Filter.Header\": \"Create folders for different groups of chats and quickly switch between them.\",\n \"ChatList.Filter.NewTitle\": \"Create Folder\",\n \"ChatList.Filter.List.Title\": \"Chat Folders\",\n \"ChatList.Filter.Include.AddChat\": \"Add Chats\",\n \"ChatList.Filter.Exclude.AddChat\": \"Add Chats\",\n //\"ChatList.Filter.All\": \"All\",\n \"ChatList.Filter.Contacts\": \"Contacts\",\n \"ChatList.Filter.NonContacts\": \"Non-Contacts\",\n \"ChatList.Filter.Groups\": \"Groups\",\n \"ChatList.Filter.Channels\": \"Channels\",\n \"ChatList.Filter.Bots\": \"Bots\",\n \"ChatList.Filter.MutedChats\": \"Muted\",\n \"ChatList.Filter.ReadChats\": \"Read\",\n \"ChatList.Filter.Archive\": \"Archived\",\n \"ChatList.Filter.Include.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Exclude.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Confirm.Remove.Header\": \"Remove Folder\",\n \"ChatList.Filter.Confirm.Remove.Text\": \"Are you sure you want to remove this folder? Your chats will not be deleted.\",\n \"ChatList.Mute.1Hour\": \"For 1 Hour\",\n \"ChatList.Mute.4Hours\": \"For 4 Hours\",\n \"ChatList.Mute.8Hours\": \"For 8 Hours\",\n \"ChatList.Mute.1Day\": \"For 1 Day\",\n \"ChatList.Mute.3Days\": \"For 3 Days\",\n \"ChatList.Mute.Forever\": \"Forever\",\n \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"FileSize.B\": \"%@ B\",\n \"FileSize.KB\": \"%@ KB\",\n \"FileSize.MB\": \"%@ MB\",\n \"FileSize.GB\": \"%@ GB\",\n \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\n \"LastSeen.HoursAgo\": {\n \"one_value\": \"last seen %d hour ago\",\n \"other_value\": \"last seen %d hours ago\"\n },\n \"Login.Register.LastName.Placeholder\": \"Last Name\",\n \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"Modal.Send\": \"Send\",\n \"NewPoll.Anonymous\": \"Anonymous Voting\",\n \"NewPoll.Explanation.Placeholder\": \"Add a Comment (Optional)\",\n \"NewPoll.OptionsAddOption\": \"Add an Option\",\n \"NewPoll.MultipleChoice\": \"Multiple Answers\",\n \"NewPoll.Quiz\": \"Quiz Mode\",\n \"Notification.Contact.Reacted\": \"%1$@ to your \\\"%2$@\\\"\",\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \\\"%3$@\\\"\",\n \"Peer.Activity.User.PlayingGame\": \"playing a game\",\n \"Peer.Activity.User.TypingText\": \"typing\",\n \"Peer.Activity.User.SendingPhoto\": \"sending a photo\",\n \"Peer.Activity.User.RecordingVideo\": \"recording video\",\n \"Peer.Activity.User.SendingVideo\": \"sending a video\",\n \"Peer.Activity.User.RecordingAudio\": \"recording voice\",\n \"Peer.Activity.User.SendingFile\": \"sending file\",\n \"Peer.Activity.User.ChoosingSticker\": \"choosing a sticker\",\n \"Peer.Activity.User.EnjoyingAnimations\": \"watching %@\",\n \"Peer.Activity.Chat.PlayingGame\": \"%@ is playing a game\",\n \"Peer.Activity.Chat.TypingText\": \"%@ is typing\",\n \"Peer.Activity.Chat.SendingPhoto\": \"%@ is sending a photo\",\n \"Peer.Activity.Chat.RecordingVideo\": \"%@ is recording video\",\n \"Peer.Activity.Chat.SendingVideo\": \"%@ is sending a video\",\n \"Peer.Activity.Chat.RecordingAudio\": \"%@ is recording voice\",\n \"Peer.Activity.Chat.SendingFile\": \"%@ is sending a file\",\n \"Peer.Activity.Chat.ChoosingSticker\": \"%@ is choosing a sticker\",\n \"Peer.Activity.Chat.EnjoyingAnimations\": \"%@ is watching %@\",\n \"Peer.Activity.Chat.Multi.PlayingGame1\": \"%@ and %d others are playing a game\",\n \"Peer.Activity.Chat.Multi.TypingText1\": \"%@ and %d others are typing\",\n \"Peer.Activity.Chat.Multi.SendingPhoto1\": \"%@ and %d others are sending photos\",\n \"Peer.Activity.Chat.Multi.RecordingVideo1\": \"%@ and %d others are recording video\",\n \"Peer.Activity.Chat.Multi.SendingVideo1\": \"%@ and %d others are sending videos\",\n \"Peer.Activity.Chat.Multi.RecordingAudio1\": \"%@ and %d others are recording voice\",\n //\"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n \"Peer.Activity.Chat.Multi.SendingFile1\": \"%@ and %d others are sending files\",\n \"Peer.Activity.Chat.Multi.ChoosingSticker1\": \"%@ and %d others are choosing stickers\",\n \"Peer.ServiceNotifications\": \"service notifications\",\n \"Peer.RepliesNotifications\": \"Reply Notifications\",\n \"Peer.Status.justNow\": \"last seen just now\",\n \"Peer.Status.Today\": \"today\",\n \"Peer.Status.Yesterday\": \"yesterday\",\n \"Peer.Status.LastSeenAt\": \"last seen %@ at %@\",\n \"Peer.Status.minAgo\": {\n \"one_value\": \"last seen %d minute ago\",\n \"other_value\": \"last seen %d minutes ago\"\n },\n \"Peer.Status.Member\": {\n \"one_value\": \"%d member\",\n \"other_value\": \"%d members\"\n },\n \"Peer.Status.Subscribers\": {\n \"one_value\": \"%d subscriber\",\n \"other_value\": \"%d subscribers\"\n },\n \"PeerInfo.Administrators\": \"Administrators\",\n \"PeerInfo.DeleteChannel\": \"Delete Channel\",\n \"PeerInfo.Discussion\": \"Discussion\",\n \"PeerInfo.Discussion.Add\": \"Add\",\n \"PeerInfo.SignMessages\": \"Sign Messages\",\n \"PeerInfo.SharedMedia\": \"Shared Media\",\n \"PeerInfo.Subscribers\": \"Subscribers\",\n \"PeerInfo.DeleteContact\": \"Delete Contact\",\n //\"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n \"PeerInfo.Action.VoiceChat\": \"Video Chat\",\n \"PeerInfo.Action.LiveStream\": \"Live Stream\",\n \"PeerMedia.Members\": \"Members\",\n \"PollResults.Title.Poll\": \"Poll Results\",\n \"PollResults.Title.Quiz\": \"Quiz Results\",\n \"PollResults.LoadMore\": {\n \"other_value\": \"Show More (%d)\"\n },\n //\"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n \"Preview.Dragging.AddItems\": {\n \"one_value\": \"Add Item\",\n \"other_value\": \"Add Items\"\n },\n \"PreviewSender.CaptionPlaceholder\": \"Add a caption...\",\n \"PreviewSender.CompressFile\": \"Send compressed\",\n \"PreviewSender.SendFile\": {\n \"one_value\": \"Send File\",\n \"other_value\": \"Send %d Files\"\n },\n \"PreviewSender.SendPhoto\": {\n \"one_value\": \"Send Photo\",\n \"other_value\": \"Send %d Photos\"\n },\n \"PreviewSender.SendVideo\": {\n \"one_value\": \"Send Video\",\n \"other_value\": \"Send %d Videos\"\n },\n \"PrivacyAndSecurity.Item.On\": \"On\",\n \"PrivacyAndSecurity.Item.Off\": \"Off\",\n \"PrivacyAndSecurity.SensitiveText\": \"Disable filtering\",\n \"PrivacyAndSecurity.SensitiveDesc\": \"Display sensitive media in public channels on all your Telegram devices.\",\n \"PrivacySettings.VoiceCalls\": \"Calls\",\n \"PrivacySettings.Forwards\": \"Forwarded Messages\",\n \"PrivacySettings.Groups\": \"Groups and Channels\",\n \"PrivacySettingsController.AddUsers\": \"Add Users\",\n \"PrivacySettingsController.GroupDescription\": \"You can restrict who can add you to groups and channels with granular precision.\",\n \"PrivacySettingsController.Forwards.CustomHelp\": \"You can restrict who can add a link to your account when forwarding your messages.\",\n \"PrivacySettingsController.P2p.Desc\": \"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.\",\n \"PrivacySettingsController.PhoneCallDescription\": \"You can restrict who can call you with granular precision.\",\n \"PrivacySettingsController.ProfilePhoto.CustomHelp\": \"You can restrict who can see your profile photo with granular precision.\",\n \"PrivacySettingsController.LastSeenDescription\": \"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).\",\n \"PrivacySettingsController.PeerInfo\": \"You can add users or entire groups as exceptions that will override the settings above.\",\n \"PrivacySettingsController.Everbody\": \"Everybody\",\n \"PrivacySettingsController.MyContacts\": \"My Contacts\",\n \"PrivacySettingsController.Nobody\": \"Nobody\",\n \"PrivacySettingsController.NeverShare\": \"Never Share With\",\n \"PrivacySettingsController.AlwaysShare\": \"Always Share With\",\n \"PrivacySettingsController.NeverAllow\": \"Never Allow\",\n \"PrivacySettingsController.AlwaysAllow\": \"Always Allow\",\n \"PrivacySettingsController.UserCount\": {\n \"one_value\": \"%d user\",\n \"other_value\": \"%d users\"\n },\n \"RecentSessions.Error.FreshReset\": \"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.\",\n \"RequestJoin.Button\": \"Request to Join\",\n \"Stickers.SearchAdd\": \"Add\",\n \"Stickers.SearchAdded\": \"Added\",\n \"Stickers.SuggestStickers\": \"Suggest Stickers by Emoji\",\n \"ShareModal.Search.Placeholder\": \"Share to...\",\n \"ShareModal.Search.ForwardPlaceholder\": \"Forward to...\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\n \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"Search.Confirm.ClearHistory\": \"Are you sure you want to clear your search history?\",\n \"Separator.ShowMore\": \"show more\",\n \"Separator.ShowLess\": \"show less\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"StickerSet.DontExist\": \"Sorry, this sticker set doesn't seem to exist.\",\n \"Text.Context.Copy.Username\": \"Copy Username\",\n \"Text.Context.Copy.Hashtag\": \"Copy Hashtag\",\n \"Time.TomorrowAt\": \"tomorrow at %@\",\n \"TwoStepAuth.SetPasswordHelp\": \"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepAuth.GenericHelp\": \"You have enabled Two-Step verification.\\nYou'll need the password you set up here to log in to your Telegram account.\",\n \"TwoStepAuth.ChangePassword\": \"Change Password\",\n \"TwoStepAuth.RemovePassword\": \"Turn Password Off\",\n \"TwoStepAuth.SetupEmail\": \"Set Recovery Email\",\n \"TwoStepAuth.ChangeEmail\": \"Change Recovery Email\",\n \"TwoStepAuth.ConfirmEmailCodeDesc\": \"Please enter the code we've just emailed to %@.\",\n \"TwoStepAuth.RecoveryTitle\": \"Email Code\",\n \"TwoStepAuth.RecoveryCode\": \"Code\",\n \"TwoStepAuth.RecoveryCodeInvalid\": \"Invalid code. Please try again.\",\n \"TwoStepAuth.RecoveryCodeExpired\": \"Code Expired\",\n \"TwoStepAuth.SetupHintTitle\": \"Password Hint\",\n \"TwoStepAuth.SetupHintPlaceholder\": \"Hint\",\n \"UsernameSettings.ChangeDescription\": \"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\",\n \"VoiceChat.Chat.StartNew\": \"Video chat ended. Start a new one?\",\n \"VoiceChat.Chat.StartNew.OK\": \"Start\",\n \"VoiceChat.Chat.Ended\": \"Video chat ended.\",\n \"VoiceChat.Invite.InviteMembers\": \"Invite members\",\n \"VoiceChat.Status.Connecting\": \"Connecting...\",\n \"VoiceChat.Status.Members\": {\n \"one_value\": \"%d participant\",\n \"other_value\": \"%d participants\"\n },\n \"VoiceChat.Status.MutedForYou\": \"muted for you\",\n \"VoiceChat.Status.Speaking\": \"speaking\",\n \"VoiceChat.Status.Listening\": \"listening\",\n \"VoiceChat.Status.WantsSpeak\": \"wants to speak\",\n \"VoiceChat.Status.Muted\": \"muted\",\n \"VoiceChat.Status.You\": \"This is you\",\n \"VoiceChat.Video.Stream.Video\": \"video\",\n \"VoiceChat.Video.Stream.Screencast\": \"screen\",\n \"VoiceChat.Video.Stream.More\": \"more\",\n \"VoiceChat.Leave\": \"Leave\",\n \"VoiceChat.End.Title\": \"Leave video chat\",\n \"VoiceChat.End.Text\": \"Are you sure you want to leave this video chat?\",\n \"VoiceChat.End.Third\": \"End Video Chat\",\n \"VoiceChat.End.OK\": \"Leave\",\n \"VoiceChat.MutePeer\": \"Mute\",\n \"VoiceChat.UnmutePeer\": \"Allow To Speak\",\n \"VoiceChat.RemovePeer\": \"Remove\",\n \"VoiceChat.OpenProfile\": \"Open Profile\",\n \"VoiceChat.MuteForMe\": \"Mute For Me\",\n \"VoiceChat.UnmuteForMe\": \"Unmute For Me\",\n \"VoiceChat.RemovePeer.Confirm.Channel\": \"Do you want to remove %1$@ from the channel?\",\n \"VoiceChat.RemovePeer.Confirm\": \"Are you sure you want to remove %1$@ from the group?\",\n \"VoiceChat.RemovePeer.Confirm.OK\": \"Remove\"\n};\n\nexport default lang;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.fbaab4d21ceabe711757.chunk.js b/public/8.fbaab4d21ceabe711757.chunk.js deleted file mode 100644 index 1e8a7314..00000000 --- a/public/8.fbaab4d21ceabe711757.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[8],{9179:(X,e,o)=>{o.r(e),o.d(e,{default:()=>t});const t={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); -//# sourceMappingURL=8.fbaab4d21ceabe711757.chunk.js.map \ No newline at end of file diff --git a/public/8.fbaab4d21ceabe711757.chunk.js.map b/public/8.fbaab4d21ceabe711757.chunk.js.map deleted file mode 100644 index 19a1b0d8..00000000 --- a/public/8.fbaab4d21ceabe711757.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"8.fbaab4d21ceabe711757.chunk.js","mappings":"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","sources":["webpack://tweb/./src/countries.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 type { HelpCountriesList } from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"X XXXXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d'Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\"}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"country_code\":\"961\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"country_code\":\"60\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\",\"97 XXXX XXXXX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"country_code\":\"378\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"country_code\":\"685\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find(c => c.name === 'United States'),\n '44': Countries.find(c => c.name === 'United Kingdom'),\n '61': Countries.find(c => c.name === 'Australia'),\n '64': Countries.find(c => c.name === 'New Zealand'),\n '246': Countries.find(c => c.name === 'Diego Garcia'),\n '255': Countries.find(c => c.name === 'Tanzania'),\n '262': Countries.find(c => c.name === 'Reunion'),\n '500': Countries.find(c => c.name === 'Falkland Islands'),\n '590': Countries.find(c => c.name === 'Guadeloupe'),\n '672': Countries.find(c => c.name === 'Norfolk Island'),\n '1 268': Countries.find(c => c.name === 'Antigua & Barbuda'),\n}; */\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"names":["_","countries","hash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/810.bd27b2cf5e0477ce915d.chunk.js b/public/810.bd27b2cf5e0477ce915d.chunk.js deleted file mode 100644 index 14fa6a95..00000000 --- a/public/810.bd27b2cf5e0477ce915d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[810],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});var a=n(6858),o=n(8805),i=n(4687),s=n(9518),c=n(8598),r=n(4874),d=n(503),l=n(9807),u=n(4494),p=n(4789),h=n(5432),m=n(4159),g=n(4727),f=n(2897),v=n(1405),y=n(4668),L=n(8497),E=n(144),b=n(6947),Z=n(8576),_=n(4465),w=n(9638),k=n(3910),S=n(2738),T=n(5565),x=n(1656),C=n(7487),N=n(2398),P=n(671),I=n(6669),A=n(7922),D=n(3512),M=n(709),O=n(9976);let B,H=null;const R=new r.Z("page-sign",!0,(()=>{const e=()=>{t=g.default.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let t;e(),D.default.addEventListener("language_change",(()=>{e()}));const r=new Map;let v,j;const U=document.createElement("div");U.classList.add("input-wrapper");const W=new d.Z({label:"Login.CountrySelectorLabel",name:(0,E.a)()});W.container.classList.add("input-select");const q=W.input,F=document.createElement("div");F.classList.add("select-wrapper","z-depth-3","hide");const K=document.createElement("span");K.classList.add("arrow","arrow-down"),W.container.append(K);const V=document.createElement("ul");F.appendChild(V),new o.ZP(F);let z=()=>{z=null,t.forEach((e=>{const t=(0,P.Ml)(e.iso2),n=[];e.country_codes.forEach((a=>{const o=document.createElement("li");let i=c.o.wrapEmojiText(t);if(O.Z){const e=document.createElement("span");e.innerHTML=i,o.append(e)}else o.innerHTML=i;const s=(0,g.i18n)(e.default_name);s.dataset.defaultName=e.default_name,o.append(s);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+a.country_code,o.appendChild(r),n.push(o),V.append(o)})),r.set(e.iso2,n)})),V.addEventListener("mousedown",(e=>{if(0!==e.button)return;const t=(0,y.Z)(e.target,"LI");Q(t)})),W.container.appendChild(F)};const Q=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,o=a.replace(/\D/g,"");(0,T.Z)(q,(0,g.i18n)(n)),(0,I.Z)(q,"input"),v=t.find((e=>e.default_name===n)),j=v.country_codes.find((e=>e.country_code===o)),Y.value=Y.lastValue=a,X(),setTimeout((()=>{ee.focus(),(0,N.Z)(ee,!0)}),0)};let $;z(),q.addEventListener("focus",(function(e){z?z():t.forEach((e=>{r.get(e.iso2).forEach((e=>e.style.display=""))})),clearTimeout($),$=void 0,F.classList.remove("hide"),F.offsetWidth,F.classList.add("active"),W.select(),(0,p.Z)({container:R.pageEl.parentElement.parentElement,element:q,position:"start",margin:4}),setTimeout((()=>{G||(document.addEventListener("mousedown",J,{capture:!0}),G=!0)}),0)}));let G=!1;const J=e=>{(0,L.Z)(e.target,"input-select")||e.target!==q&&(X(),document.removeEventListener("mousedown",J,{capture:!0}),G=!1)},X=()=>{void 0===$&&(F.classList.remove("active"),$=window.setTimeout((()=>{F.classList.add("hide"),$=void 0}),200))};q.addEventListener("keyup",(e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=W.value.toLowerCase(),o=[];t.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const n=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");n.length>1&&t.push(n)}));let n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(a)));r.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&o.push(e)})),0===o.length?t.forEach((e=>{r.get(e.iso2).forEach((e=>e.style.display=""))})):1===o.length&&"Enter"===n&&Q(r.get(o[0].iso2)[0])})),K.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),q.matches(":focus")?q.blur():q.focus()}));const Y=new M.Z({onInput:e=>{f.Z.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===W.value||v&&t&&n&&(v===t||j.country_code===n.country_code)||((0,T.Z)(q,t?(0,g.i18n)(t.default_name):a),v=t,j=n),t||Y.value.length-1>1?H.style.visibility="":H.style.visibility="hidden"}}),ee=Y.input;ee.addEventListener("keypress",(e=>{if(!H.style.visibility&&"Enter"===e.key)return ne()}));const te=new l.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});te.input.addEventListener("change",(()=>{const e=te.checked;i.default.pushToState("keepSigned",e),b.Z.toggleStorage(e),Z.Z.toggleStorage(e),s.Z.toggleStorage(e),C.Z.toggleStorage(e)})),i.default.getState().then((e=>{i.default.storage.isAvailable()?te.checked=e.keepSigned:(te.checked=!1,te.label.classList.add("checkbox-disabled"))})),H=(0,u.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),H.style.visibility="hidden";const ne=e=>{e&&(0,k.d)(e);const t=(0,x.Z)([H,B],!0);(0,T.Z)(H,(0,g.i18n)("PleaseWait")),(0,a.y7)(H);let o=Y.value;s.Z.invokeApi("auth.sendCode",{phone_number:o,api_id:m.Z.id,api_hash:m.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:o}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(Y.setError(),(0,T.Z)(Y.label,(0,g.i18n)("Login.PhoneLabelInvalid")),ee.classList.add("error"),(0,T.Z)(H,(0,g.i18n)("Login.Next"))):(console.error("auth.sendCode error:",e),H.innerText=e.type)}))};(0,S.fc)(H,ne),B=(0,u.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),B.addEventListener("click",(()=>{_.default.mount()})),U.append(W.container,Y.container,te.label,H,B);const ae=document.createElement("h4");ae.classList.add("text-center"),(0,g._i18n)(ae,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),(0,g._i18n)(oe,"Login.StartText"),R.pageEl.querySelector(".container").append(ae,oe,U),h.IS_TOUCH_SUPPORTED||setTimeout((()=>{ee.focus()}),0),(0,w.Z)(U),s.Z.invokeApi("help.getNearestDc").then((e=>{var t;const n=A.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.default.getLangPack(n.lang_code).then((()=>{(0,I.Z)(ee,"input")}));const a=new Set([1,2,3,4,5]),o=[e.this_dc];let i;return e.nearest_dc!==e.this_dc&&(i=s.Z.getNetworker(e.nearest_dc).then((()=>{o.push(e.nearest_dc)}))),(i||Promise.resolve()).then((()=>{o.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,i=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield C.Z.get(a))return t();setTimeout((()=>{s.Z.getNetworker(n).finally(t)}),3e3)},new((o=void 0)||(o=Promise))((function(e,t){function s(e){try{r(i.next(e))}catch(e){t(e)}}function c(e){try{r(i.throw(e))}catch(e){t(e)}}function r(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,c)}r((i=i.apply(n,a||[])).next())}));var n,a,o,i};t()})),e})).then((e=>{W.value.length||Y.value.length||Q(r.get(e.country)[0])}))}),(()=>{H&&((0,T.Z)(H,(0,g.i18n)("Login.Next")),(0,v.ripple)(H,void 0,void 0,!0),H.removeAttribute("disabled")),B&&B.removeAttribute("disabled"),i.default.pushToState("authState",{_:"authStateSignIn"})})),j=R}}]); -//# sourceMappingURL=810.bd27b2cf5e0477ce915d.chunk.js.map \ No newline at end of file diff --git a/public/810.bd27b2cf5e0477ce915d.chunk.js.map b/public/810.bd27b2cf5e0477ce915d.chunk.js.map deleted file mode 100644 index e658f30e..00000000 --- a/public/810.bd27b2cf5e0477ce915d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"810.bd27b2cf5e0477ce915d.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\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/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\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 findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\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 { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet 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 const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\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 let 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 replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\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 appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.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 let phone_number = telInputField.value;\r\n 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 let 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 let tryAgain = () => {\r\n 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 simulateEvent(telEl, 'input');\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;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(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 => {\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 apiManager.getNetworker(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 selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\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 appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","setCountries","countries","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","document","createElement","classList","add","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","spanEmoji","innerHTML","el","i18n","dataset","defaultName","span","innerText","country_code","push","set","addEventListener","e","button","target","selectCountryByTarget","childNodes","phoneCode","querySelector","replace","find","_countryCode","telInputField","value","lastValue","hidePicker","setTimeout","telEl","focus","hideTimeout","get","style","display","clearTimeout","undefined","remove","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","window","key","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","length","good","str","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","_i18n","subtitle","IS_TOUCH_SUPPORTED","nearestDcResult","langPack","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","ripple","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/874.0c0c899a41c0a10875da.chunk.js b/public/874.0c0c899a41c0a10875da.chunk.js deleted file mode 100644 index 7ba353ae..00000000 --- a/public/874.0c0c899a41c0a10875da.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[874],{5814:(e,t,s)=>{s.d(t,{Z:()=>d});var i=s(3512),r=s(4762),n=s(410),o=s(8487),a=s(2531),h=s(1655),l=s(7625);const c=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const s in this.byGroups){if(this.intersectionLockedGroups[s])continue;const i=this.byGroups[s].find((t=>t.el===e));if(i){t.isIntersecting?(this.visible.add(i),this.checkAnimation(i,!1)):(this.visible.delete(i),this.checkAnimation(i,!0),i.animation instanceof a.Z&&i.animation.clearCache());break}}}})),this.overrideIdleGroups=new Set,i.default.addEventListener("media_play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations())})),i.default.addEventListener("media_pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const s in this.byGroups)for(const i of this.byGroups[s])i.el===e&&t.push(i);return t}removeAnimation(e){const{el:t,animation:s}=e;s.remove(),s instanceof HTMLVideoElement&&r.IS_SAFARI&&setTimeout((()=>{s.src="",s.load()}),1e3);const i=this.byGroups[e.group];i&&((0,h.Z)(i,e),i.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e)}addAnimation(e,t=""){var s;const r={el:e instanceof a.Z?e.el:e,animation:e,group:t};e instanceof a.Z&&!i.default.settings.stickers.loop&&e.loop&&(e.loop=i.default.settings.stickers.loop),(null!==(s=this.byGroups[t])&&void 0!==s?s:this.byGroups[t]=[]).push(r),this.observer.observe(r.el)}checkAnimations(e,t,s=!1){if(void 0!==t&&!this.byGroups[t])return;const i=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of i){const i=this.byGroups[t];(0,l.Z)(i,(t=>{this.checkAnimation(t,e,s)}))}}checkAnimation(e,t=!1,s=!1){const{el:r,animation:n,group:a}=e;s||!(0,o.Z)(r)&&!this.lockedGroups[a]?this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||i.default.idle.isIDLE&&!this.overrideIdleGroups.has(e.group)||n.play()}setOnlyOnePlayableGroup(e){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];t&&t.length&&(t.forEach((e=>{this.observer.unobserve(e.el)})),window.requestAnimationFrame((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}};n.GO&&(n.GO.animationIntersector=c);const d=c},6008:(e,t,s)=>{s.d(t,{X:()=>l});var i=s(426),r=s(3512),n=s(3035),o=s(4789),a=s(5975),h=s(2648);function l(e,t,s,l,c=250,d){const u=(0,i.v)(t,e||"tabs"===t.dataset.animation?"tabs":"navigation",c,l);if(e){const i=new Proxy(u,{apply:(t,s,i)=>{const r=+i[0],n=void 0===i[1]||i[1],o=e.querySelector(`[data-tab="${r}"]`)||e.children[r];l(o,r,n)}}),l=(i,a,h=!0)=>{const l=t.children[a];if(s){const e=s(a,l,h);if(void 0!==e&&!e)return}d&&d.scrollIntoViewNew({element:i.parentElement.children[a],position:"center",forceDirection:h?void 0:o.f.Static,forceDuration:c,axis:"x"}),r.default.settings.animationsEnabled||(h=!1);const f=u.prevId();if(i.classList.contains("active")||a===f)return!1;const v=e.querySelector(p.toLowerCase()+".active");(0,n.T2)((()=>{v&&v.classList.remove("active")})),m&&-1!==f&&h&&(0,n.T2)((()=>{const e=i.querySelector("i"),t=i.parentElement.children[f].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const s=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,r=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${s}px, 0, 0) scale3d(${r}, 1, 1)`,requestAnimationFrame((()=>{e.classList.add("animate"),e.style.transform="none"}))})),(0,n.T2)((()=>{i.classList.add("active")})),u(a,h)},m=!e.classList.contains("no-stripe"),p=e.firstElementChild.tagName;return e.addEventListener("click",(function(t){let s,i=t.target;if(i=(0,a.Z)(i,e),!i)return!1;if(i.dataset.tab){if(s=+i.dataset.tab,-1===s)return!1}else s=(0,h.Z)(i);l(i,s)})),i}return u}},426:(e,t,s)=>{s.d(t,{v:()=>c});var i=s(3512),r=s(3725),n=s(8594),o=s(2648),a=s(3910);function h(e,t,s){const i=t.getBoundingClientRect().width,r=[e,t];return s&&r.reverse(),r[0].style.filter="brightness(80%)",r[0].style.transform=`translate3d(${.25*-i}px, 0, 0)`,r[1].style.transform=`translate3d(${i}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}}function l(e,t,s){const i=t.getBoundingClientRect().width,r=[e,t];return s&&r.reverse(),r[0].style.transform=`translate3d(${-i}px, 0, 0)`,r[1].style.transform=`translate3d(${i}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}}const c=(e,t,s,i,r=!0)=>{let n=null;switch(t){case"tabs":n=l;break;case"navigation":n=h}return e.dataset.animation=t,d(e,n,s,i,r)},d=(e,t,s,h,l=!0,c=!1,d=!0)=>{const u=new Map;let m,p=null;if(d){const s=t?"transitionend":"animationend",i=t=>{if((0,a.d)(t),t.target.parentElement!==e)return;const r=u.get(t.target);r&&r(),t.target===p&&(!m&&l||(m&&(m.resolve(),m=void 0),h&&h(f.prevId()),e.classList.remove("animating","backwards","disable-hover"),c&&(e.removeEventListener(s,i),p=m=void 0,u.clear())))};e.addEventListener(s,i)}function f(a,c=!0,v){v&&(p=v),a instanceof HTMLElement&&(a=(0,o.Z)(a));const y=f.prevId();if(a===y)return!1;const g=e.children[a];if(i.default.settings.animationsEnabled&&-1!==y||(c=!1),!d){const t=e.dataset.timeout;void 0!==t&&clearTimeout(+t),delete e.dataset.timeout}if(!c){if(p)p.classList.remove("active","to","from");else if(g){const e=u.get(g);e&&e()}return g&&(g.classList.remove("to","from"),g.classList.add("active")),e.classList.remove("animating","backwards","disable-hover"),p=g,void(h&&h(a))}d||(e.dataset.timeout=""+window.setTimeout((()=>{g.classList.remove("to"),p&&p.classList.remove("from"),e.classList.remove("animating","backwards","disable-hover"),delete e.dataset.timeout}),s)),p&&(p.classList.remove("to"),p.classList.add("from")),e.classList.add("animating");const w=y{g.classList.remove("to"),u.delete(g)})),p){const e=p,t=()=>{e.classList.remove("active","from"),b&&b(),u.delete(e)};if(g)u.set(e,t);else{const i=window.setTimeout(t,s);u.set(e,(()=>{clearTimeout(i),u.delete(e)}))}l&&(m||(m=(0,r.b)()),(0,n.YW)(m,2*s))}p=g}return f.prevId=()=>p?(0,o.Z)(p):-1,f}},5296:(e,t,s)=>{s.d(t,{Kx:()=>o,cK:()=>a,jt:()=>h});var i=s(3035),r=s(3725);const n=new Map;function o(e){const t=function(e){return n.get(e)}(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function a(e,t,s){return s||(s=function(e){o(e);const t={isCancelled:!1,deferred:(0,r.b)()};return n.set(e,t),t.deferred.then((()=>{n.delete(e)})),t}(t)),(0,i.T2)((()=>{s.isCancelled||(e()?a(e,t,s):s.deferred.resolve())})),s.deferred}function h(e){(0,i.T2)((()=>{e()&&h(e)}))}},7625:(e,t,s)=>{function i(e,t){for(let s=e.length-1;s>=0;--s)t(e[s],s,e)}s.d(t,{Z:()=>i})},1655:(e,t,s)=>{function i(e,t){const s=e.indexOf(t),i=-1!==s&&e.splice(s,1);return i&&i[0]}s.d(t,{Z:()=>i})},5975:(e,t,s)=>{function i(e,t){if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}s.d(t,{Z:()=>i})},8487:(e,t,s)=>{function i(e){return null==e?void 0:e.isConnected}s.d(t,{Z:()=>i})},2648:(e,t,s)=>{function i(e){if(!e.parentNode)return-1;let t=0;for(;null!==(e=e.previousElementSibling);)++t;return t}s.d(t,{Z:()=>i})},4789:(e,t,s)=>{s.d(t,{Z:()=>l,f:()=>i});var i,r=s(8594),n=s(3035),o=s(5296),a=s(3512),h=s(8487);function l(e){if(void 0===e.margin&&(e.margin=0),void 0===e.maxDistance&&(e.maxDistance=1500),void 0===e.axis&&(e.axis="y"),a.default.settings.animationsEnabled||(e.forceDirection=i.Static),e.forceDirection===i.Static)return e.forceDuration=0,c(e);const t=new Promise((t=>{(0,n.T2)((()=>{c(e).then(t)}))}));return"y"===e.axis?(0,r.YW)(t):t}function c(e){const{element:t,container:s,getNormalSize:i,axis:r,margin:n,position:a,forceDirection:l,maxDistance:m,forceDuration:p}=e;if(!(0,h.Z)(t))return(0,o.Kx)(s),Promise.resolve();const f="y"===r?"top":"left",v="y"===r?"bottom":"right",y="y"===r?"height":"width",g="y"===r?"scrollHeight":"scrollWidth",w="y"===r?"scrollTop":"scrollLeft",b=t.getBoundingClientRect(),k=s.getBoundingClientRect?s.getBoundingClientRect():document.body.getBoundingClientRect(),L=b[f]-k[f],F=t[g],E=i?i({rect:k}):k[y];let I=s[w];const A=s[g];let D;switch(a){case"start":D=L-n;break;case"end":D=b[v]-k[v]+n;break;case"nearest":case"center":if(Fm?(I=s.scrollTop+=D-m,D=m):D<-m&&(I=s.scrollTop+=D+m,D=-m)),D<0){const e=-I;D=Math.max(D,e)}else if(D>0){const e=A-(I+E);D=Math.min(D,e)}const M=s[w]+D,P=Math.abs(D),C=null!=p?p:250+P/1500*350,x=Date.now(),G=P<500?u:d,T=()=>{const e=C?Math.min((Date.now()-x)/C,1):1,t=D*(1-G(e));return s[w]=Math.round(M-t),e<1};return C&&D?(0,o.cK)(T,s):((0,o.Kx)(s),T(),Promise.resolve())}function d(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(i||(i={}))},3228:(e,t,s)=>{function i(e,t,s){return es?s:e}s.d(t,{Z:()=>i})},3035:(e,t,s)=>{let i;function r(e){i?i.push(e):(i=[e],requestAnimationFrame((()=>{const e=i;i=void 0,e.forEach((e=>e()))})))}s.d(t,{AD:()=>l,T2:()=>r,TR:()=>h,d1:()=>c});let n,o,a=!1;function h(e){n?a?e():n.push(e):(n=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;e{o=void 0})),o)}function c(){return new Promise((e=>{r((()=>{r(e)}))}))}},8594:(e,t,s)=>{s.d(t,{YW:()=>m,ZP:()=>y,e9:()=>v,gp:()=>f});var i=s(3725),r=s(3512),n=s(410),o=s(5418);const a="event-heavy-animation-start",h="event-heavy-animation-end";let l=!1,c=(0,i.b)(),d=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function m(e,t){l||(c=(0,i.b)(),r.default.dispatchEvent(a),l=!0,n.ZP&&u("start")),++d,n.ZP&&u("attach promise, length:",d,t);const s=[void 0!==t?(0,o.w)(t):void 0,e.finally((()=>{}))].filter(Boolean),h=performance.now(),m=c;return Promise.race(s).then((()=>{c!==m||c.isFulfilled||(--d,n.ZP&&u("promise end, length:",d,performance.now()-h),d<=0&&p())})),c}function p(){c.isFulfilled||(l=!1,d=0,r.default.dispatchEvent(h),c.resolve(),n.ZP&&u("end"))}function f(){p()}function v(){return c}function y(e,t,s){l&&e();const i=s?s.add(r.default):r.default.addEventListener.bind(r.default),n=s?s.removeManual.bind(s,r.default):r.default.removeEventListener.bind(r.default);return i(a,e),i(h,t),()=>{n(h,t),n(a,e)}}},2897:(e,t,s)=>{function i(){return new Worker(s.p+"rlottie.worker.dfa26d04325d4bc271d8.bundle.worker.js")}s.d(t,{Z:()=>f});var r=s(5814),n=s(410),o=s(5418),a=s(5003),h=s(9518),l=s(2531),c=s(4762),d=s(3241);class u extends d.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,...t){if(c.IS_SAFARI)this.worker.postMessage({queryMethod:e,queryMethodArguments:t});else{const s=[];t.forEach((e=>{e instanceof ArrayBuffer&&s.push(e),"object"==typeof e&&e.buffer instanceof ArrayBuffer&&s.push(e.buffer)})),this.worker.postMessage({queryMethod:e,queryMethodArguments:t},s)}}}var m=s(8975);const p=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=(0,a.kg)("LOTTIE",a.v9.Error),this.onPlayerLoaded=(e,t,s)=>{const i=this.players[e];i?(this.log.debug("onPlayerLoaded"),i.onLoad(t,s)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,s)=>{const i=this.players[e];i?(void 0!==i.clamped&&(i.clamped=s),i.renderFrame(s,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const s=this.players[e];s&&r.Z.getAnimations(s.el).forEach((e=>{r.Z.checkAnimation(e,!0,!0)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el===e)return this.players[t];return null}setLoop(e){for(const t in this.players){const s=this.players[t];s.loop=e,s.autoplay=s._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let r=0;r{this.log("worker #"+r+" ready"),n.addEventListener("frame",this.onFrame),n.addEventListener("loaded",this.onPlayerLoaded),n.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),n.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}loadAnimationAsAsset(e,t){return e.name=t,this.loadAnimationFromURL(e,"assets/tgs/"+t+".json")}loadAnimationFromURL(e,t){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(t).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>h.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,m.Z)([e],""))))).then((s=>{const i=Object.assign(e,{animationData:s,needUpscale:!0});return i.name||(i.name=t),this.loadAnimationWorker(i)}))):this.loadPromise}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,o.w)(2500)]).then((()=>e))}loadAnimationWorker(e,t=e.group||"",s){return i=this,n=void 0,a=function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),s&&!s())throw new Error("middleware");if(e.width&&e.height||(e.width=parseInt(e.container.style.width),e.height=parseInt(e.container.style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=t;const i=this.initPlayer(e.container,e);return"none"!==t&&r.Z.addAnimation(i,t),i},new((o=void 0)||(o=Promise))((function(e,t){function s(e){try{h(a.next(e))}catch(e){t(e)}}function r(e){try{h(a.throw(e))}catch(e){t(e)}}function h(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(s,r)}h((a=a.apply(i,n||[])).next())}));var i,n,o,a}onDestroy(e){delete this.players[e]}destroyWorkers(){this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0}initPlayer(e,t){const s=new l.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t});return this.players[s.reqId]=s,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),s.loadFromData(t.animationData),s}};n.GO.lottieLoader=p;const f=p},2531:(e,t,s)=>{s.d(t,{Z:()=>d});var i=s(4762);let r;if(i.IS_SAFARI)try{r=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){r=!1}else r=!0;const n=r;var o=s(3241),a=s(4755),h=s(3228),l=s(2897);const c=new class{constructor(){this.cache=new Map}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t={frames:new Map,counter:0}),++t.counter,t.frames}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,s,i,r){return[e,t,s,i?"colored":"",r||""].filter(Boolean).join("-")}};class d extends o.Z{constructor({el:e,worker:t,options:s}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.reqId=++d.reqId,this.el=e,this.worker=t;for(let e in s)this.hasOwnProperty(e)&&(this[e]=s[e]);let r;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=s.initFrame,this.color=s.color,this.inverseColor=s.inverseColor,this.name=s.name,this.skipFirstFrameRendering=s.skipFirstFrameRendering,this.toneIndex=s.toneIndex,void 0!==s.skipRatio?r=s.skipRatio:(i.IS_ANDROID||i.IS_APPLE_MOBILE||i.IS_APPLE&&!i.IS_SAFARI)&&this.width<100&&this.height<100&&!s.needUpscale&&(r=.5),this.skipDelta=void 0!==r?1/r|0:1;const o=(0,h.Z)(window.devicePixelRatio,1,2);o>1&&(s.needUpscale?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>1&&(this.width>100&&this.height>100?i.IS_APPLE||!a.ZP.isMobile?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>2.5&&(this.width=Math.round(this.width*(o-1.5)),this.height=Math.round(this.height*(o-1.5))):(this.width=Math.round(this.width*Math.max(1.5,o-1.5)),this.height=Math.round(this.height*Math.max(1.5,o-1.5))))),s.noCache||(i.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),n&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=c.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=c.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&c.getCacheCounter(this.cacheName)>1||this.frames.clear())}sendQuery(e,...t){this.worker.sendQuery(e,this.reqId,...t)}loadFromData(e){this.sendQuery("loadFromData",e,this.width,this.height,this.toneIndex)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&clearTimeout(this.rafId))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){l.Z.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&c.releaseCache(this.cacheName),this.cleanup()}applyColor(e){const[t,s,i]=this.color;for(let r=0,n=e.length;r{this.renderFrame2(e,t)}),this.frInterval>-s?-s%this.frInterval:this.frInterval)}this.renderFrame2(e,t)}requestFrame(e){const t=this.frames.get(e);t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",e,this.clamped))}onLap(){return!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,s=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(s),!(s+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,s=this.curFrame-et?1:-1,callback:i})}playToFrame(e){this.pause();const{frame:t,speed:s,callback:i,direction:r}=e;this.setDirection(void 0===r?this.curFrame>t?-1:1:r),void 0!==s&&this.setSpeed(s);const n=[this.curFrame,t];-1===this.direction&&n.reverse(),this.loop=!1,this.setMinMax(n[0],n[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return s=this,i=void 0,n=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,h.Z)(this.initFrame,this.minFrame,this.maxFrame));const s=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(s),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const e=Date.now();this.frThen=e+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((r=void 0)||(r=Promise))((function(e,t){function o(e){try{h(n.next(e))}catch(e){t(e)}}function a(e){try{h(n.throw(e))}catch(e){t(e)}}function h(t){var s;t.done?e(t.value):(s=t.value,s instanceof r?s:new r((function(e){e(s)}))).then(o,a)}h((n=n.apply(s,i||[])).next())}));var s,i,r,n}}d.reqId=0},4874:(e,t,s)=>{s.d(t,{Z:()=>c});var i=s(2897),r=s(6008),n=s(410),o=s(4789),a=s(2648);const h=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,r.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";let t=(0,a.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&i.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};n.GO.pagesManager=h;const l=h;class c{constructor(e,t,s,i,r){this.isAuthPage=t,this.onFirstMount=s,this.onMount=i,this.onShown=r,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,s=void 0,r=function*(){if(this.onMount&&this.onMount(...e),!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((i=void 0)||(i=Promise))((function(e,n){function o(e){try{h(r.next(e))}catch(e){n(e)}}function a(e){try{h(r.throw(e))}catch(e){n(e)}}function h(t){var s;t.done?e(t.value):(s=t.value,s instanceof i?s:new i((function(e){e(s)}))).then(o,a)}h((r=r.apply(t,s||[])).next())}));var t,s,i,r}}}}]); -//# sourceMappingURL=874.0c0c899a41c0a10875da.chunk.js.map \ No newline at end of file diff --git a/public/874.0c0c899a41c0a10875da.chunk.js.map b/public/874.0c0c899a41c0a10875da.chunk.js.map deleted file mode 100644 index acba64f3..00000000 --- a/public/874.0c0c899a41c0a10875da.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"874.0c0c899a41c0a10875da.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/array/indexOfAndSplice.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts"],"sourcesContent":["/*\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 rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport forEachReverse from \"../helpers/array/forEachReverse\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private overrideIdleGroups: Set;\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n return;\r\n }\r\n \r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (player) => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!rootScope.idle.isIDLE || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;\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 { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement, \r\n content: HTMLElement, \r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, \r\n onTransitionEnd?: () => void, \r\n transitionTime = 250, \r\n scrollableX?: ScrollableX\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\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 rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\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 animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\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\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\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 * 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\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\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 whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\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// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(options).then(resolve);\r\n });\r\n });\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\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\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(requestAnimationFrame);\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\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.dfa26d04325d4bc271d8.bundle.worker.js\");\n}\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 { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(typeof(arg) === 'object' && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as Transferable[]);\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 RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { pause } from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then(res => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data)).then(arr => blobConstruct([arr], ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(blob => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', middleware?: () => boolean): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n \r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\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 CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport clamp from \"../../helpers/number/clamp\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: Blob, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n \n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.cleanup();\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\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 Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\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 pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n"],"names":["animationIntersector","constructor","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","this","observer","IntersectionObserver","entries","entry","target","group","player","find","p","el","isIntersecting","add","checkAnimation","delete","animation","clearCache","overrideIdleGroups","doc","type","checkAnimations","setOverrideIdleGroup","override","getAnimations","element","found","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","addAnimation","loop","observe","blurred","destroy","undefined","groups","Object","keys","animations","paused","pause","has","autoplay","play","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","window","requestAnimationFrame","lockIntersectionGroup","unlockIntersectionGroup","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","proxy","Proxy","apply","that","args","id","animate","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","parentElement","position","forceDirection","forceDuration","axis","prevId","classList","contains","prev","tagName","toLowerCase","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","firstElementChild","addEventListener","e","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","Map","animationDeferred","from","listenerName","onEndEvent","callback","get","resolve","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","onTransitionEndCallback","toggle","set","_from","instances","cancelAnimationByKey","key","instance","getAnimationInstance","isCancelled","deferred","animateSingle","tick","then","createAnimationInstance","forEachReverse","array","i","indexOfAndSplice","item","idx","indexOf","spliced","splice","findUpAsChild","parent","isInDOM","isConnected","whichChild","elem","parentNode","previousElementSibling","FocusDirection","fastSmoothScroll","options","margin","maxDistance","Static","scrollWithJs","promise","Promise","container","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","containerRect","document","body","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","Math","abs","scrollTop","remainingPath","max","min","absPath","duration","startAt","Date","now","transition","shortTransition","longTransition","t","currentPath","round","clamp","v","fastRafCallbacks","fastRaf","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","log","console","bind","dispatchHeavyAnimationEvent","promises","finally","Boolean","perf","performance","_heavyAnimationPromise","race","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","Worker_fn","Worker","QueryableWorker","worker","super","onerror","error","dispatchEvent","cleanup","terminate","err","onmessage","event","data","queryMethodListener","queryMethodArguments","postMessage","message","sendQuery","queryMethod","transfer","arg","ArrayBuffer","buffer","lottieLoader","isWebAssemblySupported","loadPromise","reject","loaded","workersLimit","players","workers","curWorkerNum","logger","onPlayerLoaded","reqId","frameCount","fps","rlPlayer","debug","onLoad","warn","onFrame","frameNo","frame","clamped","renderFrame","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","loadAnimationAsAsset","params","name","loadAnimationFromURL","url","fetch","res","headers","blob","arrayBuffer","arr","blobConstruct","newParams","assign","animationData","needUpscale","loadAnimationWorker","waitForFirstFrame","middleware","Error","height","parseInt","initPlayer","onDestroy","destroyWorkers","loadFromData","CAN_USE_TRANSFERABLES","navigator","userAgent","match","cache","getCache","frames","counter","releaseCache","getCacheCounter","generateName","color","toneIndex","join","RLottiePlayer","direction","speed","cachingDelta","hasOwnProperty","skipRatio","_loop","initFrame","inverseColor","skipFirstFrameRendering","IS_ANDROID","IS_APPLE_MOBILE","IS_APPLE","skipDelta","pixelRatio","devicePixelRatio","mediaSizes","noCache","Infinity","canvas","createElement","context","getContext","Uint8ClampedArray","imageData","ImageData","cacheName","methodName","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","curFrame","minFrame","maxFrame","stop","renderFirstFrame","requestFrame","restart","setSpeed","setDirection","applyColor","r","g","b","applyInversing","renderFrame2","putImageData","frInterval","delta","frThen","onLap","mainLoopForwards","mainLoopBackwards","method","currentMethod","frameListener","listenerResults","enterFrame","playPart","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setColor","renderIfPaused","setInverseColor","diff","appendChild","time","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","setPage","isAuthPage","display","pageEl","Page","className","onFirstMount","onMount","installed","mount"],"sourceRoot":""} \ No newline at end of file diff --git a/public/9.7cf29a12b879c9755465.chunk.js b/public/9.7cf29a12b879c9755465.chunk.js new file mode 100644 index 00000000..73a6fc65 --- /dev/null +++ b/public/9.7cf29a12b879c9755465.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[9],{196:function(e,n,o){"use strict";o.r(n);n.default={"Login.Title":"Sign in to Telegram","Login.CountrySelectorLabel":"Country","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Link Desktop Device**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); +//# sourceMappingURL=9.7cf29a12b879c9755465.chunk.js.map \ No newline at end of file diff --git a/public/9.7cf29a12b879c9755465.chunk.js.map b/public/9.7cf29a12b879c9755465.chunk.js.map new file mode 100644 index 00000000..7bcedb9c --- /dev/null +++ b/public/9.7cf29a12b879c9755465.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/langSign.ts"],"names":[],"mappings":"sFAAA,OAuCe,UAvCF,CACX,cAAe,sBACf,6BAA8B,UAC9B,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAGlB,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","file":"9.7cf29a12b879c9755465.chunk.js","sourcesContent":["const lang = {\r\n \"Login.Title\": \"Sign in to Telegram\",\r\n \"Login.CountrySelectorLabel\": \"Country\",\r\n \"Login.PhoneLabel\": \"Phone Number\",\r\n \"Login.PhoneLabelInvalid\": \"Phone Number Invalid\",\r\n \"Login.KeepSigned\": \"Keep me signed in\",\r\n \"Login.StartText\": \"Please confirm your country and\\nenter your phone number.\",\r\n \"Login.Code.SentSms\": \"We have sent you an SMS\\nwith the code.\",\r\n \"Login.Code.SentInApp\": \"We have sent you a message in Telegram\\nwith the code.\",\r\n \"Login.Code.SentCall\": \"We will call you and voice\\nthe code.\",\r\n \"Login.Code.SentUnknown\": \"Please check everything\\nfor a code (type: %s)\",\r\n \"Login.Password.Title\": \"Enter Your Password\",\r\n \"Login.Password.Subtitle\": \"Your account is protected with\\nan additional password\",\r\n \"Login.Register.Subtitle\": \"Enter your name and add\\na profile picture\",\r\n \"PleaseWait\": \"Please wait...\",\r\n\r\n // * android\r\n \"Code\": \"Code\",\r\n \"LoginPassword\": \"Password\",\r\n \"YourName\": \"Your Name\",\r\n \"FirstName\": \"First name (required)\",\r\n \"LastName\": \"Last name (optional)\",\r\n \"StartMessaging\": \"Start Messaging\",\r\n\r\n // * macos\r\n \"Contacts.PhoneNumber.Placeholder\": \"Phone Number\",\r\n \"Login.Next\": \"Next\",\r\n \"Login.ContinueOnLanguage\": \"Continue in English\",\r\n \"Login.QR.Title\": \"Log in to Telegram by QR Code\",\r\n \"Login.QR.Help1\": \"Open Telegram on your phone\",\r\n \"Login.QR.Help2\": \"Go to **Settings** > **Devices** > **Link Desktop Device**\",\r\n \"Login.QR.Help3\": \"Point your phone at this screen to confirm login\",\r\n \"Login.QR.Cancel\": \"Log in by phone Number\",\r\n \"Login.QR.Login\": \"Log in by QR Code\",\r\n \"PHONE_CODE_INVALID\": \"Invalid code\",\r\n \"PHONE_CODE_EXPIRED\": \"Code expired\",\r\n \"PASSWORD_HASH_INVALID\": \"Incorrect password\"\r\n};\r\n\r\nexport default lang;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.10ac5f6741ee422f9b9b.css b/public/index.10ac5f6741ee422f9b9b.css deleted file mode 100644 index 53c6bcc5..00000000 --- a/public/index.10ac5f6741ee422f9b9b.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} -:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.25s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--line-height:1.3125;--line-height-16:21px;--line-height-14:18px;--font-size-16:16px;--font-size-14:14px;--esg-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 2px 8px 1px var(--menu-box-shadow-color);--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.24);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#157ce1;--primary-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 6px;transform:translate(-.25rem,calc(var(--height)/-2 + .125rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 2px 8px 1px rgba(0,0,0,.24);box-shadow:var(--menu-box-shadow);font-size:1rem;opacity:0;padding:.5rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:3}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none!important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;align-items:center;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;white-space:nowrap}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{color:#3390ec;color:var(--primary-color);font-weight:500;height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:1rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;background:#f4f4f5;background:var(--background-color-true);border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.5rem 0;padding:0}.btn-menu-reactions{--inner-shadow-degree:90deg;background-color:#fff;background-color:var(--surface-color);border-radius:var(--height);height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8)}.btn-menu-reactions-container{--height:2.625rem;--bubble-side-offset:-2.25rem;--other-side-offset:-1.5rem;--width:calc(100% + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-end;left:var(--other-side-offset);max-width:var(--width);position:absolute;top:calc((var(--height) + .5rem)*-1);width:var(--width)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);left:calc((var(--height) + .5rem)*-1);max-height:var(--width);max-width:var(--height);top:var(--other-side-offset);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.75rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#157ce1;background:var(--dark-primary-color);transition:background-color .2s,opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1);visibility:visible}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.25)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.25rem;height:var(--size);left:0;overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:3px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;cursor:pointer;display:inline-block;line-height:26px;margin-top:1px;min-height:24px;padding-left:3.375rem;position:relative;transition:opacity .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);left:0;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:.3125rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:4px 0 0}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title{color:#fff}.chatlist-chat.active b{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-background{fill:#fff!important}.chatlist-chat.active .verified-check{fill:#3390ec!important;fill:var(--primary-color)!important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist li span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1.25rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:700}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;height:150%;justify-content:center;margin:0!important;top:-25%}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat .contextmenu{box-shadow:none!important;filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));filter:drop-shadow(0 .125rem .5rem var(--menu-box-shadow-color))}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:12px;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:unset}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + 1.0625rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.5rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.25rem;border:.125rem solid #3390ec;border:.125rem solid var(--primary-color);border-radius:50%;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner:not(.is-channel) .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.125rem;content:" ";left:-50%;position:absolute;top:-.125rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.125rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:-.125rem;box-shadow:0 2px 8px 1px rgba(0,0,0,.24);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward svg{height:22px;width:22px}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;transform:translateY(-50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{opacity:0;pointer-events:none;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .25rem .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:18px;margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:unset;color:#fff;margin:inherit;right:unset}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:1.25rem;padding:0 1px 0 3px}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:unset!important;right:auto!important}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{display:flex;flex-direction:column;opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{bottom:0;cursor:pointer;margin-left:-45px;position:absolute}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scaleX(1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(.76,.76,1);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .name,.bubble.is-out.just-media .reply{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:6px;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem;margin-top:-.125rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3.5rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:calc(-.6875rem - 6px);box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:unset;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main{--menu-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:unset;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top:-3px;height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:.75rem;line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{overflow:unset;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{max-width:100%;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short li:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:unset;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:4px!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:4px!important;position:absolute;right:0}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-weight:500;padding:12px 6px 6px;top:0;width:100%;z-index:2}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill,40px)}.emoji-dropdown .emoji-padding.active .category-items>span{height:40px;justify-self:center;width:40px}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{margin:0 -.125rem;position:relative}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}.emoji-dropdown #content-stickers .scrollable{padding:0 5px}.emoji-dropdown .menu-horizontal-div{height:48px;width:100%}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:48px;line-height:48px;margin:0 12px;width:48px}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;margin-left:1px;margin-right:1px;padding:0;width:48px}.emoji-dropdown .stickers-padding .menu-wrapper{height:48px;max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{max-height:100%;max-width:100%;padding:8px}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{height:100%;width:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:thin}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;transform:translateZ(0)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.gifs-masonry>.gif img,.gifs-masonry>.gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry>.gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:700;height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-left-radius:.25rem;border-color:#fff #fff rgba(0,0,0,.25) rgba(0,0,0,.25);border-style:solid;border-width:calc(var(--size)/2);content:"";display:block;height:var(--size);position:absolute;right:0;top:0;width:var(--size)}.document-download,.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:700;height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:700}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:unset;top:unset;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.6875rem 1rem;position:relative}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{height:3rem!important;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#2a9ef1;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{pointer-events:none;position:absolute}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:unset}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:flex-end;display:flex;flex-direction:column;justify-content:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-right:1.125rem;margin-top:0!important}.popup-buttons .btn{border-radius:8px;font-weight:500;max-width:100%;padding:.5rem;position:relative;text-transform:uppercase}.popup-buttons .btn,.popup-buttons .btn+.btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popup-buttons .btn+.btn{margin-top:.5rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-weight:400;height:36px;margin-top:-3px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;font-size:1.25rem;font-weight:500;margin:-3px 0 0;padding-left:1.5rem}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;margin-bottom:.625rem}.popup-peer .popup-container{max-width:min(400px,100%);padding:1rem 1.5rem .8125rem}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;text-overflow:ellipsis;word-break:break-word}.popup-peer .popup-buttons{margin-right:-.5rem;margin-top:1.625rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{align-items:center;display:flex;height:3.5rem;margin:0 -1.0625rem;padding:0 1.1875rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height);margin:0;padding:0 2rem 0 1.5rem}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin-bottom:12px;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:unset}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:700}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:700;line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-call .popup-header,.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-subtitle,.group-call-header-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{border-bottom:1px solid transparent;border-top:1px solid transparent;margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -.625rem}.popup-mute .sidebar-left-section{margin-bottom:0!important;padding:0!important}.popup-mute .sidebar-left-section-content{margin:0!important}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--additional-height:.75rem;--reaction-size:1.5rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:unset;top:unset;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:22.5rem;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast b{color:inherit}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:unset!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{color:#a2acb4;content:attr(data-placeholder);display:block;pointer-events:none}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-attach:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-forward_filled:before,.tgico-message:before,.tgico-phone:before,.tgico-reply:before,.tgico-reply_filled:before,.tgico-saved:before{font-size:20px!important;padding:0 2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:unset;width:100%}html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:Roboto!important;font-weight:500;text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon{flex:0 0 auto;height:1.25rem;margin-left:.125rem;width:1.25rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0} -@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?85ar8e) format("truetype"),url(assets/fonts/tgico.woff?85ar8e) format("woff"),url(assets/fonts/tgico.svg?85ar8e#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add_reaction:before{content:""}.tgico-add:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete_filled:before{content:""}.tgico-delete:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward_filled:before{content:""}.tgico-forward:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-play:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply_filled:before{content:""}.tgico-reply:before{content:""}.tgico-rightpanel:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings_filled:before{content:""}.tgico-settings:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videocamera:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""} - -/*# sourceMappingURL=index.10ac5f6741ee422f9b9b.css.map*/ \ No newline at end of file diff --git a/public/index.10ac5f6741ee422f9b9b.css.map b/public/index.10ac5f6741ee422f9b9b.css.map deleted file mode 100644 index a5dd9d0a..00000000 --- a/public/index.10ac5f6741ee422f9b9b.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.10ac5f6741ee422f9b9b.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss","webpack://tweb/./src/scss/tgico.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.25s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--line-height:1.3125;--line-height-16:21px;--line-height-14:18px;--font-size-16:16px;--font-size-14:14px;--esg-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 2px 8px 1px var(--menu-box-shadow-color);--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.24);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#157ce1;--primary-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 6px;transform:translate(-.25rem,calc(var(--height)/-2 + .125rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 2px 8px 1px rgba(0,0,0,.24);box-shadow:var(--menu-box-shadow);font-size:1rem;opacity:0;padding:.5rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:3}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none!important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;align-items:center;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;white-space:nowrap}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{color:#3390ec;color:var(--primary-color);font-weight:500;height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:1rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;background:#f4f4f5;background:var(--background-color-true);border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.5rem 0;padding:0}.btn-menu-reactions{--inner-shadow-degree:90deg;background-color:#fff;background-color:var(--surface-color);border-radius:var(--height);height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8)}.btn-menu-reactions-container{--height:2.625rem;--bubble-side-offset:-2.25rem;--other-side-offset:-1.5rem;--width:calc(100% + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-end;left:var(--other-side-offset);max-width:var(--width);position:absolute;top:calc((var(--height) + .5rem)*-1);width:var(--width)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);left:calc((var(--height) + .5rem)*-1);max-height:var(--width);max-width:var(--height);top:var(--other-side-offset);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.75rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#157ce1;background:var(--dark-primary-color);transition:background-color .2s,opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1);visibility:visible}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.25)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.25rem;height:var(--size);left:0;overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:3px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;cursor:pointer;display:inline-block;line-height:26px;margin-top:1px;min-height:24px;padding-left:3.375rem;position:relative;transition:opacity .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);left:0;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:.3125rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:4px 0 0}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title{color:#fff}.chatlist-chat.active b{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-background{fill:#fff!important}.chatlist-chat.active .verified-check{fill:#3390ec!important;fill:var(--primary-color)!important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist li span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1.25rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:700}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;height:150%;justify-content:center;margin:0!important;top:-25%}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat .contextmenu{box-shadow:none!important;filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));filter:drop-shadow(0 .125rem .5rem var(--menu-box-shadow-color))}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:12px;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:unset}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + 1.0625rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.5rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.25rem;border:.125rem solid #3390ec;border:.125rem solid var(--primary-color);border-radius:50%;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner:not(.is-channel) .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.125rem;content:\" \";left:-50%;position:absolute;top:-.125rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.125rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:-.125rem;box-shadow:0 2px 8px 1px rgba(0,0,0,.24);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward svg{height:22px;width:22px}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;transform:translateY(-50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{opacity:0;pointer-events:none;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .25rem .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:18px;margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:unset;color:#fff;margin:inherit;right:unset}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:1.25rem;padding:0 1px 0 3px}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:unset!important;right:auto!important}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{display:flex;flex-direction:column;opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{bottom:0;cursor:pointer;margin-left:-45px;position:absolute}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scaleX(1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(.76,.76,1);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .name,.bubble.is-out.just-media .reply{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:6px;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem;margin-top:-.125rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3.5rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:calc(-.6875rem - 6px);box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:unset;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main{--menu-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:unset;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top:-3px;height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:.75rem;line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{overflow:unset;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{max-width:100%;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short li:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:unset;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:4px!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:4px!important;position:absolute;right:0}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-weight:500;padding:12px 6px 6px;top:0;width:100%;z-index:2}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill,40px)}.emoji-dropdown .emoji-padding.active .category-items>span{height:40px;justify-self:center;width:40px}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{margin:0 -.125rem;position:relative}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}.emoji-dropdown #content-stickers .scrollable{padding:0 5px}.emoji-dropdown .menu-horizontal-div{height:48px;width:100%}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:48px;line-height:48px;margin:0 12px;width:48px}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;margin-left:1px;margin-right:1px;padding:0;width:48px}.emoji-dropdown .stickers-padding .menu-wrapper{height:48px;max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{max-height:100%;max-width:100%;padding:8px}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{height:100%;width:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:thin}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;transform:translateZ(0)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.gifs-masonry>.gif img,.gifs-masonry>.gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry>.gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:700;height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-left-radius:.25rem;border-color:#fff #fff rgba(0,0,0,.25) rgba(0,0,0,.25);border-style:solid;border-width:calc(var(--size)/2);content:\"\";display:block;height:var(--size);position:absolute;right:0;top:0;width:var(--size)}.document-download,.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:700;height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:700}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:unset;top:unset;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.6875rem 1rem;position:relative}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{height:3rem!important;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#2a9ef1;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{pointer-events:none;position:absolute}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:unset}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:flex-end;display:flex;flex-direction:column;justify-content:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-right:1.125rem;margin-top:0!important}.popup-buttons .btn{border-radius:8px;font-weight:500;max-width:100%;padding:.5rem;position:relative;text-transform:uppercase}.popup-buttons .btn,.popup-buttons .btn+.btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popup-buttons .btn+.btn{margin-top:.5rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-weight:400;height:36px;margin-top:-3px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;font-size:1.25rem;font-weight:500;margin:-3px 0 0;padding-left:1.5rem}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;margin-bottom:.625rem}.popup-peer .popup-container{max-width:min(400px,100%);padding:1rem 1.5rem .8125rem}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;text-overflow:ellipsis;word-break:break-word}.popup-peer .popup-buttons{margin-right:-.5rem;margin-top:1.625rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{align-items:center;display:flex;height:3.5rem;margin:0 -1.0625rem;padding:0 1.1875rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height);margin:0;padding:0 2rem 0 1.5rem}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin-bottom:12px;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:unset}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:700}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:700;line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-call .popup-header,.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-subtitle,.group-call-header-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{border-bottom:1px solid transparent;border-top:1px solid transparent;margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -.625rem}.popup-mute .sidebar-left-section{margin-bottom:0!important;padding:0!important}.popup-mute .sidebar-left-section-content{margin:0!important}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--additional-height:.75rem;--reaction-size:1.5rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:unset;top:unset;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:22.5rem;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast b{color:inherit}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:unset!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{color:#a2acb4;content:attr(data-placeholder);display:block;pointer-events:none}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-attach:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-forward_filled:before,.tgico-message:before,.tgico-phone:before,.tgico-reply:before,.tgico-reply_filled:before,.tgico-saved:before{font-size:20px!important;padding:0 2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:unset;width:100%}html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:Roboto!important;font-weight:500;text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon{flex:0 0 auto;height:1.25rem;margin-left:.125rem;width:1.25rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}","@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?85ar8e) format(\"truetype\"),url(assets/fonts/tgico.woff?85ar8e) format(\"woff\"),url(assets/fonts/tgico.svg?85ar8e#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.4ffc426f1332ef286601.bundle.js b/public/index.4ffc426f1332ef286601.bundle.js deleted file mode 100644 index 42dad57f..00000000 --- a/public/index.4ffc426f1332ef286601.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,o,a,i,r,c,s,d,l,u,m,f,b,h,g={4159:(e,t,n)=>{n.d(t,{Z:()=>i});const o="web.telegram.org",a={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.0",versionFull:"1.4.0 (132)",build:132,langPackVersion:"0.4.0",langPack:"macos",langPackCode:"en",domains:[o],baseDcId:2,isMainDomain:location.hostname===o,suffix:"K"};a.isMainDomain&&(a.id=2496,a.hash="8da85b0d5bfe62527e5b244c209159c3");const i=a},6761:(e,t,n)=>{n.d(t,{Z:()=>o});const o="undefined"!=typeof window?window:self},9976:(e,t,n)=>{n.d(t,{Z:()=>o});const o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},5432:(e,t,n)=>{n.r(t),n.d(t,{IS_TOUCH_SUPPORTED:()=>o});const o="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>i,IS_APPLE_MOBILE:()=>s,IS_CHROMIUM:()=>c,IS_FIREFOX:()=>l,IS_MOBILE:()=>m,IS_MOBILE_SAFARI:()=>u,IS_SAFARI:()=>d,USER_AGENT:()=>a});var o=n(6761);const a=navigator?navigator.userAgent:null,i=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),c=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),s=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!o.Z.MSStream,d=!!("safari"in o.Z)||!(!a||!(/\b(iPad|iPhone|iPod)\b/.test(a)||a.match("Safari")&&!a.match("Chrome"))),l=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,u=d&&s,m=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},8799:(e,t,n)=>{function o(){return!(!document.activeElement||!document.activeElement.blur||(document.activeElement.blur(),0))}n.d(t,{Z:()=>o})},3910:(e,t,n)=>{function o(e){if(e=e||window.event){e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{d:()=>o})},8497:(e,t,n)=>{function o(e,t){return e.closest("."+t)}n.d(t,{Z:()=>o})},5494:(e,t,n)=>{function o(e){e.style.transform="translateY(-99999px)",e.focus(),setTimeout((()=>{e.style.transform=""}),0)}n.d(t,{Z:()=>o})},8090:(e,t,n)=>{n.d(t,{T:()=>c,Z:()=>s});var o=n(5432),a=n(4762),i=n(8497),r=n(5494);const c=a.IS_SAFARI&&a.IS_MOBILE&&o.IS_TOUCH_SUPPORTED;if(c){let e="clientY",t=0;const n={capture:!0,passive:!1},o=n=>{const o=n.touches[0],a=(0,i.Z)(o.target,"scrollable-y");if(a){const i=o[e],r=t-i,c=a.scrollTop,s=a.scrollHeight,d=a.clientHeight,l=c?Math.round(c+a.clientHeight+r):c+r;(s===d||l>=s||l<=0)&&n.preventDefault()}else n.preventDefault()};let a=0;document.addEventListener("focusin",(i=>{!i.target.classList.contains("is-sticky-input-bugged")||i.timeStamp-a<50||((0,r.Z)(i.target),document.addEventListener("touchmove",o,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const o=n.touches[0];t=o[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",o,n),a=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function s(e){c&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{let o;function a(){return o||(o="fonts"in document?Promise.race([Promise.all(["400 1rem Roboto","500 1rem Roboto","500 1rem tgico"].map((e=>document.fonts.load(e)))),new Promise((e=>setTimeout(e,1e3)))]):Promise.resolve())}n.d(t,{Z:()=>a})}},v={};function p(e){var t=v[e];if(void 0!==t)return t.exports;var n=v[e]={exports:{}};return g[e].call(n.exports,n,n.exports,p),n.exports}p.m=g,p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,p.t=function(n,o){if(1&o&&(n=this(n)),8&o)return n;if("object"==typeof n&&n){if(4&o&&n.__esModule)return n;if(16&o&&"function"==typeof n.then)return n}var a=Object.create(null);p.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var r=2&o&&n;"object"==typeof r&&!~e.indexOf(r);r=t(r))Object.getOwnPropertyNames(r).forEach((e=>i[e]=()=>n[e]));return i.default=()=>n,p.d(a,i),a},p.d=(e,t)=>{for(var n in t)p.o(t,n)&&!p.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},p.f={},p.e=e=>Promise.all(Object.keys(p.f).reduce(((t,n)=>(p.f[n](e,t),t)),[])),p.u=e=>(630===e?"npm.qr-code-styling":e)+"."+{8:"fbaab4d21ceabe711757",53:"0848e83cc329eb6130be",77:"d9ff12acb3c5a5858e31",102:"e314611ed72b13b03b17",104:"ddc5d5d8ab3d3894ff32",110:"7c36f242e1f6a813f553",141:"f006cd3b8bcd5e635657",272:"eb4fc8aabeb8df00f2fb",301:"9a1ccf812953c4fbc155",325:"977514b16cbc045987c7",339:"de8e477f93d6d13a3a02",392:"a16c421c1f68b829c496",405:"7373165804a1f4a12f8a",436:"fc57e380ea4d30dae9c8",437:"aa9fc330e4d4bcacc9e3",442:"a506db9e5c6cfd0f89d7",458:"79a9471a7327d7c9cca1",465:"2835f5f68ad52a301caa",512:"ec58298a13873ce49c3f",518:"ede329767abdce9961b0",554:"7d2b9a9c4096088ac7e1",630:"3ec55c0ceef2f8610946",642:"6689d152002321243b91",664:"22c6afb6ed739f8b3773",687:"e9f93733bf343790b37d",688:"1806b16f238474b55289",690:"8669226af7b8cc74abde",714:"57babe030f5e6d0e0a5d",765:"5950c8422ae75da58b30",774:"5ad3ac1d542a58ab1c8c",781:"7ae7d8d6f7963805c4b2",810:"bd27b2cf5e0477ce915d",874:"0c0c899a41c0a10875da"}[e]+".chunk.js",p.miniCssF=e=>{},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},o="tweb:",p.l=(e,t,a,i)=>{if(n[e])n[e].push(t);else{var r,c;if(void 0!==a)for(var s=document.getElementsByTagName("script"),d=0;d{r.onerror=r.onload=null,clearTimeout(m);var a=n[e];if(delete n[e],r.parentNode&&r.parentNode.removeChild(r),a&&a.forEach((e=>e(o))),t)return t(o)},m=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),c&&document.head.appendChild(r)}},p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;p.g.importScripts&&(e=p.g.location+"");var t=p.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),p.p=e})(),a=p.u,i=p.e,r=new Map,c=new Map,p.u=function(e){return a(e)+(r.has(e)?"?"+r.get(e):"")},p.e=function(e){return i(e).catch((function(t){var n=c.has(e)?c.get(e):999999;if(n<1){var o=a(e);throw t.message="Loading chunk "+e+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(t){setTimeout((function(){var o=Date.now();r.set(e,o),c.set(e,n-1),t(p.e(e))}),3e3)}))}))},(()=>{var e={826:0};p.f.j=(t,n)=>{var o=p.o(e,t)?e[t]:void 0;if(0!==o)if(o)n.push(o[2]);else{var a=new Promise(((n,a)=>o=e[t]=[n,a]));n.push(o[2]=a);var i=p.p+p.u(t),r=new Error;p.l(i,(n=>{if(p.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var a=n&&("load"===n.type?"missing":n.type),i=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",r.name="ChunkLoadError",r.type=a,r.request=i,o[1](r)}}),"chunk-"+t,t)}};var t=(t,n)=>{var o,a,[i,r,c]=n,s=0;if(i.some((t=>0!==e[t]))){for(o in r)p.o(r,o)&&(p.m[o]=r[o]);c&&c(p)}for(t&&t(n);sh(void 0,void 0,void 0,(function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)});const e=window.visualViewport||window;let t,n=!1;const o=()=>{const o=.01*(n&&!h.default.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==o&&(r.IS_TOUCH_SUPPORTED&&t1&&(0,d.Z)(),t=o,document.documentElement.style.setProperty("--vh",`${o}px`))},a=new Proxy(Worker,{construct:(e,t)=>new e(t[0]+location.search)});Worker=a;const[i,r,c,h,g,v,P]=yield Promise.all([p.e(690).then(p.bind(p,690)),Promise.resolve().then(p.bind(p,5432)),Promise.resolve().then(p.bind(p,4762)),p.e(512).then(p.bind(p,3512)),Promise.all([p.e(141),p.e(687)]).then(p.bind(p,4687)),Promise.all([p.e(141),p.e(518)]).then(p.bind(p,4727)),p.e(110).then(p.bind(p,4110))]);if(window.addEventListener("resize",o),o(),u.T){const t=()=>{n=1===a&&u.T&&!h.default.isOverlayActive,o(),e!==window&&(n?(window.removeEventListener("resize",o),e.addEventListener("resize",o)):(e.removeEventListener("resize",o),window.addEventListener("resize",o)))};let a;h.default.addEventListener("im_tab_change",(e=>{const n=void 0!==a;a=e,(n||1===a)&&t()})),h.default.addEventListener("overlay_toggle",(()=>{t()}))}c.IS_FIREFOX&&!f.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,l.d)(e),!1})),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),c.IS_FIREFOX&&document.documentElement.classList.add("is-firefox"),c.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),c.IS_APPLE?(c.IS_SAFARI&&document.documentElement.classList.add("is-safari"),document.documentElement.classList.add("emoji-supported"),c.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):c.IS_ANDROID&&document.documentElement.classList.add("is-android"),r.IS_TOUCH_SUPPORTED?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const E=performance.now(),y=v.default.getCacheLangPack(),[w,S]=yield Promise.all([g.default.getState(),y]);function I(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}v.default.setTimeFormat(w.settings.timeFormat),h.default.setThemeListener(),S.appVersion!==s.Z.langPackVersion&&v.default.getLangPack(S.lang_code),console.log("got state, time:",performance.now()-E);const L=w.authState;if("authStateSignedIn"!==L._){console.log("Will mount auth page:",L._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,n;if(e){t=e.querySelector(".scrollable"),r.IS_TOUCH_SUPPORTED&&!b.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.all([p.e(141),p.e(518)]).then(p.bind(p,5228)),Promise.all([p.e(141),p.e(518)]).then(p.bind(p,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(L._){case"authStateSignIn":n=(yield Promise.all([p.e(141),p.e(518),p.e(458),p.e(687),p.e(874),p.e(554),p.e(325),p.e(688)]).then(p.bind(p,810))).default.mount();break;case"authStateSignQr":n=(yield Promise.all([p.e(141),p.e(518),p.e(687),p.e(874),p.e(554),p.e(465)]).then(p.bind(p,4465))).default.mount();break;case"authStateAuthCode":n=(yield Promise.all([p.e(141),p.e(518),p.e(458),p.e(687),p.e(874),p.e(554),p.e(325),p.e(53)]).then(p.bind(p,6392))).default.mount(L.sentCode);break;case"authStatePassword":n=(yield Promise.all([p.e(141),p.e(518),p.e(458),p.e(687),p.e(874),p.e(554),p.e(437)]).then(p.bind(p,9437))).default.mount();break;case"authStateSignUp":n=(yield Promise.all([p.e(141),p.e(518),p.e(458),p.e(687),p.e(874),p.e(554),p.e(765),p.e(102)]).then(p.bind(p,8339))).default.mount(L.authCode)}t&&(n&&(yield n),I(t,"fonts"in document?Promise.race([new Promise((e=>setTimeout(e,1e3))),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),(0,m.Z)()),(yield Promise.all([p.e(141),p.e(518),p.e(687),p.e(874),p.e(436)]).then(p.bind(p,5436))).default.mount();const _=(yield p.e(405).then(p.bind(p,1405))).ripple;Array.from(document.getElementsByClassName("rp")).forEach((e=>_(e)))}))))})(); -//# sourceMappingURL=index.4ffc426f1332ef286601.bundle.js.map \ No newline at end of file diff --git a/public/index.4ffc426f1332ef286601.bundle.js.map b/public/index.4ffc426f1332ef286601.bundle.js.map deleted file mode 100644 index d5e4af2c..00000000 --- a/public/index.4ffc426f1332ef286601.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.4ffc426f1332ef286601.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/app.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.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/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/./src/index.ts"],"sourcesContent":["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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.0',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\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","/*\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\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\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","/*\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 && (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 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\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 //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 }, 0);\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\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\nlet promise: Promise;\r\nexport default function loadFonts(): Promise {\r\n if(promise) return promise;\r\n return promise = 'fonts' in document ? \r\n Promise.race([\r\n // @ts-ignore\r\n Promise.all(['400 1rem Roboto', '500 1rem Roboto', '500 1rem tgico'].map(font => document.fonts.load(font))),\r\n new Promise((resolve) => setTimeout(resolve, 1e3))\r\n ]) : \r\n Promise.resolve();\r\n}\r\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 \"\" + (chunkId === 630 ? \"npm.qr-code-styling\" : chunkId) + \".\" + {\"8\":\"fbaab4d21ceabe711757\",\"53\":\"0848e83cc329eb6130be\",\"77\":\"d9ff12acb3c5a5858e31\",\"102\":\"e314611ed72b13b03b17\",\"104\":\"ddc5d5d8ab3d3894ff32\",\"110\":\"7c36f242e1f6a813f553\",\"141\":\"f006cd3b8bcd5e635657\",\"272\":\"eb4fc8aabeb8df00f2fb\",\"301\":\"9a1ccf812953c4fbc155\",\"325\":\"977514b16cbc045987c7\",\"339\":\"de8e477f93d6d13a3a02\",\"392\":\"a16c421c1f68b829c496\",\"405\":\"7373165804a1f4a12f8a\",\"436\":\"fc57e380ea4d30dae9c8\",\"437\":\"aa9fc330e4d4bcacc9e3\",\"442\":\"a506db9e5c6cfd0f89d7\",\"458\":\"79a9471a7327d7c9cca1\",\"465\":\"2835f5f68ad52a301caa\",\"512\":\"ec58298a13873ce49c3f\",\"518\":\"ede329767abdce9961b0\",\"554\":\"7d2b9a9c4096088ac7e1\",\"630\":\"3ec55c0ceef2f8610946\",\"642\":\"6689d152002321243b91\",\"664\":\"22c6afb6ed739f8b3773\",\"687\":\"e9f93733bf343790b37d\",\"688\":\"1806b16f238474b55289\",\"690\":\"8669226af7b8cc74abde\",\"714\":\"57babe030f5e6d0e0a5d\",\"765\":\"5950c8422ae75da58b30\",\"774\":\"5ad3ac1d542a58ab1c8c\",\"781\":\"7ae7d8d6f7963805c4b2\",\"810\":\"bd27b2cf5e0477ce915d\",\"874\":\"0c0c899a41c0a10875da\"}[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;","// no baseURI\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\t826: 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// no on chunks loaded\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\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/*\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 App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport { cancelEvent } from './helpers/dom/cancelEvent';\nimport { IS_STICKY_INPUT_BUGGED } from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport { IS_MOBILE_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport './scss/tgico.scss';\n/* import { computeCheck } from './lib/crypto/srp';\nimport { salt1, salt2, g, p, srp_id, secure_random, srp_B, password } from './mock/srp'; */\n\n//console.log('pineapples are in my head');\n\n/* console.time('get storage1');\nimport * as a from './lib/config';\nimport * as b from './lib/mtproto/mtproto_config';\nimport * as c from './helpers/userAgent';\nimport * as d from './lib/mtproto/mtprotoworker';\nimport * as e from './lib/polyfill';\nimport * as f from './lib/storage';\na && b && c && d && e && f;\nconsole.timeEnd('get storage1'); */\n\n/* Promise.all([\n import('./components/pageIm'),\n import('./components/pageSignIn'),\n import('./components/misc'),\n import('./lib/storage')\n]).then(imports => {\n let [pageIm, pageSignIn, misc, AppStorage] = imports; */\n\n document.addEventListener('DOMContentLoaded', async() => {\n //let socket = new Socket(2);\n\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n \n if(this.hasAttribute(name)) {\n if(force) return true;\n \n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n \n this.setAttribute(name, \"\");\n return true;\n };\n }\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n // @ts-ignore\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n // @ts-ignore\n const vh = (setViewportVH && !rootScope.default.isOverlayActive ? w.height || w.innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(touchSupport.IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n //const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n //console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n \n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n\n const [_, touchSupport, userAgent, rootScope, appStateManager, I18n, __/* , ___ */] = await Promise.all([\n import('./lib/polyfill'),\n import('./environment/touchSupport'),\n import('./environment/userAgent'),\n import('./lib/rootScope'),\n import('./lib/appManagers/appStateManager'),\n import('./lib/langPack'),\n import('./helpers/peerIdPolyfill'),\n // import('./helpers/cacheFunctionPolyfill')\n ]);\n\n //console.timeEnd('get storage');\n\n window.addEventListener('resize', setVH);\n setVH();\n\n //console.log(new Uint8Array([255, 200, 145]).hex);\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !rootScope.default.isOverlayActive;\n setVH();\n \n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n \n let tabId: number;\n rootScope.default.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n \n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.default.addEventListener('overlay_toggle', () => {\n toggleResizeMode();\n });\n }\n\n if(userAgent.IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n if(userAgent.IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\n }\n\n if(userAgent.IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(userAgent.IS_APPLE) {\n if(userAgent.IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n document.documentElement.classList.add('emoji-supported');\n\n if(userAgent.IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(userAgent.IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!touchSupport.IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n /* if(config.isServiceWorkerSupported) {\n await navigator.serviceWorker.ready;\n navigator.serviceWorker.controller ? true : await new Promise((resolve, reject) => {\n navigator.serviceWorker.addEventListener('controllerchange', resolve);\n });\n } */\n \n //console.time('get storage');\n\n const perf = performance.now();\n\n //import('./vendor/dateFormat');\n\n const langPromise = I18n.default.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.default.getState(), \n langPromise\n ]);\n //I18n.getCacheLangPack();\n //console.log('got auth:', auth);\n //console.timeEnd('get storage');\n\n I18n.default.setTimeFormat(state.settings.timeFormat);\n\n rootScope.default.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.default.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!touchSupport.IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n new Promise((resolve) => setTimeout(resolve, 1e3)), \n // @ts-ignore\n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* computeCheck(password, {\n current_algo: {\n salt1, \n salt2,\n p,\n g\n },\n srp_id,\n srp_B,\n secure_random,\n }).then(res => {\n console.log(res);\n }); */\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignQR')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pagePassword')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n //getNearestDc();\n }\n\n const ripple = (await import('./components/ripple')).ripple;\n (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n//});\n\n\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","oldGetScript","oldLoadScript","queryMap","countMap","MAIN_DOMAIN","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","window","self","navigator","userAgent","search","IS_TOUCH_SUPPORTED","DocumentTouch","document","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","indexOf","IS_CHROMIUM","test","vendor","IS_APPLE_MOBILE","platform","maxTouchPoints","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","blurActiveElement","activeElement","blur","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","err","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","setTimeout","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","Math","round","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","length","touchStart","removeEventListener","fixSafariStickyInputFocusing","add","promise","loadFonts","Promise","race","all","map","font","fonts","load","resolve","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","n","getter","__esModule","d","a","Object","getPrototypeOf","obj","t","value","mode","this","then","ns","create","r","def","current","getOwnPropertyNames","forEach","definition","defineProperty","enumerable","get","f","chunkId","keys","reduce","promises","u","miniCssF","g","globalThis","Function","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","getElementsByTagName","i","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","fn","bind","type","head","appendChild","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","replace","p","Map","has","catch","error","retries","realSrc","message","request","cacheBust","Date","now","set","installedChunks","j","installedChunkData","reject","errorType","name","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","rootScope","default","isOverlayActive","height","innerHeight","touchSupport","documentElement","setProperty","workerProxy","Proxy","Worker","construct","args","_","appStateManager","I18n","__","toggleResizeMode","tabId","wasTabId","tagName","perf","performance","langPromise","getCacheLangPack","state","getState","fadeInWhenFontsReady","elem","opacity","requestAnimationFrame","setTimeFormat","settings","timeFormat","setThemeListener","appVersion","getLangPack","lang_code","console","log","authState","getElementById","pagePromise","querySelector","placeholder","prepend","append","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","ready","ripple","Array","from","getElementsByClassName"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 7673615b..cf76f62b 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,3 @@ -Telegram Web \ No newline at end of file + \ No newline at end of file diff --git a/public/main.4728214565ef548f208f.bundle.js b/public/main.4728214565ef548f208f.bundle.js new file mode 100644 index 00000000..f8d02e25 --- /dev/null +++ b/public/main.4728214565ef548f208f.bundle.js @@ -0,0 +1,2 @@ +!function(e){function t(t){for(var n,i,a=t[0],r=t[1],c=0,s=[];c1)&&!o.a.MSStream,u=!!("safari"in o.a)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=u&&s,f=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},function(e,t,n){"use strict";n.r(t),n.d(t,"IS_TOUCH_SUPPORTED",(function(){return o}));const o="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},function(e,t,n){"use strict";const o="undefined"!=typeof window?window:self;t.a=o},function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return s}));var o=n(1),i=n(0),a=n(6),r=n(4);const c=i.IS_SAFARI&&i.IS_MOBILE&&o.IS_TOUCH_SUPPORTED;if(c){let e="clientY",t=0;const n={capture:!0,passive:!1},o=n=>{const o=n.touches[0],i=Object(a.a)(o.target,"scrollable-y");if(i){const a=o[e],r=t-a,c=i.scrollTop,s=i.scrollHeight,u=i.clientHeight,d=c?Math.round(c+i.clientHeight+r):c+r;(s===u||d>=s||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",a=>{!a.target.classList.contains("is-sticky-input-bugged")||a.timeStamp-i<50||(Object(r.a)(a.target),document.addEventListener("touchmove",o,n),document.addEventListener("touchstart",n=>{if(n.touches.length>1)return;const o=n.touches[0];t=o[e]}))},{passive:!0}),document.addEventListener("focusout",e=>{document.removeEventListener("touchmove",o,n),i=e.timeStamp},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&Object(r.a)(document.activeElement)},{passive:!0})}function s(e){c&&e.classList.add("is-sticky-input-bugged")}},function(e,t,n){"use strict";function o(e){e.style.transform="translateY(-99999px)",e.focus(),setTimeout(()=>{e.style.transform=""},0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e){if(e=e||window.event){e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e,t){return e.closest("."+t)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";const o={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.0",versionFull:"1.4.0 (133)",build:133,langPackVersion:"0.4.0",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};o.isMainDomain&&(o.id=2496,o.hash="8da85b0d5bfe62527e5b244c209159c3"),t.a=o},function(e,t,n){"use strict";function o(){return!(!document.activeElement||!document.activeElement.blur)&&(document.activeElement.blur(),!0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";let o;function i(){return o||(o="fonts"in document?Promise.race([Promise.all(["400 1rem Roboto","500 1rem Roboto","500 1rem tgico"].map(e=>document.fonts.load(e))),new Promise(e=>setTimeout(e,1e3))]):Promise.resolve())}n.d(t,"a",(function(){return i}))},function(e,t,n){"use strict";const o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i);t.a=o},function(e,t,n){"use strict";n.r(t);var o=n(7),i=n(8),a=n(5),r=n(3),c=n(9),s=n(10),u=n(0),d=(n(12),n(13),n(14),function(e,t,n,o){return new(n||(n=Promise))((function(i,a){function r(e){try{s(o.next(e))}catch(e){a(e)}}function c(e){try{s(o.throw(e))}catch(e){a(e)}}function s(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((o=o.apply(e,t||[])).next())}))});document.addEventListener("DOMContentLoaded",()=>d(void 0,void 0,void 0,(function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)});const e=window.visualViewport||window;let t,d=!1;const l=()=>{const n=.01*(d&&!v.default.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(b.IS_TOUCH_SUPPORTED&&t1&&Object(i.a)(),t=n,document.documentElement.style.setProperty("--vh",n+"px"))},f=new Proxy(Worker,{construct:(e,t)=>new e(t[0]+location.search)});Worker=f;const[m,b,h,v,g,p,P]=yield Promise.all([n.e(22).then(n.bind(null,27)),Promise.resolve().then(n.bind(null,1)),Promise.resolve().then(n.bind(null,0)),n.e(21).then(n.bind(null,15)),Promise.all([n.e(0),n.e(24)]).then(n.bind(null,17)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,16)),n.e(28).then(n.bind(null,28))]);if(window.addEventListener("resize",l),l(),r.a){const t=()=>{d=1===n&&r.a&&!v.default.isOverlayActive,l(),e!==window&&(d?(window.removeEventListener("resize",l),e.addEventListener("resize",l)):(e.removeEventListener("resize",l),window.addEventListener("resize",l)))};let n;v.default.addEventListener("im_tab_change",e=>{const o=void 0!==n;n=e,(o||1===n)&&t()}),v.default.addEventListener("overlay_toggle",()=>{t()})}h.IS_FIREFOX&&!s.a&&document.addEventListener("dragstart",e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return Object(a.a)(e),!1}),document.addEventListener("dragstart",e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1}),h.IS_FIREFOX&&document.documentElement.classList.add("is-firefox"),h.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),h.IS_APPLE?(h.IS_SAFARI&&document.documentElement.classList.add("is-safari"),document.documentElement.classList.add("emoji-supported"),h.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):h.IS_ANDROID&&document.documentElement.classList.add("is-android"),b.IS_TOUCH_SUPPORTED?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const y=performance.now(),E=p.default.getCacheLangPack(),[S,w]=yield Promise.all([g.default.getState(),E]);function I(e,t){e.style.opacity="0",t.then(()=>{window.requestAnimationFrame(()=>{e.style.opacity=""})})}p.default.setTimeFormat(S.settings.timeFormat),v.default.setThemeListener(),w.appVersion!==o.a.langPackVersion&&p.default.getLangPack(w.lang_code),console.log("got state, time:",performance.now()-y);const O=S.authState;if("authStateSignedIn"!==O._){console.log("Will mount auth page:",O._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,o;if(e){t=e.querySelector(".scrollable"),b.IS_TOUCH_SUPPORTED&&!u.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.all([n.e(0),n.e(1)]).then(n.bind(null,24)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,26))]).then(([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()})}catch(e){}switch(O._){case"authStateSignIn":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(13)]).then(n.bind(null,21))).default.mount();break;case"authStateSignQr":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(20)]).then(n.bind(null,20))).default.mount();break;case"authStateAuthCode":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(12)]).then(n.bind(null,22))).default.mount(O.sentCode);break;case"authStatePassword":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(15)]).then(n.bind(null,23))).default.mount();break;case"authStateSignUp":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(14)]).then(n.bind(null,25))).default.mount(O.authCode)}if(t){o&&(yield o);I(t,"fonts"in document?Promise.race([new Promise(e=>setTimeout(e,1e3)),document.fonts.ready]):Promise.resolve())}}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),Object(c.a)()),(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(30)]).then(n.bind(null,19))).default.mount();const L=(yield n.e(17).then(n.bind(null,18))).ripple;Array.from(document.getElementsByClassName("rp")).forEach(e=>L(e))})))},function(e,t,n){},function(e,t,n){},function(e,t,n){}]); +//# sourceMappingURL=main.4728214565ef548f208f.bundle.js.map \ No newline at end of file diff --git a/public/main.4728214565ef548f208f.bundle.js.map b/public/main.4728214565ef548f208f.bundle.js.map new file mode 100644 index 00000000..c5623f1a --- /dev/null +++ b/public/main.4728214565ef548f208f.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/environment/userAgent.ts","webpack:///./src/environment/touchSupport.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.ts","webpack:///./src/helpers/dom/findUpClassName.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/dom/blurActiveElement.ts","webpack:///./src/helpers/dom/loadFonts.ts","webpack:///./src/environment/emojiSupport.ts","webpack:///./src/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","10","jsonpScriptSrc","__webpack_require__","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","Date","now","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","s","USER_AGENT","navigator","userAgent","IS_APPLE","search","IS_ANDROID","toLowerCase","indexOf","IS_CHROMIUM","test","vendor","IS_APPLE_MOBILE","platform","maxTouchPoints","MSStream","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","IS_TOUCH_SUPPORTED","window","DocumentTouch","ctx","self","IS_STICKY_INPUT_BUGGED","startY","capture","passive","onTouchMove","touch","touches","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","Math","round","preventDefault","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","activeElement","blur","fixSafariStickyInputFocusing","input","add","fixSafariStickyInput","style","transform","focus","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","el","className","closest","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","blurActiveElement","loadFonts","race","map","font","fonts","load","IS_EMOJI_SUPPORTED","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","rootScope","default","isOverlayActive","height","innerHeight","touchSupport","documentElement","setProperty","workerProxy","Proxy","Worker","construct","args","_","appStateManager","I18n","__","toggleResizeMode","tabId","wasTabId","tagName","perf","performance","langPromise","getCacheLangPack","state","getState","fadeInWhenFontsReady","elem","opacity","then","requestAnimationFrame","setTimeFormat","settings","timeFormat","setThemeListener","appVersion","getLangPack","lang_code","log","authState","getElementById","pagePromise","querySelector","placeholder","prepend","append","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","ready","ripple","Array","from","getElementsByClassName","forEach"],"mappings":"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","file":"main.4728214565ef548f208f.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t10: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"11\":\"npm.qr-code-styling\"}[chunkId]||chunkId) + \".\" + {\"0\":\"2da18beaed4bd7796d8f\",\"1\":\"bf7f14176d3c12040199\",\"2\":\"3d6b202e8d6ff37ebd0b\",\"3\":\"793e215e3d9630206e52\",\"4\":\"2204f96c53d1827a35fa\",\"5\":\"42c4ae7c503d2aa6aec3\",\"6\":\"20c444db88e2e357fc97\",\"7\":\"267799b59034d0b41841\",\"8\":\"25c7f3643f3336533b03\",\"9\":\"7cf29a12b879c9755465\",\"11\":\"5f80533c958a2f3a94bb\",\"12\":\"baab8418093ca242b164\",\"13\":\"2690683310eb11d72c46\",\"14\":\"0a9c2a5a1b393dfdfb0d\",\"15\":\"4ca01b561eb65470bbb6\",\"16\":\"dd165468586f22f31041\",\"17\":\"1e43fc20a20ae160385c\",\"18\":\"29da8a83178db260ea59\",\"19\":\"4321e94dcc79f8936402\",\"20\":\"e93df534d41d9a216086\",\"21\":\"1bcdd871c6dfb97ca84a\",\"22\":\"fa44c64744b789124685\",\"23\":\"1965eeacf2722eb2a737\",\"24\":\"4b9f00474f1f2b0d38ce\",\"25\":\"dcbbd29bad085f151e64\",\"26\":\"d44ef4011bb3c3f8b0f7\",\"27\":\"05d6a53c8e06b785e86e\",\"28\":\"6667bb68e660e626d453\",\"29\":\"87d0b9d91aaae6885e5b\",\"30\":\"1eb7b53a0652ce7549e5\",\"31\":\"3cf7864ede12445b3dd9\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\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\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 999999 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 999999 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = (function() {\n \t\t\t\t return Date.now();\n \t\t\t\t })();\n \t\t\t\t +retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 999999);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\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","/*\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\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\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 { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\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\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 //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 }, 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 * 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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.0',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\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 && (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\r\nlet promise: Promise;\r\nexport default function loadFonts(): Promise {\r\n if(promise) return promise;\r\n return promise = 'fonts' in document ? \r\n Promise.race([\r\n // @ts-ignore\r\n Promise.all(['400 1rem Roboto', '500 1rem Roboto', '500 1rem tgico'].map(font => document.fonts.load(font))),\r\n new Promise((resolve) => setTimeout(resolve, 1e3))\r\n ]) : \r\n Promise.resolve();\r\n}\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","/*\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 App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport { cancelEvent } from './helpers/dom/cancelEvent';\nimport { IS_STICKY_INPUT_BUGGED } from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport { IS_MOBILE_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport './scss/tgico.scss';\n/* import { computeCheck } from './lib/crypto/srp';\nimport { salt1, salt2, g, p, srp_id, secure_random, srp_B, password } from './mock/srp'; */\n\n//console.log('pineapples are in my head');\n\n/* console.time('get storage1');\nimport * as a from './lib/config';\nimport * as b from './lib/mtproto/mtproto_config';\nimport * as c from './helpers/userAgent';\nimport * as d from './lib/mtproto/mtprotoworker';\nimport * as e from './lib/polyfill';\nimport * as f from './lib/storage';\na && b && c && d && e && f;\nconsole.timeEnd('get storage1'); */\n\n/* Promise.all([\n import('./components/pageIm'),\n import('./components/pageSignIn'),\n import('./components/misc'),\n import('./lib/storage')\n]).then(imports => {\n let [pageIm, pageSignIn, misc, AppStorage] = imports; */\n\n document.addEventListener('DOMContentLoaded', async() => {\n //let socket = new Socket(2);\n\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n \n if(this.hasAttribute(name)) {\n if(force) return true;\n \n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n \n this.setAttribute(name, \"\");\n return true;\n };\n }\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n // @ts-ignore\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n // @ts-ignore\n const vh = (setViewportVH && !rootScope.default.isOverlayActive ? w.height || w.innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(touchSupport.IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n //const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n //console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n \n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n\n const [_, touchSupport, userAgent, rootScope, appStateManager, I18n, __/* , ___ */] = await Promise.all([\n import('./lib/polyfill'),\n import('./environment/touchSupport'),\n import('./environment/userAgent'),\n import('./lib/rootScope'),\n import('./lib/appManagers/appStateManager'),\n import('./lib/langPack'),\n import('./helpers/peerIdPolyfill'),\n // import('./helpers/cacheFunctionPolyfill')\n ]);\n\n //console.timeEnd('get storage');\n\n window.addEventListener('resize', setVH);\n setVH();\n\n //console.log(new Uint8Array([255, 200, 145]).hex);\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !rootScope.default.isOverlayActive;\n setVH();\n \n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n \n let tabId: number;\n rootScope.default.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n \n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.default.addEventListener('overlay_toggle', () => {\n toggleResizeMode();\n });\n }\n\n if(userAgent.IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n if(userAgent.IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\n }\n\n if(userAgent.IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(userAgent.IS_APPLE) {\n if(userAgent.IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n document.documentElement.classList.add('emoji-supported');\n\n if(userAgent.IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(userAgent.IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!touchSupport.IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n /* if(config.isServiceWorkerSupported) {\n await navigator.serviceWorker.ready;\n navigator.serviceWorker.controller ? true : await new Promise((resolve, reject) => {\n navigator.serviceWorker.addEventListener('controllerchange', resolve);\n });\n } */\n \n //console.time('get storage');\n\n const perf = performance.now();\n\n //import('./vendor/dateFormat');\n\n const langPromise = I18n.default.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.default.getState(), \n langPromise\n ]);\n //I18n.getCacheLangPack();\n //console.log('got auth:', auth);\n //console.timeEnd('get storage');\n\n I18n.default.setTimeFormat(state.settings.timeFormat);\n\n rootScope.default.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.default.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!touchSupport.IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n new Promise((resolve) => setTimeout(resolve, 1e3)), \n // @ts-ignore\n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* computeCheck(password, {\n current_algo: {\n salt1, \n salt2,\n p,\n g\n },\n srp_id,\n srp_B,\n secure_random,\n }).then(res => {\n console.log(res);\n }); */\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignQR')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pagePassword')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n //getNearestDc();\n }\n\n const ripple = (await import('./components/ripple')).ripple;\n (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n//});\n\n\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.b88862fa9966cf0e5abe.css b/public/main.b88862fa9966cf0e5abe.css new file mode 100644 index 00000000..1d74d668 --- /dev/null +++ b/public/main.b88862fa9966cf0e5abe.css @@ -0,0 +1,5 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:before,.no-transition:after{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word} +:root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--messages-secondary-line-height: calc(var(--messages-secondary-text-size) + 4px);--line-height: 1.3125;--line-height-16: 21px;--line-height-14: 18px;--font-size-16: 16px;--font-size-14: 14px;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--menu-box-shadow: 0px 2px 8px 1px var(--menu-box-shadow-color);--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color-rgb: 255, 255, 255;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--menu-box-shadow-color: rgba(0, 0, 0, .24);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--light-filled-primary-color: #eff6fd;--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-primary-color: var(--primary-color);--light-filled-message-primary-color: var(--light-filled-primary-color);--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--light-filled-message-out-primary-color: #e1f9d2;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color-rgb: 33, 33, 33;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--light-filled-primary-color: #292830;--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--light-filled-message-out-primary-color: #917fe3;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:" ";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8) !important;transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:1rem;-webkit-user-select:none;-webkit-touch-callout:none}.btn-menu{box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1) !important}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:3rem;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width: 600px){.btn-menu-item{--padding-right: 1.875rem}}.btn-menu-item-text{position:relative;flex:1 1 auto}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left: calc(var(--icon-size) + var(--icon-margin));position:absolute;margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.btn-menu-item-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{color:#3390ec;color:var(--primary-color);height:2rem;font-weight:500;pointer-events:none !important}.btn-menu-item .stacked-avatars{--margin-right: -.6875rem;flex:0 0 auto;right:1rem;position:absolute;pointer-events:none}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0;display:block !important}.btn-menu-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:#fff;background-color:var(--surface-color);position:absolute;opacity:0;transform:scale(0.8)}.btn-menu-reactions-container{--height: 2.625rem;--bubble-side-offset: -2.25rem;--other-side-offset: -1.5rem;--width: calc(100% + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);position:absolute;top:calc((var(--height) + .5rem) * -1);width:var(--width);max-width:var(--width);left:var(--other-side-offset);display:flex;justify-content:flex-end;height:var(--height)}.btn-menu-reactions-container-vertical{top:var(--other-side-offset);left:calc((var(--height) + .5rem) * -1);width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical: var(--padding-base);--padding-horizontal: 0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{right:calc(var(--size) / -2);bottom:var(--offset)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{position:absolute;background-color:inherit;border-radius:50%;z-index:-1}.btn-menu-reactions-bubble-big{--size: 1rem;--offset: calc(var(--height) / 2);width:var(--size);height:var(--size);right:var(--offset);bottom:calc(var(--size) / -2)}.btn-menu-reactions:after{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";pointer-events:none;border-radius:inherit;background:linear-gradient(var(--inner-shadow-degree), #fff 0%, rgba(255, 255, 255, 0) 1rem, rgba(255, 255, 255, 0) calc(100% - 1rem), #fff 100%);background:linear-gradient(var(--inner-shadow-degree), var(--surface-color) 0%, rgba(var(--surface-color-rgb), 0) 1rem, rgba(var(--surface-color-rgb), 0) calc(100% - 1rem), var(--surface-color) 100%)}.btn-menu-reactions .scrollable{position:relative;display:flex;border-radius:inherit}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 0.25rem}.btn-menu-reactions .scrollable-y{align-items:center;padding:0.25rem 0;flex-direction:column}.btn-menu-reactions-reaction{--size: 1.75rem;--padding-base: .25rem;--padding-vertical: 0rem;--padding-horizontal: var(--padding-base);width:calc(var(--size) + var(--padding-horizontal) * 2);height:calc(var(--size) + var(--padding-vertical) * 2);flex:0 0 auto;padding:var(--padding-vertical) var(--padding-horizontal);cursor:pointer}.btn-menu-reactions-reaction-scale{width:100%;height:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{position:relative;width:100%;height:100%}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:hover,html.no-touch .btn-transparent.primary:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{width:auto;padding:0 2rem !important;border-radius:var(--size);font-size:1rem;font-weight:500;right:auto}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{--color: var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:""}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-menu-close-icon{margin-top:-0.625rem}.animated-menu-close-icon:before{top:.3125rem;opacity:1}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translate(0, 0.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{transform:rotate(45deg);opacity:0}.animated-menu-close-icon.state-back:after{transform:translate(0rem, -0.625rem) rotate(90deg)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem}@media only screen and (min-width: 601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size: 2.25rem;--icon-margin-right: .5rem;--selector-size: 50px;--selector-thumb-size: .75rem;--hide-width: var(--icon-size);--show-width: calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size) * .75);display:flex;align-items:center;width:var(--hide-width);overflow:hidden}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4, .0, .2, 1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:hover,html.no-touch .default .player-volume:active{width:var(--show-width)}.default .player-volume__icon{color:#fff;width:var(--icon-size);height:var(--icon-size);margin-right:var(--icon-margin-right);cursor:pointer;padding:.375rem;font-size:1.5rem;display:flex}.default .player-volume .progress-line{--color: #fff;--thumb-size: var(--selector-thumb-size);--height: 4px;margin:0;width:var(--selector-size);min-width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:" ";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:" ";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:calc((var(--thumb-size) - var(--height)) / -2);transform:translateX(calc(var(--thumb-size) / 2)) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size) / 2)) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;line-height:var(--line-height);cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:"";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:" ";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:"";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.125rem;margin-top:-0.125rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:1.25rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:"" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;background-color:#df3f40 !important;background-color:var(--danger-color) !important;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:"";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec !important;background-color:var(--primary-color) !important;z-index:3}.chat-input .btn-send .tgico-check{height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;color:#fff !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:" ";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item.is-image{background-image:url("assets/img/bg.jpeg");background-position:center center;background-color:inherit;background-size:cover}.chat-background-item.is-pattern{margin:0 !important;background-image:none !important;background-size:contain;background-repeat:repeat-x;background-color:#000 !important;display:flex;align-items:center;justify-content:center;height:150%;top:-25%}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat-background-item-canvas{--opacity-max: 1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-position:center;mask-position:center}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat .contextmenu{box-shadow:none !important;filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, .24));filter:drop-shadow(0 0.125rem 0.5rem var(--menu-box-shadow-color))}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);--button-size: 2.125rem;--button-horizontal-margin: .125rem;display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:100%;padding:.5625rem var(--padding-horizontal) 0;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{padding-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:45px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 var(--icon-margin) 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{--send-as-size: 1.875rem;--send-as-margin-left: .25rem;--send-as-margin-right: .375rem;--send-as-total-size: calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size: 2.375rem;--commands-margin-left: .25rem;--commands-margin-right: .375rem;--commands-total-size: calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX: 0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{position:absolute;flex:0 0 auto;bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{width:var(--commands-size);height:1.875rem;border-radius:1.875rem;background-color:#3390ec;background-color:var(--primary-color);display:flex;align-items:center;justify-content:center;margin-left:var(--commands-margin-left);cursor:pointer}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{transform:scale(0.875);display:flex;align-items:center;justify-content:center}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color: #fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{width:var(--send-as-size);height:var(--send-as-size);margin-left:var(--send-as-margin-left);background:none !important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{max-height:20rem;max-width:20rem;top:auto;right:auto;left:calc(var(--padding-horizontal) * -1 - .25rem) !important;width:auto;height:auto;transform:scale3d(1, 1, 1)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset: -.25rem;content:" ";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.125rem solid #3390ec;border:.125rem solid var(--primary-color);border-radius:50%}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{position:absolute;transform:scale(0);opacity:0;pointer-events:none}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){transform:scale(1);opacity:1}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{width:inherit;height:inherit;background-color:#3390ec;background-color:var(--primary-color);font-size:1.375rem;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX: var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX: 48px}.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset .input-message-container{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX: calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands{transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size);height:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:" ";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto;max-width:100%}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0;flex:0 0 auto}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}}@media only screen and (max-width: 480px){.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}@media only screen and (min-width: 1276px){.topbar-call-center{padding:0 calc(var(--right-column-width) / 2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:" ";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:"Unread messages";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size: 1.875rem;--offset: calc(var(--size) * -.75);position:absolute;right:var(--offset);bottom:-0.125rem;width:var(--size);height:1.625rem;border-radius:var(--size);z-index:2;background-color:#fff;background-color:var(--surface-color);cursor:pointer;opacity:0;transform:scale(0.8);display:flex;align-items:center;justify-content:center;box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);box-shadow:var(--menu-box-shadow)}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34, 1.56, .64, 1),transform .2s cubic-bezier(.34, 1.56, .64, 1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){transform:scale(1);opacity:1}.bubble-hover-reaction-sticker{width:1.125rem;height:1.125rem;position:relative}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .bubble-content,.bubble.emoji-big:not(.sticker) .bubble-content{align-self:flex-start}.bubble.sticker .message,.bubble.emoji-big:not(.sticker) .message{position:relative !important;margin-left:auto;right:0 !important}.bubble.sticker .attachment{position:absolute;border-radius:0;z-index:1}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;transform:translateY(-50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 0;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web+.time{display:block}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name,.bubble .web .text,.bubble .web .title{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:" "}.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:hover,html.no-touch .bubble:not(.just-media) .reply:active{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document,.bubble .audio{--icon-size: 2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;--icon-margin: .6875rem}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{--icon-margin: .75rem;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{--icon-margin: .5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500}.bubble-call-subtitle{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem;line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.document .time,.bubble .document-message+.audio .time{display:none !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top: .25rem;--margin-left: .125rem;left:auto;top:auto;background:#fff;border-radius:50%;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top))}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:" ";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message .audio .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color: var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:"";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:.3125rem .625rem 0 .625rem;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.875rem;line-height:1.25rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:.375rem 0 .5rem}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{height:3.1875rem;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{font-weight:500;font-size:.9375rem;margin-left:.5rem;display:flex;align-items:center;color:#3390ec;color:var(--primary-color);line-height:1.125rem}.bubble .replies-footer-avatars{--margin-right: -.875rem;--border-size: 2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{content:" ";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color: var(--light-filled-message-primary-color)}.bubble .message .reaction:not(.is-chosen),.bubble .message .reaction.is-chosen.backwards{--counter-color: var(--message-primary-color)}.bubble .message .reaction:not(.is-chosen) .stacked-avatars,.bubble .message .reaction.is-chosen.backwards .stacked-avatars{--border-color: var(--background-color)}.bubble .message .reactions-block .time{position:unset !important;right:auto !important;bottom:auto !important;order:100}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1;display:flex;flex-direction:column}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color);--message-primary-color: var(--message-out-primary-color);--light-filled-message-primary-color: var(--light-filled-message-out-primary-color)}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:""}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:""}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:""}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color: var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{right:auto;left:var(--offset)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:" ";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:" ";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:" ";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:" "}.pinned-audio-volume .player-volume__icon{display:flex;cursor:pointer}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:252px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:672px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:" ";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding: 24px;--offset: .5rem;position:absolute !important;bottom:calc(100% - var(--border-radius-padding));right:calc(var(--offset) * -1);left:calc(var(--offset) * -1);width:auto !important;max-height:20rem;max-width:none;border-radius:12px 12px 0 0 !important;background-color:transparent !important;pointer-events:none;overflow:hidden;padding:var(--offset) var(--offset) 0 !important;box-shadow:none;-webkit-animation:none !important;animation:none !important;visibility:visible !important;transition:none !important}body.animation-level-2 .bot-commands{display:flex !important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);border-radius:inherit;height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{transform:translateY(0);opacity:1}.bot-commands-list{border-radius:inherit;width:100%;height:var(--height);padding-bottom:0}.bot-commands-list-element{border-radius:0 !important;flex-direction:column;align-items:flex-start;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{position:absolute;left:.75rem}.bot-commands-list-element-name,.bot-commands-list-element-description{margin-left:0;font-size:.875rem;line-height:18px;line-height:var(--line-height-14)}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:" ";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width: 600px){.profile-button{border-radius:0}}.profile-change-avatar{--size: 3.375rem;position:absolute !important;top:calc(var(--size) / -2);right:1.25rem;transform:none;transition:none !important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:" ";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:" ";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible;pointer-events:none}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:" ";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible;justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{padding-bottom:0;height:15rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:1.875rem;padding:0 .75rem;font-size:.9375rem;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:.9375rem;line-height:1.875rem}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0 !important}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-content.full-width{margin:0 !important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{position:absolute;width:100%;height:100%;-webkit-mask-position:center;-webkit-mask-size:contain}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:" ";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size: 3rem;--icon-margin: .75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0 !important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:"";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:" ";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.6875}avatar-element.avatar-24{--size: 24px;--multiplier: 2.25}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.avatar-full{position:absolute;width:100%;height:100%;border-radius:inherit;display:inline-flex;align-items:center;justify-content:center}.avatar-full .avatar-photo{width:100% !important;height:100% !important;-o-object-fit:cover;object-fit:cover}.document{--background-color: var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:"";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16)}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);text-overflow:ellipsis;overflow:hidden}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{--icon-size: 3.375rem;--icon-margin: .875rem;--padding-left: calc(var(--icon-size) + var(--icon-margin));padding-left:var(--padding-left);display:flex;flex-direction:column;justify-content:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;margin-left:calc(var(--padding-left) * -1);width:var(--icon-size);height:var(--icon-size);color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.document .checkbox-field-round,.audio .checkbox-field-round{--margin-top: .25rem;--margin-left: .125rem;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto;left:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{overflow:visible !important;--icon-size: 3rem;--icon-margin: .5625rem;height:var(--icon-size)}.audio-toggle,.audio-download{border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:0 !important;top:57.5%;left:57.5%;background:none;display:flex !important}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:hover,html.no-touch .audio-waveform-background rect:active{opacity:1}.audio-waveform-fake{position:absolute;top:0;right:0;bottom:0;left:0;width:0;overflow:hidden;pointer-events:none}.audio-waveform-container{position:relative;height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:" • "}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:" ";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:" ";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:" ";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:"";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:18px;line-height:var(--line-height-14);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:3rem !important;height:3rem !important;position:absolute !important;margin:0 !important;left:.5rem}.row-media-small{width:2rem !important;height:2rem !important;left:.75rem !important}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:unset}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction{display:flex;align-items:center}.reaction-sticker{position:relative;width:var(--reaction-size);height:var(--reaction-size);display:flex;align-items:center;justify-content:center}.reaction-sticker-activate{position:absolute;top:var(--reaction-offset);right:var(--reaction-offset);bottom:var(--reaction-offset);left:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size: calc(var(--reaction-size) + var(--reaction-offset) * -2);width:var(--size) !important;height:var(--size) !important;max-width:var(--size);max-height:var(--size);top:auto;right:auto;bottom:auto;left:auto}.reaction-inline{--reaction-size: .875rem;--reaction-offset: -.4375rem;min-width:var(--reaction-size);min-height:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit !important;order:-1;margin-right:.0625rem !important}.reaction-block{--additional-height: .5rem;--margin: .375rem;--reaction-size: 1.375rem;--reaction-offset: -.5625rem;--background-color: var(--message-highlightning-color);--chosen-background-color: var(--message-primary-color);--counter-color: #fff;--reaction-total-size: calc(var(--reaction-size) + var(--additional-height));height:var(--reaction-total-size);border-radius:var(--reaction-total-size);padding:0 .5rem;background-color:#f4f4f5;background-color:var(--background-color);cursor:pointer;position:relative;margin-top:var(--margin);margin-right:var(--margin);color:var(--counter-color)}.reaction-block:last-child{margin-right:0}.reaction-block:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--chosen-background-color);border-radius:inherit;transform:scale3d(0, 0, 0);opacity:0}.reaction-block.is-chosen:not(.backwards):before{transform:scale3d(1, 1, 1);opacity:1}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color: var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4, .0, .2, 1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4, .0, .2, 1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color: transparent;--border-size: .125rem;--margin-right: -.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem !important;font-weight:500;margin:0 .0625rem 0 .375rem;line-height:1.125rem;position:relative}.stacked-avatars{--border-color: var(--surface-color);--border-size: 1px;--margin-right: -.3125rem;--avatar-size: 1rem;--avatar-total-size: calc(var(--avatar-size) + var(--border-size) * 2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{width:var(--avatar-size);height:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{width:var(--avatar-total-size);height:var(--avatar-total-size);border:var(--border-size) solid #dfe1e5;border:var(--border-size) solid var(--border-color);display:flex;align-items:center;justify-content:center;border-radius:50%;position:relative}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.show-controls .call-title,.call.show-controls .call-subtitle,.call.show-controls .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.no-video .call-title,.call.no-video .call-subtitle,.call.no-video .popup-header,.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{transform:scale(1.3125);margin-right:1rem}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7;border-radius:inherit}.call-avatar .avatar-full{font-size:6rem}.call-title{font-weight:500;font-size:1.25rem}.call-subtitle{font-size:1rem}.call-title,.call-subtitle,.call-emojis,.call .popup-header{opacity:0}body.animation-level-2 .call-title,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-emojis,body.animation-level-2 .call .popup-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second{--margin-length: 2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * var(--margin-length)));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length: .656875}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit;opacity:1}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px;cursor:pointer}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{display:flex;flex-direction:column;position:absolute;bottom:calc(1.75rem + 3.375rem + 1.5rem + 1rem);bottom:calc(1.75rem + var(--call-button-size) + 1.5rem + 1rem);z-index:2;width:100%;align-items:center;padding:0 1rem;pointer-events:none}.call-party-state{height:1.625rem;border-radius:1.625rem;line-height:1.625rem;background-color:rgba(255,255,255,.2);color:#fff;padding:0 .625rem;font-size:.875rem;display:flex;align-items:center;margin-top:1rem;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);font-weight:500;opacity:0;transform:scale(0) translateY(0);max-width:100%}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{width:1.875rem !important;height:1.875rem !important;margin-right:.25rem;margin-left:-0.25rem;flex:0 0 auto}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:" ";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{opacity:1;color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:" ";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -0.625rem}.popup-mute .sidebar-left-section{margin-bottom:0 !important;padding:0 !important}.popup-mute .sidebar-left-section-content{margin:0 !important}.popup-reacted-list .popup-container{width:25rem;height:600px;max-height:600px;padding:0}.popup-reacted-list .popup-header{min-height:3.5625rem;margin:0;padding:.25rem .75rem .75rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-reacted-list .popup-close{margin-top:.375rem;margin-right:.5rem;height:40px;order:-1}.popup-reacted-list .reaction{--additional-height: .75rem;--reaction-size: 1.5rem;--margin: .5rem;--background-color: var(--light-filled-primary-color);--counter-color: var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color: #fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem !important;margin:0;display:flex;align-items:center}.popup-reacted-list .sidebar-left-section{margin-bottom:0 !important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{width:1.5rem;height:1.5rem;margin:0;top:50%;transform:translateY(-50%)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;line-height:var(--line-height);text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:" "}.media-round.is-paused .video-time:after{content:"";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:" ";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px !important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:"Roboto" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.quick-reaction-title{display:flex;align-items:center}.quick-reaction-sticker{width:32px !important;height:32px !important;position:relative !important;margin:0 .5rem 0 0 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0} +@font-face{font-family:"tgico";src:url("assets/fonts/tgico.ttf?85ar8e") format("truetype"),url("assets/fonts/tgico.woff?85ar8e") format("woff"),url("assets/fonts/tgico.svg?85ar8e#tgico") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=" tgico-"]:before,[class*=" tgico-"]:after{font-family:"tgico";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add_reaction:before{content:""}.tgico-add:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete_filled:before{content:""}.tgico-delete:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward_filled:before{content:""}.tgico-forward:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-play:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply_filled:before{content:""}.tgico-reply:before{content:""}.tgico-rightpanel:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings_filled:before{content:""}.tgico-settings:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videocamera:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""} + +/*# sourceMappingURL=main.b88862fa9966cf0e5abe.css.map*/ \ No newline at end of file diff --git a/public/main.b88862fa9966cf0e5abe.css.map b/public/main.b88862fa9966cf0e5abe.css.map new file mode 100644 index 00000000..195fea44 --- /dev/null +++ b/public/main.b88862fa9966cf0e5abe.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss","webpack:///./src/scss/tgico.scss"],"names":[],"mappings":"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","file":"main.b88862fa9966cf0e5abe.css","sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:before,.no-transition:after{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}",":root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--messages-secondary-line-height: calc(var(--messages-secondary-text-size) + 4px);--line-height: 1.3125;--line-height-16: 21px;--line-height-14: 18px;--font-size-16: 16px;--font-size-14: 14px;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--menu-box-shadow: 0px 2px 8px 1px var(--menu-box-shadow-color);--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color-rgb: 255, 255, 255;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--menu-box-shadow-color: rgba(0, 0, 0, .24);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--light-filled-primary-color: #eff6fd;--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-primary-color: var(--primary-color);--light-filled-message-primary-color: var(--light-filled-primary-color);--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--light-filled-message-out-primary-color: #e1f9d2;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color-rgb: 33, 33, 33;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--light-filled-primary-color: #292830;--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--light-filled-message-out-primary-color: #917fe3;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:\" \";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8) !important;transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:1rem;-webkit-user-select:none;-webkit-touch-callout:none}.btn-menu{box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1) !important}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:3rem;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width: 600px){.btn-menu-item{--padding-right: 1.875rem}}.btn-menu-item-text{position:relative;flex:1 1 auto}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left: calc(var(--icon-size) + var(--icon-margin));position:absolute;margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.btn-menu-item-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{color:#3390ec;color:var(--primary-color);height:2rem;font-weight:500;pointer-events:none !important}.btn-menu-item .stacked-avatars{--margin-right: -.6875rem;flex:0 0 auto;right:1rem;position:absolute;pointer-events:none}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0;display:block !important}.btn-menu-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:#fff;background-color:var(--surface-color);position:absolute;opacity:0;transform:scale(0.8)}.btn-menu-reactions-container{--height: 2.625rem;--bubble-side-offset: -2.25rem;--other-side-offset: -1.5rem;--width: calc(100% + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);position:absolute;top:calc((var(--height) + .5rem) * -1);width:var(--width);max-width:var(--width);left:var(--other-side-offset);display:flex;justify-content:flex-end;height:var(--height)}.btn-menu-reactions-container-vertical{top:var(--other-side-offset);left:calc((var(--height) + .5rem) * -1);width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical: var(--padding-base);--padding-horizontal: 0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{right:calc(var(--size) / -2);bottom:var(--offset)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{position:absolute;background-color:inherit;border-radius:50%;z-index:-1}.btn-menu-reactions-bubble-big{--size: 1rem;--offset: calc(var(--height) / 2);width:var(--size);height:var(--size);right:var(--offset);bottom:calc(var(--size) / -2)}.btn-menu-reactions:after{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";pointer-events:none;border-radius:inherit;background:linear-gradient(var(--inner-shadow-degree), #fff 0%, rgba(255, 255, 255, 0) 1rem, rgba(255, 255, 255, 0) calc(100% - 1rem), #fff 100%);background:linear-gradient(var(--inner-shadow-degree), var(--surface-color) 0%, rgba(var(--surface-color-rgb), 0) 1rem, rgba(var(--surface-color-rgb), 0) calc(100% - 1rem), var(--surface-color) 100%)}.btn-menu-reactions .scrollable{position:relative;display:flex;border-radius:inherit}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 0.25rem}.btn-menu-reactions .scrollable-y{align-items:center;padding:0.25rem 0;flex-direction:column}.btn-menu-reactions-reaction{--size: 1.75rem;--padding-base: .25rem;--padding-vertical: 0rem;--padding-horizontal: var(--padding-base);width:calc(var(--size) + var(--padding-horizontal) * 2);height:calc(var(--size) + var(--padding-vertical) * 2);flex:0 0 auto;padding:var(--padding-vertical) var(--padding-horizontal);cursor:pointer}.btn-menu-reactions-reaction-scale{width:100%;height:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{position:relative;width:100%;height:100%}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:hover,html.no-touch .btn-transparent.primary:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{width:auto;padding:0 2rem !important;border-radius:var(--size);font-size:1rem;font-weight:500;right:auto}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:\"\"}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{--color: var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:\"\"}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-menu-close-icon{margin-top:-0.625rem}.animated-menu-close-icon:before{top:.3125rem;opacity:1}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translate(0, 0.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{transform:rotate(45deg);opacity:0}.animated-menu-close-icon.state-back:after{transform:translate(0rem, -0.625rem) rotate(90deg)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem}@media only screen and (min-width: 601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size: 2.25rem;--icon-margin-right: .5rem;--selector-size: 50px;--selector-thumb-size: .75rem;--hide-width: var(--icon-size);--show-width: calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size) * .75);display:flex;align-items:center;width:var(--hide-width);overflow:hidden}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4, .0, .2, 1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:hover,html.no-touch .default .player-volume:active{width:var(--show-width)}.default .player-volume__icon{color:#fff;width:var(--icon-size);height:var(--icon-size);margin-right:var(--icon-margin-right);cursor:pointer;padding:.375rem;font-size:1.5rem;display:flex}.default .player-volume .progress-line{--color: #fff;--thumb-size: var(--selector-thumb-size);--height: 4px;margin:0;width:var(--selector-size);min-width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:\" \";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:\" \";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:calc((var(--thumb-size) - var(--height)) / -2);transform:translateX(calc(var(--thumb-size) / 2)) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size) / 2)) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;line-height:var(--line-height);cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:\"\";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:\" \";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:\"\";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.125rem;margin-top:-0.125rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:1.25rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;background-color:#df3f40 !important;background-color:var(--danger-color) !important;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:\"\";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec !important;background-color:var(--primary-color) !important;z-index:3}.chat-input .btn-send .tgico-check{height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;color:#fff !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:\" \";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item.is-image{background-image:url(\"assets/img/bg.jpeg\");background-position:center center;background-color:inherit;background-size:cover}.chat-background-item.is-pattern{margin:0 !important;background-image:none !important;background-size:contain;background-repeat:repeat-x;background-color:#000 !important;display:flex;align-items:center;justify-content:center;height:150%;top:-25%}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat-background-item-canvas{--opacity-max: 1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-position:center;mask-position:center}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat .contextmenu{box-shadow:none !important;filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, .24));filter:drop-shadow(0 0.125rem 0.5rem var(--menu-box-shadow-color))}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);--button-size: 2.125rem;--button-horizontal-margin: .125rem;display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:100%;padding:.5625rem var(--padding-horizontal) 0;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{padding-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:45px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 var(--icon-margin) 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{--send-as-size: 1.875rem;--send-as-margin-left: .25rem;--send-as-margin-right: .375rem;--send-as-total-size: calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size: 2.375rem;--commands-margin-left: .25rem;--commands-margin-right: .375rem;--commands-total-size: calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX: 0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{position:absolute;flex:0 0 auto;bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{width:var(--commands-size);height:1.875rem;border-radius:1.875rem;background-color:#3390ec;background-color:var(--primary-color);display:flex;align-items:center;justify-content:center;margin-left:var(--commands-margin-left);cursor:pointer}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{transform:scale(0.875);display:flex;align-items:center;justify-content:center}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color: #fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{width:var(--send-as-size);height:var(--send-as-size);margin-left:var(--send-as-margin-left);background:none !important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{max-height:20rem;max-width:20rem;top:auto;right:auto;left:calc(var(--padding-horizontal) * -1 - .25rem) !important;width:auto;height:auto;transform:scale3d(1, 1, 1)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset: -.25rem;content:\" \";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.125rem solid #3390ec;border:.125rem solid var(--primary-color);border-radius:50%}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{position:absolute;transform:scale(0);opacity:0;pointer-events:none}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){transform:scale(1);opacity:1}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{width:inherit;height:inherit;background-color:#3390ec;background-color:var(--primary-color);font-size:1.375rem;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX: var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX: 48px}.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset .input-message-container{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX: calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands{transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size);height:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:\" \";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto;max-width:100%}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0;flex:0 0 auto}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}}@media only screen and (max-width: 480px){.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}@media only screen and (min-width: 1276px){.topbar-call-center{padding:0 calc(var(--right-column-width) / 2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:\" \";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:\"Unread messages\";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size: 1.875rem;--offset: calc(var(--size) * -.75);position:absolute;right:var(--offset);bottom:-0.125rem;width:var(--size);height:1.625rem;border-radius:var(--size);z-index:2;background-color:#fff;background-color:var(--surface-color);cursor:pointer;opacity:0;transform:scale(0.8);display:flex;align-items:center;justify-content:center;box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);box-shadow:var(--menu-box-shadow)}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34, 1.56, .64, 1),transform .2s cubic-bezier(.34, 1.56, .64, 1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){transform:scale(1);opacity:1}.bubble-hover-reaction-sticker{width:1.125rem;height:1.125rem;position:relative}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .bubble-content,.bubble.emoji-big:not(.sticker) .bubble-content{align-self:flex-start}.bubble.sticker .message,.bubble.emoji-big:not(.sticker) .message{position:relative !important;margin-left:auto;right:0 !important}.bubble.sticker .attachment{position:absolute;border-radius:0;z-index:1}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;transform:translateY(-50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 0;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web+.time{display:block}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name,.bubble .web .text,.bubble .web .title{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:\" \"}.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:hover,html.no-touch .bubble:not(.just-media) .reply:active{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document,.bubble .audio{--icon-size: 2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;--icon-margin: .6875rem}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{--icon-margin: .75rem;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{--icon-margin: .5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500}.bubble-call-subtitle{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem;line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.document .time,.bubble .document-message+.audio .time{display:none !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top: .25rem;--margin-left: .125rem;left:auto;top:auto;background:#fff;border-radius:50%;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top))}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:\" \";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message .audio .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color: var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:\"\";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:.3125rem .625rem 0 .625rem;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.875rem;line-height:1.25rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:.375rem 0 .5rem}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{height:3.1875rem;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{font-weight:500;font-size:.9375rem;margin-left:.5rem;display:flex;align-items:center;color:#3390ec;color:var(--primary-color);line-height:1.125rem}.bubble .replies-footer-avatars{--margin-right: -.875rem;--border-size: 2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{content:\" \";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color: var(--light-filled-message-primary-color)}.bubble .message .reaction:not(.is-chosen),.bubble .message .reaction.is-chosen.backwards{--counter-color: var(--message-primary-color)}.bubble .message .reaction:not(.is-chosen) .stacked-avatars,.bubble .message .reaction.is-chosen.backwards .stacked-avatars{--border-color: var(--background-color)}.bubble .message .reactions-block .time{position:unset !important;right:auto !important;bottom:auto !important;order:100}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1;display:flex;flex-direction:column}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color);--message-primary-color: var(--message-out-primary-color);--light-filled-message-primary-color: var(--light-filled-message-out-primary-color)}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:\"\"}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:\"\"}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:\"\"}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color: var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{right:auto;left:var(--offset)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:\" \";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:\" \";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:\" \";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:\" \"}.pinned-audio-volume .player-volume__icon{display:flex;cursor:pointer}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:252px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:672px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:\" \";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding: 24px;--offset: .5rem;position:absolute !important;bottom:calc(100% - var(--border-radius-padding));right:calc(var(--offset) * -1);left:calc(var(--offset) * -1);width:auto !important;max-height:20rem;max-width:none;border-radius:12px 12px 0 0 !important;background-color:transparent !important;pointer-events:none;overflow:hidden;padding:var(--offset) var(--offset) 0 !important;box-shadow:none;-webkit-animation:none !important;animation:none !important;visibility:visible !important;transition:none !important}body.animation-level-2 .bot-commands{display:flex !important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);border-radius:inherit;height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{transform:translateY(0);opacity:1}.bot-commands-list{border-radius:inherit;width:100%;height:var(--height);padding-bottom:0}.bot-commands-list-element{border-radius:0 !important;flex-direction:column;align-items:flex-start;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{position:absolute;left:.75rem}.bot-commands-list-element-name,.bot-commands-list-element-description{margin-left:0;font-size:.875rem;line-height:18px;line-height:var(--line-height-14)}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:\" \";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width: 600px){.profile-button{border-radius:0}}.profile-change-avatar{--size: 3.375rem;position:absolute !important;top:calc(var(--size) / -2);right:1.25rem;transform:none;transition:none !important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:\" \";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:\" \";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible;pointer-events:none}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:\" \";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible;justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{padding-bottom:0;height:15rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:1.875rem;padding:0 .75rem;font-size:.9375rem;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:.9375rem;line-height:1.875rem}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0 !important}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-content.full-width{margin:0 !important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{position:absolute;width:100%;height:100%;-webkit-mask-position:center;-webkit-mask-size:contain}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:\" \";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size: 3rem;--icon-margin: .75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0 !important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:\"\";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:\"\";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:\" \";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.6875}avatar-element.avatar-24{--size: 24px;--multiplier: 2.25}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.avatar-full{position:absolute;width:100%;height:100%;border-radius:inherit;display:inline-flex;align-items:center;justify-content:center}.avatar-full .avatar-photo{width:100% !important;height:100% !important;-o-object-fit:cover;object-fit:cover}.document{--background-color: var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:\"\";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16)}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);text-overflow:ellipsis;overflow:hidden}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{--icon-size: 3.375rem;--icon-margin: .875rem;--padding-left: calc(var(--icon-size) + var(--icon-margin));padding-left:var(--padding-left);display:flex;flex-direction:column;justify-content:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;margin-left:calc(var(--padding-left) * -1);width:var(--icon-size);height:var(--icon-size);color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.document .checkbox-field-round,.audio .checkbox-field-round{--margin-top: .25rem;--margin-left: .125rem;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto;left:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{overflow:visible !important;--icon-size: 3rem;--icon-margin: .5625rem;height:var(--icon-size)}.audio-toggle,.audio-download{border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:0 !important;top:57.5%;left:57.5%;background:none;display:flex !important}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:hover,html.no-touch .audio-waveform-background rect:active{opacity:1}.audio-waveform-fake{position:absolute;top:0;right:0;bottom:0;left:0;width:0;overflow:hidden;pointer-events:none}.audio-waveform-container{position:relative;height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:\" • \"}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:\" \";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:\" \";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:\" \";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:\"\";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:18px;line-height:var(--line-height-14);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:3rem !important;height:3rem !important;position:absolute !important;margin:0 !important;left:.5rem}.row-media-small{width:2rem !important;height:2rem !important;left:.75rem !important}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:unset}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction{display:flex;align-items:center}.reaction-sticker{position:relative;width:var(--reaction-size);height:var(--reaction-size);display:flex;align-items:center;justify-content:center}.reaction-sticker-activate{position:absolute;top:var(--reaction-offset);right:var(--reaction-offset);bottom:var(--reaction-offset);left:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size: calc(var(--reaction-size) + var(--reaction-offset) * -2);width:var(--size) !important;height:var(--size) !important;max-width:var(--size);max-height:var(--size);top:auto;right:auto;bottom:auto;left:auto}.reaction-inline{--reaction-size: .875rem;--reaction-offset: -.4375rem;min-width:var(--reaction-size);min-height:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit !important;order:-1;margin-right:.0625rem !important}.reaction-block{--additional-height: .5rem;--margin: .375rem;--reaction-size: 1.375rem;--reaction-offset: -.5625rem;--background-color: var(--message-highlightning-color);--chosen-background-color: var(--message-primary-color);--counter-color: #fff;--reaction-total-size: calc(var(--reaction-size) + var(--additional-height));height:var(--reaction-total-size);border-radius:var(--reaction-total-size);padding:0 .5rem;background-color:#f4f4f5;background-color:var(--background-color);cursor:pointer;position:relative;margin-top:var(--margin);margin-right:var(--margin);color:var(--counter-color)}.reaction-block:last-child{margin-right:0}.reaction-block:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--chosen-background-color);border-radius:inherit;transform:scale3d(0, 0, 0);opacity:0}.reaction-block.is-chosen:not(.backwards):before{transform:scale3d(1, 1, 1);opacity:1}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color: var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4, .0, .2, 1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4, .0, .2, 1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color: transparent;--border-size: .125rem;--margin-right: -.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem !important;font-weight:500;margin:0 .0625rem 0 .375rem;line-height:1.125rem;position:relative}.stacked-avatars{--border-color: var(--surface-color);--border-size: 1px;--margin-right: -.3125rem;--avatar-size: 1rem;--avatar-total-size: calc(var(--avatar-size) + var(--border-size) * 2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{width:var(--avatar-size);height:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{width:var(--avatar-total-size);height:var(--avatar-total-size);border:var(--border-size) solid #dfe1e5;border:var(--border-size) solid var(--border-color);display:flex;align-items:center;justify-content:center;border-radius:50%;position:relative}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.show-controls .call-title,.call.show-controls .call-subtitle,.call.show-controls .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.no-video .call-title,.call.no-video .call-subtitle,.call.no-video .popup-header,.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{transform:scale(1.3125);margin-right:1rem}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7;border-radius:inherit}.call-avatar .avatar-full{font-size:6rem}.call-title{font-weight:500;font-size:1.25rem}.call-subtitle{font-size:1rem}.call-title,.call-subtitle,.call-emojis,.call .popup-header{opacity:0}body.animation-level-2 .call-title,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-emojis,body.animation-level-2 .call .popup-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second{--margin-length: 2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * var(--margin-length)));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length: .656875}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit;opacity:1}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px;cursor:pointer}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{display:flex;flex-direction:column;position:absolute;bottom:calc(1.75rem + 3.375rem + 1.5rem + 1rem);bottom:calc(1.75rem + var(--call-button-size) + 1.5rem + 1rem);z-index:2;width:100%;align-items:center;padding:0 1rem;pointer-events:none}.call-party-state{height:1.625rem;border-radius:1.625rem;line-height:1.625rem;background-color:rgba(255,255,255,.2);color:#fff;padding:0 .625rem;font-size:.875rem;display:flex;align-items:center;margin-top:1rem;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);font-weight:500;opacity:0;transform:scale(0) translateY(0);max-width:100%}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{width:1.875rem !important;height:1.875rem !important;margin-right:.25rem;margin-left:-0.25rem;flex:0 0 auto}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:\" \";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{opacity:1;color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:\" \";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -0.625rem}.popup-mute .sidebar-left-section{margin-bottom:0 !important;padding:0 !important}.popup-mute .sidebar-left-section-content{margin:0 !important}.popup-reacted-list .popup-container{width:25rem;height:600px;max-height:600px;padding:0}.popup-reacted-list .popup-header{min-height:3.5625rem;margin:0;padding:.25rem .75rem .75rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-reacted-list .popup-close{margin-top:.375rem;margin-right:.5rem;height:40px;order:-1}.popup-reacted-list .reaction{--additional-height: .75rem;--reaction-size: 1.5rem;--margin: .5rem;--background-color: var(--light-filled-primary-color);--counter-color: var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color: #fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem !important;margin:0;display:flex;align-items:center}.popup-reacted-list .sidebar-left-section{margin-bottom:0 !important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{width:1.5rem;height:1.5rem;margin:0;top:50%;transform:translateY(-50%)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;line-height:var(--line-height);text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:\" \"}.media-round.is-paused .video-time:after{content:\"\";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:\" \";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px !important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:\"Roboto\" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.quick-reaction-title{display:flex;align-items:center}.quick-reaction-sticker{width:32px !important;height:32px !important;position:relative !important;margin:0 .5rem 0 0 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0}","@font-face{font-family:\"tgico\";src:url(\"assets/fonts/tgico.ttf?85ar8e\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?85ar8e\") format(\"woff\"),url(\"assets/fonts/tgico.svg?85ar8e#tgico\") format(\"svg\");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=\" tgico-\"]:before,[class*=\" tgico-\"]:after{font-family:\"tgico\";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js b/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js deleted file mode 100644 index 7b2cc61b..00000000 --- a/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see mtproto.worker.77bc82001791a2fea575.bundle.worker.js.LICENSE.txt */ -(()=>{var e={736:(e,t,a)=>{var n;e=a.nmd(e);var s=function(e){"use strict";var t=1e7,a=9007199254740992,n=c(a),i="0123456789abcdefghijklmnopqrstuvwxyz",r="function"==typeof BigInt;function p(e,t,a,n){return void 0===e?p[0]:void 0===t||10==+t&&!a?Z(e):z(e,t,a,n)}function o(e,t){this.value=e,this.sign=t,this.isSmall=!1}function m(e){this.value=e,this.sign=e<0,this.isSmall=!0}function d(e){this.value=e}function y(e){return-a0?Math.floor(e):Math.ceil(e)}function f(e,a){var n,s,i=e.length,r=a.length,p=new Array(i),o=0,m=t;for(s=0;s=m?1:0,p[s]=n-o*m;for(;s0&&p.push(o),p}function _(e,t){return e.length>=t.length?f(e,t):f(t,e)}function v(e,a){var n,s,i=e.length,r=new Array(i),p=t;for(s=0;s0;)r[s++]=a%p,a=Math.floor(a/p);return r}function b(e,a){var n,s,i=e.length,r=a.length,p=new Array(i),o=0,m=t;for(n=0;n0;)r[s++]=o%p,o=Math.floor(o/p);return r}function k(e,t){for(var a=[];t-- >0;)a.push(0);return a.concat(e)}function I(e,t){var a=Math.max(e.length,t.length);if(a<=30)return P(e,t);a=Math.ceil(a/2);var n=e.slice(a),s=e.slice(0,a),i=t.slice(a),r=t.slice(0,a),p=I(s,r),o=I(n,i),m=I(_(s,n),_(r,i)),d=_(_(p,k(b(b(m,p),o),a)),k(o,2*a));return g(d),d}function C(e,a,n){return new o(e=0;--a)s=(i=1e7*s+e[a])-(n=h(i/t))*t,p[a]=0|n;return[p,0|s]}function E(e,a){var n,s=Z(a);if(r)return[new d(e.value/s.value),new d(e.value%s.value)];var i,y=e.value,f=s.value;if(0===f)throw new Error("Cannot divide by zero");if(e.isSmall)return s.isSmall?[new m(h(y/f)),new m(y%f)]:[p[0],e];if(s.isSmall){if(1===f)return[e,p[0]];if(-1==f)return[e.negate(),p[0]];var _=Math.abs(f);if(_=0;s--){for(n=c-1,_[s+y]!==h&&(n=Math.floor((_[s+y]*c+_[s+y-1])/h)),i=0,r=0,o=v.length,p=0;pm&&(i=(i+1)*c),n=Math.ceil(i/r);do{if(R(p=S(a,n),y)<=0)break;n--}while(n);d.push(n),y=b(y,p)}return d.reverse(),[l(d),l(y)]}(y,f),i=n[0];var P=e.sign!==s.sign,k=n[1],I=e.sign;return"number"==typeof i?(P&&(i=-i),i=new m(i)):i=new o(i,P),"number"==typeof k?(I&&(k=-k),k=new m(k)):k=new o(k,I),[i,k]}function R(e,t){if(e.length!==t.length)return e.length>t.length?1:-1;for(var a=e.length-1;a>=0;a--)if(e[a]!==t[a])return e[a]>t[a]?1:-1;return 0}function T(e){var t=e.abs();return!t.isUnit()&&(!!(t.equals(2)||t.equals(3)||t.equals(5))||!(t.isEven()||t.isDivisibleBy(3)||t.isDivisibleBy(5))&&(!!t.lesser(49)||void 0))}function V(e,t){for(var a,n,i,r=e.prev(),p=r,o=0;p.isEven();)p=p.divide(2),o++;e:for(n=0;n=0?n=b(e,t):(n=b(t,e),a=!a),"number"==typeof(n=l(n))?(a&&(n=-n),new m(n)):new o(n,a)}(a,n,this.sign)},o.prototype.minus=o.prototype.subtract,m.prototype.subtract=function(e){var t=Z(e),a=this.value;if(a<0!==t.sign)return this.add(t.negate());var n=t.value;return t.isSmall?new m(a-n):w(n,Math.abs(a),a>=0)},m.prototype.minus=m.prototype.subtract,d.prototype.subtract=function(e){return new d(this.value-Z(e).value)},d.prototype.minus=d.prototype.subtract,o.prototype.negate=function(){return new o(this.value,!this.sign)},m.prototype.negate=function(){var e=this.sign,t=new m(-this.value);return t.sign=!e,t},d.prototype.negate=function(){return new d(-this.value)},o.prototype.abs=function(){return new o(this.value,!1)},m.prototype.abs=function(){return new m(Math.abs(this.value))},d.prototype.abs=function(){return new d(this.value>=0?this.value:-this.value)},o.prototype.multiply=function(e){var a,n,s,i=Z(e),r=this.value,m=i.value,d=this.sign!==i.sign;if(i.isSmall){if(0===m)return p[0];if(1===m)return this;if(-1===m)return this.negate();if((a=Math.abs(m))0?I(r,m):P(r,m),d)},o.prototype.times=o.prototype.multiply,m.prototype._multiplyBySmall=function(e){return y(e.value*this.value)?new m(e.value*this.value):C(Math.abs(e.value),c(Math.abs(this.value)),this.sign!==e.sign)},o.prototype._multiplyBySmall=function(e){return 0===e.value?p[0]:1===e.value?this:-1===e.value?this.negate():C(Math.abs(e.value),this.value,this.sign!==e.sign)},m.prototype.multiply=function(e){return Z(e)._multiplyBySmall(this)},m.prototype.times=m.prototype.multiply,d.prototype.multiply=function(e){return new d(this.value*Z(e).value)},d.prototype.times=d.prototype.multiply,o.prototype.square=function(){return new o(A(this.value),!1)},m.prototype.square=function(){var e=this.value*this.value;return y(e)?new m(e):new o(A(c(Math.abs(this.value))),!1)},d.prototype.square=function(e){return new d(this.value*this.value)},o.prototype.divmod=function(e){var t=E(this,e);return{quotient:t[0],remainder:t[1]}},d.prototype.divmod=m.prototype.divmod=o.prototype.divmod,o.prototype.divide=function(e){return E(this,e)[0]},d.prototype.over=d.prototype.divide=function(e){return new d(this.value/Z(e).value)},m.prototype.over=m.prototype.divide=o.prototype.over=o.prototype.divide,o.prototype.mod=function(e){return E(this,e)[1]},d.prototype.mod=d.prototype.remainder=function(e){return new d(this.value%Z(e).value)},m.prototype.remainder=m.prototype.mod=o.prototype.remainder=o.prototype.mod,o.prototype.pow=function(e){var t,a,n,s=Z(e),i=this.value,r=s.value;if(0===r)return p[1];if(0===i)return p[0];if(1===i)return p[1];if(-1===i)return s.isEven()?p[1]:p[-1];if(s.sign)return p[0];if(!s.isSmall)throw new Error("The exponent "+s.toString()+" is too large.");if(this.isSmall&&y(t=Math.pow(i,r)))return new m(h(t));for(a=this,n=p[1];!0&r&&(n=n.times(a),--r),0!==r;)r/=2,a=a.square();return n},m.prototype.pow=o.prototype.pow,d.prototype.pow=function(e){var t=Z(e),a=this.value,n=t.value,s=BigInt(0),i=BigInt(1),r=BigInt(2);if(n===s)return p[1];if(a===s)return p[0];if(a===i)return p[1];if(a===BigInt(-1))return t.isEven()?p[1]:p[-1];if(t.isNegative())return new d(s);for(var o=this,m=p[1];(n&i)===i&&(m=m.times(o),--n),n!==s;)n/=r,o=o.square();return m},o.prototype.modPow=function(e,t){if(e=Z(e),(t=Z(t)).isZero())throw new Error("Cannot take modPow with modulus 0");var a=p[1],n=this.mod(t);for(e.isNegative()&&(e=e.multiply(p[-1]),n=n.modInv(t));e.isPositive();){if(n.isZero())return p[0];e.isOdd()&&(a=a.multiply(n).mod(t)),e=e.divide(2),n=n.square().mod(t)}return a},d.prototype.modPow=m.prototype.modPow=o.prototype.modPow,o.prototype.compareAbs=function(e){var t=Z(e),a=this.value,n=t.value;return t.isSmall?1:R(a,n)},m.prototype.compareAbs=function(e){var t=Z(e),a=Math.abs(this.value),n=t.value;return t.isSmall?a===(n=Math.abs(n))?0:a>n?1:-1:-1},d.prototype.compareAbs=function(e){var t=this.value,a=Z(e).value;return(t=t>=0?t:-t)===(a=a>=0?a:-a)?0:t>a?1:-1},o.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=Z(e),a=this.value,n=t.value;return this.sign!==t.sign?t.sign?1:-1:t.isSmall?this.sign?-1:1:R(a,n)*(this.sign?-1:1)},o.prototype.compareTo=o.prototype.compare,m.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=Z(e),a=this.value,n=t.value;return t.isSmall?a==n?0:a>n?1:-1:a<0!==t.sign?a<0?-1:1:a<0?1:-1},m.prototype.compareTo=m.prototype.compare,d.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=this.value,a=Z(e).value;return t===a?0:t>a?1:-1},d.prototype.compareTo=d.prototype.compare,o.prototype.equals=function(e){return 0===this.compare(e)},d.prototype.eq=d.prototype.equals=m.prototype.eq=m.prototype.equals=o.prototype.eq=o.prototype.equals,o.prototype.notEquals=function(e){return 0!==this.compare(e)},d.prototype.neq=d.prototype.notEquals=m.prototype.neq=m.prototype.notEquals=o.prototype.neq=o.prototype.notEquals,o.prototype.greater=function(e){return this.compare(e)>0},d.prototype.gt=d.prototype.greater=m.prototype.gt=m.prototype.greater=o.prototype.gt=o.prototype.greater,o.prototype.lesser=function(e){return this.compare(e)<0},d.prototype.lt=d.prototype.lesser=m.prototype.lt=m.prototype.lesser=o.prototype.lt=o.prototype.lesser,o.prototype.greaterOrEquals=function(e){return this.compare(e)>=0},d.prototype.geq=d.prototype.greaterOrEquals=m.prototype.geq=m.prototype.greaterOrEquals=o.prototype.geq=o.prototype.greaterOrEquals,o.prototype.lesserOrEquals=function(e){return this.compare(e)<=0},d.prototype.leq=d.prototype.lesserOrEquals=m.prototype.leq=m.prototype.lesserOrEquals=o.prototype.leq=o.prototype.lesserOrEquals,o.prototype.isEven=function(){return 0==(1&this.value[0])},m.prototype.isEven=function(){return 0==(1&this.value)},d.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)},o.prototype.isOdd=function(){return 1==(1&this.value[0])},m.prototype.isOdd=function(){return 1==(1&this.value)},d.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)},o.prototype.isPositive=function(){return!this.sign},m.prototype.isPositive=function(){return this.value>0},d.prototype.isPositive=m.prototype.isPositive,o.prototype.isNegative=function(){return this.sign},m.prototype.isNegative=function(){return this.value<0},d.prototype.isNegative=m.prototype.isNegative,o.prototype.isUnit=function(){return!1},m.prototype.isUnit=function(){return 1===Math.abs(this.value)},d.prototype.isUnit=function(){return this.abs().value===BigInt(1)},o.prototype.isZero=function(){return!1},m.prototype.isZero=function(){return 0===this.value},d.prototype.isZero=function(){return this.value===BigInt(0)},o.prototype.isDivisibleBy=function(e){var t=Z(e);return!t.isZero()&&(!!t.isUnit()||(0===t.compareAbs(2)?this.isEven():this.mod(t).isZero()))},d.prototype.isDivisibleBy=m.prototype.isDivisibleBy=o.prototype.isDivisibleBy,o.prototype.isPrime=function(t){var a=T(this);if(a!==e)return a;var n=this.abs(),i=n.bitLength();if(i<=64)return V(n,[2,3,5,7,11,13,17,19,23,29,31,37]);for(var r=Math.log(2)*i.toJSNumber(),p=Math.ceil(!0===t?2*Math.pow(r,2):r),o=[],m=0;m-a?new m(e-1):new o(n,!0)},d.prototype.prev=function(){return new d(this.value-BigInt(1))};for(var D=[1];2*D[D.length-1]<=t;)D.push(2*D[D.length-1]);var U=D.length,B=D[U-1];function x(e){return Math.abs(e)<=t}function F(e,t,a){t=Z(t);for(var n=e.isNegative(),i=t.isNegative(),r=n?e.not():e,p=i?t.not():t,o=0,m=0,d=null,y=null,c=[];!r.isZero()||!p.isZero();)o=(d=E(r,B))[1].toJSNumber(),n&&(o=B-1-o),m=(y=E(p,B))[1].toJSNumber(),i&&(m=B-1-m),r=d[0],p=y[0],c.push(a(o,m));for(var l=0!==a(n?1:0,i?1:0)?s(-1):s(0),g=c.length-1;g>=0;g-=1)l=l.multiply(B).add(s(c[g]));return l}o.prototype.shiftLeft=function(e){var t=Z(e).toJSNumber();if(!x(t))throw new Error(String(t)+" is too large for shifting.");if(t<0)return this.shiftRight(-t);var a=this;if(a.isZero())return a;for(;t>=U;)a=a.multiply(B),t-=U-1;return a.multiply(D[t])},d.prototype.shiftLeft=m.prototype.shiftLeft=o.prototype.shiftLeft,o.prototype.shiftRight=function(e){var t,a=Z(e).toJSNumber();if(!x(a))throw new Error(String(a)+" is too large for shifting.");if(a<0)return this.shiftLeft(-a);for(var n=this;a>=U;){if(n.isZero()||n.isNegative()&&n.isUnit())return n;n=(t=E(n,B))[1].isNegative()?t[0].prev():t[0],a-=U-1}return(t=E(n,D[a]))[1].isNegative()?t[0].prev():t[0]},d.prototype.shiftRight=m.prototype.shiftRight=o.prototype.shiftRight,o.prototype.not=function(){return this.negate().prev()},d.prototype.not=m.prototype.not=o.prototype.not,o.prototype.and=function(e){return F(this,e,(function(e,t){return e&t}))},d.prototype.and=m.prototype.and=o.prototype.and,o.prototype.or=function(e){return F(this,e,(function(e,t){return e|t}))},d.prototype.or=m.prototype.or=o.prototype.or,o.prototype.xor=function(e){return F(this,e,(function(e,t){return e^t}))},d.prototype.xor=m.prototype.xor=o.prototype.xor;var L=1<<30;function N(e){var a=e.value,n="number"==typeof a?a|L:"bigint"==typeof a?a|BigInt(L):a[0]+a[1]*t|1073758208;return n&-n}function O(e,t){if(t.compareTo(e)<=0){var a=O(e,t.square(t)),n=a.p,i=a.e,r=n.multiply(t);return r.compareTo(e)<=0?{p:r,e:2*i+1}:{p:n,e:2*i}}return{p:s(1),e:0}}function q(e,t){return e=Z(e),t=Z(t),e.greater(t)?e:t}function G(e,t){return e=Z(e),t=Z(t),e.lesser(t)?e:t}function K(e,t){if(e=Z(e).abs(),t=Z(t).abs(),e.equals(t))return e;if(e.isZero())return t;if(t.isZero())return e;for(var a,n,s=p[1];e.isEven()&&t.isEven();)a=G(N(e),N(t)),e=e.divide(a),t=t.divide(a),s=s.multiply(a);for(;e.isEven();)e=e.divide(N(e));do{for(;t.isEven();)t=t.divide(N(t));e.greater(t)&&(n=t,t=e,e=n),t=t.subtract(e)}while(!t.isZero());return s.isUnit()?e:e.multiply(s)}o.prototype.bitLength=function(){var e=this;return e.compareTo(s(0))<0&&(e=e.negate().subtract(s(1))),0===e.compareTo(s(0))?s(0):s(O(e,s(2)).e).add(s(1))},d.prototype.bitLength=m.prototype.bitLength=o.prototype.bitLength;var z=function(e,t,a,n){a=a||i,e=String(e),n||(e=e.toLowerCase(),a=a.toLowerCase());var s,r=e.length,p=Math.abs(t),o={};for(s=0;s=p){if("1"===y&&1===p)continue;throw new Error(y+" is not a valid digit in base "+t+".")}t=Z(t);var m=[],d="-"===e[0];for(s=d?1:0;s"!==e[s]&&s=0;n--)s=s.add(e[n].times(i)),i=i.times(t);return a?s.negate():s}function H(e,t){if((t=s(t)).isZero()){if(e.isZero())return{value:[0],isNegative:!1};throw new Error("Cannot convert nonzero numbers to base 0.")}if(t.equals(-1)){if(e.isZero())return{value:[0],isNegative:!1};if(e.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-e.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:!1};var a=Array.apply(null,Array(e.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);return a.unshift([1]),{value:[].concat.apply([],a),isNegative:!1}}var n=!1;if(e.isNegative()&&t.isPositive()&&(n=!0,e=e.abs()),t.isUnit())return e.isZero()?{value:[0],isNegative:!1}:{value:Array.apply(null,Array(e.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:n};for(var i,r=[],p=e;p.isNegative()||p.compareAbs(t)>=0;){i=p.divmod(t),p=i.quotient;var o=i.remainder;o.isNegative()&&(o=t.minus(o).abs(),p=p.next()),r.push(o.toJSNumber())}return r.push(p.toJSNumber()),{value:r.reverse(),isNegative:n}}function W(e,t,a){var n=H(e,t);return(n.isNegative?"-":"")+n.value.map((function(e){return function(e,t){return e<(t=t||i).length?t[e]:"<"+e+">"}(e,a)})).join("")}function J(e){if(y(+e)){var t=+e;if(t===h(t))return r?new d(BigInt(t)):new m(t);throw new Error("Invalid integer: "+e)}var a="-"===e[0];a&&(e=e.slice(1));var n=e.split(/e/i);if(n.length>2)throw new Error("Invalid integer: "+n.join("e"));if(2===n.length){var s=n[1];if("+"===s[0]&&(s=s.slice(1)),(s=+s)!==h(s)||!y(s))throw new Error("Invalid integer: "+s+" is not a valid exponent.");var i=n[0],p=i.indexOf(".");if(p>=0&&(s-=i.length-p-1,i=i.slice(0,p)+i.slice(p+1)),s<0)throw new Error("Cannot include negative exponent part for integers");e=i+=new Array(s+1).join("0")}if(!/^([0-9][0-9]*)$/.test(e))throw new Error("Invalid integer: "+e);if(r)return new d(BigInt(a?"-"+e:e));for(var c=[],l=e.length,u=l-7;l>0;)c.push(+e.slice(u,l)),(u-=7)<0&&(u=0),l-=7;return g(c),new o(c,a)}function Z(e){return"number"==typeof e?function(e){if(r)return new d(BigInt(e));if(y(e)){if(e!==h(e))throw new Error(e+" is not an integer.");return new m(e)}return J(e.toString())}(e):"string"==typeof e?J(e):"bigint"==typeof e?new d(e):e}o.prototype.toArray=function(e){return H(this,e)},m.prototype.toArray=function(e){return H(this,e)},d.prototype.toArray=function(e){return H(this,e)},o.prototype.toString=function(t,a){if(t===e&&(t=10),10!==t)return W(this,t,a);for(var n,s=this.value,i=s.length,r=String(s[--i]);--i>=0;)n=String(s[i]),r+="0000000".slice(n.length)+n;return(this.sign?"-":"")+r},m.prototype.toString=function(t,a){return t===e&&(t=10),10!=t?W(this,t,a):String(this.value)},d.prototype.toString=m.prototype.toString,d.prototype.toJSON=o.prototype.toJSON=m.prototype.toJSON=function(){return this.toString()},o.prototype.valueOf=function(){return parseInt(this.toString(),10)},o.prototype.toJSNumber=o.prototype.valueOf,m.prototype.valueOf=function(){return this.value},m.prototype.toJSNumber=m.prototype.valueOf,d.prototype.valueOf=d.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};for(var Q=0;Q<1e3;Q++)p[Q]=Z(Q),Q>0&&(p[-Q]=Z(-Q));return p.one=p[1],p.zero=p[0],p.minusOne=p[-1],p.max=q,p.min=G,p.gcd=K,p.lcm=function(e,t){return e=Z(e).abs(),t=Z(t).abs(),e.divide(K(e,t)).multiply(t)},p.isInstance=function(e){return e instanceof o||e instanceof m||e instanceof d},p.randBetween=function(e,a,n){e=Z(e),a=Z(a);var s=n||Math.random,i=G(e,a),r=q(e,a).subtract(i).add(1);if(r.isSmall)return i.add(Math.floor(s()*r));for(var o=H(r,t).value,m=[],d=!0,y=0;y{let s=65535&e|0,i=e>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{s=s+t[n++]|0,i=i+s|0}while(--r);s%=65521,i%=65521}return s|i<<16|0};const a=new Uint32Array((()=>{let e,t=[];for(var a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t})());var n=(e,t,n,s)=>{const i=a,r=s+n;e^=-1;for(let a=s;a>>8^i[255&(e^t[a])];return-1^e},s=function(e,t){let a,n,s,i,r,p,o,m,d,y,c,l,g,u,h,f,_,v,b,w,P,S,k,I;const C=e.state;a=e.next_in,k=e.input,n=a+(e.avail_in-5),s=e.next_out,I=e.output,i=s-(t-e.avail_out),r=s+(e.avail_out-257),p=C.dmax,o=C.wsize,m=C.whave,d=C.wnext,y=C.window,c=C.hold,l=C.bits,g=C.lencode,u=C.distcode,h=(1<>>24,c>>>=v,l-=v,v=_>>>16&255,0===v)I[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(c&(1<>>=v,l-=v),l<15&&(c+=k[a++]<>>24,c>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=u[(65535&_)+(c&(1<p){e.msg="invalid distance too far back",C.mode=30;break e}if(c>>>=v,l-=v,v=s-i,w>v){if(v=w-v,v>m&&C.sane){e.msg="invalid distance too far back",C.mode=30;break e}if(P=0,S=y,0===d){if(P+=o-v,v2;)I[s++]=S[P++],I[s++]=S[P++],I[s++]=S[P++],b-=3;b&&(I[s++]=S[P++],b>1&&(I[s++]=S[P++]))}else{P=s-w;do{I[s++]=I[P++],I[s++]=I[P++],I[s++]=I[P++],b-=3}while(b>2);b&&(I[s++]=I[P++],b>1&&(I[s++]=I[P++]))}break}}break}}while(a>3,a-=b,l-=b<<3,c&=(1<{const c=y.bits;let l,g,u,h,f,_,v=0,b=0,w=0,P=0,S=0,k=0,I=0,C=0,A=0,M=0,E=null,R=0;const T=new Uint16Array(16),V=new Uint16Array(16);let D,U,B,x=null,F=0;for(v=0;v<=15;v++)T[v]=0;for(b=0;b=1&&0===T[P];P--);if(S>P&&(S=P),0===P)return s[m++]=20971520,s[m++]=20971520,y.bits=1,0;for(w=1;w0&&(0===e||1!==P))return-1;for(V[1]=0,v=1;v<15;v++)V[v+1]=V[v]+T[v];for(b=0;b852||2===e&&A>592)return 1;for(;;){D=v-I,d[b]<_?(U=0,B=d[b]):d[b]>_?(U=x[F+d[b]],B=E[R+d[b]]):(U=96,B=0),l=1<>I)+g]=D<<24|U<<16|B|0}while(0!==g);for(l=1<>=1;if(0!==l?(M&=l-1,M+=l):M=0,b++,0==--T[v]){if(v===P)break;v=t[a+d[b]]}if(v>S&&(M&h)!==u){for(0===I&&(I=S),f+=w,k=v-I,C=1<852||2===e&&A>592)return 1;u=M&h,s[u]=S<<24|k<<16|f-m|0}}return 0!==M&&(s[f+M]=v-I<<24|64<<16|0),y.bits=S,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:y,Z_BLOCK:c,Z_TREES:l,Z_OK:g,Z_STREAM_END:u,Z_NEED_DICT:h,Z_STREAM_ERROR:f,Z_DATA_ERROR:_,Z_MEM_ERROR:v,Z_BUF_ERROR:b,Z_DEFLATED:w}=d,P=12,S=30,k=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function I(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const C=e=>{if(!e||!e.state)return f;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,g},A=e=>{if(!e||!e.state)return f;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,C(e)},M=(e,t)=>{let a;if(!e||!e.state)return f;const n=e.state;return t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,A(e))},E=(e,t)=>{if(!e)return f;const a=new I;e.state=a,a.window=null;const n=M(e,t);return n!==g&&(e.state=null),n};let R,T,V=!0;const D=e=>{if(V){R=new Int32Array(512),T=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(m(1,e.lens,0,288,R,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;m(2,e.lens,0,32,T,0,e.work,{bits:5}),V=!1}e.lencode=R,e.lenbits=9,e.distcode=T,e.distbits=5},U=(e,t,a,n)=>{let s;const i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(t.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(s=i.wsize-i.wnext,s>n&&(s=n),i.window.set(t.subarray(a-n,a-n+s),i.wnext),(n-=s)?(i.window.set(t.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave{let i,r,p,o,d,I,C,A,M,E,R,T,V,B,x,F,L,N,O,q,G,K,z=0;const j=new Uint8Array(4);let H,W;const J=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return f;i=e.state,i.mode===P&&(i.mode=13),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,I=e.avail_in,A=i.hold,M=i.bits,E=I,R=C,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0),A=0,M=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&A)<<8)+(A>>8))%31){e.msg="incorrect header check",i.mode=S;break}if((15&A)!==w){e.msg="unknown compression method",i.mode=S;break}if(A>>>=4,M-=4,G=8+(15&A),0===i.wbits)i.wbits=G;else if(G>i.wbits){e.msg="invalid window size",i.mode=S;break}i.dmax=1<>8&1),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===I)break e;I--,A+=r[o++]<>>8&255,j[2]=A>>>16&255,j[3]=A>>>24&255,i.check=n(i.check,j,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>8),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(T=i.length,T>I&&(T=I),T&&(i.head&&(G=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(r.subarray(o,o+T),G)),512&i.flags&&(i.check=n(i.check,r,T,o)),I-=T,o+=T,i.length-=T),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===I)break e;T=0;do{G=r[o+T++],i.head&&G&&i.length<65536&&(i.head.name+=String.fromCharCode(G))}while(G&&T>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=P;break;case 10:for(;M<32;){if(0===I)break e;I--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===I)break e;I--,A+=r[o++]<>>=1,M-=1,3&A){case 0:i.mode=14;break;case 1:if(D(i),i.mode=20,a===l){A>>>=2,M-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=S}A>>>=2,M-=2;break;case 14:for(A>>>=7&M,M-=7&M;M<32;){if(0===I)break e;I--,A+=r[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=S;break}if(i.length=65535&A,A=0,M=0,i.mode=15,a===l)break e;case 15:i.mode=16;case 16:if(T=i.length,T){if(T>I&&(T=I),T>C&&(T=C),0===T)break e;p.set(r.subarray(o,o+T),d),I-=T,o+=T,C-=T,d+=T,i.length-=T;break}i.mode=P;break;case 17:for(;M<14;){if(0===I)break e;I--,A+=r[o++]<>>=5,M-=5,i.ndist=1+(31&A),A>>>=5,M-=5,i.ncode=4+(15&A),A>>>=4,M-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=S;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,M-=3}for(;i.have<19;)i.lens[J[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,H={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid code lengths set",i.mode=S;break}i.have=0,i.mode=19;case 19:for(;i.have>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===I)break e;I--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(W=x+2;M>>=x,M-=x,0===i.have){e.msg="invalid bit length repeat",i.mode=S;break}G=i.lens[i.have-1],T=3+(3&A),A>>>=2,M-=2}else if(17===L){for(W=x+3;M>>=x,M-=x,G=0,T=3+(7&A),A>>>=3,M-=3}else{for(W=x+7;M>>=x,M-=x,G=0,T=11+(127&A),A>>>=7,M-=7}if(i.have+T>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=S;break}for(;T--;)i.lens[i.have++]=G}}if(i.mode===S)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=S;break}if(i.lenbits=9,H={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,H={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,H),i.distbits=H.bits,K){e.msg="invalid distances set",i.mode=S;break}if(i.mode=20,a===l)break e;case 20:i.mode=21;case 21:if(I>=6&&C>=258){e.next_out=d,e.avail_out=C,e.next_in=o,e.avail_in=I,i.hold=A,i.bits=M,s(e,R),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,I=e.avail_in,A=i.hold,M=i.bits,i.mode===P&&(i.back=-1);break}for(i.back=0;z=i.lencode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===I)break e;I--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===I)break e;I--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,i.length=L,0===F){i.mode=26;break}if(32&F){i.back=-1,i.mode=P;break}if(64&F){e.msg="invalid literal/length code",i.mode=S;break}i.extra=15&F,i.mode=22;case 22:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;z=i.distcode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===I)break e;I--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===I)break e;I--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,64&F){e.msg="invalid distance code",i.mode=S;break}i.offset=L,i.extra=15&F,i.mode=24;case 24:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=S;break}i.mode=25;case 25:if(0===C)break e;if(T=R-C,i.offset>T){if(T=i.offset-T,T>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=S;break}T>i.wnext?(T-=i.wnext,V=i.wsize-T):V=i.wnext-T,T>i.length&&(T=i.length),B=i.window}else B=p,V=d-i.offset,T=i.length;T>C&&(T=C),C-=T,i.length-=T;do{p[d++]=B[V++]}while(--T);0===i.length&&(i.mode=21);break;case 26:if(0===C)break e;p[d++]=i.length,C--,i.mode=21;break;case 27:if(i.wrap){for(;M<32;){if(0===I)break e;I--,A|=r[o++]<{if(!e||!e.state)return f;let t=e.state;return t.window&&(t.window=null),e.state=null,g},N=(e,t)=>{if(!e||!e.state)return f;const a=e.state;return 0==(2&a.wrap)?f:(a.head=t,t.done=!1,g)},O=(e,a)=>{const n=a.length;let s,i,r;return e&&e.state?(s=e.state,0!==s.wrap&&11!==s.mode?f:11===s.mode&&(i=1,i=t(i,a,n,0),i!==s.check)?_:(r=U(e,a,n,n),r?(s.mode=31,v):(s.havedict=1,g))):f};const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let G=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){G=!1}const K=new Uint8Array(256);for(let e=0;e<256;e++)K[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;K[254]=K[254]=1;var z=(e,t)=>{const a=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,s;const i=new Array(2*a);for(s=0,n=0;n4)i[s++]=65533,n+=r-1;else{for(t&=2===r?31:3===r?15:7;r>1&&n1?i[s++]=65533:t<65536?i[s++]=t:(t-=65536,i[s++]=55296|t>>10&1023,i[s++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&G)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let a="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let a=t-1;for(;a>=0&&128==(192&e[a]);)a--;return a<0||0===a?t:a+K[e[a]]>t?a:t},H={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},W=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},J=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Z=Object.prototype.toString,{Z_NO_FLUSH:Q,Z_FINISH:X,Z_OK:$,Z_STREAM_END:Y,Z_NEED_DICT:ee,Z_STREAM_ERROR:te,Z_DATA_ERROR:ae,Z_MEM_ERROR:ne}=d;function se(e){this.options=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const t in a)q(a,t)&&(e[t]=a[t])}}return e}({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new W,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==$)throw new Error(H[a]);if(this.header=new J,N(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=(e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,a,n,s,i,r=e.length,p=0;for(s=0;s>>6,t[i++]=128|63&a):a<65536?(t[i++]=224|a>>>12,t[i++]=128|a>>>6&63,t[i++]=128|63&a):(t[i++]=240|a>>>18,t[i++]=128|a>>>12&63,t[i++]=128|a>>>6&63,t[i++]=128|63&a);return t})(t.dictionary):"[object ArrayBuffer]"===Z.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(a=O(this.strm,t.dictionary),a!==$)))throw new Error(H[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||H[a.err];return a.result}se.prototype.push=function(e,t){const a=this.strm,n=this.options.chunkSize,s=this.options.dictionary;let i,r,p;if(this.ended)return!1;for(r=t===~~t?t:!0===t?X:Q,"[object ArrayBuffer]"===Z.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=F(a,r),i===ee&&s&&(i=O(a,s),i===$?i=F(a,r):i===ae&&(i=ee));a.avail_in>0&&i===Y&&a.state.wrap>0&&0!==e[a.next_in];)B(a),i=F(a,r);switch(i){case te:case ae:case ee:case ne:return this.onEnd(i),this.ended=!0,!1}if(p=a.avail_out,a.next_out&&(0===a.avail_out||i===Y))if("string"===this.options.to){let e=j(a.output,a.next_out),t=a.next_out-e,s=z(a.output,e);a.next_out=t,a.avail_out=n-t,t&&a.output.set(a.output.subarray(e,e+t),0),this.onData(s)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==$||0!==p){if(i===Y)return i=L(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},se.prototype.onData=function(e){this.chunks.push(e)},se.prototype.onEnd=function(e){e===$&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(e=>{let t=0;for(let a=0,n=e.length;a{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var n={};(()=>{"use strict";function e(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),a=new Uint8Array(t);let n=0;return e.forEach((e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length})),a}function t(e){const t=e.length,a=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(a[n++]=parseInt(e.charAt(0),16));for(let s=n;sjt}),Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return s(this)},set:function(e){this.set(t(e))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...t){return e(this,...t)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(e){let t=this.findIndex(e);return-1!==t?this.splice(t,1)[0]:void 0},String.prototype.toHHMMSS=function(e=!1){const t=parseInt(this+"",10),a=Math.floor(t/3600);let n=Math.floor((t-3600*a)/60),s=t-3600*a-60*n;return a&&(e=!0),n<10&&(n=e?"0"+n:n),s<10&&(s="0"+s),(a?a+":":"")+n+":"+s},Promise.prototype.finally=Promise.prototype.finally||function(e){const t=t=>Promise.resolve(e()).then(t);return this.then((e=>t((()=>e))),(e=>t((()=>Promise.reject(e)))))},Promise.prototype.safeFinally=function(e){return this.catch((()=>{})).finally(e)};const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};i.http=location.search.indexOf("http=1")>0,i.http&&(i.transport="https");const r=i,p=r.debug,o="undefined"!=typeof window?window:self,m=p,d="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,y="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!d,c=y||d,l=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((a=>{a.length&&a.slice(e?0:-1).forEach((e=>{e.postMessage(...t)}))}))},g=(...e)=>{self.postMessage(...e)},u=()=>{},h=d?l.bind(null,!1):y?g:u,f=d?l.bind(null,!0):y?g:u;class _{constructor(){this.prefix="",this.cache={},this.useStorage=!0,r.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const a in e)if(e.hasOwnProperty(a)){const n=e[a];if(this.cache[a]=n,this.useStorage&&!t)try{const e=JSON.stringify(n);localStorage.setItem(this.prefix+a,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class v{constructor(){this.taskId=0,this.tasks={},v.STORAGES.push(this),c||(this.storage=new _)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise(((a,n)=>{if(c){const n=this.taskId++;this.tasks[n]=a,h({type:"localStorageProxy",id:n,payload:{type:e,args:t}})}else t=Array.prototype.slice.call(t),a(this.storage[e].apply(this.storage,t))}))}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}v.STORAGES=[];const b=new v;o.appStorage=b;const w=b,P={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-1460809483,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-818518751,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-516145888,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:1370914559,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"string"}],type:"MessagePeerReaction"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:-396644838,method:"messages.getUnreadReactions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-2099097129,method:"messages.readReactions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"}]},layer:138};function S(e){return"object"==typeof e&&null!==e}var k=a(745),I=a.n(k);function C(e,t){return I().inflate(e,t?{to:"string"}:void 0)}var A=a(736),M=a.n(A);function E(e){return e>>>0}function R(e,t){return e=E(e),t=E(t),M()(e).shiftLeft(32).add(M()(t)).toString(10)}const T=+P.API.constructors.find((e=>"boolFalse"===e.predicate)).id,V=+P.API.constructors.find((e=>"boolTrue"===e.predicate)).id,D=+P.API.constructors.find((e=>"vector"===e.predicate)).id,U=+P.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id;class B{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(V,(t||"")+":bool"):this.writeInt(T,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);"string"!=typeof e&&(e=e?e.toString():"0");const{quotient:a,remainder:n}=M()(e).divmod(4294967296),s=a.toJSNumber(),i=n.toJSNumber();this.writeInt(i,(t||"")+":long[low]"),this.writeInt(s,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),n=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(n[0],(t||"")+":double[low]"),this.writeInt(n[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const n=a.length;n<=253?this.byteView[this.offset++]=n:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&n,this.byteView[this.offset++]=(65280&n)>>8,this.byteView[this.offset++]=(16711680&n)>>16);for(let e=0;e>>",s(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const n=e.length;if(t%32||8*n!==t){const s=new Error("Invalid bits: "+t+", "+n);throw console.error(s,e,a),s}this.debug&&console.log(">>>",s(e),(a||"")+":int"+t),this.checkLength(n),this.byteView.set(e,this.offset),this.offset+=n}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",s(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?P.MTProto:P.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const n=t.pFlags||t,s={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),s=e[0].split(".");if(!(t[s[0]]&1<<+s[1])){if(!("true"===e[1]?n[i.name]:void 0!==t[i.name]))continue;t[s[0]]|=1<<+s[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,s[i.name]=r)}for(let e in s)this.intView[s[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(D,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const n=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===s));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+s+" found");s===t&&(i=!0),i||this.writeInt(r.id,a+"["+s+"][id]");const p=e.pFlags,o={};for(const t of r.params){let n=t.type;if(-1!==n.indexOf("?")){const a=n.split("?"),s=a[0].split(".");if(!(e[s[0]]&1<<+s[1])){if(!("true"===a[1]?p&&p[t.name]:void 0!==e[t.name]))continue;e[s[0]]|=1<<+s[1]}n=a[1]}const i=this.storeObject(e[t.name],n,a+"["+s+"]["+t.name+"]");"#"===n&&(e[t.name]=e[t.name]||0,o[t.name]=i)}for(let t in o)this.intView[o[t]]=e[t];return r.type}}class x{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),n=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),n[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=R(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===V||t!==T&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,n="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const n=new Array(e);for(let t=0;t0){const s=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!n)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===U){const a=C(this.fetchBytes(t+"[packed_string]"));return new x(a).fetchObject(e,t)}if(i===D)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e0&&p{const t=new Uint8Array(e.length);for(let a=0;a{const a=t.subtract(e);return!(a.isNegative()||a.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:v,a_for_hash:b,u:w}=yield(()=>K(this,void 0,void 0,(function*(){for(;;){const t=F(c(a.secure_random)),n=p.modPow(t,r);if(_(n,r)){const a=L(n),s=yield Ae.invokeCrypto("sha256",e(a,h)),i=M()(s.hex,16);if(!i.isZero()&&!i.isNegative())return{a:t,a_for_hash:a,u:i}}}})))();let P;P=l.greater(f)?l:l.add(r),P=P.subtract(f).mod(r);const S=w.multiply(m),k=v.add(S),I=P.modPow(k,r),C=yield Ae.invokeCrypto("sha256",d(L(I),256));let A=yield Ae.invokeCrypto("sha256",g);A=q(A,yield Ae.invokeCrypto("sha256",u));const E=e(A,yield Ae.invokeCrypto("sha256",i.salt1),yield Ae.invokeCrypto("sha256",i.salt2),b,h,C),R=yield Ae.invokeCrypto("sha256",E);return{_:"inputCheckPasswordSRP",srp_id:a.srp_id,A:new Uint8Array(b),M1:R}}))}var j=new Uint8Array(256),H=new Uint8Array(256),W=new Uint32Array(256),J=new Uint32Array(256),Z=new Uint32Array(256),Q=new Uint32Array(256),X=new Uint32Array(256),$=new Uint32Array(256),Y=new Uint32Array(256),ee=new Uint32Array(256);function te(e){if(e instanceof Uint32Array)return e;if("string"==typeof e){if(e.length%4!=0)for(var t=e.length%4;t<=4;t++)e+="\0x00";var a=new Uint32Array(e.length/4);for(t=0;t>7),r[i[m]^m]=m;for(;!j[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,j[p]=a,H[a]=p,s=16843009*i[t=i[e=i[p]]]^65537*t^257*e^16843008*p,n=257*i[a]^16843008*a,W[p]=n=n<<24^n>>>8,J[p]=n=n<<24^n>>>8,Z[p]=n=n<<24^n>>>8,Q[p]=n=n<<24^n>>>8,X[a]=s=s<<24^s>>>8,$[a]=s=s<<24^s>>>8,Y[a]=s=s<<24^s>>>8,ee[a]=s=s<<24^s>>>8,o=r[o]||1}();var ne=function(){function e(e){var t=te(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var a,n=1,s=t.length;s<4*t.length+28;s++)a=this.encKey[s-1],(s%t.length==0||8===t.length&&s%t.length==4)&&(a=j[a>>>24]<<24^j[a>>16&255]<<16^j[a>>8&255]<<8^j[255&a],s%t.length==0&&(a=a<<8^a>>>24^n<<24,n=n<<1^283*(n>>7))),this.encKey[s]=this.encKey[s-t.length]^a;for(var i=0;s;i++,s--)a=this.encKey[3&i?s:s-4],this.decKey[i]=s<=4||i<4?a:X[j[a>>>24]]^$[j[a>>16&255]]^Y[j[a>>8&255]]^ee[j[255&a]]}return e.prototype.encrypt=function(e){for(var t,a,n,s=te(e),i=new Uint32Array(4),r=s[0]^this.encKey[0],p=s[1]^this.encKey[1],o=s[2]^this.encKey[2],m=s[3]^this.encKey[3],d=this.encKey.length/4-2,y=4,c=0;c>>24]^J[p>>16&255]^Z[o>>8&255]^Q[255&m]^this.encKey[y],a=W[p>>>24]^J[o>>16&255]^Z[m>>8&255]^Q[255&r]^this.encKey[y+1],n=W[o>>>24]^J[m>>16&255]^Z[r>>8&255]^Q[255&p]^this.encKey[y+2],m=W[m>>>24]^J[r>>16&255]^Z[p>>8&255]^Q[255&o]^this.encKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[c]=j[r>>>24]<<24^j[p>>16&255]<<16^j[o>>8&255]<<8^j[255&m]^this.encKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e.prototype.decrypt=function(e){for(var t,a,n,s=te(e),i=new Uint32Array(4),r=s[0]^this.decKey[0],p=s[3]^this.decKey[1],o=s[2]^this.decKey[2],m=s[1]^this.decKey[3],d=this.decKey.length/4-2,y=4,c=0;c>>24]^$[p>>16&255]^Y[o>>8&255]^ee[255&m]^this.decKey[y],a=X[p>>>24]^$[o>>16&255]^Y[m>>8&255]^ee[255&r]^this.decKey[y+1],n=X[o>>>24]^$[m>>16&255]^Y[r>>8&255]^ee[255&p]^this.decKey[y+2],m=X[m>>>24]^$[r>>16&255]^Y[p>>8&255]^ee[255&o]^this.decKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[3&-c]=H[r>>>24]<<24^H[p>>16&255]<<16^H[o>>8&255]<<8^H[255&m]^this.decKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e}(),se=function(){function e(e,t,a){void 0===a&&(a=16),this.key=te(e),this.iv=te(t),this.cipher=new ne(e),this.blockSize=a/4}return e.prototype.encrypt=function(e,t){for(var a=te(e),n=t||new Uint32Array(a.length),s=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),r=new Uint32Array(this.blockSize),p=0;p=this.blockSize&&this.incrementCounter(),s&&(i-=s,s=0)}return this.offset=(this.offset+a.length%4)%4,n},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}();const ie=ne;function re(e){const t=new Uint8Array(e.byteLength);for(let a=0,n=4*e.length;a>>2]>>>24-a%4*8&255;return t}function pe(e){const t=G(e),a=[];for(let e=0,n=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}function oe(e,t,a,n=!0){return re(new se(pe(t),pe(a))[n?"encrypt":"decrypt"](pe(e)))}function me(e,t,a){return oe(O(e),t,a,!0)}function de(e,t,a){return oe(e,t,a,!1)}const ye="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function ce(e,t,a){return n=this,s=void 0,r=function*(){const n=yield ye.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return ye.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},n,512).then((e=>new Uint8Array(e)))},new((i=void 0)||(i=Promise))((function(e,t){function a(e){try{o(r.next(e))}catch(e){t(e)}}function p(e){try{o(r.throw(e))}catch(e){t(e)}}function o(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(a,p)}o((r=r.apply(n,s||[])).next())}));var n,s,i,r}function le(e,a){return N(e,t(a.exponent),t(a.modulus))}function ge(e){return ye.digest("SHA-1",G(e)).then((e=>new Uint8Array(e)))}function ue(e){return ye.digest("SHA-256",G(e)).then((e=>new Uint8Array(e)))}const he={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function fe(e){const t=he[e];return crypto.getRandomValues(t),t[0]}function _e(){return""+fe(32)+fe(32)%16777215}function ve(e,t){return M().randBetween(e,t,(()=>fe(32)/4294967295))}function be(e){const t=M()[2];if(e.remainder(t).isZero())return t;const a=M()(1e3);let n,s,i,r,p,o,m;do{n=ve(M().one,e.minus(1))}while(n.isZero()||n.eq(e.minus(t)));i=ve(M().one,e.minus(1)),p=M().one,o=M().one;const d=M()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),y=a=>((a=(a=a.pow(t).mod(e)).add(n)).lesser(n)&&(a=a.add(d)),a.mod(e));do{s=i;for(let e=0;M()(e).lesser(p);++e)i=y(i);let t=M().zero;do{r=i;const n=M().min(a,p.minus(t));for(let t=0;M()(t).lesser(n);++t)i=y(i),o=o.multiply(s.greater(i)?s.minus(i):i.minus(s)).mod(e);m=M().gcd(o,e),t=t.add(a)}while(t.lesser(p)&&m.eq(M().one));p=p.shiftLeft(M().one)}while(m.eq(M().one));if(m.eq(e))do{r=y(r),m=M().gcd(s.minus(r).abs(),e)}while(m.eq(M().one));return m}function we(e){let t=function(e){const t=F(e),a=[],n=[];let s=be(t);a.push(t.divide(s)),a.push(s);do{const e=a.pop();if(!e.eq(M().one))if(e.isPrime(!0)){n.push(e);for(let t=0;te.compare(t))),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce(((e,t)=>e.multiply(t)),M().one)]);const a=t[0],n=t[t.length-1];return(a.lesser(n)?[a,n]:[n,a]).map((e=>L(e)))}function Pe(e){return a=this,n=void 0,i=function*(){const{p:a,g:n}=e,s=(e=>{for(;;){const t=new Uint8Array(e.length).randomize(),a=F(t);if(!a.greater(M().one))continue;const n=F(e);if(a.lesser(n.subtract(M().one)))return t}})(a),i=t(n.toString(16)),r=O(yield Ae.invokeCrypto("mod-pow",i,s,a),256,!0,!0,!0);return{a:s,g_a:r,g_a_hash:yield Ae.invokeCrypto("sha256",r),p:a}},new((s=void 0)||(s=Promise))((function(e,t){function r(e){try{o(i.next(e))}catch(e){t(e)}}function p(e){try{o(i.throw(e))}catch(e){t(e)}}function o(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,p)}o((i=i.apply(a,n||[])).next())}));var a,n,s,i}function Se(e,t,a){return n=this,s=void 0,r=function*(){const n=yield Ae.invokeCrypto("mod-pow",e,t,a);return{key:n,key_fingerprint:F((yield Ae.invokeCrypto("sha1",n)).slice(-8).reverse()).toString(10)}},new((i=void 0)||(i=Promise))((function(e,t){function a(e){try{o(r.next(e))}catch(e){t(e)}}function p(e){try{o(r.throw(e))}catch(e){t(e)}}function o(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(a,p)}o((r=r.apply(n,s||[])).next())}));var n,s,i,r}function ke(e){const t=e.length,a=8*t;let n=M()(e[0]).and(127).shiftLeft(a-8);for(let s=1;s{e&&(this.timeOffset=e)}))}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|fe(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,R(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),n=Math.abs(this.timeOffset-a)>10;return w.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a,h({type:"applyServerTimeOffset",payload:a}),n}};o.timeManager=Me;const Ee=Me,Re="undefined"!=typeof window?window:self,Te=navigator?navigator.userAgent:null,Ve=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&Re.MSStream,!!("safari"in Re)||!(!Te||!(/\b(iPad|iPhone|iPod)\b/.test(Te)||Te.match("Safari")&&!Te.match("Chrome")))),De=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;var Ue;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),function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(Ue||(Ue={}));const Be=[Ue.None,Ue.Error,Ue.Warn,Ue.Log,Ue.Debug],xe=Date.now();function Fe(){return"["+((Date.now()-xe)/1e3).toFixed(3)+"]"}let Le;const Ne=Ve||De;Le=Ne?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const Oe=!Ne,qe=Ne?2:3;function Ge(){const e=(new Error).stack.split("\n"),t=e[qe]||e[e.length-1];return"["+(Le(t)||"")+"]"}const Ke="",ze="",je=[["debug",Ue.Debug],["info",Ue.Log],["warn",Ue.Warn],["error",Ue.Error],["assert",Ue.Error],["trace",Ue.Log]];function He(e,t=Ue.Log|Ue.Warn|Ue.Error,a=!1,n=""){let s;m||a||(t=Ue.Error),Oe?n||(d?n=Ke:y&&(n=ze)):n="";let i=n;n=n?`%s ${n}%s`:"%s";const r=function(...a){return t&Ue.Log&&console.log(n,Fe(),e,Ge(),...a)};return je.forEach((([a,s])=>{r[a]=function(...i){return t&s&&console[a](n,Fe(),e,Ge(),...i)}})),r.setPrefix=function(t){s=t,e="["+t+"]"},r.setPrefix(e),r.setLevel=function(e){t=Be.slice(0,e+1).reduce(((e,t)=>e|t),0)},r.bindPrefix=function(e){return He(`${s}] [${e}`,t,a,i)},r}const We="web.telegram.org",Je={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.0",versionFull:"1.4.0 (132)",build:132,langPackVersion:"0.4.0",langPack:"macos",langPackCode:"en",domains:[We],baseDcId:2,isMainDomain:location.hostname===We,suffix:"K"};Je.isMainDomain&&(Je.id=2496,Je.hash="8da85b0d5bfe62527e5b244c209159c3");const Ze=Je;function Qe(){}const Xe=e=>new Promise((t=>{setTimeout(t,e)}));function $e(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((a,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,a(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}}));return t.catch(Qe).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})})),Object.assign(t,e),t}class Ye{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,a){var n;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:a}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null==a?void 0:a.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,a){this.listeners[e]&&this.listeners[e].findAndSplice((e=>e.callback===t))}_dispatchEvent(e,t,...a){this.reuseResults&&(this.listenerResults[e]=a);const n=t&&[],s=this.listeners[e];return s&&s.slice().forEach((t=>{var i;if(-1===s.findIndex((e=>e.callback===t.callback)))return;let r;try{r=t.callback(...a)}catch(e){console.error(e)}n&&n.push(r),(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,t.callback)})),n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}function et(e,t){const a=e.indexOf(t),n=-1!==a&&e.splice(a,1);return n&&n[0]}class tt extends Ye{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.debug=r.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let n=Ue.Error|Ue.Log;return this.debug&&(n|=Ue.Debug),this.log=He(`WS-${e}`+a,n),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}var at,nt,st,it,rt=function(e,t,a,n,s){if("m"===n)throw new TypeError("Private method is not writable");if("a"===n&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===n?s.call(e,a):s?s.value=a:t.set(e,a),a},pt=function(e,t,a,n){if("a"===a&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?n:"a"===a?n.call(e):n?n.value:t.get(e)};class ot{constructor(e){this.counter=e}increment(){const e=this.counter;for(let t=15;t>=0;--t){if(255!==e[t]){++e[t];break}e[t]=0}}}class mt{constructor(e,t){at.set(this,void 0),nt.set(this,void 0),st.set(this,void 0),it.set(this,void 0),rt(this,at,new ot(t),"f"),rt(this,it,new ie(e),"f"),rt(this,st,16,"f")}update(e){var t,a;const n=e.slice();for(let e=0;e{this.connected=!0,wt.setTransportOpened("websocket");const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(ct.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout((()=>{this.releasePending()}),0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),n=a-this.lastCloseTime;e=!isNaN(n)&&n{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(ct.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=Ue.Error|Ue.Log;this.debug&&(i|=Ue.Debug),this.log=He(`TCP-${t}`+n,i),this.log("constructor"),this.connect()}clear(){this.connected&&wt.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise(((a,n)=>{this.pending.push({resolve:a,reject:n,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",n.length),i||(i=a.encoded=this.encodeBody(n)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let gt=0;class ut extends Ye{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++gt,ht.set(this.id,this);const n={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};f(n)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};f(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};f(e)}}const ht=new Map,ft=r.test?"_test":"";class _t{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=r.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+ft,s=`wss://${Ze.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;return new lt(Ve&&y&&void 0!==ut?ut:tt,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let n;if(r.ssl||!r.http)n="https://"+this.sslSubdomains[e-1]+("client"!==t?"-1":"")+".web.telegram.org/"+(r.test?"apiw_test1":"apiw1");else for(let t of this.dcOptions)if(t.id===e){n="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new Pt(e,n,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=r.transport,n=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const s=this.chosenServers[a][t];e in s||(s[e]=[]);const i=s[e];if(!i.length||!n){let s;const r="client"===t?"":"-1";return s=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,r),s?(n&&i.push(s),s):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const n in e[a])for(const s in e[a][n])et(e[a][n][s],t)}}const vt=new _t;var bt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const wt=new class extends Ye{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()})),setTimeout((()=>{this.waitForWebSocket()}),200)}pingTransports(){return bt(this,void 0,void 0,(function*(){const e=this.transports={https:vt.chooseServer(Ze.baseDcId,"client","https",!1),websocket:vt.chooseServer(Ze.baseDcId,"client","websocket",!1)},t=$e();this.transports.https._send(new Uint8Array,"no-cors").then((()=>t.resolve(!0)),(()=>t.resolve(!1))),setTimeout((()=>t.resolve(!1)),2e3);const a=$e(),n=e.websocket;n.setAutoReconnect(!1),n.connection.addEventListener("close",(()=>a.resolve(!1)),{once:!0}),n.connection.addEventListener("open",(()=>a.resolve(!0)),{once:!0}),setTimeout((()=>a.resolve(!1)),2e3);const[s,i]=yield Promise.all([t,a]);for(const t in e)e[t].destroy();return{https:s||this.opened.get("https")>0,websocket:i||this.opened.get("websocket")>0}}))}waitForWebSocket(){return bt(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield Xe(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}};class Pt{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=r.debug&&!1;let n=Ue.Error|Ue.Log;this.debug&&(n|=Ue.Debug),this.log=He(`HTTP-${e}`+a,n),this.log("constructor"),this.connected=!1}_send(e,t){return this.debug&&this.log.debug("-> body length to send:",e.length),fetch(this.url,{method:"POST",body:e,mode:t}).then((e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then((e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))})),e;return this.setConnected(!0),e.arrayBuffer().then((e=>new Uint8Array(e)))}),(e=>{throw this.setConnected(!1),e}))}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,wt.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,n=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new B({mtproto:!0}),a=_e();t.storeMethod("ping",{ping_id:a});const n={msg_id:Ee.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(ct.Connecting),this.sendEncryptedRequest(n).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=Re.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=G(this.authKey),this.serverSalt=G(n),this.isFileUpload=!!s.fileUpload,this.isFileDownload=!!s.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const i=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+i,this.log=He(this.name,Ue.Log|Ue.Debug|Ue.Error|Ue.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&function(e,t){for(let a=e.length-1;a>=0;--a)t(e[a],a)}(t.inner,((e,a)=>{const n=this.updateSentMessage(e);n?t.inner[a]=n.msg_id:t.inner.splice(a,1)})),t.msg_id=Ee.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const n=new B({mtproto:!0});n.storeMethod(e,t);const s=Ee.generateId(),i=this.generateSeqNo(),p={msg_id:s,seq_no:i,body:n.getBytes(!0)};return r.debug&&this.log("MT call",e,t,s,i),this.pushMessage(p,a)}wrapMtpMessage(e,t){const a=new B({mtproto:!0});a.storeObject(e,"Object");const n=Ee.generateId(),s=this.generateSeqNo(t.notContentRelated),i={msg_id:n,seq_no:s,body:a.getBytes(!0)};return r.debug&&this.log("MT message",e,n,s),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const n=new B(a);if(!this.connectionInited){const e=P.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");n.storeInt(+e.id,"invokeWithLayer"),n.storeInt(P.layer,"layer");const t=P.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");n.storeInt(+t.id,"initConnection"),n.storeInt(0,"flags"),n.storeInt(Ze.id,"api_id"),n.storeString(Mt.userAgent||"Unknown UserAgent","device_model"),n.storeString(navigator.platform||"Unknown Platform","system_version"),n.storeString(Ze.version+(Ze.isMainDomain?" "+Ze.suffix:""),"app_version"),n.storeString(navigator.language||"en","system_lang_code"),n.storeString(Ze.langPack,"lang_pack"),n.storeString(Mt.language,"lang_code")}if(a.afterMessageId){if(void 0===It){const e=P.API.methods.find((e=>"invokeAfterMsg"===e.method));It=e?+e.id:0}It?(n.storeInt(It,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:Ee.generateId(),seq_no:this.generateSeqNo(),body:n.getBytes(!0),isAPI:!0};return r.debug?this.log("Api call",e,s,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(s,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),_t.removeTransport(vt.chosenServers,this.transport),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.transport=e,e&&(e.networker=this,e instanceof Pt&&(this.longPollInterval=Re.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connected&&e.connection&&this.setConnectionStatus(ct.Connected),this.resend())}destroy(){this.changeTransport()}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(ct.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=Re.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(ct.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?ct.Closed:ct.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{a.forEach((t=>{if(this.sentMessages[t]){const a=this.sentMessages[t].deferred;delete this.sentMessages[t],delete this.pendingMessages[t],e?a.resolve():a.reject()}}))}))}pushMessage(e,t){const a=new Promise(((a,n)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:n}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),S(t)&&(t.messageId=e.msg_id)}));if(!t.notContentRelated&&!t.noResponse){const t=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(ct.TimedOut))}),5e3);a.catch(Qe).finally((()=>{clearTimeout(t),this.setConnectionStatus(ct.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=Re.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){const a=e===ct.Connected,n=this.status!==e;this.isOnline=a,this.status=e,n&&(Mt.onConnectionStatusChange&&Mt.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest())}pushResend(e,t=100){const a=t?Date.now()+t:0,n=this.sentMessages[e];if(n.container)for(const e of n.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;n.acked&&this.log.error("pushResend: acked message?",n),this.debug&&this.log.debug("pushResend:",e,n,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(t,a){return kt(this,void 0,void 0,(function*(){const n=a?0:8,s=e(this.authKeyUint8.subarray(88+n,88+n+32),t),i=yield Ae.invokeCrypto("sha256",s);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),s=new Uint8Array(52),i=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),i.push(Ae.invokeCrypto("sha256",n)),s.set(this.authKeyUint8.subarray(40+a,40+a+36),0),s.set(e,36),i.push(Ae.invokeCrypto("sha256",s)),Promise.all(i).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),n=new Uint8Array(e[0]),s=new Uint8Array(e[1]);return t.set(n.subarray(0,8)),t.set(s.subarray(8,24),8),t.set(n.subarray(24,32),24),a.set(s.subarray(0,8)),a.set(n.subarray(8,24),8),a.set(s.subarray(24,32),24),[t,a]}))}isStopped(){return Mt.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,n=!1,s=!1,i=!1;const r=Object.keys(this.pendingMessages).map((e=>M()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const p of r){const r=this.sentMessages[p];if(r&&r.body){const p=r.body.length+32;if(a+p>655360&&(this.log.warn("lengthOverflow",r,t),i=!0,e))break;t.push(r),a+=p,r.isAPI?n=!0:r.longPoll&&(s=!0),e=r}delete this.pendingMessages[p]}if(this.transport instanceof Pt&&n&&!s){const e=new B({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),t.push({msg_id:Ee.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!t.length)return;const p=t.filter((e=>e.noResponse)).map((e=>e.msg_id));if(t.length>1){const n=this.generateContainerMessage(a,t);e=n.messageWithBody,this.sentMessages[e.msg_id]=n.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];const o=this.sendEncryptedRequest(e);this.transport instanceof Pt&&this.handleSentEncryptedRequestHTTP(o,e,p),this.transport instanceof Pt||this.cleanupSent(),i&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new B({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const n=[];t.forEach(((e,t)=>{n.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const s={msg_id:Ee.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:n};return r.debug&&this.log.warn("Container",n,s.msg_id,s.seq_no),{message:s,messageWithBody:Object.assign({body:a.getBytes(!0)},s)}}getEncryptedMessage(e){return kt(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield Ae.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>Ae.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(t){const a=new B({startMaxLength:t.body.length+2048});a.storeIntBytes(this.serverSalt,64,"salt"),a.storeIntBytes(this.sessionId,64,"session_id"),a.storeLong(t.msg_id,"message_id"),a.storeInt(t.seq_no,"seq_no"),a.storeInt(t.body.length,"message_data_length"),a.storeRawBytes(t.body,"message_data");const n=a.getBuffer(),s=16-a.getOffset()%16+16*(1+fe(8)%5),i=e(n,new Uint8Array(s).randomize());return this.getEncryptedMessage(i).then((e=>{const t=new B({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then((t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport.send(t);if(!(this.transport instanceof Pt))return a;const n={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw n;return e}),(e=>{throw e.message||e.type||(e=Object.assign(n,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new x(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!St(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const n=t.fetchIntBytes(128,!0,"msg_key"),i=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(n,i).then((e=>this.getMsgKey(e,!1).then((t=>{if(!St(n,t))throw this.log.warn("[MT] msg_keys",n,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new x(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const i=a.fetchIntBytes(64,!0,"session_id"),r=a.fetchLong("message_id");if(!(St(i,this.sessionId)||this.prevSessionId&&St(i,this.prevSessionId)))throw this.log.warn("Sessions",i,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+s(i));const p=a.fetchInt("seq_no"),o=e.byteLength,m=a.fetchInt("message_data[length]");let d=a.getOffset();if(m%4||m>o-d)throw new Error("[MT] Invalid body length: "+m);const y=a.fetchRawBytes(m,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new x(y,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const n=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==n+e.bytes&&a.setOffset(n+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const n=this.sentMessages[e.req_msg_id],s=n&&n.resultType||"Object";e.req_msg_id&&!n||(e.result=a.fetchObject(s,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:r,sessionId:i,seqNo:p}}))))}applyServerSalt(e){const t=(a=e,O(L(M()(a)).reverse(),8,!0,!1,!1));var a;w.set({["dc"+this.dcId+"_server_salt"]:s(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof Pt&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof Pt&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof Pt&&(t=3e4),this.scheduleRequest(t)}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach((t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=Ee.applyServerTime(M()(t).shiftRight(32).toJSNumber());(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const n=this.updateSentMessage(e.bad_msg_id);n&&this.pushResend(n.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),w.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&Mt.updatesProcessor&&Mt.updatesProcessor(e)}));break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,n=this.sentMessages[a];if(this.processMessageAck(a),n){const t=n.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),n.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t]);break}default:this.ackMessage(t),null!==Mt.updatesProcessor&&Mt.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}const At=new class{constructor(){this.networkers=[],this.language=navigator.language||Ze.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){et(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,n,s){const i=new Ct(e,t,a,n,s);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};o&&(o.networkerFactory=At);const Mt=At;const Et=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,r.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const a=new B;a.storeBytes(t(e.modulus),"n"),a.storeBytes(t(e.exponent),"e");const n=a.getBuffer();return Ae.invokeCrypto("sha1",n).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[s(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,s=function*(){yield this.prepare();for(let t=0;t{if(m&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw p;try{const t=new x(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const n=t.fetchLong("msg_id");"0"===n&&this.log.error("msg_id === 0",n);const s=t.fetchInt("msg_len");return s||this.log.error("no msg_len",s),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(p,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(p,{originalError:e})),e}))}sendReqPQ(e){return Rt(this,void 0,void 0,(function*(){const t=new B({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),m&&this.log("Send req_pq",e.nonce.hex);try{const n=this.sendPlainRequest(e.dcId,t.getBytes(!0));Et.prepare(),a=yield n}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!St(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,m&&this.log("Got ResPQ",s(e.serverNonce),s(e.pq),e.fingerprints);const i=yield Et.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,m&&this.log("PQ factorization start",e.pq);try{var r=yield Ae.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],m&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Rt(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new B({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const s=O(n,192,!1,!0,!1),i=s.slice().reverse(),r=yield(()=>Rt(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=i.concat(yield Ae.invokeCrypto("sha256",t.concat(s)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield Ae.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),r=q(t,yield Ae.invokeCrypto("sha256",n)).concat(n),p=F(r),o=M()(e.publicKey.modulus,16);if(-1===p.compare(o))return r}})))(),p=O(yield Ae.invokeCrypto("rsa-encrypt",r,e.publicKey),256,!0,!0,!0),o={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},d=new B({mtproto:!0});d.storeMethod("req_DH_params",o);const y=d.getBytes(!0);let c;m&&this.log("Send req_DH_params",o);try{c=yield this.sendPlainRequest(e.dcId,y)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const l=c.fetchObject("Server_DH_Params","RESPONSE");if(m&&this.log("Sent req_DH_params, response:",l),"server_DH_params_fail"!==l._&&"server_DH_params_ok"!==l._)throw new Error("[MT] Server_DH_Params response invalid: "+l._);if(!St(e.nonce,l.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!St(e.serverNonce,l.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===l._){if(!St((yield Ae.invokeCrypto("sha1",e.newNonce)).slice(-16),l.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,l.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Rt(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield Ae.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield Ae.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield Ae.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield Ae.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield Ae.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),s=a.slice(20),i=new x(s,{mtproto:!0}),r=i.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==r._)throw new Error("[MT] server_DH_inner_data response invalid: "+r);if(!St(e.nonce,r.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!St(e.serverNonce,r.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");m&&this.log("Done decrypting answer"),e.g=r.g,e.dhPrime=r.dh_prime,e.gA=r.g_a,e.serverTime=r.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=i.getOffset();if(!St(n,yield Ae.invokeCrypto("sha1",s.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");Ee.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){m&&this.log("Verifying DH params",e,t,a);const n=s(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==n)throw new Error("[MT] DH params are not verified: unknown dhPrime");m&&this.log("dhPrime cmp OK");const i=F(a),r=M()(n,16);if(i.compare(M().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(i.compare(r.subtract(M().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");m&&this.log("1 < gA < dhPrime-1 OK");const p=M()(2).pow(1984);if(i.compare(p)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(i.compare(r.subtract(p))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return m&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Rt(this,void 0,void 0,(function*(){const a=t(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var n=yield Ae.invokeCrypto("mod-pow",a,e.b,e.dhPrime)}catch(e){throw e}const s=new B({mtproto:!0});s.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:n},"Client_DH_Inner_Data");const i=(yield Ae.invokeCrypto("sha1",s.getBuffer())).concat(s.getBytes(!0)),r=yield Ae.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),p=new B({mtproto:!0});let o;p.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),m&&this.log("Send set_client_DH_params");try{o=yield this.sendPlainRequest(e.dcId,p.getBytes(!0))}catch(e){throw e}const d=o.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==d._&&"dh_gen_retry"!==d._&&"dh_gen_fail"!==d._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+d._);if(!St(e.nonce,d.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!St(e.serverNonce,d.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var y=yield Ae.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw y}const c=yield Ae.invokeCrypto("sha1",y),l=c.slice(0,8),g=c.slice(-8);switch(m&&this.log("Got Set_client_DH_params_answer",d._,y),d._){case"dh_gen_ok":{const t=(yield Ae.invokeCrypto("sha1",e.newNonce.concat([1],l))).slice(-16);if(!St(t,d.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,d),new Error("new_nonce_hash1 mismatch");const a=q(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return m&&this.log("Auth successfull!",g,y,a),e.authKeyId=g,e.authKey=y,e.serverSalt=a,e}case"dh_gen_retry":if(!St((yield Ae.invokeCrypto("sha1",e.newNonce.concat([2],l))).slice(-16),d.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e);case"dh_gen_fail":if(!St((yield Ae.invokeCrypto("sha1",e.newNonce.concat([3],l))).slice(-16),d.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=wt.pingTransports().then((({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)}))}auth(e){let t=this.cached[e];return t||(t=new Promise(((t,a)=>Rt(this,void 0,void 0,(function*(){let n;yield this.getTransportType();let s=1;for(;s++<=3;)try{const a={dcId:e,nonce:new Uint8Array(16).randomize()},n=this.sendReqPQ(a);return void t(yield n)}catch(e){n=e}a(n)})))),this.cached[e]=t)}};function Vt(e,t=""){let a;const n=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{a=new Blob(e,{type:n})}catch(t){let s=new BlobBuilder;e.forEach((e=>{s.append(e)})),a=s.getBlob(n)}return a}class Dt{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let a in t)void 0!==t[a]&&(e[a]=t[a])}(this,e),r.test&&(this.name+="_test"),this.storeName=t,this.log=He("IDB-"+this.storeName),this.openDatabase(!0),Dt.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let a=!1;return setTimeout((()=>{a||t.onerror({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,n)=>{t.onsuccess=s=>{a=!0;const i=t.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{a=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},t.onupgradeneeded=e=>{a=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach((e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var a;const n=e.createObjectStore(t.name);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const e of t.indexes)n.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)}))}}))}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"")}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,n)=>a.put(t[n],e)))),"")}saveFile(e,t){return t instanceof Blob||(t=Vt([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"")}getObjectStore(e,t,a,n=this.storeName){let s;return a&&(s=performance.now(),this.log(a+": start")),this.openDatabase().then((i=>new Promise(((r,p)=>{const o=i.transaction([n],e);o.onerror=e=>{clearTimeout(m),p(o.error)},o.oncomplete=e=>{clearTimeout(m),a&&this.log(a+": end",performance.now()-s);const t=c.map((e=>e.result));r(y?t:t[0])};const m=setTimeout((()=>{this.log.error("transaction not finished",o)}),1e4),d=t(o.objectStore(n)),y=Array.isArray(d),c=y?d:[].concat(d)}))))}getAll(){return this.getObjectStore("readonly",(e=>e.getAll()),"")}}Dt.STORAGES=[];var Ut=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Bt=new class{constructor(){this.log=He("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=r.transport,wt.addEventListener("transport",(e=>{this.changeTransportType(e)}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const n in a){const s=a[n];for(const a in s)s[a].forEach(((s,i,r)=>{e({networker:s,dcId:+a,connectionType:n,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return vt.chooseServer(e,t,a,"client"===t)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],n=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=n,this.transportType=e;for(const a in this.gettingNetworkers){const n=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const s=a.replace(t,e);this.gettingNetworkers[s]=n,this.log("changed networker getKey from",a,"to",s)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);e.networker.changeTransport(a)}))}getBaseDcId(){return Ut(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield w.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(Ze.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ut(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}w.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,w.set({dc:this.baseDcId})}logOut(){return Ut(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>w.get(e)))),a=[];for(let e=0;e{this.baseDcId=void 0,Dt.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(n,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(n)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,a={}){const n=a.fileDownload?"download":a.fileUpload?"upload":"client",i=this.getTransportType(n);this.cachedNetworkers[i]||(this.cachedNetworkers[i]={client:{},download:{},upload:{}});const r=this.cachedNetworkers[i][n];e in r||(r[e]=[]);const p=r[e],o="client"===n||"https"===i?1:3;if(p.length>=o){let e=p.length-1,t=!1;for(;e>=0;--e)if(p[e].isOnline){t=!0;break}const a=t?p.splice(e,1)[0]:p.pop();return p.unshift(a),Promise.resolve(a)}let m=this.generateNetworkerGetKey(e,i,n);if(this.gettingNetworkers[m])return this.gettingNetworkers[m];const d=`dc${e}_auth_key`,y=`dc${e}_server_salt`;let c=this.chooseServer(e,n,i);return this.gettingNetworkers[m]=Promise.all([d,y].map((e=>w.get(e)))).then((([r,o])=>Ut(this,void 0,void 0,(function*(){let l,g;if(r&&512===r.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const n=t(r),s=(yield Ae.invokeCrypto("sha1",n)).slice(-8),i=t(o);l=Mt.getNetworker(e,n,s,i,a)}else try{const t=yield Tt.auth(e);w.set({[d]:s(t.authKey),[y]:s(t.serverSalt)}),l=Mt.getNetworker(e,t.authKey,t.authKeyId,t.serverSalt,a)}catch(e){g=e}const u=this.getTransportType(n);if(u!==i&&(m=this.generateNetworkerGetKey(e,u,n),c.destroy(),_t.removeTransport(vt.chosenServers,c),l&&(c=this.chooseServer(e,n,u)),this.log("transport has been changed during authorization from",i,"to",u)),delete this.gettingNetworkers[m],g)throw this.log("get networker error",g,g.stack),g;return l.changeTransport(c),p.unshift(l),this.setOnDrainIfNeeded(l),l}))))}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),Mt.removeNetworker(e),_t.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())}))}invokeApi(e,t={},a={}){const n=$e();let{afterMessageId:s,prepareTempMessageId:i}=a;if(i&&n.then((()=>{delete this.afterMessageTempIds[i]})),o){const s=Date.now(),i=Re.setInterval((()=>{m&&m.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-s)/1e3)}),5e3);n.catch(Qe).finally((()=>{clearInterval(i)}))}const r=t=>{t?S(t)||(t={message:t}):t={type:"ERROR_EMPTY"},n.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=d||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)))};let p,m,d=(new Error).stack||"empty stack";const y=o=>{if(s){const e=this.afterMessageTempIds[s];e&&(a.afterMessageId=e.messageId)}const d=(m=o).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:n}),d.then(n.resolve,(i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,p,e,t),401===i.code&&this.baseDcId===p)"SESSION_PASSWORD_NEEDED"!==i.type&&(w.delete("dc"),w.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&p!==this.baseDcId){if(void 0===this.cachedExportPromise[p]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:p},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:p,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[p]=e}this.cachedExportPromise[p].then((()=>{this.invokeApi(e,t,a).then(n.resolve,r)}),r)}else if(303===i.code){const s=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];s!==p&&(a.dcId?a.dcId=s:this.setBaseDcId(s),this.getNetworker(s,a).then((s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)}),r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const s=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];s!==p?this.getNetworker(s,a).then((s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)}),r):r(i)}else if(400===i.code&&"CONNECTION_NOT_INITED"===i.type)Mt.unsetConnectionInited(),y(m);else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[s];s=void 0,delete a.afterMessageId,e?e.promise.then((()=>y(m))):y(m)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout((()=>{y(m)}),1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout((()=>{y(m)}),1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout((()=>{y(m)}),1e3*e)}}))};return(p=a.dcId||this.baseDcId)?this.getNetworker(p,a).then(y,r):this.getBaseDcId().then((e=>{this.getNetworker(p=e,a).then(y,r)})),n}};o.apiManager=Bt;const xt=Bt,Ft="_";function Lt(e){return function(e,t){return new Promise((t=>{const a=new FileReader;a.addEventListener("loadend",(e=>{t(e.target.result)})),a.readAsArrayBuffer(e)}))}(e)}const Nt=new class{constructor(){this.blobSupported=!0;try{Vt([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(a=t,Lt(a).then((e=>new Uint8Array(e)))).then((t=>e.write(t))):e.write(t);var a}getFakeFileWriter(e,t){const a=[];return{write:e=>{return t=this,n=void 0,i=function*(){if(!this.blobSupported)throw!1;a.push(e)},new((s=void 0)||(s=Promise))((function(e,a){function r(e){try{o(i.next(e))}catch(e){a(e)}}function p(e){try{o(i.throw(e))}catch(e){a(e)}}function o(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,p)}o((i=i.apply(t,n||[])).next())}));var t,n,s,i},truncate:()=>{a.length=0},finalize:(n=!0)=>{const s=Vt(a,e);return n&&t&&t(s),s}}}};class Ot{constructor(e){this.dbName=e,this.useStorage=!0,r.test&&(this.dbName+="_test"),Ot.STORAGES.length&&(this.useStorage=Ot.STORAGES[0].useStorage),this.openDatabase(),Ot.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation((t=>t.delete("/"+e)))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation((t=>t.match("/"+e)))}save(e,t){return this.timeoutOperation((a=>a.put("/"+e,t)))}getFile(e,t="blob"){return this.get(e).then((e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=Vt(t));const a=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,a).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,a)=>{return n=this,s=void 0,r=function*(){let n=!1;const s=setTimeout((()=>{a(),n=!0}),15e3);try{const a=yield this.openDatabase();if(!a)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(a);if(n)return;t(s)}catch(e){a(e)}clearTimeout(s)},new((i=void 0)||(i=Promise))((function(e,t){function a(e){try{o(r.next(e))}catch(e){t(e)}}function p(e){try{o(r.throw(e))}catch(e){t(e)}}function o(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(a,p)}o((r=r.apply(n,s||[])).next())}));var n,s,i,r})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const a=Nt.getFakeFileWriter(t,(t=>this.saveFile(e,t).catch((()=>t))));return Promise.resolve(a)}static toggleStorage(e){return Promise.all(this.STORAGES.map((t=>{if(t.useStorage=e,!e)return t.deleteAll()})))}}Ot.STORAGES=[];var qt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Gt=new class{constructor(){this.cacheStorage=new Ot("cachedFiles"),this.cachedDownloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.webpConvertPromises={},this.refreshReferencePromises={},this.log=He("AFM",Ue.Error|Ue.Log),this.tempId=0,this.queueId=0,this.debug=r.debug,this.uncompressTGS=(e,t)=>Ae.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.uncompressTGV=(e,t)=>Ae.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.convertWebp=(e,t)=>{const a=$e();return h({type:"convertWebp",payload:{fileName:t,bytes:e}}),this.webpConvertPromises[t]=a},setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5)}downloadRequest(e,t,a,n,s=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:s,cb:a,deferred:{resolve:e,reject:r},activeDelta:n})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const n=t.findAndSplice((e=>0===e.queueId))||t.findAndSplice((e=>e.queueId===this.queueId))||t.shift(),s=n.activeDelta||1;this.downloadActives[e]+=s,n.cb().then((t=>{this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.resolve(t)}),(t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.reject(t)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=(this.cachedDownloadPromises[e]?[this.cachedDownloadPromises[e]]:void 0)||(this.uploadPromises[e]?Array.from(this.uploadPromises[e]):[]);let a=!1;for(let e=0,n=t.length;eqt(this,void 0,void 0,(function*(){return r&&r(),xt.invokeApi("upload.getWebFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0})}))),this.getDelta(n),i)}requestFilePart(e,t,a,n,i=0,r=0,p){return this.downloadRequest(e,i,(()=>qt(this,void 0,void 0,(function*(){p&&p();const i=()=>qt(this,void 0,void 0,(function*(){return p&&p(),xt.invokeApi("upload.getFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0}).catch((e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(i);throw e}))})),r=t.file_reference;if(r&&!t.checkedReference){t.checkedReference=!0;const e=s(r);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(i)}return i()}))),this.getDelta(n),r)}getDelta(e){return e/1024/128}getLimitPart(e){let t;return t=512,524288}refreshReference(e){const t=e.file_reference,a=s(t);let n=this.refreshReferencePromises[a];if(!n){const s=$e();n=this.refreshReferencePromises[a]={deferred:s,timeout:Re.setTimeout((()=>{this.log.error("Didn't refresh the reference:",e),s.reject("REFERENCE_IS_NOT_REFRESHED")}),6e4)},s.catch(Qe).finally((()=>{clearTimeout(n.timeout)})),h({type:"refreshReference",payload:t})}return n.deferred.then((t=>{if(a===s(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t}))}downloadFile(e){var t;if(!Nt.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:n,location:s}=e;let i;"application/x-tgwallpattern"===e.mimeType?(i=this.uncompressTGV,e.mimeType="image/svg+xml"):"image/webp"!==e.mimeType||jt()?"application/x-tgsticker"===e.mimeType&&(i=this.uncompressTGS,e.mimeType="application/json"):(i=this.convertWebp,e.mimeType="image/png");const r=function(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(Ft);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(Ft);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(Ft);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(Ft);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(Ft);break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}(s,e.fileName),p=this.cachedDownloadPromises[r],o=this.getFileStorage();if(this.debug&&this.log("downloadFile",r,a,s,e.mimeType),p)return a?p.then((t=>t instanceof Blob&&t.sizethis.downloadFile(e))).catch((()=>this.downloadFile(e)))):t)):p;const m=$e(),d=e.mimeType||"image/jpeg";let y,c,l=!1,g=e=>{y=e,delete this.cachedDownloadPromises[r],m.reject(y),g=()=>{},!c||y&&"DOWNLOAD_CANCELED"===y.type||c.truncate()};const u=this.tempId++;o.getFile(r).then((e=>qt(this,void 0,void 0,(function*(){if(e.size{o.getFileWriter(r,d).then((t=>{c=t;const p=e.limitPart||this.getLimitPart(a);let o,d,y=Promise.resolve();const f=(e,t)=>qt(this,void 0,void 0,(function*(){return i?yield i(e,r):e})),_="inputWebFileLocation"===s._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];o=0;do{d=$e(),v.push({offset:o,writeFilePromise:y,writeFileDeferred:d}),y=d,o+=p}while(oqt(this,void 0,void 0,(function*(){const{offset:i,writeFilePromise:o,writeFileDeferred:d}=v.shift();try{h();const y=yield _(n,s,i,p,u,e.queueId,h),c=y.bytes;v.length&&w(),this.debug&&this.log("downloadFile requestFilePart result:",r,y);const g=i+p>=a||!c.byteLength;if(c.byteLength){b+=c.byteLength,m.notify({done:b,offset:i,total:a});const e=yield f(c);h(),yield o,h(),yield Nt.write(t,e)}d.resolve(),g&&(l=!0,m.resolve(t.finalize(a<20971520)))}catch(e){g(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)}))}));const h=()=>{if(y)throw y};return m.cancel=()=>{if(!y&&!l){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",g(e)}},m.notify=e=>{f({progress:Object.assign({fileName:r},e)})},this.cachedDownloadPromises[r]=m,m.safeFinally((()=>{delete this.cachedDownloadPromises[r]})),m}deleteFile(e){return delete this.cachedDownloadPromises[e],this.getFileStorage().delete(e)}uploadFile({file:e,fileName:t}){var a;const n=e.size,s=n>=10485760;let i=!1,r=!1,p=0,o=262144;n>67108864?o=524288:n<102400&&(o=32768);const m=this.getDelta(o),d=Math.ceil(n/o),y=_e();let c=0;const l={_:s?"inputFileBig":"inputFile",id:y,parts:d,name:t,md5_checksum:""},g={notify:e=>{}},u=new Promise(((e,t)=>{if(d>4e3)return t({type:"FILE_TOO_BIG"});g.resolve=e,g.reject=t}));if(Object.assign(u,g),d>4e3)return u;let h=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),u.reject(e),i=!0,h=()=>{}};const _=s?"upload.saveBigFilePart":"upload.saveFilePart",v=this.tempId++,b=this,w=function*(){for(let t=0;tLt(e.slice(t,t+o)).then((e=>{if(i)throw{type:"UPLOAD_CANCELED"};return b.debug&&b.log("Upload file part, isBig:",s,a,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),xt.invokeApi(_,{file_id:y,file_part:a,file_total_parts:d,bytes:e},{fileUpload:!0}).then((e=>{p++,u.notify({done:p*o,total:n}),p>=d&&(u.resolve(l),r=!0)}),h)}))),m).catch(h)}}(),P=()=>{if(i)return;const e=w.next();e.done||i||e.value.then(P)};for(let e=0,t=Math.min(1/0,d);e{i||r||(i=!0,h({type:"UPLOAD_CANCELED"}))},u.notify=e=>{f({progress:Object.assign({fileName:t},e)})},u.finally((()=>{S.delete(u),S.size||delete this.uploadPromises[t]}));const S=null!==(a=this.uploadPromises[t])&&void 0!==a?a:this.uploadPromises[t]=new Set;return S.add(u),u}};o.apiFileManager=Gt;const Kt=Gt;let zt=!1;const jt=()=>zt;Mt.setUpdatesProcessor((e=>{f({update:e})})),Mt.onConnectionStatusChange=e=>{f({type:"connectionStatusChange",payload:e})};const Ht={convertWebp:e=>{const{fileName:t,bytes:a}=e.payload,n=Kt.webpConvertPromises[t];n&&(n.resolve(a),delete Kt.webpConvertPromises[t])},webpSupport:e=>{zt=e.payload},socketProxy:e=>{const t=e.payload,a=t.id,n=ht.get(a);"message"===t.type?n.dispatchEvent("message",t.payload):"open"===t.type?n.dispatchEvent("open"):"close"===t.type&&(n.dispatchEvent("close"),ht.delete(a))},localStorageProxy:e=>{w.finishTask(e.id,e.payload)},userAgent:e=>{Mt.userAgent=e.payload},online:()=>{Mt.forceReconnectTimeout()},forceReconnect:()=>{Mt.forceReconnect()},toggleStorage:e=>{const t=e.payload;Ot.toggleStorage(t)},refreshReference:e=>{const t=s(e.originalPayload),a=Kt.refreshReferencePromises[t],n=null==a?void 0:a.deferred;n&&(e.error?n.reject(e.error):n.resolve(e.payload))},crypto:e=>{Ae.invokeCrypto(e.task,...e.args).then((t=>{f({taskId:e.taskId,result:t})}))}};Re.addEventListener("message",(e=>{return t=void 0,a=void 0,s=function*(){try{const t=e.data,a=t.taskId,n=Ht[t.type];if(n)return void n(t);if(!t.task)return;switch(t.task){case"requestFilePart":case"setQueueId":case"cancelDownload":case"uploadFile":case"downloadFile":try{let e=Kt[t.task].apply(Kt,t.args);e instanceof Promise&&(e=yield e),f({taskId:a,result:e})}catch(e){f({taskId:a,error:e})}break;case"getNetworker":xt[t.task].apply(xt,t.args).finally((()=>{f({taskId:a,result:null})}));break;case"setLanguage":case"startAll":case"stopAll":Mt[t.task].apply(Mt,t.args);break;default:try{let e=xt[t.task].apply(xt,t.args);e instanceof Promise&&(e=yield e),f({taskId:a,result:e})}catch(e){f({taskId:a,error:e})}}}catch(e){console.error("worker task error:",e)}},new((n=void 0)||(n=Promise))((function(e,i){function r(e){try{o(s.next(e))}catch(e){i(e)}}function p(e){try{o(s.throw(e))}catch(e){i(e)}}function o(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,p)}o((s=s.apply(t,a||[])).next())}));var t,a,n,s})),f("ready")})()})(); -//# sourceMappingURL=mtproto.worker.77bc82001791a2fea575.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js.LICENSE.txt b/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js.LICENSE.txt deleted file mode 100644 index c935087f..00000000 --- a/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js.LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */ diff --git a/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js.map b/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js.map deleted file mode 100644 index 6e9543ad..00000000 --- a/public/mtproto.worker.77bc82001791a2fea575.bundle.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mtproto.worker.77bc82001791a2fea575.bundle.worker.js","mappings":"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,QAAS,QAAS,QAAS,QACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,OAAQ,OAAQ,OAC5D,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,OAAQ,QAAS,QAAS,QAAS,QACrD,QAAS,OAAQ,OAAQ,OAAQ,QAAS,QAAS,QACnD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,QAAS,QACrD,QAAS,QAAS,OAAQ,QAAS,QAAS,OAAQ,OACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OACtD,OAAQ,QAAS,QAAS,QAAS,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,OAAQ,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,OAAQ,QAAS,OAAQ,QAAS,QACpD,QAAS,QAAS,QAAS,OAAQ,QAAS,QAAS,QACrD,OAAQ,QAAS,OAAQ,QAAS,Q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","sources":["webpack://tweb/./node_modules/big-integer/BigInteger.js","webpack://tweb/./node_modules/pako/dist/pako_inflate.min.js","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/longFromInts.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/lib/crypto/cryptoworker.ts","webpack://tweb/./src/lib/crypto/crypto_methods.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/config/app.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/helpers/array/indexOfAndSplice.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/intermediate.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/transports/socketProxied.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/lib/fileManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts"],"sourcesContent":["var bigInt = (function (undefined) {\r\n \"use strict\";\r\n\r\n var BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_INT = 9007199254740992,\r\n MAX_INT_ARR = smallToArray(MAX_INT),\r\n DEFAULT_ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyz\";\r\n\r\n var supportsNativeBigInt = typeof BigInt === \"function\";\r\n\r\n function Integer(v, radix, alphabet, caseSensitive) {\r\n if (typeof v === \"undefined\") return Integer[0];\r\n if (typeof radix !== \"undefined\") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);\r\n return parseValue(v);\r\n }\r\n\r\n function BigInteger(value, sign) {\r\n this.value = value;\r\n this.sign = sign;\r\n this.isSmall = false;\r\n }\r\n BigInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function SmallInteger(value) {\r\n this.value = value;\r\n this.sign = value < 0;\r\n this.isSmall = true;\r\n }\r\n SmallInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function NativeBigInt(value) {\r\n this.value = value;\r\n }\r\n NativeBigInt.prototype = Object.create(Integer.prototype);\r\n\r\n function isPrecise(n) {\r\n return -MAX_INT < n && n < MAX_INT;\r\n }\r\n\r\n function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes\r\n if (n < 1e7)\r\n return [n];\r\n if (n < 1e14)\r\n return [n % 1e7, Math.floor(n / 1e7)];\r\n return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];\r\n }\r\n\r\n function arrayToSmall(arr) { // If BASE changes this function may need to change\r\n trim(arr);\r\n var length = arr.length;\r\n if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {\r\n switch (length) {\r\n case 0: return 0;\r\n case 1: return arr[0];\r\n case 2: return arr[0] + arr[1] * BASE;\r\n default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n function trim(v) {\r\n var i = v.length;\r\n while (v[--i] === 0);\r\n v.length = i + 1;\r\n }\r\n\r\n function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger\r\n var x = new Array(length);\r\n var i = -1;\r\n while (++i < length) {\r\n x[i] = 0;\r\n }\r\n return x;\r\n }\r\n\r\n function truncate(n) {\r\n if (n > 0) return Math.floor(n);\r\n return Math.ceil(n);\r\n }\r\n\r\n function add(a, b) { // assumes a and b are arrays with a.length >= b.length\r\n var l_a = a.length,\r\n l_b = b.length,\r\n r = new Array(l_a),\r\n carry = 0,\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l_b; i++) {\r\n sum = a[i] + b[i] + carry;\r\n carry = sum >= base ? 1 : 0;\r\n r[i] = sum - carry * base;\r\n }\r\n while (i < l_a) {\r\n sum = a[i] + carry;\r\n carry = sum === base ? 1 : 0;\r\n r[i++] = sum - carry * base;\r\n }\r\n if (carry > 0) r.push(carry);\r\n return r;\r\n }\r\n\r\n function addAny(a, b) {\r\n if (a.length >= b.length) return add(a, b);\r\n return add(b, a);\r\n }\r\n\r\n function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l; i++) {\r\n sum = a[i] - base + carry;\r\n carry = Math.floor(sum / base);\r\n r[i] = sum - carry * base;\r\n carry += 1;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall) {\r\n return new BigInteger(addSmall(a, Math.abs(b)), this.sign);\r\n }\r\n return new BigInteger(addAny(a, b), this.sign);\r\n };\r\n BigInteger.prototype.plus = BigInteger.prototype.add;\r\n\r\n SmallInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n if (isPrecise(a + b)) return new SmallInteger(a + b);\r\n b = smallToArray(Math.abs(b));\r\n }\r\n return new BigInteger(addSmall(b, Math.abs(a)), a < 0);\r\n };\r\n SmallInteger.prototype.plus = SmallInteger.prototype.add;\r\n\r\n NativeBigInt.prototype.add = function (v) {\r\n return new NativeBigInt(this.value + parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.plus = NativeBigInt.prototype.add;\r\n\r\n function subtract(a, b) { // assumes a and b are arrays with a >= b\r\n var a_l = a.length,\r\n b_l = b.length,\r\n r = new Array(a_l),\r\n borrow = 0,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < b_l; i++) {\r\n difference = a[i] - borrow - b[i];\r\n if (difference < 0) {\r\n difference += base;\r\n borrow = 1;\r\n } else borrow = 0;\r\n r[i] = difference;\r\n }\r\n for (i = b_l; i < a_l; i++) {\r\n difference = a[i] - borrow;\r\n if (difference < 0) difference += base;\r\n else {\r\n r[i++] = difference;\r\n break;\r\n }\r\n r[i] = difference;\r\n }\r\n for (; i < a_l; i++) {\r\n r[i] = a[i];\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function subtractAny(a, b, sign) {\r\n var value;\r\n if (compareAbs(a, b) >= 0) {\r\n value = subtract(a, b);\r\n } else {\r\n value = subtract(b, a);\r\n sign = !sign;\r\n }\r\n value = arrayToSmall(value);\r\n if (typeof value === \"number\") {\r\n if (sign) value = -value;\r\n return new SmallInteger(value);\r\n }\r\n return new BigInteger(value, sign);\r\n }\r\n\r\n function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n carry = -b,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < l; i++) {\r\n difference = a[i] + carry;\r\n carry = Math.floor(difference / base);\r\n difference %= base;\r\n r[i] = difference < 0 ? difference + base : difference;\r\n }\r\n r = arrayToSmall(r);\r\n if (typeof r === \"number\") {\r\n if (sign) r = -r;\r\n return new SmallInteger(r);\r\n } return new BigInteger(r, sign);\r\n }\r\n\r\n BigInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall)\r\n return subtractSmall(a, Math.abs(b), this.sign);\r\n return subtractAny(a, b, this.sign);\r\n };\r\n BigInteger.prototype.minus = BigInteger.prototype.subtract;\r\n\r\n SmallInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n return new SmallInteger(a - b);\r\n }\r\n return subtractSmall(b, Math.abs(a), a >= 0);\r\n };\r\n SmallInteger.prototype.minus = SmallInteger.prototype.subtract;\r\n\r\n NativeBigInt.prototype.subtract = function (v) {\r\n return new NativeBigInt(this.value - parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;\r\n\r\n BigInteger.prototype.negate = function () {\r\n return new BigInteger(this.value, !this.sign);\r\n };\r\n SmallInteger.prototype.negate = function () {\r\n var sign = this.sign;\r\n var small = new SmallInteger(-this.value);\r\n small.sign = !sign;\r\n return small;\r\n };\r\n NativeBigInt.prototype.negate = function () {\r\n return new NativeBigInt(-this.value);\r\n }\r\n\r\n BigInteger.prototype.abs = function () {\r\n return new BigInteger(this.value, false);\r\n };\r\n SmallInteger.prototype.abs = function () {\r\n return new SmallInteger(Math.abs(this.value));\r\n };\r\n NativeBigInt.prototype.abs = function () {\r\n return new NativeBigInt(this.value >= 0 ? this.value : -this.value);\r\n }\r\n\r\n\r\n function multiplyLong(a, b) {\r\n var a_l = a.length,\r\n b_l = b.length,\r\n l = a_l + b_l,\r\n r = createArray(l),\r\n base = BASE,\r\n product, carry, i, a_i, b_j;\r\n for (i = 0; i < a_l; ++i) {\r\n a_i = a[i];\r\n for (var j = 0; j < b_l; ++j) {\r\n b_j = b[j];\r\n product = a_i * b_j + r[i + j];\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n r[i + j + 1] += carry;\r\n }\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n carry = 0,\r\n product, i;\r\n for (i = 0; i < l; i++) {\r\n product = a[i] * b + carry;\r\n carry = Math.floor(product / base);\r\n r[i] = product - carry * base;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n function shiftLeft(x, n) {\r\n var r = [];\r\n while (n-- > 0) r.push(0);\r\n return r.concat(x);\r\n }\r\n\r\n function multiplyKaratsuba(x, y) {\r\n var n = Math.max(x.length, y.length);\r\n\r\n if (n <= 30) return multiplyLong(x, y);\r\n n = Math.ceil(n / 2);\r\n\r\n var b = x.slice(n),\r\n a = x.slice(0, n),\r\n d = y.slice(n),\r\n c = y.slice(0, n);\r\n\r\n var ac = multiplyKaratsuba(a, c),\r\n bd = multiplyKaratsuba(b, d),\r\n abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));\r\n\r\n var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));\r\n trim(product);\r\n return product;\r\n }\r\n\r\n // The following function is derived from a surface fit of a graph plotting the performance difference\r\n // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.\r\n function useKaratsuba(l1, l2) {\r\n return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;\r\n }\r\n\r\n BigInteger.prototype.multiply = function (v) {\r\n var n = parseValue(v),\r\n a = this.value, b = n.value,\r\n sign = this.sign !== n.sign,\r\n abs;\r\n if (n.isSmall) {\r\n if (b === 0) return Integer[0];\r\n if (b === 1) return this;\r\n if (b === -1) return this.negate();\r\n abs = Math.abs(b);\r\n if (abs < BASE) {\r\n return new BigInteger(multiplySmall(a, abs), sign);\r\n }\r\n b = smallToArray(abs);\r\n }\r\n if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes\r\n return new BigInteger(multiplyKaratsuba(a, b), sign);\r\n return new BigInteger(multiplyLong(a, b), sign);\r\n };\r\n\r\n BigInteger.prototype.times = BigInteger.prototype.multiply;\r\n\r\n function multiplySmallAndArray(a, b, sign) { // a >= 0\r\n if (a < BASE) {\r\n return new BigInteger(multiplySmall(b, a), sign);\r\n }\r\n return new BigInteger(multiplyLong(b, smallToArray(a)), sign);\r\n }\r\n SmallInteger.prototype._multiplyBySmall = function (a) {\r\n if (isPrecise(a.value * this.value)) {\r\n return new SmallInteger(a.value * this.value);\r\n }\r\n return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);\r\n };\r\n BigInteger.prototype._multiplyBySmall = function (a) {\r\n if (a.value === 0) return Integer[0];\r\n if (a.value === 1) return this;\r\n if (a.value === -1) return this.negate();\r\n return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);\r\n };\r\n SmallInteger.prototype.multiply = function (v) {\r\n return parseValue(v)._multiplyBySmall(this);\r\n };\r\n SmallInteger.prototype.times = SmallInteger.prototype.multiply;\r\n\r\n NativeBigInt.prototype.multiply = function (v) {\r\n return new NativeBigInt(this.value * parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;\r\n\r\n function square(a) {\r\n //console.assert(2 * BASE * BASE < MAX_INT);\r\n var l = a.length,\r\n r = createArray(l + l),\r\n base = BASE,\r\n product, carry, i, a_i, a_j;\r\n for (i = 0; i < l; i++) {\r\n a_i = a[i];\r\n carry = 0 - a_i * a_i;\r\n for (var j = i; j < l; j++) {\r\n a_j = a[j];\r\n product = 2 * (a_i * a_j) + r[i + j] + carry;\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n }\r\n r[i + l] = carry;\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.square = function () {\r\n return new BigInteger(square(this.value), false);\r\n };\r\n\r\n SmallInteger.prototype.square = function () {\r\n var value = this.value * this.value;\r\n if (isPrecise(value)) return new SmallInteger(value);\r\n return new BigInteger(square(smallToArray(Math.abs(this.value))), false);\r\n };\r\n\r\n NativeBigInt.prototype.square = function (v) {\r\n return new NativeBigInt(this.value * this.value);\r\n }\r\n\r\n function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n base = BASE,\r\n result = createArray(b.length),\r\n divisorMostSignificantDigit = b[b_l - 1],\r\n // normalization\r\n lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),\r\n remainder = multiplySmall(a, lambda),\r\n divisor = multiplySmall(b, lambda),\r\n quotientDigit, shift, carry, borrow, i, l, q;\r\n if (remainder.length <= a_l) remainder.push(0);\r\n divisor.push(0);\r\n divisorMostSignificantDigit = divisor[b_l - 1];\r\n for (shift = a_l - b_l; shift >= 0; shift--) {\r\n quotientDigit = base - 1;\r\n if (remainder[shift + b_l] !== divisorMostSignificantDigit) {\r\n quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);\r\n }\r\n // quotientDigit <= base - 1\r\n carry = 0;\r\n borrow = 0;\r\n l = divisor.length;\r\n for (i = 0; i < l; i++) {\r\n carry += quotientDigit * divisor[i];\r\n q = Math.floor(carry / base);\r\n borrow += remainder[shift + i] - (carry - q * base);\r\n carry = q;\r\n if (borrow < 0) {\r\n remainder[shift + i] = borrow + base;\r\n borrow = -1;\r\n } else {\r\n remainder[shift + i] = borrow;\r\n borrow = 0;\r\n }\r\n }\r\n while (borrow !== 0) {\r\n quotientDigit -= 1;\r\n carry = 0;\r\n for (i = 0; i < l; i++) {\r\n carry += remainder[shift + i] - base + divisor[i];\r\n if (carry < 0) {\r\n remainder[shift + i] = carry + base;\r\n carry = 0;\r\n } else {\r\n remainder[shift + i] = carry;\r\n carry = 1;\r\n }\r\n }\r\n borrow += carry;\r\n }\r\n result[shift] = quotientDigit;\r\n }\r\n // denormalization\r\n remainder = divModSmall(remainder, lambda)[0];\r\n return [arrayToSmall(result), arrayToSmall(remainder)];\r\n }\r\n\r\n function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/\r\n // Performs faster than divMod1 on larger input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n result = [],\r\n part = [],\r\n base = BASE,\r\n guess, xlen, highx, highy, check;\r\n while (a_l) {\r\n part.unshift(a[--a_l]);\r\n trim(part);\r\n if (compareAbs(part, b) < 0) {\r\n result.push(0);\r\n continue;\r\n }\r\n xlen = part.length;\r\n highx = part[xlen - 1] * base + part[xlen - 2];\r\n highy = b[b_l - 1] * base + b[b_l - 2];\r\n if (xlen > b_l) {\r\n highx = (highx + 1) * base;\r\n }\r\n guess = Math.ceil(highx / highy);\r\n do {\r\n check = multiplySmall(b, guess);\r\n if (compareAbs(check, part) <= 0) break;\r\n guess--;\r\n } while (guess);\r\n result.push(guess);\r\n part = subtract(part, check);\r\n }\r\n result.reverse();\r\n return [arrayToSmall(result), arrayToSmall(part)];\r\n }\r\n\r\n function divModSmall(value, lambda) {\r\n var length = value.length,\r\n quotient = createArray(length),\r\n base = BASE,\r\n i, q, remainder, divisor;\r\n remainder = 0;\r\n for (i = length - 1; i >= 0; --i) {\r\n divisor = remainder * base + value[i];\r\n q = truncate(divisor / lambda);\r\n remainder = divisor - q * lambda;\r\n quotient[i] = q | 0;\r\n }\r\n return [quotient, remainder | 0];\r\n }\r\n\r\n function divModAny(self, v) {\r\n var value, n = parseValue(v);\r\n if (supportsNativeBigInt) {\r\n return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];\r\n }\r\n var a = self.value, b = n.value;\r\n var quotient;\r\n if (b === 0) throw new Error(\"Cannot divide by zero\");\r\n if (self.isSmall) {\r\n if (n.isSmall) {\r\n return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];\r\n }\r\n return [Integer[0], self];\r\n }\r\n if (n.isSmall) {\r\n if (b === 1) return [self, Integer[0]];\r\n if (b == -1) return [self.negate(), Integer[0]];\r\n var abs = Math.abs(b);\r\n if (abs < BASE) {\r\n value = divModSmall(a, abs);\r\n quotient = arrayToSmall(value[0]);\r\n var remainder = value[1];\r\n if (self.sign) remainder = -remainder;\r\n if (typeof quotient === \"number\") {\r\n if (self.sign !== n.sign) quotient = -quotient;\r\n return [new SmallInteger(quotient), new SmallInteger(remainder)];\r\n }\r\n return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];\r\n }\r\n b = smallToArray(abs);\r\n }\r\n var comparison = compareAbs(a, b);\r\n if (comparison === -1) return [Integer[0], self];\r\n if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];\r\n\r\n // divMod1 is faster on smaller input sizes\r\n if (a.length + b.length <= 200)\r\n value = divMod1(a, b);\r\n else value = divMod2(a, b);\r\n\r\n quotient = value[0];\r\n var qSign = self.sign !== n.sign,\r\n mod = value[1],\r\n mSign = self.sign;\r\n if (typeof quotient === \"number\") {\r\n if (qSign) quotient = -quotient;\r\n quotient = new SmallInteger(quotient);\r\n } else quotient = new BigInteger(quotient, qSign);\r\n if (typeof mod === \"number\") {\r\n if (mSign) mod = -mod;\r\n mod = new SmallInteger(mod);\r\n } else mod = new BigInteger(mod, mSign);\r\n return [quotient, mod];\r\n }\r\n\r\n BigInteger.prototype.divmod = function (v) {\r\n var result = divModAny(this, v);\r\n return {\r\n quotient: result[0],\r\n remainder: result[1]\r\n };\r\n };\r\n NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;\r\n\r\n\r\n BigInteger.prototype.divide = function (v) {\r\n return divModAny(this, v)[0];\r\n };\r\n NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {\r\n return new NativeBigInt(this.value / parseValue(v).value);\r\n };\r\n SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;\r\n\r\n BigInteger.prototype.mod = function (v) {\r\n return divModAny(this, v)[1];\r\n };\r\n NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {\r\n return new NativeBigInt(this.value % parseValue(v).value);\r\n };\r\n SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;\r\n\r\n BigInteger.prototype.pow = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value,\r\n value, x, y;\r\n if (b === 0) return Integer[1];\r\n if (a === 0) return Integer[0];\r\n if (a === 1) return Integer[1];\r\n if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.sign) {\r\n return Integer[0];\r\n }\r\n if (!n.isSmall) throw new Error(\"The exponent \" + n.toString() + \" is too large.\");\r\n if (this.isSmall) {\r\n if (isPrecise(value = Math.pow(a, b)))\r\n return new SmallInteger(truncate(value));\r\n }\r\n x = this;\r\n y = Integer[1];\r\n while (true) {\r\n if (b & 1 === 1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === 0) break;\r\n b /= 2;\r\n x = x.square();\r\n }\r\n return y;\r\n };\r\n SmallInteger.prototype.pow = BigInteger.prototype.pow;\r\n\r\n NativeBigInt.prototype.pow = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value, b = n.value;\r\n var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);\r\n if (b === _0) return Integer[1];\r\n if (a === _0) return Integer[0];\r\n if (a === _1) return Integer[1];\r\n if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.isNegative()) return new NativeBigInt(_0);\r\n var x = this;\r\n var y = Integer[1];\r\n while (true) {\r\n if ((b & _1) === _1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === _0) break;\r\n b /= _2;\r\n x = x.square();\r\n }\r\n return y;\r\n }\r\n\r\n BigInteger.prototype.modPow = function (exp, mod) {\r\n exp = parseValue(exp);\r\n mod = parseValue(mod);\r\n if (mod.isZero()) throw new Error(\"Cannot take modPow with modulus 0\");\r\n var r = Integer[1],\r\n base = this.mod(mod);\r\n if (exp.isNegative()) {\r\n exp = exp.multiply(Integer[-1]);\r\n base = base.modInv(mod);\r\n }\r\n while (exp.isPositive()) {\r\n if (base.isZero()) return Integer[0];\r\n if (exp.isOdd()) r = r.multiply(base).mod(mod);\r\n exp = exp.divide(2);\r\n base = base.square().mod(mod);\r\n }\r\n return r;\r\n };\r\n NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;\r\n\r\n function compareAbs(a, b) {\r\n if (a.length !== b.length) {\r\n return a.length > b.length ? 1 : -1;\r\n }\r\n for (var i = a.length - 1; i >= 0; i--) {\r\n if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n\r\n BigInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) return 1;\r\n return compareAbs(a, b);\r\n };\r\n SmallInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = Math.abs(this.value),\r\n b = n.value;\r\n if (n.isSmall) {\r\n b = Math.abs(b);\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n return -1;\r\n };\r\n NativeBigInt.prototype.compareAbs = function (v) {\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n a = a >= 0 ? a : -a;\r\n b = b >= 0 ? b : -b;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n\r\n BigInteger.prototype.compare = function (v) {\r\n // See discussion about comparison with Infinity:\r\n // https://github.com/peterolson/BigInteger.js/issues/61\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (this.sign !== n.sign) {\r\n return n.sign ? 1 : -1;\r\n }\r\n if (n.isSmall) {\r\n return this.sign ? -1 : 1;\r\n }\r\n return compareAbs(a, b) * (this.sign ? -1 : 1);\r\n };\r\n BigInteger.prototype.compareTo = BigInteger.prototype.compare;\r\n\r\n SmallInteger.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) {\r\n return a == b ? 0 : a > b ? 1 : -1;\r\n }\r\n if (a < 0 !== n.sign) {\r\n return a < 0 ? -1 : 1;\r\n }\r\n return a < 0 ? 1 : -1;\r\n };\r\n SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;\r\n\r\n NativeBigInt.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;\r\n\r\n BigInteger.prototype.equals = function (v) {\r\n return this.compare(v) === 0;\r\n };\r\n NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;\r\n\r\n BigInteger.prototype.notEquals = function (v) {\r\n return this.compare(v) !== 0;\r\n };\r\n NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;\r\n\r\n BigInteger.prototype.greater = function (v) {\r\n return this.compare(v) > 0;\r\n };\r\n NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;\r\n\r\n BigInteger.prototype.lesser = function (v) {\r\n return this.compare(v) < 0;\r\n };\r\n NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;\r\n\r\n BigInteger.prototype.greaterOrEquals = function (v) {\r\n return this.compare(v) >= 0;\r\n };\r\n NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;\r\n\r\n BigInteger.prototype.lesserOrEquals = function (v) {\r\n return this.compare(v) <= 0;\r\n };\r\n NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;\r\n\r\n BigInteger.prototype.isEven = function () {\r\n return (this.value[0] & 1) === 0;\r\n };\r\n SmallInteger.prototype.isEven = function () {\r\n return (this.value & 1) === 0;\r\n };\r\n NativeBigInt.prototype.isEven = function () {\r\n return (this.value & BigInt(1)) === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isOdd = function () {\r\n return (this.value[0] & 1) === 1;\r\n };\r\n SmallInteger.prototype.isOdd = function () {\r\n return (this.value & 1) === 1;\r\n };\r\n NativeBigInt.prototype.isOdd = function () {\r\n return (this.value & BigInt(1)) === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isPositive = function () {\r\n return !this.sign;\r\n };\r\n SmallInteger.prototype.isPositive = function () {\r\n return this.value > 0;\r\n };\r\n NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;\r\n\r\n BigInteger.prototype.isNegative = function () {\r\n return this.sign;\r\n };\r\n SmallInteger.prototype.isNegative = function () {\r\n return this.value < 0;\r\n };\r\n NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;\r\n\r\n BigInteger.prototype.isUnit = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isUnit = function () {\r\n return Math.abs(this.value) === 1;\r\n };\r\n NativeBigInt.prototype.isUnit = function () {\r\n return this.abs().value === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isZero = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isZero = function () {\r\n return this.value === 0;\r\n };\r\n NativeBigInt.prototype.isZero = function () {\r\n return this.value === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isDivisibleBy = function (v) {\r\n var n = parseValue(v);\r\n if (n.isZero()) return false;\r\n if (n.isUnit()) return true;\r\n if (n.compareAbs(2) === 0) return this.isEven();\r\n return this.mod(n).isZero();\r\n };\r\n NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;\r\n\r\n function isBasicPrime(v) {\r\n var n = v.abs();\r\n if (n.isUnit()) return false;\r\n if (n.equals(2) || n.equals(3) || n.equals(5)) return true;\r\n if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;\r\n if (n.lesser(49)) return true;\r\n // we don't know if it's prime: let the other functions figure it out\r\n }\r\n\r\n function millerRabinTest(n, a) {\r\n var nPrev = n.prev(),\r\n b = nPrev,\r\n r = 0,\r\n d, t, i, x;\r\n while (b.isEven()) b = b.divide(2), r++;\r\n next: for (i = 0; i < a.length; i++) {\r\n if (n.lesser(a[i])) continue;\r\n x = bigInt(a[i]).modPow(b, n);\r\n if (x.isUnit() || x.equals(nPrev)) continue;\r\n for (d = r - 1; d != 0; d--) {\r\n x = x.square().mod(n);\r\n if (x.isUnit()) return false;\r\n if (x.equals(nPrev)) continue next;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Set \"strict\" to true to force GRH-supported lower bound of 2*log(N)^2\r\n BigInteger.prototype.isPrime = function (strict) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var bits = n.bitLength();\r\n if (bits <= 64)\r\n return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\r\n var logN = Math.log(2) * bits.toJSNumber();\r\n var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt(i + 2));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;\r\n\r\n BigInteger.prototype.isProbablePrime = function (iterations, rng) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var t = iterations === undefined ? 5 : iterations;\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt.randBetween(2, n.minus(2), rng));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;\r\n\r\n BigInteger.prototype.modInv = function (n) {\r\n var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;\r\n while (!newR.isZero()) {\r\n q = r.divide(newR);\r\n lastT = t;\r\n lastR = r;\r\n t = newT;\r\n r = newR;\r\n newT = lastT.subtract(q.multiply(newT));\r\n newR = lastR.subtract(q.multiply(newR));\r\n }\r\n if (!r.isUnit()) throw new Error(this.toString() + \" and \" + n.toString() + \" are not co-prime\");\r\n if (t.compare(0) === -1) {\r\n t = t.add(n);\r\n }\r\n if (this.isNegative()) {\r\n return t.negate();\r\n }\r\n return t;\r\n };\r\n\r\n NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;\r\n\r\n BigInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return subtractSmall(value, 1, this.sign);\r\n }\r\n return new BigInteger(addSmall(value, 1), this.sign);\r\n };\r\n SmallInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (value + 1 < MAX_INT) return new SmallInteger(value + 1);\r\n return new BigInteger(MAX_INT_ARR, false);\r\n };\r\n NativeBigInt.prototype.next = function () {\r\n return new NativeBigInt(this.value + BigInt(1));\r\n }\r\n\r\n BigInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return new BigInteger(addSmall(value, 1), true);\r\n }\r\n return subtractSmall(value, 1, this.sign);\r\n };\r\n SmallInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);\r\n return new BigInteger(MAX_INT_ARR, true);\r\n };\r\n NativeBigInt.prototype.prev = function () {\r\n return new NativeBigInt(this.value - BigInt(1));\r\n }\r\n\r\n var powersOfTwo = [1];\r\n while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);\r\n var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];\r\n\r\n function shift_isSmall(n) {\r\n return Math.abs(n) <= BASE;\r\n }\r\n\r\n BigInteger.prototype.shiftLeft = function (v) {\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftRight(-n);\r\n var result = this;\r\n if (result.isZero()) return result;\r\n while (n >= powers2Length) {\r\n result = result.multiply(highestPower2);\r\n n -= powers2Length - 1;\r\n }\r\n return result.multiply(powersOfTwo[n]);\r\n };\r\n NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;\r\n\r\n BigInteger.prototype.shiftRight = function (v) {\r\n var remQuo;\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftLeft(-n);\r\n var result = this;\r\n while (n >= powers2Length) {\r\n if (result.isZero() || (result.isNegative() && result.isUnit())) return result;\r\n remQuo = divModAny(result, highestPower2);\r\n result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n n -= powers2Length - 1;\r\n }\r\n remQuo = divModAny(result, powersOfTwo[n]);\r\n return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n };\r\n NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;\r\n\r\n function bitwise(x, y, fn) {\r\n y = parseValue(y);\r\n var xSign = x.isNegative(), ySign = y.isNegative();\r\n var xRem = xSign ? x.not() : x,\r\n yRem = ySign ? y.not() : y;\r\n var xDigit = 0, yDigit = 0;\r\n var xDivMod = null, yDivMod = null;\r\n var result = [];\r\n while (!xRem.isZero() || !yRem.isZero()) {\r\n xDivMod = divModAny(xRem, highestPower2);\r\n xDigit = xDivMod[1].toJSNumber();\r\n if (xSign) {\r\n xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers\r\n }\r\n\r\n yDivMod = divModAny(yRem, highestPower2);\r\n yDigit = yDivMod[1].toJSNumber();\r\n if (ySign) {\r\n yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers\r\n }\r\n\r\n xRem = xDivMod[0];\r\n yRem = yDivMod[0];\r\n result.push(fn(xDigit, yDigit));\r\n }\r\n var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);\r\n for (var i = result.length - 1; i >= 0; i -= 1) {\r\n sum = sum.multiply(highestPower2).add(bigInt(result[i]));\r\n }\r\n return sum;\r\n }\r\n\r\n BigInteger.prototype.not = function () {\r\n return this.negate().prev();\r\n };\r\n NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;\r\n\r\n BigInteger.prototype.and = function (n) {\r\n return bitwise(this, n, function (a, b) { return a & b; });\r\n };\r\n NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;\r\n\r\n BigInteger.prototype.or = function (n) {\r\n return bitwise(this, n, function (a, b) { return a | b; });\r\n };\r\n NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;\r\n\r\n BigInteger.prototype.xor = function (n) {\r\n return bitwise(this, n, function (a, b) { return a ^ b; });\r\n };\r\n NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;\r\n\r\n var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;\r\n function roughLOB(n) { // get lowestOneBit (rough)\r\n // SmallInteger: return Min(lowestOneBit(n), 1 << 30)\r\n // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]\r\n var v = n.value,\r\n x = typeof v === \"number\" ? v | LOBMASK_I :\r\n typeof v === \"bigint\" ? v | BigInt(LOBMASK_I) :\r\n v[0] + v[1] * BASE | LOBMASK_BI;\r\n return x & -x;\r\n }\r\n\r\n function integerLogarithm(value, base) {\r\n if (base.compareTo(value) <= 0) {\r\n var tmp = integerLogarithm(value, base.square(base));\r\n var p = tmp.p;\r\n var e = tmp.e;\r\n var t = p.multiply(base);\r\n return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };\r\n }\r\n return { p: bigInt(1), e: 0 };\r\n }\r\n\r\n BigInteger.prototype.bitLength = function () {\r\n var n = this;\r\n if (n.compareTo(bigInt(0)) < 0) {\r\n n = n.negate().subtract(bigInt(1));\r\n }\r\n if (n.compareTo(bigInt(0)) === 0) {\r\n return bigInt(0);\r\n }\r\n return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));\r\n }\r\n NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;\r\n\r\n function max(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.greater(b) ? a : b;\r\n }\r\n function min(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.lesser(b) ? a : b;\r\n }\r\n function gcd(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n if (a.equals(b)) return a;\r\n if (a.isZero()) return b;\r\n if (b.isZero()) return a;\r\n var c = Integer[1], d, t;\r\n while (a.isEven() && b.isEven()) {\r\n d = min(roughLOB(a), roughLOB(b));\r\n a = a.divide(d);\r\n b = b.divide(d);\r\n c = c.multiply(d);\r\n }\r\n while (a.isEven()) {\r\n a = a.divide(roughLOB(a));\r\n }\r\n do {\r\n while (b.isEven()) {\r\n b = b.divide(roughLOB(b));\r\n }\r\n if (a.greater(b)) {\r\n t = b; b = a; a = t;\r\n }\r\n b = b.subtract(a);\r\n } while (!b.isZero());\r\n return c.isUnit() ? a : a.multiply(c);\r\n }\r\n function lcm(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n return a.divide(gcd(a, b)).multiply(b);\r\n }\r\n function randBetween(a, b, rng) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n var usedRNG = rng || Math.random;\r\n var low = min(a, b), high = max(a, b);\r\n var range = high.subtract(low).add(1);\r\n if (range.isSmall) return low.add(Math.floor(usedRNG() * range));\r\n var digits = toBase(range, BASE).value;\r\n var result = [], restricted = true;\r\n for (var i = 0; i < digits.length; i++) {\r\n var top = restricted ? digits[i] + (i + 1 < digits.length ? digits[i + 1] / BASE : 0) : BASE;\r\n var digit = truncate(usedRNG() * top);\r\n result.push(digit);\r\n if (digit < digits[i]) restricted = false;\r\n }\r\n return low.add(Integer.fromArray(result, BASE, false));\r\n }\r\n\r\n var parseBase = function (text, base, alphabet, caseSensitive) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n text = String(text);\r\n if (!caseSensitive) {\r\n text = text.toLowerCase();\r\n alphabet = alphabet.toLowerCase();\r\n }\r\n var length = text.length;\r\n var i;\r\n var absBase = Math.abs(base);\r\n var alphabetValues = {};\r\n for (i = 0; i < alphabet.length; i++) {\r\n alphabetValues[alphabet[i]] = i;\r\n }\r\n for (i = 0; i < length; i++) {\r\n var c = text[i];\r\n if (c === \"-\") continue;\r\n if (c in alphabetValues) {\r\n if (alphabetValues[c] >= absBase) {\r\n if (c === \"1\" && absBase === 1) continue;\r\n throw new Error(c + \" is not a valid digit in base \" + base + \".\");\r\n }\r\n }\r\n }\r\n base = parseValue(base);\r\n var digits = [];\r\n var isNegative = text[0] === \"-\";\r\n for (i = isNegative ? 1 : 0; i < text.length; i++) {\r\n var c = text[i];\r\n if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));\r\n else if (c === \"<\") {\r\n var start = i;\r\n do { i++; } while (text[i] !== \">\" && i < text.length);\r\n digits.push(parseValue(text.slice(start + 1, i)));\r\n }\r\n else throw new Error(c + \" is not a valid character\");\r\n }\r\n return parseBaseFromArray(digits, base, isNegative);\r\n };\r\n\r\n function parseBaseFromArray(digits, base, isNegative) {\r\n var val = Integer[0], pow = Integer[1], i;\r\n for (i = digits.length - 1; i >= 0; i--) {\r\n val = val.add(digits[i].times(pow));\r\n pow = pow.times(base);\r\n }\r\n return isNegative ? val.negate() : val;\r\n }\r\n\r\n function stringify(digit, alphabet) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n if (digit < alphabet.length) {\r\n return alphabet[digit];\r\n }\r\n return \"<\" + digit + \">\";\r\n }\r\n\r\n function toBase(n, base) {\r\n base = bigInt(base);\r\n if (base.isZero()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n throw new Error(\"Cannot convert nonzero numbers to base 0.\");\r\n }\r\n if (base.equals(-1)) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n if (n.isNegative())\r\n return {\r\n value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))\r\n .map(Array.prototype.valueOf, [1, 0])\r\n ),\r\n isNegative: false\r\n };\r\n\r\n var arr = Array.apply(null, Array(n.toJSNumber() - 1))\r\n .map(Array.prototype.valueOf, [0, 1]);\r\n arr.unshift([1]);\r\n return {\r\n value: [].concat.apply([], arr),\r\n isNegative: false\r\n };\r\n }\r\n\r\n var neg = false;\r\n if (n.isNegative() && base.isPositive()) {\r\n neg = true;\r\n n = n.abs();\r\n }\r\n if (base.isUnit()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n\r\n return {\r\n value: Array.apply(null, Array(n.toJSNumber()))\r\n .map(Number.prototype.valueOf, 1),\r\n isNegative: neg\r\n };\r\n }\r\n var out = [];\r\n var left = n, divmod;\r\n while (left.isNegative() || left.compareAbs(base) >= 0) {\r\n divmod = left.divmod(base);\r\n left = divmod.quotient;\r\n var digit = divmod.remainder;\r\n if (digit.isNegative()) {\r\n digit = base.minus(digit).abs();\r\n left = left.next();\r\n }\r\n out.push(digit.toJSNumber());\r\n }\r\n out.push(left.toJSNumber());\r\n return { value: out.reverse(), isNegative: neg };\r\n }\r\n\r\n function toBaseString(n, base, alphabet) {\r\n var arr = toBase(n, base);\r\n return (arr.isNegative ? \"-\" : \"\") + arr.value.map(function (x) {\r\n return stringify(x, alphabet);\r\n }).join('');\r\n }\r\n\r\n BigInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n SmallInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n NativeBigInt.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n BigInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix !== 10) return toBaseString(this, radix, alphabet);\r\n var v = this.value, l = v.length, str = String(v[--l]), zeros = \"0000000\", digit;\r\n while (--l >= 0) {\r\n digit = String(v[l]);\r\n str += zeros.slice(digit.length) + digit;\r\n }\r\n var sign = this.sign ? \"-\" : \"\";\r\n return sign + str;\r\n };\r\n\r\n SmallInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix != 10) return toBaseString(this, radix, alphabet);\r\n return String(this.value);\r\n };\r\n\r\n NativeBigInt.prototype.toString = SmallInteger.prototype.toString;\r\n\r\n NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }\r\n\r\n BigInteger.prototype.valueOf = function () {\r\n return parseInt(this.toString(), 10);\r\n };\r\n BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;\r\n\r\n SmallInteger.prototype.valueOf = function () {\r\n return this.value;\r\n };\r\n SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;\r\n NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {\r\n return parseInt(this.toString(), 10);\r\n }\r\n\r\n function parseStringValue(v) {\r\n if (isPrecise(+v)) {\r\n var x = +v;\r\n if (x === truncate(x))\r\n return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);\r\n throw new Error(\"Invalid integer: \" + v);\r\n }\r\n var sign = v[0] === \"-\";\r\n if (sign) v = v.slice(1);\r\n var split = v.split(/e/i);\r\n if (split.length > 2) throw new Error(\"Invalid integer: \" + split.join(\"e\"));\r\n if (split.length === 2) {\r\n var exp = split[1];\r\n if (exp[0] === \"+\") exp = exp.slice(1);\r\n exp = +exp;\r\n if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error(\"Invalid integer: \" + exp + \" is not a valid exponent.\");\r\n var text = split[0];\r\n var decimalPlace = text.indexOf(\".\");\r\n if (decimalPlace >= 0) {\r\n exp -= text.length - decimalPlace - 1;\r\n text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);\r\n }\r\n if (exp < 0) throw new Error(\"Cannot include negative exponent part for integers\");\r\n text += (new Array(exp + 1)).join(\"0\");\r\n v = text;\r\n }\r\n var isValid = /^([0-9][0-9]*)$/.test(v);\r\n if (!isValid) throw new Error(\"Invalid integer: \" + v);\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(sign ? \"-\" + v : v));\r\n }\r\n var r = [], max = v.length, l = LOG_BASE, min = max - l;\r\n while (max > 0) {\r\n r.push(+v.slice(min, max));\r\n min -= l;\r\n if (min < 0) min = 0;\r\n max -= l;\r\n }\r\n trim(r);\r\n return new BigInteger(r, sign);\r\n }\r\n\r\n function parseNumberValue(v) {\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(v));\r\n }\r\n if (isPrecise(v)) {\r\n if (v !== truncate(v)) throw new Error(v + \" is not an integer.\");\r\n return new SmallInteger(v);\r\n }\r\n return parseStringValue(v.toString());\r\n }\r\n\r\n function parseValue(v) {\r\n if (typeof v === \"number\") {\r\n return parseNumberValue(v);\r\n }\r\n if (typeof v === \"string\") {\r\n return parseStringValue(v);\r\n }\r\n if (typeof v === \"bigint\") {\r\n return new NativeBigInt(v);\r\n }\r\n return v;\r\n }\r\n // Pre-define numbers in range [-999,999]\r\n for (var i = 0; i < 1000; i++) {\r\n Integer[i] = parseValue(i);\r\n if (i > 0) Integer[-i] = parseValue(-i);\r\n }\r\n // Backwards compatibility\r\n Integer.one = Integer[1];\r\n Integer.zero = Integer[0];\r\n Integer.minusOne = Integer[-1];\r\n Integer.max = max;\r\n Integer.min = min;\r\n Integer.gcd = gcd;\r\n Integer.lcm = lcm;\r\n Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };\r\n Integer.randBetween = randBetween;\r\n\r\n Integer.fromArray = function (digits, base, isNegative) {\r\n return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);\r\n };\r\n\r\n return Integer;\r\n})();\r\n\r\n// Node.js check\r\nif (typeof module !== \"undefined\" && module.hasOwnProperty(\"exports\")) {\r\n module.exports = bigInt;\r\n}\r\n\r\n//amd check\r\nif (typeof define === \"function\" && define.amd) {\r\n define( function () {\r\n return bigInt;\r\n });\r\n}\r\n","/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,o=0;for(;0!==i;){o=i>2e3?2e3:i,i-=o;do{a=a+t[n++]|0,r=r+a|0}while(--o);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,o=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,o,s,l,d,f,c,h,u,w,b,k,m,_,g,p,v,x,y,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),o=a+(e.avail_out-257),s=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,c=A.window,h=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,h>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(h&(1<>>=g,u-=g),u<15&&(h+=E[i++]<>>24,h>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(h&(1<s){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(h>>>=g,u-=g,g=a-r,v>g){if(g=v-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(x=0,y=c,0===f){if(x+=l-g,g2;)R[a++]=y[x++],R[a++]=y[x++],R[a++]=y[x++],p-=3;p&&(R[a++]=y[x++],p>1&&(R[a++]=y[x++]))}else{x=a-v;do{R[a++]=R[x++],R[a++]=R[x++],R[a++]=R[x++],p-=3}while(p>2);p&&(R[a++]=R[x++],p>1&&(R[a++]=R[x++]))}break}}break}}while(i>3,i-=p,u-=p<<3,h&=(1<{const u=h.bits;let w,b,k,m,_,g,p=0,v=0,x=0,y=0,E=0,R=0,A=0,Z=0,S=0,T=0,O=null,U=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(p=0;p<=r;p++)D[p]=0;for(v=0;v=1&&0===D[y];y--);if(E>y&&(E=y),0===y)return a[f++]=20971520,a[f++]=20971520,h.bits=1,0;for(x=1;x0&&(0===e||1!==y))return-1;for(I[1]=0,p=1;p852||2===e&&S>592)return 1;for(;;){B=p-A,c[v]g?(N=z[F+c[v]],C=O[U+c[v]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(T&=w-1,T+=w):T=0,v++,0==--D[p]){if(p===y)break;p=t[i+c[v]]}if(p>E&&(T&m)!==k){for(0===A&&(A=E),_+=x,R=p-A,Z=1<852||2===e&&S>592)return 1;k=T&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==T&&(a[_+T]=p-A<<24|64<<16|0),h.bits=E,0},c={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:h,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:p,Z_BUF_ERROR:v,Z_DEFLATED:x}=c,y=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},T=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},O=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=T(e,t);return n!==b&&(e.state=null),n};let U,D,I=!0;const B=e=>{if(I){U=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,U,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=U,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveO(e,15),inflateInit2:O,inflate:(e,i)=>{let r,o,s,l,d,c,A,Z,S,T,O,U,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===y&&(r.mode=13),d=e.next_out,s=e.output,A=e.avail_out,l=e.next_in,o=e.input,c=e.avail_in,Z=r.hold,S=r.bits,T=c,O=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===c)break e;c--,Z+=o[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==x){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===c)break e;c--,Z+=o[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===c)break e;c--,Z+=o[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===c)break e;c--,Z+=o[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(U=r.length,U>c&&(U=c),U&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(o.subarray(l,l+U),j)),512&r.flags&&(r.check=n(r.check,o,U,l)),c-=U,l+=U,r.length-=U),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===c)break e;U=0;do{j=o[l+U++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&U>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=y;break;case 10:for(;S<32;){if(0===c)break e;c--,Z+=o[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===c)break e;c--,Z+=o[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===c)break e;c--,Z+=o[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(U=r.length,U){if(U>c&&(U=c),U>A&&(U=A),0===U)break e;s.set(o.subarray(l,l+U),d),c-=U,l+=U,A-=U,d+=U,r.length-=U;break}r.mode=y;break;case 17:for(;S<14;){if(0===c)break e;c--,Z+=o[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===c)break e;c--,Z+=o[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],U=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,U=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,U=11+(127&Z),Z>>>=7,S-=7}if(r.have+U>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;U--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(c>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=c,r.hold=Z,r.bits=S,a(e,O),d=e.next_out,s=e.output,A=e.avail_out,l=e.next_in,o=e.input,c=e.avail_in,Z=r.hold,S=r.bits,r.mode===y&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===c)break e;c--,Z+=o[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===c)break e;c--,Z+=o[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=y;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===c)break e;c--,Z+=o[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===c)break e;c--,Z+=o[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(U=O-A,r.offset>U){if(U=r.offset-U,U>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}U>r.wnext?(U-=r.wnext,D=r.wsize-U):D=r.wnext-U,U>r.length&&(U=r.length),I=r.window}else I=s,D=d-r.offset,U=r.length;U>A&&(U=A),A-=U,r.length-=U;do{s[d++]=I[D++]}while(--U);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;s[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===c)break e;c--,Z|=o[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,o;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(o=N(e,i,n,n),o?(a.mode=31,p):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{if(\"function\"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,n,a,r,o=e.length,s=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{const i=t||e.length;if(\"function\"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,a;const r=new Array(2*i);for(a=0,n=0;n4)r[a++]=65533,n+=o-1;else{for(t&=2===o?31:3===o?15:7;o>1&&n1?r[a++]=65533:t<65536?r[a++]=t:(t-=65536,r[a++]=55296|t>>10&1023,r[a++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=c;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,o,s;if(this.ended)return!1;for(o=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,o),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,o):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,o);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(s=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==s){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,oe=ae,se=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=c,fe={Inflate:re,inflate:oe,inflateRaw:se,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=oe,e.inflateRaw=se,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\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\tid: moduleId,\n\t\tloaded: false,\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// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\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 bufferConcats from \"../helpers/bytes/bufferConcats\";\nimport bytesFromHex from \"../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../helpers/bytes/bytesToHex\";\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n};\n\n/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n }\n}.finally; */\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\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 Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\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 for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\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 { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\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 MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1460809483,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-818518751,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-516145888,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":1370914559,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessagePeerReaction\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-396644838,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-2099097129,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"}]},\"layer\":138} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from \"big-integer\";\nimport intToUint from \"../number/intToUint\";\n\nexport default function longFromInts(high: number, low: number): string {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low)).toString(10);\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport longFromInts from '../../helpers/long/longFromInts';\n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n const {quotient, remainder} = bigInt(sLong).divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","import bigInt from 'big-integer';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n","import { bigIntFromBytes, bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","import bufferConcats from \"./bufferConcats\";\n\nexport default function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\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 cryptoWorker from \"../crypto/cryptoworker\";\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport addPadding from \"../../helpers/bytes/addPadding\";\r\nimport bufferConcats from \"../../helpers/bytes/bufferConcats\";\r\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\r\nimport convertToUint8Array from \"../../helpers/bytes/convertToUint8Array\";\r\nimport bigInt from 'big-integer';\r\nimport { bigIntFromBytes, bigIntToBytes } from \"../../helpers/bigInt/bigIntConversion\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\r\n\r\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\r\n\r\n return buffer;\r\n}\r\n\r\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n\r\n const p = bigIntFromBytes(algo.p);\r\n const g = bigInt(algo.g);\r\n\r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = bigInt(bytesToHex(pw_hash), 16);\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = g.modPow(x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bigIntToBytes(v);\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = bigIntFromBytes(state.srp_B);\r\n \r\n const pForHash = padArray(bigIntToBytes(p), 256);\r\n const gForHash = padArray(bigIntToBytes(g), 256);\r\n const b_for_hash = padArray(bigIntToBytes(B), 256);\r\n\r\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\r\n const k = bigIntFromBytes(kHash);\r\n\r\n const k_v = k.multiply(v).mod(p);\r\n\r\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\r\n const diff = prime.subtract(modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(diff.isNegative() ||\r\n diff.bitLength().toJSNumber() < min_diff_bits_count || \r\n modexp.bitLength().toJSNumber() < min_diff_bits_count || \r\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = bigIntFromBytes(flipper(state.secure_random));\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n const A = g.modPow(a, p);\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bigIntToBytes(A);\r\n\r\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\r\n const u = bigInt(s.hex, 16);\r\n if(!u.isZero() && !u.isNegative())\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n let g_b: bigInt.BigInteger;\r\n if(!B.greater(k_v)) {\r\n g_b = B.add(p);\r\n } else g_b = B;\r\n g_b = g_b.subtract(k_v).mod(p);\r\n\r\n const ux = u.multiply(x);\r\n const a_ux = a.add(ux);\r\n const S = g_b.modPow(a_ux, p);\r\n\r\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\r\n\r\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\r\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(\r\n h1, \r\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\r\n\r\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n };\r\n\r\n return out;\r\n}\r\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","import convertToUint8Array from \"./convertToUint8Array\";\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n //console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n //console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","import subtle from \"../subtle\";\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n","import type { RSAPublicKeyHex } from \"../../mtproto/rsaKeysManager\";\nimport bytesModPow from \"../../../helpers/bytes/bytesModPow\";\nimport bytesFromHex from \"../../../helpers/bytes/bytesFromHex\";\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\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\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from \"big-integer\";\nimport { nextRandomUint } from \"../random\";\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\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\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from \"big-integer\";\nimport { bigIntFromBytes, bigIntToBytes } from \"../../../../helpers/bigInt/bigIntConversion\";\nimport bigIntRandom from \"../../../../helpers/bigInt/bigIntRandom\";\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do \n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0], \n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n \n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map(b => bigIntToBytes(b)) as any;\n}\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 bigInt from \"big-integer\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport { MessagesDhConfig } from \"../../layer\";\nimport CallInstance from \"../calls/callInstance\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n \n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = new Uint8Array(p.length).randomize();\n // const a = new Uint8Array(4).randomize();\n \n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n \n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n \n return a;\n }\n };\n \n const a = generateA(p);\n // const a = new Uint8Array([0]);\n \n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n \n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n \n return dh;\n}\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 { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport cryptoWorker from \"./cryptoworker\";\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse(); // key_fingerprint: key_fingerprint as any // ! it doesn't work\n const key_fingerprint_long = bigIntFromBytes(key_fingerprint).toString(10); // bigInt2str(str2bigInt(bytesToHex(key_fingerprint), 16), 10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\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 cryptoWorker from '../../crypto/cryptoworker';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n \n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from '../../config/debug';\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\n\n \nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport computeSRP from './srp';\nimport { aesEncryptSync, aesDecryptSync } from './utils/aesIGE';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport generateDh from './generateDh';\nimport computeDhKey from './computeDhKey';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\n// import factorizeTdlibPQ from './utils/factorize/tdlib';\n \n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\nclass CryptoWorker extends CryptoWorkerMethods {\n private webWorker: Worker | boolean = false;\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n private debug = false;\n\n private utils: CryptoMethods;\n\n constructor() {\n super();\n console.log('CW constructor');\n\n \n this.utils = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ, \n // 'factorize-new-new': pqPrimeLeemonNew, \n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint\n };\n\n // Promise.all([\n // import('./crypto_utils').then(utils => {\n // Object.assign(this.utils, {\n // 'sha1-hash': utils.sha1HashSync,\n // 'sha256-hash': utils.sha256HashSync,\n // 'pbkdf2': utils.hash_pbkdf2,\n // 'aes-encrypt': utils.aesEncryptSync,\n // 'aes-decrypt': utils.aesDecryptSync,\n // 'rsa-encrypt': utils.rsaEncrypt,\n // 'factorize': utils.pqPrimeFactorization,\n // 'mod-pow': utils.bytesModPow,\n // 'gzipUncompress': utils.gzipUncompress,\n // });\n // }),\n\n // import('./srp').then(srp => {\n // this.utils.computeSRP = srp.computeSRP;\n // })/* ,\n\n // import('../bin_utils').then(utils => {\n // this.utils.unzip = utils.gzipUncompress;\n // }) */\n // ]);\n\n return;\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n }\n\n \n \n \n \n \n \n \n \n \n \n\n public performTaskWorker(task: string, ...args: any[]) {\n this.debug && console.log('CW start', task, args);\n\n \n // @ts-ignore\n return Promise.resolve(this.utils[task](...args));\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n }\n\n \n \n \n \n \n \n\n \n \n \n \n}\n\nconst cryptoWorker = new CryptoWorker();\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\nexport default cryptoWorker;\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 bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport type gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport type { Awaited } from \"../../types\";\r\nimport type getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport type computeDhKey from \"./computeDhKey\";\r\nimport type generateDh from \"./generateDh\";\r\nimport type computeSRP from \"./srp\";\r\nimport type { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport type factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\n// import type factorizeTdlibPQ from \"./utils/factorize/tdlib\";\r\nimport type pbkdf2 from \"./utils/pbkdf2\";\r\nimport type rsaEncrypt from \"./utils/rsa\";\r\nimport type sha1 from \"./utils/sha1\";\r\nimport type sha256 from \"./utils/sha256\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1': typeof sha1,\r\n 'sha256': typeof sha256,\r\n 'pbkdf2': typeof pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': typeof factorizeTdlibPQ,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP,\r\n 'generate-dh': typeof generateDh,\r\n 'compute-dh-key': typeof computeDhKey,\r\n 'get-emojis-fingerprint': typeof getEmojisFingerprint\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(\r\n method: Method, \r\n ...args: Parameters\r\n ): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\nimport longFromInts from '../../helpers/long/longFromInts';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\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","/*\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 DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.0',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","export default function noop() {}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\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\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\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 { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\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\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport bytesFromWordss from \"../../../helpers/bytes/bytesFromWordss\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n public counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this.counter = initialValue;\r\n }\r\n\r\n public increment() {\r\n const counter = this.counter;\r\n for(let i = 15; i >= 0; --i) {\r\n if(counter[i] === 255) {\r\n counter[i] = 0;\r\n } else {\r\n ++counter[i];\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n #counter: Counter;\r\n #remainingCounter: Uint8Array;\r\n #remainingCounterIndex: number;\r\n #aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this.#counter = new Counter(counter);\r\n this.#aes = new AES(key);\r\n this.#remainingCounterIndex = 16;\r\n }\r\n\r\n public update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; ++i) {\r\n if(this.#remainingCounterIndex === 16) {\r\n this.#remainingCounter = new Uint8Array(bytesFromWordss(this.#aes.encrypt(this.#counter.counter)));\r\n this.#remainingCounterIndex = 0;\r\n this.#counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this.#remainingCounter[this.#remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private encNew: CTR;\r\n private decNew: CTR;\r\n // private cryptoEncKey: CryptoKey;\r\n // encIv: Uint8Array;\r\n\r\n public /* async */ init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n initPayload.randomize();\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = /* await */ this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\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 { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\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 enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\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 Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = /* async */() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = /* await */ this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\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 { notifyAll } from \"../../../helpers/context\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\nimport { MTConnection } from \"./transport\";\n\nlet socketId = 0;\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\n type: 'socketProxy',\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\n};\n\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\n type: 'setup',\n payload: {\n dcId: number,\n url: string,\n logSuffix: string\n },\n id: number\n};\n\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\n type: 'send',\n payload: Uint8Array,\n id: number\n};\n\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\n type: 'close',\n id: number\n};\n\n \nexport default class SocketProxied extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private id: number;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n this.id = ++socketId;\n socketsProxied.set(this.id, this);\n\n const task: SocketProxyTask = {\n type: 'socketProxy',\n payload: {\n type: 'setup', \n payload: {\n dcId, \n url,\n logSuffix\n },\n id: this.id\n }\n };\n\n notifyAll(task);\n }\n\n public send(payload: Uint8Array) {\n const task: SocketProxyTask = {\n type: 'socketProxy', \n payload: {\n type: 'send',\n payload,\n id: this.id\n }\n };\n\n notifyAll(task);\n }\n\n public close() {\n const task: SocketProxyTask = {\n type: 'socketProxy',\n payload: {\n type: 'close',\n id: this.id\n }\n };\n\n notifyAll(task);\n }\n}\n \n\nexport const socketsProxied: Map = new Map();\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport { IS_SAFARI } from '../../environment/userAgent';\nimport { IS_WEB_WORKER } from '../../helpers/context';\nimport SocketProxied from './transports/socketProxied';\nimport { DcId } from '../../types';\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test\n ? [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ]\n : [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\n const path = 'apiws' + TEST_SUFFIX;\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(let dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId, \n connectionType: ConnectionType = 'client', \n transportType: TransportType = Modes.transport, \n reuse = true\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n const suffix = connectionType === 'client' ? '' : '-1';\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\n \n \n \n \n \n \n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n \n if(reuse) {\n transports.push(transport);\n }\n \n return transport;\n }\n \n return transports[0];\n }\n \n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n\nexport default new DcConfigurator();\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 App from \"../../../config/app\";\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => websocketPromise.resolve(false), timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\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 { pause } from '../../../helpers/schedulers/pause';\nimport { DcId } from '../../../types';\nimport { logger, LogTypes } from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void, \n reject: any, \n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n \n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n \n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then(buffer => {\n this.log.error('not 200', \n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then(buffer => {\n return new Uint8Array(buffer);\n }); \n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach(pending => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport dcConfigurator, { DcConfigurator } from './dcConfigurator';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: {\n resolve: any,\n reject: any\n },\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, this.transport);\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n if(transport.connected && (transport as TcpObfuscated).connection) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n this.resend();\n }\n\n public destroy() {\n this.changeTransport();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // /* if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).connection.close();\n // }\n\n // return;\n // } */\n\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n noResponseMsgs.forEach((msgId) => {\n if(this.sentMessages[msgId]) {\n const deferred = this.sentMessages[msgId].deferred;\n delete this.sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n });\n\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport.send(requestData) as any;\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n });\n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + authKeyId.hex);\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n /* if(this.debug) {\n this.log('process message', message, messageId, sessionId);\n } */\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n const changedOffset = timeManager.applyServerTime(bigInt(messageId).shiftRight(32).toJSNumber());\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","import bigInt from \"big-integer\";\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map(bigInt => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport { bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n \n return bytes;\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 * 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 { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\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 { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport Modes from \"../../config/modes\";\r\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from \"./transports/controller\";\n \n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport DEBUG from \"../../config/debug\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport bigInt from \"big-integer\";\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', auth.nonce.hex);\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = new Uint8Array(32).randomize();\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = new Uint8Array(256).randomize();\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: new Uint8Array(16).randomize()\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\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 * 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 blobConstruct from '../helpers/blob/blobConstruct';\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 default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.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\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 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 createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\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({type: '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 // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\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 }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): 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(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\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[]) {\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(', ') : '');\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]) as 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[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): 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 return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\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.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 transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\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 requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\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","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { UserAuth } from './mtproto_config';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, { MTMessage } from './networker';\nimport networkerFactory from './networkerFactory';\n//import { telegramMeWebService } from './mtproto';\nimport authorizer from './authorizer';\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\nimport { logger } from '../logger';\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\nimport type { MethodDeclMap } from '../../layer';\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\n//import { clamp } from '../../helpers/number';\nimport { IS_SAFARI } from '../../environment/userAgent';\nimport App from '../../config/app';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport IDBStorage from '../idb';\nimport CryptoWorker from \"../crypto/cryptoworker\";\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\n\n \n \n \n\n \nimport transportController from './transports/controller';\n \n\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\nnetworker.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: [\"6888292542796810828\"]\n}, {\n notContentRelated: true\n}).then(res => {\n console.log('status', res);\n}); */\n\n//console.error('apiManager included!');\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\n\nexport type ApiError = Partial<{\n code: number,\n type: string,\n description: string,\n originalError: any,\n stack: string,\n handled: boolean,\n input: string,\n message: ApiError\n}>;\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nexport class ApiManager {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n \n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n \n //public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n \n constructor() {\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n }\n\n //private lol = false;\n \n // constructor() {\n //MtpSingleInstanceService.start();\n \n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n \n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n info.networker.changeTransport(transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n \n public async setUserAuth(userAuth: UserAuth) {\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n \n //this.telegramMeNotify(true);\n\n \n \n \n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then(networker => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n \n public async logOut() {\n const storageKeys: Array = [];\n \n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n \n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\n \n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = () => {\n //console.error('apiManager: logOut clear');\n \n this.baseDcId = undefined;\n //this.telegramMeNotify(false);\n IDBStorage.closeDatabases();\n self.postMessage({type: 'clear'});\n };\n\n setTimeout(clear, 1e3);\n\n //return;\n \n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n \n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n //const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n \n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\n if(networkers.length >= maxNetworkers) {\n let i = networkers.length - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n \n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n \n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n \n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n \n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n \n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await authorizer.auth(dcId);\n \n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n \n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n \n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n networker.changeTransport(transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n \n const checkPromise: Promise = networker.isFileNetworker ? \n Promise.resolve(true) : \n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\n checkPromise.then(canRelease => {\n if(networker.onDrain) {\n return;\n }\n \n if(canRelease) {\n networker.onDrain = () => {\n this.log('networker drain', networker.dcId);\n\n networker.onDrain = undefined;\n networker.destroy();\n networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n };\n\n networker.setDrainTimeout();\n }\n });\n }\n \n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n ///////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n //this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = (error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n \n deferred.reject(error);\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n return;\n }\n \n if(error.code === 406) {\n error.handled = true;\n }\n \n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n \n error.handled = true;\n }\n }, 100);\n }\n };\n \n let dcId: DcId;\n \n let cachedNetworker: MTPNetworker;\n let stack = (new Error()).stack || 'empty stack';\n const performRequest = (networker: MTPNetworker) => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.then(deferred.resolve, (error: ApiError) => {\n //if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n \n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n //this.telegramMeNotify(false);\n }\n \n rejectPromise(error);\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n \n this.cachedExportPromise[dcId] = promise;\n }\n \n this.cachedExportPromise[dcId].then(() => {\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\n }, rejectPromise);\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n \n this.getNetworker(newDcId, options).then((networker) => {\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\n }, rejectPromise);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n this.getNetworker(newDcId, options).then((networker) => {\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\n }, rejectPromise);\n } else {\n rejectPromise(error);\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n networkerFactory.unsetConnectionInited();\n performRequest(cachedNetworker);\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n \n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\n return rejectPromise(error);\n }\n \n setTimeout(() => {\n performRequest(cachedNetworker);\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) after.promise.then(() => performRequest(cachedNetworker));\n else performRequest(cachedNetworker);\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n return rejectPromise(error);\n }\n }\n \n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n setTimeout(() => {\n performRequest(cachedNetworker);\n }, options.waitTime * 1000);\n } else if(error.type === 'UNKNOWN') {\n setTimeout(() => {\n performRequest(cachedNetworker);\n }, 1000);\n } else {\n rejectPromise(error);\n }\n });\n }\n \n if(dcId = (options.dcId || this.baseDcId)) {\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\n } else {\n this.getBaseDcId().then(baseDcId => {\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\n });\n }\n\n return deferred;\n }\n}\n\nconst apiManager = new ApiManager();\nMOUNT_CLASS_TO.apiManager = apiManager;\nexport default apiManager;\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 { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 { ReferenceBytes } from \"./referenceDatabase\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { notifyAll, notifySomeone } from \"../../helpers/context\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { InputFile, InputFileLocation, InputWebFileLocation, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId, WorkerTaskVoidTemplate } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport fileManager from \"../fileManager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"./apiManager\";\r\nimport { isWebpSupported } from \"./mtproto.worker\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\nimport readBlobAsArrayBuffer from \"../../helpers/blob/readBlobAsArrayBuffer\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n // getFileMethod: Parameters[1]\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\nexport interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n};\r\n\r\nexport interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n originalPayload: ReferenceBytes\r\n};\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\n\r\nexport class ApiFileManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private cachedDownloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: Set>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public webpConvertPromises: {[fileName: string]: CancellablePromise} = {};\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n constructor() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : 36;\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = downloadPull.findAndSplice(d => d.queueId === 0) || downloadPull.findAndSplice(d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n \r\n data.cb()\r\n .then((result) => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.resolve(result);\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.reject(error);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = (this.cachedDownloadPromises[fileName] ? [this.cachedDownloadPromises[fileName]] : undefined) || \r\n (this.uploadPromises[fileName] ? Array.from(this.uploadPromises[fileName]) : []);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then(buffer => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes: number;\r\n\r\n bytes = 512;\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes * 1024;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const convertPromise = deferredPromise();\r\n\r\n const task = {type: 'convertWebp', payload: {fileName, bytes}};\r\n notifySomeone(task);\r\n return this.webpConvertPromises[fileName] = convertPromise;\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n const task = {type: 'refreshReference', payload: reference};\r\n notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then(reference => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public downloadFile(options: DownloadOptions): DownloadPromise {\r\n if(!fileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n options.mimeType = 'image/svg+xml';\r\n } else if(options.mimeType === 'image/webp' && !isWebpSupported()) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.cachedDownloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob) => {\r\n if(blob instanceof Blob && blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.deleteFile(fileName).then(() => {\r\n return this.downloadFile(options);\r\n }).catch(() => {\r\n return this.downloadFile(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred: DownloadPromise = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.cachedDownloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n await this.deleteFile(fileName);\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch(() => {\r\n //this.log('not cached', fileName);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array, offset: number) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = offset + limit >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n deferred.notify({done, offset, total: size});\r\n //}\r\n\r\n const processedResult = await processDownloaded(bytes, offset);\r\n checkCancel();\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await fileManager.write(fileWriter, processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n deferred.resolve(fileWriter.finalize(size < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number, offset: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n this.cachedDownloadPromises[fileName] = deferred;\r\n\r\n deferred.safeFinally(() => {\r\n delete this.cachedDownloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n private deleteFile(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.cachedDownloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public uploadFile({file, fileName}: {file: Blob | File, fileName: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferredHelper: {\r\n resolve?: (input: typeof resultInputFile) => void,\r\n reject?: (error: any) => void,\r\n notify?: (details: {done: number, total: number}) => void\r\n } = {\r\n notify: (details: {done: number, total: number}) => {}\r\n };\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n if(totalParts > 4000) {\r\n return reject({type: 'FILE_TOO_BIG'});\r\n }\r\n\r\n deferredHelper.resolve = resolve;\r\n deferredHelper.reject = reject;\r\n });\r\n Object.assign(deferred, deferredHelper);\r\n\r\n if(totalParts > 4000) {\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then(buffer => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then((result) => {\r\n doneParts++;\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n deferred.finally(() => {\r\n set.delete(deferred);\r\n if(!set.size) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n const set = this.uploadPromises[fileName] ?? (this.uploadPromises[fileName] = new Set());\r\n set.add(deferred);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiFileManager = new ApiFileManager();\r\nMOUNT_CLASS_TO.apiFileManager = apiFileManager;\r\nexport default apiFileManager;\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\n// just to include\nimport '../polyfill';\n\nimport type { LocalStorageProxyTask } from '../localStorage';\nimport type { WebpConvertTask } from '../webp/webpWorkerController';\nimport type { ToggleStorageTask } from './mtprotoworker';\nimport type { RefreshReferenceTaskResponse } from './apiFileManager';\nimport apiManager from \"./apiManager\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\nimport networkerFactory from \"./networkerFactory\";\nimport apiFileManager from './apiFileManager';\nimport { notifyAll } from '../../helpers/context';\nimport CacheStorageController from '../cacheStorage';\nimport sessionStorage from '../sessionStorage';\nimport { socketsProxied } from './transports/socketProxied';\nimport ctx from '../../environment/ctx';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nlet webpSupported = false;\nexport const isWebpSupported = () => {\n return webpSupported;\n};\n\nnetworkerFactory.setUpdatesProcessor((obj) => {\n notifyAll({update: obj});\n});\n\nnetworkerFactory.onConnectionStatusChange = (status) => {\n notifyAll({type: 'connectionStatusChange', payload: status});\n};\n\nconst taskListeners = {\n convertWebp: (task: WebpConvertTask) => {\n const {fileName, bytes} = task.payload;\n const deferred = apiFileManager.webpConvertPromises[fileName];\n if(deferred) {\n deferred.resolve(bytes);\n delete apiFileManager.webpConvertPromises[fileName];\n }\n },\n\n webpSupport: (task: any) => {\n webpSupported = task.payload;\n },\n\n socketProxy: (task: any) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n \n const socketProxied = socketsProxied.get(id);\n if(socketTask.type === 'message') {\n socketProxied.dispatchEvent('message', socketTask.payload);\n } else if(socketTask.type === 'open') {\n socketProxied.dispatchEvent('open');\n } else if(socketTask.type === 'close') {\n socketProxied.dispatchEvent('close');\n socketsProxied.delete(id);\n }\n },\n\n localStorageProxy: (task: LocalStorageProxyTask) => {\n sessionStorage.finishTask(task.id, task.payload);\n },\n\n userAgent: (task: any) => {\n networkerFactory.userAgent = task.payload;\n },\n\n online: () => {\n networkerFactory.forceReconnectTimeout();\n },\n\n forceReconnect: () => {\n networkerFactory.forceReconnect();\n },\n\n toggleStorage: (task: ToggleStorageTask) => {\n const enabled = task.payload;\n // AppStorage.toggleStorage(enabled);\n CacheStorageController.toggleStorage(enabled);\n },\n\n refreshReference: (task: RefreshReferenceTaskResponse) => {\n const hex = bytesToHex(task.originalPayload);\n const r = apiFileManager.refreshReferencePromises[hex];\n const deferred = r?.deferred;\n if(deferred) {\n if(task.error) {\n deferred.reject(task.error);\n } else {\n deferred.resolve(task.payload);\n }\n }\n },\n\n crypto: (task: any) => {\n cryptoWorker.invokeCrypto(task.task, ...task.args as any).then(result => {\n notifyAll({taskId: task.taskId, result});\n });\n }\n};\n\nconst onMessage = async(e: any) => {\n try {\n const task: {\n task: string,\n taskId: number,\n args: any[],\n type?: string\n } = e.data;\n const taskId = task.taskId;\n\n // @ts-ignore\n const f = taskListeners[task.type];\n if(f) {\n f(task);\n return;\n }\n\n if(!task.task) {\n return;\n }\n\n switch(task.task) {\n case 'requestFilePart':\n case 'setQueueId':\n case 'cancelDownload':\n case 'uploadFile':\n case 'downloadFile': {\n try {\n // @ts-ignore\n let result: any = apiFileManager[task.task].apply(apiFileManager, task.args);\n \n if(result instanceof Promise) {\n /* (result as ReturnType).notify = (progress: {done: number, total: number, offset: number}) => {\n notify({progress: {fileName, ...progress}});\n }; */\n result = await result;\n }\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n\n break;\n }\n\n case 'getNetworker': {\n // @ts-ignore\n apiManager[task.task].apply(apiManager, task.args).finally(() => {\n notifyAll({taskId, result: null});\n });\n \n break;\n }\n\n case 'setLanguage':\n case 'startAll':\n case 'stopAll': {\n // @ts-ignore\n networkerFactory[task.task].apply(networkerFactory, task.args);\n break;\n }\n \n default: {\n try {\n // @ts-ignore\n let result = apiManager[task.task].apply(apiManager, task.args);\n \n if(result instanceof Promise) {\n result = await result;\n }\n\n //console.log(notifyAll);\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n \n //throw new Error('Unknown task: ' + task.task);\n break;\n }\n }\n } catch(err) {\n console.error('worker task error:', err);\n }\n};\n\n//console.log('[WORKER] Will send ready', Date.now() / 1000);\nctx.addEventListener('message', onMessage);\nnotifyAll('ready');\n"],"names":["BASE","MAX_INT","MAX_INT_ARR","smallToArray","DEFAULT_ALPHABET","supportsNativeBigInt","BigInt","Integer","v","radix","alphabet","caseSensitive","parseValue","parseBase","BigInteger","value","sign","this","isSmall","SmallInteger","NativeBigInt","isPrecise","n","Math","floor","arrayToSmall","arr","trim","length","compareAbs","i","createArray","x","Array","truncate","ceil","add","a","b","sum","l_a","l_b","r","carry","base","push","addAny","addSmall","l","subtract","difference","a_l","b_l","borrow","subtractSmall","multiplyLong","product","a_i","j","multiplySmall","shiftLeft","concat","multiplyKaratsuba","y","max","slice","d","c","ac","bd","abcd","multiplySmallAndArray","square","divModSmall","lambda","q","remainder","divisor","quotient","divModAny","self","Error","negate","abs","comparison","quotientDigit","shift","result","divisorMostSignificantDigit","divMod1","guess","xlen","highx","highy","check","part","unshift","reverse","divMod2","qSign","mod","mSign","isBasicPrime","isUnit","equals","isEven","isDivisibleBy","lesser","millerRabinTest","nPrev","prev","divide","next","bigInt","modPow","prototype","Object","create","plus","subtractAny","minus","small","multiply","l1","l2","times","_multiplyBySmall","divmod","over","pow","toString","_0","_1","_2","isNegative","exp","isZero","modInv","isPositive","isOdd","compare","Infinity","compareTo","eq","notEquals","neq","greater","gt","lt","greaterOrEquals","geq","lesserOrEquals","leq","isPrime","strict","undefined","bits","bitLength","logN","log","toJSNumber","t","isProbablePrime","iterations","rng","randBetween","lastT","lastR","zero","newT","one","newR","powersOfTwo","powers2Length","highestPower2","shift_isSmall","bitwise","fn","xSign","ySign","xRem","not","yRem","xDigit","yDigit","xDivMod","yDivMod","String","shiftRight","remQuo","and","or","xor","LOBMASK_I","roughLOB","integerLogarithm","tmp","p","e","min","gcd","text","toLowerCase","absBase","alphabetValues","digits","start","parseBaseFromArray","val","toBase","apply","map","valueOf","neg","Number","out","left","digit","toBaseString","stringify","join","parseStringValue","split","decimalPlace","indexOf","test","parseNumberValue","toArray","str","toJSON","parseInt","minusOne","lcm","isInstance","usedRNG","random","low","range","restricted","top","fromArray","module","hasOwnProperty","exports","o","Uint32Array","s","f","h","u","w","k","m","_","g","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","lencode","distcode","lenbits","distbits","mode","msg","sane","Uint16Array","Uint8Array","Z","S","T","O","U","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","last","wrap","havedict","flags","total","head","wbits","offset","extra","ncode","nlen","ndist","have","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","K","P","Y","G","X","W","done","time","xflags","os","extra_len","name","fromCharCode","comment","hcrc","data_type","call","TextDecoder","decode","J","Q","V","$","ee","te","ie","ne","options","arguments","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","header","dictionary","TextEncoder","encode","charCodeAt","ae","onEnd","onData","re","oe","se","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","defineProperty","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","id","loaded","__webpack_modules__","getter","__esModule","definition","key","enumerable","get","obj","prop","nmd","paths","children","bufferConcats","args","reduce","acc","byteLength","lastLength","forEach","ArrayBuffer","bytesFromHex","hexString","len","bytes","charAt","substr","bytesToHex","configurable","randomize","crypto","getRandomValues","findAndSplice","verify","index","findIndex","splice","toHHMMSS","leadZero","sec_num","hours","minutes","seconds","Promise","finally","onFinally","callback","resolve","then","reason","reject","safeFinally","catch","Modes","location","search","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","MOUNT_CLASS_TO","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","listeners","listener","postMessage","notifyWorker","noop","notifySomeone","bind","notifyAll","LocalStorage","constructor","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","setItem","delete","saveLocal","removeItem","clear","keys","toggleStorage","enabled","LocalStorageController","taskId","tasks","STORAGES","storage","finishTask","proxy","payload","sessionStorage","appStorage","isObject","object","gzipUncompress","intToUint","longFromInts","high","boolFalse","predicate","boolTrue","vector","gzipPacked","TLSerialization","maxLength","mtproto","startMaxLength","createBuffer","buffer","intView","byteView","getArray","resultBuffer","resultInt32","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","console","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","isArray","storeIntBytes","storeDouble","Float64Array","storeString","sUTF8","unescape","encodeURIComponent","storeBytes","error","storeRawBytes","storeMethod","methodName","params","methodData","methods","find","method","pFlags","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","constructors","TLDeserialization","override","readInt","hex","fetchInt","fetchDouble","doubleView","fetchLong","longDec","num","isSafeInteger","fetchBool","fetchObject","fetchString","decodeURIComponent","escape","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","bigIntFromBytes","bigIntToBytes","bytesModPow","bytesBigInt","expBigInt","modBigInt","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","needPadding","padding","bytesXor","bytes1","bytes2","convertToUint8Array","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","hash","makePasswordHash","salt1","salt2","padArray","flipper","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","a_for_hash","secure_random","generate_and_check_random","g_b","ux","a_ux","h1","buff","M1","srp_id","Si","T1","T2","T3","T4","T5","T6","T7","T8","getWords","buf","pos","right","x2","x4","tEnc","tDec","xInv","computeTables","AES","_key","encKey","decKey","rcon","encrypt","_message","a2","b2","c2","message","rounds","decrypt","AES_IGE","iv","cipher","cipherText","prevX","prevY","yXOR","counter","incrementCounter","bytesFromWordss","bytesToWordss","words","aesSync","keyBytes","ivBytes","aesEncryptSync","aesDecryptSync","subtle","pbkdf2","salt","importKey","rsaEncrypt","publicKey","exponent","modulus","sha1","sha256","arrays","nextRandomUint","array","randomLong","bigIntRandom","BrentPollardFactor","two","ys","bigIntUint64MinusPqPlusOne","performY","condition","factorizeBrentPollardPQ","pqBytes","factors","primes","factor","pop","primeFactors","sort","generateDh","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","computeDhKey","key_fingerprint","readBigIntFromBytesBE","_bits","emojis","getEmojisFingerprint","emojisLength","partOffset","codePoints","invokeCrypto","performTaskWorker","super","webWorker","awaiting","pending","utils","task","timeManager","lastMessageId","timeOffset","generateId","timeTicks","Date","now","messageId","applyServerTime","serverTime","localTime","newTimeOffset","changed","server_time_offset","USER_AGENT","navigator","userAgent","IS_SAFARI","vendor","platform","maxTouchPoints","match","IS_FIREFOX","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","splitted","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","logger","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MAIN_DOMAIN","App","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","hostname","suffix","pause","ms","setTimeout","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","deferred","cancel","assign","EventListenerBase","reuseResults","_constructor","listenerResults","addEventListener","once","addMultipleEventsListeners","removeEventListener","_dispatchEvent","collectResults","dispatchResultableEvent","dispatchEvent","cleanup","indexOfAndSplice","item","idx","spliced","Socket","dcId","url","logSuffix","handleOpen","handleError","close","handleClose","removeListeners","handleMessage","event","data","send","body","ws","logTypes","connect","WebSocket","binaryType","Counter","initialValue","increment","CTR","update","encrypted","Obfuscation","init","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","tag","encodePacket","readPacket","ConnectionStatus","TcpObfuscated","Connection","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","connection","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","parseResponse","response","processMessage","sessionId","onClose","needTimeout","retryAt","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","clearTimeout","Connecting","bodySent","forceReconnect","destroy","setAutoReconnect","enable","toEncode","promise","socketId","SocketProxied","socketsProxied","Map","TEST_SUFFIX","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportHTTP","dcOption","HTTP","chooseServer","transportType","reuse","client","download","upload","servers","transports","static","opened","waitForWebSocket","pingTransports","https","dcConfigurator","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","pinging","setTransportValue","setTransportOpened","setTransportClosed","fetch","status","arrayBuffer","setConnected","destroyed","releasing","bytesCmp","invokeAfterMsgConstructor","MTPNetworker","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","nextReq","checkConnectionPeriod","offline","lastResendReq","isOnline","lastResponseTime","activeRequests","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","warn","serializer","pingId","ping_id","pingMessage","msg_id","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","forEachReverse","inner","innerSentMessageId","innerSentMessage","notContentRelated","wrapMtpCall","pushMessage","wrapMtpMessage","wrapApiCall","connectionInited","invokeWithLayer","initConnection","language","afterMessageId","resultType","isAPI","changeTransport","oldTransport","removeTransport","nextReqTimeout","longPollInterval","clearInterval","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","msgId","noSchedule","timeout","TimedOut","setDrainTimeout","onDrainTimeout","onDrain","willChange","innerMsgId","acked","getMsgKey","dataWithPadding","isOut","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","promises","results","aesKey","aesIv","sha2a","sha2b","performScheduledRequest","ackMsgIds","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messages","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","long","messageByteLength","filter","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","request","requestData","baseError","code","originalError","responseBuffer","deserializer","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","applyServerSalt","newServerSalt","cb","ackMessage","reqResendMessage","notEmpty","processMessageAck","processError","rawError","matches","error_message","error_code","description","innerMessage","new_server_salt","bad_msg_id","changedOffset","badMessage","first_msg_id","answer_msg_id","badMsgId","networkerFactory","networkers","updatesProcessor","onConnectionStatusChange","akStopped","removeNetworker","setUpdatesProcessor","getNetworker","startAll","stoppedNetworkers","stopAll","setLanguage","langCode","unsetConnectionInited","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","select","fingerprints","fingerprintHex","fill","foundKey","fingerprint","cached","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","auth","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","twoPow","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","new_nonce_hash2","new_nonce_hash3","getTransportType","getTransportTypePromise","_try","blobConstruct","blobParts","mimeType","blob","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","IDBStorage","db","storeName","storageIsAvailable","fromObject","safeAssign","openDatabase","preserve","onclose","isAvailable","createNew","openDbPromise","indexedDB","open","finished","onerror","onsuccess","calledNew","onabort","transaction","target","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","createObjectStore","indexes","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","save","put","saveFile","fileName","perf","performance","oncomplete","requests","getAll","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","iterateNetworkers","connections","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","replace","info","getBaseDcId","setBaseDcId","setUserAuth","userAuth","dcID","user_auth","wasDcId","setOnDrainIfNeeded","logOut","storageKeys","storageResult","logoutPromises","invokeApi","ignoreErrors","closeDatabases","handled","generateNetworkerGetKey","maxNetworkers","found","getKey","ak","ss","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","canRelease","prepareTempMessageId","startTime","interval","cachedNetworker","rejectPromise","noErrorBox","performRequest","after","exportResolve","exportReject","dc_id","exportedAuth","newDcId","includes","stopTime","waitTime","floodMaxTimeout","FILENAME_JOINER","readBlobAsArrayBuffer","reader","FileReader","readBlobAs","blobSupported","write","fileWriter","getFakeFileWriter","saveFileCallback","finalize","saveToStorage","CacheStorageController","dbName","caches","timeoutOperation","deleteAll","getFile","Response","headers","size","rejected","res","getFileWriter","fakeWriter","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","uncompressTGV","convertWebp","convertPromise","setInterval","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","from","canceled","requestWebFilePart","limit","checkCancel","getDelta","requestFilePart","invoke","refreshReference","reference","file_reference","checkedReference","getLimitPart","inputFileLocation","downloadFile","fileManager","process","isWebpSupported","ext","thumb_size","Boolean","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","getFileNameByLocation","cachedPromise","fileStorage","deleteFile","cacheFileWriter","resolved","errorHandler","limitPart","writeFileDeferred","writeFilePromise","processDownloaded","delayed","superpuper","isFinal","processedResult","progress","uploadFile","file","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","details","it","file_id","file_part","file_total_parts","generator","Set","webpSupported","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","online","originalPayload"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.b18e2703b7b89f161924.bundle.worker.js b/public/mtproto.worker.b18e2703b7b89f161924.bundle.worker.js new file mode 100644 index 00000000..0c04390e --- /dev/null +++ b/public/mtproto.worker.b18e2703b7b89f161924.bundle.worker.js @@ -0,0 +1,4 @@ +!function(e){var t={};function a(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,a),s.l=!0,s.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)a.d(n,s,function(t){return e[t]}.bind(null,s));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=3)}([function(e,t,a){(function(e){var n,s=function(e){"use strict";var t=1e7,a=9007199254740992,n=y(a),i="function"==typeof BigInt;function r(e,t,a,n){return void 0===e?r[0]:void 0!==t&&(10!=+t||a)?O(e,t,a,n):j(e)}function p(e,t){this.value=e,this.sign=t,this.isSmall=!1}function o(e){this.value=e,this.sign=e<0,this.isSmall=!0}function m(e){this.value=e}function d(e){return-a0?Math.floor(e):Math.ceil(e)}function h(e,a){var n,s,i=e.length,r=a.length,p=new Array(i),o=0,m=t;for(s=0;s=m?1:0,p[s]=n-o*m;for(;s0&&p.push(o),p}function f(e,t){return e.length>=t.length?h(e,t):h(t,e)}function _(e,a){var n,s,i=e.length,r=new Array(i),p=t;for(s=0;s0;)r[s++]=a%p,a=Math.floor(a/p);return r}function v(e,t){var a,n,s=e.length,i=t.length,r=new Array(s),p=0;for(a=0;a0;)r[s++]=o%p,o=Math.floor(o/p);return r}function S(e,t){for(var a=[];t-- >0;)a.push(0);return a.concat(e)}function k(e,a,n){return new p(e=0;--a)s=(i=1e7*s+e[a])-(n=u(i/t))*t,p[a]=0|n;return[p,0|s]}function A(e,a){var n,s=j(a);if(i)return[new m(e.value/s.value),new m(e.value%s.value)];var d,h=e.value,f=s.value;if(0===f)throw new Error("Cannot divide by zero");if(e.isSmall)return s.isSmall?[new o(u(h/f)),new o(h%f)]:[r[0],e];if(s.isSmall){if(1===f)return[e,r[0]];if(-1==f)return[e.negate(),r[0]];var _=Math.abs(f);if(_=0;s--){for(n=l-1,_[s+y]!==h&&(n=Math.floor((_[s+y]*l+_[s+y-1])/h)),i=0,r=0,o=v.length,p=0;po&&(s=1e7*(s+1)),a=Math.ceil(s/i);do{if(M(r=P(t,a),d)<=0)break;a--}while(a);m.push(a),d=v(d,r)}return m.reverse(),[c(m),c(d)]}(h,f))[0];var S=e.sign!==s.sign,k=n[1],I=e.sign;return"number"==typeof d?(S&&(d=-d),d=new o(d)):d=new p(d,S),"number"==typeof k?(I&&(k=-k),k=new o(k)):k=new p(k,I),[d,k]}function M(e,t){if(e.length!==t.length)return e.length>t.length?1:-1;for(var a=e.length-1;a>=0;a--)if(e[a]!==t[a])return e[a]>t[a]?1:-1;return 0}function E(e){var t=e.abs();return!t.isUnit()&&(!!(t.equals(2)||t.equals(3)||t.equals(5))||!(t.isEven()||t.isDivisibleBy(3)||t.isDivisibleBy(5))&&(!!t.lesser(49)||void 0))}function R(e,t){for(var a,n,i,r=e.prev(),p=r,o=0;p.isEven();)p=p.divide(2),o++;e:for(n=0;n=0?n=v(e,t):(n=v(t,e),a=!a),"number"==typeof(n=c(n))?(a&&(n=-n),new o(n)):new p(n,a)}(a,n,this.sign)},p.prototype.minus=p.prototype.subtract,o.prototype.subtract=function(e){var t=j(e),a=this.value;if(a<0!==t.sign)return this.add(t.negate());var n=t.value;return t.isSmall?new o(a-n):b(n,Math.abs(a),a>=0)},o.prototype.minus=o.prototype.subtract,m.prototype.subtract=function(e){return new m(this.value-j(e).value)},m.prototype.minus=m.prototype.subtract,p.prototype.negate=function(){return new p(this.value,!this.sign)},o.prototype.negate=function(){var e=this.sign,t=new o(-this.value);return t.sign=!e,t},m.prototype.negate=function(){return new m(-this.value)},p.prototype.abs=function(){return new p(this.value,!1)},o.prototype.abs=function(){return new o(Math.abs(this.value))},m.prototype.abs=function(){return new m(this.value>=0?this.value:-this.value)},p.prototype.multiply=function(e){var a,n,s,i=j(e),o=this.value,m=i.value,d=this.sign!==i.sign;if(i.isSmall){if(0===m)return r[0];if(1===m)return this;if(-1===m)return this.negate();if((a=Math.abs(m))0?function e(t,a){var n=Math.max(t.length,a.length);if(n<=30)return w(t,a);n=Math.ceil(n/2);var s=t.slice(n),i=t.slice(0,n),r=a.slice(n),p=a.slice(0,n),o=e(i,p),m=e(s,r),d=e(f(i,s),f(p,r)),y=f(f(o,S(v(v(d,o),m),n)),S(m,2*n));return l(y),y}(o,m):w(o,m),d)},p.prototype.times=p.prototype.multiply,o.prototype._multiplyBySmall=function(e){return d(e.value*this.value)?new o(e.value*this.value):k(Math.abs(e.value),y(Math.abs(this.value)),this.sign!==e.sign)},p.prototype._multiplyBySmall=function(e){return 0===e.value?r[0]:1===e.value?this:-1===e.value?this.negate():k(Math.abs(e.value),this.value,this.sign!==e.sign)},o.prototype.multiply=function(e){return j(e)._multiplyBySmall(this)},o.prototype.times=o.prototype.multiply,m.prototype.multiply=function(e){return new m(this.value*j(e).value)},m.prototype.times=m.prototype.multiply,p.prototype.square=function(){return new p(I(this.value),!1)},o.prototype.square=function(){var e=this.value*this.value;return d(e)?new o(e):new p(I(y(Math.abs(this.value))),!1)},m.prototype.square=function(e){return new m(this.value*this.value)},p.prototype.divmod=function(e){var t=A(this,e);return{quotient:t[0],remainder:t[1]}},m.prototype.divmod=o.prototype.divmod=p.prototype.divmod,p.prototype.divide=function(e){return A(this,e)[0]},m.prototype.over=m.prototype.divide=function(e){return new m(this.value/j(e).value)},o.prototype.over=o.prototype.divide=p.prototype.over=p.prototype.divide,p.prototype.mod=function(e){return A(this,e)[1]},m.prototype.mod=m.prototype.remainder=function(e){return new m(this.value%j(e).value)},o.prototype.remainder=o.prototype.mod=p.prototype.remainder=p.prototype.mod,p.prototype.pow=function(e){var t,a,n,s=j(e),i=this.value,p=s.value;if(0===p)return r[1];if(0===i)return r[0];if(1===i)return r[1];if(-1===i)return s.isEven()?r[1]:r[-1];if(s.sign)return r[0];if(!s.isSmall)throw new Error("The exponent "+s.toString()+" is too large.");if(this.isSmall&&d(t=Math.pow(i,p)))return new o(u(t));for(a=this,n=r[1];!0&p&&(n=n.times(a),--p),0!==p;)p/=2,a=a.square();return n},o.prototype.pow=p.prototype.pow,m.prototype.pow=function(e){var t=j(e),a=this.value,n=t.value,s=BigInt(0),i=BigInt(1),p=BigInt(2);if(n===s)return r[1];if(a===s)return r[0];if(a===i)return r[1];if(a===BigInt(-1))return t.isEven()?r[1]:r[-1];if(t.isNegative())return new m(s);for(var o=this,d=r[1];(n&i)===i&&(d=d.times(o),--n),n!==s;)n/=p,o=o.square();return d},p.prototype.modPow=function(e,t){if(e=j(e),(t=j(t)).isZero())throw new Error("Cannot take modPow with modulus 0");var a=r[1],n=this.mod(t);for(e.isNegative()&&(e=e.multiply(r[-1]),n=n.modInv(t));e.isPositive();){if(n.isZero())return r[0];e.isOdd()&&(a=a.multiply(n).mod(t)),e=e.divide(2),n=n.square().mod(t)}return a},m.prototype.modPow=o.prototype.modPow=p.prototype.modPow,p.prototype.compareAbs=function(e){var t=j(e),a=this.value,n=t.value;return t.isSmall?1:M(a,n)},o.prototype.compareAbs=function(e){var t=j(e),a=Math.abs(this.value),n=t.value;return t.isSmall?a===(n=Math.abs(n))?0:a>n?1:-1:-1},m.prototype.compareAbs=function(e){var t=this.value,a=j(e).value;return(t=t>=0?t:-t)===(a=a>=0?a:-a)?0:t>a?1:-1},p.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=j(e),a=this.value,n=t.value;return this.sign!==t.sign?t.sign?1:-1:t.isSmall?this.sign?-1:1:M(a,n)*(this.sign?-1:1)},p.prototype.compareTo=p.prototype.compare,o.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=j(e),a=this.value,n=t.value;return t.isSmall?a==n?0:a>n?1:-1:a<0!==t.sign?a<0?-1:1:a<0?1:-1},o.prototype.compareTo=o.prototype.compare,m.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=this.value,a=j(e).value;return t===a?0:t>a?1:-1},m.prototype.compareTo=m.prototype.compare,p.prototype.equals=function(e){return 0===this.compare(e)},m.prototype.eq=m.prototype.equals=o.prototype.eq=o.prototype.equals=p.prototype.eq=p.prototype.equals,p.prototype.notEquals=function(e){return 0!==this.compare(e)},m.prototype.neq=m.prototype.notEquals=o.prototype.neq=o.prototype.notEquals=p.prototype.neq=p.prototype.notEquals,p.prototype.greater=function(e){return this.compare(e)>0},m.prototype.gt=m.prototype.greater=o.prototype.gt=o.prototype.greater=p.prototype.gt=p.prototype.greater,p.prototype.lesser=function(e){return this.compare(e)<0},m.prototype.lt=m.prototype.lesser=o.prototype.lt=o.prototype.lesser=p.prototype.lt=p.prototype.lesser,p.prototype.greaterOrEquals=function(e){return this.compare(e)>=0},m.prototype.geq=m.prototype.greaterOrEquals=o.prototype.geq=o.prototype.greaterOrEquals=p.prototype.geq=p.prototype.greaterOrEquals,p.prototype.lesserOrEquals=function(e){return this.compare(e)<=0},m.prototype.leq=m.prototype.lesserOrEquals=o.prototype.leq=o.prototype.lesserOrEquals=p.prototype.leq=p.prototype.lesserOrEquals,p.prototype.isEven=function(){return 0==(1&this.value[0])},o.prototype.isEven=function(){return 0==(1&this.value)},m.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)},p.prototype.isOdd=function(){return 1==(1&this.value[0])},o.prototype.isOdd=function(){return 1==(1&this.value)},m.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)},p.prototype.isPositive=function(){return!this.sign},o.prototype.isPositive=function(){return this.value>0},m.prototype.isPositive=o.prototype.isPositive,p.prototype.isNegative=function(){return this.sign},o.prototype.isNegative=function(){return this.value<0},m.prototype.isNegative=o.prototype.isNegative,p.prototype.isUnit=function(){return!1},o.prototype.isUnit=function(){return 1===Math.abs(this.value)},m.prototype.isUnit=function(){return this.abs().value===BigInt(1)},p.prototype.isZero=function(){return!1},o.prototype.isZero=function(){return 0===this.value},m.prototype.isZero=function(){return this.value===BigInt(0)},p.prototype.isDivisibleBy=function(e){var t=j(e);return!t.isZero()&&(!!t.isUnit()||(0===t.compareAbs(2)?this.isEven():this.mod(t).isZero()))},m.prototype.isDivisibleBy=o.prototype.isDivisibleBy=p.prototype.isDivisibleBy,p.prototype.isPrime=function(e){var t=E(this);if(void 0!==t)return t;var a=this.abs(),n=a.bitLength();if(n<=64)return R(a,[2,3,5,7,11,13,17,19,23,29,31,37]);for(var i=Math.log(2)*n.toJSNumber(),r=Math.ceil(!0===e?2*Math.pow(i,2):i),p=[],o=0;o-a?new o(e-1):new p(n,!0)},m.prototype.prev=function(){return new m(this.value-BigInt(1))};for(var T=[1];2*T[T.length-1]<=t;)T.push(2*T[T.length-1]);var V=T.length,D=T[V-1];function U(e){return Math.abs(e)<=t}function B(e,t,a){t=j(t);for(var n=e.isNegative(),i=t.isNegative(),r=n?e.not():e,p=i?t.not():t,o=0,m=0,d=null,y=null,c=[];!r.isZero()||!p.isZero();)o=(d=A(r,D))[1].toJSNumber(),n&&(o=D-1-o),m=(y=A(p,D))[1].toJSNumber(),i&&(m=D-1-m),r=d[0],p=y[0],c.push(a(o,m));for(var l=0!==a(n?1:0,i?1:0)?s(-1):s(0),g=c.length-1;g>=0;g-=1)l=l.multiply(D).add(s(c[g]));return l}p.prototype.shiftLeft=function(e){var t=j(e).toJSNumber();if(!U(t))throw new Error(String(t)+" is too large for shifting.");if(t<0)return this.shiftRight(-t);var a=this;if(a.isZero())return a;for(;t>=V;)a=a.multiply(D),t-=V-1;return a.multiply(T[t])},m.prototype.shiftLeft=o.prototype.shiftLeft=p.prototype.shiftLeft,p.prototype.shiftRight=function(e){var t,a=j(e).toJSNumber();if(!U(a))throw new Error(String(a)+" is too large for shifting.");if(a<0)return this.shiftLeft(-a);for(var n=this;a>=V;){if(n.isZero()||n.isNegative()&&n.isUnit())return n;n=(t=A(n,D))[1].isNegative()?t[0].prev():t[0],a-=V-1}return(t=A(n,T[a]))[1].isNegative()?t[0].prev():t[0]},m.prototype.shiftRight=o.prototype.shiftRight=p.prototype.shiftRight,p.prototype.not=function(){return this.negate().prev()},m.prototype.not=o.prototype.not=p.prototype.not,p.prototype.and=function(e){return B(this,e,(function(e,t){return e&t}))},m.prototype.and=o.prototype.and=p.prototype.and,p.prototype.or=function(e){return B(this,e,(function(e,t){return e|t}))},m.prototype.or=o.prototype.or=p.prototype.or,p.prototype.xor=function(e){return B(this,e,(function(e,t){return e^t}))},m.prototype.xor=o.prototype.xor=p.prototype.xor;function x(e){var a=e.value,n="number"==typeof a?a|1<<30:"bigint"==typeof a?a|BigInt(1<<30):a[0]+a[1]*t|1073758208;return n&-n}function F(e,t){return e=j(e),t=j(t),e.greater(t)?e:t}function L(e,t){return e=j(e),t=j(t),e.lesser(t)?e:t}function N(e,t){if(e=j(e).abs(),t=j(t).abs(),e.equals(t))return e;if(e.isZero())return t;if(t.isZero())return e;for(var a,n,s=r[1];e.isEven()&&t.isEven();)a=L(x(e),x(t)),e=e.divide(a),t=t.divide(a),s=s.multiply(a);for(;e.isEven();)e=e.divide(x(e));do{for(;t.isEven();)t=t.divide(x(t));e.greater(t)&&(n=t,t=e,e=n),t=t.subtract(e)}while(!t.isZero());return s.isUnit()?e:e.multiply(s)}p.prototype.bitLength=function(){var e=this;return e.compareTo(s(0))<0&&(e=e.negate().subtract(s(1))),0===e.compareTo(s(0))?s(0):s(function e(t,a){if(a.compareTo(t)<=0){var n=e(t,a.square(a)),i=n.p,r=n.e,p=i.multiply(a);return p.compareTo(t)<=0?{p:p,e:2*r+1}:{p:i,e:2*r}}return{p:s(1),e:0}}(e,s(2)).e).add(s(1))},m.prototype.bitLength=o.prototype.bitLength=p.prototype.bitLength;var O=function(e,t,a,n){a=a||"0123456789abcdefghijklmnopqrstuvwxyz",e=String(e),n||(e=e.toLowerCase(),a=a.toLowerCase());var s,i=e.length,r=Math.abs(t),p={};for(s=0;s=r)){if("1"===d&&1===r)continue;throw new Error(d+" is not a valid digit in base "+t+".")}}t=j(t);var o=[],m="-"===e[0];for(s=m?1:0;s"!==e[s]&&s=0;n--)s=s.add(e[n].times(i)),i=i.times(t);return a?s.negate():s}function G(e,t){if((t=s(t)).isZero()){if(e.isZero())return{value:[0],isNegative:!1};throw new Error("Cannot convert nonzero numbers to base 0.")}if(t.equals(-1)){if(e.isZero())return{value:[0],isNegative:!1};if(e.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-e.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:!1};var a=Array.apply(null,Array(e.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);return a.unshift([1]),{value:[].concat.apply([],a),isNegative:!1}}var n=!1;if(e.isNegative()&&t.isPositive()&&(n=!0,e=e.abs()),t.isUnit())return e.isZero()?{value:[0],isNegative:!1}:{value:Array.apply(null,Array(e.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:n};for(var i,r=[],p=e;p.isNegative()||p.compareAbs(t)>=0;){i=p.divmod(t),p=i.quotient;var o=i.remainder;o.isNegative()&&(o=t.minus(o).abs(),p=p.next()),r.push(o.toJSNumber())}return r.push(p.toJSNumber()),{value:r.reverse(),isNegative:n}}function K(e,t,a){var n=G(e,t);return(n.isNegative?"-":"")+n.value.map((function(e){return function(e,t){return e<(t=t||"0123456789abcdefghijklmnopqrstuvwxyz").length?t[e]:"<"+e+">"}(e,a)})).join("")}function z(e){if(d(+e)){var t=+e;if(t===u(t))return i?new m(BigInt(t)):new o(t);throw new Error("Invalid integer: "+e)}var a="-"===e[0];a&&(e=e.slice(1));var n=e.split(/e/i);if(n.length>2)throw new Error("Invalid integer: "+n.join("e"));if(2===n.length){var s=n[1];if("+"===s[0]&&(s=s.slice(1)),(s=+s)!==u(s)||!d(s))throw new Error("Invalid integer: "+s+" is not a valid exponent.");var r=n[0],y=r.indexOf(".");if(y>=0&&(s-=r.length-y-1,r=r.slice(0,y)+r.slice(y+1)),s<0)throw new Error("Cannot include negative exponent part for integers");e=r+=new Array(s+1).join("0")}if(!/^([0-9][0-9]*)$/.test(e))throw new Error("Invalid integer: "+e);if(i)return new m(BigInt(a?"-"+e:e));for(var c=[],g=e.length,h=g-7;g>0;)c.push(+e.slice(h,g)),(h-=7)<0&&(h=0),g-=7;return l(c),new p(c,a)}function j(e){return"number"==typeof e?function(e){if(i)return new m(BigInt(e));if(d(e)){if(e!==u(e))throw new Error(e+" is not an integer.");return new o(e)}return z(e.toString())}(e):"string"==typeof e?z(e):"bigint"==typeof e?new m(e):e}p.prototype.toArray=function(e){return G(this,e)},o.prototype.toArray=function(e){return G(this,e)},m.prototype.toArray=function(e){return G(this,e)},p.prototype.toString=function(e,t){if(void 0===e&&(e=10),10!==e)return K(this,e,t);for(var a,n=this.value,s=n.length,i=String(n[--s]);--s>=0;)a=String(n[s]),i+="0000000".slice(a.length)+a;return(this.sign?"-":"")+i},o.prototype.toString=function(e,t){return void 0===e&&(e=10),10!=e?K(this,e,t):String(this.value)},m.prototype.toString=o.prototype.toString,m.prototype.toJSON=p.prototype.toJSON=o.prototype.toJSON=function(){return this.toString()},p.prototype.valueOf=function(){return parseInt(this.toString(),10)},p.prototype.toJSNumber=p.prototype.valueOf,o.prototype.valueOf=function(){return this.value},o.prototype.toJSNumber=o.prototype.valueOf,m.prototype.valueOf=m.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};for(var H=0;H<1e3;H++)r[H]=j(H),H>0&&(r[-H]=j(-H));return r.one=r[1],r.zero=r[0],r.minusOne=r[-1],r.max=F,r.min=L,r.gcd=N,r.lcm=function(e,t){return e=j(e).abs(),t=j(t).abs(),e.divide(N(e,t)).multiply(t)},r.isInstance=function(e){return e instanceof p||e instanceof o||e instanceof m},r.randBetween=function(e,a,n){e=j(e),a=j(a);var s=n||Math.random,i=L(e,a),p=F(e,a).subtract(i).add(1);if(p.isSmall)return i.add(Math.floor(s()*p));for(var o=G(p,t).value,m=[],d=!0,y=0;y{let s=65535&e|0,i=e>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{s=s+t[n++]|0,i=i+s|0}while(--r);s%=65521,i%=65521}return s|i<<16|0};const a=new Uint32Array((()=>{let e,t=[];for(var a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t})());var n=(e,t,n,s)=>{const i=a,r=s+n;e^=-1;for(let a=s;a>>8^i[255&(e^t[a])];return-1^e},s=function(e,t){let a,n,s,i,r,p,o,m,d,y,c,l,g,u,h,f,_,v,b,w,P,S,k,I;const C=e.state;a=e.next_in,k=e.input,n=a+(e.avail_in-5),s=e.next_out,I=e.output,i=s-(t-e.avail_out),r=s+(e.avail_out-257),p=C.dmax,o=C.wsize,m=C.whave,d=C.wnext,y=C.window,c=C.hold,l=C.bits,g=C.lencode,u=C.distcode,h=(1<>>24,c>>>=v,l-=v,v=_>>>16&255,0===v)I[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(c&(1<>>=v,l-=v),l<15&&(c+=k[a++]<>>24,c>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=u[(65535&_)+(c&(1<p){e.msg="invalid distance too far back",C.mode=30;break e}if(c>>>=v,l-=v,v=s-i,w>v){if(v=w-v,v>m&&C.sane){e.msg="invalid distance too far back",C.mode=30;break e}if(P=0,S=y,0===d){if(P+=o-v,v2;)I[s++]=S[P++],I[s++]=S[P++],I[s++]=S[P++],b-=3;b&&(I[s++]=S[P++],b>1&&(I[s++]=S[P++]))}else{P=s-w;do{I[s++]=I[P++],I[s++]=I[P++],I[s++]=I[P++],b-=3}while(b>2);b&&(I[s++]=I[P++],b>1&&(I[s++]=I[P++]))}break}}break}}while(a>3,a-=b,l-=b<<3,c&=(1<{const c=y.bits;let l,g,u,h,f,_,v=0,b=0,w=0,P=0,S=0,k=0,I=0,C=0,A=0,M=0,E=null,R=0;const T=new Uint16Array(16),V=new Uint16Array(16);let D,U,B,x=null,F=0;for(v=0;v<=15;v++)T[v]=0;for(b=0;b=1&&0===T[P];P--);if(S>P&&(S=P),0===P)return s[m++]=20971520,s[m++]=20971520,y.bits=1,0;for(w=1;w0&&(0===e||1!==P))return-1;for(V[1]=0,v=1;v<15;v++)V[v+1]=V[v]+T[v];for(b=0;b852||2===e&&A>592)return 1;for(;;){D=v-I,d[b]<_?(U=0,B=d[b]):d[b]>_?(U=x[F+d[b]],B=E[R+d[b]]):(U=96,B=0),l=1<>I)+g]=D<<24|U<<16|B|0}while(0!==g);for(l=1<>=1;if(0!==l?(M&=l-1,M+=l):M=0,b++,0==--T[v]){if(v===P)break;v=t[a+d[b]]}if(v>S&&(M&h)!==u){for(0===I&&(I=S),f+=w,k=v-I,C=1<852||2===e&&A>592)return 1;u=M&h,s[u]=S<<24|k<<16|f-m|0}}return 0!==M&&(s[f+M]=v-I<<24|64<<16|0),y.bits=S,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:y,Z_BLOCK:c,Z_TREES:l,Z_OK:g,Z_STREAM_END:u,Z_NEED_DICT:h,Z_STREAM_ERROR:f,Z_DATA_ERROR:_,Z_MEM_ERROR:v,Z_BUF_ERROR:b,Z_DEFLATED:w}=d,P=12,S=30,k=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function I(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const C=e=>{if(!e||!e.state)return f;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,g},A=e=>{if(!e||!e.state)return f;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,C(e)},M=(e,t)=>{let a;if(!e||!e.state)return f;const n=e.state;return t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,A(e))},E=(e,t)=>{if(!e)return f;const a=new I;e.state=a,a.window=null;const n=M(e,t);return n!==g&&(e.state=null),n};let R,T,V=!0;const D=e=>{if(V){R=new Int32Array(512),T=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(m(1,e.lens,0,288,R,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;m(2,e.lens,0,32,T,0,e.work,{bits:5}),V=!1}e.lencode=R,e.lenbits=9,e.distcode=T,e.distbits=5},U=(e,t,a,n)=>{let s;const i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(t.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(s=i.wsize-i.wnext,s>n&&(s=n),i.window.set(t.subarray(a-n,a-n+s),i.wnext),(n-=s)?(i.window.set(t.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave{let i,r,p,o,d,I,C,A,M,E,R,T,V,B,x,F,L,N,O,q,G,K,z=0;const j=new Uint8Array(4);let H,W;const J=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return f;i=e.state,i.mode===P&&(i.mode=13),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,I=e.avail_in,A=i.hold,M=i.bits,E=I,R=C,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0),A=0,M=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&A)<<8)+(A>>8))%31){e.msg="incorrect header check",i.mode=S;break}if((15&A)!==w){e.msg="unknown compression method",i.mode=S;break}if(A>>>=4,M-=4,G=8+(15&A),0===i.wbits)i.wbits=G;else if(G>i.wbits){e.msg="invalid window size",i.mode=S;break}i.dmax=1<>8&1),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===I)break e;I--,A+=r[o++]<>>8&255,j[2]=A>>>16&255,j[3]=A>>>24&255,i.check=n(i.check,j,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>8),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(T=i.length,T>I&&(T=I),T&&(i.head&&(G=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(r.subarray(o,o+T),G)),512&i.flags&&(i.check=n(i.check,r,T,o)),I-=T,o+=T,i.length-=T),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===I)break e;T=0;do{G=r[o+T++],i.head&&G&&i.length<65536&&(i.head.name+=String.fromCharCode(G))}while(G&&T>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=P;break;case 10:for(;M<32;){if(0===I)break e;I--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===I)break e;I--,A+=r[o++]<>>=1,M-=1,3&A){case 0:i.mode=14;break;case 1:if(D(i),i.mode=20,a===l){A>>>=2,M-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=S}A>>>=2,M-=2;break;case 14:for(A>>>=7&M,M-=7&M;M<32;){if(0===I)break e;I--,A+=r[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=S;break}if(i.length=65535&A,A=0,M=0,i.mode=15,a===l)break e;case 15:i.mode=16;case 16:if(T=i.length,T){if(T>I&&(T=I),T>C&&(T=C),0===T)break e;p.set(r.subarray(o,o+T),d),I-=T,o+=T,C-=T,d+=T,i.length-=T;break}i.mode=P;break;case 17:for(;M<14;){if(0===I)break e;I--,A+=r[o++]<>>=5,M-=5,i.ndist=1+(31&A),A>>>=5,M-=5,i.ncode=4+(15&A),A>>>=4,M-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=S;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,M-=3}for(;i.have<19;)i.lens[J[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,H={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid code lengths set",i.mode=S;break}i.have=0,i.mode=19;case 19:for(;i.have>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===I)break e;I--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(W=x+2;M>>=x,M-=x,0===i.have){e.msg="invalid bit length repeat",i.mode=S;break}G=i.lens[i.have-1],T=3+(3&A),A>>>=2,M-=2}else if(17===L){for(W=x+3;M>>=x,M-=x,G=0,T=3+(7&A),A>>>=3,M-=3}else{for(W=x+7;M>>=x,M-=x,G=0,T=11+(127&A),A>>>=7,M-=7}if(i.have+T>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=S;break}for(;T--;)i.lens[i.have++]=G}}if(i.mode===S)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=S;break}if(i.lenbits=9,H={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,H={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,H),i.distbits=H.bits,K){e.msg="invalid distances set",i.mode=S;break}if(i.mode=20,a===l)break e;case 20:i.mode=21;case 21:if(I>=6&&C>=258){e.next_out=d,e.avail_out=C,e.next_in=o,e.avail_in=I,i.hold=A,i.bits=M,s(e,R),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,I=e.avail_in,A=i.hold,M=i.bits,i.mode===P&&(i.back=-1);break}for(i.back=0;z=i.lencode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===I)break e;I--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===I)break e;I--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,i.length=L,0===F){i.mode=26;break}if(32&F){i.back=-1,i.mode=P;break}if(64&F){e.msg="invalid literal/length code",i.mode=S;break}i.extra=15&F,i.mode=22;case 22:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;z=i.distcode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===I)break e;I--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===I)break e;I--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,64&F){e.msg="invalid distance code",i.mode=S;break}i.offset=L,i.extra=15&F,i.mode=24;case 24:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=S;break}i.mode=25;case 25:if(0===C)break e;if(T=R-C,i.offset>T){if(T=i.offset-T,T>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=S;break}T>i.wnext?(T-=i.wnext,V=i.wsize-T):V=i.wnext-T,T>i.length&&(T=i.length),B=i.window}else B=p,V=d-i.offset,T=i.length;T>C&&(T=C),C-=T,i.length-=T;do{p[d++]=B[V++]}while(--T);0===i.length&&(i.mode=21);break;case 26:if(0===C)break e;p[d++]=i.length,C--,i.mode=21;break;case 27:if(i.wrap){for(;M<32;){if(0===I)break e;I--,A|=r[o++]<{if(!e||!e.state)return f;let t=e.state;return t.window&&(t.window=null),e.state=null,g},N=(e,t)=>{if(!e||!e.state)return f;const a=e.state;return 0==(2&a.wrap)?f:(a.head=t,t.done=!1,g)},O=(e,a)=>{const n=a.length;let s,i,r;return e&&e.state?(s=e.state,0!==s.wrap&&11!==s.mode?f:11===s.mode&&(i=1,i=t(i,a,n,0),i!==s.check)?_:(r=U(e,a,n,n),r?(s.mode=31,v):(s.havedict=1,g))):f};const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let G=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){G=!1}const K=new Uint8Array(256);for(let e=0;e<256;e++)K[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;K[254]=K[254]=1;var z=(e,t)=>{let a,n;const s=t||e.length,i=new Array(2*s);for(n=0,a=0;a4)i[n++]=65533,a+=r-1;else{for(t&=2===r?31:3===r?15:7;r>1&&a1?i[n++]=65533:t<65536?i[n++]=t:(t-=65536,i[n++]=55296|t>>10&1023,i[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&G)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let a="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let a=t-1;for(;a>=0&&128==(192&e[a]);)a--;return a<0||0===a?t:a+K[e[a]]>t?a:t},H={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},W=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},J=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Z=Object.prototype.toString,{Z_NO_FLUSH:Q,Z_FINISH:X,Z_OK:$,Z_STREAM_END:Y,Z_NEED_DICT:ee,Z_STREAM_ERROR:te,Z_DATA_ERROR:ae,Z_MEM_ERROR:ne}=d;function se(e){this.options=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const t in a)q(a,t)&&(e[t]=a[t])}}return e}({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new W,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==$)throw new Error(H[a]);if(this.header=new J,N(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=(e=>{let t,a,n,s,i,r=e.length,p=0;for(s=0;s>>6,t[i++]=128|63&a):a<65536?(t[i++]=224|a>>>12,t[i++]=128|a>>>6&63,t[i++]=128|63&a):(t[i++]=240|a>>>18,t[i++]=128|a>>>12&63,t[i++]=128|a>>>6&63,t[i++]=128|63&a);return t})(t.dictionary):"[object ArrayBuffer]"===Z.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(a=O(this.strm,t.dictionary),a!==$)))throw new Error(H[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||H[a.err];return a.result}se.prototype.push=function(e,t){const a=this.strm,n=this.options.chunkSize,s=this.options.dictionary;let i,r,p;if(this.ended)return!1;for(r=t===~~t?t:!0===t?X:Q,"[object ArrayBuffer]"===Z.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=F(a,r),i===ee&&s&&(i=O(a,s),i===$?i=F(a,r):i===ae&&(i=ee));a.avail_in>0&&i===Y&&a.state.wrap>0&&0!==e[a.next_in];)B(a),i=F(a,r);switch(i){case te:case ae:case ee:case ne:return this.onEnd(i),this.ended=!0,!1}if(p=a.avail_out,a.next_out&&(0===a.avail_out||i===Y))if("string"===this.options.to){let e=j(a.output,a.next_out),t=a.next_out-e,s=z(a.output,e);a.next_out=t,a.avail_out=n-t,t&&a.output.set(a.output.subarray(e,e+t),0),this.onData(s)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==$||0!==p){if(i===Y)return i=L(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},se.prototype.onData=function(e){this.chunks.push(e)},se.prototype.onEnd=function(e){e===$&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(e=>{let t=0;for(let a=0,n=e.length;ae+(t.byteLength||t.length),0),a=new Uint8Array(t);let n=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length}),a}function s(e){const t=e.length,a=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(a[n++]=parseInt(e.charAt(0),16));for(let s=n;sPromise.resolve(e()).then(t);return this.then(e=>t(()=>e),e=>t(()=>Promise.reject(e)))},Promise.prototype.safeFinally=function(e){return this.catch(()=>{}).finally(e)};const r={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};r.http=location.search.indexOf("http=1")>0,r.http&&(r.transport="https");var p=r;const o=p.debug,m="undefined"!=typeof window?window:self;var d=o;const y="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,c="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!y,l=c||y,g=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(a=>{a.length&&a.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},u=(...e)=>{self.postMessage(...e)},h=()=>{},f=y?g.bind(null,!1):c?u:h,_=y?g.bind(null,!0):c?u:h;class v{constructor(){this.prefix="",this.cache={},this.useStorage=!0,p.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const a in e)if(e.hasOwnProperty(a)){const n=e[a];if(this.cache[a]=n,this.useStorage&&!t)try{const e=JSON.stringify(n);localStorage.setItem(this.prefix+a,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class b{constructor(){this.taskId=0,this.tasks={},b.STORAGES.push(this),l||(this.storage=new v)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((a,n)=>{if(l){const n=this.taskId++;this.tasks[n]=a;f({type:"localStorageProxy",id:n,payload:{type:e,args:t}})}else{t=Array.prototype.slice.call(t);a(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}b.STORAGES=[];const w=new b;m.appStorage=w;var P=w,S={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-1460809483,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-818518751,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-516145888,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:1370914559,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"string"}],type:"MessagePeerReaction"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:-396644838,method:"messages.getUnreadReactions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-2099097129,method:"messages.readReactions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"}]},layer:138};function k(e){return"object"==typeof e&&null!==e}var I=a(1),C=a.n(I);function A(e,t){return C.a.inflate(e,t?{to:"string"}:void 0)}var M=a(0),E=a.n(M);function R(e){return e>>>0}function T(e,t){return e=R(e),t=R(t),E()(e).shiftLeft(32).add(E()(t)).toString(10)}const V=+S.API.constructors.find(e=>"boolFalse"===e.predicate).id,D=+S.API.constructors.find(e=>"boolTrue"===e.predicate).id,U=+S.API.constructors.find(e=>"vector"===e.predicate).id,B=+S.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class x{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(D,(t||"")+":bool"):this.writeInt(V,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);"string"!=typeof e&&(e=e?e.toString():"0");const{quotient:a,remainder:n}=E()(e).divmod(4294967296),s=a.toJSNumber(),i=n.toJSNumber();this.writeInt(i,(t||"")+":long[low]"),this.writeInt(s,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),n=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(n[0],(t||"")+":double[low]"),this.writeInt(n[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const n=a.length;n<=253?this.byteView[this.offset++]=n:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&n,this.byteView[this.offset++]=(65280&n)>>8,this.byteView[this.offset++]=(16711680&n)>>16);for(let e=0;e>>",i(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const n=e.length;if(t%32||8*n!==t){const s=new Error("Invalid bits: "+t+", "+n);throw console.error(s,e,a),s}this.debug&&console.log(">>>",i(e),(a||"")+":int"+t),this.checkLength(n),this.byteView.set(e,this.offset),this.offset+=n}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",i(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?S.MTProto:S.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const n=t.pFlags||t,s={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),s=e[0].split(".");if(!(t[s[0]]&1<<+s[1])){if(!("true"===e[1]?n[i.name]:void 0!==t[i.name]))continue;t[s[0]]|=1<<+s[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,s[i.name]=r)}for(let e in s)this.intView[s[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(U,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const n=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===s);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+s+" found");s===t&&(i=!0),i||this.writeInt(r.id,a+"["+s+"][id]");const p=e.pFlags,o={};for(const t of r.params){let n=t.type;if(-1!==n.indexOf("?")){const a=n.split("?"),s=a[0].split(".");if(!(e[s[0]]&1<<+s[1])){if(!("true"===a[1]?p&&p[t.name]:void 0!==e[t.name]))continue;e[s[0]]|=1<<+s[1]}n=a[1]}const i=this.storeObject(e[t.name],n,a+"["+s+"]["+t.name+"]");"#"===n&&(e[t.name]=e[t.name]||0,o[t.name]=i)}for(let t in o)this.intView[o[t]]=e[t];return r.type}}class F{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),n=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),n[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=T(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===D||t!==V&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,n="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const n=new Array(e);for(let t=0;t0){const s=e.substr(7,e.length-8);for(let e=0;ee.type===t),!n)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===B){const a=A(this.fetchBytes(t+"[packed_string]"));return new F(a).fetchObject(e,t)}if(i===U)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e0&&p{const t=new Uint8Array(e.length);for(let a=0;a{const a=t.subtract(e);return!(a.isNegative()||a.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:v,a_for_hash:b,u:w}=yield(()=>z(this,void 0,void 0,(function*(){for(;;){const e=L(c(t.secure_random)),a=p.modPow(e,r);if(_(a,r)){const t=N(a),s=yield Ve.invokeCrypto("sha256",n(t,h)),i=E()(s.hex,16);if(!i.isZero()&&!i.isNegative())return{a:e,a_for_hash:t,u:i}}}})))();let P;P=l.greater(f)?l:l.add(r),P=P.subtract(f).mod(r);const S=w.multiply(m),k=v.add(S),I=P.modPow(k,r),C=yield Ve.invokeCrypto("sha256",d(N(I),256));let A=yield Ve.invokeCrypto("sha256",g);A=G(A,yield Ve.invokeCrypto("sha256",u));const M=n(A,yield Ve.invokeCrypto("sha256",s.salt1),yield Ve.invokeCrypto("sha256",s.salt2),b,h,C),R=yield Ve.invokeCrypto("sha256",M);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(b),M1:R}}))}var H=new Uint8Array(256),W=new Uint8Array(256),J=new Uint32Array(256),Z=new Uint32Array(256),Q=new Uint32Array(256),X=new Uint32Array(256),$=new Uint32Array(256),Y=new Uint32Array(256),ee=new Uint32Array(256),te=new Uint32Array(256);function ae(e){if(e instanceof Uint32Array)return e;if("string"==typeof e){if(e.length%4!=0)for(var t=e.length%4;t<=4;t++)e+="\0x00";var a=new Uint32Array(e.length/4);for(t=0;t>7),r[i[m]^m]=m;for(;!H[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,H[p]=a,W[a]=p,s=16843009*i[t=i[e=i[p]]]^65537*t^257*e^16843008*p,n=257*i[a]^16843008*a,J[p]=n=n<<24^n>>>8,Z[p]=n=n<<24^n>>>8,Q[p]=n=n<<24^n>>>8,X[p]=n=n<<24^n>>>8,$[a]=s=s<<24^s>>>8,Y[a]=s=s<<24^s>>>8,ee[a]=s=s<<24^s>>>8,te[a]=s=s<<24^s>>>8,o=r[o]||1}();var se=function(){function e(e){var t=ae(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var a,n=1,s=t.length;s<4*t.length+28;s++)a=this.encKey[s-1],(s%t.length==0||8===t.length&&s%t.length==4)&&(a=H[a>>>24]<<24^H[a>>16&255]<<16^H[a>>8&255]<<8^H[255&a],s%t.length==0&&(a=a<<8^a>>>24^n<<24,n=n<<1^283*(n>>7))),this.encKey[s]=this.encKey[s-t.length]^a;for(var i=0;s;i++,s--)a=this.encKey[3&i?s:s-4],this.decKey[i]=s<=4||i<4?a:$[H[a>>>24]]^Y[H[a>>16&255]]^ee[H[a>>8&255]]^te[H[255&a]]}return e.prototype.encrypt=function(e){for(var t,a,n,s=ae(e),i=new Uint32Array(4),r=s[0]^this.encKey[0],p=s[1]^this.encKey[1],o=s[2]^this.encKey[2],m=s[3]^this.encKey[3],d=this.encKey.length/4-2,y=4,c=0;c>>24]^Z[p>>16&255]^Q[o>>8&255]^X[255&m]^this.encKey[y],a=J[p>>>24]^Z[o>>16&255]^Q[m>>8&255]^X[255&r]^this.encKey[y+1],n=J[o>>>24]^Z[m>>16&255]^Q[r>>8&255]^X[255&p]^this.encKey[y+2],m=J[m>>>24]^Z[r>>16&255]^Q[p>>8&255]^X[255&o]^this.encKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[c]=H[r>>>24]<<24^H[p>>16&255]<<16^H[o>>8&255]<<8^H[255&m]^this.encKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e.prototype.decrypt=function(e){for(var t,a,n,s=ae(e),i=new Uint32Array(4),r=s[0]^this.decKey[0],p=s[3]^this.decKey[1],o=s[2]^this.decKey[2],m=s[1]^this.decKey[3],d=this.decKey.length/4-2,y=4,c=0;c>>24]^Y[p>>16&255]^ee[o>>8&255]^te[255&m]^this.decKey[y],a=$[p>>>24]^Y[o>>16&255]^ee[m>>8&255]^te[255&r]^this.decKey[y+1],n=$[o>>>24]^Y[m>>16&255]^ee[r>>8&255]^te[255&p]^this.decKey[y+2],m=$[m>>>24]^Y[r>>16&255]^ee[p>>8&255]^te[255&o]^this.decKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[3&-c]=W[r>>>24]<<24^W[p>>16&255]<<16^W[o>>8&255]<<8^W[255&m]^this.decKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e}(),ie=function(){function e(e,t,a){void 0===a&&(a=16),this.key=ae(e),this.iv=ae(t),this.cipher=new se(e),this.blockSize=a/4}return e.prototype.encrypt=function(e,t){for(var a=ae(e),n=t||new Uint32Array(a.length),s=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),r=new Uint32Array(this.blockSize),p=0;p=this.blockSize&&this.incrementCounter(),s&&(i-=s,s=0)}return this.offset=(this.offset+a.length%4)%4,n},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}(),se);function pe(e){const t=new Uint8Array(e.byteLength);for(let a=0,n=4*e.length;a>>2]>>>24-a%4*8&255;return t}function oe(e){const t=K(e),a=[];for(let e=0,n=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}function me(e,t,a,n=!0){return pe(new ie(oe(t),oe(a))[n?"encrypt":"decrypt"](oe(e)))}function de(e,t,a){return me(q(e),t,a,!0)}function ye(e,t,a){return me(e,t,a,!1)}var ce="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle,le=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function ge(e,t,a){return le(this,void 0,void 0,(function*(){const n=yield ce.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return ce.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},n,512).then(e=>new Uint8Array(e))}))}function ue(e,t){return O(e,s(t.exponent),s(t.modulus))}function he(e){return ce.digest("SHA-1",K(e)).then(e=>new Uint8Array(e))}function fe(e){return ce.digest("SHA-256",K(e)).then(e=>new Uint8Array(e))}const _e={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function ve(e){const t=_e[e];return crypto.getRandomValues(t),t[0]}function be(){return""+ve(32)+ve(32)%16777215}function we(e,t){return E.a.randBetween(e,t,()=>ve(32)/4294967295)}function Pe(e){const t=E.a[2];if(e.remainder(t).isZero())return t;const a=E()(1e3);let n,s,i,r,p,o,m;do{n=we(E.a.one,e.minus(1))}while(n.isZero()||n.eq(e.minus(t)));i=we(E.a.one,e.minus(1)),p=E.a.one,o=E.a.one;const d=E()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),y=a=>((a=(a=a.pow(t).mod(e)).add(n)).lesser(n)&&(a=a.add(d)),a=a.mod(e));do{s=i;for(let e=0;E()(e).lesser(p);++e)i=y(i);let t=E.a.zero;do{r=i;const n=E.a.min(a,p.minus(t));for(let t=0;E()(t).lesser(n);++t)i=y(i),o=o.multiply(s.greater(i)?s.minus(i):i.minus(s)).mod(e);m=E.a.gcd(o,e),t=t.add(a)}while(t.lesser(p)&&m.eq(E.a.one));p=p.shiftLeft(E.a.one)}while(m.eq(E.a.one));if(m.eq(e))do{r=y(r),m=E.a.gcd(s.minus(r).abs(),e)}while(m.eq(E.a.one));return m}function Se(e){let t=function(e){const t=L(e),a=[],n=[];let s=Pe(t);a.push(t.divide(s)),a.push(s);do{const e=a.pop();if(!e.eq(E.a.one))if(e.isPrime(!0)){n.push(e);for(let t=0;te.compare(t)),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce((e,t)=>e.multiply(t),E.a.one)]);const a=t[0],n=t[t.length-1];return(a.lesser(n)?[a,n]:[n,a]).map(e=>N(e))}var ke=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function Ie(e){return ke(this,void 0,void 0,(function*(){const{p:t,g:a}=e,n=(e=>{for(;;){const t=new Uint8Array(e.length).randomize(),a=L(t);if(!a.greater(E.a.one))continue;const n=L(e);if(a.lesser(n.subtract(E.a.one)))return t}})(t),i=s(a.toString(16)),r=q(yield Ve.invokeCrypto("mod-pow",i,n,t),256,!0,!0,!0);return{a:n,g_a:r,g_a_hash:yield Ve.invokeCrypto("sha256",r),p:t}}))}var Ce=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function Ae(e,t,a){return Ce(this,void 0,void 0,(function*(){const n=yield Ve.invokeCrypto("mod-pow",e,t,a);return{key:n,key_fingerprint:L((yield Ve.invokeCrypto("sha1",n)).slice(-8).reverse()).toString(10)}}))}var Me=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function Ee(e){const t=e.length,a=8*t;let n=E()(e[0]).and(127).shiftLeft(a-8);for(let s=1;s{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|ve(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return T(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),n=Math.abs(this.timeOffset-a)>10;P.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a;return f({type:"applyServerTimeOffset",payload:a}),n}};m.timeManager=De;var Ue=De;var Be="undefined"!=typeof window?window:self;const xe=navigator?navigator.userAgent:null,Fe=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&Be.MSStream,!!("safari"in Be)||!(!xe||!(/\b(iPad|iPhone|iPod)\b/.test(xe)||xe.match("Safari")&&!xe.match("Chrome")))),Le=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;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);var Ne;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(Ne||(Ne={}));const Oe=[Ne.None,Ne.Error,Ne.Warn,Ne.Log,Ne.Debug],qe=Date.now();function Ge(){return"["+((Date.now()-qe)/1e3).toFixed(3)+"]"}let Ke;const ze=Fe||Le;Ke=ze?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const je=!ze,He=ze?2:3;function We(){const e=(new Error).stack.split("\n"),t=e[He]||e[e.length-1];return"["+(Ke(t)||"")+"]"}const Je={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},Ze=[["debug",Ne.Debug],["info",Ne.Log],["warn",Ne.Warn],["error",Ne.Error],["assert",Ne.Error],["trace",Ne.Log]];function Qe(e,t=Ne.Log|Ne.Warn|Ne.Error,a=!1,n=""){let s;d||a||(t=Ne.Error),je?n||(y?n=Je.yellow:c&&(n=Je.cyan)):n="";let i=n;n=n?`%s ${n}%s`:"%s";const r=function(...a){return t&Ne.Log&&console.log(n,Ge(),e,We(),...a)};return Ze.forEach(([a,s])=>{r[a]=function(...i){return t&s&&console[a](n,Ge(),e,We(),...i)}}),r.setPrefix=function(t){s=t,e="["+t+"]"},r.setPrefix(e),r.setLevel=function(e){t=Oe.slice(0,e+1).reduce((e,t)=>e|t,0)},r.bindPrefix=function(e){return Qe(`${s}] [${e}`,t,a,i)},r}const Xe={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.0",versionFull:"1.4.0 (133)",build:133,langPackVersion:"0.4.0",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};Xe.isMainDomain&&(Xe.id=2496,Xe.hash="8da85b0d5bfe62527e5b244c209159c3");var $e=Xe;function Ye(){}const et=e=>new Promise(t=>{setTimeout(t,e)});function tt(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((a,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,a(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(Ye).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}class at{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,a){var n,s;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:a}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(s=a)||void 0===s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,a){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...a){this.reuseResults&&(this.listenerResults[e]=a);const n=t&&[],s=this.listeners[e];if(s){s.slice().forEach(t=>{var i;if(-1===s.findIndex(e=>e.callback===t.callback))return;let r;try{r=t.callback(...a)}catch(e){console.error(e)}n&&n.push(r),(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,t.callback)})}return n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}function nt(e,t){const a=e.indexOf(t),n=-1!==a&&e.splice(a,1);return n&&n[0]}class st extends at{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.debug=p.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let n=Ne.Error|Ne.Log;return this.debug&&(n|=Ne.Debug),this.log=Qe("WS-"+e+a,n),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}var it,rt,pt,ot,mt=function(e,t,a,n,s){if("m"===n)throw new TypeError("Private method is not writable");if("a"===n&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===n?s.call(e,a):s?s.value=a:t.set(e,a),a},dt=function(e,t,a,n){if("a"===a&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?n:"a"===a?n.call(e):n?n.value:t.get(e)};class yt{constructor(e){this.counter=e}increment(){const e=this.counter;for(let t=15;t>=0;--t){if(255!==e[t]){++e[t];break}e[t]=0}}}class ct{constructor(e,t){it.set(this,void 0),rt.set(this,void 0),pt.set(this,void 0),ot.set(this,void 0),mt(this,it,new yt(t),"f"),mt(this,ot,new re(e),"f"),mt(this,pt,16,"f")}update(e){var t,a;const n=e.slice();for(let e=0;e{this.connected=!0,kt.setTransportOpened("websocket");const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(gt.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),n=a-this.lastCloseTime;e=!isNaN(n)&&n{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(gt.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=Ne.Error|Ne.Log;this.debug&&(i|=Ne.Debug),this.log=Qe("TCP-"+t+n,i),this.log("constructor"),this.connect()}clear(){this.connected&&kt.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.pending.forEach(e=>{e.reject&&e.reject()}),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,n)=>{this.pending.push({resolve:a,reject:n,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",n.length),i||(i=a.encoded=this.encodeBody(n)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let ft=0;class _t extends at{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++ft,vt.set(this.id,this);const n={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};_(n)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};_(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};_(e)}}const vt=new Map,bt=p.test?"_test":"";class wt{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=p.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+bt,s=`wss://${$e.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;return new ht(Fe&&c&&void 0!==_t?_t:st,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let n;if(p.ssl||!p.http){n="https://"+(this.sslSubdomains[e-1]+("client"!==t?"-1":""))+".web.telegram.org/"+(p.test?"apiw_test1":"apiw1")}else for(let t of this.dcOptions)if(t.id===e){n="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new Ct(e,n,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=p.transport,n=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const s=this.chosenServers[a][t];e in s||(s[e]=[]);const i=s[e];if(!i.length||!n){let s;const r="client"===t?"":"-1";return s=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,r),s?(n&&i.push(s),s):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const n in e[a])for(const s in e[a][n]){nt(e[a][n][s],t)}}}var Pt=new wt,St=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var kt=new class extends at{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",e=>{e.get("websocket")||this.waitForWebSocket()}),setTimeout(()=>{this.waitForWebSocket()},200)}pingTransports(){return St(this,void 0,void 0,(function*(){const e=this.transports={https:Pt.chooseServer($e.baseDcId,"client","https",!1),websocket:Pt.chooseServer($e.baseDcId,"client","websocket",!1)},t=tt();this.transports.https._send(new Uint8Array,"no-cors").then(()=>t.resolve(!0),()=>t.resolve(!1)),setTimeout(()=>t.resolve(!1),2e3);const a=tt(),n=e.websocket;n.setAutoReconnect(!1),n.connection.addEventListener("close",()=>a.resolve(!1),{once:!0}),n.connection.addEventListener("open",()=>a.resolve(!0),{once:!0}),setTimeout(()=>a.resolve(!1),2e3);const[s,i]=yield Promise.all([t,a]);for(const t in e){e[t].destroy()}return{https:s||this.opened.get("https")>0,websocket:i||this.opened.get("websocket")>0}}))}waitForWebSocket(){return St(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield et(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}},It=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class Ct{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=p.debug&&!1;let n=Ne.Error|Ne.Log;this.debug&&(n|=Ne.Debug),this.log=Qe("HTTP-"+e+a,n),this.log("constructor"),this.connected=!1}_send(e,t){return this.debug&&this.log.debug("-> body length to send:",e.length),fetch(this.url,{method:"POST",body:e,mode:t}).then(e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then(e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))}),e;return this.setConnected(!0),e.arrayBuffer().then(e=>new Uint8Array(e))},e=>{throw this.setConnected(!1),e})}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,kt.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach(e=>e.reject()),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})});return this.releasePending(),t}}releasePending(){return It(this,void 0,void 0,(function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()})},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new x({mtproto:!0}),a=be();t.storeMethod("ping",{ping_id:a});const n={msg_id:Ue.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(gt.Connecting),this.sendEncryptedRequest(n).then(()=>{this.toggleOffline(!1)},()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=Be.setTimeout(()=>this.checkConnection("from failed checkConnection request"),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)})},this.authKeyUint8=K(this.authKey),this.serverSalt=K(n),this.isFileUpload=!!s.fileUpload,this.isFileDownload=!!s.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const i=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+i,this.log=Qe(this.name,Ne.Log|Ne.Debug|Ne.Error|Ne.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&function(e,t){for(let a=e.length-1;a>=0;--a)t(e[a],a,e)}(t.inner,(e,a)=>{const n=this.updateSentMessage(e);n?t.inner[a]=n.msg_id:t.inner.splice(a,1)}),t.msg_id=Ue.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const n=new x({mtproto:!0});n.storeMethod(e,t);const s=Ue.generateId(),i=this.generateSeqNo(),r={msg_id:s,seq_no:i,body:n.getBytes(!0)};return p.debug&&this.log("MT call",e,t,s,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new x({mtproto:!0});a.storeObject(e,"Object");const n=Ue.generateId(),s=this.generateSeqNo(t.notContentRelated),i={msg_id:n,seq_no:s,body:a.getBytes(!0)};return p.debug&&this.log("MT message",e,n,s),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const n=new x(a);if(!this.connectionInited){const e=S.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");n.storeInt(+e.id,"invokeWithLayer"),n.storeInt(S.layer,"layer");const t=S.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");n.storeInt(+t.id,"initConnection"),n.storeInt(0,"flags"),n.storeInt($e.id,"api_id"),n.storeString(Vt.userAgent||"Unknown UserAgent","device_model"),n.storeString(navigator.platform||"Unknown Platform","system_version"),n.storeString($e.version+($e.isMainDomain?" "+$e.suffix:""),"app_version"),n.storeString(navigator.language||"en","system_lang_code"),n.storeString($e.langPack,"lang_pack"),n.storeString(Vt.language,"lang_code")}if(a.afterMessageId){if(void 0===Et){const e=S.API.methods.find(e=>"invokeAfterMsg"===e.method);Et=e?+e.id:0}Et?(n.storeInt(Et,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:Ue.generateId(),seq_no:this.generateSeqNo(),body:n.getBytes(!0),isAPI:!0};return p.debug?this.log("Api call",e,s,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(s,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.transport=e,e&&(e.networker=this,e instanceof Ct&&(this.longPollInterval=Be.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connected&&e.connection&&this.setConnectionStatus(gt.Connected),this.resend())}destroy(){this.changeTransport()}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}sendLongPoll(){if(this.sendingLongPoll)return;this.sendingLongPoll=!0;this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then(()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)},e=>{this.log("Long-poll failed",e)}).finally(()=>{this.sendingLongPoll=void 0})}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(gt.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=Be.setTimeout(()=>this.checkConnection("from toggleOfline"),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(gt.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?gt.Closed:gt.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then(e=>(this.toggleOffline(!1),this.parseResponse(e).then(e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))),e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1)).then(e=>{a.forEach(t=>{if(this.sentMessages[t]){const a=this.sentMessages[t].deferred;delete this.sentMessages[t],delete this.pendingMessages[t],e?a.resolve():a.reject()}})})}pushMessage(e,t){const a=new Promise((a,n)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:n}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),k(t)&&(t.messageId=e.msg_id)});if(!t.notContentRelated&&!t.noResponse){const t=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(gt.TimedOut))},5e3);a.catch(Ye).finally(()=>{clearTimeout(t),this.setConnectionStatus(gt.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=Be.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){const a=e===gt.Connected,n=this.status!==e;this.isOnline=a,this.status=e,n&&(Vt.onConnectionStatusChange&&Vt.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest())}pushResend(e,t=100){const a=t?Date.now()+t:0,n=this.sentMessages[e];if(n.container)for(const e of n.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;n.acked&&this.log.error("pushResend: acked message?",n),this.debug&&this.log.debug("pushResend:",e,n,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Mt(this,void 0,void 0,(function*(){const a=t?0:8,s=n(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield Ve.invokeCrypto("sha256",s);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),s=new Uint8Array(52),i=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),i.push(Ve.invokeCrypto("sha256",n)),s.set(this.authKeyUint8.subarray(40+a,40+a+36),0),s.set(e,36),i.push(Ve.invokeCrypto("sha256",s)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),n=new Uint8Array(e[0]),s=new Uint8Array(e[1]);return t.set(n.subarray(0,8)),t.set(s.subarray(8,24),8),t.set(n.subarray(24,32),24),a.set(s.subarray(0,8)),a.set(n.subarray(8,24),8),a.set(s.subarray(24,32),24),[t,a]})}isStopped(){return Vt.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,n=!1,s=!1,i=!1;const r=Object.keys(this.pendingMessages).map(e=>E()(e)).sort((e,t)=>e.compare(t)).map(e=>e.toString(10));for(const p of r){const r=this.sentMessages[p];if(r&&r.body){const p=r.body.length+32;if(a+p>655360&&(this.log.warn("lengthOverflow",r,t),i=!0,e))break;t.push(r),a+=p,r.isAPI?n=!0:r.longPoll&&(s=!0),e=r}delete this.pendingMessages[p]}if(this.transport instanceof Ct&&n&&!s){const e=new x({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),t.push({msg_id:Ue.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!t.length)return;const p=t.filter(e=>e.noResponse).map(e=>e.msg_id);if(t.length>1){const n=this.generateContainerMessage(a,t);e=n.messageWithBody,this.sentMessages[e.msg_id]=n.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];const o=this.sendEncryptedRequest(e);this.transport instanceof Ct&&this.handleSentEncryptedRequestHTTP(o,e,p),this.transport instanceof Ct||this.cleanupSent(),i&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new x({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const n=[];t.forEach((e,t)=>{n.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const s={msg_id:Ue.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:n};return p.debug&&this.log.warn("Container",n,s.msg_id,s.seq_no),{message:s,messageWithBody:Object.assign({body:a.getBytes(!0)},s)}}getEncryptedMessage(e){return Mt(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield Ve.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>Ve.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new x({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+ve(8)%5),i=n(a,new Uint8Array(s).randomize());return this.getEncryptedMessage(i).then(e=>{const t=new x({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then(t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport.send(t);if(!(this.transport instanceof Ct))return a;const n={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then(e=>{if(!(null==e?void 0:e.byteLength))throw n;return e},e=>{throw e.message||e.type||(e=Object.assign(n,{type:"NETWORK_BAD_REQUEST",originalError:e})),e})})}parseResponse(e){this.lastResponseTime=Date.now();const t=new F(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!At(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const n=t.fetchIntBytes(128,!0,"msg_key"),s=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(n,s).then(e=>this.getMsgKey(e,!1).then(t=>{if(!At(n,t))throw this.log.warn("[MT] msg_keys",n,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new F(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const s=a.fetchIntBytes(64,!0,"session_id"),r=a.fetchLong("message_id");if(!(At(s,this.sessionId)||this.prevSessionId&&At(s,this.prevSessionId)))throw this.log.warn("Sessions",s,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+i(s));const p=a.fetchInt("seq_no"),o=e.byteLength,m=a.fetchInt("message_data[length]");let d=a.getOffset();if(m%4||m>o-d)throw new Error("[MT] Invalid body length: "+m);const y=a.fetchRawBytes(m,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);a=new F(y,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const n=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==n+e.bytes&&a.setOffset(n+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const n=this.sentMessages[e.req_msg_id],s=n&&n.resultType||"Object";e.req_msg_id&&!n||(e.result=a.fetchObject(s,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:r,sessionId:s,seqNo:p}}))}applyServerSalt(e){const t=(a=e,q(N(E()(a)).reverse(),8,!0,!1,!1));var a;P.set({["dc"+this.dcId+"_server_salt"]:i(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof Ct&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof Ct&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof Ct&&(t=3e4),this.scheduleRequest(t)}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach(t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}else e=!0}),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=Ue.applyServerTime(E()(t).shiftRight(32).toJSNumber());(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const n=this.updateSentMessage(e.bad_msg_id);n&&this.pushResend(n.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),P.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&Vt.updatesProcessor&&Vt.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,n=this.sentMessages[a];if(this.processMessageAck(a),n){const t=n.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),n.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t]);break}default:this.ackMessage(t),null!==Vt.updatesProcessor&&Vt.updatesProcessor(e)}}}const Tt=new class{constructor(){this.networkers=[],this.language=navigator.language||$e.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){nt(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,n,s){const i=new Rt(e,t,a,n,s);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter(e=>e.isStopped());this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};m&&(m.networkerFactory=Tt);var Vt=Tt,Dt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Ut=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,p.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map(e=>{const t=new x;t.storeBytes(s(e.modulus),"n"),t.storeBytes(s(e.exponent),"e");const a=t.getBuffer();return Ve.invokeCrypto("sha1",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[i(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return Dt(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(d&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw p;try{const t=new F(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const n=t.fetchLong("msg_id");"0"===n&&this.log.error("msg_id === 0",n);const s=t.fetchInt("msg_len");return s||this.log.error("no msg_len",s),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(p,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(p,{originalError:e})),e})}sendReqPQ(e){return Bt(this,void 0,void 0,(function*(){const t=new x({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d&&this.log("Send req_pq",e.nonce.hex);try{const n=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ut.prepare(),a=yield n}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!At(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d&&this.log("Got ResPQ",i(e.serverNonce),i(e.pq),e.fingerprints);const s=yield Ut.select(e.fingerprints);if(!s)throw new Error("[MT] No public key found");e.publicKey=s,d&&this.log("PQ factorization start",e.pq);try{var r=yield Ve.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Bt(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new x({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const s=q(n,192,!1,!0,!1),i=s.slice().reverse(),r=yield(()=>Bt(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=i.concat(yield Ve.invokeCrypto("sha256",t.concat(s)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield Ve.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),r=G(t,yield Ve.invokeCrypto("sha256",n)).concat(n),p=L(r),o=E()(e.publicKey.modulus,16);if(-1===p.compare(o))return r}})))(),p=q(yield Ve.invokeCrypto("rsa-encrypt",r,e.publicKey),256,!0,!0,!0),o={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},m=new x({mtproto:!0});m.storeMethod("req_DH_params",o);const y=m.getBytes(!0);let c;d&&this.log("Send req_DH_params",o);try{c=yield this.sendPlainRequest(e.dcId,y)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const l=c.fetchObject("Server_DH_Params","RESPONSE");if(d&&this.log("Sent req_DH_params, response:",l),"server_DH_params_fail"!==l._&&"server_DH_params_ok"!==l._)throw new Error("[MT] Server_DH_Params response invalid: "+l._);if(!At(e.nonce,l.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!At(e.serverNonce,l.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===l._){if(!At((yield Ve.invokeCrypto("sha1",e.newNonce)).slice(-16),l.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,l.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Bt(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield Ve.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield Ve.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield Ve.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield Ve.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield Ve.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),s=a.slice(20),i=new F(s,{mtproto:!0}),r=i.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==r._)throw new Error("[MT] server_DH_inner_data response invalid: "+r);if(!At(e.nonce,r.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!At(e.serverNonce,r.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d&&this.log("Done decrypting answer"),e.g=r.g,e.dhPrime=r.dh_prime,e.gA=r.g_a,e.serverTime=r.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=i.getOffset();if(!At(n,yield Ve.invokeCrypto("sha1",s.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");Ue.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d&&this.log("Verifying DH params",e,t,a);const n=i(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==n)throw new Error("[MT] DH params are not verified: unknown dhPrime");d&&this.log("dhPrime cmp OK");const s=L(a),r=E()(n,16);if(s.compare(E.a.one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(s.compare(r.subtract(E.a.one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d&&this.log("1 < gA < dhPrime-1 OK");const p=E()(2).pow(1984);if(s.compare(p)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(s.compare(r.subtract(p))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Bt(this,void 0,void 0,(function*(){const t=s(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var a=yield Ve.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new x({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield Ve.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield Ve.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),p=new x({mtproto:!0});let o;p.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d&&this.log("Send set_client_DH_params");try{o=yield this.sendPlainRequest(e.dcId,p.getBytes(!0))}catch(e){throw e}const m=o.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==m._&&"dh_gen_retry"!==m._&&"dh_gen_fail"!==m._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+m._);if(!At(e.nonce,m.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!At(e.serverNonce,m.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var y=yield Ve.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw y}const c=yield Ve.invokeCrypto("sha1",y),l=c.slice(0,8),g=c.slice(-8);switch(d&&this.log("Got Set_client_DH_params_answer",m._,y),m._){case"dh_gen_ok":{const t=(yield Ve.invokeCrypto("sha1",e.newNonce.concat([1],l))).slice(-16);if(!At(t,m.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,m),new Error("new_nonce_hash1 mismatch");const a=G(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d&&this.log("Auth successfull!",g,y,a),e.authKeyId=g,e.authKey=y,e.serverSalt=a,e}case"dh_gen_retry":if(!At((yield Ve.invokeCrypto("sha1",e.newNonce.concat([2],l))).slice(-16),m.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e);case"dh_gen_fail":if(!At((yield Ve.invokeCrypto("sha1",e.newNonce.concat([3],l))).slice(-16),m.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=kt.pingTransports().then(({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)})}auth(e){let t=this.cached[e];return t||(t=new Promise((t,a)=>Bt(this,void 0,void 0,(function*(){let n;yield this.getTransportType();let s=1;for(;s++<=3;)try{const a={dcId:e,nonce:new Uint8Array(16).randomize()},n=this.sendReqPQ(a);return void t(yield n)}catch(e){n=e}a(n)}))),this.cached[e]=t)}};function Ft(e,t=""){let a;const n=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{a=new Blob(e,{type:n})}catch(t){let s=new BlobBuilder;e.forEach(e=>{s.append(e)}),a=s.getBlob(n)}return a}class Lt{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let a in t)void 0!==t[a]&&(e[a]=t[a])}(this,e),p.test&&(this.name+="_test"),this.storeName=t,this.log=Qe("IDB-"+this.storeName),this.openDatabase(!0),Lt.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let a=!1;return setTimeout(()=>{a||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,n)=>{t.onsuccess=s=>{a=!0;const i=t.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{a=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},t.onupgradeneeded=e=>{a=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var a;const n=e.createObjectStore(t.name);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const e of t.indexes)n.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",a=>e.map((e,n)=>a.put(t[n],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Ft([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,a,n=this.storeName){let s;return a&&(s=performance.now(),this.log(a+": start")),this.openDatabase().then(i=>new Promise((r,p)=>{const o=i.transaction([n],e);o.onerror=e=>{clearTimeout(m),p(o.error)},o.oncomplete=e=>{clearTimeout(m),a&&this.log(a+": end",performance.now()-s);const t=c.map(e=>e.result);r(y?t:t[0])};const m=setTimeout(()=>{this.log.error("transaction not finished",o)},1e4),d=t(o.objectStore(n)),y=Array.isArray(d),c=y?d:[].concat(d)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}Lt.STORAGES=[];var Nt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Ot=new class{constructor(){this.log=Qe("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=p.transport,kt.addEventListener("transport",e=>{this.changeTransportType(e)})}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const n in a){const s=a[n];for(const a in s){s[a].forEach((s,i,r)=>{e({networker:s,dcId:+a,connectionType:n,transportType:t,index:i,array:r})})}}}}chooseServer(e,t,a){return Pt.chooseServer(e,t,a,"client"===t)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],n=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=n,this.transportType=e;for(const a in this.gettingNetworkers){const n=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const s=a.replace(t,e);this.gettingNetworkers[s]=n,this.log("changed networker getKey from",a,"to",s)}this.iterateNetworkers(e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)})}getBaseDcId(){return Nt(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield P.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId($e.baseDcId)),this.baseDcId}))}setUserAuth(e){return Nt(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}P.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,P.set({dc:this.baseDcId})}logOut(){return Nt(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>P.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,Lt.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(n,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(n)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const r=this.cachedNetworkers[n][a];e in r||(r[e]=[]);const p=r[e],o="client"===a||"https"===n?1:3;if(p.length>=o){let e=p.length-1,t=!1;for(;e>=0;--e)if(p[e].isOnline){t=!0;break}const a=t?p.splice(e,1)[0]:p.pop();return p.unshift(a),Promise.resolve(a)}let m=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[m])return this.gettingNetworkers[m];const d=`dc${e}_auth_key`,y=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[m]=Promise.all([d,y].map(e=>P.get(e))).then(([r,o])=>Nt(this,void 0,void 0,(function*(){let l,g;if(r&&512===r.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=s(r),n=(yield Ve.invokeCrypto("sha1",a)).slice(-8),i=s(o);l=Vt.getNetworker(e,a,n,i,t)}else try{const a=yield xt.auth(e);P.set({[d]:i(a.authKey),[y]:i(a.serverSalt)}),l=Vt.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){g=e}const u=this.getTransportType(a);if(u!==n&&(m=this.generateNetworkerGetKey(e,u,a),c.destroy(),wt.removeTransport(Pt.chosenServers,c),l&&(c=this.chooseServer(e,a,u)),this.log("transport has been changed during authorization from",n,"to",u)),delete this.gettingNetworkers[m],g)throw this.log("get networker error",g,g.stack),g;return this.changeNetworkerTransport(l,c),p.unshift(l),this.setOnDrainIfNeeded(l),l})))}changeNetworkerTransport(e,t){const a=e.transport;a&&wt.removeTransport(Pt.chosenServers,a),e.changeTransport(t)}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),Vt.removeNetworker(e),wt.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const n=tt();let{afterMessageId:s,prepareTempMessageId:i}=a;if(i&&n.then(()=>{delete this.afterMessageTempIds[i]}),m){const s=Date.now(),i=Be.setInterval(()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-s)/1e3)},5e3);n.catch(Ye).finally(()=>{clearInterval(i)})}const r=t=>{t?k(t)||(t={message:t}):t={type:"ERROR_EMPTY"},n.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=d||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)))};let p,o,d=(new Error).stack||"empty stack";const y=m=>{if(s){const e=this.afterMessageTempIds[s];e&&(a.afterMessageId=e.messageId)}const d=(o=m).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:n}),d.then(n.resolve,i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,p,e,t),401===i.code&&this.baseDcId===p)"SESSION_PASSWORD_NEEDED"!==i.type&&(P.delete("dc"),P.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&p!==this.baseDcId){if(void 0===this.cachedExportPromise[p]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:p},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:p,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[p]=e}this.cachedExportPromise[p].then(()=>{this.invokeApi(e,t,a).then(n.resolve,r)},r)}else if(303===i.code){const s=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];s!==p&&(a.dcId?a.dcId=s:this.setBaseDcId(s),this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const s=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];s!==p?this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r):r(i)}else if(400===i.code&&"CONNECTION_NOT_INITED"===i.type)Vt.unsetConnectionInited(),y(o);else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[s];s=void 0,delete a.afterMessageId,e?e.promise.then(()=>y(o)):y(o)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout(()=>{y(o)},1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout(()=>{y(o)},1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout(()=>{y(o)},1e3*e)}})};return(p=a.dcId||this.baseDcId)?this.getNetworker(p,a).then(y,r):this.getBaseDcId().then(e=>{this.getNetworker(p=e,a).then(y,r)}),n}};m.apiManager=Ot;var qt=Ot;function Gt(e){return function(e,t){return new Promise(a=>{const n=new FileReader;n.addEventListener("loadend",e=>{a(e.target.result)}),n[t](e)})}(e,"readAsArrayBuffer")}var Kt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var zt=new class{constructor(){this.blobSupported=!0;try{Ft([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(a=t,Gt(a).then(e=>new Uint8Array(e))).then(t=>e.write(t)):e.write(t);var a}getFakeFileWriter(e,t){const a=[];return{write:e=>Kt(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;a.push(e)})),truncate:()=>{a.length=0},finalize:(n=!0)=>{const s=Ft(a,e);return n&&t&&t(s),s}}}},jt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class Ht{constructor(e){this.dbName=e,this.useStorage=!0,p.test&&(this.dbName+="_test"),Ht.STORAGES.length&&(this.useStorage=Ht.STORAGES[0].useStorage),this.openDatabase(),Ht.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(a=>a.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=Ft(t));const a=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,a).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,a)=>jt(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{a(),n=!0},15e3);try{const a=yield this.openDatabase();if(!a)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(a);if(n)return;t(s)}catch(e){a(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const a=zt.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(a)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}Ht.STORAGES=[];var Wt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Jt=new class{constructor(){this.cacheStorage=new Ht("cachedFiles"),this.cachedDownloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.webpConvertPromises={},this.refreshReferencePromises={},this.log=Qe("AFM",Ne.Error|Ne.Log),this.tempId=0,this.queueId=0,this.debug=p.debug,this.uncompressTGS=(e,t)=>Ve.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.uncompressTGV=(e,t)=>Ve.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.convertWebp=(e,t)=>{const a=tt();return f({type:"convertWebp",payload:{fileName:t,bytes:e}}),this.webpConvertPromises[t]=a},setInterval(()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}},18e5)}downloadRequest(e,t,a,n,s=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise((e,r)=>{i.push({id:t,queueId:s,cb:a,deferred:{resolve:e,reject:r},activeDelta:n})});return setTimeout(()=>{this.downloadCheck(e)},0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const n=t.findAndSplice(e=>0===e.queueId)||t.findAndSplice(e=>e.queueId===this.queueId)||t.shift(),s=n.activeDelta||1;this.downloadActives[e]+=s,n.cb().then(t=>{this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.resolve(t)},t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.reject(t)})}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=(this.cachedDownloadPromises[e]?[this.cachedDownloadPromises[e]]:void 0)||(this.uploadPromises[e]?Array.from(this.uploadPromises[e]):[]);let a=!1;for(let e=0,n=t.length;eWt(this,void 0,void 0,(function*(){return r&&r(),qt.invokeApi("upload.getWebFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0})})),this.getDelta(n),i)}requestFilePart(e,t,a,n,s=0,r=0,p){return this.downloadRequest(e,s,()=>Wt(this,void 0,void 0,(function*(){p&&p();const s=()=>Wt(this,void 0,void 0,(function*(){p&&p();return qt.invokeApi("upload.getFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0}).catch(e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(s);throw e})})),r=t.file_reference;if(r&&!t.checkedReference){t.checkedReference=!0;const e=i(r);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(s)}return s()})),this.getDelta(n),r)}getDelta(e){return e/1024/128}getLimitPart(e){let t;return t=512,524288}refreshReference(e){const t=e.file_reference,a=i(t);let n=this.refreshReferencePromises[a];if(!n){const s=tt();n=this.refreshReferencePromises[a]={deferred:s,timeout:Be.setTimeout(()=>{this.log.error("Didn't refresh the reference:",e),s.reject("REFERENCE_IS_NOT_REFRESHED")},6e4)},s.catch(Ye).finally(()=>{clearTimeout(n.timeout)});f({type:"refreshReference",payload:t})}return n.deferred.then(t=>{if(a===i(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t})}downloadFile(e){var t;if(!zt.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:n,location:s}=e;let i;"application/x-tgwallpattern"===e.mimeType?(i=this.uncompressTGV,e.mimeType="image/svg+xml"):"image/webp"!==e.mimeType||$t()?"application/x-tgsticker"===e.mimeType&&(i=this.uncompressTGS,e.mimeType="application/json"):(i=this.convertWebp,e.mimeType="image/png");const r=function(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}(s,e.fileName),p=this.cachedDownloadPromises[r],o=this.getFileStorage();if(this.debug&&this.log("downloadFile",r,a,s,e.mimeType),p)return a?p.then(t=>t instanceof Blob&&t.sizethis.downloadFile(e)).catch(()=>this.downloadFile(e))):t):p;const m=tt(),d=e.mimeType||"image/jpeg";let y,c,l=!1,g=e=>{y=e,delete this.cachedDownloadPromises[r],m.reject(y),g=()=>{},!c||y&&"DOWNLOAD_CANCELED"===y.type||c.truncate()};const u=this.tempId++;o.getFile(r).then(e=>Wt(this,void 0,void 0,(function*(){if(e.size{o.getFileWriter(r,d).then(t=>{c=t;const p=e.limitPart||this.getLimitPart(a);let o,d,y=Promise.resolve();const f=(e,t)=>Wt(this,void 0,void 0,(function*(){if(i){return yield i(e,r)}return e})),_="inputWebFileLocation"===s._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];o=0;do{d=tt(),v.push({offset:o,writeFilePromise:y,writeFileDeferred:d}),y=d,o+=p}while(oWt(this,void 0,void 0,(function*(){const{offset:i,writeFilePromise:o,writeFileDeferred:d}=v.shift();try{h();const y=yield _(n,s,i,p,u,e.queueId,h),c=y.bytes;v.length&&w(),this.debug&&this.log("downloadFile requestFilePart result:",r,y);const g=i+p>=a||!c.byteLength;if(c.byteLength){b+=c.byteLength,m.notify({done:b,offset:i,total:a});const e=yield f(c);h(),yield o,h(),yield zt.write(t,e)}d.resolve(),g&&(l=!0,m.resolve(t.finalize(a<20971520)))}catch(e){g(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)})});const h=()=>{if(y)throw y};return m.cancel=()=>{if(!y&&!l){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",g(e)}},m.notify=e=>{_({progress:Object.assign({fileName:r},e)})},this.cachedDownloadPromises[r]=m,m.safeFinally(()=>{delete this.cachedDownloadPromises[r]}),m}deleteFile(e){return delete this.cachedDownloadPromises[e],this.getFileStorage().delete(e)}uploadFile({file:e,fileName:t}){var a;const n=e.size,s=n>=10485760;let i=!1,r=!1,p=0,o=262144;n>67108864?o=524288:n<102400&&(o=32768);const m=this.getDelta(o),d=Math.ceil(n/o),y=be();let c=0;const l={_:s?"inputFileBig":"inputFile",id:y,parts:d,name:t,md5_checksum:""},g={notify:e=>{}},u=new Promise((e,t)=>{if(d>4e3)return t({type:"FILE_TOO_BIG"});g.resolve=e,g.reject=t});if(Object.assign(u,g),d>4e3)return u;let h=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),u.reject(e),i=!0,h=()=>{}};const f=s?"upload.saveBigFilePart":"upload.saveFilePart",v=this.tempId++,b=this;const w=function*(){for(let t=0;tGt(e.slice(t,t+o)).then(e=>{if(i)throw{type:"UPLOAD_CANCELED"};return b.debug&&b.log("Upload file part, isBig:",s,a,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),qt.invokeApi(f,{file_id:y,file_part:a,file_total_parts:d,bytes:e},{fileUpload:!0}).then(e=>{p++,u.notify({done:p*o,total:n}),p>=d&&(u.resolve(l),r=!0)},h)}),m).catch(h)}}(),P=()=>{if(i)return;const e=w.next();e.done||i||e.value.then(P)};for(let e=0,t=Math.min(1/0,d);e{i||r||(i=!0,h({type:"UPLOAD_CANCELED"}))},u.notify=e=>{_({progress:Object.assign({fileName:t},e)})},u.finally(()=>{S.delete(u),S.size||delete this.uploadPromises[t]});const S=null!==(a=this.uploadPromises[t])&&void 0!==a?a:this.uploadPromises[t]=new Set;return S.add(u),u}};m.apiFileManager=Jt;var Zt=Jt,Qt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let Xt=!1;const $t=()=>Xt;Vt.setUpdatesProcessor(e=>{_({update:e})}),Vt.onConnectionStatusChange=e=>{_({type:"connectionStatusChange",payload:e})};const Yt={convertWebp:e=>{const{fileName:t,bytes:a}=e.payload,n=Zt.webpConvertPromises[t];n&&(n.resolve(a),delete Zt.webpConvertPromises[t])},webpSupport:e=>{Xt=e.payload},socketProxy:e=>{const t=e.payload,a=t.id,n=vt.get(a);"message"===t.type?n.dispatchEvent("message",t.payload):"open"===t.type?n.dispatchEvent("open"):"close"===t.type&&(n.dispatchEvent("close"),vt.delete(a))},localStorageProxy:e=>{P.finishTask(e.id,e.payload)},userAgent:e=>{Vt.userAgent=e.payload},online:()=>{Vt.forceReconnectTimeout()},forceReconnect:()=>{Vt.forceReconnect()},toggleStorage:e=>{const t=e.payload;Ht.toggleStorage(t)},refreshReference:e=>{const t=i(e.originalPayload),a=Zt.refreshReferencePromises[t],n=null==a?void 0:a.deferred;n&&(e.error?n.reject(e.error):n.resolve(e.payload))},crypto:e=>{Ve.invokeCrypto(e.task,...e.args).then(t=>{_({taskId:e.taskId,result:t})})}};Be.addEventListener("message",e=>Qt(void 0,void 0,void 0,(function*(){try{const t=e.data,a=t.taskId,n=Yt[t.type];if(n)return void n(t);if(!t.task)return;switch(t.task){case"requestFilePart":case"setQueueId":case"cancelDownload":case"uploadFile":case"downloadFile":try{let e=Zt[t.task].apply(Zt,t.args);e instanceof Promise&&(e=yield e),_({taskId:a,result:e})}catch(e){_({taskId:a,error:e})}break;case"getNetworker":qt[t.task].apply(qt,t.args).finally(()=>{_({taskId:a,result:null})});break;case"setLanguage":case"startAll":case"stopAll":Vt[t.task].apply(Vt,t.args);break;default:try{let e=qt[t.task].apply(qt,t.args);e instanceof Promise&&(e=yield e),_({taskId:a,result:e})}catch(e){_({taskId:a,error:e})}}}catch(e){console.error("worker task error:",e)}}))),_("ready")}]); +//# sourceMappingURL=mtproto.worker.b18e2703b7b89f161924.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.b18e2703b7b89f161924.bundle.worker.js.map b/public/mtproto.worker.b18e2703b7b89f161924.bundle.worker.js.map new file mode 100644 index 00000000..8d540571 --- /dev/null +++ b/public/mtproto.worker.b18e2703b7b89f161924.bundle.worker.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/big-integer/BigInteger.js","webpack:///./node_modules/pako/dist/pako_inflate.min.js","webpack:///(webpack)/buildin/module.js","webpack:///./src/helpers/bytes/bufferConcats.ts","webpack:///./src/helpers/bytes/bytesFromHex.ts","webpack:///./src/helpers/bytes/bytesToHex.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./src/helpers/object/isObject.ts","webpack:///./src/helpers/gzipUncompress.ts","webpack:///./src/helpers/number/intToUint.ts","webpack:///./src/helpers/long/longFromInts.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/helpers/bigInt/bigIntConversion.ts","webpack:///./src/helpers/bytes/bytesModPow.ts","webpack:///./src/helpers/bytes/addPadding.ts","webpack:///./src/helpers/bytes/bytesXor.ts","webpack:///./src/helpers/bytes/convertToUint8Array.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./node_modules/@cryptography/aes/dist/es/aes.js","webpack:///./src/helpers/bytes/bytesFromWordss.ts","webpack:///./src/helpers/bytes/bytesToWordss.ts","webpack:///./src/lib/crypto/utils/aesIGE.ts","webpack:///./src/lib/crypto/subtle.ts","webpack:///./src/lib/crypto/utils/pbkdf2.ts","webpack:///./src/lib/crypto/utils/rsa.ts","webpack:///./src/lib/crypto/utils/sha1.ts","webpack:///./src/lib/crypto/utils/sha256.ts","webpack:///./src/helpers/random.ts","webpack:///./src/helpers/bigInt/bigIntRandom.ts","webpack:///./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack:///./src/lib/crypto/generateDh.ts","webpack:///./src/lib/crypto/computeDhKey.ts","webpack:///./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/lib/logger.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/array/indexOfAndSplice.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/transports/controller.ts","webpack:///./src/lib/mtproto/transports/http.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/helpers/array/forEachReverse.ts","webpack:///./src/helpers/long/sortLongsArray.ts","webpack:///./src/helpers/long/longToBytes.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/helpers/blob/blobConstruct.ts","webpack:///./src/helpers/blob/blobSafeMimeType.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object/safeAssign.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/helpers/blob/readBlobAs.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/mtproto/apiFileManager.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","BASE","MAX_INT","MAX_INT_ARR","smallToArray","supportsNativeBigInt","BigInt","Integer","v","radix","alphabet","caseSensitive","parseBase","parseValue","BigInteger","sign","this","isSmall","SmallInteger","NativeBigInt","isPrecise","Math","floor","arrayToSmall","arr","trim","length","compareAbs","createArray","x","Array","truncate","ceil","add","a","b","sum","l_a","l_b","carry","base","push","addAny","addSmall","subtract","difference","a_l","b_l","borrow","subtractSmall","multiplyLong","product","a_i","j","multiplySmall","shiftLeft","concat","multiplySmallAndArray","square","divModSmall","lambda","q","remainder","divisor","quotient","divModAny","self","Error","negate","abs","comparison","quotientDigit","shift","result","divisorMostSignificantDigit","divMod1","guess","xlen","highx","highy","check","part","unshift","reverse","divMod2","qSign","mod","mSign","isBasicPrime","isUnit","equals","isEven","isDivisibleBy","lesser","millerRabinTest","nPrev","prev","divide","next","bigInt","modPow","plus","subtractAny","minus","small","multiply","l1","l2","multiplyKaratsuba","y","max","slice","ac","bd","abcd","times","_multiplyBySmall","divmod","over","pow","toString","_0","_1","_2","isNegative","exp","isZero","modInv","isPositive","isOdd","compare","Infinity","compareTo","eq","notEquals","neq","greater","gt","lt","greaterOrEquals","geq","lesserOrEquals","leq","isPrime","strict","bits","bitLength","logN","log","toJSNumber","isProbablePrime","iterations","rng","randBetween","lastT","lastR","zero","newT","one","newR","powersOfTwo","powers2Length","highestPower2","shift_isSmall","bitwise","fn","xSign","ySign","xRem","not","yRem","xDigit","yDigit","xDivMod","yDivMod","String","shiftRight","remQuo","and","or","xor","roughLOB","min","gcd","integerLogarithm","tmp","e","text","toLowerCase","absBase","alphabetValues","digits","start","parseBaseFromArray","val","toBase","apply","map","valueOf","neg","Number","out","left","digit","toBaseString","stringify","join","parseStringValue","split","decimalPlace","indexOf","test","parseNumberValue","toArray","str","toJSON","parseInt","minusOne","lcm","isInstance","usedRNG","random","low","range","restricted","top","fromArray","Uint32Array","f","h","u","w","k","_","g","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","lencode","distcode","lenbits","distbits","msg","sane","Uint16Array","Uint8Array","Z","S","O","U","T","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","last","wrap","havedict","flags","total","head","wbits","offset","extra","ncode","nlen","ndist","have","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","K","P","Y","G","X","W","done","time","xflags","os","extra_len","fromCharCode","comment","hcrc","data_type","2","1","0","J","Q","V","$","ee","te","ie","ne","options","arguments","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","header","dictionary","charCodeAt","ae","onEnd","onData","re","se","oe","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","webpackPolyfill","deprecate","paths","children","bufferConcats","args","reduce","acc","byteLength","lastLength","forEach","ArrayBuffer","bytesFromHex","hexString","len","bytes","charAt","substr","bytesToHex","configurable","randomize","crypto","getRandomValues","findAndSplice","verify","index","findIndex","splice","undefined","toHHMMSS","leadZero","sec_num","hours","minutes","seconds","Promise","finally","onFinally","callback","resolve","then","reason","reject","safeFinally","catch","Modes","location","search","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","MOUNT_CLASS_TO","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","listeners","listener","postMessage","notifyWorker","noop","notifySomeone","notifyAll","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","obj","onlyLocal","stringified","setItem","saveLocal","removeItem","keys","delete","enabled","clear","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","isObject","gzipUncompress","intToUint","longFromInts","high","boolFalse","API","constructors","find","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","buffer","intView","byteView","resultBuffer","resultInt32","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","console","checkLength","writeInt","iHigh","iLow","sLong","isArray","storeLongP","storeIntBytes","Float64Array","sUTF8","unescape","encodeURIComponent","error","methodName","params","methodData","methods","method","storeInt","pFlags","flagsOffsets","param","condType","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","schema","isBare","constructorData","override","hex","readInt","doubleView","longDec","num","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","TLDeserialization","TLSerialization","bigIntFromBytes","bigIntToBytes","bytesModPow","bytesBigInt","expBigInt","modBigInt","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","needPadding","padding","bytesXor","bytes1","bytes2","convertToUint8Array","TextEncoder","encode","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","invokeCrypto","hash","makePasswordHash","salt1","salt2","padArray","flipper","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","a_for_hash","secure_random","generate_and_check_random","g_b","ux","a_ux","h1","buff","M1","srp_id","Si","T1","T2","T3","T4","T5","T6","T7","T8","getWords","buf","pos","right","x2","x4","tEnc","tDec","xInv","computeTables","AES","_key","encKey","decKey","rcon","encrypt","_message","a2","b2","c2","message","rounds","decrypt","AES_IGE","iv","cipher","cipherText","prevX","prevY","yXOR","counter","incrementCounter","bytesFromWordss","bytesToWordss","words","aesSync","keyBytes","ivBytes","aesEncryptSync","aesDecryptSync","subtle","pbkdf2","salt","importKey","deriveBits","rsaEncrypt","publicKey","exponent","modulus","sha1","digest","sha256","arrays","8","16","32","nextRandomUint","array","randomLong","bigIntRandom","BrentPollardFactor","two","ys","bigIntUint64MinusPqPlusOne","performY","condition","factorizeBrentPollardPQ","pqBytes","factors","primes","factor","pop","primeFactors","sort","generateDh","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","computeDhKey","key_fingerprint","readBigIntFromBytesBE","_bits","emojis","getEmojisFingerprint","emojisLength","partOffset","codePoints","performTaskWorker","super","webWorker","awaiting","pending","utils","task","timeManager","lastMessageId","timeOffset","timeTicks","Date","now","messageId","serverTime","localTime","newTimeOffset","changed","server_time_offset","USER_AGENT","navigator","userAgent","IS_SAFARI","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","splitted","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","logger","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","App","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","hostname","suffix","pause","ms","setTimeout","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","deferred","cancel","assign","EventListenerBase","reuseResults","_constructor","listenerResults","once","addEventListener","collectResults","removeEventListener","_dispatchEvent","indexOfAndSplice","item","idx","spliced","dcId","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","data","send","body","ws","logTypes","connect","WebSocket","binaryType","Counter","initialValue","encrypted","increment","Obfuscation","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","ConnectionStatus","tag","Connection","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","setTransportOpened","init","connection","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","decode","readPacket","parseResponse","response","processMessage","sessionId","onClose","needTimeout","retryAt","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","clearTimeout","Connecting","bodySent","setTransportClosed","setAutoReconnect","enable","toEncode","encodePacket","promise","socketId","socketsProxied","Map","TEST_SUFFIX","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportHTTP","dcOption","transportType","reuse","client","download","upload","servers","transports","opened","waitForWebSocket","https","dcConfigurator","chooseServer","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","fetch","status","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","bytesCmp","invokeAfterMsgConstructor","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","nextReq","checkConnectionPeriod","offline","lastResendReq","isOnline","lastResponseTime","activeRequests","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","warn","serializer","pingId","storeMethod","ping_id","pingMessage","msg_id","generateId","seq_no","generateSeqNo","getBytes","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","sentMessageId","sentMessage","container","forEachReverse","inner","innerSentMessageId","innerSentMessage","updateSentMessage","notContentRelated","pushMessage","connectionInited","invokeWithLayer","layer","initConnection","language","afterMessageId","resultType","isAPI","oldTransport","nextReqTimeout","longPollInterval","clearInterval","setInterval","changeTransport","forceReconnect","sendingLongPoll","wrapMtpCall","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","noResponseMsgs","sqrt","pushResend","shouldResolve","msgId","noSchedule","timeout","TimedOut","setDrainTimeout","onDrainTimeout","onDrain","willChange","onConnectionStatusChange","innerMsgId","acked","dataWithPadding","isOut","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","promises","results","aesKey","aesIv","sha2a","sha2b","akStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messages","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","long","messageByteLength","filter","generateContainerMessage","messageWithBody","handleSentEncryptedRequestHTTP","innerMessages","storeRawBytes","getMsgKey","keyIv","getAesKeyIv","encryptedData","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","baseError","code","originalError","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","setOffset","mt_rpc_result","newServerSalt","cb","performScheduledRequest","notEmpty","rawError","matches","error_message","error_code","description","innerMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","processError","networkerFactory","networkers","stoppedNetworkers","langCode","forceReconnectTimeout","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","cached","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","twoPow","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","new_nonce_hash2","new_nonce_hash3","getTransportTypePromise","getTransportType","_try","sendReqPQ","blobConstruct","blobParts","mimeType","blob","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","db","storeName","storageIsAvailable","fromObject","safeAssign","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onerror","onsuccess","calledNew","onabort","transaction","target","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","createObjectStore","indexes","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","fileName","save","perf","performance","oncomplete","requests","getAll","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","connections","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","replace","iterateNetworkers","info","changeNetworkerTransport","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","invokeApi","ignoreErrors","closeDatabases","handled","maxNetworkers","found","getKey","generateNetworkerGetKey","ak","ss","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","removeTransport","canRelease","removeNetworker","prepareTempMessageId","startTime","interval","cachedNetworker","rejectPromise","logOut","noErrorBox","performRequest","after","wrapApiCall","exportResolve","exportReject","dc_id","exportedAuth","newDcId","unsetConnectionInited","includes","stopTime","waitTime","floodMaxTimeout","readBlobAsArrayBuffer","reader","FileReader","readBlobAs","blobSupported","fileWriter","write","saveFileCallback","finalize","saveToStorage","dbName","caches","timeoutOperation","Response","headers","size","rejected","res","fakeWriter","getFakeFileWriter","saveFile","deleteAll","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","uncompressTGV","convertWebp","convertPromise","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","fileManager","isAvailable","process","isWebpSupported","ext","thumb_size","Boolean","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","getFileNameByLocation","cachedPromise","fileStorage","getFileStorage","deleteFile","downloadFile","cacheFileWriter","resolved","errorHandler","getFile","getFileWriter","limitPart","getLimitPart","writeFileDeferred","writeFilePromise","processDownloaded","requestWebFilePart","requestFilePart","delayed","superpuper","isFinal","processedResult","progress","file","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","details","it","file_id","file_part","file_total_parts","generator","Set","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"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S,QACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,OAAQ,OAAQ,OAC5D,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,OAAQ,QAAS,QAAS,QAAS,QACrD,QAAS,OAAQ,OAAQ,OAAQ,QAAS,QAAS,QACnD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,QAAS,QACrD,QAAS,QAAS,OAAQ,QAAS,QAAS,OAAQ,OACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OACtD,OAAQ,QAAS,QAAS,QAAS,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,OAAQ,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,OAAQ,QAAS,OAAQ,QAAS,QACpD,QAAS,QAAS,QAAS,OAAQ,QAAS,QAAS,QACrD,OAAQ,QAAS,OAAQ,QAAS,QAAS,QAAS,QACpD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","file":"mtproto.worker.b18e2703b7b89f161924.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n","var bigInt = (function (undefined) {\r\n \"use strict\";\r\n\r\n var BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_INT = 9007199254740992,\r\n MAX_INT_ARR = smallToArray(MAX_INT),\r\n DEFAULT_ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyz\";\r\n\r\n var supportsNativeBigInt = typeof BigInt === \"function\";\r\n\r\n function Integer(v, radix, alphabet, caseSensitive) {\r\n if (typeof v === \"undefined\") return Integer[0];\r\n if (typeof radix !== \"undefined\") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);\r\n return parseValue(v);\r\n }\r\n\r\n function BigInteger(value, sign) {\r\n this.value = value;\r\n this.sign = sign;\r\n this.isSmall = false;\r\n }\r\n BigInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function SmallInteger(value) {\r\n this.value = value;\r\n this.sign = value < 0;\r\n this.isSmall = true;\r\n }\r\n SmallInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function NativeBigInt(value) {\r\n this.value = value;\r\n }\r\n NativeBigInt.prototype = Object.create(Integer.prototype);\r\n\r\n function isPrecise(n) {\r\n return -MAX_INT < n && n < MAX_INT;\r\n }\r\n\r\n function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes\r\n if (n < 1e7)\r\n return [n];\r\n if (n < 1e14)\r\n return [n % 1e7, Math.floor(n / 1e7)];\r\n return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];\r\n }\r\n\r\n function arrayToSmall(arr) { // If BASE changes this function may need to change\r\n trim(arr);\r\n var length = arr.length;\r\n if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {\r\n switch (length) {\r\n case 0: return 0;\r\n case 1: return arr[0];\r\n case 2: return arr[0] + arr[1] * BASE;\r\n default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n function trim(v) {\r\n var i = v.length;\r\n while (v[--i] === 0);\r\n v.length = i + 1;\r\n }\r\n\r\n function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger\r\n var x = new Array(length);\r\n var i = -1;\r\n while (++i < length) {\r\n x[i] = 0;\r\n }\r\n return x;\r\n }\r\n\r\n function truncate(n) {\r\n if (n > 0) return Math.floor(n);\r\n return Math.ceil(n);\r\n }\r\n\r\n function add(a, b) { // assumes a and b are arrays with a.length >= b.length\r\n var l_a = a.length,\r\n l_b = b.length,\r\n r = new Array(l_a),\r\n carry = 0,\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l_b; i++) {\r\n sum = a[i] + b[i] + carry;\r\n carry = sum >= base ? 1 : 0;\r\n r[i] = sum - carry * base;\r\n }\r\n while (i < l_a) {\r\n sum = a[i] + carry;\r\n carry = sum === base ? 1 : 0;\r\n r[i++] = sum - carry * base;\r\n }\r\n if (carry > 0) r.push(carry);\r\n return r;\r\n }\r\n\r\n function addAny(a, b) {\r\n if (a.length >= b.length) return add(a, b);\r\n return add(b, a);\r\n }\r\n\r\n function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l; i++) {\r\n sum = a[i] - base + carry;\r\n carry = Math.floor(sum / base);\r\n r[i] = sum - carry * base;\r\n carry += 1;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall) {\r\n return new BigInteger(addSmall(a, Math.abs(b)), this.sign);\r\n }\r\n return new BigInteger(addAny(a, b), this.sign);\r\n };\r\n BigInteger.prototype.plus = BigInteger.prototype.add;\r\n\r\n SmallInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n if (isPrecise(a + b)) return new SmallInteger(a + b);\r\n b = smallToArray(Math.abs(b));\r\n }\r\n return new BigInteger(addSmall(b, Math.abs(a)), a < 0);\r\n };\r\n SmallInteger.prototype.plus = SmallInteger.prototype.add;\r\n\r\n NativeBigInt.prototype.add = function (v) {\r\n return new NativeBigInt(this.value + parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.plus = NativeBigInt.prototype.add;\r\n\r\n function subtract(a, b) { // assumes a and b are arrays with a >= b\r\n var a_l = a.length,\r\n b_l = b.length,\r\n r = new Array(a_l),\r\n borrow = 0,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < b_l; i++) {\r\n difference = a[i] - borrow - b[i];\r\n if (difference < 0) {\r\n difference += base;\r\n borrow = 1;\r\n } else borrow = 0;\r\n r[i] = difference;\r\n }\r\n for (i = b_l; i < a_l; i++) {\r\n difference = a[i] - borrow;\r\n if (difference < 0) difference += base;\r\n else {\r\n r[i++] = difference;\r\n break;\r\n }\r\n r[i] = difference;\r\n }\r\n for (; i < a_l; i++) {\r\n r[i] = a[i];\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function subtractAny(a, b, sign) {\r\n var value;\r\n if (compareAbs(a, b) >= 0) {\r\n value = subtract(a, b);\r\n } else {\r\n value = subtract(b, a);\r\n sign = !sign;\r\n }\r\n value = arrayToSmall(value);\r\n if (typeof value === \"number\") {\r\n if (sign) value = -value;\r\n return new SmallInteger(value);\r\n }\r\n return new BigInteger(value, sign);\r\n }\r\n\r\n function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n carry = -b,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < l; i++) {\r\n difference = a[i] + carry;\r\n carry = Math.floor(difference / base);\r\n difference %= base;\r\n r[i] = difference < 0 ? difference + base : difference;\r\n }\r\n r = arrayToSmall(r);\r\n if (typeof r === \"number\") {\r\n if (sign) r = -r;\r\n return new SmallInteger(r);\r\n } return new BigInteger(r, sign);\r\n }\r\n\r\n BigInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall)\r\n return subtractSmall(a, Math.abs(b), this.sign);\r\n return subtractAny(a, b, this.sign);\r\n };\r\n BigInteger.prototype.minus = BigInteger.prototype.subtract;\r\n\r\n SmallInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n return new SmallInteger(a - b);\r\n }\r\n return subtractSmall(b, Math.abs(a), a >= 0);\r\n };\r\n SmallInteger.prototype.minus = SmallInteger.prototype.subtract;\r\n\r\n NativeBigInt.prototype.subtract = function (v) {\r\n return new NativeBigInt(this.value - parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;\r\n\r\n BigInteger.prototype.negate = function () {\r\n return new BigInteger(this.value, !this.sign);\r\n };\r\n SmallInteger.prototype.negate = function () {\r\n var sign = this.sign;\r\n var small = new SmallInteger(-this.value);\r\n small.sign = !sign;\r\n return small;\r\n };\r\n NativeBigInt.prototype.negate = function () {\r\n return new NativeBigInt(-this.value);\r\n }\r\n\r\n BigInteger.prototype.abs = function () {\r\n return new BigInteger(this.value, false);\r\n };\r\n SmallInteger.prototype.abs = function () {\r\n return new SmallInteger(Math.abs(this.value));\r\n };\r\n NativeBigInt.prototype.abs = function () {\r\n return new NativeBigInt(this.value >= 0 ? this.value : -this.value);\r\n }\r\n\r\n\r\n function multiplyLong(a, b) {\r\n var a_l = a.length,\r\n b_l = b.length,\r\n l = a_l + b_l,\r\n r = createArray(l),\r\n base = BASE,\r\n product, carry, i, a_i, b_j;\r\n for (i = 0; i < a_l; ++i) {\r\n a_i = a[i];\r\n for (var j = 0; j < b_l; ++j) {\r\n b_j = b[j];\r\n product = a_i * b_j + r[i + j];\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n r[i + j + 1] += carry;\r\n }\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n carry = 0,\r\n product, i;\r\n for (i = 0; i < l; i++) {\r\n product = a[i] * b + carry;\r\n carry = Math.floor(product / base);\r\n r[i] = product - carry * base;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n function shiftLeft(x, n) {\r\n var r = [];\r\n while (n-- > 0) r.push(0);\r\n return r.concat(x);\r\n }\r\n\r\n function multiplyKaratsuba(x, y) {\r\n var n = Math.max(x.length, y.length);\r\n\r\n if (n <= 30) return multiplyLong(x, y);\r\n n = Math.ceil(n / 2);\r\n\r\n var b = x.slice(n),\r\n a = x.slice(0, n),\r\n d = y.slice(n),\r\n c = y.slice(0, n);\r\n\r\n var ac = multiplyKaratsuba(a, c),\r\n bd = multiplyKaratsuba(b, d),\r\n abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));\r\n\r\n var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));\r\n trim(product);\r\n return product;\r\n }\r\n\r\n // The following function is derived from a surface fit of a graph plotting the performance difference\r\n // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.\r\n function useKaratsuba(l1, l2) {\r\n return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;\r\n }\r\n\r\n BigInteger.prototype.multiply = function (v) {\r\n var n = parseValue(v),\r\n a = this.value, b = n.value,\r\n sign = this.sign !== n.sign,\r\n abs;\r\n if (n.isSmall) {\r\n if (b === 0) return Integer[0];\r\n if (b === 1) return this;\r\n if (b === -1) return this.negate();\r\n abs = Math.abs(b);\r\n if (abs < BASE) {\r\n return new BigInteger(multiplySmall(a, abs), sign);\r\n }\r\n b = smallToArray(abs);\r\n }\r\n if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes\r\n return new BigInteger(multiplyKaratsuba(a, b), sign);\r\n return new BigInteger(multiplyLong(a, b), sign);\r\n };\r\n\r\n BigInteger.prototype.times = BigInteger.prototype.multiply;\r\n\r\n function multiplySmallAndArray(a, b, sign) { // a >= 0\r\n if (a < BASE) {\r\n return new BigInteger(multiplySmall(b, a), sign);\r\n }\r\n return new BigInteger(multiplyLong(b, smallToArray(a)), sign);\r\n }\r\n SmallInteger.prototype._multiplyBySmall = function (a) {\r\n if (isPrecise(a.value * this.value)) {\r\n return new SmallInteger(a.value * this.value);\r\n }\r\n return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);\r\n };\r\n BigInteger.prototype._multiplyBySmall = function (a) {\r\n if (a.value === 0) return Integer[0];\r\n if (a.value === 1) return this;\r\n if (a.value === -1) return this.negate();\r\n return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);\r\n };\r\n SmallInteger.prototype.multiply = function (v) {\r\n return parseValue(v)._multiplyBySmall(this);\r\n };\r\n SmallInteger.prototype.times = SmallInteger.prototype.multiply;\r\n\r\n NativeBigInt.prototype.multiply = function (v) {\r\n return new NativeBigInt(this.value * parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;\r\n\r\n function square(a) {\r\n //console.assert(2 * BASE * BASE < MAX_INT);\r\n var l = a.length,\r\n r = createArray(l + l),\r\n base = BASE,\r\n product, carry, i, a_i, a_j;\r\n for (i = 0; i < l; i++) {\r\n a_i = a[i];\r\n carry = 0 - a_i * a_i;\r\n for (var j = i; j < l; j++) {\r\n a_j = a[j];\r\n product = 2 * (a_i * a_j) + r[i + j] + carry;\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n }\r\n r[i + l] = carry;\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.square = function () {\r\n return new BigInteger(square(this.value), false);\r\n };\r\n\r\n SmallInteger.prototype.square = function () {\r\n var value = this.value * this.value;\r\n if (isPrecise(value)) return new SmallInteger(value);\r\n return new BigInteger(square(smallToArray(Math.abs(this.value))), false);\r\n };\r\n\r\n NativeBigInt.prototype.square = function (v) {\r\n return new NativeBigInt(this.value * this.value);\r\n }\r\n\r\n function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n base = BASE,\r\n result = createArray(b.length),\r\n divisorMostSignificantDigit = b[b_l - 1],\r\n // normalization\r\n lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),\r\n remainder = multiplySmall(a, lambda),\r\n divisor = multiplySmall(b, lambda),\r\n quotientDigit, shift, carry, borrow, i, l, q;\r\n if (remainder.length <= a_l) remainder.push(0);\r\n divisor.push(0);\r\n divisorMostSignificantDigit = divisor[b_l - 1];\r\n for (shift = a_l - b_l; shift >= 0; shift--) {\r\n quotientDigit = base - 1;\r\n if (remainder[shift + b_l] !== divisorMostSignificantDigit) {\r\n quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);\r\n }\r\n // quotientDigit <= base - 1\r\n carry = 0;\r\n borrow = 0;\r\n l = divisor.length;\r\n for (i = 0; i < l; i++) {\r\n carry += quotientDigit * divisor[i];\r\n q = Math.floor(carry / base);\r\n borrow += remainder[shift + i] - (carry - q * base);\r\n carry = q;\r\n if (borrow < 0) {\r\n remainder[shift + i] = borrow + base;\r\n borrow = -1;\r\n } else {\r\n remainder[shift + i] = borrow;\r\n borrow = 0;\r\n }\r\n }\r\n while (borrow !== 0) {\r\n quotientDigit -= 1;\r\n carry = 0;\r\n for (i = 0; i < l; i++) {\r\n carry += remainder[shift + i] - base + divisor[i];\r\n if (carry < 0) {\r\n remainder[shift + i] = carry + base;\r\n carry = 0;\r\n } else {\r\n remainder[shift + i] = carry;\r\n carry = 1;\r\n }\r\n }\r\n borrow += carry;\r\n }\r\n result[shift] = quotientDigit;\r\n }\r\n // denormalization\r\n remainder = divModSmall(remainder, lambda)[0];\r\n return [arrayToSmall(result), arrayToSmall(remainder)];\r\n }\r\n\r\n function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/\r\n // Performs faster than divMod1 on larger input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n result = [],\r\n part = [],\r\n base = BASE,\r\n guess, xlen, highx, highy, check;\r\n while (a_l) {\r\n part.unshift(a[--a_l]);\r\n trim(part);\r\n if (compareAbs(part, b) < 0) {\r\n result.push(0);\r\n continue;\r\n }\r\n xlen = part.length;\r\n highx = part[xlen - 1] * base + part[xlen - 2];\r\n highy = b[b_l - 1] * base + b[b_l - 2];\r\n if (xlen > b_l) {\r\n highx = (highx + 1) * base;\r\n }\r\n guess = Math.ceil(highx / highy);\r\n do {\r\n check = multiplySmall(b, guess);\r\n if (compareAbs(check, part) <= 0) break;\r\n guess--;\r\n } while (guess);\r\n result.push(guess);\r\n part = subtract(part, check);\r\n }\r\n result.reverse();\r\n return [arrayToSmall(result), arrayToSmall(part)];\r\n }\r\n\r\n function divModSmall(value, lambda) {\r\n var length = value.length,\r\n quotient = createArray(length),\r\n base = BASE,\r\n i, q, remainder, divisor;\r\n remainder = 0;\r\n for (i = length - 1; i >= 0; --i) {\r\n divisor = remainder * base + value[i];\r\n q = truncate(divisor / lambda);\r\n remainder = divisor - q * lambda;\r\n quotient[i] = q | 0;\r\n }\r\n return [quotient, remainder | 0];\r\n }\r\n\r\n function divModAny(self, v) {\r\n var value, n = parseValue(v);\r\n if (supportsNativeBigInt) {\r\n return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];\r\n }\r\n var a = self.value, b = n.value;\r\n var quotient;\r\n if (b === 0) throw new Error(\"Cannot divide by zero\");\r\n if (self.isSmall) {\r\n if (n.isSmall) {\r\n return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];\r\n }\r\n return [Integer[0], self];\r\n }\r\n if (n.isSmall) {\r\n if (b === 1) return [self, Integer[0]];\r\n if (b == -1) return [self.negate(), Integer[0]];\r\n var abs = Math.abs(b);\r\n if (abs < BASE) {\r\n value = divModSmall(a, abs);\r\n quotient = arrayToSmall(value[0]);\r\n var remainder = value[1];\r\n if (self.sign) remainder = -remainder;\r\n if (typeof quotient === \"number\") {\r\n if (self.sign !== n.sign) quotient = -quotient;\r\n return [new SmallInteger(quotient), new SmallInteger(remainder)];\r\n }\r\n return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];\r\n }\r\n b = smallToArray(abs);\r\n }\r\n var comparison = compareAbs(a, b);\r\n if (comparison === -1) return [Integer[0], self];\r\n if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];\r\n\r\n // divMod1 is faster on smaller input sizes\r\n if (a.length + b.length <= 200)\r\n value = divMod1(a, b);\r\n else value = divMod2(a, b);\r\n\r\n quotient = value[0];\r\n var qSign = self.sign !== n.sign,\r\n mod = value[1],\r\n mSign = self.sign;\r\n if (typeof quotient === \"number\") {\r\n if (qSign) quotient = -quotient;\r\n quotient = new SmallInteger(quotient);\r\n } else quotient = new BigInteger(quotient, qSign);\r\n if (typeof mod === \"number\") {\r\n if (mSign) mod = -mod;\r\n mod = new SmallInteger(mod);\r\n } else mod = new BigInteger(mod, mSign);\r\n return [quotient, mod];\r\n }\r\n\r\n BigInteger.prototype.divmod = function (v) {\r\n var result = divModAny(this, v);\r\n return {\r\n quotient: result[0],\r\n remainder: result[1]\r\n };\r\n };\r\n NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;\r\n\r\n\r\n BigInteger.prototype.divide = function (v) {\r\n return divModAny(this, v)[0];\r\n };\r\n NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {\r\n return new NativeBigInt(this.value / parseValue(v).value);\r\n };\r\n SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;\r\n\r\n BigInteger.prototype.mod = function (v) {\r\n return divModAny(this, v)[1];\r\n };\r\n NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {\r\n return new NativeBigInt(this.value % parseValue(v).value);\r\n };\r\n SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;\r\n\r\n BigInteger.prototype.pow = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value,\r\n value, x, y;\r\n if (b === 0) return Integer[1];\r\n if (a === 0) return Integer[0];\r\n if (a === 1) return Integer[1];\r\n if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.sign) {\r\n return Integer[0];\r\n }\r\n if (!n.isSmall) throw new Error(\"The exponent \" + n.toString() + \" is too large.\");\r\n if (this.isSmall) {\r\n if (isPrecise(value = Math.pow(a, b)))\r\n return new SmallInteger(truncate(value));\r\n }\r\n x = this;\r\n y = Integer[1];\r\n while (true) {\r\n if (b & 1 === 1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === 0) break;\r\n b /= 2;\r\n x = x.square();\r\n }\r\n return y;\r\n };\r\n SmallInteger.prototype.pow = BigInteger.prototype.pow;\r\n\r\n NativeBigInt.prototype.pow = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value, b = n.value;\r\n var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);\r\n if (b === _0) return Integer[1];\r\n if (a === _0) return Integer[0];\r\n if (a === _1) return Integer[1];\r\n if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.isNegative()) return new NativeBigInt(_0);\r\n var x = this;\r\n var y = Integer[1];\r\n while (true) {\r\n if ((b & _1) === _1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === _0) break;\r\n b /= _2;\r\n x = x.square();\r\n }\r\n return y;\r\n }\r\n\r\n BigInteger.prototype.modPow = function (exp, mod) {\r\n exp = parseValue(exp);\r\n mod = parseValue(mod);\r\n if (mod.isZero()) throw new Error(\"Cannot take modPow with modulus 0\");\r\n var r = Integer[1],\r\n base = this.mod(mod);\r\n if (exp.isNegative()) {\r\n exp = exp.multiply(Integer[-1]);\r\n base = base.modInv(mod);\r\n }\r\n while (exp.isPositive()) {\r\n if (base.isZero()) return Integer[0];\r\n if (exp.isOdd()) r = r.multiply(base).mod(mod);\r\n exp = exp.divide(2);\r\n base = base.square().mod(mod);\r\n }\r\n return r;\r\n };\r\n NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;\r\n\r\n function compareAbs(a, b) {\r\n if (a.length !== b.length) {\r\n return a.length > b.length ? 1 : -1;\r\n }\r\n for (var i = a.length - 1; i >= 0; i--) {\r\n if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n\r\n BigInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) return 1;\r\n return compareAbs(a, b);\r\n };\r\n SmallInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = Math.abs(this.value),\r\n b = n.value;\r\n if (n.isSmall) {\r\n b = Math.abs(b);\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n return -1;\r\n };\r\n NativeBigInt.prototype.compareAbs = function (v) {\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n a = a >= 0 ? a : -a;\r\n b = b >= 0 ? b : -b;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n\r\n BigInteger.prototype.compare = function (v) {\r\n // See discussion about comparison with Infinity:\r\n // https://github.com/peterolson/BigInteger.js/issues/61\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (this.sign !== n.sign) {\r\n return n.sign ? 1 : -1;\r\n }\r\n if (n.isSmall) {\r\n return this.sign ? -1 : 1;\r\n }\r\n return compareAbs(a, b) * (this.sign ? -1 : 1);\r\n };\r\n BigInteger.prototype.compareTo = BigInteger.prototype.compare;\r\n\r\n SmallInteger.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) {\r\n return a == b ? 0 : a > b ? 1 : -1;\r\n }\r\n if (a < 0 !== n.sign) {\r\n return a < 0 ? -1 : 1;\r\n }\r\n return a < 0 ? 1 : -1;\r\n };\r\n SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;\r\n\r\n NativeBigInt.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;\r\n\r\n BigInteger.prototype.equals = function (v) {\r\n return this.compare(v) === 0;\r\n };\r\n NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;\r\n\r\n BigInteger.prototype.notEquals = function (v) {\r\n return this.compare(v) !== 0;\r\n };\r\n NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;\r\n\r\n BigInteger.prototype.greater = function (v) {\r\n return this.compare(v) > 0;\r\n };\r\n NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;\r\n\r\n BigInteger.prototype.lesser = function (v) {\r\n return this.compare(v) < 0;\r\n };\r\n NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;\r\n\r\n BigInteger.prototype.greaterOrEquals = function (v) {\r\n return this.compare(v) >= 0;\r\n };\r\n NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;\r\n\r\n BigInteger.prototype.lesserOrEquals = function (v) {\r\n return this.compare(v) <= 0;\r\n };\r\n NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;\r\n\r\n BigInteger.prototype.isEven = function () {\r\n return (this.value[0] & 1) === 0;\r\n };\r\n SmallInteger.prototype.isEven = function () {\r\n return (this.value & 1) === 0;\r\n };\r\n NativeBigInt.prototype.isEven = function () {\r\n return (this.value & BigInt(1)) === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isOdd = function () {\r\n return (this.value[0] & 1) === 1;\r\n };\r\n SmallInteger.prototype.isOdd = function () {\r\n return (this.value & 1) === 1;\r\n };\r\n NativeBigInt.prototype.isOdd = function () {\r\n return (this.value & BigInt(1)) === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isPositive = function () {\r\n return !this.sign;\r\n };\r\n SmallInteger.prototype.isPositive = function () {\r\n return this.value > 0;\r\n };\r\n NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;\r\n\r\n BigInteger.prototype.isNegative = function () {\r\n return this.sign;\r\n };\r\n SmallInteger.prototype.isNegative = function () {\r\n return this.value < 0;\r\n };\r\n NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;\r\n\r\n BigInteger.prototype.isUnit = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isUnit = function () {\r\n return Math.abs(this.value) === 1;\r\n };\r\n NativeBigInt.prototype.isUnit = function () {\r\n return this.abs().value === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isZero = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isZero = function () {\r\n return this.value === 0;\r\n };\r\n NativeBigInt.prototype.isZero = function () {\r\n return this.value === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isDivisibleBy = function (v) {\r\n var n = parseValue(v);\r\n if (n.isZero()) return false;\r\n if (n.isUnit()) return true;\r\n if (n.compareAbs(2) === 0) return this.isEven();\r\n return this.mod(n).isZero();\r\n };\r\n NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;\r\n\r\n function isBasicPrime(v) {\r\n var n = v.abs();\r\n if (n.isUnit()) return false;\r\n if (n.equals(2) || n.equals(3) || n.equals(5)) return true;\r\n if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;\r\n if (n.lesser(49)) return true;\r\n // we don't know if it's prime: let the other functions figure it out\r\n }\r\n\r\n function millerRabinTest(n, a) {\r\n var nPrev = n.prev(),\r\n b = nPrev,\r\n r = 0,\r\n d, t, i, x;\r\n while (b.isEven()) b = b.divide(2), r++;\r\n next: for (i = 0; i < a.length; i++) {\r\n if (n.lesser(a[i])) continue;\r\n x = bigInt(a[i]).modPow(b, n);\r\n if (x.isUnit() || x.equals(nPrev)) continue;\r\n for (d = r - 1; d != 0; d--) {\r\n x = x.square().mod(n);\r\n if (x.isUnit()) return false;\r\n if (x.equals(nPrev)) continue next;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Set \"strict\" to true to force GRH-supported lower bound of 2*log(N)^2\r\n BigInteger.prototype.isPrime = function (strict) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var bits = n.bitLength();\r\n if (bits <= 64)\r\n return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\r\n var logN = Math.log(2) * bits.toJSNumber();\r\n var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt(i + 2));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;\r\n\r\n BigInteger.prototype.isProbablePrime = function (iterations, rng) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var t = iterations === undefined ? 5 : iterations;\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt.randBetween(2, n.minus(2), rng));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;\r\n\r\n BigInteger.prototype.modInv = function (n) {\r\n var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;\r\n while (!newR.isZero()) {\r\n q = r.divide(newR);\r\n lastT = t;\r\n lastR = r;\r\n t = newT;\r\n r = newR;\r\n newT = lastT.subtract(q.multiply(newT));\r\n newR = lastR.subtract(q.multiply(newR));\r\n }\r\n if (!r.isUnit()) throw new Error(this.toString() + \" and \" + n.toString() + \" are not co-prime\");\r\n if (t.compare(0) === -1) {\r\n t = t.add(n);\r\n }\r\n if (this.isNegative()) {\r\n return t.negate();\r\n }\r\n return t;\r\n };\r\n\r\n NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;\r\n\r\n BigInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return subtractSmall(value, 1, this.sign);\r\n }\r\n return new BigInteger(addSmall(value, 1), this.sign);\r\n };\r\n SmallInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (value + 1 < MAX_INT) return new SmallInteger(value + 1);\r\n return new BigInteger(MAX_INT_ARR, false);\r\n };\r\n NativeBigInt.prototype.next = function () {\r\n return new NativeBigInt(this.value + BigInt(1));\r\n }\r\n\r\n BigInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return new BigInteger(addSmall(value, 1), true);\r\n }\r\n return subtractSmall(value, 1, this.sign);\r\n };\r\n SmallInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);\r\n return new BigInteger(MAX_INT_ARR, true);\r\n };\r\n NativeBigInt.prototype.prev = function () {\r\n return new NativeBigInt(this.value - BigInt(1));\r\n }\r\n\r\n var powersOfTwo = [1];\r\n while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);\r\n var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];\r\n\r\n function shift_isSmall(n) {\r\n return Math.abs(n) <= BASE;\r\n }\r\n\r\n BigInteger.prototype.shiftLeft = function (v) {\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftRight(-n);\r\n var result = this;\r\n if (result.isZero()) return result;\r\n while (n >= powers2Length) {\r\n result = result.multiply(highestPower2);\r\n n -= powers2Length - 1;\r\n }\r\n return result.multiply(powersOfTwo[n]);\r\n };\r\n NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;\r\n\r\n BigInteger.prototype.shiftRight = function (v) {\r\n var remQuo;\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftLeft(-n);\r\n var result = this;\r\n while (n >= powers2Length) {\r\n if (result.isZero() || (result.isNegative() && result.isUnit())) return result;\r\n remQuo = divModAny(result, highestPower2);\r\n result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n n -= powers2Length - 1;\r\n }\r\n remQuo = divModAny(result, powersOfTwo[n]);\r\n return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n };\r\n NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;\r\n\r\n function bitwise(x, y, fn) {\r\n y = parseValue(y);\r\n var xSign = x.isNegative(), ySign = y.isNegative();\r\n var xRem = xSign ? x.not() : x,\r\n yRem = ySign ? y.not() : y;\r\n var xDigit = 0, yDigit = 0;\r\n var xDivMod = null, yDivMod = null;\r\n var result = [];\r\n while (!xRem.isZero() || !yRem.isZero()) {\r\n xDivMod = divModAny(xRem, highestPower2);\r\n xDigit = xDivMod[1].toJSNumber();\r\n if (xSign) {\r\n xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers\r\n }\r\n\r\n yDivMod = divModAny(yRem, highestPower2);\r\n yDigit = yDivMod[1].toJSNumber();\r\n if (ySign) {\r\n yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers\r\n }\r\n\r\n xRem = xDivMod[0];\r\n yRem = yDivMod[0];\r\n result.push(fn(xDigit, yDigit));\r\n }\r\n var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);\r\n for (var i = result.length - 1; i >= 0; i -= 1) {\r\n sum = sum.multiply(highestPower2).add(bigInt(result[i]));\r\n }\r\n return sum;\r\n }\r\n\r\n BigInteger.prototype.not = function () {\r\n return this.negate().prev();\r\n };\r\n NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;\r\n\r\n BigInteger.prototype.and = function (n) {\r\n return bitwise(this, n, function (a, b) { return a & b; });\r\n };\r\n NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;\r\n\r\n BigInteger.prototype.or = function (n) {\r\n return bitwise(this, n, function (a, b) { return a | b; });\r\n };\r\n NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;\r\n\r\n BigInteger.prototype.xor = function (n) {\r\n return bitwise(this, n, function (a, b) { return a ^ b; });\r\n };\r\n NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;\r\n\r\n var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;\r\n function roughLOB(n) { // get lowestOneBit (rough)\r\n // SmallInteger: return Min(lowestOneBit(n), 1 << 30)\r\n // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]\r\n var v = n.value,\r\n x = typeof v === \"number\" ? v | LOBMASK_I :\r\n typeof v === \"bigint\" ? v | BigInt(LOBMASK_I) :\r\n v[0] + v[1] * BASE | LOBMASK_BI;\r\n return x & -x;\r\n }\r\n\r\n function integerLogarithm(value, base) {\r\n if (base.compareTo(value) <= 0) {\r\n var tmp = integerLogarithm(value, base.square(base));\r\n var p = tmp.p;\r\n var e = tmp.e;\r\n var t = p.multiply(base);\r\n return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };\r\n }\r\n return { p: bigInt(1), e: 0 };\r\n }\r\n\r\n BigInteger.prototype.bitLength = function () {\r\n var n = this;\r\n if (n.compareTo(bigInt(0)) < 0) {\r\n n = n.negate().subtract(bigInt(1));\r\n }\r\n if (n.compareTo(bigInt(0)) === 0) {\r\n return bigInt(0);\r\n }\r\n return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));\r\n }\r\n NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;\r\n\r\n function max(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.greater(b) ? a : b;\r\n }\r\n function min(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.lesser(b) ? a : b;\r\n }\r\n function gcd(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n if (a.equals(b)) return a;\r\n if (a.isZero()) return b;\r\n if (b.isZero()) return a;\r\n var c = Integer[1], d, t;\r\n while (a.isEven() && b.isEven()) {\r\n d = min(roughLOB(a), roughLOB(b));\r\n a = a.divide(d);\r\n b = b.divide(d);\r\n c = c.multiply(d);\r\n }\r\n while (a.isEven()) {\r\n a = a.divide(roughLOB(a));\r\n }\r\n do {\r\n while (b.isEven()) {\r\n b = b.divide(roughLOB(b));\r\n }\r\n if (a.greater(b)) {\r\n t = b; b = a; a = t;\r\n }\r\n b = b.subtract(a);\r\n } while (!b.isZero());\r\n return c.isUnit() ? a : a.multiply(c);\r\n }\r\n function lcm(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n return a.divide(gcd(a, b)).multiply(b);\r\n }\r\n function randBetween(a, b, rng) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n var usedRNG = rng || Math.random;\r\n var low = min(a, b), high = max(a, b);\r\n var range = high.subtract(low).add(1);\r\n if (range.isSmall) return low.add(Math.floor(usedRNG() * range));\r\n var digits = toBase(range, BASE).value;\r\n var result = [], restricted = true;\r\n for (var i = 0; i < digits.length; i++) {\r\n var top = restricted ? digits[i] + (i + 1 < digits.length ? digits[i + 1] / BASE : 0) : BASE;\r\n var digit = truncate(usedRNG() * top);\r\n result.push(digit);\r\n if (digit < digits[i]) restricted = false;\r\n }\r\n return low.add(Integer.fromArray(result, BASE, false));\r\n }\r\n\r\n var parseBase = function (text, base, alphabet, caseSensitive) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n text = String(text);\r\n if (!caseSensitive) {\r\n text = text.toLowerCase();\r\n alphabet = alphabet.toLowerCase();\r\n }\r\n var length = text.length;\r\n var i;\r\n var absBase = Math.abs(base);\r\n var alphabetValues = {};\r\n for (i = 0; i < alphabet.length; i++) {\r\n alphabetValues[alphabet[i]] = i;\r\n }\r\n for (i = 0; i < length; i++) {\r\n var c = text[i];\r\n if (c === \"-\") continue;\r\n if (c in alphabetValues) {\r\n if (alphabetValues[c] >= absBase) {\r\n if (c === \"1\" && absBase === 1) continue;\r\n throw new Error(c + \" is not a valid digit in base \" + base + \".\");\r\n }\r\n }\r\n }\r\n base = parseValue(base);\r\n var digits = [];\r\n var isNegative = text[0] === \"-\";\r\n for (i = isNegative ? 1 : 0; i < text.length; i++) {\r\n var c = text[i];\r\n if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));\r\n else if (c === \"<\") {\r\n var start = i;\r\n do { i++; } while (text[i] !== \">\" && i < text.length);\r\n digits.push(parseValue(text.slice(start + 1, i)));\r\n }\r\n else throw new Error(c + \" is not a valid character\");\r\n }\r\n return parseBaseFromArray(digits, base, isNegative);\r\n };\r\n\r\n function parseBaseFromArray(digits, base, isNegative) {\r\n var val = Integer[0], pow = Integer[1], i;\r\n for (i = digits.length - 1; i >= 0; i--) {\r\n val = val.add(digits[i].times(pow));\r\n pow = pow.times(base);\r\n }\r\n return isNegative ? val.negate() : val;\r\n }\r\n\r\n function stringify(digit, alphabet) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n if (digit < alphabet.length) {\r\n return alphabet[digit];\r\n }\r\n return \"<\" + digit + \">\";\r\n }\r\n\r\n function toBase(n, base) {\r\n base = bigInt(base);\r\n if (base.isZero()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n throw new Error(\"Cannot convert nonzero numbers to base 0.\");\r\n }\r\n if (base.equals(-1)) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n if (n.isNegative())\r\n return {\r\n value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))\r\n .map(Array.prototype.valueOf, [1, 0])\r\n ),\r\n isNegative: false\r\n };\r\n\r\n var arr = Array.apply(null, Array(n.toJSNumber() - 1))\r\n .map(Array.prototype.valueOf, [0, 1]);\r\n arr.unshift([1]);\r\n return {\r\n value: [].concat.apply([], arr),\r\n isNegative: false\r\n };\r\n }\r\n\r\n var neg = false;\r\n if (n.isNegative() && base.isPositive()) {\r\n neg = true;\r\n n = n.abs();\r\n }\r\n if (base.isUnit()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n\r\n return {\r\n value: Array.apply(null, Array(n.toJSNumber()))\r\n .map(Number.prototype.valueOf, 1),\r\n isNegative: neg\r\n };\r\n }\r\n var out = [];\r\n var left = n, divmod;\r\n while (left.isNegative() || left.compareAbs(base) >= 0) {\r\n divmod = left.divmod(base);\r\n left = divmod.quotient;\r\n var digit = divmod.remainder;\r\n if (digit.isNegative()) {\r\n digit = base.minus(digit).abs();\r\n left = left.next();\r\n }\r\n out.push(digit.toJSNumber());\r\n }\r\n out.push(left.toJSNumber());\r\n return { value: out.reverse(), isNegative: neg };\r\n }\r\n\r\n function toBaseString(n, base, alphabet) {\r\n var arr = toBase(n, base);\r\n return (arr.isNegative ? \"-\" : \"\") + arr.value.map(function (x) {\r\n return stringify(x, alphabet);\r\n }).join('');\r\n }\r\n\r\n BigInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n SmallInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n NativeBigInt.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n BigInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix !== 10) return toBaseString(this, radix, alphabet);\r\n var v = this.value, l = v.length, str = String(v[--l]), zeros = \"0000000\", digit;\r\n while (--l >= 0) {\r\n digit = String(v[l]);\r\n str += zeros.slice(digit.length) + digit;\r\n }\r\n var sign = this.sign ? \"-\" : \"\";\r\n return sign + str;\r\n };\r\n\r\n SmallInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix != 10) return toBaseString(this, radix, alphabet);\r\n return String(this.value);\r\n };\r\n\r\n NativeBigInt.prototype.toString = SmallInteger.prototype.toString;\r\n\r\n NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }\r\n\r\n BigInteger.prototype.valueOf = function () {\r\n return parseInt(this.toString(), 10);\r\n };\r\n BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;\r\n\r\n SmallInteger.prototype.valueOf = function () {\r\n return this.value;\r\n };\r\n SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;\r\n NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {\r\n return parseInt(this.toString(), 10);\r\n }\r\n\r\n function parseStringValue(v) {\r\n if (isPrecise(+v)) {\r\n var x = +v;\r\n if (x === truncate(x))\r\n return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);\r\n throw new Error(\"Invalid integer: \" + v);\r\n }\r\n var sign = v[0] === \"-\";\r\n if (sign) v = v.slice(1);\r\n var split = v.split(/e/i);\r\n if (split.length > 2) throw new Error(\"Invalid integer: \" + split.join(\"e\"));\r\n if (split.length === 2) {\r\n var exp = split[1];\r\n if (exp[0] === \"+\") exp = exp.slice(1);\r\n exp = +exp;\r\n if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error(\"Invalid integer: \" + exp + \" is not a valid exponent.\");\r\n var text = split[0];\r\n var decimalPlace = text.indexOf(\".\");\r\n if (decimalPlace >= 0) {\r\n exp -= text.length - decimalPlace - 1;\r\n text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);\r\n }\r\n if (exp < 0) throw new Error(\"Cannot include negative exponent part for integers\");\r\n text += (new Array(exp + 1)).join(\"0\");\r\n v = text;\r\n }\r\n var isValid = /^([0-9][0-9]*)$/.test(v);\r\n if (!isValid) throw new Error(\"Invalid integer: \" + v);\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(sign ? \"-\" + v : v));\r\n }\r\n var r = [], max = v.length, l = LOG_BASE, min = max - l;\r\n while (max > 0) {\r\n r.push(+v.slice(min, max));\r\n min -= l;\r\n if (min < 0) min = 0;\r\n max -= l;\r\n }\r\n trim(r);\r\n return new BigInteger(r, sign);\r\n }\r\n\r\n function parseNumberValue(v) {\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(v));\r\n }\r\n if (isPrecise(v)) {\r\n if (v !== truncate(v)) throw new Error(v + \" is not an integer.\");\r\n return new SmallInteger(v);\r\n }\r\n return parseStringValue(v.toString());\r\n }\r\n\r\n function parseValue(v) {\r\n if (typeof v === \"number\") {\r\n return parseNumberValue(v);\r\n }\r\n if (typeof v === \"string\") {\r\n return parseStringValue(v);\r\n }\r\n if (typeof v === \"bigint\") {\r\n return new NativeBigInt(v);\r\n }\r\n return v;\r\n }\r\n // Pre-define numbers in range [-999,999]\r\n for (var i = 0; i < 1000; i++) {\r\n Integer[i] = parseValue(i);\r\n if (i > 0) Integer[-i] = parseValue(-i);\r\n }\r\n // Backwards compatibility\r\n Integer.one = Integer[1];\r\n Integer.zero = Integer[0];\r\n Integer.minusOne = Integer[-1];\r\n Integer.max = max;\r\n Integer.min = min;\r\n Integer.gcd = gcd;\r\n Integer.lcm = lcm;\r\n Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };\r\n Integer.randBetween = randBetween;\r\n\r\n Integer.fromArray = function (digits, base, isNegative) {\r\n return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);\r\n };\r\n\r\n return Integer;\r\n})();\r\n\r\n// Node.js check\r\nif (typeof module !== \"undefined\" && module.hasOwnProperty(\"exports\")) {\r\n module.exports = bigInt;\r\n}\r\n\r\n//amd check\r\nif (typeof define === \"function\" && define.amd) {\r\n define( function () {\r\n return bigInt;\r\n });\r\n}\r\n","/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,s=0;for(;0!==i;){s=i>2e3?2e3:i,i-=s;do{a=a+t[n++]|0,r=r+a|0}while(--s);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,s=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,s,o,l,d,f,h,c,u,w,b,k,m,_,g,v,p,y,x,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),s=a+(e.avail_out-257),o=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,h=A.window,c=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,c>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(c&(1<>>=g,u-=g),u<15&&(c+=E[i++]<>>24,c>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(c&(1<o){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(c>>>=g,u-=g,g=a-r,p>g){if(g=p-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(y=0,x=h,0===f){if(y+=l-g,g2;)R[a++]=x[y++],R[a++]=x[y++],R[a++]=x[y++],v-=3;v&&(R[a++]=x[y++],v>1&&(R[a++]=x[y++]))}else{y=a-p;do{R[a++]=R[y++],R[a++]=R[y++],R[a++]=R[y++],v-=3}while(v>2);v&&(R[a++]=R[y++],v>1&&(R[a++]=R[y++]))}break}}break}}while(i>3,i-=v,u-=v<<3,c&=(1<{const u=c.bits;let w,b,k,m,_,g,v=0,p=0,y=0,x=0,E=0,R=0,A=0,Z=0,S=0,O=0,U=null,T=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(v=0;v<=r;v++)D[v]=0;for(p=0;p=1&&0===D[x];x--);if(E>x&&(E=x),0===x)return a[f++]=20971520,a[f++]=20971520,c.bits=1,0;for(y=1;y0&&(0===e||1!==x))return-1;for(I[1]=0,v=1;v852||2===e&&S>592)return 1;for(;;){B=v-A,h[p]g?(N=z[F+h[p]],C=U[T+h[p]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(O&=w-1,O+=w):O=0,p++,0==--D[v]){if(v===x)break;v=t[i+h[p]]}if(v>E&&(O&m)!==k){for(0===A&&(A=E),_+=y,R=v-A,Z=1<852||2===e&&S>592)return 1;k=O&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==O&&(a[_+O]=v-A<<24|64<<16|0),c.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:c,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:v,Z_BUF_ERROR:p,Z_DEFLATED:y}=h,x=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},O=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},U=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=O(e,t);return n!==b&&(e.state=null),n};let T,D,I=!0;const B=e=>{if(I){T=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,T,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=T,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveU(e,15),inflateInit2:U,inflate:(e,i)=>{let r,s,o,l,d,h,A,Z,S,O,U,T,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===x&&(r.mode=13),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,O=h,U=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==y){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(T=r.length,T>h&&(T=h),T&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+T),j)),512&r.flags&&(r.check=n(r.check,s,T,l)),h-=T,l+=T,r.length-=T),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===h)break e;T=0;do{j=s[l+T++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&T>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=x;break;case 10:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===h)break e;h--,Z+=s[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(T=r.length,T){if(T>h&&(T=h),T>A&&(T=A),0===T)break e;o.set(s.subarray(l,l+T),d),h-=T,l+=T,A-=T,d+=T,r.length-=T;break}r.mode=x;break;case 17:for(;S<14;){if(0===h)break e;h--,Z+=s[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],T=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,T=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,T=11+(127&Z),Z>>>=7,S-=7}if(r.have+T>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;T--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(h>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=h,r.hold=Z,r.bits=S,a(e,U),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,r.mode===x&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=x;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(T=U-A,r.offset>T){if(T=r.offset-T,T>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}T>r.wnext?(T-=r.wnext,D=r.wsize-T):D=r.wnext-T,T>r.length&&(T=r.length),I=r.window}else I=o,D=d-r.offset,T=r.length;T>A&&(T=A),A-=T,r.length-=T;do{o[d++]=I[D++]}while(--T);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;o[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===h)break e;h--,Z|=s[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,s;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(s=N(e,i,n,n),s?(a.mode=31,v):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{let t,i,n,a,r,s=e.length,o=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{let i,n;const a=t||e.length,r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(t&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:t<65536?r[n++]=t:(t-=65536,r[n++]=55296|t>>10&1023,r[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=h;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,s),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,s):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,s);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==o){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,se=ae,oe=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=h,fe={Inflate:re,inflate:se,inflateRaw:oe,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=se,e.inflateRaw=oe,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\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 bufferConcats from \"../helpers/bytes/bufferConcats\";\nimport bytesFromHex from \"../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../helpers/bytes/bytesToHex\";\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n};\n\n/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n }\n}.finally; */\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\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 * 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 { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\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// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\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 Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\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 for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\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 { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\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 MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1460809483,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-818518751,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-516145888,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":1370914559,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessagePeerReaction\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-396644838,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-2099097129,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"}]},\"layer\":138} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from \"big-integer\";\nimport intToUint from \"../number/intToUint\";\n\nexport default function longFromInts(high: number, low: number): string {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low)).toString(10);\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport longFromInts from '../../helpers/long/longFromInts';\n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n const {quotient, remainder} = bigInt(sLong).divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","import bigInt from 'big-integer';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n","import { bigIntFromBytes, bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","import bufferConcats from \"./bufferConcats\";\n\nexport default function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\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 cryptoWorker from \"../crypto/cryptoworker\";\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport addPadding from \"../../helpers/bytes/addPadding\";\r\nimport bufferConcats from \"../../helpers/bytes/bufferConcats\";\r\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\r\nimport convertToUint8Array from \"../../helpers/bytes/convertToUint8Array\";\r\nimport bigInt from 'big-integer';\r\nimport { bigIntFromBytes, bigIntToBytes } from \"../../helpers/bigInt/bigIntConversion\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\r\n\r\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\r\n\r\n return buffer;\r\n}\r\n\r\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n\r\n const p = bigIntFromBytes(algo.p);\r\n const g = bigInt(algo.g);\r\n\r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = bigInt(bytesToHex(pw_hash), 16);\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = g.modPow(x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bigIntToBytes(v);\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = bigIntFromBytes(state.srp_B);\r\n \r\n const pForHash = padArray(bigIntToBytes(p), 256);\r\n const gForHash = padArray(bigIntToBytes(g), 256);\r\n const b_for_hash = padArray(bigIntToBytes(B), 256);\r\n\r\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\r\n const k = bigIntFromBytes(kHash);\r\n\r\n const k_v = k.multiply(v).mod(p);\r\n\r\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\r\n const diff = prime.subtract(modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(diff.isNegative() ||\r\n diff.bitLength().toJSNumber() < min_diff_bits_count || \r\n modexp.bitLength().toJSNumber() < min_diff_bits_count || \r\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = bigIntFromBytes(flipper(state.secure_random));\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n const A = g.modPow(a, p);\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bigIntToBytes(A);\r\n\r\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\r\n const u = bigInt(s.hex, 16);\r\n if(!u.isZero() && !u.isNegative())\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n let g_b: bigInt.BigInteger;\r\n if(!B.greater(k_v)) {\r\n g_b = B.add(p);\r\n } else g_b = B;\r\n g_b = g_b.subtract(k_v).mod(p);\r\n\r\n const ux = u.multiply(x);\r\n const a_ux = a.add(ux);\r\n const S = g_b.modPow(a_ux, p);\r\n\r\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\r\n\r\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\r\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(\r\n h1, \r\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\r\n\r\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n };\r\n\r\n return out;\r\n}\r\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","import convertToUint8Array from \"./convertToUint8Array\";\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n //console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n //console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","import subtle from \"../subtle\";\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n","import type { RSAPublicKeyHex } from \"../../mtproto/rsaKeysManager\";\nimport bytesModPow from \"../../../helpers/bytes/bytesModPow\";\nimport bytesFromHex from \"../../../helpers/bytes/bytesFromHex\";\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\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\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from \"big-integer\";\nimport { nextRandomUint } from \"../random\";\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\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\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from \"big-integer\";\nimport { bigIntFromBytes, bigIntToBytes } from \"../../../../helpers/bigInt/bigIntConversion\";\nimport bigIntRandom from \"../../../../helpers/bigInt/bigIntRandom\";\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do \n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0], \n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n \n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map(b => bigIntToBytes(b)) as any;\n}\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 bigInt from \"big-integer\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport { MessagesDhConfig } from \"../../layer\";\nimport CallInstance from \"../calls/callInstance\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n \n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = new Uint8Array(p.length).randomize();\n // const a = new Uint8Array(4).randomize();\n \n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n \n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n \n return a;\n }\n };\n \n const a = generateA(p);\n // const a = new Uint8Array([0]);\n \n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n \n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n \n return dh;\n}\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 { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport cryptoWorker from \"./cryptoworker\";\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse(); // key_fingerprint: key_fingerprint as any // ! it doesn't work\n const key_fingerprint_long = bigIntFromBytes(key_fingerprint).toString(10); // bigInt2str(str2bigInt(bytesToHex(key_fingerprint), 16), 10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\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 cryptoWorker from '../../crypto/cryptoworker';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n \n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\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 * 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\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport gzipUncompress from '../../helpers/gzipUncompress';\r\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\r\nimport computeSRP from './srp';\r\nimport { aesEncryptSync, aesDecryptSync } from './utils/aesIGE';\r\nimport pbkdf2 from './utils/pbkdf2';\r\nimport rsaEncrypt from './utils/rsa';\r\nimport sha1 from './utils/sha1';\r\nimport sha256 from './utils/sha256';\r\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\r\nimport generateDh from './generateDh';\r\nimport computeDhKey from './computeDhKey';\r\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\r\n// import factorizeTdlibPQ from './utils/factorize/tdlib';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1': sha1,\r\n 'sha256': sha256,\r\n 'pbkdf2': pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': factorizeTdlibPQ, \r\n // 'factorize-new-new': pqPrimeLeemonNew, \r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP,\r\n 'generate-dh': generateDh,\r\n 'compute-dh-key': computeDhKey,\r\n 'get-emojis-fingerprint': getEmojisFingerprint\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\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 bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport type gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport type { Awaited } from \"../../types\";\r\nimport type getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport type computeDhKey from \"./computeDhKey\";\r\nimport type generateDh from \"./generateDh\";\r\nimport type computeSRP from \"./srp\";\r\nimport type { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport type factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\n// import type factorizeTdlibPQ from \"./utils/factorize/tdlib\";\r\nimport type pbkdf2 from \"./utils/pbkdf2\";\r\nimport type rsaEncrypt from \"./utils/rsa\";\r\nimport type sha1 from \"./utils/sha1\";\r\nimport type sha256 from \"./utils/sha256\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1': typeof sha1,\r\n 'sha256': typeof sha256,\r\n 'pbkdf2': typeof pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': typeof factorizeTdlibPQ,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP,\r\n 'generate-dh': typeof generateDh,\r\n 'compute-dh-key': typeof computeDhKey,\r\n 'get-emojis-fingerprint': typeof getEmojisFingerprint\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(\r\n method: Method, \r\n ...args: Parameters\r\n ): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\nimport longFromInts from '../../helpers/long/longFromInts';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\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","/*\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 DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.0',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","export default function noop() {}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\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\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\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 { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\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\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport bytesFromWordss from \"../../../helpers/bytes/bytesFromWordss\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n public counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this.counter = initialValue;\r\n }\r\n\r\n public increment() {\r\n const counter = this.counter;\r\n for(let i = 15; i >= 0; --i) {\r\n if(counter[i] === 255) {\r\n counter[i] = 0;\r\n } else {\r\n ++counter[i];\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n #counter: Counter;\r\n #remainingCounter: Uint8Array;\r\n #remainingCounterIndex: number;\r\n #aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this.#counter = new Counter(counter);\r\n this.#aes = new AES(key);\r\n this.#remainingCounterIndex = 16;\r\n }\r\n\r\n public update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; ++i) {\r\n if(this.#remainingCounterIndex === 16) {\r\n this.#remainingCounter = new Uint8Array(bytesFromWordss(this.#aes.encrypt(this.#counter.counter)));\r\n this.#remainingCounterIndex = 0;\r\n this.#counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this.#remainingCounter[this.#remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private encNew: CTR;\r\n private decNew: CTR;\r\n // private cryptoEncKey: CryptoKey;\r\n // encIv: Uint8Array;\r\n\r\n public /* async */ init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n initPayload.randomize();\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = /* await */ this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\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 { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\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 enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\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 Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = /* async */() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = /* await */ this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\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 { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\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 MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\nimport App from '../../config/app';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\n\r\n \r\nimport HTTP from './transports/http';\r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport { DcId } from '../../types';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n let chosenServer: string;\r\n if(Modes.ssl || !Modes.http) {\r\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\r\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\r\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\r\n } else {\r\n for(let dcOption of this.dcOptions) {\r\n if(dcOption.id === dcId) {\r\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n return new HTTP(dcId, chosenServer, logSuffix);\r\n };\r\n \r\n\r\n public chooseServer(\r\n dcId: DcId, \r\n connectionType: ConnectionType = 'client', \r\n transportType: TransportType = Modes.transport, \r\n reuse = true\r\n ) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n indexOfAndSplice(transports, transport);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\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 App from \"../../../config/app\";\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => websocketPromise.resolve(false), timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\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 { pause } from '../../../helpers/schedulers/pause';\r\nimport { DcId } from '../../../types';\r\nimport { logger, LogTypes } from '../../logger';\r\nimport type MTPNetworker from '../networker';\r\nimport MTTransport from './transport';\r\nimport Modes from '../../../config/modes';\r\n\r\n \r\nimport transportController from './controller';\r\n \r\n\r\nexport default class HTTP implements MTTransport {\r\n public networker: MTPNetworker;\r\n private log: ReturnType;\r\n\r\n private pending: Array<{\r\n resolve: (body: Uint8Array) => void, \r\n reject: any, \r\n body: Uint8Array\r\n }> = [];\r\n private releasing: boolean;\r\n\r\n public connected: boolean;\r\n private destroyed: boolean;\r\n private debug: boolean;\r\n \r\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\r\n this.debug = Modes.debug && false;\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n \r\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n\r\n this.connected = false;\r\n }\r\n\r\n public _send(body: Uint8Array, mode?: RequestMode) {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\r\n if(response.status !== 200 && !mode) {\r\n response.arrayBuffer().then(buffer => {\r\n this.log.error('not 200', \r\n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\r\n });\r\n\r\n throw response;\r\n }\r\n\r\n this.setConnected(true);\r\n\r\n // * test resending by dropping random request\r\n // if(Math.random() > .5) {\r\n // throw 'asd';\r\n // }\r\n\r\n return response.arrayBuffer().then(buffer => {\r\n return new Uint8Array(buffer);\r\n }); \r\n }, (err) => {\r\n this.setConnected(false);\r\n throw err;\r\n });\r\n }\r\n\r\n private setConnected(connected: boolean) {\r\n if(this.connected === connected || this.destroyed) {\r\n return;\r\n }\r\n\r\n this.connected = connected;\r\n\r\n \r\n transportController.setTransportValue('https', connected);\r\n \r\n }\r\n\r\n public destroy() {\r\n this.setConnected(false);\r\n this.destroyed = true;\r\n this.pending.forEach(pending => pending.reject());\r\n this.pending.length = 0;\r\n }\r\n\r\n public send(body: Uint8Array) {\r\n if(this.networker) {\r\n return this._send(body);\r\n } else {\r\n const promise = new Promise((resolve, reject) => {\r\n this.pending.push({resolve, reject, body});\r\n });\r\n\r\n this.releasePending();\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n private async releasePending() {\r\n if(this.releasing) return;\r\n\r\n this.releasing = true;\r\n // this.log('-> messages to send:', this.pending.length);\r\n for(let i = 0; i < this.pending.length; ++i) {\r\n const pending = this.pending[i];\r\n const {body, resolve} = pending;\r\n\r\n try {\r\n const result = await this._send(body);\r\n resolve(result);\r\n this.pending.splice(i, 1);\r\n } catch(err) {\r\n this.log.error('Send plain request error:', err);\r\n await pause(5000);\r\n }\r\n\r\n --i;\r\n }\r\n\r\n this.releasing = false;\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: {\n resolve: any,\n reject: any\n },\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n if(transport.connected && (transport as TcpObfuscated).connection) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n this.resend();\n }\n\n public destroy() {\n this.changeTransport();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // /* if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).connection.close();\n // }\n\n // return;\n // } */\n\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n noResponseMsgs.forEach((msgId) => {\n if(this.sentMessages[msgId]) {\n const deferred = this.sentMessages[msgId].deferred;\n delete this.sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n });\n\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport.send(requestData) as any;\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n });\n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + authKeyId.hex);\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n /* if(this.debug) {\n this.log('process message', message, messageId, sessionId);\n } */\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n const changedOffset = timeManager.applyServerTime(bigInt(messageId).shiftRight(32).toJSNumber());\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","import bigInt from \"big-integer\";\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map(bigInt => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport { bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n \n return bytes;\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 * 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 { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\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 { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport Modes from \"../../config/modes\";\r\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from \"./transports/controller\";\n \n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport DEBUG from \"../../config/debug\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport bigInt from \"big-integer\";\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', auth.nonce.hex);\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = new Uint8Array(32).randomize();\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = new Uint8Array(256).randomize();\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: new Uint8Array(16).randomize()\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\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 * 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 blobConstruct from '../helpers/blob/blobConstruct';\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 default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.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\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 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 createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\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({type: '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 // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\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 }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): 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(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\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[]) {\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(', ') : '');\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]) as 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[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): 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 return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\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.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 transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\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 requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\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","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\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 * 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 { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\nimport Modes from '../../config/modes';\r\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport isObject from '../../helpers/object/isObject';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport transportController from './transports/controller';\r\nimport MTTransport from './transports/transport';\r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTPNetworker[]\r\n }\r\n }\r\n };\r\n \r\n private cachedExportPromise: {[x: number]: Promise};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\r\n private baseDcId: DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType;\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n };\r\n\r\n private transportType: TransportType;\r\n \r\n constructor() {\r\n this.log = logger('API');\r\n\r\n this.cachedNetworkers = {} as any;\r\n this.cachedExportPromise = {};\r\n this.gettingNetworkers = {};\r\n this.baseDcId = 0;\r\n this.afterMessageTempIds = {};\r\n\r\n this.transportType = Modes.transport;\r\n\r\n \r\n transportController.addEventListener('transport', (transportType) => {\r\n this.changeTransportType(transportType);\r\n });\r\n \r\n }\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n private getTransportType(connectionType: ConnectionType) {\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType: TransportType = this.transportType;\r\n \r\n\r\n return transportType;\r\n }\r\n\r\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\r\n for(const transportType in this.cachedNetworkers) {\r\n const connections = this.cachedNetworkers[transportType as TransportType];\r\n for(const connectionType in connections) {\r\n const dcs = connections[connectionType as ConnectionType];\r\n for(const dcId in dcs) {\r\n const networkers = dcs[dcId as any as DcId];\r\n networkers.forEach((networker, idx, arr) => {\r\n callback({\r\n networker,\r\n dcId: +dcId as DcId,\r\n connectionType: connectionType as ConnectionType,\r\n transportType: transportType as TransportType,\r\n index: idx,\r\n array: arr\r\n });\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\r\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n }\r\n\r\n public changeTransportType(transportType: TransportType) {\r\n const oldTransportType = this.transportType;\r\n if(oldTransportType === transportType) {\r\n return;\r\n }\r\n\r\n this.log('changing transport from', oldTransportType, 'to', transportType);\r\n\r\n const oldObject = this.cachedNetworkers[oldTransportType];\r\n const newObject = this.cachedNetworkers[transportType];\r\n this.cachedNetworkers[transportType] = oldObject;\r\n this.cachedNetworkers[oldTransportType] = newObject;\r\n\r\n this.transportType = transportType;\r\n\r\n for(const oldGetKey in this.gettingNetworkers) {\r\n const promise = this.gettingNetworkers[oldGetKey];\r\n delete this.gettingNetworkers[oldGetKey];\r\n\r\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\r\n this.gettingNetworkers[newGetKey] = promise;\r\n\r\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\r\n }\r\n\r\n this.iterateNetworkers((info) => {\r\n const transportType = this.getTransportType(info.connectionType);\r\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\r\n this.changeNetworkerTransport(info.networker, transport);\r\n });\r\n }\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n\r\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\r\n return [dcId, transportType, connectionType].join('-');\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n const transportType = this.getTransportType(connectionType);\r\n if(!this.cachedNetworkers[transportType]) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n let transport = this.chooseServer(dcId, connectionType, transportType);\r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n let networker: MTPNetworker, error: any;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n sessionStorage.set({\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n });\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\r\n } catch(_error) {\r\n error = _error;\r\n }\r\n }\r\n\r\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\r\n const newTransportType = this.getTransportType(connectionType);\r\n if(newTransportType !== transportType) {\r\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\r\n transport.destroy();\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\r\n\r\n if(networker) {\r\n transport = this.chooseServer(dcId, connectionType, newTransportType);\r\n }\r\n\r\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n\r\n if(error) {\r\n this.log('get networker error', error, (error as Error).stack);\r\n throw error;\r\n }\r\n\r\n this.changeNetworkerTransport(networker, transport);\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n private changeNetworkerTransport(networker: MTPNetworker, transport: MTTransport) {\r\n const oldTransport = networker.transport;\r\n if(oldTransport) {\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, oldTransport);\r\n }\r\n\r\n networker.changeTransport(transport);\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\r\n networkerFactory.unsetConnectionInited();\r\n performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 { ReferenceBytes } from \"./referenceDatabase\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { notifyAll, notifySomeone } from \"../../helpers/context\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { InputFile, InputFileLocation, InputWebFileLocation, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId, WorkerTaskVoidTemplate } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport fileManager from \"../fileManager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"./apiManager\";\r\nimport { isWebpSupported } from \"./mtproto.worker\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\nimport readBlobAsArrayBuffer from \"../../helpers/blob/readBlobAsArrayBuffer\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n // getFileMethod: Parameters[1]\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\nexport interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n};\r\n\r\nexport interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n originalPayload: ReferenceBytes\r\n};\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\n\r\nexport class ApiFileManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private cachedDownloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: Set>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public webpConvertPromises: {[fileName: string]: CancellablePromise} = {};\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n constructor() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : 36;\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = downloadPull.findAndSplice(d => d.queueId === 0) || downloadPull.findAndSplice(d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n \r\n data.cb()\r\n .then((result) => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.resolve(result);\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.reject(error);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = (this.cachedDownloadPromises[fileName] ? [this.cachedDownloadPromises[fileName]] : undefined) || \r\n (this.uploadPromises[fileName] ? Array.from(this.uploadPromises[fileName]) : []);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then(buffer => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes: number;\r\n\r\n bytes = 512;\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes * 1024;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const convertPromise = deferredPromise();\r\n\r\n const task = {type: 'convertWebp', payload: {fileName, bytes}};\r\n notifySomeone(task);\r\n return this.webpConvertPromises[fileName] = convertPromise;\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n const task = {type: 'refreshReference', payload: reference};\r\n notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then(reference => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public downloadFile(options: DownloadOptions): DownloadPromise {\r\n if(!fileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n options.mimeType = 'image/svg+xml';\r\n } else if(options.mimeType === 'image/webp' && !isWebpSupported()) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.cachedDownloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob) => {\r\n if(blob instanceof Blob && blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.deleteFile(fileName).then(() => {\r\n return this.downloadFile(options);\r\n }).catch(() => {\r\n return this.downloadFile(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred: DownloadPromise = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.cachedDownloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n await this.deleteFile(fileName);\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch(() => {\r\n //this.log('not cached', fileName);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array, offset: number) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = offset + limit >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n deferred.notify({done, offset, total: size});\r\n //}\r\n\r\n const processedResult = await processDownloaded(bytes, offset);\r\n checkCancel();\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await fileManager.write(fileWriter, processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n deferred.resolve(fileWriter.finalize(size < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number, offset: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n this.cachedDownloadPromises[fileName] = deferred;\r\n\r\n deferred.safeFinally(() => {\r\n delete this.cachedDownloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n private deleteFile(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.cachedDownloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public uploadFile({file, fileName}: {file: Blob | File, fileName: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferredHelper: {\r\n resolve?: (input: typeof resultInputFile) => void,\r\n reject?: (error: any) => void,\r\n notify?: (details: {done: number, total: number}) => void\r\n } = {\r\n notify: (details: {done: number, total: number}) => {}\r\n };\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n if(totalParts > 4000) {\r\n return reject({type: 'FILE_TOO_BIG'});\r\n }\r\n\r\n deferredHelper.resolve = resolve;\r\n deferredHelper.reject = reject;\r\n });\r\n Object.assign(deferred, deferredHelper);\r\n\r\n if(totalParts > 4000) {\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then(buffer => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then((result) => {\r\n doneParts++;\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n deferred.finally(() => {\r\n set.delete(deferred);\r\n if(!set.size) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n const set = this.uploadPromises[fileName] ?? (this.uploadPromises[fileName] = new Set());\r\n set.add(deferred);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiFileManager = new ApiFileManager();\r\nMOUNT_CLASS_TO.apiFileManager = apiFileManager;\r\nexport default apiFileManager;\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 { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\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\n// just to include\nimport '../polyfill';\n\nimport type { LocalStorageProxyTask } from '../localStorage';\nimport type { WebpConvertTask } from '../webp/webpWorkerController';\nimport type { ToggleStorageTask } from './mtprotoworker';\nimport type { RefreshReferenceTaskResponse } from './apiFileManager';\nimport apiManager from \"./apiManager\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\nimport networkerFactory from \"./networkerFactory\";\nimport apiFileManager from './apiFileManager';\nimport { notifyAll } from '../../helpers/context';\nimport CacheStorageController from '../cacheStorage';\nimport sessionStorage from '../sessionStorage';\nimport { socketsProxied } from './transports/socketProxied';\nimport ctx from '../../environment/ctx';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nlet webpSupported = false;\nexport const isWebpSupported = () => {\n return webpSupported;\n};\n\nnetworkerFactory.setUpdatesProcessor((obj) => {\n notifyAll({update: obj});\n});\n\nnetworkerFactory.onConnectionStatusChange = (status) => {\n notifyAll({type: 'connectionStatusChange', payload: status});\n};\n\nconst taskListeners = {\n convertWebp: (task: WebpConvertTask) => {\n const {fileName, bytes} = task.payload;\n const deferred = apiFileManager.webpConvertPromises[fileName];\n if(deferred) {\n deferred.resolve(bytes);\n delete apiFileManager.webpConvertPromises[fileName];\n }\n },\n\n webpSupport: (task: any) => {\n webpSupported = task.payload;\n },\n\n socketProxy: (task: any) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n \n const socketProxied = socketsProxied.get(id);\n if(socketTask.type === 'message') {\n socketProxied.dispatchEvent('message', socketTask.payload);\n } else if(socketTask.type === 'open') {\n socketProxied.dispatchEvent('open');\n } else if(socketTask.type === 'close') {\n socketProxied.dispatchEvent('close');\n socketsProxied.delete(id);\n }\n },\n\n localStorageProxy: (task: LocalStorageProxyTask) => {\n sessionStorage.finishTask(task.id, task.payload);\n },\n\n userAgent: (task: any) => {\n networkerFactory.userAgent = task.payload;\n },\n\n online: () => {\n networkerFactory.forceReconnectTimeout();\n },\n\n forceReconnect: () => {\n networkerFactory.forceReconnect();\n },\n\n toggleStorage: (task: ToggleStorageTask) => {\n const enabled = task.payload;\n // AppStorage.toggleStorage(enabled);\n CacheStorageController.toggleStorage(enabled);\n },\n\n refreshReference: (task: RefreshReferenceTaskResponse) => {\n const hex = bytesToHex(task.originalPayload);\n const r = apiFileManager.refreshReferencePromises[hex];\n const deferred = r?.deferred;\n if(deferred) {\n if(task.error) {\n deferred.reject(task.error);\n } else {\n deferred.resolve(task.payload);\n }\n }\n },\n\n crypto: (task: any) => {\n cryptoWorker.invokeCrypto(task.task, ...task.args as any).then(result => {\n notifyAll({taskId: task.taskId, result});\n });\n }\n};\n\nconst onMessage = async(e: any) => {\n try {\n const task: {\n task: string,\n taskId: number,\n args: any[],\n type?: string\n } = e.data;\n const taskId = task.taskId;\n\n // @ts-ignore\n const f = taskListeners[task.type];\n if(f) {\n f(task);\n return;\n }\n\n if(!task.task) {\n return;\n }\n\n switch(task.task) {\n case 'requestFilePart':\n case 'setQueueId':\n case 'cancelDownload':\n case 'uploadFile':\n case 'downloadFile': {\n try {\n // @ts-ignore\n let result: any = apiFileManager[task.task].apply(apiFileManager, task.args);\n \n if(result instanceof Promise) {\n /* (result as ReturnType).notify = (progress: {done: number, total: number, offset: number}) => {\n notify({progress: {fileName, ...progress}});\n }; */\n result = await result;\n }\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n\n break;\n }\n\n case 'getNetworker': {\n // @ts-ignore\n apiManager[task.task].apply(apiManager, task.args).finally(() => {\n notifyAll({taskId, result: null});\n });\n \n break;\n }\n\n case 'setLanguage':\n case 'startAll':\n case 'stopAll': {\n // @ts-ignore\n networkerFactory[task.task].apply(networkerFactory, task.args);\n break;\n }\n \n default: {\n try {\n // @ts-ignore\n let result = apiManager[task.task].apply(apiManager, task.args);\n \n if(result instanceof Promise) {\n result = await result;\n }\n\n //console.log(notifyAll);\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n \n //throw new Error('Unknown task: ' + task.task);\n break;\n }\n }\n } catch(err) {\n console.error('worker task error:', err);\n }\n};\n\n//console.log('[WORKER] Will send ready', Date.now() / 1000);\nctx.addEventListener('message', onMessage);\nnotifyAll('ready');\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js b/public/npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js deleted file mode 100644 index 6236b094..00000000 --- a/public/npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackChunktweb=this.webpackChunktweb||[]).push([[630],{1915:t=>{self,t.exports=(()=>{var t={192:(t,e)=>{var r,n,o=function(){var t=function(t,e){var r=t,n=a[e],o=null,i=0,u=null,v=[],w={},_=function(t,e){o=function(t){for(var e=new Array(t),r=0;r=7&&M(t),null==u&&(u=P(r,n,v)),C(u,e)},m=function(t,e){for(var r=-1;r<=7;r+=1)if(!(t+r<=-1||i<=t+r))for(var n=-1;n<=7;n+=1)e+n<=-1||i<=e+n||(o[t+r][e+n]=0<=r&&r<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=n&&n<=4)},b=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(e>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,e){for(var r=n<<3|e,a=s.getBCHTypeInfo(r),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},C=function(t,e){for(var r=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(e),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var d=0;d<2;d+=1)if(null==o[n][h-d]){var l=!1;u>>a&1)),c(n,h-d)&&(l=!l),o[n][h-d]=l,-1==(a-=1)&&(u+=1,a=7)}if((n+=r)<0||i<=n){n-=r,r=-r;break}}},P=function(t,e,r){for(var n=h.getRSBlocks(t,e),o=d(),i=0;i8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,e){for(var r=0,n=0,o=0,i=new Array(e.length),a=new Array(e.length),u=0;u=0?p.getAt(g):0}}var v=0;for(l=0;ln)&&(t=n,e=r)}return e}())},w.createTableTag=function(t,e){t=t||2;var r="";r+='',r+="";for(var n=0;n";for(var o=0;o';r+=""}return(r+="")+"
"},w.createSvgTag=function(t,e,r,n){var o={};"object"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,e=o.margin,r=o.alt,n=o.title),t=t||2,e=void 0===e?4*t:e,(r="string"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||"qrcode-description":null,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-title":null;var i,a,s,u,c=w.getModuleCount()*t+2*e,h="";for(u="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",h+=''+O(n.text)+"":"",h+=r.text?''+O(r.text)+"":"",h+='',h+='"},w.createDataURL=function(t,e){t=t||2,e=void 0===e?4*t:e;var r=w.getModuleCount()*t+2*e,n=e,o=r-e;return y(r,r,(function(e,r){if(n<=e&&e"};var O=function(t){for(var e="",r=0;r":e+=">";break;case"&":e+="&";break;case'"':e+=""";break;default:e+=n}}return e};return w.createASCII=function(t,e){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var e,r,n,o,i,a=1*w.getModuleCount()+2*t,s=t,u=a-t,c={"██":"█","█ ":"▀"," █":"▄"," ":" "},h={"██":"▀","█ ":"▀"," █":" "," ":" "},d="";for(e=0;e=u?h[i]:c[i];d+="\n"}return a%2&&t>0?d.substring(0,d.length-a-1)+Array(a+1).join("▀"):d.substring(0,d.length-1)}(e);t-=1,e=void 0===e?2*t:e;var r,n,o,i,a=w.getModuleCount()*t+2*e,s=e,u=a-e,c=Array(t+1).join("██"),h=Array(t+1).join(" "),d="",l="";for(r=0;r>>8),e.push(255&a)):e.push(n)}}return e}};var e,r,n,o,i,a={L:1,M:0,Q:3,H:2},s=(e=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,n=7973,i=function(t){for(var e=0;0!=t;)e+=1,t>>>=1;return e},(o={}).getBCHTypeInfo=function(t){for(var e=t<<10;i(e)-i(r)>=0;)e^=r<=0;)e^=n<5&&(r+=3+i-5)}for(n=0;n=256;)e-=255;return t[e]}}}();function c(t,e){if(void 0===t.length)throw t.length+"/"+e;var r=function(){for(var r=0;r>>7-e%8&1)},put:function(t,e){for(var n=0;n>>e-n-1&1))},getLengthInBits:function(){return e},putBit:function(r){var n=Math.floor(e/8);t.length<=n&&t.push(0),r&&(t[n]|=128>>>e%8),e+=1}};return r},l=function(t){var e=t,r={getMode:function(){return 1},getLength:function(t){return e.length},write:function(t){for(var r=e,o=0;o+2>>8&255)+(255&o),t.put(o,13),r+=2}if(r>>8)},writeBytes:function(t,r,n){r=r||0,n=n||t.length;for(var o=0;o0&&(e+=","),e+=t[r];return e+"]"}};return e},w=function(t){var e=t,r=0,n=0,o=0,i={read:function(){for(;o<8;){if(r>=e.length){if(0==o)return-1;throw"unexpected end of file./"+o}var t=e.charAt(r);if(r+=1,"="==t)return o=0,-1;t.match(/^\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return i},y=function(t,e,r){for(var n=function(t,e){var r=t,n=e,o=new Array(t*e),i={setPixel:function(t,e,n){o[e*r+t]=n},write:function(t){t.writeString("GIF87a"),t.writeShort(r),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(r),t.writeShort(n),t.writeByte(0);var e=a(2);t.writeByte(2);for(var o=0;e.length-o>255;)t.writeByte(255),t.writeBytes(e,o,255),o+=255;t.writeByte(e.length-o),t.writeBytes(e,o,e.length-o),t.writeByte(0),t.writeString(";")}},a=function(t){for(var e=1<>>e!=0)throw"length over";for(;c+e>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});l.write(e,n);var f=0,p=String.fromCharCode(o[f]);for(f+=1;f=6;)i(t>>>e-6),e-=6},o.flush=function(){if(e>0&&(i(t<<6-e),t=0,e=0),r%3!=0)for(var o=3-r%3,a=0;a>6,128|63&n):n<55296||n>=57344?e.push(224|n>>12,128|n>>6&63,128|63&n):(r++,n=65536+((1023&n)<<10|1023&t.charCodeAt(r)),e.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return e}(t)},void 0===(n="function"==typeof(r=function(){return o})?r.apply(e,[]):r)||(t.exports=n)},796:(t,e,r)=>{"use strict";r.d(e,{default:()=>$});var n=function(){return(n=Object.assign||function(t){for(var e,r=1,n=arguments.length;rn||o&&o2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0,h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t}(),w="square",y="extra-rounded";var _=function(){return(_=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=C[t])||void 0===n?void 0:n[r])||(null===(i=C[t-e+7])||void 0===i?void 0:i[r])||(null===(a=C[t])||void 0===a?void 0:a[r-e+7])||(null===(s=P[t])||void 0===s?void 0:s[r])||(null===(u=P[t-e+7])||void 0===u?void 0:u[r])||(null===(c=P[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((r=void 0)||(r=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(e){var n;e.done?t(e.value):(n=e.value,n instanceof r?n:new r((function(t){t(n)}))).then(i,a)}s((n=n.apply(e,[])).next())}));var e,r,n},t.prototype.drawBackground=function(){var t=this.context,e=this._options;if(t){if(e.backgroundOptions.gradient){var r=e.backgroundOptions.gradient,n=this._createGradient({context:t,options:r,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});r.colorStops.forEach((function(t){var e=t.offset,r=t.color;n.addColorStop(e,r)})),t.fillStyle=n}else e.backgroundOptions.color&&(t.fillStyle=e.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var e=this;if(!this._qr)throw"QR code is not defined";var r=this.context;if(!r)throw"QR code is not defined";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw"The canvas is too small.";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),c=new v({context:r,type:n.dotsOptions.type});r.beginPath();for(var h=function(r){for(var n=function(n){return t&&!t(r,n)?"continue":d._qr.isDark(r,n)?void c.draw(s+r*a,u+n*a,a,(function(i,a){return!(r+i<0||n+a<0||r+i>=o||n+a>=o)&&!(t&&!t(r+i,n+a))&&!!e._qr&&e._qr.isDark(r+i,n+a)})):"continue"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,d-=s/2*Math.tan(u),l+=s/2,f+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(d-=s/2,h-=s/2/Math.tan(u),f+=s/2,l+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,d+=s/2*Math.tan(u),l-=s/2,f-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(d+=s/2,h+=s/2/Math.tan(u),f-=s/2,l-=s/2/Math.tan(u)),e=r.createLinearGradient(Math.round(h),Math.round(d),Math.round(l),Math.round(f))}return e},t}();var z=function(){return(z=Object.assign||function(t){for(var e,r=1,n=arguments.length;r2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0,c=i+a+s+u;if(0!==c)if(c>2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t}();var I=function(){return(I=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=R[t])||void 0===n?void 0:n[r])||(null===(i=R[t-e+7])||void 0===i?void 0:i[r])||(null===(a=R[t])||void 0===a?void 0:a[r-e+7])||(null===(s=B[t])||void 0===s?void 0:s[r])||(null===(u=B[t-e+7])||void 0===u?void 0:u[r])||(null===(c=B[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((r=void 0)||(r=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(e){var n;e.done?t(e.value):(n=e.value,n instanceof r?n:new r((function(t){t(n)}))).then(i,a)}s((n=n.apply(e,[])).next())}));var e,r,n},t.prototype.drawBackground=function(){var t,e,r=this._element,n=this._options;if(r){var o=null===(t=n.backgroundOptions)||void 0===t?void 0:t.gradient,i=null===(e=n.backgroundOptions)||void 0===e?void 0:e.color;(o||i)&&this._createColor({options:o,color:i,additionalRotation:0,x:0,y:0,height:n.height,width:n.width,name:"background-color"})}},t.prototype.drawDots=function(t){var e,r,n=this;if(!this._qr)throw"QR code is not defined";var o=this._options,i=this._qr.getModuleCount();if(i>o.width||i>o.height)throw"The canvas is too small.";var a=Math.min(o.width,o.height)-2*o.margin,s=Math.floor(a/i),u=Math.floor((o.width-i*s)/2),c=Math.floor((o.height-i*s)/2),h=new D({svg:this._element,type:o.dotsOptions.type});this._dotsClipPath=document.createElementNS("http://www.w3.org/2000/svg","clipPath"),this._dotsClipPath.setAttribute("id","clip-path-dot-color"),this._defs.appendChild(this._dotsClipPath),this._createColor({options:null===(e=o.dotsOptions)||void 0===e?void 0:e.gradient,color:o.dotsOptions.color,additionalRotation:0,x:u,y:c,height:i*s,width:i*s,name:"dot-color"});for(var d=function(e){for(var o=function(o){return t&&!t(e,o)?"continue":(null===(r=l._qr)||void 0===r?void 0:r.isDark(e,o))?(h.draw(u+e*s,c+o*s,s,(function(r,a){return!(e+r<0||o+a<0||e+r>=i||o+a>=i)&&!(t&&!t(e+r,o+a))&&!!n._qr&&n._qr.isDark(e+r,o+a)})),void(h._element&&l._dotsClipPath&&l._dotsClipPath.appendChild(h._element))):"continue"},a=0;aa?s:a,h=document.createElementNS("http://www.w3.org/2000/svg","rect");if(h.setAttribute("x",String(o)),h.setAttribute("y",String(i)),h.setAttribute("height",String(a)),h.setAttribute("width",String(s)),h.setAttribute("clip-path","url('#clip-path-"+u+"')"),e){var d;if(e.type===S)(d=document.createElementNS("http://www.w3.org/2000/svg","radialGradient")).setAttribute("id",u),d.setAttribute("gradientUnits","userSpaceOnUse"),d.setAttribute("fx",String(o+s/2)),d.setAttribute("fy",String(i+a/2)),d.setAttribute("cx",String(o+s/2)),d.setAttribute("cy",String(i+a/2)),d.setAttribute("r",String(c/2));else{var l=((e.rotation||0)+n)%(2*Math.PI),f=(l+2*Math.PI)%(2*Math.PI),p=o+s/2,g=i+a/2,v=o+s/2,w=i+a/2;f>=0&&f<=.25*Math.PI||f>1.75*Math.PI&&f<=2*Math.PI?(p-=s/2,g-=a/2*Math.tan(l),v+=s/2,w+=a/2*Math.tan(l)):f>.25*Math.PI&&f<=.75*Math.PI?(g-=a/2,p-=s/2/Math.tan(l),w+=a/2,v+=s/2/Math.tan(l)):f>.75*Math.PI&&f<=1.25*Math.PI?(p+=s/2,g+=a/2*Math.tan(l),v-=s/2,w-=a/2*Math.tan(l)):f>1.25*Math.PI&&f<=1.75*Math.PI&&(g+=a/2,p+=s/2/Math.tan(l),w-=a/2,v-=s/2/Math.tan(l)),(d=document.createElementNS("http://www.w3.org/2000/svg","linearGradient")).setAttribute("id",u),d.setAttribute("gradientUnits","userSpaceOnUse"),d.setAttribute("x1",String(Math.round(p))),d.setAttribute("y1",String(Math.round(g))),d.setAttribute("x2",String(Math.round(v))),d.setAttribute("y2",String(Math.round(w)))}e.colorStops.forEach((function(t){var e=t.offset,r=t.color,n=document.createElementNS("http://www.w3.org/2000/svg","stop");n.setAttribute("offset",100*e+"%"),n.setAttribute("stop-color",r),d.appendChild(n)})),h.setAttribute("fill","url('#"+u+"')"),this._defs.appendChild(d)}else r&&h.setAttribute("fill",r);this._element.appendChild(h)},t}(),L="canvas";for(var N={},T=0;T<=40;T++)N[T]=T;const F={type:L,width:300,height:300,data:"",margin:0,qrOptions:{typeNumber:N[0],mode:void 0,errorCorrectionLevel:"Q"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:"square",color:"#000"},backgroundOptions:{color:"#fff"}};var j=function(){return(j=Object.assign||function(t){for(var e,r=1,n=arguments.length;rMath.min(e.width,e.height)&&(e.margin=Math.min(e.width,e.height)),e.dotsOptions=j({},e.dotsOptions),e.dotsOptions.gradient&&(e.dotsOptions.gradient=Q(e.dotsOptions.gradient)),e.cornersSquareOptions&&(e.cornersSquareOptions=j({},e.cornersSquareOptions),e.cornersSquareOptions.gradient&&(e.cornersSquareOptions.gradient=Q(e.cornersSquareOptions.gradient))),e.cornersDotOptions&&(e.cornersDotOptions=j({},e.cornersDotOptions),e.cornersDotOptions.gradient&&(e.cornersDotOptions.gradient=Q(e.cornersDotOptions.gradient))),e.backgroundOptions&&(e.backgroundOptions=j({},e.backgroundOptions),e.backgroundOptions.gradient&&(e.backgroundOptions.gradient=Q(e.backgroundOptions.gradient))),e}var G=r(192),X=r.n(G),U=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function a(t){try{u(n.next(t))}catch(t){i(t)}}function s(t){try{u(n.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,s)}u((n=n.apply(t,e||[])).next())}))},Y=function(t,e){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]\r\n'+n],{type:"image/svg+xml"})]):[2,new Promise((function(r){return e.getCanvas().toBlob(r,"image/"+t,1)}))]}}))}))},t.prototype.download=function(t){return U(this,void 0,void 0,(function(){var e,r,n,o,i;return Y(this,(function(a){switch(a.label){case 0:if(!this._qr)throw"QR code is empty";return e="png",r="qr","string"==typeof t?(e=t,console.warn("Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument")):"object"==typeof t&&null!==t&&(t.name&&(r=t.name),t.extension&&(e=t.extension)),[4,this._getQRStylingElement(e)];case 1:return n=a.sent(),"svg"===e.toLowerCase()?(o=new XMLSerializer,i='\r\n'+(i=o.serializeToString(n.getElement())),s("data:image/svg+xml;charset=utf-8,"+encodeURIComponent(i),r+".svg")):s(n.getCanvas().toDataURL("image/"+e),r+"."+e),[2]}}))}))},t}()}},e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{}};return t[n](o,o.exports,r),o.exports}return r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r(796)})().default}}]); -//# sourceMappingURL=npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js.map \ No newline at end of file diff --git a/public/npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js.map b/public/npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js.map deleted file mode 100644 index 893ab2c2..00000000 --- a/public/npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"npm.qr-code-styling.3ec55c0ceef2f8610946.chunk.js","mappings":"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G,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAA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","sources":["webpack://tweb/./node_modules/qr-code-styling/lib/qr-code-styling.js"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.QRCodeStyling=e():t.QRCodeStyling=e()}(self,(function(){return(()=>{var t={192:(t,e)=>{var r,n,o=function(){var t=function(t,e){var r=t,n=a[e],o=null,i=0,u=null,v=[],y={},_=function(t,e){o=function(t){for(var e=new Array(t),r=0;r=7&&M(t),null==u&&(u=P(r,n,v)),C(u,e)},m=function(t,e){for(var r=-1;r<=7;r+=1)if(!(t+r<=-1||i<=t+r))for(var n=-1;n<=7;n+=1)e+n<=-1||i<=e+n||(o[t+r][e+n]=0<=r&&r<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=n&&n<=4)},b=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(e>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,e){for(var r=n<<3|e,a=s.getBCHTypeInfo(r),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},C=function(t,e){for(var r=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(e),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var d=0;d<2;d+=1)if(null==o[n][h-d]){var l=!1;u>>a&1)),c(n,h-d)&&(l=!l),o[n][h-d]=l,-1==(a-=1)&&(u+=1,a=7)}if((n+=r)<0||i<=n){n-=r,r=-r;break}}},P=function(t,e,r){for(var n=h.getRSBlocks(t,e),o=d(),i=0;i8*u)throw\"code length overflow. (\"+o.getLengthInBits()+\">\"+8*u+\")\";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,e){for(var r=0,n=0,o=0,i=new Array(e.length),a=new Array(e.length),u=0;u=0?p.getAt(g):0}}var v=0;for(l=0;ln)&&(t=n,e=r)}return e}())},y.createTableTag=function(t,e){t=t||2;var r=\"\";r+='',r+=\"\";for(var n=0;n\";for(var o=0;o';r+=\"\"}return(r+=\"\")+\"
\"},y.createSvgTag=function(t,e,r,n){var o={};\"object\"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,e=o.margin,r=o.alt,n=o.title),t=t||2,e=void 0===e?4*t:e,(r=\"string\"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||\"qrcode-description\":null,(n=\"string\"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||\"qrcode-title\":null;var i,a,s,u,c=y.getModuleCount()*t+2*e,h=\"\";for(u=\"l\"+t+\",0 0,\"+t+\" -\"+t+\",0 0,-\"+t+\"z \",h+='\",h+=n.text?''+O(n.text)+\"\":\"\",h+=r.text?''+O(r.text)+\"\":\"\",h+='',h+='')+\"\"},y.createDataURL=function(t,e){t=t||2,e=void 0===e?4*t:e;var r=y.getModuleCount()*t+2*e,n=e,o=r-e;return w(r,r,(function(e,r){if(n<=e&&e\"};var O=function(t){for(var e=\"\",r=0;r\":e+=\">\";break;case\"&\":e+=\"&\";break;case'\"':e+=\""\";break;default:e+=n}}return e};return y.createASCII=function(t,e){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var e,r,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={\"██\":\"█\",\"█ \":\"▀\",\" █\":\"▄\",\" \":\" \"},h={\"██\":\"▀\",\"█ \":\"▀\",\" █\":\" \",\" \":\" \"},d=\"\";for(e=0;e=u?h[i]:c[i];d+=\"\\n\"}return a%2&&t>0?d.substring(0,d.length-a-1)+Array(a+1).join(\"▀\"):d.substring(0,d.length-1)}(e);t-=1,e=void 0===e?2*t:e;var r,n,o,i,a=y.getModuleCount()*t+2*e,s=e,u=a-e,c=Array(t+1).join(\"██\"),h=Array(t+1).join(\" \"),d=\"\",l=\"\";for(r=0;r>>8),e.push(255&a)):e.push(n)}}return e}};var e,r,n,o,i,a={L:1,M:0,Q:3,H:2},s=(e=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,n=7973,i=function(t){for(var e=0;0!=t;)e+=1,t>>>=1;return e},(o={}).getBCHTypeInfo=function(t){for(var e=t<<10;i(e)-i(r)>=0;)e^=r<=0;)e^=n<5&&(r+=3+i-5)}for(n=0;n=256;)e-=255;return t[e]}}}();function c(t,e){if(void 0===t.length)throw t.length+\"/\"+e;var r=function(){for(var r=0;r>>7-e%8&1)},put:function(t,e){for(var n=0;n>>e-n-1&1))},getLengthInBits:function(){return e},putBit:function(r){var n=Math.floor(e/8);t.length<=n&&t.push(0),r&&(t[n]|=128>>>e%8),e+=1}};return r},l=function(t){var e=t,r={getMode:function(){return 1},getLength:function(t){return e.length},write:function(t){for(var r=e,o=0;o+2>>8&255)+(255&o),t.put(o,13),r+=2}if(r>>8)},writeBytes:function(t,r,n){r=r||0,n=n||t.length;for(var o=0;o0&&(e+=\",\"),e+=t[r];return e+\"]\"}};return e},y=function(t){var e=t,r=0,n=0,o=0,i={read:function(){for(;o<8;){if(r>=e.length){if(0==o)return-1;throw\"unexpected end of file./\"+o}var t=e.charAt(r);if(r+=1,\"=\"==t)return o=0,-1;t.match(/^\\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw\"c:\"+t};return i},w=function(t,e,r){for(var n=function(t,e){var r=t,n=e,o=new Array(t*e),i={setPixel:function(t,e,n){o[e*r+t]=n},write:function(t){t.writeString(\"GIF87a\"),t.writeShort(r),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(\",\"),t.writeShort(0),t.writeShort(0),t.writeShort(r),t.writeShort(n),t.writeByte(0);var e=a(2);t.writeByte(2);for(var o=0;e.length-o>255;)t.writeByte(255),t.writeBytes(e,o,255),o+=255;t.writeByte(e.length-o),t.writeBytes(e,o,e.length-o),t.writeByte(0),t.writeString(\";\")}},a=function(t){for(var e=1<>>e!=0)throw\"length over\";for(;c+e>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});l.write(e,n);var f=0,p=String.fromCharCode(o[f]);for(f+=1;f=6;)i(t>>>e-6),e-=6},o.flush=function(){if(e>0&&(i(t<<6-e),t=0,e=0),r%3!=0)for(var o=3-r%3,a=0;a>6,128|63&n):n<55296||n>=57344?e.push(224|n>>12,128|n>>6&63,128|63&n):(r++,n=65536+((1023&n)<<10|1023&t.charCodeAt(r)),e.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return e}(t)},void 0===(n=\"function\"==typeof(r=function(){return o})?r.apply(e,[]):r)||(t.exports=n)},796:(t,e,r)=>{\"use strict\";r.d(e,{default:()=>W});var n=function(){return(n=Object.assign||function(t){for(var e,r=1,n=arguments.length;rn||o&&o2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0,h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t}(),w=\"square\",_=\"extra-rounded\";var m=function(){return(m=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=P[t])||void 0===n?void 0:n[r])||(null===(i=P[t-e+7])||void 0===i?void 0:i[r])||(null===(a=P[t])||void 0===a?void 0:a[r-e+7])||(null===(s=O[t])||void 0===s?void 0:s[r])||(null===(u=O[t-e+7])||void 0===u?void 0:u[r])||(null===(c=O[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(e){var r;e.done?t(e.value):(r=e.value,r instanceof n?r:new n((function(t){t(r)}))).then(a,s)}u((o=o.apply(e,r||[])).next())}));var e,r,n,o},t.prototype.drawBackground=function(){var t=this.context,e=this._options;if(t){if(e.backgroundOptions.gradient){var r=e.backgroundOptions.gradient,n=this._createGradient({context:t,options:r,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});r.colorStops.forEach((function(t){var e=t.offset,r=t.color;n.addColorStop(e,r)})),t.fillStyle=n}else e.backgroundOptions.color&&(t.fillStyle=e.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var e=this;if(!this._qr)throw\"QR code is not defined\";var r=this.context;if(!r)throw\"QR code is not defined\";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw\"The canvas is too small.\";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),c=new y({context:r,type:n.dotsOptions.type});r.beginPath();for(var h=function(r){for(var n=function(n){return t&&!t(r,n)?\"continue\":d._qr.isDark(r,n)?void c.draw(s+r*a,u+n*a,a,(function(i,a){return!(r+i<0||n+a<0||r+i>=o||n+a>=o)&&!(t&&!t(r+i,n+a))&&!!e._qr&&e._qr.isDark(r+i,n+a)})):\"continue\"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,d-=s/2*Math.tan(u),l+=s/2,f+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(d-=s/2,h-=s/2/Math.tan(u),f+=s/2,l+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,d+=s/2*Math.tan(u),l-=s/2,f-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(d+=s/2,h+=s/2/Math.tan(u),f-=s/2,l-=s/2/Math.tan(u)),e=r.createLinearGradient(Math.round(h),Math.round(d),Math.round(l),Math.round(f))}return e},t}();var D=function(){return(D=Object.assign||function(t){for(var e,r=1,n=arguments.length;r2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0,c=i+a+s+u;if(0!==c)if(c>2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t}();var A=function(){return(A=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=B[t])||void 0===n?void 0:n[r])||(null===(i=B[t-e+7])||void 0===i?void 0:i[r])||(null===(a=B[t])||void 0===a?void 0:a[r-e+7])||(null===(s=E[t])||void 0===s?void 0:s[r])||(null===(u=E[t-e+7])||void 0===u?void 0:u[r])||(null===(c=E[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(e){var r;e.done?t(e.value):(r=e.value,r instanceof n?r:new n((function(t){t(r)}))).then(a,s)}u((o=o.apply(e,r||[])).next())}));var e,r,n,o},t.prototype.drawBackground=function(){var t,e,r=this._element,n=this._options;if(r){var o=null===(t=n.backgroundOptions)||void 0===t?void 0:t.gradient,i=null===(e=n.backgroundOptions)||void 0===e?void 0:e.color;(o||i)&&this._createColor({options:o,color:i,additionalRotation:0,x:0,y:0,height:n.height,width:n.width,name:\"background-color\"})}},t.prototype.drawDots=function(t){var e,r,n=this;if(!this._qr)throw\"QR code is not defined\";var o=this._options,i=this._qr.getModuleCount();if(i>o.width||i>o.height)throw\"The canvas is too small.\";var a=Math.min(o.width,o.height)-2*o.margin,s=Math.floor(a/i),u=Math.floor((o.width-i*s)/2),c=Math.floor((o.height-i*s)/2),h=new I({svg:this._element,type:o.dotsOptions.type});this._dotsClipPath=document.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\"),this._dotsClipPath.setAttribute(\"id\",\"clip-path-dot-color\"),this._defs.appendChild(this._dotsClipPath),this._createColor({options:null===(e=o.dotsOptions)||void 0===e?void 0:e.gradient,color:o.dotsOptions.color,additionalRotation:0,x:u,y:c,height:i*s,width:i*s,name:\"dot-color\"});for(var d=function(e){for(var o=function(o){return t&&!t(e,o)?\"continue\":(null===(r=l._qr)||void 0===r?void 0:r.isDark(e,o))?(h.draw(u+e*s,c+o*s,s,(function(r,a){return!(e+r<0||o+a<0||e+r>=i||o+a>=i)&&!(t&&!t(e+r,o+a))&&!!n._qr&&n._qr.isDark(e+r,o+a)})),void(h._element&&l._dotsClipPath&&l._dotsClipPath.appendChild(h._element))):\"continue\"},a=0;aa?s:a,h=document.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\");if(h.setAttribute(\"x\",String(o)),h.setAttribute(\"y\",String(i)),h.setAttribute(\"height\",String(a)),h.setAttribute(\"width\",String(s)),h.setAttribute(\"clip-path\",\"url('#clip-path-\"+u+\"')\"),e){var d;if(e.type===C)(d=document.createElementNS(\"http://www.w3.org/2000/svg\",\"radialGradient\")).setAttribute(\"id\",u),d.setAttribute(\"gradientUnits\",\"userSpaceOnUse\"),d.setAttribute(\"fx\",String(o+s/2)),d.setAttribute(\"fy\",String(i+a/2)),d.setAttribute(\"cx\",String(o+s/2)),d.setAttribute(\"cy\",String(i+a/2)),d.setAttribute(\"r\",String(c/2));else{var l=((e.rotation||0)+n)%(2*Math.PI),f=(l+2*Math.PI)%(2*Math.PI),p=o+s/2,g=i+a/2,v=o+s/2,y=i+a/2;f>=0&&f<=.25*Math.PI||f>1.75*Math.PI&&f<=2*Math.PI?(p-=s/2,g-=a/2*Math.tan(l),v+=s/2,y+=a/2*Math.tan(l)):f>.25*Math.PI&&f<=.75*Math.PI?(g-=a/2,p-=s/2/Math.tan(l),y+=a/2,v+=s/2/Math.tan(l)):f>.75*Math.PI&&f<=1.25*Math.PI?(p+=s/2,g+=a/2*Math.tan(l),v-=s/2,y-=a/2*Math.tan(l)):f>1.25*Math.PI&&f<=1.75*Math.PI&&(g+=a/2,p+=s/2/Math.tan(l),y-=a/2,v-=s/2/Math.tan(l)),(d=document.createElementNS(\"http://www.w3.org/2000/svg\",\"linearGradient\")).setAttribute(\"id\",u),d.setAttribute(\"gradientUnits\",\"userSpaceOnUse\"),d.setAttribute(\"x1\",String(Math.round(p))),d.setAttribute(\"y1\",String(Math.round(g))),d.setAttribute(\"x2\",String(Math.round(v))),d.setAttribute(\"y2\",String(Math.round(y)))}e.colorStops.forEach((function(t){var e=t.offset,r=t.color,n=document.createElementNS(\"http://www.w3.org/2000/svg\",\"stop\");n.setAttribute(\"offset\",100*e+\"%\"),n.setAttribute(\"stop-color\",r),d.appendChild(n)})),h.setAttribute(\"fill\",\"url('#\"+u+\"')\"),this._defs.appendChild(d)}else r&&h.setAttribute(\"fill\",r);this._element.appendChild(h)},t}(),N=\"canvas\";for(var T={},j=0;j<=40;j++)T[j]=j;const F={type:N,width:300,height:300,data:\"\",margin:0,qrOptions:{typeNumber:T[0],mode:void 0,errorCorrectionLevel:\"Q\"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:\"square\",color:\"#000\"},backgroundOptions:{color:\"#fff\"}};var Q=function(){return(Q=Object.assign||function(t){for(var e,r=1,n=arguments.length;rMath.min(e.width,e.height)&&(e.margin=Math.min(e.width,e.height)),e.dotsOptions=Q({},e.dotsOptions),e.dotsOptions.gradient&&(e.dotsOptions.gradient=H(e.dotsOptions.gradient)),e.cornersSquareOptions&&(e.cornersSquareOptions=Q({},e.cornersSquareOptions),e.cornersSquareOptions.gradient&&(e.cornersSquareOptions.gradient=H(e.cornersSquareOptions.gradient))),e.cornersDotOptions&&(e.cornersDotOptions=Q({},e.cornersDotOptions),e.cornersDotOptions.gradient&&(e.cornersDotOptions.gradient=H(e.cornersDotOptions.gradient))),e.backgroundOptions&&(e.backgroundOptions=Q({},e.backgroundOptions),e.backgroundOptions.gradient&&(e.backgroundOptions.gradient=H(e.backgroundOptions.gradient))),e}var X=r(192),U=r.n(X),Y=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function a(t){try{u(n.next(t))}catch(t){i(t)}}function s(t){try{u(n.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,s)}u((n=n.apply(t,e||[])).next())}))},$=function(t,e){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError(\"Generator is already executing.\");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]\\r\\n'+n],{type:\"image/svg+xml\"})]):[2,new Promise((function(r){return e.getCanvas().toBlob(r,\"image/\"+t,1)}))]}}))}))},t.prototype.download=function(t){return Y(this,void 0,void 0,(function(){var e,r,n,o,i;return $(this,(function(a){switch(a.label){case 0:if(!this._qr)throw\"QR code is empty\";return e=\"png\",r=\"qr\",\"string\"==typeof t?(e=t,console.warn(\"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\")):\"object\"==typeof t&&null!==t&&(t.name&&(r=t.name),t.extension&&(e=t.extension)),[4,this._getQRStylingElement(e)];case 1:return n=a.sent(),\"svg\"===e.toLowerCase()?(o=new XMLSerializer,i='\\r\\n'+(i=o.serializeToString(n.getElement())),s(\"data:image/svg+xml;charset=utf-8,\"+encodeURIComponent(i),r+\".svg\")):s(n.getCanvas().toDataURL(\"image/\"+e),r+\".\"+e),[2]}}))}))},t}()}},e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{}};return t[n](o,o.exports,r),o.exports}return r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r(796)})().default}));\n//# sourceMappingURL=qr-code-styling.js.map"],"names":["self","module","exports","t","e","r","n","o","a","i","u","v","y","_","Array","m","x","b","S","M","P","C","s","getPatternPosition","length","c","getBCHTypeNumber","Math","floor","getBCHTypeInfo","getMaskFunction","h","d","l","getRSBlocks","put","getMode","getLength","getLengthInBits","write","dataCount","putBit","totalCount","max","getBuffer","f","getErrorCorrectPolynomial","p","mod","g","getAt","w","addData","push","isDark","getModuleCount","make","getLostPoint","createTableTag","createSvgTag","arguments","cellSize","margin","alt","title","text","id","scalable","O","join","trim","createDataURL","createImgTag","charAt","createASCII","substring","renderTo2dContext","fillStyle","fillRect","stringToBytes","stringToBytesFuncs","default","charCodeAt","createStringToBytes","read","String","fromCharCode","L","Q","H","multiply","gexp","abs","glog","SJIS","writeByte","writeShort","writeBytes","writeString","toByteArray","toString","match","setPixel","add","flush","contains","indexOf","size","apply","W","Object","assign","prototype","hasOwnProperty","call","this","isArray","shift","keys","forEach","document","createElement","download","href","body","appendChild","click","removeChild","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dotSize","height","width","hideYDots","hideXDots","sqrt","ceil","round","context","type","_context","_type","draw","_drawDot","_drawClassy","_drawClassyRounded","_drawRounded","_drawExtraRounded","_drawSquare","getNeighbor","_rotateFigure","rotation","translate","rotate","closePath","_basicDot","arc","PI","_basicSquare","rect","_basicSideRounded","lineTo","_basicCornerRounded","_basicCornerExtraRounded","_basicCornersRounded","_basicCornersExtraRounded","_basicExtraRounded","z","_canvas","_options","defineProperty","get","getContext","enumerable","configurable","getCanvas","clear","clearRect","drawQR","label","sent","trys","ops","next","throw","return","Symbol","iterator","TypeError","done","value","pop","min","_qr","image","loadImage","_image","imageOptions","qrOptions","imageSize","errorCorrectionLevel","drawBackground","drawDots","hideBackgroundDots","drawCorners","drawImage","count","Promise","then","backgroundOptions","gradient","_createGradient","options","additionalRotation","colorStops","offset","color","addColorStop","dotsOptions","beginPath","strokeStyle","fill","D","I","cornersSquareOptions","A","k","q","R","B","E","cornersDotOptions","N","T","Image","crossOrigin","onload","src","createRadialGradient","tan","createLinearGradient","svg","_svg","_element","setAttribute","createElementNS","_defs","getElement","cloneNode","parentNode","replaceChild","_createColor","name","_dotsClipPath","_cornersSquareClipPath","_cornersDotClipPath","j","F","data","typeNumber","mode","Number","map","G","Boolean","X","U","Y","$","update","_clearContainer","innerHTML","_getQRStylingElement","toLowerCase","_svgDrawingPromise","_canvasDrawingPromise","_container","test","append","getRawData","XMLSerializer","serializeToString","Blob","toBlob","console","warn","extension","encodeURIComponent","toDataURL","__esModule"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js b/public/npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js new file mode 100644 index 00000000..28ee1c5c --- /dev/null +++ b/public/npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[11],{199:function(t,r,e){self,t.exports=(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&m(t),null==u&&(u=k(e,n,v)),S(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},O=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},S=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},k=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e="";e+='',e+="";for(var n=0;n";for(var o=0;o';e+=""}return(e+="")+"
"},y.createSvgTag=function(t,r,e,n){var o={};"object"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e="string"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||"qrcode-description":null,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-title":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h="";for(u="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",h+=''+C(n.text)+"":"",h+=e.text?''+C(e.text)+"":"",h+='',h+='"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r"};var C=function(t){for(var r="",e=0;e":r+=">";break;case"&":r+="&";break;case'"':r+=""";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={"██":"█","█ ":"▀"," █":"▄"," ":" "},h={"██":"▀","█ ":"▀"," █":" "," ":" "},f="";for(r=0;r=u?h[i]:c[i];f+="\n"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join("▀"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join("██"),h=Array(t+1).join(" "),f="",d="";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+"/"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=","),r+=t[e];return r+"]"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw"unexpected end of file./"+o}var t=r.charAt(e);if(e+=1,"="==t)return o=0,-1;t.match(/^\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString("GIF87a"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(";")}},a=function(t){for(var r=1<>>r!=0)throw"length over";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n="function"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{"use strict";e.d(r,{default:()=>S});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((e=void 0)||(e=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(r){var n;r.done?t(r.value):(n=r.value,n instanceof e?n:new e((function(t){t(n)}))).then(i,a)}s((n=n.apply(r,[])).next())}));var r,e,n},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw"QR code is not defined";var e=this.context;if(!e)throw"QR code is not defined";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw"The canvas is too small.";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?"continue":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):"continue"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:"",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:"Q"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:"square",color:"#000"},backgroundOptions:{color:"#fff"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var m=e(192),O=e.n(m);const S=function(){function t(t){this._options=t?M(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML="")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?M(a(this._options,r)):this._options,this._options.data&&(this._qr=O()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return"Numeric";case/^[0-9A-Z $%*+\-./:]*$/.test(t):return"Alphanumeric";default:return"Byte"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if("function"!=typeof t.appendChild)throw"Container should be a single DOM node";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e="png",n="qr";"string"==typeof t?(e=t,console.warn("Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument")):"object"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement("a");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL("image/"+e),n+"."+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}}]); +//# sourceMappingURL=npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js.map \ No newline at end of file diff --git a/public/npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js.map b/public/npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js.map new file mode 100644 index 00000000..16b23de4 --- /dev/null +++ b/public/npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/qr-code-styling/lib/qr-code-styling.js"],"names":["self","module","exports","t","192","r","e","n","o","a","i","u","v","y","x","Array","b","m","_","S","M","C","O","s","getPatternPosition","length","c","getBCHTypeNumber","Math","floor","getBCHTypeInfo","getMaskFunction","h","f","d","getRSBlocks","put","getMode","getLength","getLengthInBits","write","dataCount","putBit","totalCount","max","getBuffer","l","getErrorCorrectPolynomial","g","mod","p","getAt","w","addData","push","isDark","getModuleCount","make","getLostPoint","createTableTag","createSvgTag","arguments","cellSize","margin","alt","title","text","id","scalable","k","join","trim","createDataURL","createImgTag","charAt","createASCII","substring","renderTo2dContext","fillStyle","fillRect","stringToBytes","stringToBytesFuncs","default","charCodeAt","createStringToBytes","read","String","fromCharCode","L","Q","H","multiply","gexp","abs","glog","SJIS","writeByte","writeShort","writeBytes","writeString","toByteArray","toString","match","setPixel","add","flush","contains","indexOf","size","apply","151","Object","assign","prototype","hasOwnProperty","call","this","isArray","shift","keys","forEach","context","type","_context","_type","draw","_drawDot","_drawClassy","_drawClassyRounded","_drawRounded","_drawExtraRounded","_drawSquare","getNeighbor","_rotateFigure","rotation","translate","rotate","closePath","_basicDot","arc","PI","_basicSquare","rect","_basicSideRounded","lineTo","_basicCornerRounded","_basicCornerExtraRounded","_basicCornersRounded","_basicCornersExtraRounded","_basicExtraRounded","_canvas","document","createElement","width","height","_options","defineProperty","get","getContext","enumerable","configurable","getCanvas","clear","clearRect","drawQR","label","sent","trys","ops","next","throw","return","Symbol","iterator","TypeError","done","value","pop","min","hideXDots","hideYDots","_qr","image","loadImage","_image","imageOptions","qrOptions","imageSize","errorCorrectionLevel","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dotSize","sqrt","ceil","round","drawBackground","drawDots","hideBackgroundDots","drawCorners","drawImage","count","Promise","then","backgroundOptions","gradient","_createGradient","options","additionalRotation","colorStops","offset","color","addColorStop","dotsOptions","beginPath","strokeStyle","fill","P","D","I","cornersSquareOptions","z","B","A","q","R","cornersDotOptions","T","j","E","Image","crossOrigin","onload","src","createRadialGradient","tan","createLinearGradient","data","typeNumber","mode","Number","map","Boolean","update","_clearContainer","innerHTML","_container","test","_drawingPromise","append","appendChild","download","console","warn","name","extension","href","body","click","removeChild","toDataURL","__esModule"],"mappings":"0EAA+MA,KAA9IC,EAAOC,QAA8J,MAAM,IAAIC,EAAE,CAACC,IAAI,CAACD,EAAEE,KAAK,IAAIC,EAAEC,EAAEC,EAAE,WAAW,IAAIL,EAAE,SAASA,EAAEE,GAAG,IAAIC,EAAEH,EAAEI,EAAEE,EAAEJ,GAAGG,EAAE,KAAKE,EAAE,EAAEC,EAAE,KAAKC,EAAE,GAAGC,EAAE,GAAGC,EAAE,SAASX,EAAEE,GAAGG,EAAE,SAASL,GAAG,IAAI,IAAIE,EAAE,IAAIU,MAAMZ,GAAGG,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,CAACD,EAAEC,GAAG,IAAIS,MAAMZ,GAAG,IAAI,IAAII,EAAE,EAAEA,EAAEJ,EAAEI,GAAG,EAAEF,EAAEC,GAAGC,GAAG,KAAK,OAAOF,EAA5G,CAA+GK,EAAE,EAAEJ,EAAE,IAAIU,EAAE,EAAE,GAAGA,EAAEN,EAAE,EAAE,GAAGM,EAAE,EAAEN,EAAE,GAAGO,IAAIC,IAAIC,EAAEhB,EAAEE,GAAGC,GAAG,GAAGc,EAAEjB,GAAG,MAAMQ,IAAIA,EAAEU,EAAEf,EAAEC,EAAEK,IAAIU,EAAEX,EAAEN,IAAIW,EAAE,SAASb,EAAEE,GAAG,IAAI,IAAIC,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAE,KAAKH,EAAEG,IAAI,GAAGI,GAAGP,EAAEG,GAAG,IAAI,IAAIC,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAEF,EAAEE,IAAI,GAAGG,GAAGL,EAAEE,IAAIC,EAAEL,EAAEG,GAAGD,EAAEE,GAAG,GAAGD,GAAGA,GAAG,IAAI,GAAGC,GAAG,GAAGA,IAAI,GAAGA,GAAGA,GAAG,IAAI,GAAGD,GAAG,GAAGA,IAAI,GAAGA,GAAGA,GAAG,GAAG,GAAGC,GAAGA,GAAG,IAAIW,EAAE,WAAW,IAAI,IAAIf,EAAE,EAAEA,EAAEO,EAAE,EAAEP,GAAG,EAAE,MAAMK,EAAEL,GAAG,KAAKK,EAAEL,GAAG,GAAGA,EAAE,GAAG,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAEK,EAAE,EAAEL,GAAG,EAAE,MAAMG,EAAE,GAAGH,KAAKG,EAAE,GAAGH,GAAGA,EAAE,GAAG,IAAIY,EAAE,WAAW,IAAI,IAAId,EAAEoB,EAAEC,mBAAmBlB,GAAGD,EAAE,EAAEA,EAAEF,EAAEsB,OAAOpB,GAAG,EAAE,IAAI,IAAIE,EAAE,EAAEA,EAAEJ,EAAEsB,OAAOlB,GAAG,EAAE,CAAC,IAAIG,EAAEP,EAAEE,GAAGI,EAAEN,EAAEI,GAAG,GAAG,MAAMC,EAAEE,GAAGD,GAAG,IAAI,IAAIE,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAE,IAAI,IAAIe,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAElB,EAAEE,EAAEC,GAAGF,EAAEiB,IAAI,GAAGf,GAAG,GAAGA,IAAI,GAAGe,GAAG,GAAGA,GAAG,GAAGf,GAAG,GAAGe,IAAIN,EAAE,SAASjB,GAAG,IAAI,IAAIE,EAAEkB,EAAEI,iBAAiBrB,GAAGC,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAE,CAAC,IAAIE,GAAGN,GAAG,IAAIE,GAAGE,EAAE,GAAGC,EAAEoB,KAAKC,MAAMtB,EAAE,IAAIA,EAAE,EAAEG,EAAE,EAAE,GAAGD,EAAE,IAAIF,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAEE,GAAGN,GAAG,IAAIE,GAAGE,EAAE,GAAGC,EAAED,EAAE,EAAEG,EAAE,EAAE,GAAGkB,KAAKC,MAAMtB,EAAE,IAAIE,GAAGU,EAAE,SAAShB,EAAEE,GAAG,IAAI,IAAIC,EAAEC,GAAG,EAAEF,EAAEI,EAAEc,EAAEO,eAAexB,GAAGK,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAE,CAAC,IAAIe,GAAGvB,GAAG,IAAIM,GAAGE,EAAE,GAAGA,EAAE,EAAEH,EAAEG,GAAG,GAAGe,EAAEf,EAAE,EAAEH,EAAEG,EAAE,GAAG,GAAGe,EAAElB,EAAEE,EAAE,GAAGC,GAAG,GAAGe,EAAE,IAAIf,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAEe,GAAGvB,GAAG,IAAIM,GAAGE,EAAE,GAAGA,EAAE,EAAEH,EAAE,GAAGE,EAAEC,EAAE,GAAGe,EAAEf,EAAE,EAAEH,EAAE,GAAG,GAAGG,EAAE,EAAE,GAAGe,EAAElB,EAAE,GAAG,GAAGG,EAAE,GAAGe,EAAElB,EAAEE,EAAE,GAAG,IAAIP,GAAGmB,EAAE,SAASnB,EAAEE,GAAG,IAAI,IAAIC,GAAG,EAAEC,EAAEG,EAAE,EAAED,EAAE,EAAEE,EAAE,EAAEe,EAAEH,EAAEQ,gBAAgB1B,GAAG2B,EAAEtB,EAAE,EAAEsB,EAAE,EAAEA,GAAG,EAAE,IAAI,GAAGA,IAAIA,GAAG,KAAK,CAAC,IAAI,IAAIC,EAAE,EAAEA,EAAE,EAAEA,GAAG,EAAE,GAAG,MAAMzB,EAAED,GAAGyB,EAAEC,GAAG,CAAC,IAAIC,GAAE,EAAGvB,EAAER,EAAEsB,SAASS,EAAE,IAAI/B,EAAEQ,KAAKF,EAAE,IAAIiB,EAAEnB,EAAEyB,EAAEC,KAAKC,GAAGA,GAAG1B,EAAED,GAAGyB,EAAEC,GAAGC,GAAG,IAAIzB,GAAG,KAAKE,GAAG,EAAEF,EAAE,GAAG,IAAIF,GAAGD,GAAG,GAAGI,GAAGH,EAAE,CAACA,GAAGD,EAAEA,GAAGA,EAAE,SAASe,EAAE,SAASlB,EAAEE,EAAEC,GAAG,IAAI,IAAIC,EAAEyB,EAAEG,YAAYhC,EAAEE,GAAGG,EAAEyB,IAAIvB,EAAE,EAAEA,EAAEJ,EAAEmB,OAAOf,GAAG,EAAE,CAAC,IAAID,EAAEH,EAAEI,GAAGF,EAAE4B,IAAI3B,EAAE4B,UAAU,GAAG7B,EAAE4B,IAAI3B,EAAE6B,YAAYf,EAAEgB,gBAAgB9B,EAAE4B,UAAUlC,IAAIM,EAAE+B,MAAMhC,GAAG,IAAIG,EAAE,EAAE,IAAID,EAAE,EAAEA,EAAEH,EAAEkB,OAAOf,GAAG,EAAEC,GAAGJ,EAAEG,GAAG+B,UAAU,GAAGjC,EAAE+B,kBAAkB,EAAE5B,EAAE,KAAK,0BAA0BH,EAAE+B,kBAAkB,IAAI,EAAE5B,EAAE,IAAI,IAAIH,EAAE+B,kBAAkB,GAAG,EAAE5B,GAAGH,EAAE4B,IAAI,EAAE,GAAG5B,EAAE+B,kBAAkB,GAAG,GAAG/B,EAAEkC,QAAO,GAAI,OAAOlC,EAAE+B,mBAAmB,EAAE5B,IAAIH,EAAE4B,IAAI,IAAI,GAAG5B,EAAE+B,mBAAmB,EAAE5B,KAAKH,EAAE4B,IAAI,GAAG,GAAG,OAAO,SAASjC,EAAEE,GAAG,IAAI,IAAIC,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEE,EAAE,IAAIK,MAAMV,EAAEoB,QAAQhB,EAAE,IAAIM,MAAMV,EAAEoB,QAAQd,EAAE,EAAEA,EAAEN,EAAEoB,OAAOd,GAAG,EAAE,CAAC,IAAIqB,EAAE3B,EAAEM,GAAG8B,UAAUR,EAAE5B,EAAEM,GAAGgC,WAAWX,EAAEzB,EAAEqB,KAAKgB,IAAIrC,EAAEyB,GAAGxB,EAAEoB,KAAKgB,IAAIpC,EAAEyB,GAAGvB,EAAEC,GAAG,IAAII,MAAMiB,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAExB,EAAEC,GAAGc,OAAOS,GAAG,EAAExB,EAAEC,GAAGuB,GAAG,IAAI/B,EAAE0C,YAAYX,EAAE5B,GAAGA,GAAG0B,EAAE,IAAIc,EAAEvB,EAAEwB,0BAA0Bd,GAAGe,EAAEtB,EAAEhB,EAAEC,GAAGmC,EAAER,YAAY,GAAGW,IAAIH,GAAG,IAAIrC,EAAEE,GAAG,IAAII,MAAM+B,EAAER,YAAY,GAAGJ,EAAE,EAAEA,EAAEzB,EAAEE,GAAGc,OAAOS,GAAG,EAAE,CAAC,IAAIgB,EAAEhB,EAAEc,EAAEV,YAAY7B,EAAEE,GAAGc,OAAOhB,EAAEE,GAAGuB,GAAGgB,GAAG,EAAEF,EAAEG,MAAMD,GAAG,GAAG,IAAItC,EAAE,EAAE,IAAIsB,EAAE,EAAEA,EAAE7B,EAAEoB,OAAOS,GAAG,EAAEtB,GAAGP,EAAE6B,GAAGS,WAAW,IAAI9B,EAAE,IAAIE,MAAMH,GAAGwC,EAAE,EAAE,IAAIlB,EAAE,EAAEA,EAAE3B,EAAE2B,GAAG,EAAE,IAAIvB,EAAE,EAAEA,EAAEN,EAAEoB,OAAOd,GAAG,EAAEuB,EAAExB,EAAEC,GAAGc,SAASZ,EAAEuC,GAAG1C,EAAEC,GAAGuB,GAAGkB,GAAG,GAAG,IAAIlB,EAAE,EAAEA,EAAE1B,EAAE0B,GAAG,EAAE,IAAIvB,EAAE,EAAEA,EAAEN,EAAEoB,OAAOd,GAAG,EAAEuB,EAAEzB,EAAEE,GAAGc,SAASZ,EAAEuC,GAAG3C,EAAEE,GAAGuB,GAAGkB,GAAG,GAAG,OAAOvC,EAAzqB,CAA4qBL,EAAED,IAAIM,EAAEwC,QAAQ,SAASlD,EAAEE,GAAG,IAAIC,EAAE,KAAK,OAAOD,EAAEA,GAAG,QAAQ,IAAI,UAAUC,EAAE4B,EAAE/B,GAAG,MAAM,IAAI,eAAeG,EAAEwC,EAAE3C,GAAG,MAAM,IAAI,OAAOG,EAAE0C,EAAE7C,GAAG,MAAM,IAAI,QAAQG,EAAE4C,EAAE/C,GAAG,MAAM,QAAQ,KAAK,QAAQE,EAAEO,EAAE0C,KAAKhD,GAAGK,EAAE,MAAME,EAAE0C,OAAO,SAASpD,EAAEE,GAAG,GAAGF,EAAE,GAAGO,GAAGP,GAAGE,EAAE,GAAGK,GAAGL,EAAE,MAAMF,EAAE,IAAIE,EAAE,OAAOG,EAAEL,GAAGE,IAAIQ,EAAE2C,eAAe,WAAW,OAAO9C,GAAGG,EAAE4C,KAAK,WAAW,GAAGnD,EAAE,EAAE,CAAC,IAAI,IAAIH,EAAE,EAAEA,EAAE,GAAGA,IAAI,CAAC,IAAI,IAAIE,EAAE2B,EAAEG,YAAYhC,EAAEI,GAAGC,EAAEyB,IAAIvB,EAAE,EAAEA,EAAEE,EAAEa,OAAOf,IAAI,CAAC,IAAID,EAAEG,EAAEF,GAAGF,EAAE4B,IAAI3B,EAAE4B,UAAU,GAAG7B,EAAE4B,IAAI3B,EAAE6B,YAAYf,EAAEgB,gBAAgB9B,EAAE4B,UAAUlC,IAAIM,EAAE+B,MAAMhC,GAAG,IAAIG,EAAE,EAAE,IAAID,EAAE,EAAEA,EAAEL,EAAEoB,OAAOf,IAAIC,GAAGN,EAAEK,GAAG+B,UAAU,GAAGjC,EAAE+B,mBAAmB,EAAE5B,EAAE,MAAML,EAAEH,EAAEW,GAAE,EAAG,WAAW,IAAI,IAAIX,EAAE,EAAEE,EAAE,EAAEC,EAAE,EAAEA,EAAE,EAAEA,GAAG,EAAE,CAACQ,GAAE,EAAGR,GAAG,IAAIC,EAAEgB,EAAEmC,aAAa7C,IAAI,GAAGP,GAAGH,EAAEI,KAAKJ,EAAEI,EAAEF,EAAEC,GAAG,OAAOD,EAAvG,KAA8GQ,EAAE8C,eAAe,SAASxD,EAAEE,GAAGF,EAAEA,GAAG,EAAE,IAAIG,EAAE,GAAGA,GAAG,iBAAiBA,GAAG,0CAA0CA,GAAG,8BAA8BA,GAAG,2BAA2BD,OAAE,IAASA,EAAE,EAAEF,EAAEE,GAAG,MAAMC,GAAG,KAAKA,GAAG,UAAU,IAAI,IAAIC,EAAE,EAAEA,EAAEM,EAAE2C,iBAAiBjD,GAAG,EAAE,CAACD,GAAG,OAAO,IAAI,IAAIE,EAAE,EAAEA,EAAEK,EAAE2C,iBAAiBhD,GAAG,EAAEF,GAAG,cAAcA,GAAG,0CAA0CA,GAAG,8BAA8BA,GAAG,8BAA8BA,GAAG,WAAWH,EAAE,MAAMG,GAAG,YAAYH,EAAE,MAAMG,GAAG,sBAAsBA,GAAGO,EAAE0C,OAAOhD,EAAEC,GAAG,UAAU,UAAUF,GAAG,IAAIA,GAAG,MAAMA,GAAG,QAAQ,OAAOA,GAAG,YAAY,YAAYO,EAAE+C,aAAa,SAASzD,EAAEE,EAAEC,EAAEC,GAAG,IAAIC,EAAE,GAAG,iBAAiBqD,UAAU,KAAK1D,GAAGK,EAAEqD,UAAU,IAAIC,SAASzD,EAAEG,EAAEuD,OAAOzD,EAAEE,EAAEwD,IAAIzD,EAAEC,EAAEyD,OAAO9D,EAAEA,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,GAAGC,EAAE,iBAAiBA,EAAE,CAAC4D,KAAK5D,GAAGA,GAAG,IAAI4D,KAAK5D,EAAE4D,MAAM,KAAK5D,EAAE6D,GAAG7D,EAAE4D,KAAK5D,EAAE6D,IAAI,qBAAqB,MAAM5D,EAAE,iBAAiBA,EAAE,CAAC2D,KAAK3D,GAAGA,GAAG,IAAI2D,KAAK3D,EAAE2D,MAAM,KAAK3D,EAAE4D,GAAG5D,EAAE2D,KAAK3D,EAAE4D,IAAI,eAAe,KAAK,IAAIzD,EAAED,EAAEc,EAAEZ,EAAEe,EAAEb,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAE2B,EAAE,GAAG,IAAIrB,EAAE,IAAIR,EAAE,QAAQA,EAAE,KAAKA,EAAE,SAASA,EAAE,KAAK6B,GAAG,wDAAwDA,GAAGxB,EAAE4D,SAAS,GAAG,WAAW1C,EAAE,eAAeA,EAAE,MAAMM,GAAG,iBAAiBN,EAAE,IAAIA,EAAE,KAAKM,GAAG,uCAAuCA,GAAGzB,EAAE2D,MAAM5D,EAAE4D,KAAK,gCAAgCG,EAAE,CAAC9D,EAAE4D,GAAG7D,EAAE6D,IAAIG,KAAK,KAAKC,QAAQ,IAAI,GAAGvC,GAAG,IAAIA,GAAGzB,EAAE2D,KAAK,cAAcG,EAAE9D,EAAE4D,IAAI,KAAKE,EAAE9D,EAAE2D,MAAM,WAAW,GAAGlC,GAAG1B,EAAE4D,KAAK,oBAAoBG,EAAE/D,EAAE6D,IAAI,KAAKE,EAAE/D,EAAE4D,MAAM,iBAAiB,GAAGlC,GAAG,gEAAgEA,GAAG,YAAYvB,EAAE,EAAEA,EAAEI,EAAE2C,iBAAiB/C,GAAG,EAAE,IAAIc,EAAEd,EAAEN,EAAEE,EAAEK,EAAE,EAAEA,EAAEG,EAAE2C,iBAAiB9C,GAAG,EAAEG,EAAE0C,OAAO9C,EAAEC,KAAKsB,GAAG,KAAKtB,EAAEP,EAAEE,GAAG,IAAIkB,EAAEZ,GAAG,OAAOqB,GAAG,yCAAyC,UAAUnB,EAAE2D,cAAc,SAASrE,EAAEE,GAAGF,EAAEA,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,EAAE,IAAIC,EAAEO,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAEE,EAAEF,EAAEG,EAAEF,EAAED,EAAE,OAAO+C,EAAE9C,EAAEA,GAAE,SAAUD,EAAEC,GAAG,GAAGC,GAAGF,GAAGA,EAAEG,GAAGD,GAAGD,GAAGA,EAAEE,EAAE,CAAC,IAAIE,EAAEkB,KAAKC,OAAOxB,EAAEE,GAAGJ,GAAGM,EAAEmB,KAAKC,OAAOvB,EAAEC,GAAGJ,GAAG,OAAOU,EAAE0C,OAAO9C,EAAEC,GAAG,EAAE,EAAE,OAAO,MAAMG,EAAE4D,aAAa,SAAStE,EAAEE,EAAEC,GAAGH,EAAEA,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,EAAE,IAAIE,EAAEM,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAEG,EAAE,GAAG,OAAOA,GAAG,OAAOA,GAAG,SAASA,GAAGK,EAAE2D,cAAcrE,EAAEE,GAAGG,GAAG,IAAIA,GAAG,WAAWA,GAAGD,EAAEC,GAAG,IAAIA,GAAG,YAAYA,GAAGD,EAAEC,GAAG,IAAIF,IAAIE,GAAG,SAASA,GAAG6D,EAAE/D,GAAGE,GAAG,KAAKA,EAAE,MAAM,IAAI6D,EAAE,SAASlE,GAAG,IAAI,IAAIE,EAAE,GAAGC,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,GAAG,EAAE,CAAC,IAAIC,EAAEJ,EAAEuE,OAAOpE,GAAG,OAAOC,GAAG,IAAI,IAAIF,GAAG,OAAO,MAAM,IAAI,IAAIA,GAAG,OAAO,MAAM,IAAI,IAAIA,GAAG,QAAQ,MAAM,IAAI,IAAIA,GAAG,SAAS,MAAM,QAAQA,GAAGE,GAAG,OAAOF,GAAG,OAAOQ,EAAE8D,YAAY,SAASxE,EAAEE,GAAG,IAAIF,EAAEA,GAAG,GAAG,EAAE,OAAO,SAASA,GAAGA,OAAE,IAASA,EAAE,EAAEA,EAAE,IAAIE,EAAEC,EAAEC,EAAEC,EAAEE,EAAED,EAAE,EAAEI,EAAE2C,iBAAiB,EAAErD,EAAEoB,EAAEpB,EAAEQ,EAAEF,EAAEN,EAAEuB,EAAE,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAKM,EAAE,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAKC,EAAE,GAAG,IAAI5B,EAAE,EAAEA,EAAEI,EAAEJ,GAAG,EAAE,CAAC,IAAIE,EAAEqB,KAAKC,OAAOxB,EAAEkB,GAAG,GAAGf,EAAEoB,KAAKC,OAAOxB,EAAE,EAAEkB,GAAG,GAAGjB,EAAE,EAAEA,EAAEG,EAAEH,GAAG,EAAEI,EAAE,IAAIa,GAAGjB,GAAGA,EAAEK,GAAGY,GAAGlB,GAAGA,EAAEM,GAAGE,EAAE0C,OAAOhD,EAAEqB,KAAKC,OAAOvB,EAAEiB,GAAG,MAAMb,EAAE,KAAKa,GAAGjB,GAAGA,EAAEK,GAAGY,GAAGlB,EAAE,GAAGA,EAAE,EAAEM,GAAGE,EAAE0C,OAAO/C,EAAEoB,KAAKC,OAAOvB,EAAEiB,GAAG,IAAIb,GAAG,IAAIA,GAAG,IAAIuB,GAAG9B,EAAE,GAAGE,EAAE,GAAGM,EAAEqB,EAAEtB,GAAGgB,EAAEhB,GAAGuB,GAAG,KAAK,OAAOxB,EAAE,GAAGN,EAAE,EAAE8B,EAAE2C,UAAU,EAAE3C,EAAER,OAAOhB,EAAE,GAAGM,MAAMN,EAAE,GAAG6D,KAAK,KAAKrC,EAAE2C,UAAU,EAAE3C,EAAER,OAAO,GAA5f,CAAggBpB,GAAGF,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,EAAE,IAAIC,EAAEC,EAAEC,EAAEE,EAAED,EAAEI,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAEkB,EAAElB,EAAEM,EAAEF,EAAEJ,EAAEqB,EAAEX,MAAMZ,EAAE,GAAGmE,KAAK,MAAMtC,EAAEjB,MAAMZ,EAAE,GAAGmE,KAAK,MAAMrC,EAAE,GAAGC,EAAE,GAAG,IAAI5B,EAAE,EAAEA,EAAEG,EAAEH,GAAG,EAAE,CAAC,IAAIE,EAAEoB,KAAKC,OAAOvB,EAAEiB,GAAGpB,GAAG+B,EAAE,GAAG3B,EAAE,EAAEA,EAAEE,EAAEF,GAAG,EAAEG,EAAE,EAAEa,GAAGhB,GAAGA,EAAEI,GAAGY,GAAGjB,GAAGA,EAAEK,GAAGE,EAAE0C,OAAO/C,EAAEoB,KAAKC,OAAOtB,EAAEgB,GAAGpB,MAAMO,EAAE,GAAGwB,GAAGxB,EAAEgB,EAAEM,EAAE,IAAIxB,EAAE,EAAEA,EAAEL,EAAEK,GAAG,EAAEyB,GAAGC,EAAE,KAAK,OAAOD,EAAE2C,UAAU,EAAE3C,EAAER,OAAO,IAAIZ,EAAEgE,kBAAkB,SAAS1E,EAAEE,GAAGA,EAAEA,GAAG,EAAE,IAAI,IAAIC,EAAEO,EAAE2C,iBAAiBjD,EAAE,EAAEA,EAAED,EAAEC,IAAI,IAAI,IAAIC,EAAE,EAAEA,EAAEF,EAAEE,IAAIL,EAAE2E,UAAUjE,EAAE0C,OAAOhD,EAAEC,GAAG,QAAQ,QAAQL,EAAE4E,SAASxE,EAAEF,EAAEG,EAAEH,EAAEA,EAAEA,IAAIQ,GAAGV,EAAE6E,eAAe7E,EAAE8E,mBAAmB,CAACC,QAAQ,SAAS/E,GAAG,IAAI,IAAIE,EAAE,GAAGC,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,GAAG,EAAE,CAAC,IAAIC,EAAEJ,EAAEgF,WAAW7E,GAAGD,EAAEiD,KAAK,IAAI/C,GAAG,OAAOF,KAAK6E,QAAQ/E,EAAEiF,oBAAoB,SAASjF,EAAEE,GAAG,IAAIC,EAAE,WAAW,IAAI,IAAIA,EAAEO,EAAEV,GAAGI,EAAE,WAAW,IAAIJ,EAAEG,EAAE+E,OAAO,IAAI,GAAGlF,EAAE,KAAK,MAAM,OAAOA,GAAGK,EAAE,EAAEE,EAAE,KAAK,CAAC,IAAID,EAAEH,EAAE+E,OAAO,IAAI,GAAG5E,EAAE,MAAM,IAAIc,EAAEhB,IAAII,EAAEJ,KAAK,EAAEA,IAAIG,EAAE4E,OAAOC,aAAa9E,GAAG,EAAEc,IAAIZ,EAAEH,GAAG,EAAE,GAAGA,GAAGH,EAAE,MAAMG,EAAE,OAAOH,EAAE,OAAOK,EAA3N,GAAgOH,EAAE,IAAI4E,WAAW,GAAG,OAAO,SAAShF,GAAG,IAAI,IAAIE,EAAE,GAAGG,EAAE,EAAEA,EAAEL,EAAEsB,OAAOjB,GAAG,EAAE,CAAC,IAAIE,EAAEP,EAAEgF,WAAW3E,GAAG,GAAGE,EAAE,IAAIL,EAAEiD,KAAK5C,OAAO,CAAC,IAAID,EAAEH,EAAEH,EAAEuE,OAAOlE,IAAI,iBAAiBC,GAAG,IAAIA,IAAIA,EAAEJ,EAAEiD,KAAK7C,IAAIJ,EAAEiD,KAAK7C,IAAI,GAAGJ,EAAEiD,KAAK,IAAI7C,IAAIJ,EAAEiD,KAAK/C,IAAI,OAAOF,IAAI,IAAIA,EAAEC,EAAEC,EAAEC,EAAEE,EAAED,EAAE,CAAC+E,EAAE,EAAEpE,EAAE,EAAEqE,EAAE,EAAEC,EAAE,GAAGnE,GAAGlB,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,MAAMC,EAAE,KAAKC,EAAE,KAAKG,EAAE,SAASP,GAAG,IAAI,IAAIE,EAAE,EAAE,GAAGF,GAAGE,GAAG,EAAEF,KAAK,EAAE,OAAOE,IAAIG,EAAE,IAAIsB,eAAe,SAAS3B,GAAG,IAAI,IAAIE,EAAEF,GAAG,GAAGO,EAAEL,GAAGK,EAAEJ,IAAI,GAAGD,GAAGC,GAAGI,EAAEL,GAAGK,EAAEJ,GAAG,OAAO,OAAOH,GAAG,GAAGE,IAAIG,EAAEmB,iBAAiB,SAASxB,GAAG,IAAI,IAAIE,EAAEF,GAAG,GAAGO,EAAEL,GAAGK,EAAEH,IAAI,GAAGF,GAAGE,GAAGG,EAAEL,GAAGK,EAAEH,GAAG,OAAOJ,GAAG,GAAGE,GAAGG,EAAEgB,mBAAmB,SAASrB,GAAG,OAAOE,EAAEF,EAAE,IAAIK,EAAEuB,gBAAgB,SAAS5B,GAAG,OAAOA,GAAG,KAAK,EAAE,OAAO,SAASA,EAAEE,GAAG,OAAOF,EAAEE,GAAG,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASA,EAAEE,GAAG,OAAOA,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,GAAG,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOuB,KAAKC,MAAM1B,EAAE,GAAGyB,KAAKC,MAAMxB,EAAE,IAAI,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,EAAE,EAAEF,EAAEE,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,EAAE,EAAEF,EAAEE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,EAAE,GAAGF,EAAEE,GAAG,GAAG,GAAG,GAAG,QAAQ,KAAK,mBAAmBF,IAAIK,EAAEuC,0BAA0B,SAAS5C,GAAG,IAAI,IAAIE,EAAEqB,EAAE,CAAC,GAAG,GAAGpB,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAED,EAAEA,EAAEsF,SAASjE,EAAE,CAAC,EAAEf,EAAEiF,KAAKtF,IAAI,IAAI,OAAOD,GAAGG,EAAE+B,gBAAgB,SAASpC,EAAEE,GAAG,GAAG,GAAGA,GAAGA,EAAE,GAAG,OAAOF,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQA,OAAO,GAAGE,EAAE,GAAG,OAAOF,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,QAAQ,KAAK,QAAQA,MAAM,CAAC,KAAKE,EAAE,IAAI,KAAK,QAAQA,EAAE,OAAOF,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,QAAQ,KAAK,QAAQA,KAAKK,EAAEkD,aAAa,SAASvD,GAAG,IAAI,IAAIE,EAAEF,EAAEqD,iBAAiBlD,EAAE,EAAEC,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAE,IAAI,IAAIC,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,CAAC,IAAI,IAAIE,EAAE,EAAED,EAAEN,EAAEoD,OAAOhD,EAAEC,GAAGe,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAE,KAAKhB,EAAEgB,EAAE,GAAGlB,GAAGE,EAAEgB,GAAG,IAAI,IAAIZ,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAEH,EAAEG,EAAE,GAAGN,GAAGG,EAAEG,GAAG,GAAGY,GAAG,GAAGZ,GAAGF,GAAGN,EAAEoD,OAAOhD,EAAEgB,EAAEf,EAAEG,KAAKD,GAAG,GAAGA,EAAE,IAAIJ,GAAG,EAAEI,EAAE,GAAG,IAAIH,EAAE,EAAEA,EAAEF,EAAE,EAAEE,GAAG,EAAE,IAAIC,EAAE,EAAEA,EAAEH,EAAE,EAAEG,GAAG,EAAE,CAAC,IAAIkB,EAAE,EAAEvB,EAAEoD,OAAOhD,EAAEC,KAAKkB,GAAG,GAAGvB,EAAEoD,OAAOhD,EAAE,EAAEC,KAAKkB,GAAG,GAAGvB,EAAEoD,OAAOhD,EAAEC,EAAE,KAAKkB,GAAG,GAAGvB,EAAEoD,OAAOhD,EAAE,EAAEC,EAAE,KAAKkB,GAAG,GAAG,GAAGA,GAAG,GAAGA,IAAIpB,GAAG,GAAG,IAAIC,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAE,IAAIC,EAAE,EAAEA,EAAEH,EAAE,EAAEG,GAAG,EAAEL,EAAEoD,OAAOhD,EAAEC,KAAKL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,KAAKL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,KAAKF,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEF,EAAE,EAAEE,GAAG,EAAEJ,EAAEoD,OAAOhD,EAAEC,KAAKL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,KAAKL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,KAAKF,GAAG,IAAI,IAAI0B,EAAE,EAAE,IAAIxB,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAEJ,EAAEoD,OAAOhD,EAAEC,KAAKwB,GAAG,GAAG,OAAO1B,EAAEsB,KAAKiE,IAAI,IAAI7D,EAAE3B,EAAEA,EAAE,IAAI,EAAE,IAAIG,GAAGG,EAAE,WAAW,IAAI,IAAIR,EAAE,IAAIY,MAAM,KAAKV,EAAE,IAAIU,MAAM,KAAKT,EAAE,EAAEA,EAAE,EAAEA,GAAG,EAAEH,EAAEG,GAAG,GAAGA,EAAE,IAAIA,EAAE,EAAEA,EAAE,IAAIA,GAAG,EAAEH,EAAEG,GAAGH,EAAEG,EAAE,GAAGH,EAAEG,EAAE,GAAGH,EAAEG,EAAE,GAAGH,EAAEG,EAAE,GAAG,IAAIA,EAAE,EAAEA,EAAE,IAAIA,GAAG,EAAED,EAAEF,EAAEG,IAAIA,EAAE,MAAM,CAACwF,KAAK,SAAS3F,GAAG,GAAGA,EAAE,EAAE,KAAK,QAAQA,EAAE,IAAI,OAAOE,EAAEF,IAAIyF,KAAK,SAASvF,GAAG,KAAKA,EAAE,GAAGA,GAAG,IAAI,KAAKA,GAAG,KAAKA,GAAG,IAAI,OAAOF,EAAEE,KAA3R,GAAmS,SAASqB,EAAEvB,EAAEE,GAAG,QAAG,IAASF,EAAEsB,OAAO,MAAMtB,EAAEsB,OAAO,IAAIpB,EAAE,IAAIC,EAAE,WAAW,IAAI,IAAIA,EAAE,EAAEA,EAAEH,EAAEsB,QAAQ,GAAGtB,EAAEG,IAAIA,GAAG,EAAE,IAAI,IAAIC,EAAE,IAAIQ,MAAMZ,EAAEsB,OAAOnB,EAAED,GAAGG,EAAE,EAAEA,EAAEL,EAAEsB,OAAOnB,EAAEE,GAAG,EAAED,EAAEC,GAAGL,EAAEK,EAAEF,GAAG,OAAOC,EAA5H,GAAiIA,EAAE,CAAC4C,MAAM,SAAShD,GAAG,OAAOG,EAAEH,IAAImC,UAAU,WAAW,OAAOhC,EAAEmB,QAAQkE,SAAS,SAASxF,GAAG,IAAI,IAAIE,EAAE,IAAIU,MAAMR,EAAE+B,YAAYnC,EAAEmC,YAAY,GAAGhC,EAAE,EAAEA,EAAEC,EAAE+B,YAAYhC,GAAG,EAAE,IAAI,IAAIE,EAAE,EAAEA,EAAEL,EAAEmC,YAAY9B,GAAG,EAAEH,EAAEC,EAAEE,IAAIG,EAAEiF,KAAKjF,EAAEmF,KAAKvF,EAAE4C,MAAM7C,IAAIK,EAAEmF,KAAK3F,EAAEgD,MAAM3C,KAAK,OAAOkB,EAAErB,EAAE,IAAI4C,IAAI,SAAS9C,GAAG,GAAGI,EAAE+B,YAAYnC,EAAEmC,YAAY,EAAE,OAAO/B,EAAE,IAAI,IAAIF,EAAEM,EAAEmF,KAAKvF,EAAE4C,MAAM,IAAIxC,EAAEmF,KAAK3F,EAAEgD,MAAM,IAAI7C,EAAE,IAAIS,MAAMR,EAAE+B,aAAa9B,EAAE,EAAEA,EAAED,EAAE+B,YAAY9B,GAAG,EAAEF,EAAEE,GAAGD,EAAE4C,MAAM3C,GAAG,IAAIA,EAAE,EAAEA,EAAEL,EAAEmC,YAAY9B,GAAG,EAAEF,EAAEE,IAAIG,EAAEiF,KAAKjF,EAAEmF,KAAK3F,EAAEgD,MAAM3C,IAAIH,GAAG,OAAOqB,EAAEpB,EAAE,GAAG2C,IAAI9C,KAAK,OAAOI,EAAE,IAAIyB,EAAE,WAAW,IAAI7B,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,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","file":"npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js","sourcesContent":["!function(t,r){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=r():\"function\"==typeof define&&define.amd?define([],r):\"object\"==typeof exports?exports.QRCodeStyling=r():t.QRCodeStyling=r()}(self,(function(){return(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&M(t),null==u&&(u=C(e,n,v)),O(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},O=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},C=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw\"code length overflow. (\"+o.getLengthInBits()+\">\"+8*u+\")\";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e=\"\";e+='',e+=\"\";for(var n=0;n\";for(var o=0;o';e+=\"\"}return(e+=\"\")+\"
\"},y.createSvgTag=function(t,r,e,n){var o={};\"object\"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e=\"string\"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||\"qrcode-description\":null,(n=\"string\"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||\"qrcode-title\":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h=\"\";for(u=\"l\"+t+\",0 0,\"+t+\" -\"+t+\",0 0,-\"+t+\"z \",h+='\",h+=n.text?''+k(n.text)+\"\":\"\",h+=e.text?''+k(e.text)+\"\":\"\",h+='',h+='')+\"\"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r\"};var k=function(t){for(var r=\"\",e=0;e\":r+=\">\";break;case\"&\":r+=\"&\";break;case'\"':r+=\""\";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={\"██\":\"█\",\"█ \":\"▀\",\" █\":\"▄\",\" \":\" \"},h={\"██\":\"▀\",\"█ \":\"▀\",\" █\":\" \",\" \":\" \"},f=\"\";for(r=0;r=u?h[i]:c[i];f+=\"\\n\"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join(\"▀\"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join(\"██\"),h=Array(t+1).join(\" \"),f=\"\",d=\"\";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+\"/\"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=\",\"),r+=t[e];return r+\"]\"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw\"unexpected end of file./\"+o}var t=r.charAt(e);if(e+=1,\"=\"==t)return o=0,-1;t.match(/^\\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw\"c:\"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString(\"GIF87a\"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(\",\"),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(\";\")}},a=function(t){for(var r=1<>>r!=0)throw\"length over\";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n=\"function\"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{\"use strict\";e.d(r,{default:()=>O});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(r){var e;r.done?t(r.value):(e=r.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}u((o=o.apply(r,e||[])).next())}));var r,e,n,o},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw\"QR code is not defined\";var e=this.context;if(!e)throw\"QR code is not defined\";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw\"The canvas is too small.\";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?\"continue\":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):\"continue\"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:\"\",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:\"Q\"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:\"square\",color:\"#000\"},backgroundOptions:{color:\"#fff\"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var M=e(192),S=e.n(M);const O=function(){function t(t){this._options=t?m(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML=\"\")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?m(a(this._options,r)):this._options,this._options.data&&(this._qr=S()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return\"Numeric\";case/^[0-9A-Z $%*+\\-./:]*$/.test(t):return\"Alphanumeric\";default:return\"Byte\"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if(\"function\"!=typeof t.appendChild)throw\"Container should be a single DOM node\";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e=\"png\",n=\"qr\";\"string\"==typeof t?(e=t,console.warn(\"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\")):\"object\"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement(\"a\");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL(\"image/\"+e),n+\".\"+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}));\n//# sourceMappingURL=qr-code-styling.js.map"],"sourceRoot":""} \ No newline at end of file diff --git a/public/report.html b/public/report.html index d0c52ef2..f776bc84 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [25 Mar 2022 at 12:56] + tweb [25 Mar 2022 at 17:06] \ No newline at end of file diff --git a/public/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js b/public/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js new file mode 100644 index 00000000..a24b6941 --- /dev/null +++ b/public/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js @@ -0,0 +1,2 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t),r.d(t,"RLottieItem",(function(){return l}));var n="undefined"!=typeof window?window:self;const i=navigator?navigator.userAgent:null,o=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&n.MSStream,!!("safari"in n)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))));navigator.userAgent.toLowerCase().indexOf("firefox"),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);let a;if(o)try{a=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){a=!1}else a=!0;var s=a;function d(e){return function(e,t){return new Promise(r=>{const n=new FileReader;n.addEventListener("loadend",e=>{r(e.target.result)}),n[t](e)})}(e,"readAsText")}const u=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]];let c=e=>Math.round(255*Math.min(Math.max(e,0),1));function f(e,t){const r=u[Math.max(t-1,0)],n=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,n=c(t[2])|c(t[1])<<8|c(t[0])<<16,i=r.find(e=>e[0]===n);i&&(t[0]=(i[1]>>16&255)/255,t[1]=(i[1]>>8&255)/255,t[2]=(255&i[1])/255)})(e)}e.hasOwnProperty("it")&&i(e.it)},i=e=>{for(const t of e)n(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?i(e.it):n(e)}catch(r){console.warn("cant apply replacements",r,e,t)}}importScripts("rlottie-wasm.js");const h=self.Module;class l{constructor(e,t,r){this.reqId=e,this.width=t,this.height=r}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=m.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=m.Api.loadFromData(this.handle,this.stringOnWasmHeap),m.Api.resize(this.handle,this.width,this.height),g("loaded",this.reqId,this.frameCount,this.fps)}catch(e){console.error("init RLottieItem error:",e),g("error",this.reqId,e)}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{try{if("number"==typeof i&&i>=1&&i<=5){const e=JSON.parse(t);f(e,i),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),r=+(null==e?void 0:e[1])||60;o.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),g("error",e,r)}})},destroy:function(e){const t=p[e];t&&(t.destroy(),delete p[e])},renderFrame:function(e,t,r){p[e].render(t,r)}};function g(...e){if(arguments.length<1)throw new TypeError("reply - not enough arguments");if(e=Array.prototype.slice.call(arguments,1),s){const t=[];for(let r=0;r 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","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\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\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337],\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f],\n ]\n];\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\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 CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\r\nimport readBlobAsText from \"../../helpers/blob/readBlobAsText\";\r\nimport applyReplacements from \"./applyReplacements\";\r\n\r\nimportScripts('rlottie-wasm.js');\r\n//import Module, { allocate, intArrayFromString } from './rlottie-wasm';\r\n\r\nconst _Module = (self as any).Module as any;\r\n\r\nconst DEFAULT_FPS = 60;\r\n\r\ntype LottieHandlePointer = number;\r\n\r\n// throw new Error('test');\r\n\r\nexport class RLottieItem {\r\n private stringOnWasmHeap: number;\r\n private handle: LottieHandlePointer;\r\n private frameCount: number;\r\n private fps: number;\r\n\r\n private dead: boolean;\r\n //private context: OffscreenCanvasRenderingContext2D;\r\n\r\n constructor(\r\n private reqId: number, \r\n private width: number, \r\n private height: number/* , \r\n private canvas: OffscreenCanvas */\r\n ) {\r\n\r\n }\r\n\r\n public init(json: string, fps: number) {\r\n if(this.dead) {\r\n return;\r\n }\r\n\r\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\r\n\r\n //this.context = canvas.getContext('2d');\r\n /* let frame = 0;\r\n setInterval(() => {\r\n if(frame >= this.frameCount) frame = 0;\r\n let _frame = frame++;\r\n this.render(_frame, null);\r\n }, 1000 / this.fps); */\r\n\r\n try {\r\n this.handle = worker.Api.init();\r\n \r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\r\n \r\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\r\n \r\n worker.Api.resize(this.handle, this.width, this.height);\r\n\r\n reply('loaded', this.reqId, this.frameCount, this.fps);\r\n } catch(e) {\r\n console.error('init RLottieItem error:', e);\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\r\n if(this.dead || this.handle === undefined) return;\r\n //return;\r\n \r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n \r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n \r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n \r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n \r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n //this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n \r\n reply('frame', this.reqId, frameNo, clamped);\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n if(this.handle !== undefined) {\r\n worker.Api.destroy(this.handle);\r\n }\r\n }\r\n}\r\n\r\nclass RLottieWorker {\r\n public Api: {\r\n init: () => LottieHandlePointer,\r\n destroy: (handle: LottieHandlePointer) => void,\r\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\r\n buffer: (handle: LottieHandlePointer) => number,\r\n render: (handle: LottieHandlePointer, frameNo: number) => void,\r\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\r\n } = {} as any;\r\n\r\n public initApi() {\r\n this.Api = {\r\n init: _Module.cwrap('lottie_init', '', []),\r\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\r\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\r\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\r\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\r\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\r\n };\r\n }\r\n\r\n public init() {\r\n this.initApi();\r\n reply('ready');\r\n }\r\n}\r\n\r\nconst worker = new RLottieWorker();\r\n\r\n_Module.onRuntimeInitialized = function() {\r\n worker.init();\r\n};\r\n\r\nconst items: {[reqId: string]: RLottieItem} = {};\r\nconst queryableFunctions = {\r\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number/* , canvas: OffscreenCanvas */) {\r\n const item = items[reqId] = new RLottieItem(reqId, width, height/* , canvas */);\r\n readBlobAsText(blob).then((json) => {\r\n try {\r\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(json);\r\n applyReplacements(newAnimationData, toneIndex);\r\n json = JSON.stringify(newAnimationData);\r\n }\r\n\r\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\r\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\r\n throw new Error('Invalid file');\r\n } */\r\n\r\n /* let perf = performance.now();\r\n let json = JSON.parse(jsString);\r\n console.log('sticker decode:', performance.now() - perf); */\r\n\r\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\r\n const frameRate = +match?.[1] || DEFAULT_FPS;\r\n\r\n //console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\r\n\r\n item.init(json, frameRate);\r\n } catch(err) {\r\n console.error('Invalid file for sticker:', json);\r\n reply('error', reqId, err);\r\n }\r\n });\r\n },\r\n destroy: function(reqId: number) {\r\n const item = items[reqId];\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.destroy();\r\n delete items[reqId];\r\n },\r\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\r\n //console.log('worker renderFrame', reqId, frameNo, clamped);\r\n items[reqId].render(frameNo, clamped);\r\n }\r\n};\r\n\r\nfunction reply(...args: any[]) {\r\n if(arguments.length < 1) { \r\n throw new TypeError('reply - not enough arguments'); \r\n }\r\n\r\n //if(arguments[0] === 'frame') return;\r\n\r\n args = Array.prototype.slice.call(arguments, 1);\r\n\r\n if(!CAN_USE_TRANSFERABLES) {\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args});\r\n } else {\r\n const transfer: ArrayBuffer[] = [];\r\n for(let i = 0; i < args.length; ++i) {\r\n if(args[i] instanceof ArrayBuffer) {\r\n transfer.push(args[i]);\r\n }\r\n \r\n if(args[i].buffer && args[i].buffer instanceof ArrayBuffer) {\r\n transfer.push(args[i].buffer);\r\n }\r\n }\r\n\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args}, transfer);\r\n }\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\r\n};\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/rlottie.worker.dfa26d04325d4bc271d8.bundle.worker.js b/public/rlottie.worker.dfa26d04325d4bc271d8.bundle.worker.js deleted file mode 100644 index 79e315fd..00000000 --- a/public/rlottie.worker.dfa26d04325d4bc271d8.bundle.worker.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";const e="undefined"!=typeof window?window:self,t=navigator?navigator.userAgent:null,r=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&e.MSStream,!!("safari"in e)||!(!t||!(/\b(iPad|iPhone|iPod)\b/.test(t)||t.match("Safari")&&!t.match("Chrome"))));let i;if(navigator.userAgent.toLowerCase().indexOf("firefox"),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),r)try{i=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){i=!1}else i=!0;const n=i;const o=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]];let a=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const s=self.Module;class h{constructor(e,t,r){this.reqId=e,this.width=t,this.height=r}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=d.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=d.Api.loadFromData(this.handle,this.stringOnWasmHeap),d.Api.resize(this.handle,this.width,this.height),u("loaded",this.reqId,this.frameCount,this.fps)}catch(e){console.error("init RLottieItem error:",e),u("error",this.reqId,e)}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{const r=new FileReader;r.addEventListener("loadend",(e=>{t(e.target.result)})),r.readAsText(e)}))}(e)})(t).then((t=>{try{if("number"==typeof n&&n>=1&&n<=5){const e=JSON.parse(t);(function(e,t){const r=o[Math.max(t-1,0)],i=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,i=a(t[2])|a(t[1])<<8|a(t[0])<<16,n=r.find((e=>e[0]===i));n&&(t[0]=(n[1]>>16&255)/255,t[1]=(n[1]>>8&255)/255,t[2]=(255&n[1])/255)})(e)}e.hasOwnProperty("it")&&n(e.it)},n=e=>{for(const t of e)i(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?n(e.it):i(e)}catch(r){console.warn("cant apply replacements",r,e,t)}})(e,n),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),r=+(null==e?void 0:e[1])||60;s.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),u("error",e,r)}}))},destroy:function(e){const t=c[e];t&&(t.destroy(),delete c[e])},renderFrame:function(e,t,r){c[e].render(t,r)}};function u(...e){if(arguments.length<1)throw new TypeError("reply - not enough arguments");if(e=Array.prototype.slice.call(arguments,1),n){const t=[];for(let r=0;r 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","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\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\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337],\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f],\n ]\n];\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\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 CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\r\nimport readBlobAsText from \"../../helpers/blob/readBlobAsText\";\r\nimport applyReplacements from \"./applyReplacements\";\r\n\r\nimportScripts('rlottie-wasm.js');\r\n//import Module, { allocate, intArrayFromString } from './rlottie-wasm';\r\n\r\nconst _Module = (self as any).Module as any;\r\n\r\nconst DEFAULT_FPS = 60;\r\n\r\ntype LottieHandlePointer = number;\r\n\r\n// throw new Error('test');\r\n\r\nexport class RLottieItem {\r\n private stringOnWasmHeap: number;\r\n private handle: LottieHandlePointer;\r\n private frameCount: number;\r\n private fps: number;\r\n\r\n private dead: boolean;\r\n //private context: OffscreenCanvasRenderingContext2D;\r\n\r\n constructor(\r\n private reqId: number, \r\n private width: number, \r\n private height: number/* , \r\n private canvas: OffscreenCanvas */\r\n ) {\r\n\r\n }\r\n\r\n public init(json: string, fps: number) {\r\n if(this.dead) {\r\n return;\r\n }\r\n\r\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\r\n\r\n //this.context = canvas.getContext('2d');\r\n /* let frame = 0;\r\n setInterval(() => {\r\n if(frame >= this.frameCount) frame = 0;\r\n let _frame = frame++;\r\n this.render(_frame, null);\r\n }, 1000 / this.fps); */\r\n\r\n try {\r\n this.handle = worker.Api.init();\r\n \r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\r\n \r\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\r\n \r\n worker.Api.resize(this.handle, this.width, this.height);\r\n\r\n reply('loaded', this.reqId, this.frameCount, this.fps);\r\n } catch(e) {\r\n console.error('init RLottieItem error:', e);\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\r\n if(this.dead || this.handle === undefined) return;\r\n //return;\r\n \r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n \r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n \r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n \r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n \r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n //this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n \r\n reply('frame', this.reqId, frameNo, clamped);\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n if(this.handle !== undefined) {\r\n worker.Api.destroy(this.handle);\r\n }\r\n }\r\n}\r\n\r\nclass RLottieWorker {\r\n public Api: {\r\n init: () => LottieHandlePointer,\r\n destroy: (handle: LottieHandlePointer) => void,\r\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\r\n buffer: (handle: LottieHandlePointer) => number,\r\n render: (handle: LottieHandlePointer, frameNo: number) => void,\r\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\r\n } = {} as any;\r\n\r\n public initApi() {\r\n this.Api = {\r\n init: _Module.cwrap('lottie_init', '', []),\r\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\r\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\r\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\r\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\r\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\r\n };\r\n }\r\n\r\n public init() {\r\n this.initApi();\r\n reply('ready');\r\n }\r\n}\r\n\r\nconst worker = new RLottieWorker();\r\n\r\n_Module.onRuntimeInitialized = function() {\r\n worker.init();\r\n};\r\n\r\nconst items: {[reqId: string]: RLottieItem} = {};\r\nconst queryableFunctions = {\r\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number/* , canvas: OffscreenCanvas */) {\r\n const item = items[reqId] = new RLottieItem(reqId, width, height/* , canvas */);\r\n readBlobAsText(blob).then((json) => {\r\n try {\r\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(json);\r\n applyReplacements(newAnimationData, toneIndex);\r\n json = JSON.stringify(newAnimationData);\r\n }\r\n\r\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\r\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\r\n throw new Error('Invalid file');\r\n } */\r\n\r\n /* let perf = performance.now();\r\n let json = JSON.parse(jsString);\r\n console.log('sticker decode:', performance.now() - perf); */\r\n\r\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\r\n const frameRate = +match?.[1] || DEFAULT_FPS;\r\n\r\n //console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\r\n\r\n item.init(json, frameRate);\r\n } catch(err) {\r\n console.error('Invalid file for sticker:', json);\r\n reply('error', reqId, err);\r\n }\r\n });\r\n },\r\n destroy: function(reqId: number) {\r\n const item = items[reqId];\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.destroy();\r\n delete items[reqId];\r\n },\r\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\r\n //console.log('worker renderFrame', reqId, frameNo, clamped);\r\n items[reqId].render(frameNo, clamped);\r\n }\r\n};\r\n\r\nfunction reply(...args: any[]) {\r\n if(arguments.length < 1) { \r\n throw new TypeError('reply - not enough arguments'); \r\n }\r\n\r\n //if(arguments[0] === 'frame') return;\r\n\r\n args = Array.prototype.slice.call(arguments, 1);\r\n\r\n if(!CAN_USE_TRANSFERABLES) {\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args});\r\n } else {\r\n const transfer: ArrayBuffer[] = [];\r\n for(let i = 0; i < args.length; ++i) {\r\n if(args[i] instanceof ArrayBuffer) {\r\n transfer.push(args[i]);\r\n }\r\n \r\n if(args[i].buffer && args[i].buffer instanceof ArrayBuffer) {\r\n transfer.push(args[i].buffer);\r\n }\r\n }\r\n\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args}, transfer);\r\n }\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","e","console","error","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","set","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","Promise","resolve","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","then","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","hasOwnProperty","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","arguments","length","TypeError","Array","prototype","slice","call","transfer","i","ArrayBuffer","push","postMessage","queryMethodListener","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/style-desktop.9d7b485ed526720a3aad.css b/public/style-desktop.9d7b485ed526720a3aad.css new file mode 100644 index 00000000..def9d3e0 --- /dev/null +++ b/public/style-desktop.9d7b485ed526720a3aad.css @@ -0,0 +1,2 @@ +@media only screen and (min-width: 721px){#auth-pages .tabs-container:before,#auth-pages .tabs-container:after{content:" ";position:absolute;width:100%;left:-100%;top:0;right:0;bottom:0;background:#fff;background:var(--surface-color);z-index:1}#auth-pages .tabs-container:after{left:100%}} +/*# sourceMappingURL=style-desktop.9d7b485ed526720a3aad.css.map*/ \ No newline at end of file diff --git a/public/style-desktop.9d7b485ed526720a3aad.css.map b/public/style-desktop.9d7b485ed526720a3aad.css.map new file mode 100644 index 00000000..44026869 --- /dev/null +++ b/public/style-desktop.9d7b485ed526720a3aad.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///style-desktop.9d7b485ed526720a3aad.css"],"names":[],"mappings":"AAAA,0CAA0C,qEAAqE,YAAY,kBAAkB,WAAW,WAAW,MAAM,QAAQ,SAAS,gBAAgB,gCAAgC,UAAU,kCAAkC","file":"style-desktop.9d7b485ed526720a3aad.css","sourcesContent":["@media only screen and (min-width: 721px){#auth-pages .tabs-container:before,#auth-pages .tabs-container:after{content:\" \";position:absolute;width:100%;left:-100%;top:0;right:0;bottom:0;background:#fff;background:var(--surface-color);z-index:1}#auth-pages .tabs-container:after{left:100%}}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/style-desktop.de205d0ae0e0c2493363.css b/public/style-desktop.de205d0ae0e0c2493363.css deleted file mode 100644 index 355df163..00000000 --- a/public/style-desktop.de205d0ae0e0c2493363.css +++ /dev/null @@ -1,2 +0,0 @@ -@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:#fff;background:var(--surface-color);bottom:0;content:" ";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}} -/*# sourceMappingURL=style-desktop.de205d0ae0e0c2493363.css.map*/ \ No newline at end of file diff --git a/public/style-desktop.de205d0ae0e0c2493363.css.map b/public/style-desktop.de205d0ae0e0c2493363.css.map deleted file mode 100644 index ed3e0cc6..00000000 --- a/public/style-desktop.de205d0ae0e0c2493363.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://tweb/style-desktop.de205d0ae0e0c2493363.css"],"names":[],"mappings":"AAAA,yCAAyC,qEAAqE,gBAAgB,gCAAgC,SAAS,YAAY,WAAW,kBAAkB,QAAQ,MAAM,WAAW,UAAU,kCAAkC","file":"style-desktop.de205d0ae0e0c2493363.css","sourcesContent":["@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:#fff;background:var(--surface-color);bottom:0;content:\" \";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.js b/public/sw.js index 3d4cd7b6..84eddef4 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,2 +1,4 @@ -(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};(()=>{if(void 0!==e){var t=e.u,n=e.e,o=new Map,r=new Map;e.u=function(e){return t(e)+(o.has(e)?"?"+o.get(e):"")},e.e=function(i){return n(i).catch((function(n){var s=r.has(i)?r.get(i):999999;if(s<1){var a=t(i);throw n.message="Loading chunk "+i+" failed after 999999 retries.\n("+a+")",n.request=a,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();o.set(i,n),r.set(i,s-1),t(e.e(i))}),3e3)}))}))}}})(),e.d({},{T:()=>ee,c:()=>Q});const t={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};t.http=location.search.indexOf("http=1")>0,t.http&&(t.transport="https");const n=t,o=n.debug,r=("undefined"!=typeof window?window:self,o),i="undefined"!=typeof window?window:self,s=navigator?navigator.userAgent:null,a=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&i.MSStream,!!("safari"in i)||!(!s||!(/\b(iPad|iPhone|iPod)\b/.test(s)||s.match("Safari")&&!s.match("Chrome")))),c=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=(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),"undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope),u="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!l,h=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),d=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{e.postMessage(...t)}))}))};var f;l&&d.bind(null,!1),l&&d.bind(null,!0),function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(f||(f={}));const g=[f.None,f.Error,f.Warn,f.Log,f.Debug],p=Date.now();function m(){return"["+((Date.now()-p)/1e3).toFixed(3)+"]"}let v;const w=a||c;v=w?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const y=!w,b=w?2:3;function P(){const e=(new Error).stack.split("\n"),t=e[b]||e[e.length-1];return"["+(v(t)||"")+"]"}const S="",A="",O=[["debug",f.Debug],["info",f.Log],["warn",f.Warn],["error",f.Error],["assert",f.Error],["trace",f.Log]];function T(e,t=f.Log|f.Warn|f.Error,n=!1,o=""){let i;r||n||(t=f.Error),y?o||(l?o=S:u&&(o=A)):o="";let s=o;o=o?`%s ${o}%s`:"%s";const a=function(...n){return t&f.Log&&console.log(o,m(),e,P(),...n)};return O.forEach((([n,r])=>{a[n]=function(...i){return t&r&&console[n](o,m(),e,P(),...i)}})),a.setPrefix=function(t){i=t,e="["+t+"]"},a.setPrefix(e),a.setLevel=function(e){t=g.slice(0,e+1).reduce(((e,t)=>e|t),0)},a.bindPrefix=function(e){return T(`${i}] [${e}`,t,n,s)},a}const E=self,_="cachedAssets";function x(e){return e.ok&&200===e.status}function k(e){return Promise.race([e,(1e4,new Promise((e=>{setTimeout(e,1e4)}))).then((()=>Promise.reject()))])}function D(e){return function(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsArrayBuffer(e)}))}(e)}(e).then((e=>new Uint8Array(e)))}function C(){}function j(e,t=""){let n;const o=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{n=new Blob(e,{type:o})}catch(t){let r=new BlobBuilder;e.forEach((e=>{r.append(e)})),n=r.getBlob(o)}return n}const F=new class{constructor(){this.blobSupported=!0;try{j([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?D(t).then((t=>e.write(t))):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>{return t=this,o=void 0,i=function*(){if(!this.blobSupported)throw!1;n.push(e)},new((r=void 0)||(r=Promise))((function(e,n){function s(e){try{c(i.next(e))}catch(e){n(e)}}function a(e){try{c(i.throw(e))}catch(e){n(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}c((i=i.apply(t,o||[])).next())}));var t,o,r,i},truncate:()=>{n.length=0},finalize:(o=!0)=>{const r=j(n,e);return o&&t&&t(r),r}}}};class R{constructor(e){this.dbName=e,this.useStorage=!0,n.test&&(this.dbName+="_test"),R.STORAGES.length&&(this.useStorage=R.STORAGES[0].useStorage),this.openDatabase(),R.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation((t=>t.delete("/"+e)))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation((t=>t.match("/"+e)))}save(e,t){return this.timeoutOperation((n=>n.put("/"+e,t)))}getFile(e,t="blob"){return this.get(e).then((e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=j(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,n)=>{return o=this,r=void 0,s=function*(){let o=!1;const r=setTimeout((()=>{n(),o=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=F.getFakeFileWriter(t,(t=>this.saveFile(e,t).catch((()=>t))));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map((t=>{if(t.useStorage=e,!e)return t.deleteAll()})))}}R.STORAGES=[];const N=new R("cachedStreamChunks"),L="Time-Cached";setInterval((()=>N.timeoutOperation((e=>e.keys().then((t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,i]of n){const n=e.match(i).then((n=>{if(+n.headers.get(L)+86400<=o)return Q("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{h().then((e=>{for(const[t,n]of ee)if(!e.find((e=>e.id===t))){for(const e in n)n[e].reject();ee.delete(t)}}))}),12e4);const W=new Map;class I{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{W.delete(this.id)},this.id=I.getId(e),W.set(this.id,this),this.limitPart=e.size>78643200?M:q,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;return(...l)=>(i||(i=new Promise(((e,t)=>(s=e,a=t)))),r?(clearTimeout(r),c=!0,a(),i=new Promise(((e,t)=>(s=e,a=t)))):n&&(s(e(...l)),c=!1),r=setTimeout((()=>{!o||n&&!c||s(e(...l)),r=i=s=a=void 0,c=!1}),t),i.catch((()=>{})),i)}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,s=function*(){const o={type:"requestFilePart",payload:[this.info.dcId,this.info.location,e,t]},r=JSON.stringify(o);o.id=r;const i=yield h().then((e=>{if(e.length)return e.find((e=>ee.has(e.id)))||e[0]}));if(!i)throw new Error("no window");let s=ee.get(i.id);s||ee.set(i.id,s={});let a=s[r];if(a)return a.then((e=>e.bytes));i.postMessage(o),this.loadedOffsets.add(e),a=s[r]=function(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}}));return t.catch(C).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})})),Object.assign(t,e),t}();const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return N.getFile(o).then((e=>n?new Uint8Array:D(e)),(e=>{}))}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then((o=>o||this.requestFilePartFromWorker(e,t,n)))}saveChunkToCache(e,t,n){return e.then((e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream",[L]:""+(Date.now()/1e3|0)}});return N.save(o,r)}))}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":`${e.byteLength}`};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})}))}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=W.get(this.getId(e)))&&void 0!==t?t:new I(e)}static getId(e){return e.location.id}}const q=524288,M=1048576;function B(e,t=2048){return e-e%t}class G{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),n.test&&(this.name+="_test"),this.storeName=t,this.log=T("IDB-"+this.storeName),this.openDatabase(!0),G.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let n=!1;return setTimeout((()=>{n||t.onerror({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,o)=>{t.onsuccess=r=>{n=!0;const i=t.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{n=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},t.onupgradeneeded=e=>{n=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach((e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var n;const o=e.createObjectStore(t.name);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const e of t.indexes)o.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)}))}}))}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"")}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,o)=>n.put(t[o],e)))),"")}saveFile(e,t){return t instanceof Blob||(t=j([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"")}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.openDatabase().then((i=>new Promise(((s,a)=>{const c=i.transaction([o],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),n&&this.log(n+": end",performance.now()-r);const t=d.map((e=>e.result));s(h?t:t[0])};const l=setTimeout((()=>{this.log.error("transaction not finished",c)}),1e4),u=t(c.objectStore(o)),h=Array.isArray(u),d=h?u:[].concat(u)}))))}getAll(){return this.getObjectStore("readonly",(e=>e.getAll()),"")}}G.STORAGES=[];var U=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const $=self,z=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/",V=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new G(e,t)}get(e){return U(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){return U(this,void 0,void 0,(function*(){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",{push_mute_until:0,push_last_alive:0,push_lang:{},push_settings:{}});$.addEventListener("push",(e=>{const t=e.data.json();Q("push",t);let n=!1;const o=Promise.all([V.get("push_mute_until"),V.get("push_last_alive"),$.clients.matchAll({type:"window"})]).then((e=>{const[o,r,i]=e;if(Q("matched clients",i),n=i.length>0,n)throw"Supress notification because some instance is alive";const s=Date.now();if(X()&&o&&s{Q(e)}));const r=o.then((()=>Promise.all([V.get("push_settings"),V.get("push_lang")]))).then((e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||""),e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview||"You have a new message",a="unknown_peer"),Q("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d||"Mute for 24H"}];return $.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then((e=>{var t;e&&e.notification&&(t=e.notification,K.has(t)||(K.add(t),t.onclose=Y))})).catch((e=>{Q.error("Show notification promise",e)}))}(t,e[0],e[1]))),i=r.catch((()=>(Q("Closing all notifications on push",n),X()||n?H():$.registration.showNotification("Telegram",{tag:"unknown_peer"}).then((()=>{if(n)return H();setTimeout((()=>H()),n?0:100)})).catch((e=>{Q.error("Show notification error",e)})))));e.waitUntil(i)})),$.addEventListener("notificationclick",(e=>{const t=e.notification;Q("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&X())return Q("[SW] mute for 1d"),void V.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=$.clients.matchAll({type:"window"}).then((e=>{o.action=n,J={type:"push_click",payload:o};for(let t=0;t$.clients.openWindow(e.baseUrl||z)))})).catch((e=>{Q.error("Clients.matchAll error",e)}));e.waitUntil(r)})),$.addEventListener("notificationclose",Y);let J,K=new Set;function Y(e){var t;t=e.notification,K.delete(t)}function H(){for(const e of K)try{e.close()}catch(e){}let e;return e="getNotifications"in $.registration?$.registration.getNotifications({}).then((e=>{for(let t=0,n=e.length;t{Q.error("Offline register SW error",e)})):Promise.resolve(),K.clear(),e}function X(){return c}const Q=T("SW",f.Error|f.Debug|f.Log|f.Warn),Z=self,ee=new Map,te={notifications_clear:()=>{H()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,o=e.payload;o.localNotifications&&V.set("push_last_alive",Date.now()),J&&n&&"postMessage"in n&&(n.postMessage(J,[]),J=void 0),o.lang&&V.set("push_lang",o.lang),o.settings&&V.set("push_settings",o.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,o=ee.get(n.id);if(!o)return;const r=o[e.id];r&&(e.error?r.reject(e.error):r.resolve(e.payload),delete o[e.id])},toggleStorage:e=>{R.toggleStorage(e.payload)}};Z.addEventListener("message",(e=>{const t=e.data,n=te[t.type];n&&n(t,e)}));const ne=e=>{if(0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return t=this,n=void 0,r=function*(){try{const t=yield k(E.caches.open(_)),n=yield k(t.match(e.request,{ignoreVary:!0}));if(n&&x(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(x(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),x(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[,t,n,o]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];"stream"===n&&function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=I.get(o);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),r.requestRange(n)]))}(e,o)}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},oe=()=>{Z.onfetch=ne};Z.addEventListener("install",(e=>{Q("installing"),e.waitUntil(Z.skipWaiting())})),Z.addEventListener("activate",(e=>{Q("activating",Z),e.waitUntil(Z.caches.delete(_)),e.waitUntil(Z.clients.claim())})),Z.onerror=e=>{Q.error("error:",e)},Z.onunhandledrejection=e=>{Q.error("onunhandledrejection:",e)},Z.onoffline=Z.ononline=oe,oe()})(); +var serviceWorkerOption = {"assets":["/0.2da18beaed4bd7796d8f.chunk.js","/1.bf7f14176d3c12040199.chunk.js","/12.baab8418093ca242b164.chunk.js","/13.2690683310eb11d72c46.chunk.js","/14.0a9c2a5a1b393dfdfb0d.chunk.js","/15.4ca01b561eb65470bbb6.chunk.js","/16.dd165468586f22f31041.chunk.js","/17.1e43fc20a20ae160385c.chunk.js","/18.29da8a83178db260ea59.chunk.js","/19.4321e94dcc79f8936402.chunk.js","/2.3d6b202e8d6ff37ebd0b.chunk.js","/20.e93df534d41d9a216086.chunk.js","/21.1bcdd871c6dfb97ca84a.chunk.js","/22.fa44c64744b789124685.chunk.js","/23.1965eeacf2722eb2a737.chunk.js","/24.4b9f00474f1f2b0d38ce.chunk.js","/25.dcbbd29bad085f151e64.chunk.js","/26.d44ef4011bb3c3f8b0f7.chunk.js","/27.05d6a53c8e06b785e86e.chunk.js","/28.6667bb68e660e626d453.chunk.js","/29.87d0b9d91aaae6885e5b.chunk.js","/3.793e215e3d9630206e52.chunk.js","/30.1eb7b53a0652ce7549e5.chunk.js","/31.3cf7864ede12445b3dd9.chunk.js","/4.2204f96c53d1827a35fa.chunk.js","/5.42c4ae7c503d2aa6aec3.chunk.js","/6.20c444db88e2e357fc97.chunk.js","/7.267799b59034d0b41841.chunk.js","/8.25c7f3643f3336533b03.chunk.js","/9.7cf29a12b879c9755465.chunk.js","/main.4728214565ef548f208f.bundle.js","/main.b88862fa9966cf0e5abe.css","/mtproto.worker.b18e2703b7b89f161924.bundle.worker.js","/npm.qr-code-styling.5f80533c958a2f3a94bb.chunk.js","/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js","/style-desktop.9d7b485ed526720a3aad.css","/webp.worker.c0cc94110cda650246b2.bundle.worker.js"]}; + + !function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return ie})),n.d(t,"deferredPromises",(function(){return ae}));const o={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};o.http=location.search.indexOf("http=1")>0,o.http&&(o.transport="https");var r=o;const i=r.debug;"undefined"!=typeof window?window:self;var s=i;var a="undefined"!=typeof window?window:self;const c=navigator?navigator.userAgent:null,l=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&a.MSStream,!!("safari"in a)||!(!c||!(/\b(iPad|iPhone|iPod)\b/.test(c)||c.match("Safari")&&!c.match("Chrome")))),u=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,h=(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),"undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope),d="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!h,f=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),g=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(n=>{n.length&&n.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},p=(...e)=>{self.postMessage(...e)},m=()=>{};h&&g.bind(null,!1),h&&g.bind(null,!0);var v;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(v||(v={}));const w=[v.None,v.Error,v.Warn,v.Log,v.Debug],y=Date.now();function b(){return"["+((Date.now()-y)/1e3).toFixed(3)+"]"}let P;const S=l||u;P=S?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const O=!S,A=S?2:3;function _(){const e=(new Error).stack.split("\n"),t=e[A]||e[e.length-1];return"["+(P(t)||"")+"]"}const T={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},x=[["debug",v.Debug],["info",v.Log],["warn",v.Warn],["error",v.Error],["assert",v.Error],["trace",v.Log]];function E(e,t=v.Log|v.Warn|v.Error,n=!1,o=""){let r;s||n||(t=v.Error),O?o||(h?o=T.yellow:d&&(o=T.cyan)):o="";let i=o;o=o?`%s ${o}%s`:"%s";const a=function(...n){return t&v.Log&&console.log(o,b(),e,_(),...n)};return x.forEach(([n,r])=>{a[n]=function(...i){return t&r&&console[n](o,b(),e,_(),...i)}}),a.setPrefix=function(t){r=t,e="["+t+"]"},a.setPrefix(e),a.setLevel=function(e){t=w.slice(0,e+1).reduce((e,t)=>e|t,0)},a.bindPrefix=function(e){return E(`${r}] [${e}`,t,n,i)},a}var j=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const k=self;function C(e){return e.ok&&200===e.status}function D(e){return Promise.race([e,(t=1e4,new Promise(e=>{setTimeout(e,t)})).then(()=>Promise.reject())]);var t}function F(e){return function(e,t){return new Promise(n=>{const o=new FileReader;o.addEventListener("loadend",e=>{n(e.target.result)}),o[t](e)})}(e,"readAsArrayBuffer")}function R(e){return F(e).then(e=>new Uint8Array(e))}function N(){}function L(e,t=""){let n;const o=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{n=new Blob(e,{type:o})}catch(t){let r=new BlobBuilder;e.forEach(e=>{r.append(e)}),n=r.getBlob(o)}return n}var M=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};var W=new class{constructor(){this.blobSupported=!0;try{L([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?R(t).then(t=>e.write(t)):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>M(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(e)})),truncate:()=>{n.length=0},finalize:(o=!0)=>{const r=L(n,e);return o&&t&&t(r),r}}}},I=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};class q{constructor(e){this.dbName=e,this.useStorage=!0,r.test&&(this.dbName+="_test"),q.STORAGES.length&&(this.useStorage=q.STORAGES[0].useStorage),this.openDatabase(),q.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=L(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,n)=>I(this,void 0,void 0,(function*(){let o=!1;const r=setTimeout(()=>{n(),o=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=W.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}q.STORAGES=[];var B=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const G=new q("cachedStreamChunks");setInterval(()=>G.timeoutOperation(e=>e.keys().then(t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,i]of n){const n=e.match(i).then(n=>{if(+n.headers.get("Time-Cached")+86400<=o)return ie("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})});r.push(n)}return Promise.all(r)})),18e5),setInterval(()=>{f().then(e=>{for(const[t,n]of ae)if(!e.find(e=>e.id===t)){for(const e in n){n[e].reject()}ae.delete(t)}})},12e4);const U=new Map;class ${constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{U.delete(this.id)},this.id=$.getId(e),U.set(this.id,this),this.limitPart=e.size>78643200?V:z,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;return(...l)=>(i||(i=new Promise((e,t)=>(s=e,a=t))),r?(clearTimeout(r),c=!0,a(),i=new Promise((e,t)=>(s=e,a=t))):n&&(s(e(...l)),c=!1),r=setTimeout(()=>{!o||n&&!c||s(e(...l)),r=i=s=a=void 0,c=!1},t),i.catch(()=>{}),i)}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return B(this,void 0,void 0,(function*(){const o={type:"requestFilePart",payload:[this.info.dcId,this.info.location,e,t]},r=JSON.stringify(o);o.id=r;const i=yield f().then(e=>{if(e.length)return e.find(e=>ae.has(e.id))||e[0]});if(!i)throw new Error("no window");let s=ae.get(i.id);s||ae.set(i.id,s={});let a=s[r];if(a)return a.then(e=>e.bytes);i.postMessage(o),this.loadedOffsets.add(e),a=s[r]=function(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}});return t.catch(N).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}();const c=a.then(e=>e.bytes);return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c}))}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return G.getFile(o).then(e=>n?new Uint8Array:R(e),e=>{})}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then(o=>o||this.requestFilePartFromWorker(e,t,n))}saveChunkToCache(e,t,n){return e.then(e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream","Time-Cached":""+(Date.now()/1e3|0)}});return G.save(o,r)})}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":""+e.byteLength};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})})}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=U.get(this.getId(e)))&&void 0!==t?t:new $(e)}static getId(e){return e.location.id}}const z=524288,V=1048576;function J(e,t=2048){return e-e%t}var K={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]};class Y{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),r.test&&(this.name+="_test"),this.storeName=t,this.log=E("IDB-"+this.storeName),this.openDatabase(!0),Y.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let n=!1;return setTimeout(()=>{n||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,o)=>{t.onsuccess=r=>{n=!0;const i=t.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{n=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},t.onupgradeneeded=e=>{n=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var n;const o=e.createObjectStore(t.name);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const e of t.indexes)o.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",n=>e.map((e,o)=>n.put(t[o],e)),"")}saveFile(e,t){return t instanceof Blob||(t=L([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.openDatabase().then(i=>new Promise((s,a)=>{const c=i.transaction([o],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),n&&this.log(n+": end",performance.now()-r);const t=d.map(e=>e.result);s(h?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",c)},1e4),u=t(c.objectStore(o)),h=Array.isArray(u),d=h?u:[].concat(u)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}Y.STORAGES=[];var H=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const X=self,Q=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/";const Z=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new Y(e,t)}get(e){return H(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){return H(this,void 0,void 0,(function*(){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}))}}(K,"session",{push_mute_until:0,push_last_alive:0,push_lang:{},push_settings:{}});X.addEventListener("push",e=>{const t=e.data.json();ie("push",t);let n=!1;const o=Promise.all([Z.get("push_mute_until"),Z.get("push_last_alive"),X.clients.matchAll({type:"window"})]).then(e=>{const[o,r,i]=e;if(ie("matched clients",i),n=i.length>0,n)throw"Supress notification because some instance is alive";const s=Date.now();if(re()&&o&&s{ie(e)});const r=o.then(()=>Promise.all([Z.get("push_settings"),Z.get("push_lang")])).then(e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||"");e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview||"You have a new message",a="unknown_peer");ie("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d||"Mute for 24H"}];return X.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then(e=>{var t;e&&e.notification&&(t=e.notification,te.has(t)||(te.add(t),t.onclose=ne))}).catch(e=>{ie.error("Show notification promise",e)})}(t,e[0],e[1])).catch(()=>(ie("Closing all notifications on push",n),re()||n?oe():X.registration.showNotification("Telegram",{tag:"unknown_peer"}).then(()=>{if(n)return oe();setTimeout(()=>oe(),n?0:100)}).catch(e=>{ie.error("Show notification error",e)})));e.waitUntil(r)}),X.addEventListener("notificationclick",e=>{const t=e.notification;ie("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&re())return ie("[SW] mute for 1d"),void Z.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=X.clients.matchAll({type:"window"}).then(e=>{o.action=n,ee={type:"push_click",payload:o};for(let t=0;tX.clients.openWindow(e.baseUrl||Q))}).catch(e=>{ie.error("Clients.matchAll error",e)});e.waitUntil(r)}),X.addEventListener("notificationclose",ne);let ee,te=new Set;function ne(e){var t;t=e.notification,te.delete(t)}function oe(){for(const e of te)try{e.close()}catch(e){}let e;return e="getNotifications"in X.registration?X.registration.getNotifications({}).then(e=>{for(let t=0,n=e.length;t{ie.error("Offline register SW error",e)}):Promise.resolve(),te.clear(),e}function re(){return u}const ie=E("SW",v.Error|v.Debug|v.Log|v.Warn),se=self,ae=new Map,ce={notifications_clear:()=>{oe()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,o=e.payload;o.localNotifications&&Z.set("push_last_alive",Date.now()),ee&&n&&"postMessage"in n&&(n.postMessage(ee,[]),ee=void 0),o.lang&&Z.set("push_lang",o.lang),o.settings&&Z.set("push_settings",o.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,o=ae.get(n.id);if(!o)return;const r=o[e.id];r&&(e.error?r.reject(e.error):r.resolve(e.payload),delete o[e.id])},toggleStorage:e=>{q.toggleStorage(e.payload)}};se.addEventListener("message",e=>{const t=e.data,n=ce[t.type];n&&n(t,e)});const le=e=>{if(0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return j(this,void 0,void 0,(function*(){try{const t=yield D(k.caches.open("cachedAssets")),n=yield D(t.match(e.request,{ignoreVary:!0}));if(n&&C(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(C(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),C(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}}))}(e));try{const[,t,n,o]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];switch(n){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=$.get(o);var i;e.respondWith(Promise.race([(i=45e3,new Promise(e=>{setTimeout(()=>{e(new Response("",{status:408,statusText:"Request timed out."}))},i)})),r.requestRange(n)]))}(e,o)}}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},ue=()=>{se.onfetch=le};se.addEventListener("install",e=>{ie("installing"),e.waitUntil(se.skipWaiting())}),se.addEventListener("activate",e=>{ie("activating",se),e.waitUntil(se.caches.delete("cachedAssets")),e.waitUntil(se.clients.claim())}),se.onerror=e=>{ie.error("error:",e)},se.onunhandledrejection=e=>{ie.error("onunhandledrejection:",e)},se.onoffline=se.ononline=ue,ue()}]); //# sourceMappingURL=sw.js.map \ No newline at end of file diff --git a/public/sw.js.map b/public/sw.js.map index b301a0bc..d206b837 100644 --- a/public/sw.js.map +++ b/public/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","mappings":"mBACA,IAAIA,EAAsB,CCA1BA,EAAwB,CAACC,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXF,EAAoBI,EAAEF,EAAYC,KAASH,EAAoBI,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3EH,EAAwB,CAACS,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,ICAlF,MACE,QAAmC,IAAxBV,EAAqC,CAC9C,IAAIc,EAAed,EAAoBe,EACnCC,EAAgBhB,EAAoBiB,EACpCC,EAAW,IAAIC,IACfC,EAAW,IAAID,IACnBnB,EAAoBe,EAAI,SAAUM,GAEhC,OADaP,EAAaO,IAEdH,EAASI,IAAID,GAAW,IAAMH,EAASV,IAAIa,GAAW,KAGpErB,EAAoBiB,EAAI,SAAUI,GAEhC,OADaL,EAAcK,GACbE,OAAM,SAAUC,GAC5B,IAAIC,EAAUL,EAASE,IAAID,GAAWD,EAASZ,IAAIa,GAAW,OAC9D,GAAII,EAAU,EAAG,CACf,IAAIC,EAAUZ,EAAaO,GAQ3B,MAPAG,EAAMG,QACJ,iBACAN,EACA,mCACAK,EACA,IACFF,EAAMI,QAAUF,EACVF,EAER,OAAO,IAAIK,SAAQ,SAAUC,GAC3BC,YAAW,WACT,IAEIC,EACKC,KAAKC,MAGdhB,EAASiB,IAAId,EAASW,GACtBZ,EAASe,IAAId,EAASI,EAAU,GAChCK,EAAQ9B,EAAoBiB,EAAEI,MAC7B,cAtCb,G,2BCaA,MAAMe,EAAQ,CACZC,KAAMC,SAASC,OAAOC,QAAQ,UAAY,EAC1CC,MAAOH,SAASC,OAAOC,QAAQ,WAAa,EAC5CE,MAAM,EACNC,KAAK,EACLC,qBAAqB,EACrBC,iBAAiB,EACjBC,UAAW,aAIbV,EAAMM,KAAOJ,SAASC,OAAOC,QAAQ,UAAY,EAO9CJ,EAAMM,OACPN,EAAMU,UAAY,SAOpB,UC/BaC,EAAiD,QAG9D,GAFoC,oBAAb,OAA2BC,OAASC,KAE3D,GCTA,EAF+B,oBAAb,OAA2BD,OAASC,KCQzCC,EAAaC,UAAYA,UAAUC,UAAY,KAU/CC,GATWF,UAAUC,UAAUb,OAAO,yBACzBY,UAAUC,UAAUE,cAAcd,QAAQ,WACzC,SAASH,KAAKc,UAAUC,YAAc,aAAaf,KAAKc,UAAUI,SAG7D,mBAAmBlB,KAAKc,UAAUK,WACxC,aAAvBL,UAAUK,UAA2BL,UAAUM,eAAiB,IAC/D,cAEwB,WAAY,OAAWP,KAAe,yBAAyBb,KAAKa,IAAkBA,EAAWQ,MAAM,YAAcR,EAAWQ,MAAM,aACrJC,EAAaR,UAAUC,UAAUE,cAAcd,QAAQ,YAAc,ECZrEoB,GDgBwDT,UAAUM,eAAiB,GAAKN,UAAUC,UAAUb,OAAO,kHChB3D,oBAA7BsB,0BAA4CZ,gBAAgBY,0BACvFC,EAA6C,oBAAtBC,mBAAqCd,gBAAgBc,oBAAsBH,EAGlGI,EAAmB,IACtBf,KACPgB,QACAC,SAAS,CAAEC,qBAAqB,EAAOC,KAAM,WAG1CC,EAAsB,CAACC,KAAiBC,KAC3CtB,KACAgB,QACAC,SAAS,CAAEC,qBAAqB,EAAOC,KAAM,WAC7CI,MAAMC,IACDA,EAAUC,QAKdD,EAAUE,MAAML,EAAM,GAAK,GAAGM,SAAQC,IAEpCA,EAASC,eAAeP,UCnB9B,IAAYQ,ED+BiBnB,GAAoBS,EAAoBW,KAAK,MAAM,GACvDpB,GAAoBS,EAAoBW,KAAK,MAAM,GChC5E,SAAYD,GACV,mBACA,qBACA,mBACA,iBACA,qBALF,CAAYA,IAAAA,EAAQ,KAQb,MAAME,EAAa,CAACF,EAASG,KAAMH,EAASI,MAAOJ,EAASK,KAAML,EAASM,IAAKN,EAASO,OAE1FC,EAAYtD,KAAKC,MACvB,SAASsD,IACP,MAAO,MAAQvD,KAAKC,MAAQqD,GAAa,KAAME,QAAQ,GAAK,IAG9D,IAAIC,EAEJ,MAAMC,EAAYtC,GAAaM,EAG7B+B,EADCC,EACgCC,GACdA,EAAKC,MAAM,KACZ,GAGeD,IAC/B,MAAME,EAAWF,EAAKG,OAAOF,MAAM,KACnC,GAAuB,IAApBC,EAASpB,OACV,OAAOoB,EAAS,GAAGnB,MAAMmB,EAAS,GAAGE,YAAY,KAAO,IAK9D,MAAMC,GAAoBN,EACpBO,EAAaP,EAAY,EAAI,EAEnC,SAASQ,IACP,MACMC,GADQ,IAAIjB,OAAQkB,MACNR,MAAM,MACpBD,EAAOQ,EAAMF,IAAeE,EAAMA,EAAM1B,OAAS,GAIvD,MAAO,KADQgB,EAA8BE,IAAS,eAChC,IAGjB,MAAMU,EAaD,QAbCA,EAgBH,QA8BJC,EAAgG,CACpG,CAAC,QAASxB,EAASO,OACnB,CAAC,OAAQP,EAASM,KAClB,CAAC,OAAQN,EAASK,MAClB,CAAC,QAASL,EAASI,OACnB,CAAC,SAAUJ,EAASI,OACpB,CAAC,QAASJ,EAASM,MAId,SAASmB,EAAOC,EAAgBrC,EAAiBW,EAASM,IAAMN,EAASK,KAAOL,EAASI,MAAOuB,GAAmB,EAAOC,EAAQ,IACvI,IAAIC,EACA,GAAUF,IACZtC,EAAOW,EAASI,OAGdc,EAEOU,IACN/C,EAAmB+C,EAAQL,EACtBxC,IAAe6C,EAAQL,IAH/BK,EAAQ,GAMV,IAAIE,EAAgBF,EACVA,EAAPA,EAAe,MAAMA,MACX,KAIb,MAAMG,EAAc,YAAYvC,GAC9B,OAAOH,EAAOW,EAASM,KAAO0B,QAAQD,IAAIH,EAAOnB,IAAMiB,EAAQN,OAA4B5B,IAwB7F,OArBAgC,EAAQ3B,SAAQ,EAAEoC,EAAQC,MACxBH,EAAIE,GAAU,YAAYzC,GACxB,OAAOH,EAAO6C,GAAWF,QAAQC,GAAQL,EAAOnB,IAAMiB,EAAQN,OAA4B5B,OAI9FuC,EAAII,UAAY,SAASC,GACvBP,EAAiBO,EACjBV,EAAS,IAAMU,EAAY,KAG7BL,EAAII,UAAUT,GAEdK,EAAIM,SAAW,SAASC,GACtBjD,EAAOa,EAAWN,MAAM,EAAG0C,EAAQ,GAAGC,QAAO,CAACC,EAAKC,IAAMD,EAAMC,GAAG,IAGpEV,EAAIW,WAAa,SAAShB,GACxB,OAAOD,EAAO,GAAGI,OAAoBH,IAAUrC,EAAMsC,EAAkBG,IAGlEC,ECpJT,MAAM,EAAM7D,KACCyE,EAAoB,eAEjC,SAASC,EAAkBC,GACzB,OAAOA,EAASC,IAA0B,MAApBD,EAASE,OAGjC,SAASC,EAAoCC,GAC3C,OAAOnG,QAAQoG,KAAK,CAClBD,GACM,IClB2B,IAAInG,SAAeC,IACtDC,WAAWD,EDiBH,SAAO0C,MAAK,IAAM3C,QAAQqG,aEVrB,SAASC,EAAqBC,GAC3C,OCDa,SAA+BA,GAC5C,OCGa,SAAoBA,EAAYpB,GAE7C,OAAO,IAAInF,SAAcC,IACvB,MAAMuG,EAAS,IAAIC,WACnBD,EAAOE,iBAAiB,WAAYtH,IAElCa,EAAQb,EAAEuH,OAAOC,WAEnBJ,EAAa,kBAAED,MDXVM,CAAWN,GDAXO,CAAsBP,GAAM5D,MAAKoE,GAAU,IAAIC,WAAWD,KGTpD,SAAS,KCaT,SAASE,EAAcC,EAAgBC,EAAmB,IACvE,IAAIZ,EACJ,MAAMa,ECHO,SAA0BD,GACvC,OAeyB,IAftB,CACD,aACA,YACA,YACA,gBACA,aACA,YACA,YACA,aACA,kBACA,YACA,aACA,YACA,mBACA,mBACAxG,QAAQwG,GACD,2BAGFA,EDjBcE,CAAiBF,GACtC,IACEZ,EAAO,IAAIe,KAAKJ,EAAW,CAAC3E,KAAM6E,IAClC,MAAMhI,GAEN,IAAImI,EAAK,IAAIC,YACbN,EAAUnE,SAAS0E,IACjBF,EAAGG,OAAOD,MAEZlB,EAAOgB,EAAGI,QAAQP,GAEpB,OAAOb,EEyCT,YArDO,MAGLqB,cAFQ,KAAAC,eAAgB,EAGtB,IACEZ,EAAc,GAAI,IAClB,MAAM7H,GACN0I,KAAKD,eAAgB,GAIlBE,cACL,OAAOD,KAAKD,cAGPG,MAAMC,EAA0DC,GACrE,OAAGA,aAAiBZ,KACXhB,EAAqB4B,GAAOvF,MAAKwF,GAC/BF,EAAWD,MAAMG,KAGnBF,EAAWD,MAAME,GAIrBE,kBAAkBjB,EAAkBkB,GACzC,MAAMnB,EAAwC,GAuB9C,MAtBuB,CACrBc,MAAaM,IAA8B,O,EAAA,K,OAAA,E,EAAA,YACzC,IAAIR,KAAKD,cACP,MAAM,EAGRX,EAAUqB,KAAKD,I,YAL0B,K,+QAO3CE,SAAU,KACRtB,EAAUrE,OAAS,GAErB4F,SAAU,CAACC,GAAgB,KACzB,MAAMnC,EAAOU,EAAcC,EAAWC,GAMtC,OAJGuB,GAAiBL,GAClBA,EAAiB9B,GAGZA,MC7CA,MAAMoC,EAQnBf,YAAoBgB,GAAA,KAAAA,OAAAA,EAJZ,KAAAC,YAAa,EAKhB,SACDf,KAAKc,QAAU,SAGdD,EAAuBG,SAASjG,SACjCiF,KAAKe,WAAaF,EAAuBG,SAAS,GAAGD,YAGvDf,KAAKiB,eACLJ,EAAuBG,SAASP,KAAKT,MAG/BiB,e,MACN,OAAyB,QAAlB,EAAAjB,KAAKkB,qBAAa,QAAKlB,KAAKkB,cAAgBC,OAAOC,KAAKpB,KAAKc,QAG/DO,OAAOC,GACZ,OAAOtB,KAAKuB,kBAAkBC,GAAUA,EAAMH,OAAO,IAAMC,KAGtDG,YACL,OAAON,OAAOE,OAAOrB,KAAKc,QAGrBjK,IAAIyK,GACT,OAAOtB,KAAKuB,kBAAkBC,GAAUA,EAAMzH,MAAM,IAAMuH,KAGrDI,KAAKJ,EAAmBrD,GAE7B,OAAO+B,KAAKuB,kBAAkBC,GAAUA,EAAMG,IAAI,IAAML,EAAWrD,KAG9D2D,QAAQC,EAAkBxE,EAAmC,QAOlE,OAAO2C,KAAKnJ,IAAIgL,GAAUhH,MAAMoD,IAC9B,IAAIA,EAEF,KAAM,iBAOR,OAJgBA,EAASZ,QAQtByE,SAASD,EAAkBpD,GAE3BA,aAAgBe,OACnBf,EAAOU,EAAcV,IAGvB,MAAMR,EAAW,IAAI8D,SAAStD,EAAM,CAClCuD,QAAS,CACP,iBAAkB,GAAKvD,EAAKwD,QAIhC,OAAOjC,KAAK0B,KAAKG,EAAU5D,GAAUpD,MAAK,IAAM4D,IAG3C8C,iBAAoBW,GACzB,OAAIlC,KAAKe,WAIF,IAAI7I,SAAW,CAAMC,EAASoG,KAAW,O,EAAA,K,OAAA,E,EAAA,YAC9C,IAAI4D,GAAW,EACf,MAAMC,EAAUhK,YAAW,KACzBmG,IAEA4D,GAAW,IACV,MAEH,IACE,MAAMX,QAAcxB,KAAKiB,eACzB,IAAIO,EAGF,MAFAxB,KAAKe,YAAa,EAClBf,KAAKkB,mBAAgBmB,EACf,YAGR,MAAMC,QAAYJ,EAASV,GAE3B,GAAGW,EAAU,OACbhK,EAAQmK,GACR,MAAMC,GACNhE,EAAOgE,GAGTC,aAAaJ,I,YAxBiC,K,iRAHvClK,QAAQqG,OAAO,mBA+BnBkE,cAAcZ,EAAkBxC,GACrC,MAAMqD,EAAa,oBAA8BrD,GAAWZ,GACnDuB,KAAK8B,SAASD,EAAUpD,GAAM7G,OAAM,IAAM6G,MAGnD,OAAOvG,QAAQC,QAAQuK,GAGlBC,qBAAqBC,GAC1B,OAAO1K,QAAQyC,IAAIqF,KAAKgB,SAAS6B,KAAIC,IAGnC,GAFAA,EAAQ/B,WAAa6B,GAEjBA,EACF,OAAOE,EAAQrB,iBA3HN,EAAAT,SAAqC,GCCtD,MAAM+B,EAAe,IAAIlC,EAAuB,sBAE1CmC,EAA2B,cA+BjCC,aA7BuB,IACdF,EAAaxB,kBAAkBC,GAC7BA,EAAM0B,OAAOrI,MAAKsI,IACvB,MAAMC,EAAmC,IAAI5L,IACvC6L,EAAY/K,KAAKC,MAAQ,IAAO,EACtC,IAAI,MAAMN,KAAWkL,EAAU,CAC7B,MAAMpJ,EAAQ9B,EAAQqL,IAAIvJ,MAAM,cAC7BA,IAAUqJ,EAASzL,IAAIoC,EAAM,KAC9BqJ,EAAS5K,IAAIuB,EAAM,GAAI9B,GAI3B,MAAMsL,EAA2B,GACjC,IAAI,MAAOC,EAAIvL,KAAYmL,EAAU,CACnC,MAAM/E,EAAUmD,EAAMzH,MAAM9B,GAAS4C,MAAMoD,IACzC,IAAKA,EAAS+D,QAAQnL,IAAImM,GAlBlB,OAkB4DK,EAElE,OADAlG,EAAI,4BAA6BqG,GAC1BhC,EAAMH,OAAOpJ,EAAS,CAACwL,cAAc,EAAMC,YAAY,OAIlEH,EAAS9C,KAAKpC,GAGhB,OAAOnG,QAAQyC,IAAI4I,SAKG,MAC5BN,aAAY,KACV5I,IAAmBQ,MAAMP,IACvB,IAAI,MAAOqJ,EAAUJ,KAAaK,GAChC,IAAItJ,EAAQuJ,MAAKC,GAAUA,EAAON,KAAOG,IAAW,CAClD,IAAI,MAAMI,KAAUR,EACFA,EAASQ,GACjBxF,SAGVqF,GAAA,OAAwBD,SAI7B,MAIH,MAAMK,EAAiC,IAAIxM,IAC3C,MAAMyM,EAMJnE,YAAoBoE,GAAA,KAAAA,KAAAA,EAFZ,KAAAC,cAA6B,IAAIC,IAWjC,KAAAC,QAAU,KAChBL,EAAQ3C,OAAOrB,KAAKwD,KATpBxD,KAAKwD,GAAKS,EAAOK,MAAMJ,GACvBF,EAAQxL,IAAIwH,KAAKwD,GAAIxD,MAGrBA,KAAKuE,UAAYL,EAAKjC,KAAO,SAAqBuC,EAA2BC,EAC7EzE,KAAK0E,iBC5EM,SACbC,EACAC,EACAC,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EACAC,EAAiD7M,EAAgCoG,EACjF0G,GAAa,EAEjB,MAAO,IAAIrK,KACLoK,IAAgBA,EAAiB,IAAI9M,SAAQ,CAACgN,EAAUC,KAAahN,EAAU+M,EAAU3G,EAAS4G,MAEnGJ,GACDvC,aAAauC,GACbE,GAAa,EACb1G,IACAyG,EAAiB,IAAI9M,SAAQ,CAACgN,EAAUC,KAAahN,EAAU+M,EAAU3G,EAAS4G,MAC1EN,IAER1M,EAAQwM,KAAM/J,IACdqK,GAAa,GAGfF,EAAiB3M,YAAW,MAEvB0M,GAAmBD,IAAkBI,GAEtC9M,EAAQwM,KAAM/J,IAGhBmK,EAAiBC,EAAiB7M,EAAUoG,OAAS8D,EACrD4C,GAAa,IACZL,GAEHI,EAAepN,OAAM,SACdoN,GDwCiBI,CAASpF,KAAKqE,QAAS,MAAQ,GAAO,GAOlDgB,0BAA0BC,EAAuBC,EAAeC,GAAc,G,qCAC1F,MAAMC,EAAwC,CAC5ChL,KAAM,kBACNiL,QAAS,CAAC1F,KAAKkE,KAAKyB,KAAM3F,KAAKkE,KAAKvL,SAAU2M,EAAeC,IAGzDxB,EAAS6B,KAAKC,UAAUJ,GAC7BA,EAA6BjC,GAAKO,EAEnC,MAAM+B,QAAqBzL,IAAmBQ,MAAMP,IAClD,GAAIA,EAAQS,OAIZ,OAAOT,EAAQuJ,MAAKC,GAAUF,GAAiBjM,IAAImM,EAAON,OAAQlJ,EAAQ,MAG5E,IAAIwL,EACF,MAAM,IAAItK,MAAM,aAGlB,IAAI+H,EAAWK,GAAiB/M,IAAIiP,EAAatC,IAC7CD,GACFK,GAAiBpL,IAAIsN,EAAatC,GAAID,EAAW,IAGnD,IAAIwC,EAAWxC,EAASQ,GACxB,GAAGgC,EACD,OAAOA,EAASlL,MAAKmL,GAAcA,EAAW5F,QAGhD0F,EAAa3K,YAAYsK,GACzBzF,KAAKmE,cAAc8B,IAAIX,GAEvBS,EAAWxC,EAASQ,GElGjB,WACL,IAAImC,EAAsB,CACxBC,aAAa,EACbC,YAAY,EAEZC,OAAQ,OACRC,UAAW,IAAI1L,KACbsL,EAAeK,WAAa3L,EAC5BsL,EAAepL,UAAUG,SAASiH,GAAkBA,KAAYtH,MAGlEE,UAAW,GACX0L,kBAAoBtE,IACfgE,EAAeK,YAChBrE,KAAYgE,EAAeK,YAG7BL,EAAepL,UAAU2F,KAAKyB,KAI9B6D,EAAkC,IAAI7N,SAAW,CAACC,EAASoG,KAC7D2H,EAAe/N,QAAWsO,IACrBV,EAASI,aAAeJ,EAASK,aAEpCL,EAASI,aAAc,EACvBhO,EAAQsO,KAGVP,EAAe3H,OAAS,IAAI3D,KACvBmL,EAASK,YAAcL,EAASI,cAEnCJ,EAASK,YAAa,EACtB7H,KAAU3D,QAqBd,OAXAmL,EAASnO,MAAM,GAAM8O,SAAQ,KAC3BX,EAASM,OAASN,EAASO,UAAYP,EAASQ,WAAa,KAC7DR,EAASjL,UAAUC,OAAS,EAEzBgL,EAASY,SACVZ,EAASY,OAAS,WAItBjQ,OAAOkQ,OAAOb,EAAUG,GAEjBH,EF4CyBc,GAC9B,MAAMC,EAAef,EAASlL,MAAKmL,GAAcA,EAAW5F,QAK5D,OAHAJ,KAAK+G,iBAAiBD,EAAcxB,EAAeC,IAClDC,GAAexF,KAAKgH,cAAc1B,EAAeA,EAAkC,GAAjBtF,KAAKuE,WAEjEuC,G,+RAGDG,yBAAyB3B,EAAuBC,EAAeC,GACrE,MAAMhP,EAAMwJ,KAAKkH,YAAY5B,EAAeC,GAC5C,OAAOxC,EAAanB,QAAQpL,GAAKqE,MAAM4D,GAC9B+G,EAAc,IAAItG,WAAeV,EAAqBC,KAC3D5G,QAOEsP,gBAAgB7B,EAAuBC,EAAeC,GAC5D,OAAOxF,KAAKiH,yBAAyB3B,EAAeC,EAAOC,GAAa3K,MAAKuF,GACpEA,GAASJ,KAAKqF,0BAA0BC,EAAeC,EAAOC,KAIjEuB,iBAAiBhB,EAA+BT,EAAuBC,GAC7E,OAAOQ,EAASlL,MAAKuF,IACnB,MAAM5J,EAAMwJ,KAAKkH,YAAY5B,EAAeC,GACtCtH,EAAW,IAAI8D,SAAS3B,EAAO,CACnC4B,QAAS,CACP,iBAAkB,GAAK5B,EAAMrF,OAC7B,eAAgB,2BAChB,CAACiI,GAA2B,IAAM1K,KAAKC,MAAQ,IAAO,MAI1D,OAAOwK,EAAarB,KAAKlL,EAAKyH,MAI1BmJ,aAAaC,GAChBrH,KAAKmE,cAAcxM,IAAI0P,KAI1BrH,KAAKmE,cAAc8B,IAAIoB,GACvBrH,KAAKmH,gBAAgBE,EAAQrH,KAAKuE,WAAW,IAGvCyC,cAAcK,EAAgBC,GAKpC,GAJGA,EAAMtH,KAAKkE,KAAKjC,OACjBqF,EAAMtH,KAAKkE,KAAKjC,MAGdoF,EAGF,KAAMA,EAASC,EAAKD,GAAUrH,KAAKuE,UACjCvE,KAAKoH,aAAaC,QAHpBrH,KAAKoH,aAAaG,EAAYF,EAAQrH,KAAKuE,YAQxCiD,aAAaC,GAClBzH,KAAK0E,mBAEL,MAAMgD,EA2EV,SAAqCD,EAAoBpI,EAAkB4C,GACzE,OAAgB,IAAbwF,EAAM,IAAyB,IAAbA,EAAM,GAClB,IAAI1F,SAAS,IAAI7C,WAAW,GAAGD,OAAQ,CAC5Cd,OAAQ,IACRwJ,WAAY,kBACZ3F,QAAS,CACP,gBAAiB,QACjB,gBAAiB,aAAaC,GAAQ,MACtC,iBAAkB,IAClB,eAAgB5C,GAAY,eAK3B,KAzFoBuI,CAA4BH,EAAOzH,KAAKkE,KAAK7E,SAAUW,KAAKkE,KAAKjC,MAC1F,GAAGyF,EACD,OAAOA,EAGT,IAAKL,EAAQC,GAAOG,EAQpB,MAAMlC,EAAQ+B,GAAOA,EAAMtH,KAAKuE,UAoGpC,SAAoBgB,GAClB,OAAO,WAAKsC,KAAKC,KAAKD,KAAK1K,IAAIoI,GAASsC,KAAK1K,IAAI,KArGH4K,CAAWT,EAAMD,EAAS,GAAKrH,KAAKuE,UAC1Ee,EAAgBiC,EAAYF,EAAQ9B,GAM1C,OAJI+B,IACFA,EAAMO,KAAKG,IAAIX,EAAS9B,EAAOvF,KAAKkE,KAAKjC,KAAO,IAG3CjC,KAAKmH,gBAAgB7B,EAAeC,GAAO1K,MAAKoN,IAIlDZ,IAAW/B,GAAiBgC,IAAShC,EAAgBC,IACtD0C,EAAKA,EAAGjN,MAAMqM,EAAS/B,EAAegC,EAAMhC,EAAgB,IAG9D,MAAMtD,EAAkC,CACtC,gBAAiB,QACjB,gBAAiB,SAASqF,KAAUA,EAASY,EAAGC,WAAa,KAAKlI,KAAKkE,KAAKjC,MAAQ,MACpF,iBAAkB,GAAGgG,EAAGC,cASxB,OANClI,KAAKkE,KAAK7E,WACX2C,EAAQ,gBAAkBhC,KAAKkE,KAAK7E,UAK7B,IAAI0C,SAASkG,EAAI,CACtB9J,OAAQ,IACRwJ,WAAY,kBACZ3F,QAAAA,OAMAkF,YAAY5B,EAAuBC,GACzC,OAAOvF,KAAKwD,GAAK,WAAa8B,EAAgB,UAAYC,EAGrD5C,WAAWuB,G,MAChB,OAAoC,QAA7B,EAAAF,EAAQnN,IAAImJ,KAAKsE,MAAMJ,WAAM,QAAI,IAAID,EAAOC,GAG7CvB,aAAauB,GACnB,OAAQA,EAAKvL,SAAyD6K,IAsC1E,MAAMiB,EAA4B,OAC5BD,EAA2B,QAYjC,SAAS+C,EAAYF,EAAgBc,EAXR,MAY3B,OAAOd,EAAUA,EAASc,EGlQb,MAAMC,EAanBtI,YAAYuI,EAAOC,GATX,KAAAC,oBAAqB,EC5ChB,SAAuBC,EAAWC,GAC/C,GAAGA,EACD,IAAI,IAAIC,KAAKD,OACUpG,IAAlBoG,EAAWC,KAEZF,EAAOE,GAAKD,EAAWC,IDiD3BC,CAAW3I,KAAMqI,GAEd,SACDrI,KAAK4I,MAAQ,SAGf5I,KAAKsI,UAAYA,EAEjBtI,KAAK7C,IAAMN,EAAO,OAASmD,KAAKsI,WAEhCtI,KAAKiB,cAAa,GAElBmH,EAAWpH,SAASP,KAAKT,MAGpB2C,sBAAsBkG,GAC3B7I,KAAKgB,SAAS/F,SAAQ6H,IACpB,GAAG+F,GAAYA,IAAa/F,EAC1B,OAGF,MAAMuF,EAAKvF,EAAQuF,GAChBA,IACDA,EAAGS,QAAU,OACbT,EAAGU,YAuCF9I,cACL,OAAOD,KAAKuI,mBAGPtH,aAAa+H,GAAY,GAC9B,GAAGhJ,KAAKkB,gBAAkB8H,EACxB,OAAOhJ,KAAKkB,cAad,IACE,IAAIjJ,EAAUgR,UAAU7H,KAAKpB,KAAK4I,KAAM5I,KAAKkJ,SAE7C,IAAIjR,EACF,OAAOC,QAAQqG,SAEjB,MAAM1G,GAGN,OAFAmI,KAAK7C,IAAItF,MAAM,mBAAqBA,EAAgBG,SACpDgI,KAAKuI,oBAAqB,EACnBrQ,QAAQqG,OAAO1G,GAGxB,IAAIsR,GAAW,EAOf,OANA/Q,YAAW,KACL+Q,GACFlR,EAAQmR,QAAQ,CAAC3O,KAAM,yBAExB,KAEIuF,KAAKkB,cAAgB,IAAIhJ,SAAqB,CAACC,EAASoG,KAC7DtG,EAAQoR,UAAaC,IACnBH,GAAW,EACX,MAAMd,EAAKpQ,EAAQ6G,OACnB,IAAIyK,GAAY,EAEhBvJ,KAAK7C,IAAI,UAETkL,EAAGe,QAAWvR,IACZmI,KAAKuI,oBAAqB,EAC1BvI,KAAK7C,IAAItF,MAAM,8CAA+CA,GAC9D0G,EAAO1G,IAGTwQ,EAAGS,QAAWxR,IACZ0I,KAAK7C,IAAItF,MAAM,UAAWP,IACzBiS,GAAavJ,KAAKiB,gBAGrBoH,EAAGmB,QAAWlS,IACZ0I,KAAK7C,IAAItF,MAAM,SAAUP,GACzB,MAAMmS,EAAcnS,EAAEuH,OAEtBmB,KAAKiB,aAAasI,GAAY,GAE3BE,EAAYL,SACbK,EAAYL,QAAQ9R,GAGtB+Q,EAAGU,SAGLV,EAAGqB,gBAAmBpS,IACpB0I,KAAK7C,IAAItF,MAAM,0BAGjBM,EAAQ6H,KAAKqI,GAAKA,IAGpBpQ,EAAQmR,QAAWE,IACjBH,GAAW,EACXnJ,KAAKuI,oBAAqB,EAC1BvI,KAAK7C,IAAItF,MAAM,8CAA+CyR,GAC9D/K,EAAO+K,IAGTrR,EAAQ0R,gBAAmBL,IACzBH,GAAW,EACXnJ,KAAK7C,IAAIyM,KAAK,8BAA+BN,EAAMO,WAAY,KAAMP,EAAMQ,YAG3E,IAAIzB,EAAKiB,EAAMzK,OAAOC,OACtBkB,KAAK+J,OAAO9O,SAAS+O,IAOf3B,EAAG4B,iBAAiBC,SAASF,EAAMpB,OAxFnB,EAACP,EAAiB2B,K,MAC1C,MAAMG,EAAK9B,EAAG+B,kBAAkBJ,EAAMpB,MAEtC,GAAgB,QAAb,EAAAoB,EAAMK,eAAO,eAAEtP,OAChB,IAAI,MAAMuP,KAASN,EAAMK,QACvBF,EAAGI,YAAYD,EAAME,UAAWF,EAAMG,QAASH,EAAMI,mBAoFnDN,CAAkB/B,EAAI2B,UAOzB3I,OAAOC,GAMZ,OAJIqJ,MAAMC,QAAQtJ,KAChBA,EAAY,GAAGuJ,OAAOvJ,IAGjBtB,KAAK8K,eAAe,aAAcC,GAC/BzJ,EAAuBuB,KAAKvB,GAAcyJ,EAAY1J,OAAOC,MACxB,IAG1C0J,MAAM1C,GACX,OAAOtI,KAAK8K,eAAe,aAAcC,GAAgBA,EAAYC,SAA2B,GAAI1C,GAG/F5G,KAAKJ,EAA8BmF,GAiBxC,OALIkE,MAAMC,QAAQtJ,KAChBA,EAAY,GAAGuJ,OAAOvJ,GACtBmF,EAAQ,GAAGoE,OAAOpE,IAGbzG,KAAK8K,eAAe,aAAcC,GAC/BzJ,EAAuBuB,KAAI,CAACvB,EAAW2J,IAAQF,EAAYpJ,IAAI8E,EAAMwE,GAAM3J,MACxC,IAGxCQ,SAASD,EAAkBpD,GAMhC,OAJKA,aAAgBe,OACnBf,EAAOU,EAAc,CAACV,KAGjBuB,KAAK0B,KAAKG,EAAUpD,GAqEtB5H,IAAOyK,GAOZ,OAJIqJ,MAAMC,QAAQtJ,KAChBA,EAAY,GAAGuJ,OAAOvJ,IAGjBtB,KAAK8K,eAAkB,YAAaC,GACjCzJ,EAAuBuB,KAAKvB,GAAcyJ,EAAYlU,IAAIyK,MACxB,IAGtCwJ,eAAkBI,EAA0BH,EAAyE5N,EAAcmL,EAAYtI,KAAKsI,WAC1J,IAAI6C,EAOJ,OALGhO,IACDgO,EAAOC,YAAY7S,MACnByH,KAAK7C,IAAIA,EAAM,YAGV6C,KAAKiB,eAAepG,MAAMwN,GACxB,IAAInQ,SAAW,CAACC,EAASoG,KAK9B,MAAMkL,EAAcpB,EAAGoB,YAAY,CAACnB,GAAY4C,GAEhDzB,EAAYL,QAAW9R,IACrBkL,aAAaJ,GACb7D,EAAOkL,EAAY5R,QAGrB4R,EAAY4B,WAAc/T,IACxBkL,aAAaJ,GAEVjF,GACD6C,KAAK7C,IAAIA,EAAM,QAASiO,YAAY7S,MAAQ4S,GAG9C,MAAMG,EAAUC,EAAE1I,KAAI0I,GAAKA,EAAEzM,SAC7B3G,EAAQyS,EAAUU,EAAUA,EAAQ,KAGtC,MAAMlJ,EAAUhK,YAAW,KACzB4H,KAAK7C,IAAItF,MAAM,2BAA4B4R,KAC1C,KAOGtG,EAAW4H,EAAYtB,EAAYsB,YAAYzC,IAE/CsC,EAAUD,MAAMC,QAAQzH,GACxBoI,EAAkBX,EAAUzH,EAAW,GAAG0H,OAAO1H,QA0BtDqI,SACL,OAAOxL,KAAK8K,eAAoB,YAAaC,GAAgBA,EAAYS,UAA6B,KAxXzF,EAAAxK,SAAwC,G,0SExBzD,MAAM,EAAM1H,KACNmS,EAAiB9S,SAAS+S,SAAW,KAAO/S,SAASgT,SAAWhT,SAASiT,SAAS1P,MAAM,KAAKlB,MAAM,GAAI,GAAG6Q,KAAK,KAAO,IA+EtHC,EAAS,IAxDf,MAIEhM,YACEuI,EACAC,EACQyD,GAAA,KAAAA,SAAAA,EANF,KAAAvK,MAA0B,GAUhCxB,KAAK8C,QAAU,IAAIsF,EAAcC,EAAIC,GAG1BzR,IAA6BL,G,yCACxC,QAAuB6L,IAApBrC,KAAKwB,MAAMhL,GACZ,OAAOwJ,KAAKwB,MAAMhL,GAGpB,IAAIiQ,EACJ,IACEA,QAAczG,KAAK8C,QAAQjM,IAAIL,GAC/B,MAAM+L,IAIR,QAAuBF,IAApBrC,KAAKwB,MAAMhL,GACZ,OAAOwJ,KAAKwB,MAAMhL,GAGpB,QAAa6L,IAAVoE,EAAqB,CACtB,MAAMvE,EAAWlC,KAAK+L,SAASvV,GAC/BiQ,EAA6B,mBAAf,EAA4BvE,IAAaA,EAGzD,OAAOlC,KAAKwB,MAAMhL,GAAOiQ,KAGdjO,IAA6BhC,EAAQiQ,G,yCAChDzG,KAAKwB,MAAMhL,GAAOiQ,EAElB,IACEzG,KAAK8C,QAAQpB,KAAKlL,EAAeiQ,GACjC,MAAMlE,UC5E6F,CACvGqG,KAAM,OACNM,QAAS,EACTa,OAAQ,CAAC,CACPnB,KAAM,WACL,CACDA,KAAM,eACL,CACDA,KAAM,SACL,CACDA,KAAM,SACL,CACDA,KAAM,WACL,CACDA,KAAM,cD2E6E,UAAW,CAChGoD,gBAAiB,EACjBC,gBAAiB,EACjBC,UAAW,GACXC,cAAe,KAGjB,EAAIvN,iBAAiB,QAAS0K,IAC5B,MAAMxS,EAA8BwS,EAAM8C,KAAKC,OAC/ClP,EAAI,OAAQrG,GAEZ,IAAIwV,GAAmB,EACvB,MAAMC,EAAgBrU,QAAQyC,IAAI,CAChCmR,EAAOjV,IAAI,mBACXiV,EAAOjV,IAAI,mBACX,EAAIyD,QAAQC,SAAS,CAACE,KAAM,aAC3BI,MAAMiE,IACP,MAAO0N,EAAWC,EAAeC,GAAc5N,EAI/C,GAFA3B,EAAI,kBAAmBuP,GACvBJ,EAAmBI,EAAW3R,OAAS,EACpCuR,EACD,KAAM,sDAGR,MAAMK,EAAUrU,KAAKC,MACrB,GAAGqU,KACCJ,GACAG,EAAUH,EACZ,KAAM,yCAAyC3E,KAAKC,MAAM0E,EAAYG,GAAW,WAGnF,IAAI7V,EAAI+V,MACN,KAAM,eAIVN,EAAc3U,OAAMkV,IAClB3P,EAAI2P,MAGN,MAAMC,EAAsBR,EAAc1R,MAAK,IACtC3C,QAAQyC,IAAI,CAACmR,EAAOjV,IAAI,iBAAkBiV,EAAOjV,IAAI,iBAC3DgE,MAAMiE,GAyHX,SAA0BhI,EAA6BkW,EAAwCC,GAC7F,MAAMC,EAAO,qCACb,IAEIC,EAFAC,EAAQtW,EAAIsW,OAAS,WACrBC,EAAOvW,EAAIwW,aAAe,GAG3BxW,EAAIyW,SAEHJ,EADCrW,EAAIyW,OAAOC,WACH,IAAM1W,EAAIyW,OAAOC,WAClB1W,EAAIyW,OAAOE,QACV,IAAM3W,EAAIyW,OAAOE,QAEjB3W,EAAIyW,OAAOG,SAAW,IAInC5W,EAAIyW,OAAOJ,OAAS,GAAKA,EACzB,IAAIQ,EAAM,OAASR,EAEhBH,GAAYA,EAASY,YACtBR,EAAQ,WACRC,EAAOJ,EAAKY,wBAA0B,yBACtCF,EAAM,gBAGRxQ,EAAI,cAAeiQ,EAAOC,EAAMH,EAAMpW,GAEtC,MAAMgX,EAA+F,CAAC,CACpGC,OAAQ,SACRX,MAAOH,EAAKe,oBAAsB,iBAcpC,OAR4B,EAAIC,aAAaC,iBAAiBd,EAAO,CACnEC,KAAAA,EACAH,KAAAA,EACAS,IAAAA,EACAvB,KAAMtV,EACNgX,QAAAA,IAGyBjT,MAAMyO,IA1FnC,IAA6B6E,EA4FtB7E,GAASA,EAAM6E,eA5FOA,EA8FH7E,EAAM6E,aA7F1BC,EAAczW,IAAIwW,KACpBC,EAAcnI,IAAIkI,GAElBA,EAAarF,QAAUuF,OA4FtBzW,OAAOC,IACRsF,EAAItF,MAAM,4BAA6BA,MA1KhCyW,CAAiBxX,EAAKgI,EAAO,GAAIA,EAAO,MAG3CyP,EAAexB,EAAoBnV,OAAM,KAC7CuF,EAAI,oCAAqCmP,GACtCM,KAA8BN,EACxBkC,IAGF,EAAIP,aAAaC,iBAAiB,WAAY,CACnDP,IAAK,iBACJ9S,MAAK,KACN,GAAGyR,EACD,OAAOkC,IAGTpW,YAAW,IAAMoW,KAAyBlC,EAAmB,EAAI,QAChE1U,OAAOC,IACRsF,EAAItF,MAAM,0BAA2BA,SAIzCyR,EAAMmF,UAAUF,MAGlB,EAAI3P,iBAAiB,qBAAsB0K,IACzC,MAAM6E,EAAe7E,EAAM6E,aAC3BhR,EAAI,0BAA2BgR,EAAaR,KAC5CQ,EAAapF,QAEb,MAAMgF,EAASzE,EAAMyE,OACrB,GAAc,WAAXA,GAAuBnB,IAGxB,OAFAzP,EAAI,yBACJ2O,EAAOtT,IAAI,kBAAmBF,KAAKC,MAAQ,OAI7C,MAAM6T,EAA+B+B,EAAa/B,KAClD,IAAIA,EACF,OAGF,MAAM/N,EAAU,EAAI/D,QAAQC,SAAS,CACnCE,KAAM,WACLI,MAAM6R,IACPN,EAAK2B,OAASA,EACdW,EAAsB,CAACjU,KAAM,aAAciL,QAAS0G,GACpD,IAAI,IAAI1D,EAAI,EAAGA,EAAIgE,EAAW3R,OAAQ2N,IAAK,CACzC,MAAM5E,EAAS4I,EAAWhE,GAC1B,GAAG,UAAW5E,EAIZ,OAHAA,EAAO6K,QACP7K,EAAO3I,YAAYuT,QACnBA,OAAsBrM,GAK1B,GAAG,EAAI/H,QAAQsU,WACb,OAAO9C,EAAOjV,IAAI,iBAAiBgE,MAAMmS,GAChC,EAAI1S,QAAQsU,WAAW5B,EAAS6B,SAAWpD,QAGrD7T,OAAOC,IACRsF,EAAItF,MAAM,yBAA0BA,MAGtCyR,EAAMmF,UAAUpQ,MAGlB,EAAIO,iBAAiB,oBAAqByP,GAE1C,IACIK,EADAN,EAAmC,IAAIhK,IAU3C,SAASiK,EAAoB/E,GAI7B,IAAiC6E,EAAAA,EAHP7E,EAAM6E,aAI9BC,EAAc/M,OAAO8M,GAGhB,SAASK,IACd,IAAI,MAAML,KAAgBC,EACxB,IACED,EAAapF,QACb,MAAMzR,IAGV,IAAI+G,EAiBJ,OAfEA,EADC,qBAAsB,EAAI4P,aACjB,EAAIA,aAAaa,iBAAiB,IAAIjU,MAAMuT,IACpD,IAAI,IAAI1F,EAAI,EAAGqG,EAAMX,EAAcrT,OAAQ2N,EAAIqG,IAAOrG,EACpD,IACE0F,EAAc1F,GAAGK,QACjB,MAAMzR,QAETM,OAAOC,IACRsF,EAAItF,MAAM,4BAA6BA,MAG/BK,QAAQC,UAGpBiW,EAAcpD,QAEP3M,EAGT,SAASuO,IACP,OAAO5S,EE3OF,MAAMmD,EAAMN,EAAO,KAAMzB,EAASI,MAAQJ,EAASO,MAAQP,EAASM,IAAMN,EAASK,MACpF,EAAMnC,KACCsK,GAAyF,IAAIpM,IAsCpGwX,GAEF,CACFC,oBAAqB,KACnBT,KAEFU,KAAM,CAACzJ,EAA6B6D,MFsP/B,SAAgB7D,EAA6B6D,GAClD,MAAMxF,EAASwF,EAAM6F,OAAS7F,EAAM6F,MAAM,IAAM7F,EAAM8F,OAChD1J,EAAUD,EAAKC,QAElBA,EAAQ2J,oBACTvD,EAAOtT,IAAI,kBAAmBF,KAAKC,OAGlCmW,GACC5K,GACA,gBAAiBA,IACnBA,EAAO3I,YAAYuT,EAAqB,IACxCA,OAAsBrM,GAGrBqD,EAAQuH,MACTnB,EAAOtT,IAAI,YAAakN,EAAQuH,MAG/BvH,EAAQsH,UACTlB,EAAOtT,IAAI,gBAAiBkN,EAAQsH,UEzQpCsC,CAAO7J,EAAM6D,IAEfnC,gBAAiB,CAAC1B,EAAmCnO,KACnD,MAAMwO,EAAexO,EAAE8X,OACjB7L,EAAWK,GAAiB/M,IAAIiP,EAAatC,IACnD,IAAID,EACF,OAGF,MAAMlF,EAAUkF,EAASkC,EAAKjC,IAC3BnF,IACEoH,EAAK5N,MACNwG,EAAQE,OAAOkH,EAAK5N,OAEpBwG,EAAQlG,QAAQsN,EAAKC,gBAGhBnC,EAASkC,EAAKjC,MAGzB+L,cAAgB9J,IACd5E,EAAuB0O,cAAc9J,EAAKC,WAG9C,EAAI9G,iBAAiB,WAAYtH,IAC/B,MAAMmO,EAAOnO,EAAE8U,KACTlK,EAAW8M,GAAcvJ,EAAKhL,MACjCyH,GACDA,EAASuD,EAAMnO,MAgBnB,MAAMkY,GAAWlG,IACf,GAAwD,IAArDA,EAAMrR,QAAQqL,IAAIzK,QAAQF,SAAS8W,OAAS,MAAcnG,EAAMrR,QAAQqL,IAAIvJ,MAAM,oFACnF,OAAOuP,EAAMoG,YjB9FV,SAA4BpG,G,qCACjC,IAEE,MAAM9H,QAAcpD,EAAY,EAAI+C,OAAOC,KAAKrD,IAC1C4R,QAAavR,EAAYoD,EAAMzH,MAAMuP,EAAMrR,QAAS,CAACyL,YAAY,KAEvE,GAAGiM,GAAQ3R,EAAkB2R,GAC3B,OAAOA,EAGT,MAAM3N,EAAuB,CAAC,KAAQ,KACtC,IAAI/D,QAAiB2R,MAAMtG,EAAMrR,QAAS,CAAC+J,QAAAA,IAC3C,GAAGhE,EAAkBC,GACnBuD,EAAMG,IAAI2H,EAAMrR,QAASgG,EAAS4R,cAC7B,GAAuB,MAApB5R,EAASE,OAAgB,CACjC,MAAMmF,EAAMgG,EAAMrR,QAAQqL,IAAIwM,QAAQ,QAAS,IAAM,KAAuB,IAAhBjI,KAAKkI,SAAoB,GACrF9R,QAAiB2R,MAAMtM,EAAK,CAACtB,QAAAA,IAC1BhE,EAAkBC,IACnBuD,EAAMG,IAAI2H,EAAMrR,QAASgG,EAAS4R,SAItC,OAAO5R,EACP,MAAMsE,GACN,OAAOqN,MAAMtG,EAAMrR,W,+RiBsEM+X,CAAa1G,IAGxC,IACE,MAAO,CAAEhG,EAAK2M,EAAOC,GAAU,yCAAyCC,KAAK7G,EAAMrR,QAAQqL,MAAQ,GAK5F,WADA2M,GP8HI,SAAuB3G,EAAmB4G,GACvD,MAAMzI,EAqCR,SAAoB2I,GAClB,IAAIA,EAAQ,MAAO,CAAC,EAAG,GACvB,MAAO,CAAEC,GAAUD,EAAOlU,MAAM,KAC1BoU,EAASD,EAAOnU,MAAM,OACrBmL,EAAQC,GAAOgJ,EAAO,GAAGpU,MAAM,KAEtC,MAAO,EAAEmL,GAASC,GAAO,GA3CXiJ,CAAWjH,EAAMrR,QAAQ+J,QAAQnL,IAAI,UAC7CqN,EAAwB0B,KAAK4K,MAAMC,mBAAmBP,IACtDQ,EAASzM,EAAOpN,IAAIqN,GAI1BoF,EAAMoG,YAAYxX,QAAQoG,KAAK,EACrB,KQjQH,IAAIpG,SAAUC,IACnBC,YAAW,KACTD,EAAQ,IAAI4J,SAAS,GAAI,CACvB5D,OAAQ,IACRwJ,WAAY,0BR6PR,UACR+I,EAAOlJ,aAAaC,MOrIhBkJ,CAAcrH,EAAO4G,GAIzB,MAAM3N,GACN+G,EAAMoG,YAAY,IAAI3N,SAAS,GAAI,CACjC5D,OAAQ,IACRwJ,WAAY,6BAKZiJ,GAAgB,KACpB,EAAIC,QAAUrB,IAGhB,EAAI5Q,iBAAiB,WAAY0K,IAC/BnM,EAAI,cACJmM,EAAMmF,UAAU,EAAIqC,kBAGtB,EAAIlS,iBAAiB,YAAa0K,IAChCnM,EAAI,aAAc,GAClBmM,EAAMmF,UAAU,EAAItN,OAAOE,OAAOtD,IAClCuL,EAAMmF,UAAU,EAAInU,QAAQyW,YAG9B,EAAI3H,QAAWvR,IACbsF,EAAItF,MAAM,SAAUA,IAGtB,EAAImZ,qBAAwBnZ,IAC1BsF,EAAItF,MAAM,wBAAyBA,IAGrC,EAAIoZ,UAAY,EAAIC,SAAWN,GAE/BA,M","sources":["webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/fileManager.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/lib/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","(() => {\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\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","/*\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// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\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 DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\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 { pause } from \"../../helpers/schedulers/pause\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n \r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n \r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n \r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function noop() {}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 readBlobAsUint8Array from \"../../helpers/blob/readBlobAsUint8Array\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { getWindowClients } from \"../../helpers/context\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { InputFileLocation, UploadFile } from \"../../layer\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport { RequestFilePartTask, deferredPromises, log } from \"./index.service\";\r\nimport timeout from \"./timeout\";\r\n\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then(requests => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n getWindowClients().then((clients) => {\r\n for(const [clientId, promises] of deferredPromises) {\r\n if(!clients.find(client => client.id === clientId)) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(clientId);\r\n }\r\n }\r\n });\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const task: Omit = {\r\n type: 'requestFilePart',\r\n payload: [this.info.dcId, this.info.location, alignedOffset, limit]\r\n };\r\n\r\n const taskId = JSON.stringify(task);\r\n (task as RequestFilePartTask).id = taskId;\r\n\r\n const windowClient = await getWindowClients().then((clients) => {\r\n if(!clients.length) {\r\n return;\r\n }\r\n\r\n return clients.find(client => deferredPromises.has(client.id)) || clients[0];\r\n });\r\n\r\n if(!windowClient) {\r\n throw new Error('no window');\r\n }\r\n\r\n let promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n deferredPromises.set(windowClient.id, promises = {});\r\n }\r\n \r\n let deferred = promises[taskId] as CancellablePromise;\r\n if(deferred) {\r\n return deferred.then(uploadFile => uploadFile.bytes);\r\n }\r\n \r\n windowClient.postMessage(task);\r\n this.loadedOffsets.add(alignedOffset);\r\n \r\n deferred = promises[taskId] = deferredPromise();\r\n const bytesPromise = deferred.then(uploadFile => uploadFile.bytes);\r\n\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error) => {\r\n if(error === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then(bytes => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then(bytes => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then(ab => {\r\n //log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n \r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n });\r\n //}, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n //log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n) {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n return (...args: Parameters): typeof waitingPromise => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\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 noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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 blobConstruct from '../helpers/blob/blobConstruct';\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 default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.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\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 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 createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\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({type: '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 // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\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 }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): 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(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\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[]) {\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(', ') : '');\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]) as 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[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): 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 return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\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.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 transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\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 requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\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","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\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 * 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 DATABASE_STATE from \"../../config/databases/state\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport IDBStorage from \"../idb\";\r\nimport { log, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"./index.service\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n //user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T, \r\n storeName: typeof db['stores'][number]['name'], \r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_last_alive: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_last_alive: 0,\r\n push_lang: {},\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'), \r\n getter.get('push_last_alive'), \r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, lastAliveTime, clientList] = result;\r\n \r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n \r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch(reason => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = {type: 'push_click', payload: data};\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n client.postMessage(pendingNotification);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nlet notifications: Set = new Set();\r\nlet pendingNotification: ServiceWorkerPushClickTask;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview || 'You have a new message';\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d || 'Mute for 24H'\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event && event.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(task: ServiceWorkerPingTask, event: ExtendableMessageEvent) {\r\n const client = event.ports && event.ports[0] || event.source;\r\n const payload = task.payload;\r\n\r\n if(payload.localNotifications) {\r\n getter.set('push_last_alive', Date.now());\r\n }\r\n\r\n if(pendingNotification &&\r\n client &&\r\n 'postMessage' in client) {\r\n client.postMessage(pendingNotification, []);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\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 { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\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\n \n \n \n//import CacheStorageController from '../cacheStorage';\nimport type { Modify, WorkerTaskTemplate, WorkerTaskVoidTemplate } from '../../types';\nimport type { InputFileLocation, InputWebFileLocation, UploadFile } from '../../layer';\nimport type { WebPushApiManager } from '../mtproto/webPushApiManager';\nimport type { PushNotificationObject } from './push';\nimport type { ToggleStorageTask } from '../mtproto/mtprotoworker';\nimport type { MyUploadFile } from '../mtproto/apiFileManager';\nimport { logger, LogTypes } from '../logger';\nimport { CancellablePromise } from '../../helpers/cancellablePromise';\nimport { CACHE_ASSETS_NAME, requestCache } from './cache';\nimport onStreamFetch from './stream';\nimport { closeAllNotifications, onPing } from './push';\nimport CacheStorageController from '../cacheStorage';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const deferredPromises: Map}> = new Map();\n\nexport interface RequestFilePartTask extends Modify {\n type: 'requestFilePart',\n payload: [number, InputFileLocation | InputWebFileLocation, number, number]\n};\n\nexport interface RequestFilePartTaskResponse extends Modify {\n type: 'requestFilePart',\n payload?: MyUploadFile,\n originalPayload?: RequestFilePartTask['payload']\n};\n\nexport interface ServiceWorkerPingTask extends WorkerTaskVoidTemplate {\n type: 'ping',\n payload: {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n }\n};\n\nexport interface ServiceWorkerNotificationsClearTask extends WorkerTaskVoidTemplate {\n type: 'notifications_clear'\n};\n\nexport interface ServiceWorkerPushClickTask extends WorkerTaskVoidTemplate {\n type: 'push_click',\n payload: PushNotificationObject\n};\n\nexport type ServiceWorkerTask = RequestFilePartTaskResponse | ServiceWorkerPingTask | ServiceWorkerNotificationsClearTask | ToggleStorageTask;\n\n \nconst taskListeners: {\n [type in ServiceWorkerTask['type']]: (task: any, event: ExtendableMessageEvent) => void\n} = {\n notifications_clear: () => {\n closeAllNotifications();\n },\n ping: (task: ServiceWorkerPingTask, event) => {\n onPing(task, event);\n },\n requestFilePart: (task: RequestFilePartTaskResponse, e: ExtendableMessageEvent) => {\n const windowClient = e.source as WindowClient;\n const promises = deferredPromises.get(windowClient.id);\n if(!promises) {\n return;\n }\n\n const promise = promises[task.id];\n if(promise) {\n if(task.error) {\n promise.reject(task.error);\n } else {\n promise.resolve(task.payload);\n }\n \n delete promises[task.id];\n }\n },\n toggleStorage: (task: ToggleStorageTask) => {\n CacheStorageController.toggleStorage(task.payload);\n }\n};\nctx.addEventListener('message', (e) => {\n const task = e.data as ServiceWorkerTask;\n const callback = taskListeners[task.type];\n if(callback) {\n callback(task, e);\n }\n});\n \n\n//const cacheStorage = new CacheStorageController('cachedAssets');\n/* let taskId = 0;\n\nexport function getTaskId() {\n return taskId;\n}\n\nexport function incrementTaskId() {\n return taskId++;\n} */\n\nconst onFetch = (event: FetchEvent): void => {\n if(event.request.url.indexOf(location.origin + '/') === 0 && event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)) {\n return event.respondWith(requestCache(event));\n }\n\n try {\n const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n\n //log.debug('[fetch]:', event);\n \n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n }\n } catch(err) {\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME));\n event.waitUntil(ctx.clients.claim());\n});\n\nctx.onerror = (error) => {\n log.error('error:', error);\n};\n\nctx.onunhandledrejection = (error) => {\n log.error('onunhandledrejection:', error);\n};\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","oldGetScript","u","oldLoadScript","e","queryMap","Map","countMap","chunkId","has","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","toLowerCase","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","getWindowClients","clients","matchAll","includeUncontrolled","type","notifyServiceWorker","all","args","then","listeners","length","slice","forEach","listener","postMessage","LogTypes","bind","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","console","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","readBlobAsUint8Array","blob","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","Uint8Array","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","constructor","blobSupported","this","isAvailable","write","fileWriter","bytes","arr","getFakeFileWriter","saveFileCallback","part","push","truncate","finalize","saveToStorage","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","save","put","getFile","fileName","saveFile","Response","headers","size","callback","rejected","timeout","undefined","res","err","clearTimeout","getFileWriter","fakeWriter","static","enabled","map","storage","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","url","promises","id","ignoreSearch","ignoreVary","clientId","deferredPromises","find","client","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","debounce","requestFilePartFromWorker","alignedOffset","limit","fromPreload","task","payload","dcId","JSON","stringify","windowClient","deferred","uploadFile","add","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","value","finally","cancel","assign","deferredPromise","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","getChunkKey","requestFilePart","preloadChunk","offset","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","byteLength","base","IDBStorage","db","storeName","storageIsAvailable","object","fromObject","i","safeAssign","name","preserve","onclose","close","createNew","indexedDB","version","finished","onerror","onsuccess","event","calledNew","onabort","transaction","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","Array","isArray","concat","getObjectStore","objectStore","clear","idx","mode","perf","performance","oncomplete","results","r","getAll","defaultBaseUrl","protocol","hostname","pathname","join","getter","defaults","push_mute_until","push_last_alive","push_lang","push_settings","data","json","hasActiveWindows","checksPromise","muteUntil","lastAliveTime","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","push_message_nopreview","actions","action","push_action_mute1d","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","focus","openWindow","baseUrl","getNotifications","len","taskListeners","notifications_clear","ping","ports","source","localNotifications","onPing","toggleStorage","onFetch","origin","respondWith","file","fetch","clone","replace","random","requestCache","scope","params","exec","header","chunks","ranges","parseRange","parse","decodeURIComponent","stream","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onunhandledrejection","onoffline","ononline"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/serviceWorker/cache.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/helpers/blob/readBlobAs.ts","webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/blob/blobConstruct.ts","webpack:///./src/helpers/blob/blobSafeMimeType.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/serviceWorker/stream.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object/safeAssign.ts","webpack:///./src/lib/serviceWorker/push.ts","webpack:///./src/lib/serviceWorker/index.service.ts","webpack:///./src/lib/serviceWorker/timeout.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","toLowerCase","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","getWindowClients","clients","matchAll","includeUncontrolled","type","notifyServiceWorker","all","args","then","listeners","length","slice","forEach","listener","postMessage","notifyWorker","noop","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","console","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","isCorrectResponse","response","ok","status","timeoutRace","promise","Promise","race","ms","resolve","setTimeout","reject","readBlobAsArrayBuffer","blob","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsUint8Array","buffer","Uint8Array","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","blobSupported","this","fileWriter","bytes","arr","write","saveFileCallback","part","push","truncate","finalize","saveToStorage","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","put","fileName","Response","headers","size","save","callback","rejected","timeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","map","storage","deleteAll","cacheStorage","setInterval","keys","requests","filtered","Map","timestamp","request","url","has","set","promises","id","ignoreSearch","ignoreVary","clientId","deferredPromises","find","client","taskId","streams","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","debounce","alignedOffset","limit","fromPreload","task","payload","dcId","JSON","stringify","windowClient","deferred","uploadFile","add","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","finally","cancel","assign","deferredPromise","bytesPromise","saveChunkToCache","preloadChunks","getChunkKey","getFile","error","requestFilePartFromCache","requestFilePartFromWorker","offset","requestFilePart","end","preloadChunk","alignOffset","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","byteLength","base","version","stores","db","storeName","storageIsAvailable","fromObject","safeAssign","preserve","onclose","close","createNew","indexedDB","message","finished","onerror","onsuccess","event","calledNew","onabort","transaction","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","Array","isArray","concat","getObjectStore","objectStore","clear","idx","perf","performance","oncomplete","results","getAll","defaultBaseUrl","protocol","hostname","pathname","join","defaults","push_mute_until","push_last_alive","push_lang","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","lastAliveTime","clientList","nowTime","userInvisibleIsSupported","badge","reason","closePromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","push_message_nopreview","actions","action","push_action_mute1d","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closeAllNotifications","waitUntil","pendingNotification","focus","openWindow","baseUrl","getNotifications","len","taskListeners","notifications_clear","ping","ports","source","localNotifications","onPing","toggleStorage","onFetch","origin","respondWith","file","fetch","clone","replace","random","requestCache","scope","params","exec","header","chunks","ranges","parseRange","parse","decodeURIComponent","stream","delay","requestRange","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onunhandledrejection","onoffline","ononline"],"mappings":"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","file":"sw.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\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 { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\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 Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\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","/*\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// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\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 DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\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 { pause } from \"../../helpers/schedulers/pause\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n \r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n \r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n \r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\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 readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\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\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\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 readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\n","export default function noop() {}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\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 * 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 blobConstruct from \"../helpers/blob/blobConstruct\";\r\nimport readBlobAsUint8Array from \"../helpers/blob/readBlobAsUint8Array\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\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 Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\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) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\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 readBlobAsUint8Array from \"../../helpers/blob/readBlobAsUint8Array\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { getWindowClients } from \"../../helpers/context\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { InputFileLocation, UploadFile } from \"../../layer\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport { RequestFilePartTask, deferredPromises, log } from \"./index.service\";\r\nimport timeout from \"./timeout\";\r\n\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then(requests => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n getWindowClients().then((clients) => {\r\n for(const [clientId, promises] of deferredPromises) {\r\n if(!clients.find(client => client.id === clientId)) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(clientId);\r\n }\r\n }\r\n });\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const task: Omit = {\r\n type: 'requestFilePart',\r\n payload: [this.info.dcId, this.info.location, alignedOffset, limit]\r\n };\r\n\r\n const taskId = JSON.stringify(task);\r\n (task as RequestFilePartTask).id = taskId;\r\n\r\n const windowClient = await getWindowClients().then((clients) => {\r\n if(!clients.length) {\r\n return;\r\n }\r\n\r\n return clients.find(client => deferredPromises.has(client.id)) || clients[0];\r\n });\r\n\r\n if(!windowClient) {\r\n throw new Error('no window');\r\n }\r\n\r\n let promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n deferredPromises.set(windowClient.id, promises = {});\r\n }\r\n \r\n let deferred = promises[taskId] as CancellablePromise;\r\n if(deferred) {\r\n return deferred.then(uploadFile => uploadFile.bytes);\r\n }\r\n \r\n windowClient.postMessage(task);\r\n this.loadedOffsets.add(alignedOffset);\r\n \r\n deferred = promises[taskId] = deferredPromise();\r\n const bytesPromise = deferred.then(uploadFile => uploadFile.bytes);\r\n\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error) => {\r\n if(error === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then(bytes => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then(bytes => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then(ab => {\r\n //log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n \r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n });\r\n //}, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n //log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n) {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n return (...args: Parameters): typeof waitingPromise => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\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 noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\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 { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\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 blobConstruct from '../helpers/blob/blobConstruct';\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 default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.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\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 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 createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\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({type: '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 // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\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 }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): 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(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\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[]) {\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(', ') : '');\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]) as 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[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): 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 return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\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.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 transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\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 requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\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","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\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 * 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 DATABASE_STATE from \"../../config/databases/state\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport IDBStorage from \"../idb\";\r\nimport { log, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"./index.service\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n //user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T, \r\n storeName: typeof db['stores'][number]['name'], \r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_last_alive: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_last_alive: 0,\r\n push_lang: {},\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'), \r\n getter.get('push_last_alive'), \r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, lastAliveTime, clientList] = result;\r\n \r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n \r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch(reason => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = {type: 'push_click', payload: data};\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n client.postMessage(pendingNotification);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nlet notifications: Set = new Set();\r\nlet pendingNotification: ServiceWorkerPushClickTask;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview || 'You have a new message';\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d || 'Mute for 24H'\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event && event.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(task: ServiceWorkerPingTask, event: ExtendableMessageEvent) {\r\n const client = event.ports && event.ports[0] || event.source;\r\n const payload = task.payload;\r\n\r\n if(payload.localNotifications) {\r\n getter.set('push_last_alive', Date.now());\r\n }\r\n\r\n if(pendingNotification &&\r\n client &&\r\n 'postMessage' in client) {\r\n client.postMessage(pendingNotification, []);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\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\n \r\n \r\n \r\n//import CacheStorageController from '../cacheStorage';\r\nimport type { Modify, WorkerTaskTemplate, WorkerTaskVoidTemplate } from '../../types';\r\nimport type { InputFileLocation, InputWebFileLocation, UploadFile } from '../../layer';\r\nimport type { WebPushApiManager } from '../mtproto/webPushApiManager';\r\nimport type { PushNotificationObject } from './push';\r\nimport type { ToggleStorageTask } from '../mtproto/mtprotoworker';\r\nimport type { MyUploadFile } from '../mtproto/apiFileManager';\r\nimport { logger, LogTypes } from '../logger';\r\nimport { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport { CACHE_ASSETS_NAME, requestCache } from './cache';\r\nimport onStreamFetch from './stream';\r\nimport { closeAllNotifications, onPing } from './push';\r\nimport CacheStorageController from '../cacheStorage';\r\n\r\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const deferredPromises: Map}> = new Map();\r\n\r\nexport interface RequestFilePartTask extends Modify {\r\n type: 'requestFilePart',\r\n payload: [number, InputFileLocation | InputWebFileLocation, number, number]\r\n};\r\n\r\nexport interface RequestFilePartTaskResponse extends Modify {\r\n type: 'requestFilePart',\r\n payload?: MyUploadFile,\r\n originalPayload?: RequestFilePartTask['payload']\r\n};\r\n\r\nexport interface ServiceWorkerPingTask extends WorkerTaskVoidTemplate {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: boolean,\r\n lang: {\r\n push_action_mute1d: string\r\n push_action_settings: string\r\n push_message_nopreview: string\r\n },\r\n settings: WebPushApiManager['settings']\r\n }\r\n};\r\n\r\nexport interface ServiceWorkerNotificationsClearTask extends WorkerTaskVoidTemplate {\r\n type: 'notifications_clear'\r\n};\r\n\r\nexport interface ServiceWorkerPushClickTask extends WorkerTaskVoidTemplate {\r\n type: 'push_click',\r\n payload: PushNotificationObject\r\n};\r\n\r\nexport type ServiceWorkerTask = RequestFilePartTaskResponse | ServiceWorkerPingTask | ServiceWorkerNotificationsClearTask | ToggleStorageTask;\r\n\r\n \r\nconst taskListeners: {\r\n [type in ServiceWorkerTask['type']]: (task: any, event: ExtendableMessageEvent) => void\r\n} = {\r\n notifications_clear: () => {\r\n closeAllNotifications();\r\n },\r\n ping: (task: ServiceWorkerPingTask, event) => {\r\n onPing(task, event);\r\n },\r\n requestFilePart: (task: RequestFilePartTaskResponse, e: ExtendableMessageEvent) => {\r\n const windowClient = e.source as WindowClient;\r\n const promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n return;\r\n }\r\n\r\n const promise = promises[task.id];\r\n if(promise) {\r\n if(task.error) {\r\n promise.reject(task.error);\r\n } else {\r\n promise.resolve(task.payload);\r\n }\r\n \r\n delete promises[task.id];\r\n }\r\n },\r\n toggleStorage: (task: ToggleStorageTask) => {\r\n CacheStorageController.toggleStorage(task.payload);\r\n }\r\n};\r\nctx.addEventListener('message', (e) => {\r\n const task = e.data as ServiceWorkerTask;\r\n const callback = taskListeners[task.type];\r\n if(callback) {\r\n callback(task, e);\r\n }\r\n});\r\n \r\n\r\n//const cacheStorage = new CacheStorageController('cachedAssets');\r\n/* let taskId = 0;\r\n\r\nexport function getTaskId() {\r\n return taskId;\r\n}\r\n\r\nexport function incrementTaskId() {\r\n return taskId++;\r\n} */\r\n\r\nconst onFetch = (event: FetchEvent): void => {\r\n if(event.request.url.indexOf(location.origin + '/') === 0 && event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)) {\r\n return event.respondWith(requestCache(event));\r\n }\r\n\r\n try {\r\n const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\r\n\r\n //log.debug('[fetch]:', event);\r\n \r\n switch(scope) {\r\n case 'stream': {\r\n onStreamFetch(event, params);\r\n break;\r\n }\r\n }\r\n } catch(err) {\r\n event.respondWith(new Response('', {\r\n status: 500,\r\n statusText: 'Internal Server Error',\r\n }));\r\n }\r\n};\r\n\r\nconst onChangeState = () => {\r\n ctx.onfetch = onFetch;\r\n};\r\n\r\nctx.addEventListener('install', (event) => {\r\n log('installing');\r\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\r\n});\r\n\r\nctx.addEventListener('activate', (event) => {\r\n log('activating', ctx);\r\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME));\r\n event.waitUntil(ctx.clients.claim());\r\n});\r\n\r\nctx.onerror = (error) => {\r\n log.error('error:', error);\r\n};\r\n\r\nctx.onunhandledrejection = (error) => {\r\n log.error('onunhandledrejection:', error);\r\n};\r\n\r\nctx.onoffline = ctx.ononline = onChangeState;\r\n\r\nonChangeState();\r\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/version b/public/version index fb832ba8..69bae3a6 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.4.0 (132) \ No newline at end of file +1.4.0 (133) \ No newline at end of file diff --git a/public/webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js b/public/webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js deleted file mode 100644 index 9812a4eb..00000000 --- a/public/webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var t={396:function(){!function(t){if(t.TextEncoder&&t.TextDecoder)return!1;function e(t="utf-8"){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${t}') is invalid.`)}function a(t="utf-8",e={fatal:!1}){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${t}') is invalid.`);if(e.fatal)throw new Error("Failed to construct 'TextDecoder': the 'fatal' option is unsupported.")}Object.defineProperty(e.prototype,"encoding",{value:"utf-8"}),e.prototype.encode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to encode: the 'stream' option is unsupported.");let a=0;const n=t.length;let r=0,i=Math.max(32,n+(n>>1)+7),s=new Uint8Array(i>>3<<3);for(;a=55296&&e<=56319){if(a=55296&&e<=56319)continue}if(r+4>s.length){i+=8,i*=1+a/t.length*2,i=i>>3<<3;const e=new Uint8Array(i);e.set(s),s=e}if(0!=(4294967168&e)){if(0==(4294965248&e))s[r++]=e>>6&31|192;else if(0==(4294901760&e))s[r++]=e>>12&15|224,s[r++]=e>>6&63|128;else{if(0!=(4292870144&e))continue;s[r++]=e>>18&7|240,s[r++]=e>>12&63|128,s[r++]=e>>6&63|128}s[r++]=63&e|128}else s[r++]=e}return s.slice(0,r)},Object.defineProperty(a.prototype,"encoding",{value:"utf-8"}),Object.defineProperty(a.prototype,"fatal",{value:!1}),Object.defineProperty(a.prototype,"ignoreBOM",{value:!1}),a.prototype.decode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to decode: the 'stream' option is unsupported.");const a=new Uint8Array(t);let n=0;const r=a.length,i=[];for(;n65535&&(e-=65536,i.push(e>>>10&1023|55296),e=56320|1023&e),i.push(e)}}return String.fromCharCode.apply(null,i)},t.TextEncoder=e,t.TextDecoder=a}("undefined"!=typeof window?window:"undefined"!=typeof self?self:this)}},e={};function a(n){var r=e[n];if(void 0!==r)return r.exports;var i=e[n]={exports:{}};return t[n].call(i.exports,i,i.exports,a),i.exports}(()=>{let t,e;const n=null;function r(t){return JSON.parse(JSON.stringify(t))}function i(e,a,n,r,i){for(t=0;t=0;--a)e=r(d(t[a],e));return e}function b(t){if(!t)throw Error("assert :P")}const w=function(){function a(t){return t==Pe||t==Le||t==Ce||t==Fe}function w(t){return m(t,1)}function p(t,e){const a=1+((t.la-1)*e>>8),n=a<<8;let r=0;for(t.Z>=n?(r=1,t.la-=a,t.Z-=n):(r=0,t.la=a);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return r}function g(t,e,a,r){(r-=a)>=2?(t.Z=e[a+0]<<8|e[a+1],t.qa=e,t.Ia=a+2,t.bc=r-2):(t.Z=0,t.qa=n,t.bc=0),t.la=255,t.gc=0}function m(t,e){var a=0,n=0;for(n=e-1;n>=0;n--)a|=p(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function A(t){t.g>=8&&y(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function E(t,e){let a=0;if(b(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return a;a=t.T>>t.g&sa[e],t.g+=e,t.g>=8&&t.g>=8&&y(t)}else t.fa=1;return a}function U(t){return t.Pa==t.gb}function x(t,e){return b(t!=n),0==e?0:(t.gb=2*e-1,t.Y=u(t.gb,Ia),t.Y==n?0:(t.Y[0].s=-1,t.Pa=1))}function R(t){t!=n&&(t.Y=n,t.Y=n,t.gb=0,t.Pa=0)}function T(t,e,a,n){for(var r=t.Y,i=0,s=+t.gb;n-- >0;){if(i>=s)return 0;if(r[i].s<0){if(U(t))return 0;const e=t,a=e.Y,n=+e.Pa;r[i].s=n-i,e.Pa+=2,a[n+0].s=-1,a[n+1].s=-1}else if(0==r[i].s)return 0;i+=r[i].s+(a>>n&1)}if(r[i].s<0)r[i].s=0;else if(0!=r[i].s)return 0;return r[i].kc=e,1}function z(t,e,a){var r=0;let i=0,s=0;for(b(t!=n),b(e!=n),r=0;r0&&(++i,s=r);if(!x(t,i))return 0;if(1==i)return s<0||s>=a?(R(t),0):T(t,s,0,0);if(i=0,s=d(a,0),s==n)return(i=i&&U(t))||R(t),i;var o=0;o=0,r=d(wa+1,0);let l=0;const f=d(wa+1,0);let h=0;for(b(e!=n),b(a>0),b(s!=n),o=0;oh&&(h=e[o]);if(h>wa)r=0;else{for(o=0;o0?f[e[o]]++:La;r=1}if(!r)return(i=i&&U(t))||R(t),i;for(r=0;r0&&!T(t,r,s[r],e[r]))return(i=i&&U(t))||R(t),i;return(i=U(t))||R(t),i}function S(t,e,a,n,r,i,s){var o=0;for(o=0;ot.P.v)&&(a=0==e)){t:{let e=t.Ga;var o=t.G,l=t.ub;a=t.P.l;let _=t.P.v;const w=t.Xb;var f=[n];let p=n,g=_*a;var h=n,c=n;c="WEBP_FILTER_TYPE";let m=0;f=0;var u=0;let v=0;if(b(a>0&&_>0&&s>=a),b(e!=n&&w!=n),l<=Ea)a=0;else if(v=e[o+0]>>0&3,c=e[o+0]>>2&3,m=e[o+0]>>4&3,f=e[o+0]>>6&3,vxa||c>=En||m>Ra||0!=f)a=0;else{if(v==Ua)u=l>=g,f=e,p=o+Ea;else{if(f=d(g,0),p=0,f==n){a=0;break t}u=o+Ea,l-=Ea,o=f,h=r(ta);let t=0;const i=jt();i==n?u=0:(i.l=a,i.v=_,i.N=h,ct(Te),h.put=ge,h.Mb=pe,h.Pb=me,h.ka=n,h.ka=o,h.fd=0,h.width=a,h.height=_,i.a=He,k(i.o,e,u,l),i.Wa=mn,Kt(a,_,1,i,n)&&Yt(i,a)&&(i.Wa=gn,t=Vt(i,i.V,i.Ha,i.l,i.v,qt)),i!=n&&Gt(i),u=t)}if(u){for(e=Un[c],e!=n?(h=d(g,0),h==n&&(u=0,v!=Ua&&(p=f=n)),e(f,p,a,_,1,a,h,c=0),g=h,v=c):(g=f,v=p),e=0;_-- >0;)i(w,e,g,v,a),v+=a,e+=s;m==Ra&&(u=f==n||p<=0||a<=0?0:1)}a=u}}a=!a}return a?n:0==e?t.Xb:+e*s}function B(t,e,a,r){if(r==n||t<=0||e<=0)return Ge;if(a!=n){if(a.Ua){const n=a.wc,r=a.vc,i=-2&a.t,s=-2&a.k;if(i<0||s<0||n<=0||r<=0||i+n>t||s+r>e)return Ge;t=n,e=r}if(a.I){if(a.Ba<=0||a.Aa<=0)return Ge;t=a.Ba,e=a.Aa}}return r.width=t,r.height=e,function(t){let e=t.width;const a=t.height;let r=t.J;if(e<=0||a<=0||!(r>=ze&&r=ze&&s=o*xn[s],r&=t.ma!=n):(f=(t=t.c.Va).nb*parseInt((l+1)/2,10),h=t.rb*parseInt((l+1)/2,10),c=t.Fa*l,r&=t.F*l<=t.Wc,r&=f<=t.Rc,r&=h<=t.Uc,r&=c<=t.Wb,r&=t.F>=o,r&=t.nb>=parseInt((o+1)/2,10),r&=t.rb>=parseInt((o+1)/2,10),r&=t.y!=n,r&=t.c!=n,r&=t.S!=n,s==We&&(r&=t.Fa>=o,r&=c<=t.Wb,r&=t.p!=n)):r=0,r?He:Ge}(r)}function D(t){return-256&t?t<0?0:255:t}function N(t,e,a,n){const r=d(16,0);let i,s;for(i=0,s=0;s<4;++s){var o=t[e+0]+t[e+8],l=t[e+0]-t[e+8],f=(t[e+4]*Nn>>16)-(t[e+12]*Dn>>16),h=(t[e+4]*Dn>>16)+(t[e+12]*Nn>>16);r[i+0]=o+h,r[i+1]=l+f,r[i+2]=l-f,r[i+3]=o-h,i+=4,e++}for(s=i=0;s<4;++s)o=(t=r[i+0]+4)+r[i+8],l=t-r[i+8],f=(r[i+4]*Nn>>16)-(r[i+12]*Dn>>16),h=(r[i+4]*Dn>>16)+(r[i+12]*Nn>>16),a[n+0+0*en]=D(a[n+0+0*en]+(o+h>>3)),a[n+1+0*en]=D(a[n+1+0*en]+(l+f>>3)),a[n+2+0*en]=D(a[n+2+0*en]+(l-f>>3)),a[n+3+0*en]=D(a[n+3+0*en]+(o-h>>3)),i++,n+=en}function I(t,e,a,n,r){N(t,e,a,n),r&&N(t,e+16,a,n+4)}function P(t,e,a,n){Cn(t,e+0,a,n+0,1),Cn(t,e+32,a,n+4*en,1)}function L(t,e,a,n){let r;for(t=t[e+0]+4,r=0;r<4;++r)for(e=0;e<4;++e)a[n+e+r*en]=D(a[n+e+r*en]+(t>>3))}function C(t,e,a,n){t[e+0]&&L(t,e+0,a,n+0),t[e+16]&&L(t,e+16,a,n+4),t[e+32]&&L(t,e+32,a,n+4*en),t[e+48]&&L(t,e+48,a,n+4*en+4)}function F(t,e,a){const n=e-en,r=On,i=255-t[n-1];let s;for(s=0;s>2}function M(t,e,a){let n,r;for(n=0;n<8;++n)for(r=0;r<8;++r)e[a+r+n*en]=t}function V(t,e,a){const n=t[e-a],r=t[e+0],i=3*(r-n)+zn[1020+t[e-2*a]-t[e+a]],s=Sn[112+(i+4>>3)];t[e-a]=On[255+n+Sn[112+(i+3>>3)]],t[e+0]=On[255+r-s]}function H(t,e,a,n){const r=t[e+0],i=t[e+a];return Rn[255+t[e-2*a]-t[e-a]]>n||Rn[255+i-r]>n}function G(t,e,a,n,r){const i=t[e-3*a],s=t[e-2*a],o=t[e-a],l=t[e+0],f=t[e+a],h=t[e+2*a],c=t[e+3*a];return 2*Rn[255+o-l]+Tn[255+s-f]>n?0:Rn[255+t[e-4*a]-i]<=r&&Rn[255+i-s]<=r&&Rn[255+s-o]<=r&&Rn[255+c-h]<=r&&Rn[255+h-f]<=r&&Rn[255+f-l]<=r}function K(t,e,a,n){let r;for(r=0;r<16;++r)2*Rn[255+t[e+r-a]-t[e+r+0]]+Tn[255+t[e+r-2*a]-t[e+r+a]]<=n&&V(t,e+r,a)}function Y(t,e,a,n){let r;for(r=0;r<16;++r)2*Rn[255+t[e+r*a-1]-t[e+r*a+0]]+Tn[255+t[e+r*a-2]-t[e+r*a+1]]<=n&&V(t,e+r*a,1)}function q(t,e,a,n){let r;for(r=3;r>0;--r)K(t,(e+=4*a)+0,a,n)}function J(t,e,a,n){let r;for(r=3;r>0;--r)Y(t,(e+=4)+0,a,n)}function $(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-2*i],o=n[r-i],f=n[r+0],h=n[r+i],c=n[r+2*i];var l=zn[1020+3*(f-o)+zn[1020+s-h]];const d=27*l+63>>7,u=18*l+63>>7;l=9*l+63>>7,n[r-3*i]=On[255+n[r-3*i]+l],n[r-2*i]=On[255+s+u],n[r-i]=On[255+o+d],n[r+0]=On[255+f-d],n[r+i]=On[255+h-u],n[r+2*i]=On[255+c-l]}e+=n}}function X(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-i],o=n[r+0],f=n[r+i];var l=3*(o-s);const h=Sn[112+(l+4>>3)];l=Sn[112+(l+3>>3)];const c=h+1>>1;n[r-2*i]=On[255+n[r-2*i]+c],n[r-i]=On[255+s+l],n[r+0]=On[255+o-h],n[r+i]=On[255+f-c]}e+=n}}function Q(t,e,a,n,r,i){$(t,e+0,a,1,16,n,r,i)}function tt(t,e,a,n,r,i){$(t,e+0,1,a,16,n,r,i)}function et(t,e,a,n,r,i){let s;for(s=3;s>0;--s)X(t,(e+=4*a)+0,a,1,16,n,r,i)}function at(t,e,a,n,r,i){let s;for(s=3;s>0;--s)X(t,(e+=4)+0,1,a,16,n,r,i)}function nt(t,e,a,n,r,i,s,o){$(t,e,r,1,8,i,s,o),$(a,n,r,1,8,i,s,o)}function rt(t,e,a,n,r,i,s,o){$(t,e,1,r,8,i,s,o),$(a,n,1,r,8,i,s,o)}function it(t,e,a,n,r,i,s,o){X(t,e+4*r,r,1,8,i,s,o),X(a,n+4*r,r,1,8,i,s,o)}function st(t,e,a,n,r,i,s,o){X(t,e+4,1,r,8,i,s,o),X(a,n+4,1,r,8,i,s,o)}function ot(t,e){return e==Fa?0==t.i?0==t.d?Ga:ja:0==t.d?Ha:Fa:e}function lt(e,a,n,r){for(t=0;t<4;++t)e[a+t]=n[r+t]}function ft(t,e){return t<0?0:t>e?e:t}function ht(t){t.a="VP8_STATUS_OK",t.xc="OK"}function ct(t){t>>>8!=Te>>>8&&alert("mismatch error")}function dt(t,e,a){return t.a==He&&(t.a=e,t.xc=a,t.za=0),0}function ut(e,a){let i=[0],s=0;var o=[0],l=r(on),f=r(ln);let h=r(na);if(o="VP8StatusCode",l=r(aa),e==n)return alert("(dec == null)"),0;if(ht(e),a==n)return dt(e,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(l.data=a.data,l.b=a.b,l.e=a.e,l.b=[l.b],l.e=[l.e],(o=Ae(l=[l]))!=He)return dt(e,o,"Incorrect/incomplete header.");if((l=l[0]).b=l.b[0],l.e=l.e[0],l.ia)return dt(e,Ke,"Unexpected lossless format encountered.");if(e.Ga==n&&(b(0==e.ub),e.Ga=l.$,e.G=l.G,e.ub=l.pa),s=l.data,i=l.b+l.offset,o=l.e-l.offset,b(l.e>=l.offset),o[0]<4)return dt(e,$e,"Truncated header.");if(h=s[i+0]|s[i+1]<<8|s[i+2]<<16,(l=e.Ac).fb=!(1&h)+0,l.Jc=h>>1&7,l.Nc=h>>4&1,l.Ra=h>>5,l.Jc>3)return dt(e,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!l.Nc)return dt(e,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(i+=3,o-=3,f=e.P,l.fb){if(o<7)return dt(e,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(o>=3&&157==s[i+0]&&1==s[i+1]&&42==s[i+2]))return dt(e,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(f.l=16383&(s[i+4]<<8|s[i+3]),f.gd=s[i+4]>>6,f.v=16383&(s[i+6]<<8|s[i+5]),f.hd=s[i+6]>>6,i+=7,o-=7,e.Ma=f.l+15>>4,e.hb=f.v+15>>4,a.width=f.l,a.height=f.v,a.I=0,a.Ua=0,a.k=0,a.t=0,a.Ka=a.width,a.K=a.height,a.m=a.width,a.h=a.height,h=e.R,t=0;to)return dt(e,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");h=e.o,g(h,s,i,i+l.Ra),i+=l.Ra,o-=l.Ra,l.fb&&(f.uc=w(h),f.$c=w(h)),f=h;var c=e.Ca;let d=e.R;if(b(f!=n),b(c!=n),c.pb=w(f),c.pb){if(c.ob=w(f),w(f)){var u;for(c.tb=w(f),u=0;u0)if(e.Ca.pb)for(d=0;do&&(y=f),g(e.ic[+k],d,u,A),d=y,u=A,c+=3}g(e.ic[+_],d,u,o),o=u0){e.yb[y]=e.yb[0];continue}A=o}const t=e.yb[y];t.sc[0]=ir[ft(A+f,127)],t.sc[1]=sr[ft(A+0,127)],t.sb[0]=2*ir[ft(A+c,127)],t.sb[1]=101581*sr[ft(A+d,127)]>>16,t.sb[1]<8&&(t.sb[1]=8),t.qc[0]=ir[ft(A+u,117)],t.qc[1]=sr[ft(A+_,127)]}if(!l.fb)return dt(e,Ye,"Not a key frame.");for(e.Zc=259,w(h),o=e.R,f=0;f<$a;++f)for(c=0;c0)+0],16==r||!p(t,s[0]))return r}else s=e[cr[r]][0];if(16==r)return 16}}function bt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*wr&4278190080)>>e}function wt(e,a){let r,f=0;if(e==n)return 0;if(a==n)return dt(e,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!e.za&&!ut(e,a))return 0;if(b(e.za),a.Mb&&!a.Mb(a))dt(e,Je,"Frame setup failed"),r=e.a;else{a.Za&&(e.A=0);const t=er[e.A];2==e.A?(e.lb=0,e.mb=0):(e.lb=a.t-t>>4,e.mb=a.k-t>>4,e.lb<0&&(e.lb=0),e.mb<0&&(e.mb=0)),e.Ya=a.K+15+t>>4,e.wb=a.Ka+15+t>>4,e.wb>e.Ma&&(e.wb=e.Ma),e.Ya>e.hb&&(e.Ya=e.hb),r=He}if(f=r==He){if(f){let t,r;t:{if(e.Ja=0,e.qb){const a=e.rc;if(!WebPWorkerReset(a)){t=dt(e,je,"thread initialization failed.");break t}a.Qd=e,a.Rd=e.oa.N,a.Ud=FinishRow,e.jb=e.A>0?ar:ar-1}else e.jb=nr;t=1}if(!(r=!t)){let t;t:{const a=e.jb,r=e.Ma,i=4*r,s=32*r,f=r+1,h=e.A>0?r*(e.qb?2:1):0,c=an,u=s*(16*a+parseInt(3*er[e.A]/2,10)),_=e.Ga!=n?e.P.l*e.P.v:0,w=i+s+f+h+c+384+u+_+tr;if(w!=w)t=0;else{if(w>e.Gb){if(e.ib=0,e.Gb=0,e.ib==n){t=dt(e,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}e.Gb=w}e.dc=205,e.Xc=l(205,16*r),e.Sc=l(205,8*r),e.Vc=l(205,8*r),e.M=h?o(dn,h):n,e.Sd=h?0:n,e.oa.ha=0,e.oa.M=e.M,b(0==(c&tr)),e.Ea=l(205,1*c),e.z=-12851,e.H=16*r,e.r=8*r;const s=er[e.A],p=s*e.H,g=s/2*e.r;e.ca=d(u,205),e.da=+p,e.aa=e.ca,e.ba=e.da+16*a*e.H+g,e.ra=e.aa,e.sa=e.ba+8*a*e.r+g,e.Xb=_?d(_,0):n,e.La=o(un,f),e.dc=l(Fa,i),t=1}}r=!t}if(r)f=0;else{if(a.width=e.P.l,a.height=e.P.v,a.w=0,a.y=e.ca,a.D=e.da,a.c=e.aa,a.B=e.ba,a.S=e.ra,a.C=e.sa,a.F=e.H,a.Da=e.r,a.p=n,a.q=n,!Bn){let t;for(t=-255;t<=255;++t)Rn[255+t]=t<0?-t:t,Tn[255+t]=Rn[255+t]>>1;for(t=-1020;t<=1020;++t)zn[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)Sn[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)On[255+t]=t<0?0:t>255?255:t;Bn=1}Cn=I,Fn=P,Zn=L,Wn=C,Mn=Q,Vn=tt,Hn=nt,jn=rt,Gn=et,Kn=at,Yn=it,qn=st,Jn=K,$n=Y,Xn=q,Qn=J,f=1}}if(f)t:{for(e.d=0;e.d0&&o.d>=o.mb&&o.d<=o.Ya)+0,e.i=0;e.i0);m=-v,O[O[O.length-1]+g]=m,u[_]=m,_++}I[w]=m}}else{for(m=p(o,156)?p(o,128)?Va:Ma:p(o,163)?Wa:Za,a.Eb[0]=m,v=0;v<4;++v)O[v+O[O.length-1]]=m;for(v=0;v<4;++v)I[v]=m}if(a.Tc=p(o,142)?p(o,114)?p(o,183)?Va:Ma:Wa:Za,o.Ab)c=0;else{if(b.Nb)h.X=b.X=0,a.wa||(h.ua=b.ua=0),a.ja=0,a.Oa=0;else{let t=0,e=0;var k=0,y=_r;const r=a.yb[a.Lb];var A=a.z;const i=a.La[0],o=d(4,0),f=d(4,0);let h=d(4,0),c=d(4,0),u=0,_=0;var E=0;let w=0,p=0;if(A=l(0,384),a.wa)k=0,y=a.R.z[3];else{const t=d(16,0);var U=b.ua+i.ua;b.ua=i.ua=(_t(n,a.R.z[1],U,r.sb,0,t)>0)+0,k=1,y=a.R.z[0];var x=t,R=A,T=d(16,0),z=0;for(z=0;z<4;++z){var S=x[0+z]+x[12+z],B=x[4+z]+x[8+z],D=x[4+z]-x[8+z],N=x[0+z]-x[12+z];T[0+z]=S+B,T[8+z]=S-B,T[4+z]=N+D,T[12+z]=N-D}for(z=0;z<4;++z){const t=R[R.length-1],e=T[0+4*z]+3;S=e+T[3+4*z],B=T[1+4*z]+T[2+4*z],D=T[1+4*z]-T[2+4*z],N=e-T[3+4*z],R[t+0]=S+B>>3,R[t+16]=N+D>>3,R[t+32]=S-B>>3,R[t+48]=N-D>>3,R[R.length-1]+=64}A[A.length-1]=0}for(h=s(br[15&b.X]),c=s(br[15&i.X]),w=0;w<4;++w){var F=c[w];for(E=0;E<4;++E){U=F+h[E];var Z=_t(n,y,U,r.sc,k,A);h[E]=F=(Z>0)+0,f[E]=(0!=A[A[A.length-1]+0])+0,o[E]=(Z>1)+0,A[A.length-1]+=16}c[w]=F,_|=bt(f,24-4*w),u|=bt(o,24-4*w)}for(t=bt(h,24),e=bt(c,24),h=s(br[b.X>>4]),c=s(br[i.X>>4]),p=0;p<4;p+=2){for(w=0;w<2;++w){for(F=c[p+w],E=0;E<2;++E)U=F+h[p+E],Z=_t(n,a.R.z[2],U,r.qc,0,A),h[p+E]=F=(Z>0)+0,f[2*w+E]=(0!=A[A[A.length-1]+0])+0,o[2*w+E]=(Z>1)+0,A[A.length-1]+=16;c[p+w]=F}_|=bt(f,8-2*p),u|=bt(o,8-2*p)}t|=bt(h,20),e|=bt(c,20),b.X=t,i.X=e,a.z=A,a.Oa=u+0,a.ja=u|_,b.Nb=!a.ja+0}c=!n.Ab}if(!c){f=dt(e,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${e.i} ${e.d}`);break t}const P=e,L=P.Ea,C=nn,K=P.Ea,Y=rn,q=P.Ea,J=sn;if(P.i>0){var W=0;for(W=-1;W<16;++W)lt(L,C+W*en-4,L,C+W*en+12);for(W=-1;W<8;++W)lt(K,Y+W*en-4,K,Y+W*en+4),lt(q,J+W*en-4,q,J+W*en+4)}else{for(W=0;W<16;++W)L[C+W*en-1]=129;for(W=0;W<8;++W)K[Y+W*en-1]=129,q[J+W*en-1]=129;P.d>0&&(L[C-1-en]=K[Y-1-en]=q[J-1-en]=129)}const Q=P.Xc,tt=16*+P.i,et=P.Sc,at=8*+P.i,nt=P.Vc,rt=8*+P.i,it=P.z;let st=0;if(P.d>0)i(L,C-en,Q,tt,16),i(K,Y-en,et,at,8),i(q,J-en,nt,rt,8);else if(0==P.i){for(t=0;t<21;++t)L[C-en-1+t]=127;for(t=0;t<9;++t)K[Y-en-1+t]=127;for(t=0;t<9;++t)q[J-en-1+t]=127}if(P.wa){const t=C-en+16;P.d>0&&(P.i>=P.Ma-1?L[t+0]=L[t+1]=L[t+2]=L[t+3]=Q[tt+15]:i(L,t+0,Q,tt+16,4));for(let e=0;e<4;++e)L[e+t+4*en]=L[e+t+4*en]=L[e+t+8*en]=L[e+t+12*en]=L[e+t+0];for(st=0;st<16;st++){var M=L,V=C+rr[st];In[P.Eb[st]](M,V),P.Oa&1<0){const t=ut.M[1+ut.i],e=ut.La[1+ut.i].Nb;let a=ut.Zb[ut.Lb];ut.ga.oc&&(a+=ut.ga.Lc[0],ut.wa&&(a+=ut.ga.Gc[0])),a=a<0?0:a>63?63:a,t.zc=a,ut.ga.kb>0&&(a=ut.ga.kb>4?a>>2:a>>1,a>9-ut.ga.kb&&(a=9-ut.ga.kb)),t.yc=a<1?1:a,t.ab=(!e||ut.wa)+0}var G=0,$=8*ut.Ja*ut.r,X=ut.ca,ft=ut.da+16*ut.i+16*ut.Ja*ut.H,ht=ut.aa,ct=ut.ba+8*ut.i+$,wt=ut.ra,gt=ut.sa+8*ut.i+$;for(G=0;G<16;++G)i(X,ft+G*ut.H,ut.Ea,+nn+G*en,16);for(G=0;G<8;++G)i(ht,ct+G*ut.r,ut.Ea,+rn+G*en,8),i(wt,gt+G*ut.r,ut.Ea,+sn+G*en,8)}const P=e,L=a;var mt=1;const C=P.oa;if(P.qb){const t=P.rc;if(mt&=WebPWorkerSync(t),b(t.a==OK),mt){if(C.N=L,C.ha=P.Ja,C.d=P.d,C.W=P.W,C.W){const t=C.M;C.M=P.M,P.M=t}WebPWorkerLaunch(t),++P.Ja==P.jb&&(P.Ja=0)}}else{C.d=P.d,C.W=P.W;e:{let t=1;const e=P.oa,a=er[P.A],r=a*P.H,s=parseInt(a/2)*P.r,o=16*e.ha*P.H,l=8*e.ha*P.r,f=P.ca,h=P.da-r+o,c=P.aa,d=P.ba-s+l,u=P.ra,_=P.sa-s+l,w=0==e.d,p=(e.d>=P.hb-1)+0;var vt=16*e.d;let g=16*(e.d+1);if(e.W){const t=P;let e=0;const a=t.oa.d;for(b(t.oa.W),e=t.lb;e0&&$n(f,h,o,u+4),l.ab&&Qn(f,h,o,u),i>0&&Jn(f,h,o,u+4),l.ab&&Xn(f,h,o,u);else{const t=n.r,e=n.aa,a=n.ba+8*s.ha*t+8*r,_=n.ra,b=n.sa+8*s.ha*t+8*r,w=n.Ac.fb?c>=40?2:c>=15?1:0:c>=40?3:c>=20?2:c>=15?1:0;r>0&&(Vn(f,h,o,u+4,d,w),jn(e,a,_,b,t,u+4,d,w)),l.ab&&(Kn(f,h,o,u,d,w),qn(e,a,_,b,t,u,d,w)),i>0&&(Mn(f,h,o,u+4,d,w),Hn(e,a,_,b,t,u+4,d,w)),l.ab&&(Gn(f,h,o,u,d,w),Yn(e,a,_,b,t,u,d,w))}}}if(L.put){if(w?(L.y=P.ca,L.D=P.da+o,L.c=P.aa,L.B=P.ba+l,L.S=P.ra,L.C=P.sa+l):(vt-=a,L.y=f,L.D=h,L.c=c,L.B=d,L.S=u,L.C=_),p||(g-=a),g>L.K&&(g=L.K),P.Ga!=n&&vt>1),L.C+=P.r*(t>>1),L.p!=n&&(L.q+=L.width*t)}vt>1,L.C+=L.t>>1,L.p!=n&&(L.q+=L.t),L.w=vt-L.k,L.m=L.Ka-L.t,L.h=g-vt,t=L.put(L))}e.ha+1==P.jb&&!p&&(i(P.ca,P.da-r,f,h+16*P.H,r),i(P.aa,P.ba-s,c,d+8*P.r,s),i(P.ra,P.sa-s,u,_+8*P.r,s)),mt=t}}if(!mt){f=dt(e,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let r;if(!(r=e.qb&&!WebPWorkerSync(e.rc))){let t;(t=e.fc>0)&&(b(e),b(e.fc>0),t=!1),r=t}f=r?0:1}const r=f;a.Pb&&a.Pb(a),f=1&r}return f?(e.za=0,f):(pt(e),0)}function pt(t){t!=n&&(t.ib&&(t.ib=0),t.ib=n,t.Gb=0,t.za=0)}function gt(t,e){return t+(1<>e}function mt(t,e,a,n,r){const i=Zr[a]+Wr[e]>>pr;e=Fr[e],n[r+0]=Mr[t+Cr[a]-gr],n[r+1]=Mr[t+i-gr],n[r+2]=Mr[t+e-gr]}function vt(t,e,a,n,r){const i=Zr[a]+Wr[e]>>pr;e=Fr[e],n[r+0]=248&Mr[t+Cr[a]-gr]|Mr[t+i-gr]>>5,n[r+1]=Mr[t+i-gr]<<3&224|Mr[t+e-gr]>>3}function kt(t,e,a,n,r){n[r+0]=255,mt(t,e,a,n,r+1)}function yt(t,e,a,n,r){const i=Fr[e];n[r+0]=Vr[t+Cr[a]-gr]<<4|Vr[t+(Zr[a]+Wr[e]>>pr)-gr],n[r+1]=15|Vr[t+i-gr]<<4}function At(t,e,a,n,r){const i=Cr[a];a=Zr[a]+Wr[e]>>pr,n[r+0]=Mr[t+Fr[e]-gr],n[r+1]=Mr[t+a-gr],n[r+2]=Mr[t+i-gr]}function Et(t,e,a,n,r){At(t,e,a,n,r),n[r+3]=255}function Ut(t,e,a,n,r){mt(t,e,a,n,r),n[r+3]=255}function xt(t,e,a){t[e]=((((4278255360&t[e])>>>0)+((4278255360&a)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&a)&16711935)>>>0}function Rt(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Tt(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function zt(t,e){return Tt(t+parseInt((t-e)/2,10))}function St(){return _a}function Ot(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Bt(t,e,a,n,r,i,s){var o=0;const l=8>>t.n,f=t.U,h=t.u;if(l<8){t=(1<>8&255),i[s++]=h[e&c],e>>=l}}else for(o=e;o>8&255]}function Dt(t,e,a,n,r){for(a=e+a;e>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255,n[r++]=a>>24&255}}function Nt(t,e,a,n,r){for(a=e+a;e>16&240|a>>12&15,n[r++]=a>>0&240|a>>28&15}}function It(t,e,a,n,r){for(a=e+a;e>24&255,n[r++]=a>>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255}}function Pt(t,e,a,n){return E(t,8)!=la?0:(e[0]=E(t,fa)+1,a[0]=E(t,fa)+1,n[0]=E(t,1),E(t,ha),1)}function Lt(t,e){let a=0;return t<4?t+1:(a=t-2>>1,(2+(1&t)<e.ya){var a=t.Y,r=0;for(b(a!=n);0!=a[r].s;){var i=a,s=e;const t=s.T>>s.g&1;s.L?s.fa=1:(++s.g,s.g>=8&&y(s),s.Q==s.ya&&32==s.g&&(s.L=1)),r=r+i[r].s+t}return a[r].kc}for(r=0,b((a=t.Y)!=n);0!=a[r].s;)i=a,s=e.T>>e.g&1,++e.g,r=r+i[r].s+s;return a[r].kc}function Ft(t,e){if(t!=n){var a=0,r=0;for(a=0;a>t.eb)+(e>>t.eb)])0;){e=t.nc[o];let R=l;var u=c,_=d;switch(d=s,c=a,b(R<(w=h)),b(w<=e.Vb),e.Qc){case ya:for(u=0,e=c+(w-R)*e.U;c>8&255,g=16711935&(g=(g=(16711935&w[_])>>>0)+(p<<16|p));d[c++]=((4278255360&w[_])>>>0|g)>>>0,32==R&&u++}break;case va:var m=R;if(u=w,_=d,p=c,g=(E=e).U,0==m){var v=0;for(xt(_,p,_a),v=1;v>E.n)*y;m>8&15],v=1;v>8&15]),e=t(_[p+v-1],_,p+v-g),xt(_,p+v,e)}p+=g,0==(++m&k)&&(E+=y)}w!=e.Vb&&i(d,c-(e=e.U),d,c+(w-R-1)*e,e);break;case ka:for(u=e.U,_=(1<>e.n)*p;R>0&255,E.Bc=A>>8&255,E.Kc=A>>16&255),E=(A=d[c+y])>>>8,U=A>>>16,x=A,U+=Ot(k.Cc,E),U&=255,x+=Ot(k.Bc,E),x+=Ot(k.Kc,U),x&=255,d[c+y]=(4278255360&A|U<<16|x)>>>0;c+=u,++R,0==(R&_)&&(e+=p)}break;case Aa:u==d&&e.n>0?(u=(w-R)*gt(e.U,e.n),f(d,_=c+(w-R)*e.U-u,d,c,u),Bt(e,R,w,d,_,d,c)):Bt(e,R,w,u,_,d,c)}c=s,d=a}}function Mt(t,e){var a=t.V,n=t.Ha+t.l*t.O;if(!((i=e-t.O)<=0)){Wt(t,i,a,n);var r=t.N;a=t.Xa;let d=[t.vb];n=t.O;var i=e,s=d,o=r.width;if(b(nr.K&&(i=r.K),n=i?n=0:(s[0]+=r.t,r.w=n-r.k,r.m=r.Ka-r.t,r.h=i-n,n=1),n){if(d=d[0],n=t.Ib,i=r.width,n.J0;){const t=a;let n=d,r=l;const h=s;let u=e;switch(o){case ze:for(r=n+r;n>16&255,h[u++]=c>>8&255,h[u++]=c>>0&255}break;case Se:Dt(t,n,r,h,u);break;case Pe:Dt(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case Oe:for(r=n+r;n>0&255,h[u++]=c>>8&255,h[u++]=c>>16&255;break;case Be:It(t,n,r,h,u);break;case Le:It(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case De:It(t,n,r,h,u);break;case Ce:It(t,n,r,h,u),WebPApplyAlphaMultiply(h,1,r,1,0);break;case Ne:Nt(t,n,r,h,u);break;case Fe:Nt(t,n,r,h,u),WebPApplyAlphaMultiply4444(h,r,1,0);break;case Ie:for(r=n+r;n>16&248|c>>13&7,h[u++]=c>>5&224|c>>3&31;break;default:b(0)}d+=i,e+=f}a=r}t.xa+=a}else t.xa=r.I?EmitRescaledRowsYUVA(t,a,d,i,r.h):EmitRowsYUVA(t,a,d,i,r.m,r.h);b(t.xa<=n.height)}t.O=e,b(t.O<=t.v)}}function Vt(t,e,a,r,i,s){let o=1,l=0,f=0;const h=t.o,c=t.cb;let d=c.Db,u=a,_=a;a+=r*i;const w=(i=pa+ga)+c.xb,p=c.xb>0?c.Yb:n,g=c.Dc;let m=!1;for(b(d!=n);!h.L&&u>>0)+(m<<16)+(o<<8)+v}if(m=!1,++u,++l,l>=r&&(l=0,++f,s!=n&&f%yr==0&&s(t,f),p!=n))for(;_>>p.bb]=o}else if(yIr?v-=Ir:(y=Pr[v-1],y=(y>>4)*r+(8-(15&y)),v=y>=1?y:1),y=0,y=0;y=r;)l-=r,++f,s!=n&&f%yr==0&&s(t,f);if(u>>p.bb]=o}else if(y>>p.bb]=y;y=e,v=u,b(m<=-1>>>(k=p).bb),y[v]=k.ea[m],m=!0;continue}(o=!h.fa)||End}return s!=n&&s(t,f),h.fa||!o||h.L&&u16?0:w>4?1:w>2?2:3,_[0]=gt(o.U,p),o.n=p,_=p=Kt(w,1,0,S,o.u))if(_=w,p=0,w=1<<(8>>>(S=o).n)>>>0,(g=Array(w))==n)_=0;else{m=S.u[0];var v=S.b;for(g[0]=S.u[0][S.b+0],p=1;p<_;++p)g[p]=((((4278255360&m[v+p])>>>0)+((4278255360&g[p-1])>>>0)&4278255360)>>>0|(16711935&m[v+p])+(16711935&g[p-1])&16711935)>>>0;for(;p=1&&c<=da)){i.a=Ke;break}if(o)t:{o=i;var k=t[0],y=e[0],S=(_=c,v=m=0,v=o.o,o.cb);if(p=[n],w=n,g=1,a&&E(v,1)){if(y=(k=gt(k,m=E(v,3)+2))*(O=gt(y,m)),!Kt(k,O,0,o,p)){o.a=Ke,Ft(w,g),o=0;break t}for(p=p[0],S.eb=m,m=0;m>>8&65535,p[m]=k,k>=g&&(g=k+1)}if(v.fa)Ft(w,g),o=0;else if(b(g<=65536),(w=u(g,kn))==n)o.a=je,Ft(w,g),o=0;else{for(m=0;m0&&(k+=1<<_);e:{const t=k;k=o;const e=y[+v];var O,B=0;if(E(O=k.o,1)){var D=Array(2),N=Array(2),I=Array(2),P=(B=E(O,1)+1,E(O,1));D[0]=E(O,0==P?1:8),N[0]=0,I[0]=B-1,2==B&&(D[1]=E(O,8),N[1]=1,I[1]=B-1);a:{P=0;var L=0;if(b(e!=n),b(I!=n),b(N!=n),b(D!=n),x(e,B)){for(L=0;L=t){(P=P&&U(e))||R(e),B=P;break a}if(!T(e,D[L],N[L],I[L])){(P=P&&U(e))||R(e),B=P;break a}}(P=(P=1)&&U(e))||R(e),B=P}else B=0}}else{if(B=0,N=[],(D=E(O,4)+4)>Dr){k.a=Ke,k=0;break e}if(I=Array(t),I==n){k.a=je,k=0;break e}for(B=0;BN){B.a=Ke,R(i),B=P;break a}}else a=N;for(e=0;eN){B.a=Ke,R(i),B=P;break a}for(C=C?n:0;F-- >0;)D[e++]=C}}P=1,R(i),B=P}else B.a=Ke,B=0}B&&(B=z(e,I,t))}(B=B&&!O.fa)?k=1:(k.a=Ke,k=0)}if(!k){Ft(w,g),o=0;break t}}S.ac=p,S.hc=g,S.Db=w,o=1}}if(!o){i.a=Ke;break}if(c>0){if(f.xb=1<0),_.ea=d(S,0),_.ea==n?c=0:(_.bb=32-c,c=1),!c){i.a=je,o=0;break}}else f.xb=0;if(c=i,_=t[0],S=e[0],w=(p=c.cb).eb,c.l=_,c.v=S,p.Ec=gt(_,w),p.Dc=0==w?-1:(1<>>8&255;t.O=t.xa=e}}function ft(t,e){return t<0?0:t>e?e:t}function Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g){let m;const v=w-1>>1;let k=r[i+0]|s[o+0]<<16,y=l[f+0]|h[c+0]<<16;if(t){var A=3*k+y+131074>>2;p(t[e+0],255&A,A>>16,d,u)}for(a&&(A=3*y+k+131074>>2,p(a[n+0],255&A,A>>16,_,b)),m=1;m<=v;++m){const w=r[i+m]|s[o+m]<<16,v=l[f+m]|h[c+m]<<16;A=k+w+y+v+524296;const E=A+2*(w+y)>>3,U=A+2*(k+v)>>3;t&&(A=E+k>>1,k=U+w>>1,p(t[e+2*m-1],255&A,A>>16,d,u+(2*m-1)*g),p(t[e+2*m-0],255&k,k>>16,d,u+(2*m-0)*g)),a&&(A=U+y>>1,k=E+v>>1,p(a[n+2*m-1],255&A,A>>16,_,b+(2*m-1)*g),p(a[n+2*m+0],255&k,k>>16,_,b+(2*m+0)*g)),k=w,y=v}1&w||(t&&(A=3*k+y+131074>>2,p(t[e+w-1],255&A,A>>16,d,u+(w-1)*g)),a&&(A=3*y+k+131074>>2,p(a[n+w-1],255&A,A>>16,_,b+(w-1)*g)))}function $t(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,mt,3)}function Xt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,At,3)}function Qt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Ut,4)}function te(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Et,4)}function ee(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,kt,4)}function ae(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,yt,2)}function ne(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,vt,2)}function re(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_){let b;for(b=0;b0;){var s=t,o=e+(a?1:0),l=t,f=e+(a?0:3),h=0;for(h=0;h>1)*a.nb,l=a.S,f=a.C+(t.w>>1)*a.rb,h=t.m,c=t.h,d=parseInt((h+1)/2,10),u=parseInt((c+1)/2,10);let _;for(_=0;_>4;h[c+2*u]=240&h[c+2*u]|t,d&=t}i+=t.width,c+=l.f}15!=d&&a(o)&&WebPApplyAlphaMultiply4444(h,s,n,f,l.f)}return 0}function pe(t){let e=t.ka;const r=e.j.J,i=r>1,r=t.m+2*a;let i;const s=[];for(i=0;i>pr,Wr[t]=-22014*(t-128)+Lr,Zr[t]=-45773*(t-128),Fr[t]=113618*(t-128)+Lr>>pr;for(t=gr;t>pr,Mr[t-gr]=ft(e,255),Vr[t-gr]=ft(e+8>>4,15);Hr=1}return 1}function ge(t){const e=t.ka;let a=t.m;const n=t.h;return b(!(1&t.w)),a<=0||n<=0?0:(a=e.$a(t,e),e.ec+=a,e.zb&&e.zb(t,e),1)}function me(t){(t=t.ka).memory="",t.memory=n}function ve(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function ke(t,e){return(ve(t,e)|t[e+3]<<24)>>>0}function ye(t,e,a,i,s,o,l){var f=0,h=[0],d="VP8StatusCode";const u=r(aa);if(t==n||a[0]=Sa&&!c(t,e[0],"RIFF",Ta)){if(c(t,e[0]+8,"WEBP",Ta)){d=Ke;break t}if((g=ke(t,e[0]+Ta))0,g=[0];t:if(d=za+Oa,b(t!=n),b(a!=n),b(h!=n),h[0]=0,a[0]=Da){d=Ke;break t}g!=n&&(g[0]=p),i!=n&&(i[0]=_),s!=n&&(s[0]=w),e[0]+=d,a[0]-=d,h[0]=1}d=He}if(d!=He)return d;if(!f&&h[0])return Ke;if(o!=n&&(o[0]=!!(g[0]&Ba)),h&&l==n)return He;if(a0&&r>h){d=Ke;break t}if(p=_&&w>h-_){d=Ke;break t}f[0]=w,e[0]+=za,a[0]-=za,g[0]=d}else g[0]=a>=1&&t[e+0]==la,f[0]=a[0];d=He}if(u.ta=u.ta[0],u.ia=u.ia[0],d!=He)return d;if(u.ta>Na)return Ke;if(u.ia){if(a[0]=3&&157==t[h+3+0]&&1==t[h+3+1]&&42==t[h+3+2]?(f=t[h+0]|t[h+1]<<8|t[h+2]<<16,g=16383&(t[h+7]<<8|t[h+6]),t=16383&(t[h+9]<<8|t[h+8]),!(!(1&f)+0)||(f>>1&7)>3||!(f>>4&1)||f>>5>=u.ta?t=0:(i&&(i[0]=g),s&&(s[0]=t),t=1)):t=0}return t?(o!=n&&(o[0]|=u.$!=n),l!=n&&(l[0]=u,l[0].offset=e[0]-l[0].b,b(e[0]-l[0].b0,e.Ua&&(l=t.wc,f=t.vc,s=t.t,o=t.k,ar||o+f>i))return 0;if(e.t=s,e.k=o,e.Ka=s+l,e.K=o+f,e.m=l,e.h=f,e.I=t!=n&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==n||!t.ed,e.I&&(e.Za=e.Ba<3*r/4&&e.Aa<3*i/4,e.Bb=0),1}var Te=512,ze=0,Se=1,Oe=2,Be=3,De=4,Ne=5,Ie=6,Pe=7,Le=8,Ce=9,Fe=10,Ze=11,We=12,Me=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var Ve={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:d(4,0),Jb:n,jc:0},He=0,je=1,Ge=2,Ke=3,Ye=4,qe=5,Je=6,$e=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var Xe={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:d(3,0)};this.WebPGetFeatures=this.Md=function(t,e,a){let r="VP8StatusCode";return Te>>>8!=Te>>>8||a==n?t=Ge:(r=xe(t,[0],e=[e],a),t=r==$e?Ke:r),t};const Qe={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:d(6,0)};this.WebPDecoderConfig=this.Kd={input:r(Xe),j:r(Ve),options:r(Qe)},this.WebPInitDecoderConfig=this.Nd=function(t){return Te>>>8!=Te>>>8||t==n?t=0:(b((t=t.input)!=n),t.tc=0,t=1),t};var ta={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},ea={j:r(Ve),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:r(Qe),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},aa={data:0,b:0,e:0,offset:0,$:n,G:0,pa:0,ta:0,na:0,ia:0},na={qa:0,Ia:n,Pd:0,Ab:0,la:0,Z:0,gc:0},ra={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},ia=25,sa=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],oa=10,la=47,fa=14,ha=3,ca=5,da=11,ua=5,_a=4278190080,ba=8,wa=15,pa=256,ga=24,ma=4,va=0,ka=1,ya=2,Aa=3,Ea=1,Ua=0,xa=1,Ra=1,Ta=4,za=8,Sa=12,Oa=10,Ba=16,Da=1*Math.pow(2,32),Na=-1-za-1>>>0,Ia={kc:0,s:0},Pa={Y:"HuffmanTreeNode*",gb:0,Pa:0},La=-1;var Ca=506832829,Fa=0,Za=Fa,Wa=2,Ma=3,Va=1,Ha=4,ja=5,Ga=6,Ka=3,Ya=4,qa=4,Ja=4,$a=4,Xa=8,Qa=3,tn=11,en=32,an=17*en+9*en,nn=1*en+8,rn=nn+16*en+en,sn=rn+16,on={fb:0,Jc:0,Nc:0,Ra:0},ln={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const fn={pb:0,ob:0,tb:0,Kb:d(Ya,0),Cb:d(Ya,0)},hn={Ta:d(Ka,0),z:_([$a,Xa,Qa,tn],0)},cn={Oc:0,Fb:0,kb:0,oc:0,Lc:d(qa,0),Gc:d(qa,0)};var dn={zc:0,yc:0,ab:0},un={X:0,ua:0,Nb:0};const _n=d(2,0),bn={sc:r(_n),sb:r(_n),qc:r(_n)},wn={ha:0,d:0,W:0,M:dn,N:ta};var pn={a:"VP8StatusCode",za:0,xc:0,o:r(na),Ac:r(on),P:r(ln),ga:r(cn),Ca:r(fn),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:wn,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:u(8,na),Zc:0,yb:u(Ya,bn),R:r(hn),pc:0,Pc:0,dc:0,cc:d(4,0),Xc:0,Sc:0,Vc:0,La:r(un),M:r(dn),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:d(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:d(Ya,0),Ga:n,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},gn=0,mn=1,vn=2;var kn={va:u(ua,Pa)};const yn={xb:0,Yb:r({ea:0,bb:0}),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var An={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:r(ra),l:0,v:0,O:0,xa:0,cb:r(yn),Na:0,nc:u(ma,{Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0}),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},En=4,Un=[n,function(t,e,a,r,s,o,l,f){let h=0,c=f;for(b(t!=n),b(l!=n),b(a>0),b(r>0),b(s>0),b(o>=a*s),h=0;h0),b(r>0),b(s>0),b(o>=a*s),i(l,f,t,e,s),S(t,e+s,l,c,l,f+s,s*(a-1)),h=1;h0),b(r>0),b(s>0),b(o>=a*s),i(l,f,t,e,s),S(t,e+s,l,h,l,f+s,s*(a-1)),c=1;c255?255:a)&255}}}],xn=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=n&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=n)},e=this;var Rn=d(511,0),Tn=d(511,0),zn=d(2041,0),Sn=d(225,0),On=d(766,0),Bn=0,Dn=85627,Nn=35468,In=[function(t,e){let a,n=4;for(a=0;a<4;++a)n+=t[e+a-en]+t[e-1+a*en];for(n>>=3,a=0;a<4;++a)h(t,e+a*en,n,4)},function(t,e){F(t,e,4)},function(t,e){let a=e-en;const n=[];for(n.push(W(t[a-1],t[a+0],t[a+1])),n.push(W(t[a+0],t[a+1],t[a+2])),n.push(W(t[a+1],t[a+2],t[a+3])),n.push(W(t[a+2],t[a+3],t[a+4])),a=0;a<4;++a)i(t,e+a*en,n,0,4)},function(t,e){const a=t[e-1],n=t[e-1+en],r=t[e-1+2*en],i=t[e-1+3*en];t[e+0+0*en]=t[e+1+0*en]=t[e+2+0*en]=t[e+3+0*en]=W(t[e-1-en],a,n),t[e+0+1*en]=t[e+1+1*en]=t[e+2+1*en]=t[e+3+1*en]=W(a,n,r),t[e+0+2*en]=t[e+1+2*en]=t[e+2+2*en]=t[e+3+2*en]=W(n,r,i),t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=W(r,i,i)},function(t,e){const a=t[e-1+0*en],n=t[e-1+1*en],r=t[e-1+2*en],i=t[e-1-en],s=t[e+0-en],o=t[e+1-en],l=t[e+2-en],f=t[e+3-en];t[e+0+3*en]=W(n,r,t[e-1+3*en]),t[e+0+2*en]=t[e+1+3*en]=W(a,n,r),t[e+0+1*en]=t[e+1+2*en]=t[e+2+3*en]=W(i,a,n),t[e+0+0*en]=t[e+1+1*en]=t[e+2+2*en]=t[e+3+3*en]=W(s,i,a),t[e+1+0*en]=t[e+2+1*en]=t[e+3+2*en]=W(o,s,i),t[e+2+0*en]=t[e+3+1*en]=W(l,o,s),t[e+3+0*en]=W(f,l,o)},function(t,e){const a=t[e-1+0*en],n=t[e-1+1*en],r=t[e-1+2*en],i=t[e-1-en],s=t[e+0-en],o=t[e+1-en],l=t[e+2-en],f=t[e+3-en];t[e+0+0*en]=t[e+1+2*en]=i+s+1>>1,t[e+1+0*en]=t[e+2+2*en]=s+o+1>>1,t[e+2+0*en]=t[e+3+2*en]=o+l+1>>1,t[e+3+0*en]=l+f+1>>1,t[e+0+3*en]=W(r,n,a),t[e+0+2*en]=W(n,a,i),t[e+0+1*en]=t[e+1+3*en]=W(a,i,s),t[e+1+1*en]=t[e+2+3*en]=W(i,s,o),t[e+2+1*en]=t[e+3+3*en]=W(s,o,l),t[e+3+1*en]=W(o,l,f)},function(t,e){const a=t[e+1-en],n=t[e+2-en],r=t[e+3-en],i=t[e+4-en],s=t[e+5-en],o=t[e+6-en],l=t[e+7-en];t[e+0+0*en]=W(t[e+0-en],a,n),t[e+1+0*en]=t[e+0+1*en]=W(a,n,r),t[e+2+0*en]=t[e+1+1*en]=t[e+0+2*en]=W(n,r,i),t[e+3+0*en]=t[e+2+1*en]=t[e+1+2*en]=t[e+0+3*en]=W(r,i,s),t[e+3+1*en]=t[e+2+2*en]=t[e+1+3*en]=W(i,s,o),t[e+3+2*en]=t[e+2+3*en]=W(s,o,l),t[e+3+3*en]=W(o,l,l)},function(t,e){const a=t[e+0-en],n=t[e+1-en],r=t[e+2-en],i=t[e+3-en],s=t[e+4-en],o=t[e+5-en],l=t[e+6-en],f=t[e+7-en];t[e+0+0*en]=a+n+1>>1,t[e+1+0*en]=t[e+0+2*en]=n+r+1>>1,t[e+2+0*en]=t[e+1+2*en]=r+i+1>>1,t[e+3+0*en]=t[e+2+2*en]=i+s+1>>1,t[e+0+1*en]=W(a,n,r),t[e+1+1*en]=t[e+0+3*en]=W(n,r,i),t[e+2+1*en]=t[e+1+3*en]=W(r,i,s),t[e+3+1*en]=t[e+2+3*en]=W(i,s,o),t[e+3+2*en]=W(s,o,l),t[e+3+3*en]=W(o,l,f)},function(t,e){const a=t[e-1+0*en],n=t[e-1+1*en],r=t[e-1+2*en],i=t[e-1+3*en],s=t[e-1-en],o=t[e+0-en],l=t[e+1-en],f=t[e+2-en];t[e+0+0*en]=t[e+2+1*en]=a+s+1>>1,t[e+0+1*en]=t[e+2+2*en]=n+a+1>>1,t[e+0+2*en]=t[e+2+3*en]=r+n+1>>1,t[e+0+3*en]=i+r+1>>1,t[e+3+0*en]=W(o,l,f),t[e+2+0*en]=W(s,o,l),t[e+1+0*en]=t[e+3+1*en]=W(a,s,o),t[e+1+1*en]=t[e+3+2*en]=W(n,a,s),t[e+1+2*en]=t[e+3+3*en]=W(r,n,a),t[e+1+3*en]=W(i,r,n)},function(t,e){const a=t[e-1+0*en],n=t[e-1+1*en],r=t[e-1+2*en],i=t[e-1+3*en];t[e+0+0*en]=a+n+1>>1,t[e+2+0*en]=t[e+0+1*en]=n+r+1>>1,t[e+2+1*en]=t[e+0+2*en]=r+i+1>>1,t[e+1+0*en]=W(a,n,r),t[e+3+0*en]=t[e+1+1*en]=W(n,r,i),t[e+3+1*en]=t[e+1+2*en]=W(r,i,i),t[e+3+2*en]=t[e+2+2*en]=t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=i}],Pn=[function(t,e){let a,n=16;for(a=0;a<16;++a)n+=t[e-1+a*en]+t[e+a-en];Z(n>>5,t,e)},function(t,e){F(t,e,16)},function(t,e){let a;for(a=0;a<16;++a)i(t,e+a*en,t,e-en,16)},function(t,e){let a;for(a=16;a>0;--a)h(t,e+0,t[e-1],16),e+=en},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e-1+a*en];Z(n>>4,t,e)},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e+a-en];Z(n>>4,t,e)},function(t,e){Z(128,t,e)}],Ln=[function(t,e){let a,n=8;for(a=0;a<8;++a)n+=t[e+a-en]+t[e-1+a*en];M(1*(n>>4),t,e)},function(t,e){F(t,e,8)},function(t,e){let a;for(a=0;a<8;++a)i(t,e+a*en,t,e-en,8)},function(t,e){let a;for(a=0;a<8;++a)h(t,e+0,t[e-1],8),e+=en},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e-1+a*en];M(1*(n>>3),t,e)},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e+a-en];M(1*(n>>3),t,e)},function(t,e){M(128,t,e)}];let Cn,Fn,Zn,Wn,Mn,Vn,Hn,jn,Gn,Kn,Yn,qn,Jn,$n,Xn,Qn;var tr=31,er=[0,2,8],ar=3,nr=1,rr=[0+0*en,4+0*en,8+0*en,12+0*en,0+4*en,4+4*en,8+4*en,12+4*en,0+8*en,4+8*en,8+8*en,12+8*en,0+12*en,4+12*en,8+12*en,12+12*en],ir=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],sr=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],or=[-Fa,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],lr=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],fr=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],hr=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var cr=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],dr=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],ur=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],_r=_([Qa,tn],"");d(4,0);var br=[[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],[0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]],wr=134480385,pr=16,gr=-227,mr=482,vr=[St,function(t){return t},function(t,e,a){return e[a+0]},function(t,e,a){return e[a+1]},function(t,e,a){return e[a-1]},function(t,e,a){return Rt(Rt(t,e[a+1]),e[a+0])},function(t,e,a){return Rt(t,e[a-1])},function(t,e,a){return Rt(t,e[a+0])},function(t,e,a){return Rt(e[a-1],e[a+0])},function(t,e,a){return Rt(e[a+0],e[a+1])},function(t,e,a){return Rt(Rt(t,e[a-1]),Rt(e[a+0],e[a+1]))},function(t,e,a){return Math.abs((t>>24&255)-(e[a-1]>>24&255))-Math.abs((e[a+0]>>24&255)-(e[a-1]>>24&255))+(Math.abs((t>>16&255)-(e[a-1]>>16&255))-Math.abs((e[a+0]>>16&255)-(e[a-1]>>16&255)))+(Math.abs((t>>8&255)-(e[a-1]>>8&255))-Math.abs((e[a+0]>>8&255)-(e[a-1]>>8&255)))+(Math.abs((255&t)-(255&e[a-1]))-Math.abs((255&e[a+0])-(255&e[a-1])))<=0?e[a+0]:t},function(t,e,a){return(Tt((t>>24&255)+(e[a+0]>>24&255)-(e[a-1]>>24&255))<<24|Tt((t>>16&255)+(e[a+0]>>16&255)-(e[a-1]>>16&255))<<16|Tt((t>>8&255)+(e[a+0]>>8&255)-(e[a-1]>>8&255))<<8|Tt((255&t)+(255&e[a+0])-(255&e[a-1])))>>>0},function(t,e,a){const n=e[a-1];return(zt((t=Rt(t,e[a+0]))>>24&255,n>>24&255)<<24|zt(t>>16&255,n>>16&255)<<16|zt(t>>8&255,n>>8&255)<<8|zt(t>>0&255,n>>0&255))>>>0},St,St],kr={Cc:0,Bc:0,Kc:0},yr=16,Ar=16,Er=16,Ur=[2,3,7],xr=[3,3,11],Rr=0,Tr=1,zr=2,Sr=3,Or=4,Br=[pa+ga,pa,pa,pa,40],Dr=19,Nr=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Ir=120,Pr=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],Lr=1<>>0:0,r=t.byteLength-n;let i=n;(ArrayBuffer.isView(t)||t instanceof m)&&(t.byteLength!==t.buffer.byteLength&&(i=t.byteOffset+n),t=t.buffer),this.lastWrittenByte=a?r:0,this.buffer=t,this.length=r,this.byteLength=r,this.byteOffset=i,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,i,r),this._mark=0,this._marks=[]}available(t=1){return this.offset+t<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(t=1){return this.offset+=t,this}seek(t){return this.offset=t,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){const t=this._marks.pop();if(void 0===t)throw new Error("Mark stack empty");return this.seek(t),this}rewind(){return this.offset=0,this}ensureAvailable(t=1){if(!this.available(t)){const e=2*(this.offset+t),a=new Uint8Array(e);a.set(new Uint8Array(this.buffer)),this.buffer=a.buffer,this.length=this.byteLength=e,this._data=new DataView(this.buffer)}return this}readBoolean(){return 0!==this.readUint8()}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(t=1){const e=new Uint8Array(t);for(let a=0;athis.lastWrittenByte&&(this.lastWrittenByte=this.offset)}}function v(t){let e=t.length;for(;--e>=0;)t[e]=0}const k=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),y=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),A=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),E=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),U=new Array(576);v(U);const x=new Array(60);v(x);const R=new Array(512);v(R);const T=new Array(256);v(T);const z=new Array(29);v(z);const S=new Array(30);function O(t,e,a,n,r){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=n,this.max_length=r,this.has_stree=t&&t.length}let B,D,N;function I(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}v(S);const P=t=>t<256?R[t]:R[256+(t>>>7)],L=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},C=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{C(t,a[2*e],a[2*e+1])},Z=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},W=(t,e,a)=>{const n=new Array(16);let r,i,s=0;for(r=1;r<=15;r++)n[r]=s=s+a[r-1]<<1;for(i=0;i<=e;i++){let e=t[2*i+1];0!==e&&(t[2*i]=Z(n[e]++,e))}},M=t=>{let e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0},V=t=>{t.bi_valid>8?L(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},H=(t,e,a,n)=>{const r=2*e,i=2*a;return t[r]{const n=t.heap[a];let r=a<<1;for(;r<=t.heap_len&&(r{let n,r,i,s,o=0;if(0!==t.last_lit)do{n=t.pending_buf[t.d_buf+2*o]<<8|t.pending_buf[t.d_buf+2*o+1],r=t.pending_buf[t.l_buf+o],o++,0===n?F(t,r,e):(i=T[r],F(t,i+256+1,e),s=k[i],0!==s&&(r-=z[i],C(t,r,s)),n--,i=P(n),F(t,i,a),s=y[i],0!==s&&(n-=S[i],C(t,n,s)))}while(o{const a=e.dyn_tree,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,i=e.stat_desc.elems;let s,o,l,f=-1;for(t.heap_len=0,t.heap_max=573,s=0;s>1;s>=1;s--)G(t,a,s);l=i;do{s=t.heap[1],t.heap[1]=t.heap[t.heap_len--],G(t,a,1),o=t.heap[1],t.heap[--t.heap_max]=s,t.heap[--t.heap_max]=o,a[2*l]=a[2*s]+a[2*o],t.depth[l]=(t.depth[s]>=t.depth[o]?t.depth[s]:t.depth[o])+1,a[2*s+1]=a[2*o+1]=l,t.heap[1]=l++,G(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,n=e.max_code,r=e.stat_desc.static_tree,i=e.stat_desc.has_stree,s=e.stat_desc.extra_bits,o=e.stat_desc.extra_base,l=e.stat_desc.max_length;let f,h,c,d,u,_,b=0;for(d=0;d<=15;d++)t.bl_count[d]=0;for(a[2*t.heap[t.heap_max]+1]=0,f=t.heap_max+1;f<573;f++)h=t.heap[f],d=a[2*a[2*h+1]+1]+1,d>l&&(d=l,b++),a[2*h+1]=d,h>n||(t.bl_count[d]++,u=0,h>=o&&(u=s[h-o]),_=a[2*h],t.opt_len+=_*(d+u),i&&(t.static_len+=_*(r[2*h+1]+u)));if(0!==b){do{for(d=l-1;0===t.bl_count[d];)d--;t.bl_count[d]--,t.bl_count[d+1]+=2,t.bl_count[l]--,b-=2}while(b>0);for(d=l;0!==d;d--)for(h=t.bl_count[d];0!==h;)c=t.heap[--f],c>n||(a[2*c+1]!==d&&(t.opt_len+=(d-a[2*c+1])*a[2*c],a[2*c+1]=d),h--)}})(t,e),W(a,f,t.bl_count)},q=(t,e,a)=>{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),e[2*(a+1)+1]=65535,n=0;n<=a;n++)r=s,s=e[2*(n+1)+1],++o{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),n=0;n<=a;n++)if(r=s,s=e[2*(n+1)+1],!(++o{C(t,0+(n?1:0),3),((t,e,a,n)=>{V(t),L(t,a),L(t,~a),t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a})(t,e,a)};var Q={_tr_init:t=>{$||((()=>{let t,e,a,n,r;const i=new Array(16);for(a=0,n=0;n<28;n++)for(z[n]=a,t=0;t<1<>=7;n<30;n++)for(S[n]=r<<7,t=0;t<1<{let r,i,s=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),Y(t,t.l_desc),Y(t,t.d_desc),s=(t=>{let e;for(q(t,t.dyn_ltree,t.l_desc.max_code),q(t,t.dyn_dtree,t.d_desc.max_code),Y(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*E[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,i=t.static_len+3+7>>>3,i<=r&&(r=i)):r=i=a+5,a+4<=r&&-1!==e?X(t,e,a,n):4===t.strategy||i===r?(C(t,2+(n?1:0),3),K(t,U,x)):(C(t,4+(n?1:0),3),((t,e,a,n)=>{let r;for(C(t,e-257,5),C(t,a-1,5),C(t,n-4,4),r=0;r(t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(T[a]+256+1)]++,t.dyn_dtree[2*P(e)]++),t.last_lit===t.lit_bufsize-1),_tr_align:t=>{C(t,2,3),F(t,256,U),(t=>{16===t.bi_valid?(L(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}},tt=(t,e,a,n)=>{let r=65535&t|0,i=t>>>16&65535|0,s=0;for(;0!==a;){s=a>2e3?2e3:a,a-=s;do{r=r+e[n++]|0,i=i+r|0}while(--s);r%=65521,i%=65521}return r|i<<16|0};const et=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var at=(t,e,a,n)=>{const r=et,i=n+a;t^=-1;for(let a=n;a>>8^r[255&(t^e[a])];return-1^t},nt={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},rt={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:it,_tr_stored_block:st,_tr_flush_block:ot,_tr_tally:lt,_tr_align:ft}=Q,{Z_NO_FLUSH:ht,Z_PARTIAL_FLUSH:ct,Z_FULL_FLUSH:dt,Z_FINISH:ut,Z_BLOCK:_t,Z_OK:bt,Z_STREAM_END:wt,Z_STREAM_ERROR:pt,Z_DATA_ERROR:gt,Z_BUF_ERROR:mt,Z_DEFAULT_COMPRESSION:vt,Z_FILTERED:kt,Z_HUFFMAN_ONLY:yt,Z_RLE:At,Z_FIXED:Et,Z_DEFAULT_STRATEGY:Ut,Z_UNKNOWN:xt,Z_DEFLATED:Rt}=rt,Tt=258,zt=262,St=103,Ot=113,Bt=666,Dt=(t,e)=>(t.msg=nt[e],e),Nt=t=>(t<<1)-(t>4?9:0),It=t=>{let e=t.length;for(;--e>=0;)t[e]=0};let Pt=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},Ct=(t,e)=>{ot(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Lt(t.strm)},Ft=(t,e)=>{t.pending_buf[t.pending++]=e},Zt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Wt=(t,e,a,n)=>{let r=t.avail_in;return r>n&&(r=n),0===r?0:(t.avail_in-=r,e.set(t.input.subarray(t.next_in,t.next_in+r),a),1===t.state.wrap?t.adler=tt(t.adler,e,r,a):2===t.state.wrap&&(t.adler=at(t.adler,e,r,a)),t.next_in+=r,t.total_in+=r,r)},Mt=(t,e)=>{let a,n,r=t.max_chain_length,i=t.strstart,s=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-zt?t.strstart-(t.w_size-zt):0,f=t.window,h=t.w_mask,c=t.prev,d=t.strstart+Tt;let u=f[i+s-1],_=f[i+s];t.prev_length>=t.good_match&&(r>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,f[a+s]===_&&f[a+s-1]===u&&f[a]===f[i]&&f[++a]===f[i+1]){i+=2,a++;do{}while(f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&is){if(t.match_start=e,s=n,n>=o)break;u=f[i+s-1],_=f[i+s]}}}while((e=c[e&h])>l&&0!=--r);return s<=t.lookahead?s:t.lookahead},Vt=t=>{const e=t.w_size;let a,n,r,i,s;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-zt)){t.window.set(t.window.subarray(e,e+e),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,n=t.hash_size,a=n;do{r=t.head[--a],t.head[a]=r>=e?r-e:0}while(--n);n=e,a=n;do{r=t.prev[--a],t.prev[a]=r>=e?r-e:0}while(--n);i+=e}if(0===t.strm.avail_in)break;if(n=Wt(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=Pt(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=Pt(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead{let a,n;for(;;){if(t.lookahead=3&&(t.ins_h=Pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-zt&&(t.match_length=Mt(t,a)),t.match_length>=3)if(n=lt(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=Pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=Pt(t,t.ins_h,t.window[t.strstart+1]);else n=lt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(n&&(Ct(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===ut?(Ct(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Ct(t,!1),0===t.strm.avail_out)?1:2},jt=(t,e)=>{let a,n,r;for(;;){if(t.lookahead=3&&(t.ins_h=Pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-3,n=lt(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=Pt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,n&&(Ct(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(n=lt(t,0,t.window[t.strstart-1]),n&&Ct(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(n=lt(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===ut?(Ct(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Ct(t,!1),0===t.strm.avail_out)?1:2};function Gt(t,e,a,n,r){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=n,this.func=r}const Kt=[new Gt(0,0,0,0,((t,e)=>{let a=65535;for(a>t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(Vt(t),0===t.lookahead&&e===ht)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;const n=t.block_start+a;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,Ct(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-zt&&(Ct(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===ut?(Ct(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(Ct(t,!1),t.strm.avail_out),1)})),new Gt(4,4,8,4,Ht),new Gt(4,5,16,8,Ht),new Gt(4,6,32,32,Ht),new Gt(4,4,16,16,jt),new Gt(8,16,32,32,jt),new Gt(8,16,128,128,jt),new Gt(8,32,128,256,jt),new Gt(32,128,258,1024,jt),new Gt(32,258,258,4096,jt)];function Yt(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Rt,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),It(this.dyn_ltree),It(this.dyn_dtree),It(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),It(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),It(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const qt=t=>{if(!t||!t.state)return Dt(t,pt);t.total_in=t.total_out=0,t.data_type=xt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?42:Ot,t.adler=2===e.wrap?0:1,e.last_flush=ht,it(e),bt},Jt=t=>{const e=qt(t);return e===bt&&((a=t.state).window_size=2*a.w_size,It(a.head),a.max_lazy_match=Kt[a.level].max_lazy,a.good_match=Kt[a.level].good_length,a.nice_match=Kt[a.level].nice_length,a.max_chain_length=Kt[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e;var a},$t=(t,e,a,n,r,i)=>{if(!t)return pt;let s=1;if(e===vt&&(e=6),n<0?(s=0,n=-n):n>15&&(s=2,n-=16),r<1||r>9||a!==Rt||n<8||n>15||e<0||e>9||i<0||i>Et)return Dt(t,pt);8===n&&(n=9);const o=new Yt;return t.state=o,o.strm=t,o.wrap=s,o.gzhead=null,o.w_bits=n,o.w_size=1<t&&t.state?2!==t.state.wrap?pt:(t.state.gzhead=e,bt):pt,te=(t,e)=>{let a,n;if(!t||!t.state||e>_t||e<0)return t?Dt(t,pt):pt;const r=t.state;if(!t.output||!t.input&&0!==t.avail_in||r.status===Bt&&e!==ut)return Dt(t,0===t.avail_out?mt:pt);r.strm=t;const i=r.last_flush;if(r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,Ft(r,31),Ft(r,139),Ft(r,8),r.gzhead?(Ft(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),Ft(r,255&r.gzhead.time),Ft(r,r.gzhead.time>>8&255),Ft(r,r.gzhead.time>>16&255),Ft(r,r.gzhead.time>>24&255),Ft(r,9===r.level?2:r.strategy>=yt||r.level<2?4:0),Ft(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(Ft(r,255&r.gzhead.extra.length),Ft(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=at(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(Ft(r,0),Ft(r,0),Ft(r,0),Ft(r,0),Ft(r,0),Ft(r,9===r.level?2:r.strategy>=yt||r.level<2?4:0),Ft(r,3),r.status=Ot);else{let e=Rt+(r.w_bits-8<<4)<<8,a=-1;a=r.strategy>=yt||r.level<2?0:r.level<6?1:6===r.level?2:3,e|=a<<6,0!==r.strstart&&(e|=32),e+=31-e%31,r.status=Ot,Zt(r,e),0!==r.strstart&&(Zt(r,t.adler>>>16),Zt(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(a=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>a&&(t.adler=at(t.adler,r.pending_buf,r.pending-a,a)),Lt(t),a=r.pending,r.pending!==r.pending_buf_size));)Ft(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>a&&(t.adler=at(t.adler,r.pending_buf,r.pending-a,a)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=at(t.adler,r.pending_buf,r.pending-a,a)),Lt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=at(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=at(t.adler,r.pending_buf,r.pending-a,a)),Lt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=at(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.status=St)}else r.status=St;if(r.status===St&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&Lt(t),r.pending+2<=r.pending_buf_size&&(Ft(r,255&t.adler),Ft(r,t.adler>>8&255),t.adler=0,r.status=Ot)):r.status=Ot),0!==r.pending){if(Lt(t),0===t.avail_out)return r.last_flush=-1,bt}else if(0===t.avail_in&&Nt(e)<=Nt(i)&&e!==ut)return Dt(t,mt);if(r.status===Bt&&0!==t.avail_in)return Dt(t,mt);if(0!==t.avail_in||0!==r.lookahead||e!==ht&&r.status!==Bt){let a=r.strategy===yt?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Vt(t),0===t.lookahead)){if(e===ht)return 1;break}if(t.match_length=0,a=lt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(Ct(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===ut?(Ct(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Ct(t,!1),0===t.strm.avail_out)?1:2})(r,e):r.strategy===At?((t,e)=>{let a,n,r,i;const s=t.window;for(;;){if(t.lookahead<=Tt){if(Vt(t),t.lookahead<=Tt&&e===ht)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=t.strstart-1,n=s[r],n===s[++r]&&n===s[++r]&&n===s[++r])){i=t.strstart+Tt;do{}while(n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&rt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=lt(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=lt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(Ct(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===ut?(Ct(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Ct(t,!1),0===t.strm.avail_out)?1:2})(r,e):Kt[r.level].func(r,e);if(3!==a&&4!==a||(r.status=Bt),1===a||3===a)return 0===t.avail_out&&(r.last_flush=-1),bt;if(2===a&&(e===ct?ft(r):e!==_t&&(st(r,0,0,!1),e===dt&&(It(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),Lt(t),0===t.avail_out))return r.last_flush=-1,bt}return e!==ut?bt:r.wrap<=0?wt:(2===r.wrap?(Ft(r,255&t.adler),Ft(r,t.adler>>8&255),Ft(r,t.adler>>16&255),Ft(r,t.adler>>24&255),Ft(r,255&t.total_in),Ft(r,t.total_in>>8&255),Ft(r,t.total_in>>16&255),Ft(r,t.total_in>>24&255)):(Zt(r,t.adler>>>16),Zt(r,65535&t.adler)),Lt(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?bt:wt)},ee=t=>{if(!t||!t.state)return pt;const e=t.state.status;return 42!==e&&69!==e&&73!==e&&91!==e&&e!==St&&e!==Ot&&e!==Bt?Dt(t,pt):(t.state=null,e===Ot?Dt(t,gt):bt)},ae=(t,e)=>{let a=e.length;if(!t||!t.state)return pt;const n=t.state,r=n.wrap;if(2===r||1===r&&42!==n.status||n.lookahead)return pt;if(1===r&&(t.adler=tt(t.adler,e,a,0)),n.wrap=0,a>=n.w_size){0===r&&(It(n.head),n.strstart=0,n.block_start=0,n.insert=0);let t=new Uint8Array(n.w_size);t.set(e.subarray(a-n.w_size,a),0),e=t,a=n.w_size}const i=t.avail_in,s=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Vt(n);n.lookahead>=3;){let t=n.strstart,e=n.lookahead-2;do{n.ins_h=Pt(n,n.ins_h,n.window[t+3-1]),n.prev[t&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=t,t++}while(--e);n.strstart=t,n.lookahead=2,Vt(n)}return n.strstart+=n.lookahead,n.block_start=n.strstart,n.insert=n.lookahead,n.lookahead=0,n.match_length=n.prev_length=2,n.match_available=0,t.next_in=s,t.input=o,t.avail_in=i,n.wrap=r,bt};const ne=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var re=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)ne(a,e)&&(t[e]=a[e])}}return t},ie=t=>{let e=0;for(let a=0,n=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;oe[254]=oe[254]=1;var le=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,n,r,i,s=t.length,o=0;for(r=0;r>>6,e[i++]=128|63&a):a<65536?(e[i++]=224|a>>>12,e[i++]=128|a>>>6&63,e[i++]=128|63&a):(e[i++]=240|a>>>18,e[i++]=128|a>>>12&63,e[i++]=128|a>>>6&63,e[i++]=128|63&a);return e},fe=(t,e)=>{const a=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));let n,r;const i=new Array(2*a);for(r=0,n=0;n4)i[r++]=65533,n+=s-1;else{for(e&=2===s?31:3===s?15:7;s>1&&n1?i[r++]=65533:e<65536?i[r++]=e:(e-=65536,i[r++]=55296|e>>10&1023,i[r++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&se)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let n=0;n{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+oe[t[a]]>e?a:e},ce=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const de=Object.prototype.toString,{Z_NO_FLUSH:ue,Z_SYNC_FLUSH:_e,Z_FULL_FLUSH:be,Z_FINISH:we,Z_OK:pe,Z_STREAM_END:ge,Z_DEFAULT_COMPRESSION:me,Z_DEFAULT_STRATEGY:ve,Z_DEFLATED:ke}=rt;function ye(t){this.options=re({level:me,method:ke,chunkSize:16384,windowBits:15,memLevel:8,strategy:ve},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new ce,this.strm.avail_out=0;let a=Xt(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==pe)throw new Error(nt[a]);if(e.header&&Qt(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?le(e.dictionary):"[object ArrayBuffer]"===de.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=ae(this.strm,t),a!==pe)throw new Error(nt[a]);this._dict_set=!0}}function Ae(t,e){const a=new ye(e);if(a.push(t,!0),a.err)throw a.msg||nt[a.err];return a.result}ye.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize;let r,i;if(this.ended)return!1;for(i=e===~~e?e:!0===e?we:ue,"string"==typeof t?a.input=le(t):"[object ArrayBuffer]"===de.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),(i===_e||i===be)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(r=te(a,i),r===ge)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),r=ee(this.strm),this.onEnd(r),this.ended=!0,r===pe;if(0!==a.avail_out){if(i>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},ye.prototype.onData=function(t){this.chunks.push(t)},ye.prototype.onEnd=function(t){t===pe&&(this.result=ie(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var Ee={Deflate:ye,deflate:Ae,deflateRaw:function(t,e){return(e=e||{}).raw=!0,Ae(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,Ae(t,e)},constants:rt},Ue=function(t,e){let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E,U;const x=t.state;a=t.next_in,E=t.input,n=a+(t.avail_in-5),r=t.next_out,U=t.output,i=r-(e-t.avail_out),s=r+(t.avail_out-257),o=x.dmax,l=x.wsize,f=x.whave,h=x.wnext,c=x.window,d=x.hold,u=x.bits,_=x.lencode,b=x.distcode,w=(1<>>24,d>>>=m,u-=m,m=g>>>16&255,0===m)U[r++]=65535&g;else{if(!(16&m)){if(0==(64&m)){g=_[(65535&g)+(d&(1<>>=m,u-=m),u<15&&(d+=E[a++]<>>24,d>>>=m,u-=m,m=g>>>16&255,!(16&m)){if(0==(64&m)){g=b[(65535&g)+(d&(1<o){t.msg="invalid distance too far back",x.mode=30;break t}if(d>>>=m,u-=m,m=r-i,k>m){if(m=k-m,m>f&&x.sane){t.msg="invalid distance too far back",x.mode=30;break t}if(y=0,A=c,0===h){if(y+=l-m,m2;)U[r++]=A[y++],U[r++]=A[y++],U[r++]=A[y++],v-=3;v&&(U[r++]=A[y++],v>1&&(U[r++]=A[y++]))}else{y=r-k;do{U[r++]=U[y++],U[r++]=U[y++],U[r++]=U[y++],v-=3}while(v>2);v&&(U[r++]=U[y++],v>1&&(U[r++]=U[y++]))}break}}break}}while(a>3,a-=v,u-=v<<3,d&=(1<{const l=o.bits;let f,h,c,d,u,_,b=0,w=0,p=0,g=0,m=0,v=0,k=0,y=0,A=0,E=0,U=null,x=0;const R=new Uint16Array(16),T=new Uint16Array(16);let z,S,O,B=null,D=0;for(b=0;b<=15;b++)R[b]=0;for(w=0;w=1&&0===R[g];g--);if(m>g&&(m=g),0===g)return r[i++]=20971520,r[i++]=20971520,o.bits=1,0;for(p=1;p0&&(0===t||1!==g))return-1;for(T[1]=0,b=1;b<15;b++)T[b+1]=T[b]+R[b];for(w=0;w852||2===t&&A>592)return 1;for(;;){z=b-k,s[w]<_?(S=0,O=s[w]):s[w]>_?(S=B[D+s[w]],O=U[x+s[w]]):(S=96,O=0),f=1<>k)+h]=z<<24|S<<16|O|0}while(0!==h);for(f=1<>=1;if(0!==f?(E&=f-1,E+=f):E=0,w++,0==--R[b]){if(b===g)break;b=e[a+s[w]]}if(b>m&&(E&d)!==c){for(0===k&&(k=m),u+=p,v=b-k,y=1<852||2===t&&A>592)return 1;c=E&d,r[c]=m<<24|v<<16|u-i|0}}return 0!==E&&(r[u+E]=b-k<<24|64<<16|0),o.bits=m,0};const{Z_FINISH:Oe,Z_BLOCK:Be,Z_TREES:De,Z_OK:Ne,Z_STREAM_END:Ie,Z_NEED_DICT:Pe,Z_STREAM_ERROR:Le,Z_DATA_ERROR:Ce,Z_MEM_ERROR:Fe,Z_BUF_ERROR:Ze,Z_DEFLATED:We}=rt,Me=12,Ve=30,He=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function je(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Ge=t=>{if(!t||!t.state)return Le;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,Ne},Ke=t=>{if(!t||!t.state)return Le;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Ge(t)},Ye=(t,e)=>{let a;if(!t||!t.state)return Le;const n=t.state;return e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?Le:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=a,n.wbits=e,Ke(t))},qe=(t,e)=>{if(!t)return Le;const a=new je;t.state=a,a.window=null;const n=Ye(t,e);return n!==Ne&&(t.state=null),n};let Je,$e,Xe=!0;const Qe=t=>{if(Xe){Je=new Int32Array(512),$e=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(Se(1,t.lens,0,288,Je,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;Se(2,t.lens,0,32,$e,0,t.work,{bits:5}),Xe=!1}t.lencode=Je,t.lenbits=9,t.distcode=$e,t.distbits=5},ta=(t,e,a,n)=>{let r;const i=t.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(e.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(r=i.wsize-i.wnext,r>n&&(r=n),i.window.set(e.subarray(a-n,a-n+r),i.wnext),(n-=r)?(i.window.set(e.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=r,i.wnext===i.wsize&&(i.wnext=0),i.whave{let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E=0;const U=new Uint8Array(4);let x,R;const T=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return Le;a=t.state,a.mode===Me&&(a.mode=13),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,c=o,d=l,A=Ne;t:for(;;)switch(a.mode){case 1:if(0===a.wrap){a.mode=13;break}for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=at(a.check,U,2,0),f=0,h=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&f)<<8)+(f>>8))%31){t.msg="incorrect header check",a.mode=Ve;break}if((15&f)!==We){t.msg="unknown compression method",a.mode=Ve;break}if(f>>>=4,h-=4,y=8+(15&f),0===a.wbits)a.wbits=y;else if(y>a.wbits){t.msg="invalid window size",a.mode=Ve;break}a.dmax=1<>8&1),512&a.flags&&(U[0]=255&f,U[1]=f>>>8&255,a.check=at(a.check,U,2,0)),f=0,h=0,a.mode=3;case 3:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>8&255,U[2]=f>>>16&255,U[3]=f>>>24&255,a.check=at(a.check,U,4,0)),f=0,h=0,a.mode=4;case 4:for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>8),512&a.flags&&(U[0]=255&f,U[1]=f>>>8&255,a.check=at(a.check,U,2,0)),f=0,h=0,a.mode=5;case 5:if(1024&a.flags){for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=at(a.check,U,2,0)),f=0,h=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(u=a.length,u>o&&(u=o),u&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(n.subarray(i,i+u),y)),512&a.flags&&(a.check=at(a.check,n,u,i)),o-=u,i+=u,a.length-=u),a.length))break t;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===o)break t;u=0;do{y=n[i+u++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&u>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=Me;break;case 10:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>=7&h,h-=7&h,a.mode=27;break}for(;h<3;){if(0===o)break t;o--,f+=n[i++]<>>=1,h-=1,3&f){case 0:a.mode=14;break;case 1:if(Qe(a),a.mode=20,e===De){f>>>=2,h-=2;break t}break;case 2:a.mode=17;break;case 3:t.msg="invalid block type",a.mode=Ve}f>>>=2,h-=2;break;case 14:for(f>>>=7&h,h-=7&h;h<32;){if(0===o)break t;o--,f+=n[i++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=Ve;break}if(a.length=65535&f,f=0,h=0,a.mode=15,e===De)break t;case 15:a.mode=16;case 16:if(u=a.length,u){if(u>o&&(u=o),u>l&&(u=l),0===u)break t;r.set(n.subarray(i,i+u),s),o-=u,i+=u,l-=u,s+=u,a.length-=u;break}a.mode=Me;break;case 17:for(;h<14;){if(0===o)break t;o--,f+=n[i++]<>>=5,h-=5,a.ndist=1+(31&f),f>>>=5,h-=5,a.ncode=4+(15&f),f>>>=4,h-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=Ve;break}a.have=0,a.mode=18;case 18:for(;a.have>>=3,h-=3}for(;a.have<19;)a.lens[T[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,x={bits:a.lenbits},A=Se(0,a.lens,0,19,a.lencode,0,a.work,x),a.lenbits=x.bits,A){t.msg="invalid code lengths set",a.mode=Ve;break}a.have=0,a.mode=19;case 19:for(;a.have>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=w,h-=w,a.lens[a.have++]=g;else{if(16===g){for(R=w+2;h>>=w,h-=w,0===a.have){t.msg="invalid bit length repeat",a.mode=Ve;break}y=a.lens[a.have-1],u=3+(3&f),f>>>=2,h-=2}else if(17===g){for(R=w+3;h>>=w,h-=w,y=0,u=3+(7&f),f>>>=3,h-=3}else{for(R=w+7;h>>=w,h-=w,y=0,u=11+(127&f),f>>>=7,h-=7}if(a.have+u>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=Ve;break}for(;u--;)a.lens[a.have++]=y}}if(a.mode===Ve)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=Ve;break}if(a.lenbits=9,x={bits:a.lenbits},A=Se(1,a.lens,0,a.nlen,a.lencode,0,a.work,x),a.lenbits=x.bits,A){t.msg="invalid literal/lengths set",a.mode=Ve;break}if(a.distbits=6,a.distcode=a.distdyn,x={bits:a.distbits},A=Se(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,x),a.distbits=x.bits,A){t.msg="invalid distances set",a.mode=Ve;break}if(a.mode=20,e===De)break t;case 20:a.mode=21;case 21:if(o>=6&&l>=258){t.next_out=s,t.avail_out=l,t.next_in=i,t.avail_in=o,a.hold=f,a.bits=h,Ue(t,d),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,a.mode===Me&&(a.back=-1);break}for(a.back=0;E=a.lencode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,a.length=g,0===p){a.mode=26;break}if(32&p){a.back=-1,a.mode=Me;break}if(64&p){t.msg="invalid literal/length code",a.mode=Ve;break}a.extra=15&p,a.mode=22;case 22:if(a.extra){for(R=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;E=a.distcode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,64&p){t.msg="invalid distance code",a.mode=Ve;break}a.offset=g,a.extra=15&p,a.mode=24;case 24:if(a.extra){for(R=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=Ve;break}a.mode=25;case 25:if(0===l)break t;if(u=d-l,a.offset>u){if(u=a.offset-u,u>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=Ve;break}u>a.wnext?(u-=a.wnext,_=a.wsize-u):_=a.wnext-u,u>a.length&&(u=a.length),b=a.window}else b=r,_=s-a.offset,u=a.length;u>l&&(u=l),l-=u,a.length-=u;do{r[s++]=b[_++]}while(--u);0===a.length&&(a.mode=21);break;case 26:if(0===l)break t;r[s++]=a.length,l--,a.mode=21;break;case 27:if(a.wrap){for(;h<32;){if(0===o)break t;o--,f|=n[i++]<{if(!t||!t.state)return Le;let e=t.state;return e.window&&(e.window=null),t.state=null,Ne},ia=(t,e)=>{if(!t||!t.state)return Le;const a=t.state;return 0==(2&a.wrap)?Le:(a.head=e,e.done=!1,Ne)},sa=(t,e)=>{const a=e.length;let n,r,i;return t&&t.state?(n=t.state,0!==n.wrap&&11!==n.mode?Le:11===n.mode&&(r=1,r=tt(r,e,a,0),r!==n.check)?Ce:(i=ta(t,e,a,a),i?(n.mode=31,Fe):(n.havedict=1,Ne))):Le},oa=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const la=Object.prototype.toString,{Z_NO_FLUSH:fa,Z_FINISH:ha,Z_OK:ca,Z_STREAM_END:da,Z_NEED_DICT:ua,Z_STREAM_ERROR:_a,Z_DATA_ERROR:ba,Z_MEM_ERROR:wa}=rt;function pa(t){this.options=re({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new ce,this.strm.avail_out=0;let a=aa(this.strm,e.windowBits);if(a!==ca)throw new Error(nt[a]);if(this.header=new oa,ia(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=le(e.dictionary):"[object ArrayBuffer]"===la.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=sa(this.strm,e.dictionary),a!==ca)))throw new Error(nt[a])}function ga(t,e){const a=new pa(e);if(a.push(t),a.err)throw a.msg||nt[a.err];return a.result}pa.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize,r=this.options.dictionary;let i,s,o;if(this.ended)return!1;for(s=e===~~e?e:!0===e?ha:fa,"[object ArrayBuffer]"===la.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=na(a,s),i===ua&&r&&(i=sa(a,r),i===ca?i=na(a,s):i===ba&&(i=ua));a.avail_in>0&&i===da&&a.state.wrap>0&&0!==t[a.next_in];)ea(a),i=na(a,s);switch(i){case _a:case ba:case ua:case wa:return this.onEnd(i),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||i===da))if("string"===this.options.to){let t=he(a.output,a.next_out),e=a.next_out-t,r=fe(a.output,t);a.next_out=e,a.avail_out=n-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(r)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==ca||0!==o){if(i===da)return i=ra(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},pa.prototype.onData=function(t){this.chunks.push(t)},pa.prototype.onEnd=function(t){t===ca&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=ie(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ma={Inflate:pa,inflate:ga,inflateRaw:function(t,e){return(e=e||{}).raw=!0,ga(t,e)},ungzip:ga,constants:rt};const{Deflate:va,deflate:ka,deflateRaw:ya,gzip:Aa}=Ee,{Inflate:Ea,inflate:Ua,inflateRaw:xa,ungzip:Ra}=ma;var Ta=ka;const za=[137,80,78,71,13,10,26,10],Sa=[];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)1&e?e=3988292384^e>>>1:e>>>=1;Sa[t]=e}const Oa=4294967295;var Ba,Da,Na,Ia,Pa,La,Ca,Fa;(Fa=Ba||(Ba={}))[Fa.UNKNOWN=-1]="UNKNOWN",Fa[Fa.GREYSCALE=0]="GREYSCALE",Fa[Fa.TRUECOLOUR=2]="TRUECOLOUR",Fa[Fa.INDEXED_COLOUR=3]="INDEXED_COLOUR",Fa[Fa.GREYSCALE_ALPHA=4]="GREYSCALE_ALPHA",Fa[Fa.TRUECOLOUR_ALPHA=6]="TRUECOLOUR_ALPHA",(Ca=Da||(Da={}))[Ca.UNKNOWN=-1]="UNKNOWN",Ca[Ca.DEFLATE=0]="DEFLATE",(La=Na||(Na={}))[La.UNKNOWN=-1]="UNKNOWN",La[La.ADAPTIVE=0]="ADAPTIVE",(Pa=Ia||(Ia={}))[Pa.UNKNOWN=-1]="UNKNOWN",Pa[Pa.NO_INTERLACE=0]="NO_INTERLACE",Pa[Pa.ADAM7=1]="ADAM7",new Uint8Array(0);const Za=new Uint16Array([255]);new Uint8Array(Za.buffer)[0];const Wa={level:3};class Ma extends m{constructor(t,e={}){super(),this._colorType=Ba.UNKNOWN,this._zlibOptions=Object.assign({},Wa,e.zlib),this._png=this._checkData(t),this.setBigEndian()}encode(){return this.encodeSignature(),this.encodeIHDR(),this.encodeData(),this.encodeIEND(),this.toArray()}encodeSignature(){this.writeBytes(za)}encodeIHDR(){this.writeUint32(13),this.writeChars("IHDR"),this.writeUint32(this._png.width),this.writeUint32(this._png.height),this.writeByte(this._png.depth),this.writeByte(this._colorType),this.writeByte(Da.DEFLATE),this.writeByte(Na.ADAPTIVE),this.writeByte(Ia.NO_INTERLACE),this.writeCrc(17)}encodeIEND(){this.writeUint32(0),this.writeChars("IEND"),this.writeCrc(4)}encodeIDAT(t){this.writeUint32(t.length),this.writeChars("IDAT"),this.writeBytes(t),this.writeCrc(t.length+4)}encodeData(){const{width:t,height:e,channels:a,depth:n,data:r}=this._png,i=a*t,s=(new m).setBigEndian();let o=0;for(let t=0;t>>8;return n}(0,t,e)^Oa)>>>0}(new Uint8Array(this.buffer,this.byteOffset+this.offset-t,t),t))}}function Va(t,e){if(Number.isInteger(t)&&t>0)return t;throw new TypeError(`${e} must be a positive integer`)}function Ha(t,e,a,n){for(let r=0;r{var e;e=t.data,Ya.push(e),Ja()}))})()})(); -//# sourceMappingURL=webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js.map \ No newline at end of file diff --git a/public/webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js.map b/public/webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js.map deleted file mode 100644 index a0861104..00000000 --- a/public/webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"webp.worker.5a8def2abfbbd7c60c2b.bundle.worker.js","mappings":"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,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAE1C,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,I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","sources":["webpack://tweb/./node_modules/iobuffer/lib-esm/text-encoding-polyfill.js","webpack://tweb/webpack/bootstrap","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./node_modules/iobuffer/lib-esm/utf8.browser.js","webpack://tweb/./node_modules/iobuffer/lib-esm/IOBuffer.js","webpack://tweb/./node_modules/pako/dist/pako.esm.mjs","webpack://tweb/./node_modules/fast-png/lib-esm/common.js","webpack://tweb/./node_modules/fast-png/lib-esm/internalTypes.js","webpack://tweb/./node_modules/fast-png/lib-esm/PngDecoder.js","webpack://tweb/./node_modules/fast-png/lib-esm/PngEncoder.js","webpack://tweb/./node_modules/fast-png/lib-esm/types.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/./node_modules/fast-png/lib-esm/index.js"],"sourcesContent":["\"use strict\";\n/*\n * Copyright 2017 Sam Thorogood. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n(function (scope) {\n 'use strict';\n // fail early\n if (scope['TextEncoder'] && scope['TextDecoder']) {\n return false;\n }\n /**\n * @constructor\n * @param {string=} utfLabel\n */\n function FastTextEncoder(utfLabel = 'utf-8') {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n }\n Object.defineProperty(FastTextEncoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n /**\n * @param {string} string\n * @param {{stream: boolean}=} options\n * @return {!Uint8Array}\n */\n FastTextEncoder.prototype.encode = function (string, options = { stream: false }) {\n if (options.stream) {\n throw new Error(`Failed to encode: the 'stream' option is unsupported.`);\n }\n let pos = 0;\n const len = string.length;\n const out = [];\n let at = 0; // output position\n let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size\n let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset\n while (pos < len) {\n let value = string.charCodeAt(pos++);\n if (value >= 0xd800 && value <= 0xdbff) {\n // high surrogate\n if (pos < len) {\n const extra = string.charCodeAt(pos);\n if ((extra & 0xfc00) === 0xdc00) {\n ++pos;\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n }\n if (value >= 0xd800 && value <= 0xdbff) {\n continue; // drop lone surrogate\n }\n }\n // expand the buffer if we couldn't write 4 bytes\n if (at + 4 > target.length) {\n tlen += 8; // minimum extra\n tlen *= 1.0 + (pos / string.length) * 2; // take 2x the remaining\n tlen = (tlen >> 3) << 3; // 8 byte offset\n const update = new Uint8Array(tlen);\n update.set(target);\n target = update;\n }\n if ((value & 0xffffff80) === 0) {\n // 1-byte\n target[at++] = value; // ASCII\n continue;\n }\n else if ((value & 0xfffff800) === 0) {\n // 2-byte\n target[at++] = ((value >> 6) & 0x1f) | 0xc0;\n }\n else if ((value & 0xffff0000) === 0) {\n // 3-byte\n target[at++] = ((value >> 12) & 0x0f) | 0xe0;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else if ((value & 0xffe00000) === 0) {\n // 4-byte\n target[at++] = ((value >> 18) & 0x07) | 0xf0;\n target[at++] = ((value >> 12) & 0x3f) | 0x80;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else {\n // FIXME: do we care\n continue;\n }\n target[at++] = (value & 0x3f) | 0x80;\n }\n return target.slice(0, at);\n };\n /**\n * @constructor\n * @param {string=} utfLabel\n * @param {{fatal: boolean}=} options\n */\n function FastTextDecoder(utfLabel = 'utf-8', options = { fatal: false }) {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n if (options.fatal) {\n throw new Error(`Failed to construct 'TextDecoder': the 'fatal' option is unsupported.`);\n }\n }\n Object.defineProperty(FastTextDecoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n Object.defineProperty(FastTextDecoder.prototype, 'fatal', { value: false });\n Object.defineProperty(FastTextDecoder.prototype, 'ignoreBOM', {\n value: false,\n });\n /**\n * @param {(!ArrayBuffer|!ArrayBufferView)} buffer\n * @param {{stream: boolean}=} options\n */\n FastTextDecoder.prototype.decode = function (buffer, options = { stream: false }) {\n if (options['stream']) {\n throw new Error(`Failed to decode: the 'stream' option is unsupported.`);\n }\n const bytes = new Uint8Array(buffer);\n let pos = 0;\n const len = bytes.length;\n const out = [];\n while (pos < len) {\n const byte1 = bytes[pos++];\n if (byte1 === 0) {\n break; // NULL\n }\n if ((byte1 & 0x80) === 0) {\n // 1-byte\n out.push(byte1);\n }\n else if ((byte1 & 0xe0) === 0xc0) {\n // 2-byte\n const byte2 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 6) | byte2);\n }\n else if ((byte1 & 0xf0) === 0xe0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3);\n }\n else if ((byte1 & 0xf8) === 0xf0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n const byte4 = bytes[pos++] & 0x3f;\n // this can be > 0xffff, so possibly generate surrogates\n let codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\n if (codepoint > 0xffff) {\n // codepoint &= ~0x10000;\n codepoint -= 0x10000;\n out.push(((codepoint >>> 10) & 0x3ff) | 0xd800);\n codepoint = 0xdc00 | (codepoint & 0x3ff);\n }\n out.push(codepoint);\n }\n else {\n // FIXME: we're ignoring this\n }\n }\n return String.fromCharCode.apply(null, out);\n };\n scope['TextEncoder'] = FastTextEncoder;\n scope['TextDecoder'] = FastTextDecoder;\n})(typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : this);\n//# sourceMappingURL=text-encoding-polyfill.js.map","// 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","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","// eslint-disable-next-line import/no-unassigned-import\nimport './text-encoding-polyfill';\nconst decoder = new TextDecoder('utf-8');\nexport function decode(bytes) {\n return decoder.decode(bytes);\n}\nconst encoder = new TextEncoder();\nexport function encode(str) {\n return encoder.encode(str);\n}\n//# sourceMappingURL=utf8.browser.js.map","import { decode, encode } from './utf8';\nconst defaultByteLength = 1024 * 8;\nexport class IOBuffer {\n /**\n * @param data - The data to construct the IOBuffer with.\n * If data is a number, it will be the new buffer's length
\n * If data is `undefined`, the buffer will be initialized with a default length of 8Kb
\n * If data is an ArrayBuffer, SharedArrayBuffer, an ArrayBufferView (Typed Array), an IOBuffer instance,\n * or a Node.js Buffer, a view will be created over the underlying ArrayBuffer.\n * @param options\n */\n constructor(data = defaultByteLength, options = {}) {\n let dataIsGiven = false;\n if (typeof data === 'number') {\n data = new ArrayBuffer(data);\n }\n else {\n dataIsGiven = true;\n this.lastWrittenByte = data.byteLength;\n }\n const offset = options.offset ? options.offset >>> 0 : 0;\n const byteLength = data.byteLength - offset;\n let dvOffset = offset;\n if (ArrayBuffer.isView(data) || data instanceof IOBuffer) {\n if (data.byteLength !== data.buffer.byteLength) {\n dvOffset = data.byteOffset + offset;\n }\n data = data.buffer;\n }\n if (dataIsGiven) {\n this.lastWrittenByte = byteLength;\n }\n else {\n this.lastWrittenByte = 0;\n }\n this.buffer = data;\n this.length = byteLength;\n this.byteLength = byteLength;\n this.byteOffset = dvOffset;\n this.offset = 0;\n this.littleEndian = true;\n this._data = new DataView(this.buffer, dvOffset, byteLength);\n this._mark = 0;\n this._marks = [];\n }\n /**\n * Checks if the memory allocated to the buffer is sufficient to store more\n * bytes after the offset.\n * @param byteLength - The needed memory in bytes.\n * @returns `true` if there is sufficient space and `false` otherwise.\n */\n available(byteLength = 1) {\n return this.offset + byteLength <= this.length;\n }\n /**\n * Check if little-endian mode is used for reading and writing multi-byte\n * values.\n * @returns `true` if little-endian mode is used, `false` otherwise.\n */\n isLittleEndian() {\n return this.littleEndian;\n }\n /**\n * Set little-endian mode for reading and writing multi-byte values.\n */\n setLittleEndian() {\n this.littleEndian = true;\n return this;\n }\n /**\n * Check if big-endian mode is used for reading and writing multi-byte values.\n * @returns `true` if big-endian mode is used, `false` otherwise.\n */\n isBigEndian() {\n return !this.littleEndian;\n }\n /**\n * Switches to big-endian mode for reading and writing multi-byte values.\n */\n setBigEndian() {\n this.littleEndian = false;\n return this;\n }\n /**\n * Move the pointer n bytes forward.\n * @param n - Number of bytes to skip.\n */\n skip(n = 1) {\n this.offset += n;\n return this;\n }\n /**\n * Move the pointer to the given offset.\n * @param offset\n */\n seek(offset) {\n this.offset = offset;\n return this;\n }\n /**\n * Store the current pointer offset.\n * @see {@link IOBuffer#reset}\n */\n mark() {\n this._mark = this.offset;\n return this;\n }\n /**\n * Move the pointer back to the last pointer offset set by mark.\n * @see {@link IOBuffer#mark}\n */\n reset() {\n this.offset = this._mark;\n return this;\n }\n /**\n * Push the current pointer offset to the mark stack.\n * @see {@link IOBuffer#popMark}\n */\n pushMark() {\n this._marks.push(this.offset);\n return this;\n }\n /**\n * Pop the last pointer offset from the mark stack, and set the current\n * pointer offset to the popped value.\n * @see {@link IOBuffer#pushMark}\n */\n popMark() {\n const offset = this._marks.pop();\n if (offset === undefined) {\n throw new Error('Mark stack empty');\n }\n this.seek(offset);\n return this;\n }\n /**\n * Move the pointer offset back to 0.\n */\n rewind() {\n this.offset = 0;\n return this;\n }\n /**\n * Make sure the buffer has sufficient memory to write a given byteLength at\n * the current pointer offset.\n * If the buffer's memory is insufficient, this method will create a new\n * buffer (a copy) with a length that is twice (byteLength + current offset).\n * @param byteLength\n */\n ensureAvailable(byteLength = 1) {\n if (!this.available(byteLength)) {\n const lengthNeeded = this.offset + byteLength;\n const newLength = lengthNeeded * 2;\n const newArray = new Uint8Array(newLength);\n newArray.set(new Uint8Array(this.buffer));\n this.buffer = newArray.buffer;\n this.length = this.byteLength = newLength;\n this._data = new DataView(this.buffer);\n }\n return this;\n }\n /**\n * Read a byte and return false if the byte's value is 0, or true otherwise.\n * Moves pointer forward by one byte.\n */\n readBoolean() {\n return this.readUint8() !== 0;\n }\n /**\n * Read a signed 8-bit integer and move pointer forward by 1 byte.\n */\n readInt8() {\n return this._data.getInt8(this.offset++);\n }\n /**\n * Read an unsigned 8-bit integer and move pointer forward by 1 byte.\n */\n readUint8() {\n return this._data.getUint8(this.offset++);\n }\n /**\n * Alias for {@link IOBuffer#readUint8}.\n */\n readByte() {\n return this.readUint8();\n }\n /**\n * Read `n` bytes and move pointer forward by `n` bytes.\n */\n readBytes(n = 1) {\n const bytes = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n bytes[i] = this.readByte();\n }\n return bytes;\n }\n /**\n * Read a 16-bit signed integer and move pointer forward by 2 bytes.\n */\n readInt16() {\n const value = this._data.getInt16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 16-bit unsigned integer and move pointer forward by 2 bytes.\n */\n readUint16() {\n const value = this._data.getUint16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 32-bit signed integer and move pointer forward by 4 bytes.\n */\n readInt32() {\n const value = this._data.getInt32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit unsigned integer and move pointer forward by 4 bytes.\n */\n readUint32() {\n const value = this._data.getUint32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit floating number and move pointer forward by 4 bytes.\n */\n readFloat32() {\n const value = this._data.getFloat32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 64-bit floating number and move pointer forward by 8 bytes.\n */\n readFloat64() {\n const value = this._data.getFloat64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 64-bit signed integer number and move pointer forward by 8 bytes.\n */\n readBigInt64() {\n const value = this._data.getBigInt64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 64-bit unsigned integer number and move pointer forward by 8 bytes.\n */\n readBigUint64() {\n const value = this._data.getBigUint64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 1-byte ASCII character and move pointer forward by 1 byte.\n */\n readChar() {\n return String.fromCharCode(this.readInt8());\n }\n /**\n * Read `n` 1-byte ASCII characters and move pointer forward by `n` bytes.\n */\n readChars(n = 1) {\n let result = '';\n for (let i = 0; i < n; i++) {\n result += this.readChar();\n }\n return result;\n }\n /**\n * Read the next `n` bytes, return a UTF-8 decoded string and move pointer\n * forward by `n` bytes.\n */\n readUtf8(n = 1) {\n return decode(this.readBytes(n));\n }\n /**\n * Write 0xff if the passed value is truthy, 0x00 otherwise and move pointer\n * forward by 1 byte.\n */\n writeBoolean(value) {\n this.writeUint8(value ? 0xff : 0x00);\n return this;\n }\n /**\n * Write `value` as an 8-bit signed integer and move pointer forward by 1 byte.\n */\n writeInt8(value) {\n this.ensureAvailable(1);\n this._data.setInt8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as an 8-bit unsigned integer and move pointer forward by 1\n * byte.\n */\n writeUint8(value) {\n this.ensureAvailable(1);\n this._data.setUint8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * An alias for {@link IOBuffer#writeUint8}.\n */\n writeByte(value) {\n return this.writeUint8(value);\n }\n /**\n * Write all elements of `bytes` as uint8 values and move pointer forward by\n * `bytes.length` bytes.\n */\n writeBytes(bytes) {\n this.ensureAvailable(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n this._data.setUint8(this.offset++, bytes[i]);\n }\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit signed integer and move pointer forward by 2\n * bytes.\n */\n writeInt16(value) {\n this.ensureAvailable(2);\n this._data.setInt16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit unsigned integer and move pointer forward by 2\n * bytes.\n */\n writeUint16(value) {\n this.ensureAvailable(2);\n this._data.setUint16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit signed integer and move pointer forward by 4\n * bytes.\n */\n writeInt32(value) {\n this.ensureAvailable(4);\n this._data.setInt32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit unsigned integer and move pointer forward by 4\n * bytes.\n */\n writeUint32(value) {\n this.ensureAvailable(4);\n this._data.setUint32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit floating number and move pointer forward by 4\n * bytes.\n */\n writeFloat32(value) {\n this.ensureAvailable(4);\n this._data.setFloat32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit floating number and move pointer forward by 8\n * bytes.\n */\n writeFloat64(value) {\n this.ensureAvailable(8);\n this._data.setFloat64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit signed bigint and move pointer forward by 8\n * bytes.\n */\n writeBigInt64(value) {\n this.ensureAvailable(8);\n this._data.setBigInt64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit unsigned bigint and move pointer forward by 8\n * bytes.\n */\n writeBigUint64(value) {\n this.ensureAvailable(8);\n this._data.setBigUint64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write the charCode of `str`'s first character as an 8-bit unsigned integer\n * and move pointer forward by 1 byte.\n */\n writeChar(str) {\n return this.writeUint8(str.charCodeAt(0));\n }\n /**\n * Write the charCodes of all `str`'s characters as 8-bit unsigned integers\n * and move pointer forward by `str.length` bytes.\n */\n writeChars(str) {\n for (let i = 0; i < str.length; i++) {\n this.writeUint8(str.charCodeAt(i));\n }\n return this;\n }\n /**\n * UTF-8 encode and write `str` to the current pointer offset and move pointer\n * forward according to the encoded length.\n */\n writeUtf8(str) {\n return this.writeBytes(encode(str));\n }\n /**\n * Export a Uint8Array view of the internal buffer.\n * The view starts at the byte offset and its length\n * is calculated to stop at the last written byte or the original length.\n */\n toArray() {\n return new Uint8Array(this.buffer, this.byteOffset, this.lastWrittenByte);\n }\n /**\n * Update the last written byte offset\n * @private\n */\n _updateLastWrittenByte() {\n if (this.offset > this.lastWrittenByte) {\n this.lastWrittenByte = this.offset;\n }\n }\n}\n//# sourceMappingURL=IOBuffer.js.map","\n/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED$1 = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN$1 = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1 = 30;\n/* number of distance codes */\n\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) =>\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS$1; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES$1; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES$1; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nconst copy_block = (s, buf, len, header) =>\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n s.pending_buf.set(s.window.subarray(buf, buf + len), s.pending);\n s.pending += len;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) =>\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let lx = 0; /* running index in l_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE$1;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) =>\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let black_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS$1; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN$1) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block$1(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) =>\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //let out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n};\n\nvar _tr_init_1 = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1 = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_UNKNOWN,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES = 30;\n/* number of distance codes */\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42;\nconst EXTRA_STATE = 69;\nconst NAME_STATE = 73;\nconst COMMENT_STATE = 91;\nconst HCRC_STATE = 103;\nconst BUSY_STATE = 113;\nconst FINISH_STATE = 666;\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n let max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n const max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n};\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nconst deflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH$2;\n _tr_init(s);\n return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK$3) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$2; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR$2; }\n strm.state.gzhead = head;\n return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR$2;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION$1) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\nconst deflate$2 = (strm, flush) => {\n\n let beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK$1 || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n }\n\n s.strm = strm; /* just in case */\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK$3;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH$3) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n let bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK$3;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align(s);\n }\n else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH$1) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK$3;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH$3) { return Z_OK$3; }\n if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR$2;\n }\n\n const status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR$2;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_STRATEGY,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY\n }, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1$2.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1$2.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1$2.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$2) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1$2.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$2;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$2) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate$1(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 30; /* got a data error -- remain here until reset */\nconst TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n// let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS$1) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 1; /* i: waiting for magic header */\nconst FLAGS = 2; /* i: waiting for method and flags (gzip) */\nconst TIME = 3; /* i: waiting for modification time (gzip) */\nconst OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 5; /* i: waiting for extra length (gzip) */\nconst EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nconst NAME = 7; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 8; /* i: waiting for end of comment (gzip) */\nconst HCRC = 9; /* i: waiting for header crc (gzip) */\nconst DICTID = 10; /* i: waiting for dictionary check value */\nconst DICT = 11; /* waiting for inflateSetDictionary() call */\nconst TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 14; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 17; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 18; /* i: waiting for code length code lengths */\nconst CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 20; /* i: same as LEN below, but only first time in */\nconst LEN = 21; /* i: waiting for length/lit/eob code */\nconst LENEXT = 22; /* i: waiting for length extra bits */\nconst DIST = 23; /* i: waiting for distance code */\nconst DISTEXT = 24; /* i: waiting for distance extra bits */\nconst MATCH = 25; /* o: waiting for output space to copy string */\nconst LIT = 26; /* o: waiting for output space to write literal */\nconst CHECK = 27; /* i: waiting for 32-bit check value */\nconst LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 29; /* finished check, done -- remain here until reset */\nconst BAD = 30; /* got a data error -- remain here until reset */\nconst MEM = 31; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$2.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$2.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$2.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1$2.inflateReset(strm);\n status = inflate_1$2.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$2.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate$1(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip };\n","export const pngSignature = [137, 80, 78, 71, 13, 10, 26, 10];\nconst crcTable = [];\nfor (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n if (c & 1) {\n c = 0xedb88320 ^ (c >>> 1);\n }\n else {\n c = c >>> 1;\n }\n }\n crcTable[n] = c;\n}\nconst initialCrc = 0xffffffff;\nfunction updateCrc(currentCrc, data, length) {\n let c = currentCrc;\n for (let n = 0; n < length; n++) {\n c = crcTable[(c ^ data[n]) & 0xff] ^ (c >>> 8);\n }\n return c;\n}\nexport function crc(data, length) {\n return (updateCrc(initialCrc, data, length) ^ initialCrc) >>> 0;\n}\n//# sourceMappingURL=common.js.map","export var ColorType;\n(function (ColorType) {\n ColorType[ColorType[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n ColorType[ColorType[\"GREYSCALE\"] = 0] = \"GREYSCALE\";\n ColorType[ColorType[\"TRUECOLOUR\"] = 2] = \"TRUECOLOUR\";\n ColorType[ColorType[\"INDEXED_COLOUR\"] = 3] = \"INDEXED_COLOUR\";\n ColorType[ColorType[\"GREYSCALE_ALPHA\"] = 4] = \"GREYSCALE_ALPHA\";\n ColorType[ColorType[\"TRUECOLOUR_ALPHA\"] = 6] = \"TRUECOLOUR_ALPHA\";\n})(ColorType || (ColorType = {}));\nexport var CompressionMethod;\n(function (CompressionMethod) {\n CompressionMethod[CompressionMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n CompressionMethod[CompressionMethod[\"DEFLATE\"] = 0] = \"DEFLATE\";\n})(CompressionMethod || (CompressionMethod = {}));\nexport var FilterMethod;\n(function (FilterMethod) {\n FilterMethod[FilterMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n FilterMethod[FilterMethod[\"ADAPTIVE\"] = 0] = \"ADAPTIVE\";\n})(FilterMethod || (FilterMethod = {}));\nexport var InterlaceMethod;\n(function (InterlaceMethod) {\n InterlaceMethod[InterlaceMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n InterlaceMethod[InterlaceMethod[\"NO_INTERLACE\"] = 0] = \"NO_INTERLACE\";\n InterlaceMethod[InterlaceMethod[\"ADAM7\"] = 1] = \"ADAM7\";\n})(InterlaceMethod || (InterlaceMethod = {}));\n//# sourceMappingURL=internalTypes.js.map","import { IOBuffer } from 'iobuffer';\nimport { inflate, Inflate as Inflator } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst empty = new Uint8Array(0);\nconst NULL = '\\0';\nconst uint16 = new Uint16Array([0x00ff]);\nconst uint8 = new Uint8Array(uint16.buffer);\nconst osIsLittleEndian = uint8[0] === 0xff;\nexport default class PngDecoder extends IOBuffer {\n constructor(data, options = {}) {\n super(data);\n const { checkCrc = false } = options;\n this._checkCrc = checkCrc;\n this._inflator = new Inflator();\n this._png = {\n width: -1,\n height: -1,\n channels: -1,\n data: new Uint8Array(0),\n depth: 1,\n text: {},\n };\n this._end = false;\n this._hasPalette = false;\n this._palette = [];\n this._compressionMethod = CompressionMethod.UNKNOWN;\n this._filterMethod = FilterMethod.UNKNOWN;\n this._interlaceMethod = InterlaceMethod.UNKNOWN;\n this._colorType = -1;\n // PNG is always big endian\n // https://www.w3.org/TR/PNG/#7Integers-and-byte-order\n this.setBigEndian();\n }\n decode() {\n this.decodeSignature();\n while (!this._end) {\n this.decodeChunk();\n }\n this.decodeImage();\n return this._png;\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n decodeSignature() {\n for (let i = 0; i < pngSignature.length; i++) {\n if (this.readUint8() !== pngSignature[i]) {\n throw new Error(`wrong PNG signature. Byte at ${i} should be ${pngSignature[i]}.`);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#5Chunk-layout\n decodeChunk() {\n const length = this.readUint32();\n const type = this.readChars(4);\n const offset = this.offset;\n switch (type) {\n // 11.2 Critical chunks\n case 'IHDR': // 11.2.2 IHDR Image header\n this.decodeIHDR();\n break;\n case 'PLTE': // 11.2.3 PLTE Palette\n this.decodePLTE(length);\n break;\n case 'IDAT': // 11.2.4 IDAT Image data\n this.decodeIDAT(length);\n break;\n case 'IEND': // 11.2.5 IEND Image trailer\n this._end = true;\n break;\n // 11.3 Ancillary chunks\n case 'tRNS': // 11.3.2.1 tRNS Transparency\n this.decodetRNS(length);\n break;\n case 'iCCP': // 11.3.3.3 iCCP Embedded ICC profile\n this.decodeiCCP(length);\n break;\n case 'tEXt': // 11.3.4.3 tEXt Textual data\n this.decodetEXt(length);\n break;\n case 'pHYs': // 11.3.5.3 pHYs Physical pixel dimensions\n this.decodepHYs();\n break;\n default:\n this.skip(length);\n break;\n }\n if (this.offset - offset !== length) {\n throw new Error(`Length mismatch while decoding chunk ${type}`);\n }\n if (this._checkCrc) {\n const expectedCrc = this.readUint32();\n const crcLength = length + 4; // includes type\n const actualCrc = crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - crcLength - 4, crcLength), crcLength); // \"- 4\" because we already advanced by reading the CRC\n if (actualCrc !== expectedCrc) {\n throw new Error(`CRC mismatch for chunk ${type}. Expected ${expectedCrc}, found ${actualCrc}`);\n }\n }\n else {\n this.skip(4);\n }\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n decodeIHDR() {\n const image = this._png;\n image.width = this.readUint32();\n image.height = this.readUint32();\n image.depth = checkBitDepth(this.readUint8());\n const colorType = this.readUint8();\n this._colorType = colorType;\n let channels;\n switch (colorType) {\n case ColorType.GREYSCALE:\n channels = 1;\n break;\n case ColorType.TRUECOLOUR:\n channels = 3;\n break;\n case ColorType.INDEXED_COLOUR:\n channels = 1;\n break;\n case ColorType.GREYSCALE_ALPHA:\n channels = 2;\n break;\n case ColorType.TRUECOLOUR_ALPHA:\n channels = 4;\n break;\n default:\n throw new Error(`Unknown color type: ${colorType}`);\n }\n this._png.channels = channels;\n this._compressionMethod = this.readUint8();\n if (this._compressionMethod !== CompressionMethod.DEFLATE) {\n throw new Error(`Unsupported compression method: ${this._compressionMethod}`);\n }\n this._filterMethod = this.readUint8();\n this._interlaceMethod = this.readUint8();\n }\n // https://www.w3.org/TR/PNG/#11PLTE\n decodePLTE(length) {\n if (length % 3 !== 0) {\n throw new RangeError(`PLTE field length must be a multiple of 3. Got ${length}`);\n }\n const l = length / 3;\n this._hasPalette = true;\n const palette = [];\n this._palette = palette;\n for (let i = 0; i < l; i++) {\n palette.push([this.readUint8(), this.readUint8(), this.readUint8()]);\n }\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n decodeIDAT(length) {\n this._inflator.push(new Uint8Array(this.buffer, this.offset + this.byteOffset, length));\n this.skip(length);\n }\n // https://www.w3.org/TR/PNG/#11tRNS\n decodetRNS(length) {\n // TODO: support other color types.\n if (this._colorType === 3) {\n if (length > this._palette.length) {\n throw new Error(`tRNS chunk contains more alpha values than there are palette colors (${length} vs ${this._palette.length})`);\n }\n let i = 0;\n for (; i < length; i++) {\n const alpha = this.readByte();\n this._palette[i].push(alpha);\n }\n for (; i < this._palette.length; i++) {\n this._palette[i].push(255);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#11iCCP\n decodeiCCP(length) {\n let name = '';\n let char;\n while ((char = this.readChar()) !== NULL) {\n name += char;\n }\n const compressionMethod = this.readUint8();\n if (compressionMethod !== CompressionMethod.DEFLATE) {\n throw new Error(`Unsupported iCCP compression method: ${compressionMethod}`);\n }\n const compressedProfile = this.readBytes(length - name.length - 2);\n this._png.iccEmbeddedProfile = {\n name: name,\n profile: inflate(compressedProfile),\n };\n }\n // https://www.w3.org/TR/PNG/#11tEXt\n decodetEXt(length) {\n let keyword = '';\n let char;\n while ((char = this.readChar()) !== NULL) {\n keyword += char;\n }\n this._png.text[keyword] = this.readChars(length - keyword.length - 1);\n }\n // https://www.w3.org/TR/PNG/#11pHYs\n decodepHYs() {\n const ppuX = this.readUint32();\n const ppuY = this.readUint32();\n const unitSpecifier = this.readByte();\n this._png.resolution = { x: ppuX, y: ppuY, unit: unitSpecifier };\n }\n decodeImage() {\n if (this._inflator.err) {\n throw new Error(`Error while decompressing the data: ${this._inflator.err}`);\n }\n const data = this._inflator.result;\n if (this._filterMethod !== FilterMethod.ADAPTIVE) {\n throw new Error(`Filter method ${this._filterMethod} not supported`);\n }\n if (this._interlaceMethod === InterlaceMethod.NO_INTERLACE) {\n this.decodeInterlaceNull(data);\n }\n else {\n throw new Error(`Interlace method ${this._interlaceMethod} not supported`);\n }\n }\n decodeInterlaceNull(data) {\n const height = this._png.height;\n const bytesPerPixel = (this._png.channels * this._png.depth) / 8;\n const bytesPerLine = this._png.width * bytesPerPixel;\n const newData = new Uint8Array(this._png.height * bytesPerLine);\n let prevLine = empty;\n let offset = 0;\n let currentLine;\n let newLine;\n for (let i = 0; i < height; i++) {\n currentLine = data.subarray(offset + 1, offset + 1 + bytesPerLine);\n newLine = newData.subarray(i * bytesPerLine, (i + 1) * bytesPerLine);\n switch (data[offset]) {\n case 0:\n unfilterNone(currentLine, newLine, bytesPerLine);\n break;\n case 1:\n unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel);\n break;\n case 2:\n unfilterUp(currentLine, newLine, prevLine, bytesPerLine);\n break;\n case 3:\n unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n case 4:\n unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n default:\n throw new Error(`Unsupported filter: ${data[offset]}`);\n }\n prevLine = newLine;\n offset += bytesPerLine + 1;\n }\n if (this._hasPalette) {\n this._png.palette = this._palette;\n }\n if (this._png.depth === 16) {\n const uint16Data = new Uint16Array(newData.buffer);\n if (osIsLittleEndian) {\n for (let k = 0; k < uint16Data.length; k++) {\n // PNG is always big endian. Swap the bytes.\n uint16Data[k] = swap16(uint16Data[k]);\n }\n }\n this._png.data = uint16Data;\n }\n else {\n this._png.data = newData;\n }\n }\n}\nfunction unfilterNone(currentLine, newLine, bytesPerLine) {\n for (let i = 0; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n}\nfunction unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n for (; i < bytesPerPixel; i++) {\n // just copy first bytes\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n}\nfunction unfilterUp(currentLine, newLine, prevLine, bytesPerLine) {\n let i = 0;\n if (prevLine.length === 0) {\n // just copy bytes for first line\n for (; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n }\n else {\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n }\n}\nfunction unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + (newLine[i - bytesPerPixel] >> 1)) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + (prevLine[i] >> 1)) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] + ((newLine[i - bytesPerPixel] + prevLine[i]) >> 1)) &\n 0xff;\n }\n }\n}\nfunction unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] +\n paethPredictor(newLine[i - bytesPerPixel], prevLine[i], prevLine[i - bytesPerPixel])) &\n 0xff;\n }\n }\n}\nfunction paethPredictor(a, b, c) {\n const p = a + b - c;\n const pa = Math.abs(p - a);\n const pb = Math.abs(p - b);\n const pc = Math.abs(p - c);\n if (pa <= pb && pa <= pc)\n return a;\n else if (pb <= pc)\n return b;\n else\n return c;\n}\nfunction swap16(val) {\n return ((val & 0xff) << 8) | ((val >> 8) & 0xff);\n}\nfunction checkBitDepth(value) {\n if (value !== 1 &&\n value !== 2 &&\n value !== 4 &&\n value !== 8 &&\n value !== 16) {\n throw new Error(`invalid bit depth: ${value}`);\n }\n return value;\n}\n//# sourceMappingURL=PngDecoder.js.map","import { IOBuffer } from 'iobuffer';\nimport { deflate } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst defaultZlibOptions = {\n level: 3,\n};\nexport default class PngEncoder extends IOBuffer {\n constructor(data, options = {}) {\n super();\n this._colorType = ColorType.UNKNOWN;\n this._zlibOptions = Object.assign({}, defaultZlibOptions, options.zlib);\n this._png = this._checkData(data);\n this.setBigEndian();\n }\n encode() {\n this.encodeSignature();\n this.encodeIHDR();\n this.encodeData();\n this.encodeIEND();\n return this.toArray();\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n encodeSignature() {\n this.writeBytes(pngSignature);\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n encodeIHDR() {\n this.writeUint32(13);\n this.writeChars('IHDR');\n this.writeUint32(this._png.width);\n this.writeUint32(this._png.height);\n this.writeByte(this._png.depth);\n this.writeByte(this._colorType);\n this.writeByte(CompressionMethod.DEFLATE);\n this.writeByte(FilterMethod.ADAPTIVE);\n this.writeByte(InterlaceMethod.NO_INTERLACE);\n this.writeCrc(17);\n }\n // https://www.w3.org/TR/PNG/#11IEND\n encodeIEND() {\n this.writeUint32(0);\n this.writeChars('IEND');\n this.writeCrc(4);\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n encodeIDAT(data) {\n this.writeUint32(data.length);\n this.writeChars('IDAT');\n this.writeBytes(data);\n this.writeCrc(data.length + 4);\n }\n encodeData() {\n const { width, height, channels, depth, data } = this._png;\n const slotsPerLine = channels * width;\n const newData = new IOBuffer().setBigEndian();\n let offset = 0;\n for (let i = 0; i < height; i++) {\n newData.writeByte(0); // no filter\n /* istanbul ignore else */\n if (depth === 8) {\n offset = writeDataBytes(data, newData, slotsPerLine, offset);\n }\n else if (depth === 16) {\n offset = writeDataUint16(data, newData, slotsPerLine, offset);\n }\n else {\n throw new Error('unreachable');\n }\n }\n const buffer = newData.toArray();\n const compressed = deflate(buffer, this._zlibOptions);\n this.encodeIDAT(compressed);\n }\n _checkData(data) {\n const { colorType, channels, depth } = getColorType(data);\n const png = {\n width: checkInteger(data.width, 'width'),\n height: checkInteger(data.height, 'height'),\n channels: channels,\n data: data.data,\n depth: depth,\n text: {},\n };\n this._colorType = colorType;\n const expectedSize = png.width * png.height * channels;\n if (png.data.length !== expectedSize) {\n throw new RangeError(`wrong data size. Found ${png.data.length}, expected ${expectedSize}`);\n }\n return png;\n }\n writeCrc(length) {\n this.writeUint32(crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - length, length), length));\n }\n}\nfunction checkInteger(value, name) {\n if (Number.isInteger(value) && value > 0) {\n return value;\n }\n throw new TypeError(`${name} must be a positive integer`);\n}\nfunction getColorType(data) {\n const { channels = 4, depth = 8 } = data;\n if (channels !== 4 && channels !== 3 && channels !== 2 && channels !== 1) {\n throw new RangeError(`unsupported number of channels: ${channels}`);\n }\n if (depth !== 8 && depth !== 16) {\n throw new RangeError(`unsupported bit depth: ${depth}`);\n }\n const returnValue = { channels, depth, colorType: ColorType.UNKNOWN };\n switch (channels) {\n case 4:\n returnValue.colorType = ColorType.TRUECOLOUR_ALPHA;\n break;\n case 3:\n returnValue.colorType = ColorType.TRUECOLOUR;\n break;\n case 1:\n returnValue.colorType = ColorType.GREYSCALE;\n break;\n case 2:\n returnValue.colorType = ColorType.GREYSCALE_ALPHA;\n break;\n default:\n throw new Error('unsupported number of channels');\n }\n return returnValue;\n}\nfunction writeDataBytes(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeByte(data[offset++]);\n }\n return offset;\n}\nfunction writeDataUint16(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeUint16(data[offset++]);\n }\n return offset;\n}\n//# sourceMappingURL=PngEncoder.js.map","export var ResolutionUnitSpecifier;\n(function (ResolutionUnitSpecifier) {\n /**\n * Unit is unknown\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n /**\n * Unit is the metre\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"METRE\"] = 1] = \"METRE\";\n})(ResolutionUnitSpecifier || (ResolutionUnitSpecifier = {}));\n//# sourceMappingURL=types.js.map","/*\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 { webp2png } from './webp';\r\nimport type { WebpConvertTask } from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: WebpConvertTask[] = [];\r\n//let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n //isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n //if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n //isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n \r\n ctx.postMessage({\r\n type: 'convertWebp', \r\n payload: {\r\n fileName, \r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: WebpConvertTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n \r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\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 { WebPDecoder } from '../../vendor/libwebp-0.2.0';\r\nimport { encode } from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8,\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\n","import PngDecoder from './PngDecoder';\nimport PngEncoder from './PngEncoder';\nexport * from './types';\nfunction decodePng(data, options) {\n const decoder = new PngDecoder(data, options);\n return decoder.decode();\n}\nfunction encodePng(png, options) {\n const encoder = new PngEncoder(png, options);\n return encoder.encode();\n}\nexport { decodePng as decode, encodePng as encode };\n//# sourceMappingURL=index.js.map"],"names":["scope","FastTextEncoder","utfLabel","RangeError","FastTextDecoder","options","fatal","Error","Object","defineProperty","prototype","value","encode","string","stream","pos","len","length","at","tlen","Math","max","target","Uint8Array","charCodeAt","extra","update","set","slice","decode","buffer","bytes","out","byte1","push","byte2","byte3","codepoint","String","fromCharCode","apply","window","self","this","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","U","ld","md","$","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","WebPInitDecoderConfig","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","decoder","TextDecoder","encoder","TextEncoder","constructor","dataIsGiven","ArrayBuffer","lastWrittenByte","byteLength","dvOffset","isView","byteOffset","littleEndian","_data","DataView","_mark","_marks","available","isLittleEndian","setLittleEndian","isBigEndian","setBigEndian","skip","seek","mark","reset","pushMark","popMark","pop","rewind","ensureAvailable","newLength","newArray","readBoolean","readUint8","readInt8","getInt8","getUint8","readByte","readBytes","readInt16","getInt16","readUint16","getUint16","readInt32","getInt32","readUint32","getUint32","readFloat32","getFloat32","readFloat64","getFloat64","readBigInt64","getBigInt64","readBigUint64","getBigUint64","readChar","readChars","result","readUtf8","writeBoolean","writeUint8","writeInt8","setInt8","_updateLastWrittenByte","setUint8","writeByte","writeBytes","writeInt16","setInt16","writeUint16","setUint16","writeInt32","setInt32","writeUint32","setUint32","writeFloat32","setFloat32","writeFloat64","setFloat64","writeBigInt64","setBigInt64","writeBigUint64","setBigUint64","writeChar","str","writeChars","writeUtf8","toArray","zero$1","buf","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES$1","_dist_code","_length_code","MAX_MATCH$1","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","pending_buf","pending","send_bits","bi_valid","bi_buf","send_code","tree","bi_reverse","code","res","gen_codes","bl_count","next_code","MAX_BITS$1","bits","init_block","LITERALS$1","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","last_lit","matches","bi_windup","smaller","depth","_n2","_m2","pqdownheap","heap","heap_len","compress_block","ltree","dtree","lx","d_buf","l_buf","build_tree","desc","stree","node","heap_max","base","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","count","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block$1","stored_len","last","header","subarray","copy_block","trees","_tr_init","LENGTH_CODES$1","L_CODES$1","tr_static_init","l_desc","d_desc","bl_desc","_tr_stored_block","_tr_flush_block","opt_lenb","static_lenb","max_blindex","level","strm","data_type","black_mask","detect_data_type","BL_CODES$1","build_bl_tree","strategy","lcodes","dcodes","blcodes","rank","send_all_trees","_tr_tally","lit_bufsize","_tr_align","STATIC_TREES","bi_flush","adler32_1","adler","s1","s2","crcTable","Uint32Array","table","makeTable","crc32_1","crc","end","messages","constants$2","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","Z_NO_FLUSH$2","Z_FULL_FLUSH$1","Z_FINISH$3","Z_BLOCK$1","Z_OK$3","Z_STREAM_END$3","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_BUF_ERROR$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$2","MAX_MATCH","MIN_LOOKAHEAD","HCRC_STATE","BUSY_STATE","FINISH_STATE","err","errorCode","msg","zero","HASH","prev","hash_shift","hash_mask","flush_pending","state","avail_out","output","pending_out","next_out","total_out","flush_block_only","block_start","strstart","put_byte","putShortMSB","read_buf","start","avail_in","next_in","wrap","total_in","longest_match","cur_match","match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","window_size","hash_size","head","insert","ins_h","deflate_fast","flush","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","max_block_size","pending_buf_size","max_start","DeflateState","status","gzhead","gzindex","method","last_flush","w_bits","hash_bits","Uint16Array","HEAP_SIZE","MAX_BITS","deflateResetKeep","deflateReset","ret","deflateInit2","windowBits","memLevel","deflate_1$2","beg","val","old_flush","text","hcrc","name","comment","time","os","level_flags","bstate","deflate_huff","deflate_rle","dictionary","dictLength","tmpDict","avail","next","_has","obj","key","hasOwnProperty","common","sources","arguments","source","shift","TypeError","chunks","chunk","STR_APPLY_UIA_OK","__","_utf8len","strings","c2","m_pos","str_len","buf_len","utf16buf","c_len","buf2binstring","zstream","toString$1","toString","Z_NO_FLUSH$1","Z_FINISH$2","Z_OK$2","Z_STREAM_END$2","Z_DEFLATED$1","Deflate$1","chunkSize","opt","raw","gzip","ended","dict","_dict_set","deflate$1","deflator","flush_mode","_flush_mode","onData","onEnd","deflate_1$1","Deflate","deflate","deflateRaw","constants","inffast","_in","_out","dmax","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","from","from_source","lencode","distcode","lenbits","distbits","top","dolen","mode","dodist","sane","lbase","lext","dbase","dext","inftrees","type","lens","lens_index","codes","table_index","work","opts","incr","fill","low","mask","sym","min","root","curr","drop","left","used","huff","base_index","MAXBITS","offs","here_bits","here_op","here_val","extra_index","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_NEED_DICT$1","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_MEM_ERROR$1","TYPE","BAD","zswap32","InflateState","havedict","flags","check","total","wbits","ncode","nlen","ndist","have","lendyn","distdyn","back","was","inflateResetKeep","Int32Array","inflateReset","inflateReset2","inflateInit2","lenfix","distfix","virgin","fixedtables","updatewindow","src","copy","inflate_1$2","last_bits","last_op","last_val","hbuf","order","inf_leave","done","xflags","extra_len","dictid","gzheader","Inflate$1","to","inflate$1","inflator","last_avail_out","next_out_utf8","tail","utf8str","join","inflate_1$1","Inflate","inflate","inflateRaw","ungzip","deflate_1","initialCrc","InterlaceMethod","FilterMethod","CompressionMethod","ColorType","uint16","defaultZlibOptions","PngEncoder","super","_colorType","_zlibOptions","assign","zlib","_png","_checkData","encodeSignature","encodeIHDR","encodeData","encodeIEND","writeCrc","encodeIDAT","channels","slotsPerLine","newData","writeDataBytes","writeDataUint16","compressed","colorType","returnValue","getColorType","png","checkInteger","expectedSize","currentCrc","updateCrc","Number","isInteger","ResolutionUnitSpecifier","ctx","tasks","finishTask","processTasks","task","fileName","payload","convertedBytes","config","bitstream","webp2png","console","error","postMessage","addEventListener","event"],"sourceRoot":""} \ No newline at end of file diff --git a/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js b/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js new file mode 100644 index 00000000..79ffdece --- /dev/null +++ b/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js @@ -0,0 +1,3 @@ +!function(t){var e={};function a(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.m=t,a.c=e,a.d=function(t,e,n){a.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},a.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.t=function(t,e){if(1&e&&(t=a(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)a.d(n,r,function(e){return t[e]}.bind(null,r));return n},a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,"a",e),e},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},a.p="",a(a.s=1)}([function(t,e,a){"use strict";!function(t){if(t.TextEncoder&&t.TextDecoder)return!1;function e(t="utf-8"){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${t}') is invalid.`)}function a(t="utf-8",e={fatal:!1}){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${t}') is invalid.`);if(e.fatal)throw new Error("Failed to construct 'TextDecoder': the 'fatal' option is unsupported.")}Object.defineProperty(e.prototype,"encoding",{value:"utf-8"}),e.prototype.encode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to encode: the 'stream' option is unsupported.");let a=0;const n=t.length;let r=0,i=Math.max(32,n+(n>>1)+7),s=new Uint8Array(i>>3<<3);for(;a=55296&&e<=56319){if(a=55296&&e<=56319)continue}if(r+4>s.length){i+=8,i*=1+a/t.length*2,i=i>>3<<3;const e=new Uint8Array(i);e.set(s),s=e}if(0!=(4294967168&e)){if(0==(4294965248&e))s[r++]=e>>6&31|192;else if(0==(4294901760&e))s[r++]=e>>12&15|224,s[r++]=e>>6&63|128;else{if(0!=(4292870144&e))continue;s[r++]=e>>18&7|240,s[r++]=e>>12&63|128,s[r++]=e>>6&63|128}s[r++]=63&e|128}else s[r++]=e}return s.slice(0,r)},Object.defineProperty(a.prototype,"encoding",{value:"utf-8"}),Object.defineProperty(a.prototype,"fatal",{value:!1}),Object.defineProperty(a.prototype,"ignoreBOM",{value:!1}),a.prototype.decode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to decode: the 'stream' option is unsupported.");const a=new Uint8Array(t);let n=0;const r=a.length,i=[];for(;n65535&&(e-=65536,i.push(e>>>10&1023|55296),e=56320|1023&e),i.push(e)}}return String.fromCharCode.apply(null,i)},t.TextEncoder=e,t.TextDecoder=a}("undefined"!=typeof window?window:"undefined"!=typeof self?self:this)},function(t,e,a){"use strict";let n,r;a.r(e);const i=null;function s(t){return JSON.parse(JSON.stringify(t))}function o(t,e,a,r,i){for(n=0;n=0;--a)e=s(_(t[a],e));return e}function p(t){if(!t)throw Error("assert :P")}const g=function(){function t(t){return t==Be||t==Le||t==Ce||t==Fe}function e(t){return m(t,1)}function a(t,e){const a=1+((t.la-1)*e>>8),n=a<<8;let r=0;for(t.Z>=n?(r=1,t.la-=a,t.Z-=n):(r=0,t.la=a);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return r}function g(t,e,a,n){(n-=a)>=2?(t.Z=e[a+0]<<8|e[a+1],t.qa=e,t.Ia=a+2,t.bc=n-2):(t.Z=0,t.qa=i,t.bc=0),t.la=255,t.gc=0}function m(t,e){var n=0,r=0;for(r=e-1;r>=0;r--)n|=a(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function A(t){t.g>=8&&y(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function E(t,e){let a=0;if(p(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return a;a=t.T>>t.g&sa[e],t.g+=e,t.g>=8&&t.g>=8&&y(t)}else t.fa=1;return a}function R(t){return t.Pa==t.gb}function U(t,e){return p(t!=i),0==e?0:(t.gb=2*e-1,t.Y=b(t.gb,Pa),t.Y==i?0:(t.Y[0].s=-1,t.Pa=1))}function x(t){t!=i&&(t.Y=i,t.Y=i,t.gb=0,t.Pa=0)}function T(t,e,a,n){for(var r=t.Y,i=0,s=+t.gb;n-- >0;){if(i>=s)return 0;if(r[i].s<0){if(R(t))return 0;const e=t,a=e.Y,n=+e.Pa;r[i].s=n-i,e.Pa+=2,a[n+0].s=-1,a[n+1].s=-1}else if(0==r[i].s)return 0;i+=r[i].s+(a>>n&1)}if(r[i].s<0)r[i].s=0;else if(0!=r[i].s)return 0;return r[i].kc=e,1}function S(t,e,a){var n=0;let r=0,s=0;for(p(t!=i),p(e!=i),n=0;n0&&(++r,s=n);if(!U(t,r))return 0;if(1==r)return s<0||s>=a?(x(t),0):T(t,s,0,0);if(r=0,s=_(a,0),s==i)return(r=r&&R(t))||x(t),r;var o=0;o=0,n=_(wa+1,0);let l=0;const f=_(wa+1,0);let h=0;for(p(e!=i),p(a>0),p(s!=i),o=0;oh&&(h=e[o]);if(h>wa)n=0;else{for(o=0;o0?f[e[o]]++:La;n=1}if(!n)return(r=r&&R(t))||x(t),r;for(n=0;n0&&!T(t,n,s[n],e[n]))return(r=r&&R(t))||x(t),r;return(r=R(t))||x(t),r}function z(t,e,a,n,r,i,s){var o=0;for(o=0;ot.P.v)&&(a=0==e)){t:{let e=t.Ga;var r=t.G,l=t.ub;a=t.P.l;let u=t.P.v;const b=t.Xb;var f=[i];let w=i,g=u*a;var h=i,c=i;c="WEBP_FILTER_TYPE";let m=0;f=0;var d=0;let v=0;if(p(a>0&&u>0&&n>=a),p(e!=i&&b!=i),l<=Ea)a=0;else if(v=e[r+0]>>0&3,c=e[r+0]>>2&3,m=e[r+0]>>4&3,f=e[r+0]>>6&3,vUa||c>=Un||m>xa||0!=f)a=0;else{if(v==Ra)d=l>=g,f=e,w=r+Ea;else{if(f=_(g,0),w=0,f==i){a=0;break t}d=r+Ea,l=l-Ea,r=f,h=s(ta);let t=0;const n=jt();n==i?d=0:(n.l=a,n.v=u,n.N=h,ct(Te),h.put=ge,h.Mb=pe,h.Pb=me,h.ka=i,h.ka=r,h.fd=0,h.width=a,h.height=u,n.a=He,k(n.o,e,d,l),n.Wa=vn,Kt(a,u,1,n,i)&&Yt(n,a)&&(n.Wa=mn,t=Vt(n,n.V,n.Ha,n.l,n.v,qt)),n!=i&&Gt(n),d=t)}if(d){for(e=xn[c],e!=i?((h=_(g,0))==i&&(d=0,v!=Ra&&(w=f=i)),e(f,w,a,u,1,a,h,c=0),g=h,v=c):(g=f,v=w),e=0;u-- >0;)o(b,e,g,v,a),v+=a,e+=n;m==xa&&(d=f==i||w<=0||a<=0?0:1)}a=d}}a=!a}return a?i:0==e?t.Xb:+e*n}function D(t,e,a,n){if(n==i||t<=0||e<=0)return Ge;if(a!=i){if(a.Ua){const n=a.wc,r=a.vc,i=-2&a.t,s=-2&a.k;if(i<0||s<0||n<=0||r<=0||i+n>t||s+r>e)return Ge;t=n,e=r}if(a.I){if(a.Ba<=0||a.Aa<=0)return Ge;t=a.Ba,e=a.Aa}}return n.width=t,n.height=e,function(t){let e=t.width;const a=t.height;let n=t.J;if(e<=0||a<=0||!(n>=Se&&n=Se&&s=o*Tn[s],n&=t.ma!=i):(f=(t=t.c.Va).nb*parseInt((l+1)/2,10),h=t.rb*parseInt((l+1)/2,10),c=t.Fa*l,n&=t.F*l<=t.Wc,n&=f<=t.Rc,n&=h<=t.Uc,n&=c<=t.Wb,n&=t.F>=o,n&=t.nb>=parseInt((o+1)/2,10),n&=t.rb>=parseInt((o+1)/2,10),n&=t.y!=i,n&=t.c!=i,n&=t.S!=i,s==Me&&(n&=t.Fa>=o,n&=c<=t.Wb,n&=t.p!=i)):n=0,n?He:Ge}(n)}function I(t){return-256&t?t<0?0:255:t}function N(t,e,a,n){const r=_(16,0);let i,s;for(i=0,s=0;s<4;++s){var o=t[e+0]+t[e+8],l=t[e+0]-t[e+8],f=(t[e+4]*Bn>>16)-(t[e+12]*Pn>>16),h=(t[e+4]*Pn>>16)+(t[e+12]*Bn>>16);r[i+0]=o+h,r[i+1]=l+f,r[i+2]=l-f,r[i+3]=o-h,i+=4,e++}for(s=i=0;s<4;++s)o=(t=r[i+0]+4)+r[i+8],l=t-r[i+8],f=(r[i+4]*Bn>>16)-(r[i+12]*Pn>>16),h=(r[i+4]*Pn>>16)+(r[i+12]*Bn>>16),a[n+0+0*an]=I(a[n+0+0*an]+(o+h>>3)),a[n+1+0*an]=I(a[n+1+0*an]+(l+f>>3)),a[n+2+0*an]=I(a[n+2+0*an]+(l-f>>3)),a[n+3+0*an]=I(a[n+3+0*an]+(o-h>>3)),i++,n+=an}function P(t,e,a,n,r){N(t,e,a,n),r&&N(t,e+16,a,n+4)}function B(t,e,a,n){Zn(t,e+0,a,n+0,1),Zn(t,e+32,a,n+4*an,1)}function L(t,e,a,n){let r;for(t=t[e+0]+4,r=0;r<4;++r)for(e=0;e<4;++e)a[n+e+r*an]=I(a[n+e+r*an]+(t>>3))}function C(t,e,a,n){t[e+0]&&L(t,e+0,a,n+0),t[e+16]&&L(t,e+16,a,n+4),t[e+32]&&L(t,e+32,a,n+4*an),t[e+48]&&L(t,e+48,a,n+4*an+4)}function F(t,e,a){const n=e-an,r=In,i=255-t[n-1];let s;for(s=0;s>2}function W(t,e,a){let n,r;for(n=0;n<8;++n)for(r=0;r<8;++r)e[a+r+n*an]=t}function V(t,e,a){const n=t[e-a],r=t[e+0],i=3*(r-n)+On[1020+t[e-2*a]-t[e+a]],s=Dn[112+(i+4>>3)];t[e-a]=In[255+n+Dn[112+(i+3>>3)]],t[e+0]=In[255+r-s]}function H(t,e,a,n){const r=t[e+0],i=t[e+a];return Sn[255+t[e-2*a]-t[e-a]]>n||Sn[255+i-r]>n}function G(t,e,a,n,r){const i=t[e-3*a],s=t[e-2*a],o=t[e-a],l=t[e+0],f=t[e+a],h=t[e+2*a],c=t[e+3*a];return 2*Sn[255+o-l]+zn[255+s-f]>n?0:Sn[255+t[e-4*a]-i]<=r&&Sn[255+i-s]<=r&&Sn[255+s-o]<=r&&Sn[255+c-h]<=r&&Sn[255+h-f]<=r&&Sn[255+f-l]<=r}function K(t,e,a,n){let r;for(r=0;r<16;++r)2*Sn[255+t[e+r-a]-t[e+r+0]]+zn[255+t[e+r-2*a]-t[e+r+a]]<=n&&V(t,e+r,a)}function Y(t,e,a,n){let r;for(r=0;r<16;++r)2*Sn[255+t[e+r*a-1]-t[e+r*a+0]]+zn[255+t[e+r*a-2]-t[e+r*a+1]]<=n&&V(t,e+r*a,1)}function q(t,e,a,n){let r;for(r=3;r>0;--r)K(t,(e+=4*a)+0,a,n)}function J(t,e,a,n){let r;for(r=3;r>0;--r)Y(t,(e+=4)+0,a,n)}function X(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-2*i],o=n[r-i],f=n[r+0],h=n[r+i],c=n[r+2*i];const d=27*(l=On[1020+3*(f-o)+On[1020+s-h]])+63>>7,u=18*l+63>>7;var l=9*l+63>>7;n[r-3*i]=In[255+n[r-3*i]+l],n[r-2*i]=In[255+s+u],n[r-i]=In[255+o+d],n[r+0]=In[255+f-d],n[r+i]=In[255+h-u],n[r+2*i]=In[255+c-l]}e+=n}}function $(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-i],o=n[r+0],f=n[r+i];const h=Dn[112+((l=3*(o-s))+4>>3)];var l=Dn[112+(l+3>>3)];const c=h+1>>1;n[r-2*i]=In[255+n[r-2*i]+c],n[r-i]=In[255+s+l],n[r+0]=In[255+o-h],n[r+i]=In[255+f-c]}e+=n}}function Q(t,e,a,n,r,i){X(t,e+0,a,1,16,n,r,i)}function tt(t,e,a,n,r,i){X(t,e+0,1,a,16,n,r,i)}function et(t,e,a,n,r,i){let s;for(s=3;s>0;--s)$(t,(e+=4*a)+0,a,1,16,n,r,i)}function at(t,e,a,n,r,i){let s;for(s=3;s>0;--s)$(t,(e+=4)+0,1,a,16,n,r,i)}function nt(t,e,a,n,r,i,s,o){X(t,e,r,1,8,i,s,o),X(a,n,r,1,8,i,s,o)}function rt(t,e,a,n,r,i,s,o){X(t,e,1,r,8,i,s,o),X(a,n,1,r,8,i,s,o)}function it(t,e,a,n,r,i,s,o){$(t,e+4*r,r,1,8,i,s,o),$(a,n+4*r,r,1,8,i,s,o)}function st(t,e,a,n,r,i,s,o){$(t,e+4,1,r,8,i,s,o),$(a,n+4,1,r,8,i,s,o)}function ot(t,e){return e==Za?0==t.i?0==t.d?Ka:Ga:0==t.d?ja:Za:e}function lt(t,e,a,r){for(n=0;n<4;++n)t[e+n]=a[r+n]}function ft(t,e){return t<0?0:t>e?e:t}function ht(t){t.a="VP8_STATUS_OK",t.xc="OK"}function ct(t){t>>>8!=Te>>>8&&alert("mismatch error")}function dt(t,e,a){return t.a==He&&(t.a=e,t.xc=a,t.za=0),0}function ut(t,r){let o=[0],l=0;var f=[0],h=s(ln),c=s(fn);let d=s(na);f="VP8StatusCode",h=s(aa);if(t==i)return alert("(dec == null)"),0;if(ht(t),r==i)return dt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(h.data=r.data,h.b=r.b,h.e=r.e,h.b=[h.b],h.e=[h.e],(f=Ae(h=[h]))!=He)return dt(t,f,"Incorrect/incomplete header.");if((h=h[0]).b=h.b[0],h.e=h.e[0],h.ia)return dt(t,Ke,"Unexpected lossless format encountered.");if(t.Ga==i&&(p(0==t.ub),t.Ga=h.$,t.G=h.G,t.ub=h.pa),l=h.data,o=h.b+h.offset,f=h.e-h.offset,p(h.e>=h.offset),f[0]<4)return dt(t,Xe,"Truncated header.");if(d=l[o+0]|l[o+1]<<8|l[o+2]<<16,(h=t.Ac).fb=!(1&d)+0,h.Jc=d>>1&7,h.Nc=d>>4&1,h.Ra=d>>5,h.Jc>3)return dt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!h.Nc)return dt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(o+=3,f-=3,c=t.P,h.fb){if(f<7)return dt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(f>=3&&157==l[o+0]&&1==l[o+1]&&42==l[o+2]))return dt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(c.l=16383&(l[o+4]<<8|l[o+3]),c.gd=l[o+4]>>6,c.v=16383&(l[o+6]<<8|l[o+5]),c.hd=l[o+6]>>6,o+=7,f-=7,t.Ma=c.l+15>>4,t.hb=c.v+15>>4,r.width=c.l,r.height=c.v,r.I=0,r.Ua=0,r.k=0,r.t=0,r.Ka=r.width,r.K=r.height,r.m=r.width,r.h=r.height,d=t.R,n=0;nf)return dt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");d=t.o,g(d,l,o,o+h.Ra),o+=h.Ra,f-=h.Ra,h.fb&&(c.uc=e(d),c.$c=e(d));c=d;var u=t.Ca;let _=t.R;if(p(c!=i),p(u!=i),u.pb=e(c),u.pb){if(u.ob=e(c),e(c)){var b;for(u.tb=e(c),b=0;b0)if(t.Ca.pb)for(_=0;_f&&(y=c),g(t.ic[+k],_,b,A),_=y,b=A,u+=3}g(t.ic[+w],_,b,f),f=b0){t.yb[y]=t.yb[0];continue}A=f}const e=t.yb[y];e.sc[0]=or[ft(A+c,127)],e.sc[1]=lr[ft(A+0,127)],e.sb[0]=2*or[ft(A+u,127)],e.sb[1]=101581*lr[ft(A+_,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=or[ft(A+b,117)],e.qc[1]=lr[ft(A+w,127)]}if(!h.fb)return dt(t,Ye,"Not a key frame.");for(t.Zc=259,e(d),f=t.R,c=0;c<$a;++c)for(u=0;u0)+0],16==i||!a(t,o[0]))return i}else o=e[ur[i]][0];if(16==i)return 16}}function bt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*gr&4278190080)>>e}function wt(t,e){let r,s=0;if(t==i)return 0;if(e==i)return dt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ut(t,e))return 0;if(p(t.za),e.Mb&&!e.Mb(e))dt(t,Je,"Frame setup failed"),r=t.a;else{e.Za&&(t.A=0);const a=nr[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-a>>4,t.mb=e.k-a>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+a>>4,t.wb=e.Ka+15+a>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),r=He}if(s=r==He){if(s){let a,n;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){a=dt(t,je,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?rr:rr-1}else t.jb=ir;a=1}if(!(n=!a)){let e;t:{const a=t.jb,n=t.Ma,r=4*n,s=32*n,o=n+1,l=t.A>0?n*(t.qb?2:1):0,c=nn,d=s*(16*a+parseInt(3*nr[t.A]/2,10)),u=t.Ga!=i?t.P.l*t.P.v:0,b=r+s+o+l+c+384+d+u+ar;if(b!=b)e=0;else{if(b>t.Gb){if(t.ib=0,t.Gb=0,t.ib==i){e=dt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=b}t.dc=205,t.Xc=h(205,16*n),t.Sc=h(205,8*n),t.Vc=h(205,8*n),t.M=l?f(un,l):i,t.Sd=l?0:i,t.oa.ha=0,t.oa.M=t.M,p(0==(c&ar)),t.Ea=h(205,1*c),t.z=-12851,t.H=16*n,t.r=8*n;const s=nr[t.A],w=s*t.H,g=s/2*t.r;t.ca=_(d,205),t.da=+w,t.aa=t.ca,t.ba=t.da+16*a*t.H+g,t.ra=t.aa,t.sa=t.ba+8*a*t.r+g,t.Xb=u?_(u,0):i,t.La=f(_n,o),t.dc=h(Za,r),e=1}}n=!e}if(n)s=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=i,e.q=i,!Nn){let t;for(t=-255;t<=255;++t)Sn[255+t]=t<0?-t:t,zn[255+t]=Sn[255+t]>>1;for(t=-1020;t<=1020;++t)On[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)Dn[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)In[255+t]=t<0?0:t>255?255:t;Nn=1}Zn=P,Mn=B,Wn=L,Vn=C,Hn=Q,jn=tt,Gn=nt,Kn=rt,Yn=et,qn=at,Jn=it,Xn=st,$n=K,Qn=Y,tr=q,er=J,s=1}}if(s)t:{for(t.d=0;t.d0&&f.d>=f.mb&&f.d<=f.Ya)+0,t.i=0;t.i0);m=-v,O[O[O.length-1]+g]=m,u[b]=m,b++}P[w]=m}}else{m=a(f,156)?a(f,128)?Ha:Va:a(f,163)?Wa:Ma;for(e.Eb[0]=m,v=0;v<4;++v)O[v+O[O.length-1]]=m;for(v=0;v<4;++v)P[v]=m}if(e.Tc=a(f,142)?a(f,114)?a(f,183)?Ha:Va:Wa:Ma,f.Ab)c=0;else{if(p.Nb)d.X=p.X=0,e.wa||(d.ua=p.ua=0),e.ja=0,e.Oa=0;else{let t=0,a=0;var k=0,y=wr;const n=e.yb[e.Lb];var A=e.z;const r=e.La[0],s=_(4,0),o=_(4,0);let f=_(4,0),c=_(4,0),d=0,u=0;var E=0;let b=0,w=0;A=h(0,384);if(e.wa)k=0,y=e.R.z[3];else{const t=_(16,0);var R=p.ua+r.ua;p.ua=r.ua=(_t(i,e.R.z[1],R,n.sb,0,t)>0)+0;k=1,y=e.R.z[0];var U=t,x=A,T=_(16,0),S=0;for(S=0;S<4;++S){var z=U[0+S]+U[12+S],D=U[4+S]+U[8+S],I=U[4+S]-U[8+S],N=U[0+S]-U[12+S];T[0+S]=z+D,T[8+S]=z-D,T[4+S]=N+I,T[12+S]=N-I}for(S=0;S<4;++S){const t=x[x.length-1],e=T[0+4*S]+3;z=e+T[3+4*S],D=T[1+4*S]+T[2+4*S],I=T[1+4*S]-T[2+4*S],N=e-T[3+4*S];x[t+0]=z+D>>3,x[t+16]=N+I>>3,x[t+32]=z-D>>3,x[t+48]=N-I>>3,x[x.length-1]+=64}A[A.length-1]=0}for(f=l(pr[15&p.X]),c=l(pr[15&r.X]),b=0;b<4;++b){var F=c[b];for(E=0;E<4;++E){var Z=_t(i,y,R=F+f[E],n.sc,k,A);f[E]=F=(Z>0)+0,o[E]=(0!=A[A[A.length-1]+0])+0,s[E]=(Z>1)+0,A[A.length-1]+=16}c[b]=F,u|=bt(o,24-4*b),d|=bt(s,24-4*b)}for(t=bt(f,24),a=bt(c,24),f=l(pr[p.X>>4]),c=l(pr[r.X>>4]),w=0;w<4;w+=2){for(b=0;b<2;++b){for(F=c[w+b],E=0;E<2;++E)R=F+f[w+E],Z=_t(i,e.R.z[2],R,n.qc,0,A),f[w+E]=F=(Z>0)+0,o[2*b+E]=(0!=A[A[A.length-1]+0])+0,s[2*b+E]=(Z>1)+0,A[A.length-1]+=16;c[w+b]=F}u|=bt(o,8-2*w),d|=bt(s,8-2*w)}t|=bt(f,20),a|=bt(c,20),p.X=t,r.X=a,e.z=A,e.Oa=d+0,e.ja=d|u,p.Nb=!e.ja+0}c=!i.Ab}if(!c){s=dt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const B=t,L=B.Ea,C=rn,K=B.Ea,Y=sn,q=B.Ea,J=on;if(B.i>0){var M=0;for(M=-1;M<16;++M)lt(L,C+M*an-4,L,C+M*an+12);for(M=-1;M<8;++M)lt(K,Y+M*an-4,K,Y+M*an+4),lt(q,J+M*an-4,q,J+M*an+4)}else{for(M=0;M<16;++M)L[C+M*an-1]=129;for(M=0;M<8;++M)K[Y+M*an-1]=129,q[J+M*an-1]=129;B.d>0&&(L[C-1-an]=K[Y-1-an]=q[J-1-an]=129)}const Q=B.Xc,tt=16*+B.i,et=B.Sc,at=8*+B.i,nt=B.Vc,rt=8*+B.i,it=B.z;let st=0;if(B.d>0)o(L,C-an,Q,tt,16),o(K,Y-an,et,at,8),o(q,J-an,nt,rt,8);else if(0==B.i){for(n=0;n<21;++n)L[C-an-1+n]=127;for(n=0;n<9;++n)K[Y-an-1+n]=127;for(n=0;n<9;++n)q[J-an-1+n]=127}if(B.wa){const t=C-an+16;B.d>0&&(B.i>=B.Ma-1?L[t+0]=L[t+1]=L[t+2]=L[t+3]=Q[tt+15]:o(L,t+0,Q,tt+16,4));for(let e=0;e<4;++e)L[e+t+4*an]=L[e+t+4*an]=L[e+t+8*an]=L[e+t+12*an]=L[e+t+0];for(st=0;st<16;st++){var W=L,V=C+sr[st];Ln[B.Eb[st]](W,V),B.Oa&1<0){const t=ut.M[1+ut.i],e=ut.La[1+ut.i].Nb;let a=ut.Zb[ut.Lb];ut.ga.oc&&(a+=ut.ga.Lc[0],ut.wa&&(a+=ut.ga.Gc[0])),a=a<0?0:a>63?63:a,t.zc=a,ut.ga.kb>0&&(a=ut.ga.kb>4?a>>2:a>>1,a>9-ut.ga.kb&&(a=9-ut.ga.kb)),t.yc=a<1?1:a,t.ab=(!e||ut.wa)+0}var G=0,X=8*ut.Ja*ut.r,$=ut.ca,ft=ut.da+16*ut.i+16*ut.Ja*ut.H,ht=ut.aa,ct=ut.ba+8*ut.i+X,wt=ut.ra,gt=ut.sa+8*ut.i+X;for(G=0;G<16;++G)o($,ft+G*ut.H,ut.Ea,+rn+G*an,16);for(G=0;G<8;++G)o(ht,ct+G*ut.r,ut.Ea,+sn+G*an,8),o(wt,gt+G*ut.r,ut.Ea,+on+G*an,8)}const B=t,L=e;var mt=1;const C=B.oa;if(B.qb){const t=B.rc;mt=mt&WebPWorkerSync(t);if(p(t.a==OK),mt){if(C.N=L,C.ha=B.Ja,C.d=B.d,C.W=B.W,C.W){const t=C.M;C.M=B.M,B.M=t}WebPWorkerLaunch(t),++B.Ja==B.jb&&(B.Ja=0)}}else{C.d=B.d,C.W=B.W;e:{let t=1;const e=B.oa,a=nr[B.A],n=a*B.H,r=parseInt(a/2)*B.r,s=16*e.ha*B.H,l=8*e.ha*B.r,f=B.ca,h=B.da-n+s,c=B.aa,d=B.ba-r+l,u=B.ra,_=B.sa-r+l,b=0==e.d,w=(e.d>=B.hb-1)+0;var vt=16*e.d;let g=16*(e.d+1);if(e.W){const t=B;let e=0;const a=t.oa.d;for(p(t.oa.W),e=t.lb;e0&&Qn(f,h,o,u+4),l.ab&&er(f,h,o,u),i>0&&$n(f,h,o,u+4),l.ab&&tr(f,h,o,u);else{const t=n.r,e=n.aa,a=n.ba+8*s.ha*t+8*r,_=n.ra,b=n.sa+8*s.ha*t+8*r,w=n.Ac.fb?c>=40?2:c>=15?1:0:c>=40?3:c>=20?2:c>=15?1:0;r>0&&(jn(f,h,o,u+4,d,w),Kn(e,a,_,b,t,u+4,d,w)),l.ab&&(qn(f,h,o,u,d,w),Xn(e,a,_,b,t,u,d,w)),i>0&&(Hn(f,h,o,u+4,d,w),Gn(e,a,_,b,t,u+4,d,w)),l.ab&&(Yn(f,h,o,u,d,w),Jn(e,a,_,b,t,u,d,w))}}}if(L.put){if(b?(L.y=B.ca,L.D=B.da+s,L.c=B.aa,L.B=B.ba+l,L.S=B.ra,L.C=B.sa+l):(vt-=a,L.y=f,L.D=h,L.c=c,L.B=d,L.S=u,L.C=_),w||(g-=a),g>L.K&&(g=L.K),B.Ga!=i&&vt>1),L.C+=B.r*(t>>1),L.p!=i&&(L.q+=L.width*t)}vt>1,L.C+=L.t>>1,L.p!=i&&(L.q+=L.t),L.w=vt-L.k,L.m=L.Ka-L.t,L.h=g-vt,t=L.put(L))}e.ha+1==B.jb&&!w&&(o(B.ca,B.da-n,f,h+16*B.H,n),o(B.aa,B.ba-r,c,d+8*B.r,r),o(B.ra,B.sa-r,u,_+8*B.r,r)),mt=t}}if(!mt){s=dt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let r;if(!(r=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(p(t),p(t.fc>0),e=!1),r=e}s=r?0:1}const r=s;e.Pb&&e.Pb(e),s=1&r}return s?(t.za=0,s):(pt(t),0)}function pt(t){t!=i&&(t.ib&&(t.ib=0),t.ib=i,t.Gb=0,t.za=0)}function gt(t,e){return t+(1<>e}function mt(t,e,a,n,r){const i=Wr[a]+Vr[e]>>mr;e=Mr[e],n[r+0]=Hr[t+Zr[a]-vr],n[r+1]=Hr[t+i-vr],n[r+2]=Hr[t+e-vr]}function vt(t,e,a,n,r){const i=Wr[a]+Vr[e]>>mr;e=Mr[e],n[r+0]=248&Hr[t+Zr[a]-vr]|Hr[t+i-vr]>>5,n[r+1]=Hr[t+i-vr]<<3&224|Hr[t+e-vr]>>3}function kt(t,e,a,n,r){n[r+0]=255,mt(t,e,a,n,r+1)}function yt(t,e,a,n,r){const i=Mr[e];n[r+0]=jr[t+Zr[a]-vr]<<4|jr[t+(Wr[a]+Vr[e]>>mr)-vr],n[r+1]=15|jr[t+i-vr]<<4}function At(t,e,a,n,r){const i=Zr[a];a=Wr[a]+Vr[e]>>mr,n[r+0]=Hr[t+Mr[e]-vr],n[r+1]=Hr[t+a-vr],n[r+2]=Hr[t+i-vr]}function Et(t,e,a,n,r){At(t,e,a,n,r),n[r+3]=255}function Rt(t,e,a,n,r){mt(t,e,a,n,r),n[r+3]=255}function Ut(t,e,a){t[e]=((((4278255360&t[e])>>>0)+((4278255360&a)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&a)&16711935)>>>0}function xt(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Tt(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function St(t,e){return Tt(t+parseInt((t-e)/2,10))}function zt(){return _a}function Ot(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Dt(t,e,a,n,r,i,s){var o=0;const l=8>>t.n,f=t.U,h=t.u;if(l<8){t=(1<>8&255),i[s++]=h[e&c],e>>=l}}else for(o=e;o>8&255]}function It(t,e,a,n,r){for(a=e+a;e>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255,n[r++]=a>>24&255}}function Nt(t,e,a,n,r){for(a=e+a;e>16&240|a>>12&15,n[r++]=a>>0&240|a>>28&15}}function Pt(t,e,a,n,r){for(a=e+a;e>24&255,n[r++]=a>>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255}}function Bt(t,e,a,n){return E(t,8)!=la?0:(e[0]=E(t,fa)+1,a[0]=E(t,fa)+1,n[0]=E(t,1),E(t,ha),1)}function Lt(t,e){let a=0;return t<4?t+1:(a=t-2>>1,(2+(1&t)<e.ya){var a=t.Y,n=0;for(p(a!=i);0!=a[n].s;){var r=a,s=e;const t=s.T>>s.g&1;s.L?s.fa=1:(++s.g,s.g>=8&&y(s),s.Q==s.ya&&32==s.g&&(s.L=1)),n=n+r[n].s+t}return a[n].kc}for(n=0,p((a=t.Y)!=i);0!=a[n].s;)r=a,s=e.T>>e.g&1,++e.g,n=n+r[n].s+s;return a[n].kc}function Ft(t,e){if(t!=i){var a=0,n=0;for(a=0;a>t.eb)+(e>>t.eb)])0;){e=t.nc[r];let x=l;var u=h,_=d;d=n,h=a;switch(p(x<(b=f)),p(b<=e.Vb),e.Qc){case ya:for(u=0,e=h+(b-x)*e.U;h>8&255,g=16711935&(g=(g=(16711935&b[_])>>>0)+(w<<16|w));d[h++]=((4278255360&b[_])>>>0|g)>>>0,32==x&&u++}break;case va:var m=x;u=b,_=d,w=h,g=(E=e).U;if(0==m){var v=0;for(Ut(_,w,_a),v=1;v>E.n)*y;m>8&15],v=1;v>8&15]),e=t(_[w+v-1],_,w+v-g),Ut(_,w+v,e)}w+=g,0==(++m&k)&&(E+=y)}b!=e.Vb&&o(d,h-(e=e.U),d,h+(b-x-1)*e,e);break;case ka:for(u=e.U,_=(1<>e.n)*w;x>0&255,E.Bc=A>>8&255,E.Kc=A>>16&255),E=(A=d[h+y])>>>8,R=A>>>16,U=A,R+=Ot(k.Cc,E),R&=255,U+=Ot(k.Bc,E),U+=Ot(k.Kc,R),U&=255,d[h+y]=(4278255360&A|R<<16|U)>>>0;h+=u,++x,0==(x&_)&&(e+=w)}break;case Aa:u==d&&e.n>0?(u=(b-x)*gt(e.U,e.n),c(d,_=h+(b-x)*e.U-u,d,h,u),Dt(e,x,b,d,_,d,h)):Dt(e,x,b,u,_,d,h)}h=n,d=a}}function Wt(t,e){var a=t.V,n=t.Ha+t.l*t.O;if(!((i=e-t.O)<=0)){Mt(t,i,a,n);var r=t.N;a=t.Xa;let d=[t.vb];n=t.O;var i=e,s=d,o=r.width;if(p(nr.K&&(i=r.K),n=i?n=0:(s[0]+=r.t,r.w=n-r.k,r.m=r.Ka-r.t,r.h=i-n,n=1),n){if(d=d[0],n=t.Ib,i=r.width,n.J0;){const t=a;let n=d,r=l;const h=s;let u=e;switch(o){case Se:for(r=n+r;n>16&255,h[u++]=c>>8&255,h[u++]=c>>0&255}break;case ze:It(t,n,r,h,u);break;case Be:It(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case Oe:for(r=n+r;n>0&255,h[u++]=c>>8&255,h[u++]=c>>16&255;break;case De:Pt(t,n,r,h,u);break;case Le:Pt(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case Ie:Pt(t,n,r,h,u);break;case Ce:Pt(t,n,r,h,u),WebPApplyAlphaMultiply(h,1,r,1,0);break;case Ne:Nt(t,n,r,h,u);break;case Fe:Nt(t,n,r,h,u),WebPApplyAlphaMultiply4444(h,r,1,0);break;case Pe:for(r=n+r;n>16&248|c>>13&7,h[u++]=c>>5&224|c>>3&31;break;default:p(0)}d+=i,e+=f}a=r}t.xa+=a}else t.xa=r.I?EmitRescaledRowsYUVA(t,a,d,i,r.h):EmitRowsYUVA(t,a,d,i,r.m,r.h);p(t.xa<=n.height)}t.O=e,p(t.O<=t.v)}}function Vt(t,e,a,n,r,s){let o=1,l=0,f=0;const h=t.o,c=t.cb;let d=c.Db,u=a,_=a;a+=n*r;const b=(r=pa+ga)+c.xb,w=c.xb>0?c.Yb:i,g=c.Dc;let m=!1;for(p(d!=i);!h.L&&u>>0)+(m<<16)+(o<<8)+v}if(m=!1,++u,++l,l>=n&&(l=0,++f,s!=i&&f%Er==0&&s(t,f),w!=i))for(;_>>w.bb]=o}else if(yLr?v-=Lr:(y=Cr[v-1],y=(y>>4)*n+(8-(15&y)),v=y>=1?y:1),y=0,y=0;y=n;)l-=n,++f,s!=i&&f%Er==0&&s(t,f);if(u>>w.bb]=o}else if(y>>w.bb]=y;y=e,v=u,p(m<=-1>>>(k=w).bb),y[v]=k.ea[m],m=!0;continue}(o=!h.fa)||End}return s!=i&&s(t,f),h.fa||!o||h.L&&u16?0:u>4?1:u>2?2:3,d[0]=gt(o.U,w),o.n=w,d=w=Kt(u,1,0,z,o.u))if(d=u,w=0,u=1<<(8>>>(z=o).n)>>>0,(g=Array(u))==i)d=0;else{m=z.u[0];var v=z.b;for(g[0]=z.u[0][z.b+0],w=1;w>>0)+((4278255360&g[w-1])>>>0)&4278255360)>>>0|(16711935&m[v+w])+(16711935&g[w-1])&16711935)>>>0;for(;w=1&&c<=da)){n.a=Ke;break}if(o)t:{o=n;var k=t[0],y=e[0],z=(d=c,v=m=0,v=o.o,o.cb);w=[i],u=i,g=1;if(a&&E(v,1)){y=(k=gt(k,m=E(v,3)+2))*(O=gt(y,m));if(!Kt(k,O,0,o,w)){o.a=Ke,Ft(u,g),o=0;break t}for(w=w[0],z.eb=m,m=0;m>>8&65535,w[m]=k,k>=g&&(g=k+1)}if(v.fa)Ft(u,g),o=0;else if(p(g<=65536),(u=b(g,An))==i)o.a=je,Ft(u,g),o=0;else{for(m=0;m0&&(k+=1<=t){(B=B&&R(e))||x(e),D=B;break a}if(!T(e,I[L],N[L],P[L])){(B=B&&R(e))||x(e),D=B;break a}}(B=(B=1)&&R(e))||x(e),D=B}else D=0}}else{if(D=0,N=[],(I=E(O,4)+4)>Pr){k.a=Ke,k=0;break e}if((P=Array(t))==i){k.a=je,k=0;break e}for(D=0;DN){D.a=Ke,x(r),D=B;break a}}else a=N;for(e=0;eN){D.a=Ke,x(r),D=B;break a}for(C=C?n:0;F-- >0;)I[e++]=C}}B=1,x(r),D=B}else D.a=Ke,D=0}D&&(D=S(e,P,t))}(D=D&&!O.fa)?k=1:(k.a=Ke,k=0)}if(!k){Ft(u,g),o=0;break t}}z.ac=w,z.hc=g,z.Db=u,o=1}}if(!o){n.a=Ke;break}if(c>0){if(f.xb=1<0),d.ea=_(z,0),d.ea==i?c=0:(d.bb=32-c,c=1),!c){n.a=je,o=0;break}}else f.xb=0;if(c=n,d=t[0],z=e[0],u=(w=c.cb).eb,c.l=d,c.v=z,w.Ec=gt(d,u),w.Dc=0==u?-1:(1<>>8&255;t.O=t.xa=e}}function ft(t,e){return t<0?0:t>e?e:t}function Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g){let m;const v=w-1>>1;let k=r[i+0]|s[o+0]<<16,y=l[f+0]|h[c+0]<<16;if(t){var A=3*k+y+131074>>2;p(t[e+0],255&A,A>>16,d,u)}for(a&&(A=3*y+k+131074>>2,p(a[n+0],255&A,A>>16,_,b)),m=1;m<=v;++m){const w=r[i+m]|s[o+m]<<16,v=l[f+m]|h[c+m]<<16;const E=(A=k+w+y+v+524296)+2*(w+y)>>3,R=A+2*(k+v)>>3;t&&(A=E+k>>1,k=R+w>>1,p(t[e+2*m-1],255&A,A>>16,d,u+(2*m-1)*g),p(t[e+2*m-0],255&k,k>>16,d,u+(2*m-0)*g)),a&&(A=R+y>>1,k=E+v>>1,p(a[n+2*m-1],255&A,A>>16,_,b+(2*m-1)*g),p(a[n+2*m+0],255&k,k>>16,_,b+(2*m+0)*g)),k=w,y=v}1&w||(t&&(A=3*k+y+131074>>2,p(t[e+w-1],255&A,A>>16,d,u+(w-1)*g)),a&&(A=3*y+k+131074>>2,p(a[n+w-1],255&A,A>>16,_,b+(w-1)*g)))}function Xt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,mt,3)}function $t(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,At,3)}function Qt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Rt,4)}function te(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Et,4)}function ee(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,kt,4)}function ae(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,yt,2)}function ne(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,vt,2)}function re(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_){let b;for(b=0;b0;){var s=t,o=e+(a?1:0),l=t,f=e+(a?0:3),h=0;for(h=0;h>1)*a.nb,l=a.S,f=a.C+(t.w>>1)*a.rb,h=t.m,c=t.h,d=parseInt((h+1)/2,10),u=parseInt((c+1)/2,10);let _;for(_=0;_>4;h[c+2*u]=240&h[c+2*u]|t,d&=t}r+=e.width,c+=l.f}15!=d&&t(o)&&WebPApplyAlphaMultiply4444(h,s,i,f,l.f)}return 0}function pe(e){let a=e.ka;const n=a.j.J,r=n>1,n=e.m+2*t;let r;const s=[];for(r=0;r>mr,Vr[e]=-22014*(e-128)+Fr,Wr[e]=-45773*(e-128),Mr[e]=113618*(e-128)+Fr>>mr;for(e=vr;e>mr,Hr[e-vr]=ft(a,255),jr[e-vr]=ft(a+8>>4,15);Gr=1}return 1}function ge(t){const e=t.ka;let a=t.m;const n=t.h;return p(!(1&t.w)),a<=0||n<=0?0:(a=e.$a(t,e),e.ec+=a,e.zb&&e.zb(t,e),1)}function me(t){(t=t.ka).memory="",t.memory=i}function ve(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function ke(t,e){return(ve(t,e)|t[e+3]<<24)>>>0}function ye(t,e,a,n,r,o,l){var f=0,h=[0],c="VP8StatusCode";const d=s(aa);if(t==i||a[0]=za&&!u(t,e[0],"RIFF",Ta)){if(u(t,e[0]+8,"WEBP",Ta)){c=Ke;break t}if((g=ke(t,e[0]+Ta))0,g=[0];t:if(c=Sa+Oa,p(t!=i),p(a!=i),p(h!=i),h[0]=0,a[0]=Ia){c=Ke;break t}g!=i&&(g[0]=w),n!=i&&(n[0]=_),r!=i&&(r[0]=b),e[0]+=c,a[0]-=c,h[0]=1}c=He}if(c!=He)return c;if(!f&&h[0])return Ke;if(o!=i&&(o[0]=!!(g[0]&Da)),h&&l==i)return He;if(a0&&n>h){c=Ke;break t}if(w=_&&b>h-_){c=Ke;break t}f[0]=b,e[0]+=Sa,a[0]-=Sa,g[0]=c}else g[0]=a>=1&&t[e+0]==la,f[0]=a[0];c=He}if(d.ta=d.ta[0],d.ia=d.ia[0],c!=He)return c;if(d.ta>Na)return Ke;if(d.ia){if(a[0]=3&&157==t[h+3+0]&&1==t[h+3+1]&&42==t[h+3+2]?(f=t[h+0]|t[h+1]<<8|t[h+2]<<16,g=16383&(t[h+7]<<8|t[h+6]),t=16383&(t[h+9]<<8|t[h+8]),!(!(1&f)+0)||(f>>1&7)>3||!(f>>4&1)||f>>5>=d.ta?t=0:(n&&(n[0]=g),r&&(r[0]=t),t=1)):t=0}return t?(o!=i&&(o[0]|=d.$!=i),l!=i&&(l[0]=d,l[0].offset=e[0]-l[0].b,p(e[0]-l[0].b0,e.Ua&&(l=t.wc,f=t.vc,s=t.t,o=t.k,an||o+f>r))return 0;if(e.t=s,e.k=o,e.Ka=s+l,e.K=o+f,e.m=l,e.h=f,e.I=t!=i&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==i||!t.ed,e.I&&(e.Za=e.Ba<3*n/4&&e.Aa<3*r/4,e.Bb=0),1}var Te=512,Se=0,ze=1,Oe=2,De=3,Ie=4,Ne=5,Pe=6,Be=7,Le=8,Ce=9,Fe=10,Ze=11,Me=12,We=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var Ve={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:_(4,0),Jb:i,jc:0},He=0,je=1,Ge=2,Ke=3,Ye=4,qe=5,Je=6,Xe=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var $e={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:_(3,0)};this.WebPGetFeatures=this.Md=function(t,e,a){let n="VP8StatusCode";return Te>>>8!=Te>>>8||a==i?t=Ge:(n=Ue(t,[0],e=[e],a),t=n==Xe?Ke:n),t};const Qe={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:_(6,0)};this.WebPDecoderConfig=this.Kd={input:s($e),j:s(Ve),options:s(Qe)},this.WebPInitDecoderConfig=this.Nd=function(t){return Te>>>8!=Te>>>8||t==i?t=0:(p((t=t.input)!=i),t.tc=0,t=1),t};var ta={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},ea={j:s(Ve),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:s(Qe),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},aa={data:0,b:0,e:0,offset:0,$:i,G:0,pa:0,ta:0,na:0,ia:0},na={qa:0,Ia:i,Pd:0,Ab:0,la:0,Z:0,gc:0},ra={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},ia=25,sa=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],oa=10,la=47,fa=14,ha=3,ca=5,da=11,ua=5,_a=4278190080,ba=8,wa=15,pa=256,ga=24,ma=4,va=0,ka=1,ya=2,Aa=3,Ea=1,Ra=0,Ua=1,xa=1,Ta=4,Sa=8,za=12,Oa=10,Da=16,Ia=1*Math.pow(2,32),Na=-1-Sa-1>>>0,Pa={kc:0,s:0},Ba={Y:"HuffmanTreeNode*",gb:0,Pa:0},La=-1;const Ca={ea:0,bb:0};var Fa=506832829,Za=0,Ma=Za,Wa=2,Va=3,Ha=1,ja=4,Ga=5,Ka=6,Ya=3,qa=4,Ja=4,Xa=4,$a=4,Qa=8,tn=3,en=11,an=32,nn=17*an+9*an,rn=1*an+8,sn=rn+16*an+an,on=sn+16,ln={fb:0,Jc:0,Nc:0,Ra:0},fn={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const hn={pb:0,ob:0,tb:0,Kb:_(qa,0),Cb:_(qa,0)},cn={Ta:_(Ya,0),z:w([$a,Qa,tn,en],0)},dn={Oc:0,Fb:0,kb:0,oc:0,Lc:_(Ja,0),Gc:_(Ja,0)};var un={zc:0,yc:0,ab:0},_n={X:0,ua:0,Nb:0};const bn=_(2,0),wn={sc:s(bn),sb:s(bn),qc:s(bn)},pn={ha:0,d:0,W:0,M:un,N:ta};var gn={a:"VP8StatusCode",za:0,xc:0,o:s(na),Ac:s(ln),P:s(fn),ga:s(dn),Ca:s(hn),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:pn,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:b(8,na),Zc:0,yb:b(qa,wn),R:s(cn),pc:0,Pc:0,dc:0,cc:_(4,0),Xc:0,Sc:0,Vc:0,La:s(_n),M:s(un),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:_(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:_(qa,0),Ga:i,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},mn=0,vn=1,kn=2;const yn={Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0};var An={va:b(ua,Ba)};const En={xb:0,Yb:s(Ca),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var Rn={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:s(ra),l:0,v:0,O:0,xa:0,cb:s(En),Na:0,nc:b(ma,yn),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Un=4,xn=[i,function(t,e,a,n,r,s,l,f){let h=0,c=f;for(p(t!=i),p(l!=i),p(a>0),p(n>0),p(r>0),p(s>=a*r),h=0;h0),p(n>0),p(r>0),p(s>=a*r),o(l,f,t,e,r),z(t,e+r,l,c,l,f+r,r*(a-1)),h=1;h0),p(n>0),p(r>0),p(s>=a*r),o(l,f,t,e,r),z(t,e+r,l,h,l,f+r,r*(a-1)),c=1;c255?255:a)&255}}}],Tn=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=i&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=i)},r=this;var Sn=_(511,0),zn=_(511,0),On=_(2041,0),Dn=_(225,0),In=_(766,0),Nn=0,Pn=85627,Bn=35468,Ln=[function(t,e){let a,n=4;for(a=0;a<4;++a)n+=t[e+a-an]+t[e-1+a*an];for(n>>=3,a=0;a<4;++a)d(t,e+a*an,n,4)},function(t,e){F(t,e,4)},function(t,e){let a=e-an;const n=[];for(n.push(M(t[a-1],t[a+0],t[a+1])),n.push(M(t[a+0],t[a+1],t[a+2])),n.push(M(t[a+1],t[a+2],t[a+3])),n.push(M(t[a+2],t[a+3],t[a+4])),a=0;a<4;++a)o(t,e+a*an,n,0,4)},function(t,e){const a=t[e-1],n=t[e-1+an],r=t[e-1+2*an],i=t[e-1+3*an];t[e+0+0*an]=t[e+1+0*an]=t[e+2+0*an]=t[e+3+0*an]=M(t[e-1-an],a,n),t[e+0+1*an]=t[e+1+1*an]=t[e+2+1*an]=t[e+3+1*an]=M(a,n,r),t[e+0+2*an]=t[e+1+2*an]=t[e+2+2*an]=t[e+3+2*an]=M(n,r,i),t[e+0+3*an]=t[e+1+3*an]=t[e+2+3*an]=t[e+3+3*an]=M(r,i,i)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1-an],s=t[e+0-an],o=t[e+1-an],l=t[e+2-an],f=t[e+3-an];t[e+0+3*an]=M(n,r,t[e-1+3*an]),t[e+0+2*an]=t[e+1+3*an]=M(a,n,r),t[e+0+1*an]=t[e+1+2*an]=t[e+2+3*an]=M(i,a,n),t[e+0+0*an]=t[e+1+1*an]=t[e+2+2*an]=t[e+3+3*an]=M(s,i,a),t[e+1+0*an]=t[e+2+1*an]=t[e+3+2*an]=M(o,s,i),t[e+2+0*an]=t[e+3+1*an]=M(l,o,s),t[e+3+0*an]=M(f,l,o)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1-an],s=t[e+0-an],o=t[e+1-an],l=t[e+2-an],f=t[e+3-an];t[e+0+0*an]=t[e+1+2*an]=i+s+1>>1,t[e+1+0*an]=t[e+2+2*an]=s+o+1>>1,t[e+2+0*an]=t[e+3+2*an]=o+l+1>>1,t[e+3+0*an]=l+f+1>>1,t[e+0+3*an]=M(r,n,a),t[e+0+2*an]=M(n,a,i),t[e+0+1*an]=t[e+1+3*an]=M(a,i,s),t[e+1+1*an]=t[e+2+3*an]=M(i,s,o),t[e+2+1*an]=t[e+3+3*an]=M(s,o,l),t[e+3+1*an]=M(o,l,f)},function(t,e){const a=t[e+1-an],n=t[e+2-an],r=t[e+3-an],i=t[e+4-an],s=t[e+5-an],o=t[e+6-an],l=t[e+7-an];t[e+0+0*an]=M(t[e+0-an],a,n),t[e+1+0*an]=t[e+0+1*an]=M(a,n,r),t[e+2+0*an]=t[e+1+1*an]=t[e+0+2*an]=M(n,r,i),t[e+3+0*an]=t[e+2+1*an]=t[e+1+2*an]=t[e+0+3*an]=M(r,i,s),t[e+3+1*an]=t[e+2+2*an]=t[e+1+3*an]=M(i,s,o),t[e+3+2*an]=t[e+2+3*an]=M(s,o,l),t[e+3+3*an]=M(o,l,l)},function(t,e){const a=t[e+0-an],n=t[e+1-an],r=t[e+2-an],i=t[e+3-an],s=t[e+4-an],o=t[e+5-an],l=t[e+6-an],f=t[e+7-an];t[e+0+0*an]=a+n+1>>1,t[e+1+0*an]=t[e+0+2*an]=n+r+1>>1,t[e+2+0*an]=t[e+1+2*an]=r+i+1>>1,t[e+3+0*an]=t[e+2+2*an]=i+s+1>>1,t[e+0+1*an]=M(a,n,r),t[e+1+1*an]=t[e+0+3*an]=M(n,r,i),t[e+2+1*an]=t[e+1+3*an]=M(r,i,s),t[e+3+1*an]=t[e+2+3*an]=M(i,s,o),t[e+3+2*an]=M(s,o,l),t[e+3+3*an]=M(o,l,f)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1+3*an],s=t[e-1-an],o=t[e+0-an],l=t[e+1-an],f=t[e+2-an];t[e+0+0*an]=t[e+2+1*an]=a+s+1>>1,t[e+0+1*an]=t[e+2+2*an]=n+a+1>>1,t[e+0+2*an]=t[e+2+3*an]=r+n+1>>1,t[e+0+3*an]=i+r+1>>1,t[e+3+0*an]=M(o,l,f),t[e+2+0*an]=M(s,o,l),t[e+1+0*an]=t[e+3+1*an]=M(a,s,o),t[e+1+1*an]=t[e+3+2*an]=M(n,a,s),t[e+1+2*an]=t[e+3+3*an]=M(r,n,a),t[e+1+3*an]=M(i,r,n)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1+3*an];t[e+0+0*an]=a+n+1>>1,t[e+2+0*an]=t[e+0+1*an]=n+r+1>>1,t[e+2+1*an]=t[e+0+2*an]=r+i+1>>1,t[e+1+0*an]=M(a,n,r),t[e+3+0*an]=t[e+1+1*an]=M(n,r,i),t[e+3+1*an]=t[e+1+2*an]=M(r,i,i),t[e+3+2*an]=t[e+2+2*an]=t[e+0+3*an]=t[e+1+3*an]=t[e+2+3*an]=t[e+3+3*an]=i}],Cn=[function(t,e){let a,n=16;for(a=0;a<16;++a)n+=t[e-1+a*an]+t[e+a-an];Z(n>>5,t,e)},function(t,e){F(t,e,16)},function(t,e){let a;for(a=0;a<16;++a)o(t,e+a*an,t,e-an,16)},function(t,e){let a;for(a=16;a>0;--a)d(t,e+0,t[e-1],16),e+=an},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e-1+a*an];Z(n>>4,t,e)},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e+a-an];Z(n>>4,t,e)},function(t,e){Z(128,t,e)}],Fn=[function(t,e){let a,n=8;for(a=0;a<8;++a)n+=t[e+a-an]+t[e-1+a*an];W(1*(n>>4),t,e)},function(t,e){F(t,e,8)},function(t,e){let a;for(a=0;a<8;++a)o(t,e+a*an,t,e-an,8)},function(t,e){let a;for(a=0;a<8;++a)d(t,e+0,t[e-1],8),e+=an},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e-1+a*an];W(1*(n>>3),t,e)},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e+a-an];W(1*(n>>3),t,e)},function(t,e){W(128,t,e)}];let Zn,Mn,Wn,Vn,Hn,jn,Gn,Kn,Yn,qn,Jn,Xn,$n,Qn,tr,er;var ar=31,nr=[0,2,8],rr=3,ir=1,sr=[0+0*an,4+0*an,8+0*an,12+0*an,0+4*an,4+4*an,8+4*an,12+4*an,0+8*an,4+8*an,8+8*an,12+8*an,0+12*an,4+12*an,8+12*an,12+12*an],or=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],lr=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],fr=[-Za,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],hr=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],cr=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],dr=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var ur=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],_r=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],br=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],wr=w([tn,en],"");_(4,0);var pr=[[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],[0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]],gr=134480385,mr=16,vr=-227,kr=482,yr=[zt,function(t){return t},function(t,e,a){return e[a+0]},function(t,e,a){return e[a+1]},function(t,e,a){return e[a-1]},function(t,e,a){return xt(xt(t,e[a+1]),e[a+0])},function(t,e,a){return xt(t,e[a-1])},function(t,e,a){return xt(t,e[a+0])},function(t,e,a){return xt(e[a-1],e[a+0])},function(t,e,a){return xt(e[a+0],e[a+1])},function(t,e,a){return xt(xt(t,e[a-1]),xt(e[a+0],e[a+1]))},function(t,e,a){return Math.abs((t>>24&255)-(e[a-1]>>24&255))-Math.abs((e[a+0]>>24&255)-(e[a-1]>>24&255))+(Math.abs((t>>16&255)-(e[a-1]>>16&255))-Math.abs((e[a+0]>>16&255)-(e[a-1]>>16&255)))+(Math.abs((t>>8&255)-(e[a-1]>>8&255))-Math.abs((e[a+0]>>8&255)-(e[a-1]>>8&255)))+(Math.abs((255&t)-(255&e[a-1]))-Math.abs((255&e[a+0])-(255&e[a-1])))<=0?e[a+0]:t},function(t,e,a){return(Tt((t>>24&255)+(e[a+0]>>24&255)-(e[a-1]>>24&255))<<24|Tt((t>>16&255)+(e[a+0]>>16&255)-(e[a-1]>>16&255))<<16|Tt((t>>8&255)+(e[a+0]>>8&255)-(e[a-1]>>8&255))<<8|Tt((255&t)+(255&e[a+0])-(255&e[a-1])))>>>0},function(t,e,a){const n=e[a-1];return(St((t=xt(t,e[a+0]))>>24&255,n>>24&255)<<24|St(t>>16&255,n>>16&255)<<16|St(t>>8&255,n>>8&255)<<8|St(t>>0&255,n>>0&255))>>>0},zt,zt],Ar={Cc:0,Bc:0,Kc:0},Er=16,Rr=16,Ur=16,xr=[2,3,7],Tr=[3,3,11],Sr=0,zr=1,Or=2,Dr=3,Ir=4,Nr=[pa+ga,pa,pa,pa,40],Pr=19,Br=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Lr=120,Cr=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],Fr=1<>>0:0,r=t.byteLength-n;let i=n;(ArrayBuffer.isView(t)||t instanceof k)&&(t.byteLength!==t.buffer.byteLength&&(i=t.byteOffset+n),t=t.buffer),this.lastWrittenByte=a?r:0,this.buffer=t,this.length=r,this.byteLength=r,this.byteOffset=i,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,i,r),this._mark=0,this._marks=[]}available(t=1){return this.offset+t<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(t=1){return this.offset+=t,this}seek(t){return this.offset=t,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){const t=this._marks.pop();if(void 0===t)throw new Error("Mark stack empty");return this.seek(t),this}rewind(){return this.offset=0,this}ensureAvailable(t=1){if(!this.available(t)){const e=2*(this.offset+t),a=new Uint8Array(e);a.set(new Uint8Array(this.buffer)),this.buffer=a.buffer,this.length=this.byteLength=e,this._data=new DataView(this.buffer)}return this}readBoolean(){return 0!==this.readUint8()}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(t=1){const e=new Uint8Array(t);for(let a=0;athis.lastWrittenByte&&(this.lastWrittenByte=this.offset)}} +/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */function y(t){let e=t.length;for(;--e>=0;)t[e]=0}const A=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),E=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),R=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),U=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),x=new Array(576);y(x);const T=new Array(60);y(T);const S=new Array(512);y(S);const z=new Array(256);y(z);const O=new Array(29);y(O);const D=new Array(30);function I(t,e,a,n,r){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=n,this.max_length=r,this.has_stree=t&&t.length}let N,P,B;function L(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}y(D);const C=t=>t<256?S[t]:S[256+(t>>>7)],F=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},Z=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{Z(t,a[2*e],a[2*e+1])},W=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},V=(t,e,a)=>{const n=new Array(16);let r,i,s=0;for(r=1;r<=15;r++)n[r]=s=s+a[r-1]<<1;for(i=0;i<=e;i++){let e=t[2*i+1];0!==e&&(t[2*i]=W(n[e]++,e))}},H=t=>{let e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0},G=t=>{t.bi_valid>8?F(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},K=(t,e,a,n)=>{const r=2*e,i=2*a;return t[r]{const n=t.heap[a];let r=a<<1;for(;r<=t.heap_len&&(r{let n,r,i,s,o=0;if(0!==t.last_lit)do{n=t.pending_buf[t.d_buf+2*o]<<8|t.pending_buf[t.d_buf+2*o+1],r=t.pending_buf[t.l_buf+o],o++,0===n?M(t,r,e):(i=z[r],M(t,i+256+1,e),s=A[i],0!==s&&(r-=O[i],Z(t,r,s)),n--,i=C(n),M(t,i,a),s=E[i],0!==s&&(n-=D[i],Z(t,n,s)))}while(o{const a=e.dyn_tree,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,i=e.stat_desc.elems;let s,o,l,f=-1;for(t.heap_len=0,t.heap_max=573,s=0;s>1;s>=1;s--)Y(t,a,s);l=i;do{s=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Y(t,a,1),o=t.heap[1],t.heap[--t.heap_max]=s,t.heap[--t.heap_max]=o,a[2*l]=a[2*s]+a[2*o],t.depth[l]=(t.depth[s]>=t.depth[o]?t.depth[s]:t.depth[o])+1,a[2*s+1]=a[2*o+1]=l,t.heap[1]=l++,Y(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,n=e.max_code,r=e.stat_desc.static_tree,i=e.stat_desc.has_stree,s=e.stat_desc.extra_bits,o=e.stat_desc.extra_base,l=e.stat_desc.max_length;let f,h,c,d,u,_,b=0;for(d=0;d<=15;d++)t.bl_count[d]=0;for(a[2*t.heap[t.heap_max]+1]=0,f=t.heap_max+1;f<573;f++)h=t.heap[f],d=a[2*a[2*h+1]+1]+1,d>l&&(d=l,b++),a[2*h+1]=d,h>n||(t.bl_count[d]++,u=0,h>=o&&(u=s[h-o]),_=a[2*h],t.opt_len+=_*(d+u),i&&(t.static_len+=_*(r[2*h+1]+u)));if(0!==b){do{for(d=l-1;0===t.bl_count[d];)d--;t.bl_count[d]--,t.bl_count[d+1]+=2,t.bl_count[l]--,b-=2}while(b>0);for(d=l;0!==d;d--)for(h=t.bl_count[d];0!==h;)c=t.heap[--f],c>n||(a[2*c+1]!==d&&(t.opt_len+=(d-a[2*c+1])*a[2*c],a[2*c+1]=d),h--)}})(t,e),V(a,f,t.bl_count)},X=(t,e,a)=>{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),e[2*(a+1)+1]=65535,n=0;n<=a;n++)r=s,s=e[2*(n+1)+1],++o{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),n=0;n<=a;n++)if(r=s,s=e[2*(n+1)+1],!(++o{Z(t,0+(n?1:0),3),((t,e,a,n)=>{G(t),n&&(F(t,a),F(t,~a)),t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a})(t,e,a,!0)};var et={_tr_init:t=>{Q||((()=>{let t,e,a,n,r;const i=new Array(16);for(a=0,n=0;n<28;n++)for(O[n]=a,t=0;t<1<>=7;n<30;n++)for(D[n]=r<<7,t=0;t<1<{let r,i,s=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),J(t,t.l_desc),J(t,t.d_desc),s=(t=>{let e;for(X(t,t.dyn_ltree,t.l_desc.max_code),X(t,t.dyn_dtree,t.d_desc.max_code),J(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*U[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,i=t.static_len+3+7>>>3,i<=r&&(r=i)):r=i=a+5,a+4<=r&&-1!==e?tt(t,e,a,n):4===t.strategy||i===r?(Z(t,2+(n?1:0),3),q(t,x,T)):(Z(t,4+(n?1:0),3),((t,e,a,n)=>{let r;for(Z(t,e-257,5),Z(t,a-1,5),Z(t,n-4,4),r=0;r(t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(z[a]+256+1)]++,t.dyn_dtree[2*C(e)]++),t.last_lit===t.lit_bufsize-1),_tr_align:t=>{Z(t,2,3),M(t,256,x),(t=>{16===t.bi_valid?(F(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var at=(t,e,a,n)=>{let r=65535&t|0,i=t>>>16&65535|0,s=0;for(;0!==a;){s=a>2e3?2e3:a,a-=s;do{r=r+e[n++]|0,i=i+r|0}while(--s);r%=65521,i%=65521}return r|i<<16|0};const nt=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var rt=(t,e,a,n)=>{const r=nt,i=n+a;t^=-1;for(let a=n;a>>8^r[255&(t^e[a])];return-1^t},it={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},st={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:ot,_tr_stored_block:lt,_tr_flush_block:ft,_tr_tally:ht,_tr_align:ct}=et,{Z_NO_FLUSH:dt,Z_PARTIAL_FLUSH:ut,Z_FULL_FLUSH:_t,Z_FINISH:bt,Z_BLOCK:wt,Z_OK:pt,Z_STREAM_END:gt,Z_STREAM_ERROR:mt,Z_DATA_ERROR:vt,Z_BUF_ERROR:kt,Z_DEFAULT_COMPRESSION:yt,Z_FILTERED:At,Z_HUFFMAN_ONLY:Et,Z_RLE:Rt,Z_FIXED:Ut,Z_DEFAULT_STRATEGY:xt,Z_UNKNOWN:Tt,Z_DEFLATED:St}=st,zt=(t,e)=>(t.msg=it[e],e),Ot=t=>(t<<1)-(t>4?9:0),Dt=t=>{let e=t.length;for(;--e>=0;)t[e]=0};let It=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},Pt=(t,e)=>{ft(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Nt(t.strm)},Bt=(t,e)=>{t.pending_buf[t.pending++]=e},Lt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Ct=(t,e,a,n)=>{let r=t.avail_in;return r>n&&(r=n),0===r?0:(t.avail_in-=r,e.set(t.input.subarray(t.next_in,t.next_in+r),a),1===t.state.wrap?t.adler=at(t.adler,e,r,a):2===t.state.wrap&&(t.adler=rt(t.adler,e,r,a)),t.next_in+=r,t.total_in+=r,r)},Ft=(t,e)=>{let a,n,r=t.max_chain_length,i=t.strstart,s=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-262?t.strstart-(t.w_size-262):0,f=t.window,h=t.w_mask,c=t.prev,d=t.strstart+258;let u=f[i+s-1],_=f[i+s];t.prev_length>=t.good_match&&(r>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,f[a+s]===_&&f[a+s-1]===u&&f[a]===f[i]&&f[++a]===f[i+1]){i+=2,a++;do{}while(f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&is){if(t.match_start=e,s=n,n>=o)break;u=f[i+s-1],_=f[i+s]}}}while((e=c[e&h])>l&&0!=--r);return s<=t.lookahead?s:t.lookahead},Zt=t=>{const e=t.w_size;let a,n,r,i,s;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-262)){t.window.set(t.window.subarray(e,e+e),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,n=t.hash_size,a=n;do{r=t.head[--a],t.head[a]=r>=e?r-e:0}while(--n);n=e,a=n;do{r=t.prev[--a],t.prev[a]=r>=e?r-e:0}while(--n);i+=e}if(0===t.strm.avail_in)break;if(n=Ct(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=It(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=It(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<262&&0!==t.strm.avail_in)},Mt=(t,e)=>{let a,n;for(;;){if(t.lookahead<262){if(Zt(t),t.lookahead<262&&e===dt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-262&&(t.match_length=Ft(t,a)),t.match_length>=3)if(n=ht(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=It(t,t.ins_h,t.window[t.strstart+1]);else n=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(n&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2},Wt=(t,e)=>{let a,n,r;for(;;){if(t.lookahead<262){if(Zt(t),t.lookahead<262&&e===dt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-3,n=ht(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,n&&(Pt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(n=ht(t,0,t.window[t.strstart-1]),n&&Pt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(n=ht(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2};function Vt(t,e,a,n,r){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=n,this.func=r}const Ht=[new Vt(0,0,0,0,(t,e)=>{let a=65535;for(a>t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(Zt(t),0===t.lookahead&&e===dt)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;const n=t.block_start+a;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,Pt(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-262&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(Pt(t,!1),t.strm.avail_out),1)}),new Vt(4,4,8,4,Mt),new Vt(4,5,16,8,Mt),new Vt(4,6,32,32,Mt),new Vt(4,4,16,16,Wt),new Vt(8,16,32,32,Wt),new Vt(8,16,128,128,Wt),new Vt(8,32,128,256,Wt),new Vt(32,128,258,1024,Wt),new Vt(32,258,258,4096,Wt)];function jt(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=St,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Dt(this.dyn_ltree),Dt(this.dyn_dtree),Dt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Dt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Dt(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Gt=t=>{if(!t||!t.state)return zt(t,mt);t.total_in=t.total_out=0,t.data_type=Tt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?42:113,t.adler=2===e.wrap?0:1,e.last_flush=dt,ot(e),pt},Kt=t=>{const e=Gt(t);return e===pt&&(t=>{t.window_size=2*t.w_size,Dt(t.head),t.max_lazy_match=Ht[t.level].max_lazy,t.good_match=Ht[t.level].good_length,t.nice_match=Ht[t.level].nice_length,t.max_chain_length=Ht[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=2,t.match_available=0,t.ins_h=0})(t.state),e},Yt=(t,e,a,n,r,i)=>{if(!t)return mt;let s=1;if(e===yt&&(e=6),n<0?(s=0,n=-n):n>15&&(s=2,n-=16),r<1||r>9||a!==St||n<8||n>15||e<0||e>9||i<0||i>Ut)return zt(t,mt);8===n&&(n=9);const o=new jt;return t.state=o,o.strm=t,o.wrap=s,o.gzhead=null,o.w_bits=n,o.w_size=1<Yt(t,e,St,15,8,xt),deflateInit2:Yt,deflateReset:Kt,deflateResetKeep:Gt,deflateSetHeader:(t,e)=>t&&t.state?2!==t.state.wrap?mt:(t.state.gzhead=e,pt):mt,deflate:(t,e)=>{let a,n;if(!t||!t.state||e>wt||e<0)return t?zt(t,mt):mt;const r=t.state;if(!t.output||!t.input&&0!==t.avail_in||666===r.status&&e!==bt)return zt(t,0===t.avail_out?kt:mt);r.strm=t;const i=r.last_flush;if(r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,Bt(r,31),Bt(r,139),Bt(r,8),r.gzhead?(Bt(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),Bt(r,255&r.gzhead.time),Bt(r,r.gzhead.time>>8&255),Bt(r,r.gzhead.time>>16&255),Bt(r,r.gzhead.time>>24&255),Bt(r,9===r.level?2:r.strategy>=Et||r.level<2?4:0),Bt(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(Bt(r,255&r.gzhead.extra.length),Bt(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=rt(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,9===r.level?2:r.strategy>=Et||r.level<2?4:0),Bt(r,3),r.status=113);else{let e=St+(r.w_bits-8<<4)<<8,a=-1;a=r.strategy>=Et||r.level<2?0:r.level<6?1:6===r.level?2:3,e|=a<<6,0!==r.strstart&&(e|=32),e+=31-e%31,r.status=113,Lt(r,e),0!==r.strstart&&(Lt(r,t.adler>>>16),Lt(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(a=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending!==r.pending_buf_size));)Bt(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.status=103)}else r.status=103;if(103===r.status&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&Nt(t),r.pending+2<=r.pending_buf_size&&(Bt(r,255&t.adler),Bt(r,t.adler>>8&255),t.adler=0,r.status=113)):r.status=113),0!==r.pending){if(Nt(t),0===t.avail_out)return r.last_flush=-1,pt}else if(0===t.avail_in&&Ot(e)<=Ot(i)&&e!==bt)return zt(t,kt);if(666===r.status&&0!==t.avail_in)return zt(t,kt);if(0!==t.avail_in||0!==r.lookahead||e!==dt&&666!==r.status){let a=r.strategy===Et?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Zt(t),0===t.lookahead)){if(e===dt)return 1;break}if(t.match_length=0,a=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2})(r,e):r.strategy===Rt?((t,e)=>{let a,n,r,i;const s=t.window;for(;;){if(t.lookahead<=258){if(Zt(t),t.lookahead<=258&&e===dt)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=t.strstart-1,n=s[r],n===s[++r]&&n===s[++r]&&n===s[++r])){i=t.strstart+258;do{}while(n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&rt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=ht(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2})(r,e):Ht[r.level].func(r,e);if(3!==a&&4!==a||(r.status=666),1===a||3===a)return 0===t.avail_out&&(r.last_flush=-1),pt;if(2===a&&(e===ut?ct(r):e!==wt&&(lt(r,0,0,!1),e===_t&&(Dt(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),Nt(t),0===t.avail_out))return r.last_flush=-1,pt}return e!==bt?pt:r.wrap<=0?gt:(2===r.wrap?(Bt(r,255&t.adler),Bt(r,t.adler>>8&255),Bt(r,t.adler>>16&255),Bt(r,t.adler>>24&255),Bt(r,255&t.total_in),Bt(r,t.total_in>>8&255),Bt(r,t.total_in>>16&255),Bt(r,t.total_in>>24&255)):(Lt(r,t.adler>>>16),Lt(r,65535&t.adler)),Nt(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?pt:gt)},deflateEnd:t=>{if(!t||!t.state)return mt;const e=t.state.status;return 42!==e&&69!==e&&73!==e&&91!==e&&103!==e&&113!==e&&666!==e?zt(t,mt):(t.state=null,113===e?zt(t,vt):pt)},deflateSetDictionary:(t,e)=>{let a=e.length;if(!t||!t.state)return mt;const n=t.state,r=n.wrap;if(2===r||1===r&&42!==n.status||n.lookahead)return mt;if(1===r&&(t.adler=at(t.adler,e,a,0)),n.wrap=0,a>=n.w_size){0===r&&(Dt(n.head),n.strstart=0,n.block_start=0,n.insert=0);let t=new Uint8Array(n.w_size);t.set(e.subarray(a-n.w_size,a),0),e=t,a=n.w_size}const i=t.avail_in,s=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Zt(n);n.lookahead>=3;){let t=n.strstart,e=n.lookahead-2;do{n.ins_h=It(n,n.ins_h,n.window[t+3-1]),n.prev[t&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=t,t++}while(--e);n.strstart=t,n.lookahead=2,Zt(n)}return n.strstart+=n.lookahead,n.block_start=n.strstart,n.insert=n.lookahead,n.lookahead=0,n.match_length=n.prev_length=2,n.match_available=0,t.next_in=s,t.input=o,t.avail_in=i,n.wrap=r,pt},deflateInfo:"pako deflate (from Nodeca project)"};const Jt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Xt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Jt(a,e)&&(t[e]=a[e])}}return t},$t=t=>{let e=0;for(let a=0,n=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;te[254]=te[254]=1;var ee=t=>{let e,a,n,r,i,s=t.length,o=0;for(r=0;r>>6,e[i++]=128|63&a):a<65536?(e[i++]=224|a>>>12,e[i++]=128|a>>>6&63,e[i++]=128|63&a):(e[i++]=240|a>>>18,e[i++]=128|a>>>12&63,e[i++]=128|a>>>6&63,e[i++]=128|63&a);return e},ae=(t,e)=>{let a,n;const r=e||t.length,i=new Array(2*r);for(n=0,a=0;a4)i[n++]=65533,a+=s-1;else{for(e&=2===s?31:3===s?15:7;s>1&&a1?i[n++]=65533:e<65536?i[n++]=e:(e-=65536,i[n++]=55296|e>>10&1023,i[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&Qt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let n=0;n{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+te[t[a]]>e?a:e};var re=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const ie=Object.prototype.toString,{Z_NO_FLUSH:se,Z_SYNC_FLUSH:oe,Z_FULL_FLUSH:le,Z_FINISH:fe,Z_OK:he,Z_STREAM_END:ce,Z_DEFAULT_COMPRESSION:de,Z_DEFAULT_STRATEGY:ue,Z_DEFLATED:_e}=st;function be(t){this.options=Xt({level:de,method:_e,chunkSize:16384,windowBits:15,memLevel:8,strategy:ue},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new re,this.strm.avail_out=0;let a=qt.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==he)throw new Error(it[a]);if(e.header&&qt.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?ee(e.dictionary):"[object ArrayBuffer]"===ie.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=qt.deflateSetDictionary(this.strm,t),a!==he)throw new Error(it[a]);this._dict_set=!0}}function we(t,e){const a=new be(e);if(a.push(t,!0),a.err)throw a.msg||it[a.err];return a.result}be.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize;let r,i;if(this.ended)return!1;for(i=e===~~e?e:!0===e?fe:se,"string"==typeof t?a.input=ee(t):"[object ArrayBuffer]"===ie.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),(i===oe||i===le)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(r=qt.deflate(a,i),r===ce)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),r=qt.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===he;if(0!==a.avail_out){if(i>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},be.prototype.onData=function(t){this.chunks.push(t)},be.prototype.onEnd=function(t){t===he&&(this.result=$t(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var pe={Deflate:be,deflate:we,deflateRaw:function(t,e){return(e=e||{}).raw=!0,we(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,we(t,e)},constants:st};var ge=function(t,e){let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E,R;const U=t.state;a=t.next_in,E=t.input,n=a+(t.avail_in-5),r=t.next_out,R=t.output,i=r-(e-t.avail_out),s=r+(t.avail_out-257),o=U.dmax,l=U.wsize,f=U.whave,h=U.wnext,c=U.window,d=U.hold,u=U.bits,_=U.lencode,b=U.distcode,w=(1<>>24,d>>>=m,u-=m,m=g>>>16&255,0===m)R[r++]=65535&g;else{if(!(16&m)){if(0==(64&m)){g=_[(65535&g)+(d&(1<>>=m,u-=m),u<15&&(d+=E[a++]<>>24,d>>>=m,u-=m,m=g>>>16&255,!(16&m)){if(0==(64&m)){g=b[(65535&g)+(d&(1<o){t.msg="invalid distance too far back",U.mode=30;break t}if(d>>>=m,u-=m,m=r-i,k>m){if(m=k-m,m>f&&U.sane){t.msg="invalid distance too far back",U.mode=30;break t}if(y=0,A=c,0===h){if(y+=l-m,m2;)R[r++]=A[y++],R[r++]=A[y++],R[r++]=A[y++],v-=3;v&&(R[r++]=A[y++],v>1&&(R[r++]=A[y++]))}else{y=r-k;do{R[r++]=R[y++],R[r++]=R[y++],R[r++]=R[y++],v-=3}while(v>2);v&&(R[r++]=R[y++],v>1&&(R[r++]=R[y++]))}break}}break}}while(a>3,a-=v,u-=v<<3,d&=(1<{const l=o.bits;let f,h,c,d,u,_,b=0,w=0,p=0,g=0,m=0,v=0,k=0,y=0,A=0,E=0,R=null,U=0;const x=new Uint16Array(16),T=new Uint16Array(16);let S,z,O,D=null,I=0;for(b=0;b<=15;b++)x[b]=0;for(w=0;w=1&&0===x[g];g--);if(m>g&&(m=g),0===g)return r[i++]=20971520,r[i++]=20971520,o.bits=1,0;for(p=1;p0&&(0===t||1!==g))return-1;for(T[1]=0,b=1;b<15;b++)T[b+1]=T[b]+x[b];for(w=0;w852||2===t&&A>592)return 1;for(;;){S=b-k,s[w]<_?(z=0,O=s[w]):s[w]>_?(z=D[I+s[w]],O=R[U+s[w]]):(z=96,O=0),f=1<>k)+h]=S<<24|z<<16|O|0}while(0!==h);for(f=1<>=1;if(0!==f?(E&=f-1,E+=f):E=0,w++,0==--x[b]){if(b===g)break;b=e[a+s[w]]}if(b>m&&(E&d)!==c){for(0===k&&(k=m),u+=p,v=b-k,y=1<852||2===t&&A>592)return 1;c=E&d,r[c]=m<<24|v<<16|u-i|0}}return 0!==E&&(r[u+E]=b-k<<24|64<<16|0),o.bits=m,0};const{Z_FINISH:Ee,Z_BLOCK:Re,Z_TREES:Ue,Z_OK:xe,Z_STREAM_END:Te,Z_NEED_DICT:Se,Z_STREAM_ERROR:ze,Z_DATA_ERROR:Oe,Z_MEM_ERROR:De,Z_BUF_ERROR:Ie,Z_DEFLATED:Ne}=st,Pe=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Be(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Le=t=>{if(!t||!t.state)return ze;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,xe},Ce=t=>{if(!t||!t.state)return ze;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Le(t)},Fe=(t,e)=>{let a;if(!t||!t.state)return ze;const n=t.state;return e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?ze:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=a,n.wbits=e,Ce(t))},Ze=(t,e)=>{if(!t)return ze;const a=new Be;t.state=a,a.window=null;const n=Fe(t,e);return n!==xe&&(t.state=null),n};let Me,We,Ve=!0;const He=t=>{if(Ve){Me=new Int32Array(512),We=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(Ae(1,t.lens,0,288,Me,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;Ae(2,t.lens,0,32,We,0,t.work,{bits:5}),Ve=!1}t.lencode=Me,t.lenbits=9,t.distcode=We,t.distbits=5},je=(t,e,a,n)=>{let r;const i=t.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(e.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(r=i.wsize-i.wnext,r>n&&(r=n),i.window.set(e.subarray(a-n,a-n+r),i.wnext),(n-=r)?(i.window.set(e.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=r,i.wnext===i.wsize&&(i.wnext=0),i.whaveZe(t,15),inflateInit2:Ze,inflate:(t,e)=>{let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E=0;const R=new Uint8Array(4);let U,x;const T=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return ze;a=t.state,12===a.mode&&(a.mode=13),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,c=o,d=l,A=xe;t:for(;;)switch(a.mode){case 1:if(0===a.wrap){a.mode=13;break}for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=rt(a.check,R,2,0),f=0,h=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&f)<<8)+(f>>8))%31){t.msg="incorrect header check",a.mode=30;break}if((15&f)!==Ne){t.msg="unknown compression method",a.mode=30;break}if(f>>>=4,h-=4,y=8+(15&f),0===a.wbits)a.wbits=y;else if(y>a.wbits){t.msg="invalid window size",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(R[0]=255&f,R[1]=f>>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0,a.mode=3;case 3:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>8&255,R[2]=f>>>16&255,R[3]=f>>>24&255,a.check=rt(a.check,R,4,0)),f=0,h=0,a.mode=4;case 4:for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>8),512&a.flags&&(R[0]=255&f,R[1]=f>>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0,a.mode=5;case 5:if(1024&a.flags){for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(u=a.length,u>o&&(u=o),u&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(n.subarray(i,i+u),y)),512&a.flags&&(a.check=rt(a.check,n,u,i)),o-=u,i+=u,a.length-=u),a.length))break t;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===o)break t;u=0;do{y=n[i+u++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&u>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=12;break;case 10:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>=7&h,h-=7&h,a.mode=27;break}for(;h<3;){if(0===o)break t;o--,f+=n[i++]<>>=1,h-=1,3&f){case 0:a.mode=14;break;case 1:if(He(a),a.mode=20,e===Ue){f>>>=2,h-=2;break t}break;case 2:a.mode=17;break;case 3:t.msg="invalid block type",a.mode=30}f>>>=2,h-=2;break;case 14:for(f>>>=7&h,h-=7&h;h<32;){if(0===o)break t;o--,f+=n[i++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=30;break}if(a.length=65535&f,f=0,h=0,a.mode=15,e===Ue)break t;case 15:a.mode=16;case 16:if(u=a.length,u){if(u>o&&(u=o),u>l&&(u=l),0===u)break t;r.set(n.subarray(i,i+u),s),o-=u,i+=u,l-=u,s+=u,a.length-=u;break}a.mode=12;break;case 17:for(;h<14;){if(0===o)break t;o--,f+=n[i++]<>>=5,h-=5,a.ndist=1+(31&f),f>>>=5,h-=5,a.ncode=4+(15&f),f>>>=4,h-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=30;break}a.have=0,a.mode=18;case 18:for(;a.have>>=3,h-=3}for(;a.have<19;)a.lens[T[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,U={bits:a.lenbits},A=Ae(0,a.lens,0,19,a.lencode,0,a.work,U),a.lenbits=U.bits,A){t.msg="invalid code lengths set",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=w,h-=w,a.lens[a.have++]=g;else{if(16===g){for(x=w+2;h>>=w,h-=w,0===a.have){t.msg="invalid bit length repeat",a.mode=30;break}y=a.lens[a.have-1],u=3+(3&f),f>>>=2,h-=2}else if(17===g){for(x=w+3;h>>=w,h-=w,y=0,u=3+(7&f),f>>>=3,h-=3}else{for(x=w+7;h>>=w,h-=w,y=0,u=11+(127&f),f>>>=7,h-=7}if(a.have+u>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=30;break}for(;u--;)a.lens[a.have++]=y}}if(30===a.mode)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=30;break}if(a.lenbits=9,U={bits:a.lenbits},A=Ae(1,a.lens,0,a.nlen,a.lencode,0,a.work,U),a.lenbits=U.bits,A){t.msg="invalid literal/lengths set",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,U={bits:a.distbits},A=Ae(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,U),a.distbits=U.bits,A){t.msg="invalid distances set",a.mode=30;break}if(a.mode=20,e===Ue)break t;case 20:a.mode=21;case 21:if(o>=6&&l>=258){t.next_out=s,t.avail_out=l,t.next_in=i,t.avail_in=o,a.hold=f,a.bits=h,ge(t,d),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;E=a.lencode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,a.length=g,0===p){a.mode=26;break}if(32&p){a.back=-1,a.mode=12;break}if(64&p){t.msg="invalid literal/length code",a.mode=30;break}a.extra=15&p,a.mode=22;case 22:if(a.extra){for(x=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;E=a.distcode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,64&p){t.msg="invalid distance code",a.mode=30;break}a.offset=g,a.extra=15&p,a.mode=24;case 24:if(a.extra){for(x=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=30;break}a.mode=25;case 25:if(0===l)break t;if(u=d-l,a.offset>u){if(u=a.offset-u,u>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=30;break}u>a.wnext?(u-=a.wnext,_=a.wsize-u):_=a.wnext-u,u>a.length&&(u=a.length),b=a.window}else b=r,_=s-a.offset,u=a.length;u>l&&(u=l),l-=u,a.length-=u;do{r[s++]=b[_++]}while(--u);0===a.length&&(a.mode=21);break;case 26:if(0===l)break t;r[s++]=a.length,l--,a.mode=21;break;case 27:if(a.wrap){for(;h<32;){if(0===o)break t;o--,f|=n[i++]<{if(!t||!t.state)return ze;let e=t.state;return e.window&&(e.window=null),t.state=null,xe},inflateGetHeader:(t,e)=>{if(!t||!t.state)return ze;const a=t.state;return 0==(2&a.wrap)?ze:(a.head=e,e.done=!1,xe)},inflateSetDictionary:(t,e)=>{const a=e.length;let n,r,i;return t&&t.state?(n=t.state,0!==n.wrap&&11!==n.mode?ze:11===n.mode&&(r=1,r=at(r,e,a,0),r!==n.check)?Oe:(i=je(t,e,a,a),i?(n.mode=31,De):(n.havedict=1,xe))):ze},inflateInfo:"pako inflate (from Nodeca project)"};var Ke=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Ye=Object.prototype.toString,{Z_NO_FLUSH:qe,Z_FINISH:Je,Z_OK:Xe,Z_STREAM_END:$e,Z_NEED_DICT:Qe,Z_STREAM_ERROR:ta,Z_DATA_ERROR:ea,Z_MEM_ERROR:aa}=st;function na(t){this.options=Xt({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new re,this.strm.avail_out=0;let a=Ge.inflateInit2(this.strm,e.windowBits);if(a!==Xe)throw new Error(it[a]);if(this.header=new Ke,Ge.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=ee(e.dictionary):"[object ArrayBuffer]"===Ye.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=Ge.inflateSetDictionary(this.strm,e.dictionary),a!==Xe)))throw new Error(it[a])}function ra(t,e){const a=new na(e);if(a.push(t),a.err)throw a.msg||it[a.err];return a.result}na.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize,r=this.options.dictionary;let i,s,o;if(this.ended)return!1;for(s=e===~~e?e:!0===e?Je:qe,"[object ArrayBuffer]"===Ye.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=Ge.inflate(a,s),i===Qe&&r&&(i=Ge.inflateSetDictionary(a,r),i===Xe?i=Ge.inflate(a,s):i===ea&&(i=Qe));a.avail_in>0&&i===$e&&a.state.wrap>0&&0!==t[a.next_in];)Ge.inflateReset(a),i=Ge.inflate(a,s);switch(i){case ta:case ea:case Qe:case aa:return this.onEnd(i),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||i===$e))if("string"===this.options.to){let t=ne(a.output,a.next_out),e=a.next_out-t,r=ae(a.output,t);a.next_out=e,a.avail_out=n-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(r)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==Xe||0!==o){if(i===$e)return i=Ge.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},na.prototype.onData=function(t){this.chunks.push(t)},na.prototype.onEnd=function(t){t===Xe&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=$t(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ia={Inflate:na,inflate:ra,inflateRaw:function(t,e){return(e=e||{}).raw=!0,ra(t,e)},ungzip:ra,constants:st};const{Deflate:sa,deflate:oa,deflateRaw:la,gzip:fa}=pe,{Inflate:ha,inflate:ca,inflateRaw:da,ungzip:ua}=ia;var _a=oa;const ba=[137,80,78,71,13,10,26,10],wa=[];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)1&e?e=3988292384^e>>>1:e>>>=1;wa[t]=e}function pa(t,e){return(4294967295^function(t,e,a){let n=t;for(let t=0;t>>8;return n}(4294967295,t,e))>>>0}var ga,ma,va,ka;!function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.GREYSCALE=0]="GREYSCALE",t[t.TRUECOLOUR=2]="TRUECOLOUR",t[t.INDEXED_COLOUR=3]="INDEXED_COLOUR",t[t.GREYSCALE_ALPHA=4]="GREYSCALE_ALPHA",t[t.TRUECOLOUR_ALPHA=6]="TRUECOLOUR_ALPHA"}(ga||(ga={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.DEFLATE=0]="DEFLATE"}(ma||(ma={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.ADAPTIVE=0]="ADAPTIVE"}(va||(va={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.NO_INTERLACE=0]="NO_INTERLACE",t[t.ADAM7=1]="ADAM7"}(ka||(ka={}));new Uint8Array(0);const ya=new Uint16Array([255]);new Uint8Array(ya.buffer)[0];const Aa={level:3};class Ea extends k{constructor(t,e={}){super(),this._colorType=ga.UNKNOWN,this._zlibOptions=Object.assign({},Aa,e.zlib),this._png=this._checkData(t),this.setBigEndian()}encode(){return this.encodeSignature(),this.encodeIHDR(),this.encodeData(),this.encodeIEND(),this.toArray()}encodeSignature(){this.writeBytes(ba)}encodeIHDR(){this.writeUint32(13),this.writeChars("IHDR"),this.writeUint32(this._png.width),this.writeUint32(this._png.height),this.writeByte(this._png.depth),this.writeByte(this._colorType),this.writeByte(ma.DEFLATE),this.writeByte(va.ADAPTIVE),this.writeByte(ka.NO_INTERLACE),this.writeCrc(17)}encodeIEND(){this.writeUint32(0),this.writeChars("IEND"),this.writeCrc(4)}encodeIDAT(t){this.writeUint32(t.length),this.writeChars("IDAT"),this.writeBytes(t),this.writeCrc(t.length+4)}encodeData(){const{width:t,height:e,channels:a,depth:n,data:r}=this._png,i=a*t,s=(new k).setBigEndian();let o=0;for(let t=0;t0)return t;throw new TypeError(e+" must be a positive integer")}function Ua(t,e,a,n){for(let r=0;r{var e;e=t.data,Oa.push(e),Ia()})}]); +//# sourceMappingURL=webp.worker.c0cc94110cda650246b2.bundle.worker.js.map \ No newline at end of file diff --git a/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js.map b/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js.map new file mode 100644 index 00000000..87cdddc9 --- /dev/null +++ b/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/iobuffer/lib-esm/text-encoding-polyfill.js","webpack:///./src/vendor/libwebp-0.2.0.js","webpack:///./node_modules/iobuffer/lib-esm/utf8.browser.js","webpack:///./node_modules/iobuffer/lib-esm/IOBuffer.js","webpack:///./node_modules/fast-png/node_modules/pako/dist/pako.esm.mjs","webpack:///./node_modules/fast-png/lib-esm/common.js","webpack:///./node_modules/fast-png/lib-esm/internalTypes.js","webpack:///./node_modules/fast-png/lib-esm/PNGDecoder.js","webpack:///./node_modules/fast-png/lib-esm/PNGEncoder.js","webpack:///./node_modules/fast-png/lib-esm/types.js","webpack:///./src/lib/webp/webp.ts","webpack:///./node_modules/fast-png/lib-esm/index.js","webpack:///./src/lib/webp/webp.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","scope","FastTextEncoder","utfLabel","RangeError","FastTextDecoder","options","fatal","Error","encode","string","stream","pos","len","length","at","tlen","Math","max","target","Uint8Array","charCodeAt","extra","update","set","slice","decode","buffer","bytes","out","byte1","push","byte2","byte3","codepoint","String","fromCharCode","apply","window","self","this","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","U","ld","md","$","WebPDecoder","a","Ob","Pb","Bb","Qb","b","la","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","ja","jc","k","h","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","f","q","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","WebPInitDecoderConfig","pow","Dg","Eg","Fg","Gg","id","Hg","Ig","Jg","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","TextDecoder","TextEncoder","dataIsGiven","ArrayBuffer","lastWrittenByte","byteLength","dvOffset","isView","byteOffset","littleEndian","_data","DataView","_mark","_marks","pop","undefined","seek","available","newLength","newArray","readUint8","getInt8","getUint8","readByte","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","readInt8","result","readChar","readBytes","writeUint8","ensureAvailable","setInt8","_updateLastWrittenByte","setUint8","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","str","writeBytes","zero","buf","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES","_dist_code","_length_code","MAX_MATCH","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","pending_buf","pending","send_bits","bi_valid","bi_buf","send_code","tree","bi_reverse","code","res","gen_codes","bl_count","next_code","MAX_BITS","bits","init_block","LITERALS","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","last_lit","matches","bi_windup","smaller","depth","_n2","_m2","pqdownheap","heap","heap_len","compress_block","ltree","dtree","lx","d_buf","l_buf","build_tree","desc","stree","node","heap_max","base","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","count","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block","stored_len","last","header","subarray","copy_block","trees","_tr_init","LENGTH_CODES","L_CODES","tr_static_init","l_desc","d_desc","bl_desc","_tr_flush_block","opt_lenb","static_lenb","max_blindex","level","strm","data_type","black_mask","detect_data_type","BL_CODES","build_bl_tree","strategy","lcodes","dcodes","blcodes","rank","send_all_trees","_tr_tally","lit_bufsize","_tr_align","STATIC_TREES","bi_flush","adler32_1","adler","s1","s2","crcTable","Uint32Array","table","makeTable","crc32_1","crc","end","messages","2","1","0","constants","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","_tr_init$1","_tr_stored_block$1","_tr_flush_block$1","_tr_tally$1","_tr_align$1","Z_FIXED$1","Z_UNKNOWN$1","err","errorCode","msg","zero$1","HASH","prev","hash_shift","hash_mask","flush_pending","state","avail_out","output","pending_out","next_out","total_out","flush_block_only","block_start","strstart","put_byte","putShortMSB","read_buf","start","avail_in","next_in","wrap","total_in","longest_match","cur_match","match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","window_size","hash_size","head","insert","ins_h","deflate_fast","flush","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH$1","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","max_block_size","pending_buf_size","max_start","DeflateState","status","gzhead","gzindex","method","last_flush","w_bits","hash_bits","Uint16Array","HEAP_SIZE$1","MAX_BITS$1","deflateResetKeep","deflateReset","ret","lm_init","deflateInit2","windowBits","memLevel","deflate_1","deflateInit","deflateSetHeader","deflate","beg","val","old_flush","text","hcrc","comment","time","os","level_flags","bstate","deflate_huff","deflate_rle","deflateEnd","deflateSetDictionary","dictionary","dictLength","tmpDict","avail","next","deflateInfo","_has","obj","common","sources","arguments","source","shift","TypeError","chunks","chunk","STR_APPLY_UIA_OK","__","_utf8len","strings","c2","m_pos","str_len","buf_len","utf16buf","c_len","buf2binstring","zstream","toString","Z_NO_FLUSH$1","Z_FULL_FLUSH$1","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$1","Deflate","chunkSize","opt","raw","gzip","ended","dict","_dict_set","deflate$1","deflator","flush_mode","_flush_mode","onData","onEnd","deflate_1$1","deflateRaw","inffast","_in","_out","dmax","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","from","from_source","lencode","distcode","lenbits","distbits","top","dolen","dodist","sane","lbase","lext","dbase","dext","inftrees","type","lens","lens_index","codes","table_index","work","opts","incr","fill","low","mask","sym","min","root","curr","drop","left","used","huff","base_index","MAXBITS","offs","here_bits","here_op","here_val","extra_index","Z_FINISH$2","Z_BLOCK$1","Z_OK$2","Z_STREAM_END$2","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_BUF_ERROR$1","Z_DEFLATED$2","zswap32","InflateState","havedict","flags","check","total","wbits","ncode","nlen","ndist","have","lendyn","distdyn","back","was","inflateResetKeep","Int32Array","inflateReset","inflateReset2","inflateInit2","lenfix","distfix","virgin","fixedtables","updatewindow","src","copy","inflate_1","inflateInit","inflate","last_bits","last_op","last_val","hbuf","order","inf_leave","done","xflags","extra_len","inflateEnd","inflateGetHeader","inflateSetDictionary","dictid","inflateInfo","gzheader","toString$1","Z_NO_FLUSH$2","Z_FINISH$3","Z_OK$3","Z_STREAM_END$3","Z_NEED_DICT$1","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_MEM_ERROR$1","Inflate","to","inflate$1","inflator","last_avail_out","next_out_utf8","tail","utf8str","join","inflate_1$1","inflateRaw","ungzip","Deflate$1","deflate$2","deflateRaw$1","gzip$1","Inflate$1","inflate$2","inflateRaw$1","ungzip$1","deflate_1$2","pngSignature","currentCrc","updateCrc","ColorType","CompressionMethod","FilterMethod","InterlaceMethod","uint16","defaultZlibOptions","super","_colorType","UNKNOWN","_zlibOptions","assign","zlib","_png","_checkData","setBigEndian","encodeSignature","encodeIHDR","encodeData","encodeIEND","toArray","writeUint32","writeChars","writeByte","DEFLATE","ADAPTIVE","NO_INTERLACE","writeCrc","channels","slotsPerLine","newData","writeDataBytes","writeDataUint16","compressed","encodeIDAT","colorType","returnValue","TRUECOLOUR_ALPHA","TRUECOLOUR","GREYSCALE","GREYSCALE_ALPHA","getColorType","png","checkInteger","expectedSize","Number","isInteger","writeUint16","ResolutionUnitSpecifier","webp2png","decoder","config","bitstream","rgbaData","ctx","tasks","finishTask","processTasks","task","fileName","payload","convertedBytes","console","error","postMessage","addEventListener","event"],"mappings":"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CnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IACxB,IAAK,IAAK,IAAK,IAAK,KAEtB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAErC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,QAIzDnO,KAAKsb,sBAAwBtb,KAAKiN,GAAK,WACrC,OAAO,KAET,IAAIlB,GAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GACtD2C,GAAK,CACP,CAAC,IAAK,IAAK,IAAK,GAChB,CAAC,IAAK,IAAK,IAAK,IAAK,GACrB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,GAC1B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAEtDC,GAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7B,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,IAExB4D,GAAK/Q,EAAG,CAAC0M,GAAIX,IAAK,IACtBjM,EAAE,EAx1HM,GAy1HR,IAAIwF,GAAK,CACP,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,GACV,CAAC,EAAG,EAAG,EAAG,IAER8H,GAAK,UACL4D,GAAK,GACLtL,IAAK,IACLqH,GAAK,IACL8G,GAAK,CAACpN,GAAI,SAAUtG,GACtB,OAAOA,GACN,SAAUA,EAAGK,EAAGlG,GACjB,OAAOkG,EAAElG,EAAI,IACZ,SAAU6F,EAAGK,EAAGlG,GACjB,OAAOkG,EAAElG,EAAI,IACZ,SAAU6F,EAAGK,EAAGlG,GACjB,OAAOkG,EAAElG,EAAI,IACZ,SAAU6F,EAAGK,EAAGlG,GACjB,OAAO6J,GAAGA,GAAGhE,EAAGK,EAAElG,EAAI,IAAKkG,EAAElG,EAAI,KAChC,SAAU6F,EAAGK,EAAGlG,GACjB,OAAO6J,GAAGhE,EAAGK,EAAElG,EAAI,KAClB,SAAU6F,EAAGK,EAAGlG,GACjB,OAAO6J,GAAGhE,EAAGK,EAAElG,EAAI,KAClB,SAAU6F,EACXK,EAAGlG,GACH,OAAO6J,GAAG3D,EAAElG,EAAI,GAAIkG,EAAElG,EAAI,KACzB,SAAU6F,EAAGK,EAAGlG,GACjB,OAAO6J,GAAG3D,EAAElG,EAAI,GAAIkG,EAAElG,EAAI,KACzB,SAAU6F,EAAGK,EAAGlG,GACjB,OAAO6J,GAAGA,GAAGhE,EAAGK,EAAElG,EAAI,IAAK6J,GAAG3D,EAAElG,EAAI,GAAIkG,EAAElG,EAAI,MAC7C,SAAU6F,EAAGK,EAAGlG,GACjB,OAAO2C,KAAK8c,KAAK5Z,GAAK,GAAK,MAAQK,EAAElG,EAAI,IAAM,GAAK,MAAQ2C,KAAK8c,KAAKvZ,EAAElG,EAAI,IAAM,GAAK,MAAQkG,EAAElG,EAAI,IAAM,GAAK,OAAS2C,KAAK8c,KAAK5Z,GAAK,GAAK,MAAQK,EAAElG,EAAI,IAAM,GAAK,MAAQ2C,KAAK8c,KAAKvZ,EAAElG,EAAI,IAAM,GAAK,MAAQkG,EAAElG,EAAI,IAAM,GAAK,QAAU2C,KAAK8c,KAAK5Z,GAAK,EAAI,MAAQK,EAAElG,EAAI,IAAM,EAAI,MAAQ2C,KAAK8c,KAAKvZ,EAAElG,EAAI,IAAM,EAAI,MAAQkG,EAAElG,EAAI,IAAM,EAAI,QAAU2C,KAAK8c,KAAS,IAAJ5Z,IAAuB,IAAXK,EAAElG,EAAI,KAAa2C,KAAK8c,KAAgB,IAAXvZ,EAAElG,EAAI,KAAwB,IAAXkG,EAAElG,EAAI,OAAe,EAAIkG,EAAElG,EAAI,GAAK6F,GACpc,SAAUA,EAAGK,EAAGlG,GACjB,OAAQmX,IAAItR,GACL,GAAK,MAAQK,EAAElG,EAAI,IAAM,GAAK,MAAQkG,EAAElG,EAAI,IAAM,GAAK,OAAS,GAAKmX,IAAItR,GAAK,GAAK,MAAQK,EAAElG,EAAI,IAAM,GAAK,MAAQkG,EAAElG,EAAI,IAAM,GAAK,OAAS,GAAKmX,IAAItR,GAAK,EAAI,MAAQK,EAAElG,EAAI,IAAM,EAAI,MAAQkG,EAAElG,EAAI,IAAM,EAAI,OAAS,EAAImX,IAAQ,IAAJtR,IAAuB,IAAXK,EAAElG,EAAI,KAAwB,IAAXkG,EAAElG,EAAI,QAAgB,GAC5R,SAAU6F,EAAGK,EAAGlG,GACjB,MAAMC,EAAIiG,EAAElG,EAAI,GAEhB,OAAQ4R,IADR/L,EAAIgE,GAAGhE,EAAGK,EAAElG,EAAI,MACA,GAAK,IAAKC,GAAK,GAAK,MAAQ,GAAK2R,GAAG/L,GAAK,GAAK,IAAK5F,GAAK,GAAK,MAAQ,GAAK2R,GAAG/L,GAAK,EAAI,IAAK5F,GAAK,EAAI,MAAQ,EAAI2R,GAAG/L,GAAK,EAAI,IAAK5F,GAAK,EAAI,QAAU,GACnKkM,GAAIA,IACHsN,GAAK,CACPnO,GA/4HM,EAg5HN2M,GAh5HM,EAi5HN7F,GAj5HM,GAm5HJnB,GAAK,GACLuK,GAAK,GACLC,GAAK,GACLE,GAAK,CAAC,EAAG,EAAG,GACZD,GAAK,CAAC,EAAG,EAAG,IACZvB,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLG,GAAK,EACLU,GAAK,CAACjQ,GAAKgP,GAAIhP,GAAIA,GAAIA,GAAI,IAC3BkQ,GAAK,GACLC,GAAK,CAAC,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAClC,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IAE9BX,GAAK,IACLC,GAAK,CAAC,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,KACrfnP,GAAK,GAAKkL,GAAK,EACfzD,GAAKzN,EAAE,IAAK,GACZuR,GAAKvR,EAAE,IAAK,GACZsR,GAAKtR,EAAE,IAx6HH,GAy6HJ4N,GAAK5N,EAAE,IAz6HH,GA06HJkK,GAAKlK,EAAEiN,GAAKrH,GAz6HR,GA06HJuG,GAAKnM,EAAEiN,GACLrH,GA36HE,GA46HJiS,GAAK,EACL9S,GAAIyQ,MAAM1P,IACVqR,GAAK,CAAC,SAAU9W,EAAGK,EAAGlG,EAAGC,EAAGmG,EAAGsC,EAAGb,EAAGC,EAAG1G,EAAGxB,EAAGG,EAAGc,EAAG8H,GACtD+H,GAAG7K,EAAGK,EAAGlG,EAAGC,EAAGmG,EAAGsC,EAAGb,EAAGC,EAAG1G,EAAGxB,EAAGG,EAAGc,EAAG8H,EAAGiP,GAAI,IAC7CuE,GAAI,SAAUtW,EAAGK,EAAGlG,EAAGC,EAAGmG,EAAGsC,EAAGb,EAAGC,EAAG1G,EAAGxB,EAAGG,EAAGc,EAAG8H,GACnD+H,GAAG7K,EAAGK,EAAGlG,EAAGC,EAAGmG,EAAGsC,EAAGb,EAAGC,EAAG1G,EAAGxB,EAAGG,EAAGc,EAAG8H,EAAG2L,GAAI,IAC7C8H,GAAIC,GAAIC,GAAI,SAAUzW,EAAGK,EAAGlG,EAAGC,EAAGmG,EAAGsC,EAAGb,EAAGC,EAAG1G,EAAGxB,EAAGG,EAAGc,EAAG8H,GAC3D+H,GAAG7K,EAAGK,EAAGlG,EAAGC,EAAGmG,EAAGsC,EAAGb,EAAGC,EAAG1G,EAAGxB,EAAGG,EAAGc,EAAG8H,EAAGwP,GAAI,IAC7CgE,GAAIC,GAAIC,GAAIC,IACfpY,KAAKkL,GAAK,SAAUvJ,EAAGK,EAAGlG,EAAGC,GAC3B,OAAOiT,GAAG7H,GAAIxF,EAAGK,EAAGlG,EAAGC,IAEzBiE,KAAKmL,GAAK,SAAUxJ,EAAGK,EAAGlG,EAAGC,GAC3B,OAAOiT,GAAGU,GAAI/N,EAAGK,EAAGlG,EAAGC,IAEzBiE,KAAKoL,GAAK,SAAUzJ,EAAGK,EAAGlG,EAAGC,GAC3B,OAAOiT,GAAG3B,GAAI1L,EAAGK,EAAGlG,EAAGC,IAEzBiE,KAAK4J,GAAK,SAAUjI,EAAGK,EAAGlG,EAAGC,GAC3B,OAAOiT,GAAG9B,GAAIvL,EAAGK,EAAGlG,EAAGC,IAEzBiE,KAAKuK,GAAK,SAAU5I,EAAGK,EAAGlG,EAAGC,GAC3B,OAAOiT,GAAGjB,GACRpM,EAAGK,EAAGlG,EAAGC,IAEbiE,KAAK8K,GAAK,SAAUnJ,EAAGK,EAAGlG,EAAGC,GAC3B,OAAOiT,GAAG5L,GAAIzB,EAAGK,EAAGlG,EAAGC,IAEzBiE,KAAKwb,WAAaxb,KAAK2J,GAAK,SAAUhI,EAAGK,EAAGlG,GAC1C,MAAMC,EAAIkE,EAAEga,IACZ,IAAI/X,EAAI,gBACR,OAAIpG,GAAKyB,EAAUoJ,IACnBzE,EAAI+J,GAAGtK,EAAG,CAAC,GAAI,CAACK,GAAIlG,EAAE2e,OAClBvY,GAAKW,GAAUX,GAAKC,GAAIsJ,GAAIvJ,GAChCnG,EAAEwc,EAAIzc,EAAEyc,EACRxc,EAAEoL,GAAKrL,EAAEqL,GACEyS,GAAGjY,EAAG,EAAG,CAACK,GAAIjG,O,KC7+H7B,MAAM,EAAU,IAAI0f,YAAY,SAIhC,MAAM,EAAU,IAAIC,YCJb,MAAM,EAST,YAAYpQ,EAVU,KAUgBxN,EAAU,IAC5C,IAAI6d,GAAc,EACE,iBAATrQ,EACPA,EAAO,IAAIsQ,YAAYtQ,IAGvBqQ,GAAc,EACd3b,KAAK6b,gBAAkBvQ,EAAKwQ,YAEhC,MAAMnQ,EAAS7N,EAAQ6N,OAAS7N,EAAQ6N,SAAW,EAAI,EACjDmQ,EAAaxQ,EAAKwQ,WAAanQ,EACrC,IAAIoQ,EAAWpQ,GACXiQ,YAAYI,OAAO1Q,IAASA,aAAgB,KACxCA,EAAKwQ,aAAexQ,EAAKnM,OAAO2c,aAChCC,EAAWzQ,EAAK2Q,WAAatQ,GAEjCL,EAAOA,EAAKnM,QAGZa,KAAK6b,gBADLF,EACuBG,EAGA,EAE3B9b,KAAKb,OAASmM,EACdtL,KAAK1B,OAASwd,EACd9b,KAAK8b,WAAaA,EAClB9b,KAAKic,WAAaF,EAClB/b,KAAK2L,OAAS,EACd3L,KAAKkc,cAAe,EACpBlc,KAAKmc,MAAQ,IAAIC,SAASpc,KAAKb,OAAQ4c,EAAUD,GACjD9b,KAAKqc,MAAQ,EACbrc,KAAKsc,OAAS,GAQlB,UAAUR,EAAa,GACnB,OAAO9b,KAAK2L,OAASmQ,GAAc9b,KAAK1B,OAO5C,iBACI,OAAO0B,KAAKkc,aAKhB,kBAEI,OADAlc,KAAKkc,cAAe,EACblc,KAMX,cACI,OAAQA,KAAKkc,aAKjB,eAEI,OADAlc,KAAKkc,cAAe,EACblc,KAMX,KAAK9C,EAAI,GAEL,OADA8C,KAAK2L,QAAUzO,EACR8C,KAMX,KAAK2L,GAED,OADA3L,KAAK2L,OAASA,EACP3L,KAMX,OAEI,OADAA,KAAKqc,MAAQrc,KAAK2L,OACX3L,KAMX,QAEI,OADAA,KAAK2L,OAAS3L,KAAKqc,MACZrc,KAMX,WAEI,OADAA,KAAKsc,OAAO/c,KAAKS,KAAK2L,QACf3L,KAOX,UACI,MAAM2L,EAAS3L,KAAKsc,OAAOC,MAC3B,QAAeC,IAAX7Q,EACA,MAAM,IAAI3N,MAAM,oBAGpB,OADAgC,KAAKyc,KAAK9Q,GACH3L,KAKX,SAEI,OADAA,KAAK2L,OAAS,EACP3L,KASX,gBAAgB8b,EAAa,GACzB,IAAK9b,KAAK0c,UAAUZ,GAAa,CAC7B,MACMa,EAA2B,GADZ3c,KAAK2L,OAASmQ,GAE7Bc,EAAW,IAAIhe,WAAW+d,GAChCC,EAAS5d,IAAI,IAAIJ,WAAWoB,KAAKb,SACjCa,KAAKb,OAASyd,EAASzd,OACvBa,KAAK1B,OAAS0B,KAAK8b,WAAaa,EAChC3c,KAAKmc,MAAQ,IAAIC,SAASpc,KAAKb,QAEnC,OAAOa,KAMX,cACI,OAA4B,IAArBA,KAAK6c,YAKhB,WACI,OAAO7c,KAAKmc,MAAMW,QAAQ9c,KAAK2L,UAKnC,YACI,OAAO3L,KAAKmc,MAAMY,SAAS/c,KAAK2L,UAKpC,WACI,OAAO3L,KAAK6c,YAKhB,UAAU3f,EAAI,GACV,MAAMkC,EAAQ,IAAIR,WAAW1B,GAC7B,IAAK,IAAIzB,EAAI,EAAGA,EAAIyB,EAAGzB,IACnB2D,EAAM3D,GAAKuE,KAAKgd,WAEpB,OAAO5d,EAKX,YACI,MAAM1C,EAAQsD,KAAKmc,MAAMc,SAASjd,KAAK2L,OAAQ3L,KAAKkc,cAEpD,OADAlc,KAAK2L,QAAU,EACRjP,EAKX,aACI,MAAMA,EAAQsD,KAAKmc,MAAMe,UAAUld,KAAK2L,OAAQ3L,KAAKkc,cAErD,OADAlc,KAAK2L,QAAU,EACRjP,EAKX,YACI,MAAMA,EAAQsD,KAAKmc,MAAMgB,SAASnd,KAAK2L,OAAQ3L,KAAKkc,cAEpD,OADAlc,KAAK2L,QAAU,EACRjP,EAKX,aACI,MAAMA,EAAQsD,KAAKmc,MAAMiB,UAAUpd,KAAK2L,OAAQ3L,KAAKkc,cAErD,OADAlc,KAAK2L,QAAU,EACRjP,EAKX,cACI,MAAMA,EAAQsD,KAAKmc,MAAMkB,WAAWrd,KAAK2L,OAAQ3L,KAAKkc,cAEtD,OADAlc,KAAK2L,QAAU,EACRjP,EAKX,cACI,MAAMA,EAAQsD,KAAKmc,MAAMmB,WAAWtd,KAAK2L,OAAQ3L,KAAKkc,cAEtD,OADAlc,KAAK2L,QAAU,EACRjP,EAKX,WACI,OAAOiD,OAAOC,aAAaI,KAAKud,YAKpC,UAAUrgB,EAAI,GACV,IAAIsgB,EAAS,GACb,IAAK,IAAI/hB,EAAI,EAAGA,EAAIyB,EAAGzB,IACnB+hB,GAAUxd,KAAKyd,WAEnB,OAAOD,EAMX,SAAStgB,EAAI,GACT,ODvQekC,ECuQDY,KAAK0d,UAAUxgB,GDtQ1B,EAAQgC,OAAOE,GADnB,IAAgBA,EC6QnB,aAAa1C,GAET,OADAsD,KAAK2d,WAAWjhB,EAAQ,IAAO,GACxBsD,KAKX,UAAUtD,GAIN,OAHAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAM0B,QAAQ7d,KAAK2L,SAAUjP,GAClCsD,KAAK8d,yBACE9d,KAMX,WAAWtD,GAIP,OAHAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAM4B,SAAS/d,KAAK2L,SAAUjP,GACnCsD,KAAK8d,yBACE9d,KAKX,UAAUtD,GACN,OAAOsD,KAAK2d,WAAWjhB,GAM3B,WAAW0C,GACPY,KAAK4d,gBAAgBxe,EAAMd,QAC3B,IAAK,IAAI7C,EAAI,EAAGA,EAAI2D,EAAMd,OAAQ7C,IAC9BuE,KAAKmc,MAAM4B,SAAS/d,KAAK2L,SAAUvM,EAAM3D,IAG7C,OADAuE,KAAK8d,yBACE9d,KAMX,WAAWtD,GAKP,OAJAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAM6B,SAAShe,KAAK2L,OAAQjP,EAAOsD,KAAKkc,cAC7Clc,KAAK2L,QAAU,EACf3L,KAAK8d,yBACE9d,KAMX,YAAYtD,GAKR,OAJAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAM8B,UAAUje,KAAK2L,OAAQjP,EAAOsD,KAAKkc,cAC9Clc,KAAK2L,QAAU,EACf3L,KAAK8d,yBACE9d,KAMX,WAAWtD,GAKP,OAJAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAM+B,SAASle,KAAK2L,OAAQjP,EAAOsD,KAAKkc,cAC7Clc,KAAK2L,QAAU,EACf3L,KAAK8d,yBACE9d,KAMX,YAAYtD,GAKR,OAJAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAMgC,UAAUne,KAAK2L,OAAQjP,EAAOsD,KAAKkc,cAC9Clc,KAAK2L,QAAU,EACf3L,KAAK8d,yBACE9d,KAMX,aAAatD,GAKT,OAJAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAMiC,WAAWpe,KAAK2L,OAAQjP,EAAOsD,KAAKkc,cAC/Clc,KAAK2L,QAAU,EACf3L,KAAK8d,yBACE9d,KAMX,aAAatD,GAKT,OAJAsD,KAAK4d,gBAAgB,GACrB5d,KAAKmc,MAAMkC,WAAWre,KAAK2L,OAAQjP,EAAOsD,KAAKkc,cAC/Clc,KAAK2L,QAAU,EACf3L,KAAK8d,yBACE9d,KAMX,UAAUse,GACN,OAAOte,KAAK2d,WAAWW,EAAIzf,WAAW,IAM1C,WAAWyf,GACP,IAAK,IAAI7iB,EAAI,EAAGA,EAAI6iB,EAAIhgB,OAAQ7C,IAC5BuE,KAAK2d,WAAWW,EAAIzf,WAAWpD,IAEnC,OAAOuE,KAMX,UAAUse,GACN,OAAOte,KAAKue,WD1Yb,SAAgBD,GACnB,OAAO,EAAQrgB,OAAOqgB,GCyYKrgB,CAAOqgB,IAOlC,UACI,OAAO,IAAI1f,WAAWoB,KAAKb,OAAQa,KAAKic,WAAYjc,KAAK6b,iBAM7D,yBACQ7b,KAAK2L,OAAS3L,KAAK6b,kBACnB7b,KAAK6b,gBAAkB7b,KAAK2L;wECvXxC,SAAS6S,EAAKC,GAAO,IAAIpgB,EAAMogB,EAAIngB,OAAQ,OAASD,GAAO,GAAKogB,EAAIpgB,GAAO,EAI3E,MA2DMqgB,EACJ,IAAI9f,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAEpE+f,EACJ,IAAI/f,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAE7EggB,EACJ,IAAIhgB,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAEhDigB,EACJ,IAAIjgB,WAAW,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAgBxDkgB,EAAgB,IAAIhI,MAAM,KAChC0H,EAAKM,GAOL,MAAMC,EAAgB,IAAIjI,MAAMkI,IAChCR,EAAKO,GAKL,MAAME,EAAgB,IAAInI,MAjBJ,KAkBtB0H,EAAKS,GAML,MAAMC,EAAgB,IAAIpI,MAAMqI,KAChCX,EAAKU,GAGL,MAAME,EAAgB,IAAItI,MAhGJ,IAiGtB0H,EAAKY,GAGL,MAAMC,EAAgB,IAAIvI,MA3FJ,IAgGtB,SAASwI,EAAeC,EAAaC,EAAYC,EAAYC,EAAOC,GAElE3f,KAAKuf,YAAeA,EACpBvf,KAAKwf,WAAeA,EACpBxf,KAAKyf,WAAeA,EACpBzf,KAAK0f,MAAeA,EACpB1f,KAAK2f,WAAeA,EAGpB3f,KAAK4f,UAAeL,GAAeA,EAAYjhB,OAIjD,IAAIuhB,EACAC,EACAC,EAGJ,SAASC,EAASC,EAAUC,GAC1BlgB,KAAKigB,SAAWA,EAChBjgB,KAAKmgB,SAAW,EAChBngB,KAAKkgB,UAAYA,EAzBnB1B,EAAKa,GA8BL,MAAMe,EAAUC,GAEPA,EAAO,IAAMpB,EAAWoB,GAAQpB,EAAW,KAAOoB,IAAS,IAQ9DC,EAAY,CAAC9iB,EAAGgD,KAGpBhD,EAAE+iB,YAAY/iB,EAAEgjB,WAAmB,IAAN,EAC7BhjB,EAAE+iB,YAAY/iB,EAAEgjB,WAAchgB,IAAM,EAAK,KAQrCigB,EAAY,CAACjjB,EAAGd,EAAO4B,KAEvBd,EAAEkjB,SAtIc,GAsISpiB,GAC3Bd,EAAEmjB,QAAWjkB,GAASc,EAAEkjB,SAAY,MACpCJ,EAAU9iB,EAAGA,EAAEmjB,QACfnjB,EAAEmjB,OAASjkB,GAzIO,GAyIcc,EAAEkjB,SAClCljB,EAAEkjB,UAAYpiB,EA1II,KA4IlBd,EAAEmjB,QAAWjkB,GAASc,EAAEkjB,SAAY,MACpCljB,EAAEkjB,UAAYpiB,IAKZsiB,EAAY,CAACpjB,EAAG1B,EAAG+kB,KAEvBJ,EAAUjjB,EAAGqjB,EAAS,EAAJ/kB,GAAiB+kB,EAAS,EAAJ/kB,EAAQ,KAS5CglB,EAAa,CAACC,EAAM1iB,KAExB,IAAI2iB,EAAM,EACV,GACEA,GAAc,EAAPD,EACPA,KAAU,EACVC,IAAQ,UACC3iB,EAAM,GACjB,OAAO2iB,IAAQ,GAiIXC,EAAY,CAACJ,EAAMV,EAAUe,KAKjC,MAAMC,EAAY,IAAIrK,MAAMsK,IAC5B,IACIC,EACAnkB,EAFA6jB,EAAO,EAOX,IAAKM,EAAO,EAAGA,GAtTK,GAsTaA,IAC/BF,EAAUE,GAAQN,EAAQA,EAAOG,EAASG,EAAO,IAAO,EAS1D,IAAKnkB,EAAI,EAAIA,GAAKijB,EAAUjjB,IAAK,CAC/B,IAAImB,EAAMwiB,EAAS,EAAJ3jB,EAAQ,GACX,IAARmB,IAEJwiB,EAAS,EAAJ3jB,GAAkB4jB,EAAWK,EAAU9iB,KAAQA,MAoHlDijB,EAAc9jB,IAElB,IAAIN,EAGJ,IAAKA,EAAI,EAAGA,EAzcQqkB,IAycMrkB,IAAOM,EAAEgkB,UAAc,EAAJtkB,GAAkB,EAC/D,IAAKA,EAAI,EAAGA,EAvcQ,GAucMA,IAAOM,EAAEikB,UAAc,EAAJvkB,GAAkB,EAC/D,IAAKA,EAAI,EAAGA,EArcQ,GAqcMA,IAAOM,EAAEkkB,QAAY,EAAJxkB,GAAkB,EAE7DM,EAAEgkB,UAAUG,KAA0B,EACtCnkB,EAAEokB,QAAUpkB,EAAEqkB,WAAa,EAC3BrkB,EAAEskB,SAAWtkB,EAAEukB,QAAU,GAOrBC,EAAaxkB,IAEbA,EAAEkjB,SAAW,EACfJ,EAAU9iB,EAAGA,EAAEmjB,QACNnjB,EAAEkjB,SAAW,IAEtBljB,EAAE+iB,YAAY/iB,EAAEgjB,WAAahjB,EAAEmjB,QAEjCnjB,EAAEmjB,OAAS,EACXnjB,EAAEkjB,SAAW,GA8BTuB,EAAU,CAACpB,EAAM3jB,EAAGrB,EAAGqmB,KAE3B,MAAMC,EAAU,EAAJjlB,EACNklB,EAAU,EAAJvmB,EACZ,OAAQglB,EAAKsB,GAAgBtB,EAAKuB,IAC1BvB,EAAKsB,KAAkBtB,EAAKuB,IAAiBF,EAAMhlB,IAAMglB,EAAMrmB,IASnEwmB,EAAa,CAAC7kB,EAAGqjB,EAAMld,KAK3B,MAAMS,EAAI5G,EAAE8kB,KAAK3e,GACjB,IAAI4U,EAAI5U,GAAK,EACb,KAAO4U,GAAK/a,EAAE+kB,WAERhK,EAAI/a,EAAE+kB,UACRN,EAAQpB,EAAMrjB,EAAE8kB,KAAK/J,EAAI,GAAI/a,EAAE8kB,KAAK/J,GAAI/a,EAAE0kB,QAC1C3J,KAGE0J,EAAQpB,EAAMzc,EAAG5G,EAAE8kB,KAAK/J,GAAI/a,EAAE0kB,SAGlC1kB,EAAE8kB,KAAK3e,GAAKnG,EAAE8kB,KAAK/J,GACnB5U,EAAI4U,EAGJA,IAAM,EAER/a,EAAE8kB,KAAK3e,GAAKS,GAURoe,EAAiB,CAAChlB,EAAGilB,EAAOC,KAKhC,IAAIrC,EACAja,EAEA2a,EACAjiB,EAFA6jB,EAAK,EAIT,GAAmB,IAAfnlB,EAAEskB,SACJ,GACEzB,EAAQ7iB,EAAE+iB,YAAY/iB,EAAEolB,MAAa,EAALD,IAAW,EAAMnlB,EAAE+iB,YAAY/iB,EAAEolB,MAAa,EAALD,EAAS,GAClFvc,EAAK5I,EAAE+iB,YAAY/iB,EAAEqlB,MAAQF,GAC7BA,IAEa,IAATtC,EACFO,EAAUpjB,EAAG4I,EAAIqc,IAIjB1B,EAAO7B,EAAa9Y,GACpBwa,EAAUpjB,EAAGujB,EAtkBC,IAskBiB,EAAG0B,GAClC3jB,EAAQ4f,EAAYqC,GACN,IAAVjiB,IACFsH,GAAMgZ,EAAY2B,GAClBN,EAAUjjB,EAAG4I,EAAItH,IAEnBuhB,IACAU,EAAOX,EAAOC,GAGdO,EAAUpjB,EAAGujB,EAAM2B,GACnB5jB,EAAQ6f,EAAYoC,GACN,IAAVjiB,IACFuhB,GAAQhB,EAAU0B,GAClBN,EAAUjjB,EAAG6iB,EAAMvhB,WAQhB6jB,EAAKnlB,EAAEskB,UAGlBlB,EAAUpjB,EAlkBQ,IAkkBMilB,IAYpBK,EAAa,CAACtlB,EAAGulB,KAIrB,MAAMlC,EAAWkC,EAAK9C,SAChB+C,EAAWD,EAAK7C,UAAUX,YAC1BK,EAAYmD,EAAK7C,UAAUN,UAC3BF,EAAWqD,EAAK7C,UAAUR,MAChC,IAAIxiB,EAAGrB,EAEHonB,EADA9C,GAAY,EAUhB,IAHA3iB,EAAE+kB,SAAW,EACb/kB,EAAE0lB,SAhnBkB,IAknBfhmB,EAAI,EAAGA,EAAIwiB,EAAOxiB,IACQ,IAAzB2jB,EAAS,EAAJ3jB,IACPM,EAAE8kB,OAAO9kB,EAAE+kB,UAAYpC,EAAWjjB,EAClCM,EAAE0kB,MAAMhlB,GAAK,GAGb2jB,EAAS,EAAJ3jB,EAAQ,GAAa,EAS9B,KAAOM,EAAE+kB,SAAW,GAClBU,EAAOzlB,EAAE8kB,OAAO9kB,EAAE+kB,UAAapC,EAAW,IAAMA,EAAW,EAC3DU,EAAY,EAAPoC,GAAqB,EAC1BzlB,EAAE0kB,MAAMe,GAAQ,EAChBzlB,EAAEokB,UAEEhC,IACFpiB,EAAEqkB,YAAcmB,EAAa,EAAPC,EAAW,IASrC,IALAF,EAAK5C,SAAWA,EAKXjjB,EAAKM,EAAE+kB,UAAY,EAAcrlB,GAAK,EAAGA,IAAOmlB,EAAW7kB,EAAGqjB,EAAM3jB,GAKzE+lB,EAAOvD,EACP,GAGExiB,EAAIM,EAAE8kB,KAAK,GACX9kB,EAAE8kB,KAAK,GAAiB9kB,EAAE8kB,KAAK9kB,EAAE+kB,YACjCF,EAAW7kB,EAAGqjB,EAAM,GAGpBhlB,EAAI2B,EAAE8kB,KAAK,GAEX9kB,EAAE8kB,OAAO9kB,EAAE0lB,UAAYhmB,EACvBM,EAAE8kB,OAAO9kB,EAAE0lB,UAAYrnB,EAGvBglB,EAAY,EAAPoC,GAAqBpC,EAAS,EAAJ3jB,GAAkB2jB,EAAS,EAAJhlB,GACtD2B,EAAE0kB,MAAMe,IAASzlB,EAAE0kB,MAAMhlB,IAAMM,EAAE0kB,MAAMrmB,GAAK2B,EAAE0kB,MAAMhlB,GAAKM,EAAE0kB,MAAMrmB,IAAM,EACvEglB,EAAS,EAAJ3jB,EAAQ,GAAa2jB,EAAS,EAAJhlB,EAAQ,GAAaonB,EAGpDzlB,EAAE8kB,KAAK,GAAiBW,IACxBZ,EAAW7kB,EAAGqjB,EAAM,SAEbrjB,EAAE+kB,UAAY,GAEvB/kB,EAAE8kB,OAAO9kB,EAAE0lB,UAAY1lB,EAAE8kB,KAAK,GApeb,EAAC9kB,EAAGulB,KAIrB,MAAMlC,EAAkBkC,EAAK9C,SACvBE,EAAkB4C,EAAK5C,SACvB6C,EAAkBD,EAAK7C,UAAUX,YACjCK,EAAkBmD,EAAK7C,UAAUN,UACjC9gB,EAAkBikB,EAAK7C,UAAUV,WACjC2D,EAAkBJ,EAAK7C,UAAUT,WACjCE,EAAkBoD,EAAK7C,UAAUP,WACvC,IAAI/b,EACA1G,EAAGrB,EACHwlB,EACA+B,EACA5e,EACA6e,EAAW,EAEf,IAAKhC,EAAO,EAAGA,GA1NK,GA0NaA,IAC/B7jB,EAAE0jB,SAASG,GAAQ,EAQrB,IAFAR,EAA0B,EAArBrjB,EAAE8kB,KAAK9kB,EAAE0lB,UAAgB,GAAa,EAEtCtf,EAAIpG,EAAE0lB,SAAW,EAAGtf,EAtOL,IAsOoBA,IACtC1G,EAAIM,EAAE8kB,KAAK1e,GACXyd,EAAOR,EAA+B,EAA1BA,EAAS,EAAJ3jB,EAAQ,GAAiB,GAAa,EACnDmkB,EAAO1B,IACT0B,EAAO1B,EACP0D,KAEFxC,EAAS,EAAJ3jB,EAAQ,GAAamkB,EAGtBnkB,EAAIijB,IAER3iB,EAAE0jB,SAASG,KACX+B,EAAQ,EACJlmB,GAAKimB,IACPC,EAAQtkB,EAAM5B,EAAIimB,IAEpB3e,EAAIqc,EAAS,EAAJ3jB,GACTM,EAAEokB,SAAWpd,GAAK6c,EAAO+B,GACrBxD,IACFpiB,EAAEqkB,YAAcrd,GAAKwe,EAAU,EAAJ9lB,EAAQ,GAAakmB,KAGpD,GAAiB,IAAbC,EAAJ,CAMA,EAAG,CAED,IADAhC,EAAO1B,EAAa,EACQ,IAArBniB,EAAE0jB,SAASG,IAAeA,IACjC7jB,EAAE0jB,SAASG,KACX7jB,EAAE0jB,SAASG,EAAO,IAAM,EACxB7jB,EAAE0jB,SAASvB,KAIX0D,GAAY,QACLA,EAAW,GAOpB,IAAKhC,EAAO1B,EAAqB,IAAT0B,EAAYA,IAElC,IADAnkB,EAAIM,EAAE0jB,SAASG,GACF,IAANnkB,GACLrB,EAAI2B,EAAE8kB,OAAO1e,GACT/H,EAAIskB,IACJU,EAAS,EAAJhlB,EAAQ,KAAewlB,IAE9B7jB,EAAEokB,UAAYP,EAAOR,EAAS,EAAJhlB,EAAQ,IAAcglB,EAAS,EAAJhlB,GACrDglB,EAAS,EAAJhlB,EAAQ,GAAawlB,GAE5BnkB,OAsZJomB,CAAW9lB,EAAGulB,GAGd9B,EAAUJ,EAAMV,EAAU3iB,EAAE0jB,WAQxBqC,EAAY,CAAC/lB,EAAGqjB,EAAMV,KAK1B,IAAIjjB,EAEAsmB,EADAC,GAAW,EAGXC,EAAU7C,EAAK,GAEf8C,EAAQ,EACRC,EAAY,EACZC,EAAY,EAQhB,IANgB,IAAZH,IACFE,EAAY,IACZC,EAAY,GAEdhD,EAAsB,GAAhBV,EAAW,GAAS,GAAa,MAElCjjB,EAAI,EAAGA,GAAKijB,EAAUjjB,IACzBsmB,EAASE,EACTA,EAAU7C,EAAe,GAAT3jB,EAAI,GAAS,KAEvBymB,EAAQC,GAAaJ,IAAWE,IAG3BC,EAAQE,EACjBrmB,EAAEkkB,QAAiB,EAAT8B,IAAwBG,EAEd,IAAXH,GAELA,IAAWC,GAAWjmB,EAAEkkB,QAAiB,EAAT8B,KACpChmB,EAAEkkB,QAAQoC,OAEDH,GAAS,GAClBnmB,EAAEkkB,QAAQqC,MAGVvmB,EAAEkkB,QAAQsC,MAGZL,EAAQ,EACRF,EAAUD,EAEM,IAAZE,GACFE,EAAY,IACZC,EAAY,GAEHL,IAAWE,GACpBE,EAAY,EACZC,EAAY,IAGZD,EAAY,EACZC,EAAY,KAUZI,EAAY,CAACzmB,EAAGqjB,EAAMV,KAK1B,IAAIjjB,EAEAsmB,EADAC,GAAW,EAGXC,EAAU7C,EAAK,GAEf8C,EAAQ,EACRC,EAAY,EACZC,EAAY,EAQhB,IALgB,IAAZH,IACFE,EAAY,IACZC,EAAY,GAGT3mB,EAAI,EAAGA,GAAKijB,EAAUjjB,IAIzB,GAHAsmB,EAASE,EACTA,EAAU7C,EAAe,GAAT3jB,EAAI,GAAS,OAEvBymB,EAAQC,GAAaJ,IAAWE,GAAtC,CAGO,GAAIC,EAAQE,EACjB,GAAKjD,EAAUpjB,EAAGgmB,EAAQhmB,EAAEkkB,eAA+B,KAAViC,QAE7B,IAAXH,GACLA,IAAWC,IACb7C,EAAUpjB,EAAGgmB,EAAQhmB,EAAEkkB,SACvBiC,KAGF/C,EAAUpjB,EAlxBI,GAkxBQA,EAAEkkB,SACxBjB,EAAUjjB,EAAGmmB,EAAQ,EAAG,IAEfA,GAAS,IAClB/C,EAAUpjB,EAnxBI,GAmxBUA,EAAEkkB,SAC1BjB,EAAUjjB,EAAGmmB,EAAQ,EAAG,KAGxB/C,EAAUpjB,EApxBI,GAoxBYA,EAAEkkB,SAC5BjB,EAAUjjB,EAAGmmB,EAAQ,GAAI,IAG3BA,EAAQ,EACRF,EAAUD,EACM,IAAZE,GACFE,EAAY,IACZC,EAAY,GAEHL,IAAWE,GACpBE,EAAY,EACZC,EAAY,IAGZD,EAAY,EACZC,EAAY,KAwHlB,IAAIK,GAAmB,EAKvB,MAuBMC,GAAmB,CAAC3mB,EAAGihB,EAAK2F,EAAYC,KAM5C5D,EAAUjjB,EAAG,GAAuB6mB,EAAO,EAAI,GAAI,GA3flC,EAAC7mB,EAAGihB,EAAKpgB,EAAKimB,KAM/BtC,EAAUxkB,GAEN8mB,IACFhE,EAAU9iB,EAAGa,GACbiiB,EAAU9iB,GAAIa,IAKhBb,EAAE+iB,YAAYvhB,IAAIxB,EAAEsC,OAAOykB,SAAS9F,EAAKA,EAAMpgB,GAAMb,EAAEgjB,SACvDhjB,EAAEgjB,SAAWniB,GA4ebmmB,CAAWhnB,EAAGihB,EAAK2F,GAAY,IAoKjC,IAMIK,GAAQ,CACXC,SAzMiBlnB,IAGX0mB,IA5mBgB,MAErB,IAAIhnB,EACAmkB,EACA/iB,EACAyiB,EACAV,EACJ,MAAMa,EAAW,IAAIpK,MAAMsK,IAiB3B,IADA9iB,EAAS,EACJyiB,EAAO,EAAGA,EAAO4D,GAAkB5D,IAEtC,IADA3B,EAAY2B,GAAQziB,EACfpB,EAAI,EAAGA,EAAK,GAAKwhB,EAAYqC,GAAQ7jB,IACxCgiB,EAAa5gB,KAAYyiB,EAY7B,IAJA7B,EAAa5gB,EAAS,GAAKyiB,EAG3BV,EAAO,EACFU,EAAO,EAAGA,EAAO,GAAIA,IAExB,IADA1B,EAAU0B,GAAQV,EACbnjB,EAAI,EAAGA,EAAK,GAAKyhB,EAAYoC,GAAQ7jB,IACxC+hB,EAAWoB,KAAUU,EAKzB,IADAV,IAAS,EACFU,EAvYa,GAuYGA,IAErB,IADA1B,EAAU0B,GAAQV,GAAQ,EACrBnjB,EAAI,EAAGA,EAAK,GAAMyhB,EAAYoC,GAAQ,EAAK7jB,IAC9C+hB,EAAW,IAAMoB,KAAUU,EAM/B,IAAKM,EAAO,EAAGA,GAvYK,GAuYaA,IAC/BH,EAASG,GAAQ,EAInB,IADAnkB,EAAI,EACGA,GAAK,KACV4hB,EAAiB,EAAJ5hB,EAAQ,GAAa,EAClCA,IACAgkB,EAAS,KAEX,KAAOhkB,GAAK,KACV4hB,EAAiB,EAAJ5hB,EAAQ,GAAa,EAClCA,IACAgkB,EAAS,KAEX,KAAOhkB,GAAK,KACV4hB,EAAiB,EAAJ5hB,EAAQ,GAAa,EAClCA,IACAgkB,EAAS,KAEX,KAAOhkB,GAAK,KACV4hB,EAAiB,EAAJ5hB,EAAQ,GAAa,EAClCA,IACAgkB,EAAS,KASX,IAHAD,EAAUnC,EAAc8F,IAAa1D,GAGhChkB,EAAI,EAAGA,EAhbQ,GAgbKA,IACvB6hB,EAAiB,EAAJ7hB,EAAQ,GAAa,EAClC6hB,EAAiB,EAAJ7hB,GAAkB4jB,EAAW5jB,EAAG,GAI/C2iB,EAAgB,IAAIP,EAAeR,EAAcJ,EAAa6C,IAzb1CA,IAYA,IA8apBzB,EAAgB,IAAIR,EAAeP,EAAcJ,EAAa,EAvb1C,GASA,IA+apBoB,EAAiB,IAAIT,EAAe,IAAIxI,MAAM,GAAI8H,EAAc,EArb5C,GAiBF,IAi7BhBiG,GACAX,GAAmB,GAGrB1mB,EAAEsnB,OAAU,IAAI9E,EAASxiB,EAAEgkB,UAAW3B,GACtCriB,EAAEunB,OAAU,IAAI/E,EAASxiB,EAAEikB,UAAW3B,GACtCtiB,EAAEwnB,QAAU,IAAIhF,EAASxiB,EAAEkkB,QAAS3B,GAEpCviB,EAAEmjB,OAAS,EACXnjB,EAAEkjB,SAAW,EAGbY,EAAW9jB,IA0LZ2mB,iBAPwBA,GAQxBc,gBA1JuB,CAACznB,EAAGihB,EAAK2F,EAAYC,KAM3C,IAAIa,EAAUC,EACVC,EAAc,EAGd5nB,EAAE6nB,MAAQ,GA5hCc,IA+hCtB7nB,EAAE8nB,KAAKC,YACT/nB,EAAE8nB,KAAKC,UArGY,CAAC/nB,IAKxB,IACIN,EADAsoB,EAAa,WAIjB,IAAKtoB,EAAI,EAAGA,GAAK,GAAIA,IAAKsoB,KAAgB,EACxC,GAAkB,EAAbA,GAAoD,IAAhChoB,EAAEgkB,UAAc,EAAJtkB,GACnC,OAz8BwB,EA88B5B,GAAoC,IAAhCM,EAAEgkB,UAAU,KAA0D,IAAjChkB,EAAEgkB,UAAU,KAChB,IAAjChkB,EAAEgkB,UAAU,IACd,OA/8B0B,EAi9B5B,IAAKtkB,EAAI,GAAIA,EAr7BO,IAq7BOA,IACzB,GAAoC,IAAhCM,EAAEgkB,UAAc,EAAJtkB,GACd,OAn9BwB,EA09B5B,OA39B4B,GAmiCLuoB,CAAiBjoB,IAItCslB,EAAWtlB,EAAGA,EAAEsnB,QAIhBhC,EAAWtlB,EAAGA,EAAEunB,QAUhBK,EApMkB,CAAC5nB,IAErB,IAAI4nB,EAgBJ,IAbA7B,EAAU/lB,EAAGA,EAAEgkB,UAAWhkB,EAAEsnB,OAAO3E,UACnCoD,EAAU/lB,EAAGA,EAAEikB,UAAWjkB,EAAEunB,OAAO5E,UAGnC2C,EAAWtlB,EAAGA,EAAEwnB,SASXI,EAAcM,GAAcN,GAAe,GACW,IAArD5nB,EAAEkkB,QAAgC,EAAxB7C,EAASuG,GAAmB,GADOA,KAUnD,OAJA5nB,EAAEokB,SAAW,GAAKwD,EAAc,GAAK,EAAI,EAAI,EAItCA,GAwKSO,CAAcnoB,GAG5B0nB,EAAY1nB,EAAEokB,QAAU,EAAI,IAAO,EACnCuD,EAAe3nB,EAAEqkB,WAAa,EAAI,IAAO,EAMrCsD,GAAeD,IAAYA,EAAWC,IAI1CD,EAAWC,EAAcf,EAAa,EAGnCA,EAAa,GAAKc,IAAuB,IAATzG,EASnC0F,GAAiB3mB,EAAGihB,EAAK2F,EAAYC,GAnlCX,IAqlCjB7mB,EAAEooB,UAAwBT,IAAgBD,GAEnDzE,EAAUjjB,EAAG,GAAuB6mB,EAAO,EAAI,GAAI,GACnD7B,EAAehlB,EAAGshB,EAAcC,KAGhC0B,EAAUjjB,EAAG,GAAoB6mB,EAAO,EAAI,GAAI,GAjM7B,EAAC7mB,EAAGqoB,EAAQC,EAAQC,KAIzC,IAAIC,EASJ,IAHAvF,EAAUjjB,EAAGqoB,EAAS,IAAK,GAC3BpF,EAAUjjB,EAAGsoB,EAAS,EAAK,GAC3BrF,EAAUjjB,EAAGuoB,EAAU,EAAI,GACtBC,EAAO,EAAGA,EAAOD,EAASC,IAE7BvF,EAAUjjB,EAAGA,EAAEkkB,QAAyB,EAAjB7C,EAASmH,GAAY,GAAY,GAI1D/B,EAAUzmB,EAAGA,EAAEgkB,UAAWqE,EAAS,GAGnC5B,EAAUzmB,EAAGA,EAAEikB,UAAWqE,EAAS,IA4KjCG,CAAezoB,EAAGA,EAAEsnB,OAAO3E,SAAW,EAAG3iB,EAAEunB,OAAO5E,SAAW,EAAGiF,EAAc,GAC9E5C,EAAehlB,EAAGA,EAAEgkB,UAAWhkB,EAAEikB,YAMnCH,EAAW9jB,GAEP6mB,GACFrC,EAAUxkB,IA8Eb0oB,UApEiB,CAAC1oB,EAAG6iB,EAAMja,KAO1B5I,EAAE+iB,YAAY/iB,EAAEolB,MAAqB,EAAbplB,EAAEskB,UAAqBzB,IAAS,EAAK,IAC7D7iB,EAAE+iB,YAAY/iB,EAAEolB,MAAqB,EAAbplB,EAAEskB,SAAe,GAAY,IAAPzB,EAE9C7iB,EAAE+iB,YAAY/iB,EAAEqlB,MAAQrlB,EAAEskB,UAAiB,IAAL1b,EACtC5I,EAAEskB,WAEW,IAATzB,EAEF7iB,EAAEgkB,UAAe,EAALpb,MAEZ5I,EAAEukB,UAEF1B,IAKA7iB,EAAEgkB,UAA8C,GAAnCtC,EAAa9Y,GAvmCR,IAumCyB,MAC3C5I,EAAEikB,UAAyB,EAAfrB,EAAOC,OA0Bb7iB,EAAEskB,WAAatkB,EAAE2oB,YAAc,GAkBxCC,UAvKkB5oB,IACjBijB,EAAUjjB,EAAG6oB,EAAmB,GAChCzF,EAAUpjB,EAl9BQ,IAk9BMshB,GAjzBT,CAACthB,IAEG,KAAfA,EAAEkjB,UACJJ,EAAU9iB,EAAGA,EAAEmjB,QACfnjB,EAAEmjB,OAAS,EACXnjB,EAAEkjB,SAAW,GAEJljB,EAAEkjB,UAAY,IACvBljB,EAAE+iB,YAAY/iB,EAAEgjB,WAAwB,IAAXhjB,EAAEmjB,OAC/BnjB,EAAEmjB,SAAW,EACbnjB,EAAEkjB,UAAY,IAwyBhB4F,CAAS9oB,KAuNX,IAAI+oB,GAzBY,CAACC,EAAO/H,EAAKpgB,EAAKD,KAChC,IAAIqoB,EAAc,MAARD,EAAiB,EACvBE,EAAOF,IAAU,GAAM,MAAS,EAChCtpB,EAAI,EAER,KAAe,IAARmB,GAAW,CAIhBnB,EAAImB,EAAM,IAAO,IAAOA,EACxBA,GAAOnB,EAEP,GACEupB,EAAMA,EAAKhI,EAAIrgB,KAAS,EACxBsoB,EAAMA,EAAKD,EAAK,UACPvpB,GAEXupB,GAAM,MACNC,GAAM,MAGR,OAAQD,EAAMC,GAAM,GAAM,GA8B5B,MAeMC,GAAW,IAAIC,YAfH,MAChB,IAAI9qB,EAAG+qB,EAAQ,GAEf,IAAK,IAAI3pB,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC5BpB,EAAIoB,EACJ,IAAK,IAAIyG,EAAI,EAAGA,EAAI,EAAGA,IACrB7H,EAAU,EAAJA,EAAU,WAAcA,IAAM,EAAOA,IAAM,EAEnD+qB,EAAM3pB,GAAKpB,EAGb,OAAO+qB,GAIwBC,IAiBjC,IAAIC,GAdU,CAACC,EAAKvI,EAAKpgB,EAAKD,KAC5B,MAAMzB,EAAIgqB,GACJM,EAAM7oB,EAAMC,EAElB2oB,IAAQ,EAER,IAAK,IAAIvrB,EAAI2C,EAAK3C,EAAIwrB,EAAKxrB,IACzBurB,EAAOA,IAAQ,EAAKrqB,EAAmB,KAAhBqqB,EAAMvI,EAAIhjB,KAGnC,OAAgB,EAARurB,GAyBNE,GAAW,CACbC,EAAQ,kBACRC,EAAQ,aACRC,EAAQ,GACR,KAAQ,aACR,KAAQ,eACR,KAAQ,aACR,KAAQ,sBACR,KAAQ,eACR,KAAQ,wBAsBNC,GAAY,CAGdC,WAAoB,EACpBC,gBAAoB,EACpBC,aAAoB,EACpBC,aAAoB,EACpBC,SAAoB,EACpBC,QAAoB,EACpBC,QAAoB,EAKpBC,KAAoB,EACpBC,aAAoB,EACpBC,YAAoB,EACpBC,SAAoB,EACpBC,gBAAoB,EACpBC,cAAoB,EACpBC,aAAoB,EACpBC,aAAoB,EAIpBC,iBAA0B,EAC1BC,aAA0B,EAC1BC,mBAA0B,EAC1BC,uBAA0B,EAG1BC,WAA0B,EAC1BC,eAA0B,EAC1BC,MAA0B,EAC1BC,QAA0B,EAC1BC,mBAA0B,EAG1BC,SAA0B,EAC1BC,OAA0B,EAE1BC,UAA0B,EAG1BC,WAA0B,GAuB5B,MAAQxE,SAAUyE,GAAYhF,iBAAkBiF,GAAoBnE,gBAAiBoE,GAAmBnD,UAAWoD,GAAalD,UAAWmD,IAAgB9E,IAQrJ,WACJ8C,GAAU,gBAAEC,GAAe,aAAEE,GAAY,SAAEC,GAAQ,QAAEC,GAAO,KAC5DE,GAAI,aAAEC,GAAY,eAAEG,GAAc,aAAEC,GAAY,YAAEE,GAAW,sBAC7DI,GAAqB,WACrBC,GAAU,eAAEC,GAAc,MAAEC,GAAOC,QAASW,GAAS,mBAAEV,GACvDG,UAAWQ,GAAW,WACtBP,IACE5B,GAgDEoC,GAAM,CAACpE,EAAMqE,KACjBrE,EAAKsE,IAAM1C,GAASyC,GACbA,GAGH3D,GAAQxhB,IACJ,GAAO,IAAM,EAAM,EAAI,EAAI,GAG/BqlB,GAAUpL,IACd,IAAIpgB,EAAMogB,EAAIngB,OAAQ,OAASD,GAAO,GAAKogB,EAAIpgB,GAAO,GAKxD,IAIIyrB,GAJY,CAACtsB,EAAGusB,EAAMze,KAAWye,GAAQvsB,EAAEwsB,WAAc1e,GAAQ9N,EAAEysB,UAYvE,MAAMC,GAAiB5E,IACrB,MAAM9nB,EAAI8nB,EAAK6E,MAGf,IAAI9rB,EAAMb,EAAEgjB,QACRniB,EAAMinB,EAAK8E,YACb/rB,EAAMinB,EAAK8E,WAED,IAAR/rB,IAEJinB,EAAK+E,OAAOrrB,IAAIxB,EAAE+iB,YAAYgE,SAAS/mB,EAAE8sB,YAAa9sB,EAAE8sB,YAAcjsB,GAAMinB,EAAKiF,UACjFjF,EAAKiF,UAAYlsB,EACjBb,EAAE8sB,aAAejsB,EACjBinB,EAAKkF,WAAansB,EAClBinB,EAAK8E,WAAa/rB,EAClBb,EAAEgjB,SAAWniB,EACK,IAAdb,EAAEgjB,UACJhjB,EAAE8sB,YAAc,KAKdG,GAAmB,CAACjtB,EAAG6mB,KAC3BgF,GAAkB7rB,EAAIA,EAAEktB,aAAe,EAAIltB,EAAEktB,aAAe,EAAIltB,EAAEmtB,SAAWntB,EAAEktB,YAAarG,GAC5F7mB,EAAEktB,YAAcltB,EAAEmtB,SAClBT,GAAc1sB,EAAE8nB,OAIZsF,GAAW,CAACptB,EAAGwE,KACnBxE,EAAE+iB,YAAY/iB,EAAEgjB,WAAaxe,GASzB6oB,GAAc,CAACrtB,EAAGwE,KAItBxE,EAAE+iB,YAAY/iB,EAAEgjB,WAAcxe,IAAM,EAAK,IACzCxE,EAAE+iB,YAAY/iB,EAAEgjB,WAAiB,IAAJxe,GAWzB8oB,GAAW,CAACxF,EAAM7G,EAAKsM,EAAOjjB,KAElC,IAAIzJ,EAAMinB,EAAK0F,SAGf,OADI3sB,EAAMyJ,IAAQzJ,EAAMyJ,GACZ,IAARzJ,EAAoB,GAExBinB,EAAK0F,UAAY3sB,EAGjBogB,EAAIzf,IAAIsmB,EAAK7K,MAAM8J,SAASe,EAAK2F,QAAS3F,EAAK2F,QAAU5sB,GAAM0sB,GACvC,IAApBzF,EAAK6E,MAAMe,KACb5F,EAAKkB,MAAQD,GAAUjB,EAAKkB,MAAO/H,EAAKpgB,EAAK0sB,GAGlB,IAApBzF,EAAK6E,MAAMe,OAClB5F,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAO/H,EAAKpgB,EAAK0sB,IAG7CzF,EAAK2F,SAAW5sB,EAChBinB,EAAK6F,UAAY9sB,EAEVA,IAaH+sB,GAAgB,CAAC5tB,EAAG6tB,KAExB,IAEIC,EACAjtB,EAHAktB,EAAe/tB,EAAEguB,iBACjBC,EAAOjuB,EAAEmtB,SAGTe,EAAWluB,EAAEmuB,YACbC,EAAapuB,EAAEouB,WACnB,MAAMC,EAASruB,EAAEmtB,SAAYntB,EAAEsuB,OAhJX,IAiJhBtuB,EAAEmtB,UAAYntB,EAAEsuB,OAjJA,KAiJ0B,EAExCC,EAAOvuB,EAAEsC,OAETksB,EAAQxuB,EAAEyuB,OACVlC,EAAQvsB,EAAEusB,KAMVmC,EAAS1uB,EAAEmtB,SA7JC,IA8JlB,IAAIwB,EAAaJ,EAAKN,EAAOC,EAAW,GACpCU,EAAaL,EAAKN,EAAOC,GAQzBluB,EAAEmuB,aAAenuB,EAAE6uB,aACrBd,IAAiB,GAKfK,EAAapuB,EAAE8uB,YAAaV,EAAapuB,EAAE8uB,WAI/C,GAaE,GAXAhB,EAAQD,EAWJU,EAAKT,EAAQI,KAAkBU,GAC/BL,EAAKT,EAAQI,EAAW,KAAOS,GAC/BJ,EAAKT,KAA0BS,EAAKN,IACpCM,IAAOT,KAAwBS,EAAKN,EAAO,GAH/C,CAaAA,GAAQ,EACRH,IAMA,UAESS,IAAON,KAAUM,IAAOT,IAAUS,IAAON,KAAUM,IAAOT,IAC1DS,IAAON,KAAUM,IAAOT,IAAUS,IAAON,KAAUM,IAAOT,IAC1DS,IAAON,KAAUM,IAAOT,IAAUS,IAAON,KAAUM,IAAOT,IAC1DS,IAAON,KAAUM,IAAOT,IAAUS,IAAON,KAAUM,IAAOT,IAC1DG,EAAOS,GAOhB,GAHA7tB,EA5NgB,KA4NK6tB,EAAST,GAC9BA,EAAOS,EA7NS,IA+NZ7tB,EAAMqtB,EAAU,CAGlB,GAFAluB,EAAE+uB,YAAclB,EAChBK,EAAWrtB,EACPA,GAAOutB,EACT,MAEFO,EAAaJ,EAAKN,EAAOC,EAAW,GACpCU,EAAaL,EAAKN,EAAOC,YAEnBL,EAAYtB,EAAKsB,EAAYW,IAAUH,GAA4B,KAAjBN,GAE5D,OAAIG,GAAYluB,EAAE8uB,UACTZ,EAEFluB,EAAE8uB,WAcLE,GAAehvB,IAEnB,MAAMivB,EAAUjvB,EAAEsuB,OAClB,IAAIvuB,EAAGL,EAAGrB,EAAG6wB,EAAMpO,EAInB,EAAG,CAqBD,GApBAoO,EAAOlvB,EAAEmvB,YAAcnvB,EAAE8uB,UAAY9uB,EAAEmtB,SAoBnCntB,EAAEmtB,UAAY8B,GAAWA,EAtRX,KAsRqC,CAErDjvB,EAAEsC,OAAOd,IAAIxB,EAAEsC,OAAOykB,SAASkI,EAASA,EAAUA,GAAU,GAC5DjvB,EAAE+uB,aAAeE,EACjBjvB,EAAEmtB,UAAY8B,EAEdjvB,EAAEktB,aAAe+B,EASjBvvB,EAAIM,EAAEovB,UACNrvB,EAAIL,EAEJ,GACErB,EAAI2B,EAAEqvB,OAAOtvB,GACbC,EAAEqvB,KAAKtvB,GAAM1B,GAAK4wB,EAAU5wB,EAAI4wB,EAAU,UACjCvvB,GAEXA,EAAIuvB,EACJlvB,EAAIL,EAEJ,GACErB,EAAI2B,EAAEusB,OAAOxsB,GACbC,EAAEusB,KAAKxsB,GAAM1B,GAAK4wB,EAAU5wB,EAAI4wB,EAAU,UAIjCvvB,GAEXwvB,GAAQD,EAEV,GAAwB,IAApBjvB,EAAE8nB,KAAK0F,SACT,MAmBF,GAJA9tB,EAAI4tB,GAASttB,EAAE8nB,KAAM9nB,EAAEsC,OAAQtC,EAAEmtB,SAAWntB,EAAE8uB,UAAWI,GACzDlvB,EAAE8uB,WAAapvB,EAGXM,EAAE8uB,UAAY9uB,EAAEsvB,QAhVJ,EAyVd,IARAxO,EAAM9gB,EAAEmtB,SAAWntB,EAAEsvB,OACrBtvB,EAAEuvB,MAAQvvB,EAAEsC,OAAOwe,GAGnB9gB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOwe,EAAM,IAInC9gB,EAAEsvB,SAEPtvB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOwe,EA3VxB,EA2V4C,IAExD9gB,EAAEusB,KAAKzL,EAAM9gB,EAAEyuB,QAAUzuB,EAAEqvB,KAAKrvB,EAAEuvB,OAClCvvB,EAAEqvB,KAAKrvB,EAAEuvB,OAASzO,EAClBA,IACA9gB,EAAEsvB,WACEtvB,EAAE8uB,UAAY9uB,EAAEsvB,OAjWR,aA0WTtvB,EAAE8uB,UAxWS,KAwWwC,IAApB9uB,EAAE8nB,KAAK0F,WAoJ3CgC,GAAe,CAACxvB,EAAGyvB,KAEvB,IAAIC,EACAC,EAEJ,OAAS,CAMP,GAAI3vB,EAAE8uB,UAvgBY,IAugBe,CAE/B,GADAE,GAAYhvB,GACRA,EAAE8uB,UAzgBU,KAygBmBW,IAAU1F,GAC3C,OA9fkB,EAggBpB,GAAoB,IAAhB/pB,EAAE8uB,UACJ,MA2BJ,GApBAY,EAAY,EACR1vB,EAAE8uB,WAvhBU,IAyhBd9uB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOtC,EAAEmtB,SAzhBxB,EAyhBiD,IAC/DuC,EAAY1vB,EAAEusB,KAAKvsB,EAAEmtB,SAAWntB,EAAEyuB,QAAUzuB,EAAEqvB,KAAKrvB,EAAEuvB,OACrDvvB,EAAEqvB,KAAKrvB,EAAEuvB,OAASvvB,EAAEmtB,UAOJ,IAAduC,GAA4B1vB,EAAEmtB,SAAWuC,GAAe1vB,EAAEsuB,OAhiB5C,MAqiBhBtuB,EAAE4vB,aAAehC,GAAc5tB,EAAG0vB,IAGhC1vB,EAAE4vB,cA1iBU,EAsjBd,GAPAD,EAAS7D,GAAY9rB,EAAGA,EAAEmtB,SAAWntB,EAAE+uB,YAAa/uB,EAAE4vB,aA/iBxC,GAijBd5vB,EAAE8uB,WAAa9uB,EAAE4vB,aAKb5vB,EAAE4vB,cAAgB5vB,EAAE6vB,gBAAuC7vB,EAAE8uB,WAtjBnD,EAsjB6E,CACzF9uB,EAAE4vB,eACF,GACE5vB,EAAEmtB,WAEFntB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOtC,EAAEmtB,SA3jB5B,EA2jBqD,IAC/DuC,EAAY1vB,EAAEusB,KAAKvsB,EAAEmtB,SAAWntB,EAAEyuB,QAAUzuB,EAAEqvB,KAAKrvB,EAAEuvB,OACrDvvB,EAAEqvB,KAAKrvB,EAAEuvB,OAASvvB,EAAEmtB,eAKQ,KAAnBntB,EAAE4vB,cACb5vB,EAAEmtB,gBAGFntB,EAAEmtB,UAAYntB,EAAE4vB,aAChB5vB,EAAE4vB,aAAe,EACjB5vB,EAAEuvB,MAAQvvB,EAAEsC,OAAOtC,EAAEmtB,UAErBntB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOtC,EAAEmtB,SAAW,SAanDwC,EAAS7D,GAAY9rB,EAAG,EAAGA,EAAEsC,OAAOtC,EAAEmtB,WAEtCntB,EAAE8uB,YACF9uB,EAAEmtB,WAEJ,GAAIwC,IAEF1C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WACT,OAllBkB,EAwlBxB,OADA5sB,EAAEsvB,OAAWtvB,EAAEmtB,SAAW,EAAqBntB,EAAEmtB,SAAW2C,EACxDL,IAAUtF,IAEZ8C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,UAzlBW,EACA,GA8lBpB5sB,EAAEskB,WAEJ2I,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WApmBW,EACA,GAgnBpBmD,GAAe,CAAC/vB,EAAGyvB,KAEvB,IAAIC,EACAC,EAEAK,EAGJ,OAAS,CAMP,GAAIhwB,EAAE8uB,UA3oBY,IA2oBe,CAE/B,GADAE,GAAYhvB,GACRA,EAAE8uB,UA7oBU,KA6oBmBW,IAAU1F,GAC3C,OAloBkB,EAooBpB,GAAoB,IAAhB/pB,EAAE8uB,UAAmB,MA0C3B,GApCAY,EAAY,EACR1vB,EAAE8uB,WAzpBU,IA2pBd9uB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOtC,EAAEmtB,SA3pBxB,EA2pBiD,IAC/DuC,EAAY1vB,EAAEusB,KAAKvsB,EAAEmtB,SAAWntB,EAAEyuB,QAAUzuB,EAAEqvB,KAAKrvB,EAAEuvB,OACrDvvB,EAAEqvB,KAAKrvB,EAAEuvB,OAASvvB,EAAEmtB,UAMtBntB,EAAEmuB,YAAcnuB,EAAE4vB,aAClB5vB,EAAEiwB,WAAajwB,EAAE+uB,YACjB/uB,EAAE4vB,aAAeE,EAEC,IAAdJ,GAA0B1vB,EAAEmuB,YAAcnuB,EAAE6vB,gBAC5C7vB,EAAEmtB,SAAWuC,GAAc1vB,EAAEsuB,OAtqBf,MA2qBhBtuB,EAAE4vB,aAAehC,GAAc5tB,EAAG0vB,GAG9B1vB,EAAE4vB,cAAgB,IAClB5vB,EAAEooB,WAAa8C,IAjrBL,IAirBoBlrB,EAAE4vB,cAAgC5vB,EAAEmtB,SAAWntB,EAAE+uB,YAAc,QAK/F/uB,EAAE4vB,aAAeE,IAMjB9vB,EAAEmuB,aA5rBU,GA4rBoBnuB,EAAE4vB,cAAgB5vB,EAAEmuB,YAAa,CACnE6B,EAAahwB,EAAEmtB,SAAWntB,EAAE8uB,UA7rBd,EAosBda,EAAS7D,GAAY9rB,EAAGA,EAAEmtB,SAAW,EAAIntB,EAAEiwB,WAAYjwB,EAAEmuB,YApsB3C,GA0sBdnuB,EAAE8uB,WAAa9uB,EAAEmuB,YAAc,EAC/BnuB,EAAEmuB,aAAe,EACjB,KACQnuB,EAAEmtB,UAAY6C,IAElBhwB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOtC,EAAEmtB,SA/sB5B,EA+sBqD,IAC/DuC,EAAY1vB,EAAEusB,KAAKvsB,EAAEmtB,SAAWntB,EAAEyuB,QAAUzuB,EAAEqvB,KAAKrvB,EAAEuvB,OACrDvvB,EAAEqvB,KAAKrvB,EAAEuvB,OAASvvB,EAAEmtB,gBAGK,KAAlBntB,EAAEmuB,aAKb,GAJAnuB,EAAEkwB,gBAAkB,EACpBlwB,EAAE4vB,aAAeE,EACjB9vB,EAAEmtB,WAEEwC,IAEF1C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WACT,OA/sBgB,OAotBf,GAAI5sB,EAAEkwB,iBAgBX,GATAP,EAAS7D,GAAY9rB,EAAG,EAAGA,EAAEsC,OAAOtC,EAAEmtB,SAAW,IAE7CwC,GAEF1C,GAAiBjtB,GAAG,GAGtBA,EAAEmtB,WACFntB,EAAE8uB,YACuB,IAArB9uB,EAAE8nB,KAAK8E,UACT,OAruBkB,OA2uBpB5sB,EAAEkwB,gBAAkB,EACpBlwB,EAAEmtB,WACFntB,EAAE8uB,YAYN,OARI9uB,EAAEkwB,kBAGJP,EAAS7D,GAAY9rB,EAAG,EAAGA,EAAEsC,OAAOtC,EAAEmtB,SAAW,IAEjDntB,EAAEkwB,gBAAkB,GAEtBlwB,EAAEsvB,OAAStvB,EAAEmtB,SAAW2C,EAAkB9vB,EAAEmtB,SAAW2C,EACnDL,IAAUtF,IAEZ8C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,UA1vBW,EACA,GA+vBpB5sB,EAAEskB,WAEJ2I,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WArwBW,EACA,GA66B1B,SAASuD,GAAOC,EAAaC,EAAUC,EAAaC,EAAWC,GAE7DhuB,KAAK4tB,YAAcA,EACnB5tB,KAAK6tB,SAAWA,EAChB7tB,KAAK8tB,YAAcA,EACnB9tB,KAAK+tB,UAAYA,EACjB/tB,KAAKguB,KAAOA,EAGd,MAAMC,GAAsB,CAE1B,IAAIN,GAAO,EAAG,EAAG,EAAG,EA5iBC,CAACnwB,EAAGyvB,KAKzB,IAAIiB,EAAiB,MAOrB,IALIA,EAAiB1wB,EAAE2wB,iBAAmB,IACxCD,EAAiB1wB,EAAE2wB,iBAAmB,KAI/B,CAEP,GAAI3wB,EAAE8uB,WAAa,EAAG,CAUpB,GADAE,GAAYhvB,GACQ,IAAhBA,EAAE8uB,WAAmBW,IAAU1F,GACjC,OAtakB,EAyapB,GAAoB,IAAhB/pB,EAAE8uB,UACJ,MAOJ9uB,EAAEmtB,UAAYntB,EAAE8uB,UAChB9uB,EAAE8uB,UAAY,EAGd,MAAM8B,EAAY5wB,EAAEktB,YAAcwD,EAElC,IAAmB,IAAf1wB,EAAEmtB,UAAkBntB,EAAEmtB,UAAYyD,KAEpC5wB,EAAE8uB,UAAY9uB,EAAEmtB,SAAWyD,EAC3B5wB,EAAEmtB,SAAWyD,EAEb3D,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WACT,OA9bkB,EAuctB,GAAI5sB,EAAEmtB,SAAWntB,EAAEktB,aAAgBltB,EAAEsuB,OAndnB,MAqdhBrB,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WACT,OA3ckB,EAmdxB,OAFA5sB,EAAEsvB,OAAS,EAEPG,IAAUtF,IAEZ8C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,UApdW,EACA,IA0dpB5sB,EAAEmtB,SAAWntB,EAAEktB,cAEjBD,GAAiBjtB,GAAG,GAChBA,EAAE8nB,KAAK8E,WAheW,KA07BxB,IAAIuD,GAAO,EAAG,EAAG,EAAG,EAAGX,IACvB,IAAIW,GAAO,EAAG,EAAG,GAAI,EAAGX,IACxB,IAAIW,GAAO,EAAG,EAAG,GAAI,GAAIX,IAEzB,IAAIW,GAAO,EAAG,EAAG,GAAI,GAAIJ,IACzB,IAAII,GAAO,EAAG,GAAI,GAAI,GAAIJ,IAC1B,IAAII,GAAO,EAAG,GAAI,IAAK,IAAKJ,IAC5B,IAAII,GAAO,EAAG,GAAI,IAAK,IAAKJ,IAC5B,IAAII,GAAO,GAAI,IAAK,IAAK,KAAMJ,IAC/B,IAAII,GAAO,GAAI,IAAK,IAAK,KAAMJ,KA+BjC,SAASc,KACPruB,KAAKslB,KAAO,KACZtlB,KAAKsuB,OAAS,EACdtuB,KAAKugB,YAAc,KACnBvgB,KAAKmuB,iBAAmB,EACxBnuB,KAAKsqB,YAAc,EACnBtqB,KAAKwgB,QAAU,EACfxgB,KAAKkrB,KAAO,EACZlrB,KAAKuuB,OAAS,KACdvuB,KAAKwuB,QAAU,EACfxuB,KAAKyuB,OAASvF,GACdlpB,KAAK0uB,YAAc,EAEnB1uB,KAAK8rB,OAAS,EACd9rB,KAAK2uB,OAAS,EACd3uB,KAAKisB,OAAS,EAEdjsB,KAAKF,OAAS,KAQdE,KAAK2sB,YAAc,EAKnB3sB,KAAK+pB,KAAO,KAMZ/pB,KAAK6sB,KAAO,KAEZ7sB,KAAK+sB,MAAQ,EACb/sB,KAAK4sB,UAAY,EACjB5sB,KAAK4uB,UAAY,EACjB5uB,KAAKiqB,UAAY,EAEjBjqB,KAAKgqB,WAAa,EAOlBhqB,KAAK0qB,YAAc,EAKnB1qB,KAAKotB,aAAe,EACpBptB,KAAKytB,WAAa,EAClBztB,KAAK0tB,gBAAkB,EACvB1tB,KAAK2qB,SAAW,EAChB3qB,KAAKusB,YAAc,EACnBvsB,KAAKssB,UAAY,EAEjBtsB,KAAK2rB,YAAc,EAKnB3rB,KAAKwrB,iBAAmB,EAMxBxrB,KAAKqtB,eAAiB,EAYtBrtB,KAAKqlB,MAAQ,EACbrlB,KAAK4lB,SAAW,EAEhB5lB,KAAKqsB,WAAa,EAGlBrsB,KAAK4rB,WAAa,EAYlB5rB,KAAKwhB,UAAa,IAAIqN,YAAYC,MAClC9uB,KAAKyhB,UAAa,IAAIoN,YAAY,KAClC7uB,KAAK0hB,QAAa,IAAImN,YAAY,IAClChF,GAAO7pB,KAAKwhB,WACZqI,GAAO7pB,KAAKyhB,WACZoI,GAAO7pB,KAAK0hB,SAEZ1hB,KAAK8kB,OAAW,KAChB9kB,KAAK+kB,OAAW,KAChB/kB,KAAKglB,QAAW,KAGhBhlB,KAAKkhB,SAAW,IAAI2N,YAAYE,IAIhC/uB,KAAKsiB,KAAO,IAAIuM,YAAY,KAC5BhF,GAAO7pB,KAAKsiB,MAEZtiB,KAAKuiB,SAAW,EAChBviB,KAAKkjB,SAAW,EAKhBljB,KAAKkiB,MAAQ,IAAI2M,YAAY,KAC7BhF,GAAO7pB,KAAKkiB,OAIZliB,KAAK6iB,MAAQ,EAEb7iB,KAAKmmB,YAAc,EAoBnBnmB,KAAK8hB,SAAW,EAEhB9hB,KAAK4iB,MAAQ,EAMb5iB,KAAK4hB,QAAU,EACf5hB,KAAK6hB,WAAa,EAClB7hB,KAAK+hB,QAAU,EACf/hB,KAAK8sB,OAAS,EAGd9sB,KAAK2gB,OAAS,EAId3gB,KAAK0gB,SAAW,EAgBlB,MAAMsO,GAAoB1J,IAExB,IAAKA,IAASA,EAAK6E,MACjB,OAAOT,GAAIpE,EAAM4C,IAGnB5C,EAAK6F,SAAW7F,EAAKkF,UAAY,EACjClF,EAAKC,UAAYkE,GAEjB,MAAMjsB,EAAI8nB,EAAK6E,MAef,OAdA3sB,EAAEgjB,QAAU,EACZhjB,EAAE8sB,YAAc,EAEZ9sB,EAAE0tB,KAAO,IACX1tB,EAAE0tB,MAAQ1tB,EAAE0tB,MAGd1tB,EAAE8wB,OAAU9wB,EAAE0tB,KAxrCG,GAKA,IAorCjB5F,EAAKkB,MAAoB,IAAXhpB,EAAE0tB,KACd,EAEA,EACF1tB,EAAEkxB,WAAanH,GACf4B,GAAW3rB,GACJsqB,IAIHmH,GAAgB3J,IAEpB,MAAM4J,EAAMF,GAAiB1J,GAI7B,OAHI4J,IAAQpH,IApPE,CAACtqB,IAEfA,EAAEmvB,YAAc,EAAInvB,EAAEsuB,OAGtBjC,GAAOrsB,EAAEqvB,MAITrvB,EAAE6vB,eAAiBY,GAAoBzwB,EAAE6nB,OAAOwI,SAChDrwB,EAAE6uB,WAAa4B,GAAoBzwB,EAAE6nB,OAAOuI,YAC5CpwB,EAAEouB,WAAaqC,GAAoBzwB,EAAE6nB,OAAOyI,YAC5CtwB,EAAEguB,iBAAmByC,GAAoBzwB,EAAE6nB,OAAO0I,UAElDvwB,EAAEmtB,SAAW,EACbntB,EAAEktB,YAAc,EAChBltB,EAAE8uB,UAAY,EACd9uB,EAAEsvB,OAAS,EACXtvB,EAAE4vB,aAAe5vB,EAAEmuB,YAAc2B,EACjC9vB,EAAEkwB,gBAAkB,EACpBlwB,EAAEuvB,MAAQ,GAiORoC,CAAQ7J,EAAK6E,OAER+E,GAaHE,GAAe,CAAC9J,EAAMD,EAAOoJ,EAAQY,EAAYC,EAAU1J,KAE/D,IAAKN,EACH,OAAO4C,GAET,IAAIgD,EAAO,EAiBX,GAfI7F,IAAUoD,KACZpD,EAAQ,GAGNgK,EAAa,GACfnE,EAAO,EACPmE,GAAcA,GAGPA,EAAa,KACpBnE,EAAO,EACPmE,GAAc,IAIZC,EAAW,GAAKA,EAxwCA,GAwwC4Bb,IAAWvF,IACzDmG,EAAa,GAAKA,EAAa,IAAMhK,EAAQ,GAAKA,EAAQ,GAC1DO,EAAW,GAAKA,EAAW4D,GAC3B,OAAOE,GAAIpE,EAAM4C,IAIA,IAAfmH,IACFA,EAAa,GAIf,MAAM7xB,EAAI,IAAI6wB,GA0Cd,OAxCA/I,EAAK6E,MAAQ3sB,EACbA,EAAE8nB,KAAOA,EAET9nB,EAAE0tB,KAAOA,EACT1tB,EAAE+wB,OAAS,KACX/wB,EAAEmxB,OAASU,EACX7xB,EAAEsuB,OAAS,GAAKtuB,EAAEmxB,OAClBnxB,EAAEyuB,OAASzuB,EAAEsuB,OAAS,EAEtBtuB,EAAEoxB,UAAYU,EAAW,EACzB9xB,EAAEovB,UAAY,GAAKpvB,EAAEoxB,UACrBpxB,EAAEysB,UAAYzsB,EAAEovB,UAAY,EAC5BpvB,EAAEwsB,eAAiBxsB,EAAEoxB,UA5wCH,EA4wC6B,GA5wC7B,GA8wClBpxB,EAAEsC,OAAS,IAAIlB,WAAsB,EAAXpB,EAAEsuB,QAC5BtuB,EAAEqvB,KAAO,IAAIgC,YAAYrxB,EAAEovB,WAC3BpvB,EAAEusB,KAAO,IAAI8E,YAAYrxB,EAAEsuB,QAK3BtuB,EAAE2oB,YAAc,GAAMmJ,EAAW,EAEjC9xB,EAAE2wB,iBAAmC,EAAhB3wB,EAAE2oB,YAIvB3oB,EAAE+iB,YAAc,IAAI3hB,WAAWpB,EAAE2wB,kBAIjC3wB,EAAEolB,MAAQ,EAAIplB,EAAE2oB,YAGhB3oB,EAAEqlB,MAAQ,EAAUrlB,EAAE2oB,YAEtB3oB,EAAE6nB,MAAQA,EACV7nB,EAAEooB,SAAWA,EACbpoB,EAAEixB,OAASA,EAEJQ,GAAa3J,IAictB,IAmBIiK,GAAY,CACfC,YAldmB,CAAClK,EAAMD,IAElB+J,GAAa9J,EAAMD,EAAO6D,GAj0CjB,GAEI,EA+zCmDJ,IAidxEsG,aApBoBA,GAqBpBH,aApBoBA,GAqBpBD,iBApBwBA,GAqBxBS,iBA9iBwB,CAACnK,EAAMuH,IAEzBvH,GAASA,EAAK6E,MACK,IAApB7E,EAAK6E,MAAMe,KAAqBhD,IACpC5C,EAAK6E,MAAMoE,OAAS1B,EACb/E,IAH4BI,GA6iBpCwH,QAjde,CAACpK,EAAM2H,KAErB,IAAI0C,EAAKC,EAET,IAAKtK,IAASA,EAAK6E,OACjB8C,EAAQrF,IAAWqF,EAAQ,EAC3B,OAAO3H,EAAOoE,GAAIpE,EAAM4C,IAAkBA,GAG5C,MAAM1qB,EAAI8nB,EAAK6E,MAEf,IAAK7E,EAAK+E,SACJ/E,EAAK7K,OAA2B,IAAlB6K,EAAK0F,UAjzCN,MAkzCdxtB,EAAE8wB,QAA2BrB,IAAUtF,GAC1C,OAAO+B,GAAIpE,EAA0B,IAAnBA,EAAK8E,UAAmB/B,GAAcH,IAG1D1qB,EAAE8nB,KAAOA,EACT,MAAMuK,EAAYryB,EAAEkxB,WAIpB,GAHAlxB,EAAEkxB,WAAazB,EA9zCE,KAi0CbzvB,EAAE8wB,OAEJ,GAAe,IAAX9wB,EAAE0tB,KACJ5F,EAAKkB,MAAQ,EACboE,GAASptB,EAAG,IACZotB,GAASptB,EAAG,KACZotB,GAASptB,EAAG,GACPA,EAAE+wB,QAaL3D,GAASptB,GAAIA,EAAE+wB,OAAOuB,KAAO,EAAI,IACpBtyB,EAAE+wB,OAAOwB,KAAO,EAAI,IACnBvyB,EAAE+wB,OAAOzvB,MAAY,EAAJ,IACjBtB,EAAE+wB,OAAOvyB,KAAW,EAAJ,IAChBwB,EAAE+wB,OAAOyB,QAAc,GAAJ,IAEjCpF,GAASptB,EAAmB,IAAhBA,EAAE+wB,OAAO0B,MACrBrF,GAASptB,EAAIA,EAAE+wB,OAAO0B,MAAQ,EAAK,KACnCrF,GAASptB,EAAIA,EAAE+wB,OAAO0B,MAAQ,GAAM,KACpCrF,GAASptB,EAAIA,EAAE+wB,OAAO0B,MAAQ,GAAM,KACpCrF,GAASptB,EAAe,IAAZA,EAAE6nB,MAAc,EACf7nB,EAAEooB,UAAY+C,IAAkBnrB,EAAE6nB,MAAQ,EAC1C,EAAI,GACjBuF,GAASptB,EAAiB,IAAdA,EAAE+wB,OAAO2B,IACjB1yB,EAAE+wB,OAAOzvB,OAAStB,EAAE+wB,OAAOzvB,MAAMR,SACnCssB,GAASptB,EAA2B,IAAxBA,EAAE+wB,OAAOzvB,MAAMR,QAC3BssB,GAASptB,EAAIA,EAAE+wB,OAAOzvB,MAAMR,QAAU,EAAK,MAEzCd,EAAE+wB,OAAOwB,OACXzK,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAOhpB,EAAE+iB,YAAa/iB,EAAEgjB,QAAS,IAE7DhjB,EAAEgxB,QAAU,EACZhxB,EAAE8wB,OA12CU,KAw0CZ1D,GAASptB,EAAG,GACZotB,GAASptB,EAAG,GACZotB,GAASptB,EAAG,GACZotB,GAASptB,EAAG,GACZotB,GAASptB,EAAG,GACZotB,GAASptB,EAAe,IAAZA,EAAE6nB,MAAc,EACf7nB,EAAEooB,UAAY+C,IAAkBnrB,EAAE6nB,MAAQ,EAC1C,EAAI,GACjBuF,GAASptB,EAp0CD,GAq0CRA,EAAE8wB,OA70CS,SA02Cf,CACE,IAAIhK,EAAU4E,IAAe1rB,EAAEmxB,OAAS,GAAM,IAAO,EACjDwB,GAAe,EAGjBA,EADE3yB,EAAEooB,UAAY+C,IAAkBnrB,EAAE6nB,MAAQ,EAC9B,EACL7nB,EAAE6nB,MAAQ,EACL,EACO,IAAZ7nB,EAAE6nB,MACG,EAEA,EAEhBf,GAAW6L,GAAe,EACP,IAAf3yB,EAAEmtB,WAAkBrG,GA/3CV,IAg4CdA,GAAU,GAAMA,EAAS,GAEzB9mB,EAAE8wB,OA33CW,IA43CbzD,GAAYrtB,EAAG8mB,GAGI,IAAf9mB,EAAEmtB,WACJE,GAAYrtB,EAAG8nB,EAAKkB,QAAU,IAC9BqE,GAAYrtB,EAAgB,MAAb8nB,EAAKkB,QAEtBlB,EAAKkB,MAAQ,EAKjB,GA54CkB,KA44CdhpB,EAAE8wB,OACJ,GAAI9wB,EAAE+wB,OAAOzvB,MAAqB,CAGhC,IAFA6wB,EAAMnyB,EAAEgjB,QAEDhjB,EAAEgxB,SAAmC,MAAxBhxB,EAAE+wB,OAAOzvB,MAAMR,UAC7Bd,EAAEgjB,UAAYhjB,EAAE2wB,mBACd3wB,EAAE+wB,OAAOwB,MAAQvyB,EAAEgjB,QAAUmP,IAC/BrK,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAOhpB,EAAE+iB,YAAa/iB,EAAEgjB,QAAUmP,EAAKA,IAEnEzF,GAAc5E,GACdqK,EAAMnyB,EAAEgjB,QACJhjB,EAAEgjB,UAAYhjB,EAAE2wB,oBAItBvD,GAASptB,EAA+B,IAA5BA,EAAE+wB,OAAOzvB,MAAMtB,EAAEgxB,UAC7BhxB,EAAEgxB,UAEAhxB,EAAE+wB,OAAOwB,MAAQvyB,EAAEgjB,QAAUmP,IAC/BrK,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAOhpB,EAAE+iB,YAAa/iB,EAAEgjB,QAAUmP,EAAKA,IAE/DnyB,EAAEgxB,UAAYhxB,EAAE+wB,OAAOzvB,MAAMR,SAC/Bd,EAAEgxB,QAAU,EACZhxB,EAAE8wB,OAl6CS,SAs6Cb9wB,EAAE8wB,OAt6CW,GAy6CjB,GAz6CiB,KAy6Cb9wB,EAAE8wB,OACJ,GAAI9wB,EAAE+wB,OAAOvyB,KAAoB,CAC/B2zB,EAAMnyB,EAAEgjB,QAGR,EAAG,CACD,GAAIhjB,EAAEgjB,UAAYhjB,EAAE2wB,mBACd3wB,EAAE+wB,OAAOwB,MAAQvyB,EAAEgjB,QAAUmP,IAC/BrK,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAOhpB,EAAE+iB,YAAa/iB,EAAEgjB,QAAUmP,EAAKA,IAEnEzF,GAAc5E,GACdqK,EAAMnyB,EAAEgjB,QACJhjB,EAAEgjB,UAAYhjB,EAAE2wB,kBAAkB,CACpCyB,EAAM,EACN,MAKFA,EADEpyB,EAAEgxB,QAAUhxB,EAAE+wB,OAAOvyB,KAAKsC,OACkB,IAAxCd,EAAE+wB,OAAOvyB,KAAK6C,WAAWrB,EAAEgxB,WAE3B,EAER5D,GAASptB,EAAGoyB,SACG,IAARA,GAELpyB,EAAE+wB,OAAOwB,MAAQvyB,EAAEgjB,QAAUmP,IAC/BrK,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAOhpB,EAAE+iB,YAAa/iB,EAAEgjB,QAAUmP,EAAKA,IAEvD,IAARC,IACFpyB,EAAEgxB,QAAU,EACZhxB,EAAE8wB,OAv8CY,SA28ChB9wB,EAAE8wB,OA38Cc,GA88CpB,GA98CoB,KA88ChB9wB,EAAE8wB,OACJ,GAAI9wB,EAAE+wB,OAAOyB,QAAuB,CAClCL,EAAMnyB,EAAEgjB,QAGR,EAAG,CACD,GAAIhjB,EAAEgjB,UAAYhjB,EAAE2wB,mBACd3wB,EAAE+wB,OAAOwB,MAAQvyB,EAAEgjB,QAAUmP,IAC/BrK,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAOhpB,EAAE+iB,YAAa/iB,EAAEgjB,QAAUmP,EAAKA,IAEnEzF,GAAc5E,GACdqK,EAAMnyB,EAAEgjB,QACJhjB,EAAEgjB,UAAYhjB,EAAE2wB,kBAAkB,CACpCyB,EAAM,EACN,MAKFA,EADEpyB,EAAEgxB,QAAUhxB,EAAE+wB,OAAOyB,QAAQ1xB,OACkB,IAA3Cd,EAAE+wB,OAAOyB,QAAQnxB,WAAWrB,EAAEgxB,WAE9B,EAER5D,GAASptB,EAAGoyB,SACG,IAARA,GAELpyB,EAAE+wB,OAAOwB,MAAQvyB,EAAEgjB,QAAUmP,IAC/BrK,EAAKkB,MAAQO,GAAQzB,EAAKkB,MAAOhpB,EAAE+iB,YAAa/iB,EAAEgjB,QAAUmP,EAAKA,IAEvD,IAARC,IACFpyB,EAAE8wB,OA3+CS,UA++Cb9wB,EAAE8wB,OA/+CW,IAqgDjB,GArgDiB,MAk/Cb9wB,EAAE8wB,SACA9wB,EAAE+wB,OAAOwB,MACPvyB,EAAEgjB,QAAU,EAAIhjB,EAAE2wB,kBACpBjE,GAAc5E,GAEZ9nB,EAAEgjB,QAAU,GAAKhjB,EAAE2wB,mBACrBvD,GAASptB,EAAgB,IAAb8nB,EAAKkB,OACjBoE,GAASptB,EAAI8nB,EAAKkB,OAAS,EAAK,KAChClB,EAAKkB,MAAQ,EACbhpB,EAAE8wB,OA1/CS,MA8/Cb9wB,EAAE8wB,OA9/CW,KAogDC,IAAd9wB,EAAEgjB,SAEJ,GADA0J,GAAc5E,GACS,IAAnBA,EAAK8E,UAQP,OADA5sB,EAAEkxB,YAAc,EACT5G,QAOJ,GAAsB,IAAlBxC,EAAK0F,UAAkBhF,GAAKiH,IAAUjH,GAAK6J,IACpD5C,IAAUtF,GACV,OAAO+B,GAAIpE,EAAM+C,IAInB,GA1hDmB,MA0hDf7qB,EAAE8wB,QAA6C,IAAlBhJ,EAAK0F,SACpC,OAAOtB,GAAIpE,EAAM+C,IAKnB,GAAsB,IAAlB/C,EAAK0F,UAAkC,IAAhBxtB,EAAE8uB,WAC1BW,IAAU1F,IAjiDM,MAiiDQ/pB,EAAE8wB,OAA0B,CACrD,IAAI8B,EAAU5yB,EAAEooB,WAAa+C,GA5qBZ,EAACnrB,EAAGyvB,KAEvB,IAAIE,EAEJ,OAAS,CAEP,GAAoB,IAAhB3vB,EAAE8uB,YACJE,GAAYhvB,GACQ,IAAhBA,EAAE8uB,WAAiB,CACrB,GAAIW,IAAU1F,GACZ,OA93BgB,EAg4BlB,MAWJ,GANA/pB,EAAE4vB,aAAe,EAGjBD,EAAS7D,GAAY9rB,EAAG,EAAGA,EAAEsC,OAAOtC,EAAEmtB,WACtCntB,EAAE8uB,YACF9uB,EAAEmtB,WACEwC,IAEF1C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WACT,OA/4BkB,EAq5BxB,OADA5sB,EAAEsvB,OAAS,EACPG,IAAUtF,IAEZ8C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,UAt5BW,EACA,GA25BpB5sB,EAAEskB,WAEJ2I,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WAj6BW,EACA,GA+hDyBiG,CAAa7yB,EAAGyvB,GAC5DzvB,EAAEooB,WAAagD,GA7wBF,EAACprB,EAAGyvB,KAEtB,IAAIE,EACApD,EACA0B,EAAMS,EAEV,MAAMH,EAAOvuB,EAAEsC,OAEf,OAAS,CAKP,GAAItC,EAAE8uB,WA9yBU,IA8yBgB,CAE9B,GADAE,GAAYhvB,GACRA,EAAE8uB,WAhzBQ,KAgzBoBW,IAAU1F,GAC1C,OApyBkB,EAsyBpB,GAAoB,IAAhB/pB,EAAE8uB,UAAmB,MAK3B,GADA9uB,EAAE4vB,aAAe,EACb5vB,EAAE8uB,WAzzBU,GAyzBkB9uB,EAAEmtB,SAAW,IAC7Cc,EAAOjuB,EAAEmtB,SAAW,EACpBZ,EAAOgC,EAAKN,GACR1B,IAASgC,IAAON,IAAS1B,IAASgC,IAAON,IAAS1B,IAASgC,IAAON,IAAO,CAC3ES,EAAS1uB,EAAEmtB,SA5zBC,IA6zBZ,UAESZ,IAASgC,IAAON,IAAS1B,IAASgC,IAAON,IACzC1B,IAASgC,IAAON,IAAS1B,IAASgC,IAAON,IACzC1B,IAASgC,IAAON,IAAS1B,IAASgC,IAAON,IACzC1B,IAASgC,IAAON,IAAS1B,IAASgC,IAAON,IACzCA,EAAOS,GAChB1uB,EAAE4vB,aAp0BU,KAo0BoBlB,EAAST,GACrCjuB,EAAE4vB,aAAe5vB,EAAE8uB,YACrB9uB,EAAE4vB,aAAe5vB,EAAE8uB,WAyBzB,GAlBI9uB,EAAE4vB,cA90BU,GAk1BdD,EAAS7D,GAAY9rB,EAAG,EAAGA,EAAE4vB,aAl1Bf,GAo1Bd5vB,EAAE8uB,WAAa9uB,EAAE4vB,aACjB5vB,EAAEmtB,UAAYntB,EAAE4vB,aAChB5vB,EAAE4vB,aAAe,IAKjBD,EAAS7D,GAAY9rB,EAAG,EAAGA,EAAEsC,OAAOtC,EAAEmtB,WAEtCntB,EAAE8uB,YACF9uB,EAAEmtB,YAEAwC,IAEF1C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WACT,OAt1BkB,EA41BxB,OADA5sB,EAAEsvB,OAAS,EACPG,IAAUtF,IAEZ8C,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,UA71BW,EACA,GAk2BpB5sB,EAAEskB,WAEJ2I,GAAiBjtB,GAAG,GACK,IAArBA,EAAE8nB,KAAK8E,WAx2BW,EACA,GAgiDIkG,CAAY9yB,EAAGyvB,GACrCgB,GAAoBzwB,EAAE6nB,OAAO2I,KAAKxwB,EAAGyvB,GAKzC,GAriDsB,IAkiDlBmD,GAjiDkB,IAiiDcA,IAClC5yB,EAAE8wB,OAviDa,KAEK,IAuiDlB8B,GAriDkB,IAqiDSA,EAK7B,OAJuB,IAAnB9K,EAAK8E,YACP5sB,EAAEkxB,YAAc,GAGX5G,GAST,GApjDsB,IAojDlBsI,IACEnD,IAAUzF,GACZ+B,GAAY/rB,GAELyvB,IAAUrF,KAEjBwB,GAAmB5rB,EAAG,EAAG,GAAG,GAIxByvB,IAAUvF,KAEZmC,GAAOrsB,EAAEqvB,MAEW,IAAhBrvB,EAAE8uB,YACJ9uB,EAAEmtB,SAAW,EACbntB,EAAEktB,YAAc,EAChBltB,EAAEsvB,OAAS,KAIjB5C,GAAc5E,GACS,IAAnBA,EAAK8E,WAEP,OADA5sB,EAAEkxB,YAAc,EACT5G,GAOb,OAAImF,IAAUtF,GAAmBG,GAC7BtqB,EAAE0tB,MAAQ,EAAYnD,IAGX,IAAXvqB,EAAE0tB,MACJN,GAASptB,EAAgB,IAAb8nB,EAAKkB,OACjBoE,GAASptB,EAAI8nB,EAAKkB,OAAS,EAAK,KAChCoE,GAASptB,EAAI8nB,EAAKkB,OAAS,GAAM,KACjCoE,GAASptB,EAAI8nB,EAAKkB,OAAS,GAAM,KACjCoE,GAASptB,EAAmB,IAAhB8nB,EAAK6F,UACjBP,GAASptB,EAAI8nB,EAAK6F,UAAY,EAAK,KACnCP,GAASptB,EAAI8nB,EAAK6F,UAAY,GAAM,KACpCP,GAASptB,EAAI8nB,EAAK6F,UAAY,GAAM,OAIpCN,GAAYrtB,EAAG8nB,EAAKkB,QAAU,IAC9BqE,GAAYrtB,EAAgB,MAAb8nB,EAAKkB,QAGtB0D,GAAc5E,GAIV9nB,EAAE0tB,KAAO,IAAK1tB,EAAE0tB,MAAQ1tB,EAAE0tB,MAET,IAAd1tB,EAAEgjB,QAAgBsH,GAAOC,KAuIjCwI,WAnImBjL,IAElB,IAAKA,IAAsBA,EAAK6E,MAC9B,OAAOjC,GAGT,MAAMoG,EAAShJ,EAAK6E,MAAMmE,OAC1B,OAjoDiB,KAioDbA,GAhoDc,KAioDhBA,GAhoDe,KAioDfA,GAhoDkB,KAioDlBA,GAhoDe,MAioDfA,GAhoDe,MAioDfA,GAhoDiB,MAioDjBA,EAEO5E,GAAIpE,EAAM4C,KAGnB5C,EAAK6E,MAAQ,KAvoDI,MAyoDVmE,EAAwB5E,GAAIpE,EAAM6C,IAAgBL,KAgH1D0I,qBAxG4B,CAAClL,EAAMmL,KAElC,IAAIC,EAAaD,EAAWnyB,OAE5B,IAAKgnB,IAAsBA,EAAK6E,MAC9B,OAAOjC,GAGT,MAAM1qB,EAAI8nB,EAAK6E,MACTe,EAAO1tB,EAAE0tB,KAEf,GAAa,IAATA,GAAwB,IAATA,GAjqDF,KAiqDgB1tB,EAAE8wB,QAA0B9wB,EAAE8uB,UAC7D,OAAOpE,GAYT,GARa,IAATgD,IAEF5F,EAAKkB,MAAQD,GAAUjB,EAAKkB,MAAOiK,EAAYC,EAAY,IAG7DlzB,EAAE0tB,KAAO,EAGLwF,GAAclzB,EAAEsuB,OAAQ,CACb,IAATZ,IAEFrB,GAAOrsB,EAAEqvB,MACTrvB,EAAEmtB,SAAW,EACbntB,EAAEktB,YAAc,EAChBltB,EAAEsvB,OAAS,GAIb,IAAI6D,EAAU,IAAI/xB,WAAWpB,EAAEsuB,QAC/B6E,EAAQ3xB,IAAIyxB,EAAWlM,SAASmM,EAAalzB,EAAEsuB,OAAQ4E,GAAa,GACpED,EAAaE,EACbD,EAAalzB,EAAEsuB,OAGjB,MAAM8E,EAAQtL,EAAK0F,SACb6F,EAAOvL,EAAK2F,QACZxQ,EAAQ6K,EAAK7K,MAKnB,IAJA6K,EAAK0F,SAAW0F,EAChBpL,EAAK2F,QAAU,EACf3F,EAAK7K,MAAQgW,EACbjE,GAAYhvB,GACLA,EAAE8uB,WA3sDS,GA2sDiB,CACjC,IAAIhO,EAAM9gB,EAAEmtB,SACRztB,EAAIM,EAAE8uB,UAAY,EACtB,GAEE9uB,EAAEuvB,MAAQjD,GAAKtsB,EAAGA,EAAEuvB,MAAOvvB,EAAEsC,OAAOwe,EAhtDtB,EAgtD0C,IAExD9gB,EAAEusB,KAAKzL,EAAM9gB,EAAEyuB,QAAUzuB,EAAEqvB,KAAKrvB,EAAEuvB,OAElCvvB,EAAEqvB,KAAKrvB,EAAEuvB,OAASzO,EAClBA,YACSphB,GACXM,EAAEmtB,SAAWrM,EACb9gB,EAAE8uB,UAAYgB,EACdd,GAAYhvB,GAYd,OAVAA,EAAEmtB,UAAYntB,EAAE8uB,UAChB9uB,EAAEktB,YAAcltB,EAAEmtB,SAClBntB,EAAEsvB,OAAStvB,EAAE8uB,UACb9uB,EAAE8uB,UAAY,EACd9uB,EAAE4vB,aAAe5vB,EAAEmuB,YAAc2B,EACjC9vB,EAAEkwB,gBAAkB,EACpBpI,EAAK2F,QAAU4F,EACfvL,EAAK7K,MAAQA,EACb6K,EAAK0F,SAAW4F,EAChBpzB,EAAE0tB,KAAOA,EACFpD,IAgCRgJ,YApBiB,sCAuBlB,MAAMC,GAAO,CAACC,EAAKh0B,IACVb,OAAOkB,UAAUC,eAAe1B,KAAKo1B,EAAKh0B,GAGnD,IA0CIi0B,GA1CS,SAAUD,GACrB,MAAME,EAAUpa,MAAMzZ,UAAU4B,MAAMrD,KAAKu1B,UAAW,GACtD,KAAOD,EAAQ5yB,QAAQ,CACrB,MAAM8yB,EAASF,EAAQG,QACvB,GAAKD,EAAL,CAEA,GAAsB,iBAAXA,EACT,MAAM,IAAIE,UAAUF,EAAS,sBAG/B,IAAK,MAAM7zB,KAAK6zB,EACVL,GAAKK,EAAQ7zB,KACfyzB,EAAIzzB,GAAK6zB,EAAO7zB,KAKtB,OAAOyzB,GAyBLC,GApBiBM,IAEnB,IAAIlzB,EAAM,EAEV,IAAK,IAAI5C,EAAI,EAAGC,EAAI61B,EAAOjzB,OAAQ7C,EAAIC,EAAGD,IACxC4C,GAAOkzB,EAAO91B,GAAG6C,OAInB,MAAMkf,EAAS,IAAI5e,WAAWP,GAE9B,IAAK,IAAI5C,EAAI,EAAG2C,EAAM,EAAG1C,EAAI61B,EAAOjzB,OAAQ7C,EAAIC,EAAGD,IAAK,CACtD,IAAI+1B,EAAQD,EAAO91B,GACnB+hB,EAAOxe,IAAIwyB,EAAOpzB,GAClBA,GAAOozB,EAAMlzB,OAGf,OAAOkf,GAgBT,IAAIiU,IAAmB,EAEvB,IAAM9xB,OAAOC,aAAaC,MAAM,KAAM,IAAIjB,WAAW,IAAO,MAAO8yB,GAAMD,IAAmB,EAM5F,MAAME,GAAW,IAAI/yB,WAAW,KAChC,IAAK,IAAI6F,EAAI,EAAGA,EAAI,IAAKA,IACvBktB,GAASltB,GAAMA,GAAK,IAAM,EAAIA,GAAK,IAAM,EAAIA,GAAK,IAAM,EAAIA,GAAK,IAAM,EAAIA,GAAK,IAAM,EAAI,EAE5FktB,GAAS,KAAOA,GAAS,KAAO,EA6EhC,IAoEIC,GA7IctT,IAChB,IAAIG,EAAK3iB,EAAG+1B,EAAIC,EAAOr2B,EAAGs2B,EAAUzT,EAAIhgB,OAAQ0zB,EAAU,EAG1D,IAAKF,EAAQ,EAAGA,EAAQC,EAASD,IAC/Bh2B,EAAIwiB,EAAIzf,WAAWizB,GACE,QAAZ,MAAJh2B,IAA2Bg2B,EAAQ,EAAIC,IAC1CF,EAAKvT,EAAIzf,WAAWizB,EAAQ,GACN,QAAZ,MAALD,KACH/1B,EAAI,OAAYA,EAAI,OAAW,KAAO+1B,EAAK,OAC3CC,MAGJE,GAAWl2B,EAAI,IAAO,EAAIA,EAAI,KAAQ,EAAIA,EAAI,MAAU,EAAI,EAO9D,IAHA2iB,EAAM,IAAI7f,WAAWozB,GAGhBv2B,EAAI,EAAGq2B,EAAQ,EAAGr2B,EAAIu2B,EAASF,IAClCh2B,EAAIwiB,EAAIzf,WAAWizB,GACE,QAAZ,MAAJh2B,IAA2Bg2B,EAAQ,EAAIC,IAC1CF,EAAKvT,EAAIzf,WAAWizB,EAAQ,GACN,QAAZ,MAALD,KACH/1B,EAAI,OAAYA,EAAI,OAAW,KAAO+1B,EAAK,OAC3CC,MAGAh2B,EAAI,IAEN2iB,EAAIhjB,KAAOK,EACFA,EAAI,MAEb2iB,EAAIhjB,KAAO,IAAQK,IAAM,EACzB2iB,EAAIhjB,KAAO,IAAY,GAAJK,GACVA,EAAI,OAEb2iB,EAAIhjB,KAAO,IAAQK,IAAM,GACzB2iB,EAAIhjB,KAAO,IAAQK,IAAM,EAAI,GAC7B2iB,EAAIhjB,KAAO,IAAY,GAAJK,IAGnB2iB,EAAIhjB,KAAO,IAAQK,IAAM,GACzB2iB,EAAIhjB,KAAO,IAAQK,IAAM,GAAK,GAC9B2iB,EAAIhjB,KAAO,IAAQK,IAAM,EAAI,GAC7B2iB,EAAIhjB,KAAO,IAAY,GAAJK,GAIvB,OAAO2iB,GA2FLmT,GApEa,CAACnT,EAAK/f,KACrB,IAAIjD,EAAG4D,EACP,MAAMhB,EAAMK,GAAO+f,EAAIngB,OAKjB2zB,EAAW,IAAInb,MAAY,EAANzY,GAE3B,IAAKgB,EAAM,EAAG5D,EAAI,EAAGA,EAAI4C,GAAM,CAC7B,IAAIvC,EAAI2iB,EAAIhjB,KAEZ,GAAIK,EAAI,IAAM,CAAEm2B,EAAS5yB,KAASvD,EAAG,SAErC,IAAIo2B,EAAQP,GAAS71B,GAErB,GAAIo2B,EAAQ,EAAKD,EAAS5yB,KAAS,MAAQ5D,GAAKy2B,EAAQ,MAAxD,CAKA,IAFAp2B,GAAe,IAAVo2B,EAAc,GAAiB,IAAVA,EAAc,GAAO,EAExCA,EAAQ,GAAKz2B,EAAI4C,GACtBvC,EAAKA,GAAK,EAAiB,GAAX2iB,EAAIhjB,KACpBy2B,IAIEA,EAAQ,EAAKD,EAAS5yB,KAAS,MAE/BvD,EAAI,MACNm2B,EAAS5yB,KAASvD,GAElBA,GAAK,MACLm2B,EAAS5yB,KAAS,MAAWvD,GAAK,GAAM,KACxCm2B,EAAS5yB,KAAS,MAAc,KAAJvD,IAIhC,MAzDoB,EAAC2iB,EAAKpgB,KAI1B,GAAIA,EAAM,OACJogB,EAAI8F,UAAYkN,GAClB,OAAO9xB,OAAOC,aAAaC,MAAM,KAAM4e,EAAIngB,SAAWD,EAAMogB,EAAMA,EAAI8F,SAAS,EAAGlmB,IAItF,IAAImf,EAAS,GACb,IAAK,IAAI/hB,EAAI,EAAGA,EAAI4C,EAAK5C,IACvB+hB,GAAU7d,OAAOC,aAAa6e,EAAIhjB,IAEpC,OAAO+hB,GA2CA2U,CAAcF,EAAU5yB,IA8B7BuyB,GApBa,CAACnT,EAAK/f,MAErBA,EAAMA,GAAO+f,EAAIngB,QACPmgB,EAAIngB,SAAUI,EAAM+f,EAAIngB,QAGlC,IAAIF,EAAMM,EAAM,EAChB,KAAON,GAAO,GAA2B,MAAV,IAAXqgB,EAAIrgB,KAAyBA,IAIjD,OAAIA,EAAM,GAIE,IAARA,EAJkBM,EAMdN,EAAMuzB,GAASlT,EAAIrgB,IAAQM,EAAON,EAAMM,GAqDlD,IAAI0zB,GAzBJ,WAEEpyB,KAAKya,MAAQ,KACbza,KAAKirB,QAAU,EAEfjrB,KAAKgrB,SAAW,EAEhBhrB,KAAKmrB,SAAW,EAEhBnrB,KAAKqqB,OAAS,KACdrqB,KAAKuqB,SAAW,EAEhBvqB,KAAKoqB,UAAY,EAEjBpqB,KAAKwqB,UAAY,EAEjBxqB,KAAK4pB,IAAM,GAEX5pB,KAAKmqB,MAAQ,KAEbnqB,KAAKulB,UAAY,EAEjBvlB,KAAKwmB,MAAQ,GAKf,MAAM,GAAWrqB,OAAOkB,UAAUg1B,UAMhC9K,WAAY+K,GAAY,aAAE7K,GAAcC,aAAc6K,GAAgB5K,SAAU6K,GAChF1K,KAAM2K,GAAQ1K,aAAc2K,GAC5BjK,sBAAuBkK,GACvB7J,mBAAoB8J,GACpB1J,WAAY2J,IACVvL,GA0FJ,SAASwL,GAAQh1B,GACfkC,KAAKlC,QAAUmzB,GAAc,CAC3B5L,MAAOsN,GACPlE,OAAQoE,GACRE,UAAW,MACX1D,WAAY,GACZC,SAAU,EACV1J,SAAUgN,IACT90B,GAAW,IAEd,IAAIk1B,EAAMhzB,KAAKlC,QAEXk1B,EAAIC,KAAQD,EAAI3D,WAAa,EAC/B2D,EAAI3D,YAAc2D,EAAI3D,WAGf2D,EAAIE,MAASF,EAAI3D,WAAa,GAAO2D,EAAI3D,WAAa,KAC7D2D,EAAI3D,YAAc,IAGpBrvB,KAAK0pB,IAAS,EACd1pB,KAAK4pB,IAAS,GACd5pB,KAAKmzB,OAAS,EACdnzB,KAAKuxB,OAAS,GAEdvxB,KAAKslB,KAAO,IAAI8M,GAChBpyB,KAAKslB,KAAK8E,UAAY,EAEtB,IAAIkE,EAASiB,GAAUH,aACrBpvB,KAAKslB,KACL0N,EAAI3N,MACJ2N,EAAIvE,OACJuE,EAAI3D,WACJ2D,EAAI1D,SACJ0D,EAAIpN,UAGN,GAAI0I,IAAWmE,GACb,MAAM,IAAIz0B,MAAMkpB,GAASoH,IAO3B,GAJI0E,EAAI1O,QACNiL,GAAUE,iBAAiBzvB,KAAKslB,KAAM0N,EAAI1O,QAGxC0O,EAAIvC,WAAY,CAClB,IAAI2C,EAaJ,GATEA,EAF4B,iBAAnBJ,EAAIvC,WAENmB,GAAmBoB,EAAIvC,YACa,yBAAlC,GAAS70B,KAAKo3B,EAAIvC,YACpB,IAAI7xB,WAAWo0B,EAAIvC,YAEnBuC,EAAIvC,WAGbnC,EAASiB,GAAUiB,qBAAqBxwB,KAAKslB,KAAM8N,GAE/C9E,IAAWmE,GACb,MAAM,IAAIz0B,MAAMkpB,GAASoH,IAG3BtuB,KAAKqzB,WAAY,GAgKrB,SAASC,GAAU7Y,EAAO3c,GACxB,MAAMy1B,EAAW,IAAIT,GAAQh1B,GAK7B,GAHAy1B,EAASh0B,KAAKkb,GAAO,GAGjB8Y,EAAS7J,IAAO,MAAM6J,EAAS3J,KAAO1C,GAASqM,EAAS7J,KAE5D,OAAO6J,EAAS/V,OA9IlBsV,GAAQz1B,UAAUkC,KAAO,SAAU+L,EAAMkoB,GACvC,MAAMlO,EAAOtlB,KAAKslB,KACZyN,EAAY/yB,KAAKlC,QAAQi1B,UAC/B,IAAIzE,EAAQmF,EAEZ,GAAIzzB,KAAKmzB,MAAS,OAAO,EAkBzB,IAhBiCM,EAA7BD,MAAiBA,EAA0BA,GACb,IAAfA,EAAsBhB,GAAaF,GAGlC,iBAAThnB,EAETga,EAAK7K,MAAQmX,GAAmBtmB,GACC,yBAAxB,GAAS1P,KAAK0P,GACvBga,EAAK7K,MAAQ,IAAI7b,WAAW0M,GAE5Bga,EAAK7K,MAAQnP,EAGfga,EAAK2F,QAAU,EACf3F,EAAK0F,SAAW1F,EAAK7K,MAAMnc,SAUzB,GAPuB,IAAnBgnB,EAAK8E,YACP9E,EAAK+E,OAAS,IAAIzrB,WAAWm0B,GAC7BzN,EAAKiF,SAAW,EAChBjF,EAAK8E,UAAY2I,IAIdU,IAAgBhM,IAAgBgM,IAAgBlB,KAAmBjN,EAAK8E,WAAa,EACxFpqB,KAAK0zB,OAAOpO,EAAK+E,OAAO9F,SAAS,EAAGe,EAAKiF,WACzCjF,EAAK8E,UAAY,MAFnB,CASA,GAHAkE,EAASiB,GAAUG,QAAQpK,EAAMmO,GAG7BnF,IAAWoE,GAOb,OANIpN,EAAKiF,SAAW,GAClBvqB,KAAK0zB,OAAOpO,EAAK+E,OAAO9F,SAAS,EAAGe,EAAKiF,WAE3C+D,EAASiB,GAAUgB,WAAWvwB,KAAKslB,MACnCtlB,KAAK2zB,MAAMrF,GACXtuB,KAAKmzB,OAAQ,EACN7E,IAAWmE,GAIpB,GAAuB,IAAnBnN,EAAK8E,WAMT,GAAIqJ,EAAc,GAAKnO,EAAKiF,SAAW,EACrCvqB,KAAK0zB,OAAOpO,EAAK+E,OAAO9F,SAAS,EAAGe,EAAKiF,WACzCjF,EAAK8E,UAAY,OAInB,GAAsB,IAAlB9E,EAAK0F,SAAgB,WAXvBhrB,KAAK0zB,OAAOpO,EAAK+E,QAcrB,OAAO,GAWTyI,GAAQz1B,UAAUq2B,OAAS,SAAUlC,GACnCxxB,KAAKuxB,OAAOhyB,KAAKiyB,IAanBsB,GAAQz1B,UAAUs2B,MAAQ,SAAUrF,GAE9BA,IAAWmE,KACbzyB,KAAKwd,OAASyT,GAAqBjxB,KAAKuxB,SAE1CvxB,KAAKuxB,OAAS,GACdvxB,KAAK0pB,IAAM4E,EACXtuB,KAAK4pB,IAAM5pB,KAAKslB,KAAKsE,KA8EvB,IAMIgK,GAAc,CACjBd,QAPeA,GAQfpD,QAPiB4D,GAQjBO,WA/BD,SAAoBpZ,EAAO3c,GAGzB,OAFAA,EAAUA,GAAW,IACbm1B,KAAM,EACPK,GAAU7Y,EAAO3c,IA6BzBo1B,KAjBD,SAAczY,EAAO3c,GAGnB,OAFAA,EAAUA,GAAW,IACbo1B,MAAO,EACRI,GAAU7Y,EAAO3c,IAezBwpB,UAPiBA,IAoElB,IAAIwM,GAAU,SAAsBxO,EAAMyF,GACxC,IAAIgJ,EACA1P,EACA2P,EACArE,EACA1I,EAEAgN,EAEAC,EACAC,EACAC,EAEAC,EACAC,EACAjT,EACAkT,EACAC,EACAC,EACAC,EACAC,EACAC,EAEAv2B,EACAgiB,EACAwU,EACAC,EAGAra,EAAO4P,EAGX,MAAMF,EAAQ7E,EAAK6E,MAEnB4J,EAAMzO,EAAK2F,QACXxQ,EAAQ6K,EAAK7K,MACb4J,EAAO0P,GAAOzO,EAAK0F,SAAW,GAC9BgJ,EAAO1O,EAAKiF,SACZF,EAAS/E,EAAK+E,OACdsF,EAAMqE,GAAQjJ,EAAQzF,EAAK8E,WAC3BnD,EAAM+M,GAAQ1O,EAAK8E,UAAY,KAE/B6J,EAAO9J,EAAM8J,KAEbC,EAAQ/J,EAAM+J,MACdC,EAAQhK,EAAMgK,MACdC,EAAQjK,EAAMiK,MACdC,EAAWlK,EAAMrqB,OACjBw0B,EAAOnK,EAAMmK,KACbjT,EAAO8I,EAAM9I,KACbkT,EAAQpK,EAAM4K,QACdP,EAAQrK,EAAM6K,SACdP,GAAS,GAAKtK,EAAM8K,SAAW,EAC/BP,GAAS,GAAKvK,EAAM+K,UAAY,EAMhCC,EACA,EAAG,CACG9T,EAAO,KACTiT,GAAQ7Z,EAAMsZ,MAAU1S,EACxBA,GAAQ,EACRiT,GAAQ7Z,EAAMsZ,MAAU1S,EACxBA,GAAQ,GAGVsT,EAAOJ,EAAMD,EAAOG,GAEpBW,EACA,OAAS,CAKP,GAJAR,EAAKD,IAAS,GACdL,KAAUM,EACVvT,GAAQuT,EACRA,EAAMD,IAAS,GAAM,IACV,IAAPC,EAIFvK,EAAO2J,KAAiB,MAAPW,MAEd,MAAS,GAALC,GAwKJ,IAAkB,IAAR,GAALA,GAAgB,CACxBD,EAAOJ,GAAc,MAAPI,IAA8BL,GAAS,GAAKM,GAAM,IAChE,SAASQ,EAEN,GAAS,GAALR,EAAS,CAEhBzK,EAAMvtB,KArSD,GAsSL,MAAMu4B,EAGN7P,EAAKsE,IAAM,8BACXO,EAAMvtB,KA3SF,GA4SJ,MAAMu4B,EAnLN92B,EAAa,MAAPs2B,EACNC,GAAM,GACFA,IACEvT,EAAOuT,IACTN,GAAQ7Z,EAAMsZ,MAAU1S,EACxBA,GAAQ,GAEVhjB,GAAOi2B,GAAS,GAAKM,GAAM,EAC3BN,KAAUM,EACVvT,GAAQuT,GAGNvT,EAAO,KACTiT,GAAQ7Z,EAAMsZ,MAAU1S,EACxBA,GAAQ,EACRiT,GAAQ7Z,EAAMsZ,MAAU1S,EACxBA,GAAQ,GAEVsT,EAAOH,EAAMF,EAAOI,GAEpBW,EACA,OAAS,CAMP,GALAT,EAAKD,IAAS,GACdL,KAAUM,EACVvT,GAAQuT,EACRA,EAAMD,IAAS,GAAM,MAEZ,GAALC,GA+HC,IAAkB,IAAR,GAALA,GAAgB,CACxBD,EAAOH,GAAc,MAAPG,IAA8BL,GAAS,GAAKM,GAAM,IAChE,SAASS,EAGT/P,EAAKsE,IAAM,wBACXO,EAAMvtB,KAzRN,GA0RA,MAAMu4B,EAzHN,GAZA9U,EAAc,MAAPsU,EACPC,GAAM,GACFvT,EAAOuT,IACTN,GAAQ7Z,EAAMsZ,MAAU1S,EACxBA,GAAQ,EACJA,EAAOuT,IACTN,GAAQ7Z,EAAMsZ,MAAU1S,EACxBA,GAAQ,IAGZhB,GAAQiU,GAAS,GAAKM,GAAM,EAExBvU,EAAO4T,EAAM,CACf3O,EAAKsE,IAAM,gCACXO,EAAMvtB,KAnKR,GAoKE,MAAMu4B,EAOR,GAJAb,KAAUM,EACVvT,GAAQuT,EAERA,EAAKZ,EAAOrE,EACRtP,EAAOuU,EAAI,CAEb,GADAA,EAAKvU,EAAOuU,EACRA,EAAKT,GACHhK,EAAMmL,KAAM,CACdhQ,EAAKsE,IAAM,gCACXO,EAAMvtB,KAhLZ,GAiLM,MAAMu4B,EA2BV,GAFAN,EAAO,EACPC,EAAcT,EACA,IAAVD,GAEF,GADAS,GAAQX,EAAQU,EACZA,EAAKv2B,EAAK,CACZA,GAAOu2B,EACP,GACEvK,EAAO2J,KAAUK,EAASQ,aACjBD,GACXC,EAAOb,EAAO3T,EACdyU,EAAczK,QAGb,GAAI+J,EAAQQ,GAGf,GAFAC,GAAQX,EAAQE,EAAQQ,EACxBA,GAAMR,EACFQ,EAAKv2B,EAAK,CACZA,GAAOu2B,EACP,GACEvK,EAAO2J,KAAUK,EAASQ,aACjBD,GAEX,GADAC,EAAO,EACHT,EAAQ/1B,EAAK,CACfu2B,EAAKR,EACL/1B,GAAOu2B,EACP,GACEvK,EAAO2J,KAAUK,EAASQ,aACjBD,GACXC,EAAOb,EAAO3T,EACdyU,EAAczK,SAMlB,GADAwK,GAAQT,EAAQQ,EACZA,EAAKv2B,EAAK,CACZA,GAAOu2B,EACP,GACEvK,EAAO2J,KAAUK,EAASQ,aACjBD,GACXC,EAAOb,EAAO3T,EACdyU,EAAczK,EAGlB,KAAOhsB,EAAM,GACXgsB,EAAO2J,KAAUc,EAAYD,KAC7BxK,EAAO2J,KAAUc,EAAYD,KAC7BxK,EAAO2J,KAAUc,EAAYD,KAC7Bx2B,GAAO,EAELA,IACFgsB,EAAO2J,KAAUc,EAAYD,KACzBx2B,EAAM,IACRgsB,EAAO2J,KAAUc,EAAYD,WAI9B,CACHA,EAAOb,EAAO3T,EACd,GACEgK,EAAO2J,KAAU3J,EAAOwK,KACxBxK,EAAO2J,KAAU3J,EAAOwK,KACxBxK,EAAO2J,KAAU3J,EAAOwK,KACxBx2B,GAAO,QACAA,EAAM,GACXA,IACFgsB,EAAO2J,KAAU3J,EAAOwK,KACpBx2B,EAAM,IACRgsB,EAAO2J,KAAU3J,EAAOwK,OAehC,OAkBJ,aAEKd,EAAM1P,GAAQ2P,EAAO/M,GAG9B5oB,EAAMgjB,GAAQ,EACd0S,GAAO11B,EACPgjB,GAAQhjB,GAAO,EACfi2B,IAAS,GAAKjT,GAAQ,EAGtBiE,EAAK2F,QAAU8I,EACfzO,EAAKiF,SAAWyJ,EAChB1O,EAAK0F,SAAY+I,EAAM1P,EAAYA,EAAO0P,EAAZ,EAAmB,GAAKA,EAAM1P,GAC5DiB,EAAK8E,UAAa4J,EAAO/M,EAAaA,EAAM+M,EAAb,IAAqB,KAAOA,EAAO/M,GAClEkD,EAAMmK,KAAOA,EACbnK,EAAM9I,KAAOA,GAuBf,MASMkU,GAAQ,IAAI1G,YAAY,CAC5B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACrD,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAGzD2G,GAAO,IAAI52B,WAAW,CAC1B,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAGpD62B,GAAQ,IAAI5G,YAAY,CAC5B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IACtD,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAClD,KAAM,MAAO,MAAO,MAAO,EAAG,IAG1B6G,GAAO,IAAI92B,WAAW,CAC1B,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpC,GAAI,GAAI,GAAI,GAAI,GAAI,KAsStB,IAAI+2B,GAnSkB,CAACC,EAAMC,EAAMC,EAAYC,EAAOlP,EAAOmP,EAAaC,EAAMC,KAE9E,MAAM7U,EAAO6U,EAAK7U,KAGlB,IASI8U,EACAC,EACAC,EACAC,EACAzF,EAIA5J,EAjBA5oB,EAAM,EACNk4B,EAAM,EACNC,EAAM,EAAG93B,EAAM,EACf+3B,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EAMP3T,EAAO,KACP4T,EAAa,EAGjB,MAAMpT,EAAQ,IAAIkL,YAAYmI,IACxBC,EAAO,IAAIpI,YAAYmI,IAC7B,IAGIE,EAAWC,EAASC,EAHpBt4B,EAAQ,KACRu4B,EAAc,EAoClB,IAAKh5B,EAAM,EAAGA,GA7FA,GA6FgBA,IAC5BslB,EAAMtlB,GAAO,EAEf,IAAKk4B,EAAM,EAAGA,EAAMR,EAAOQ,IACzB5S,EAAMkS,EAAKC,EAAaS,MAK1B,IADAE,EAAOpV,EACF3iB,EAtGS,GAsGMA,GAAO,GACN,IAAfilB,EAAMjlB,GADkBA,KAM9B,GAHI+3B,EAAO/3B,IACT+3B,EAAO/3B,GAEG,IAARA,EAaF,OATAmoB,EAAMmP,KAAiB,SAMvBnP,EAAMmP,KAAiB,SAEvBE,EAAK7U,KAAO,EACL,EAET,IAAKmV,EAAM,EAAGA,EAAM93B,GACC,IAAfilB,EAAM6S,GADaA,KASzB,IANIC,EAAOD,IACTC,EAAOD,GAITI,EAAO,EACFv4B,EAAM,EAAGA,GApIA,GAoIgBA,IAG5B,GAFAu4B,IAAS,EACTA,GAAQjT,EAAMtlB,GACVu4B,EAAO,EACT,OAAQ,EAGZ,GAAIA,EAAO,IAtIC,IAsIKhB,GAA0B,IAARl3B,GACjC,OAAQ,EAKV,IADAu4B,EAAK,GAAK,EACL54B,EAAM,EAAGA,EAjJA,GAiJeA,IAC3B44B,EAAK54B,EAAM,GAAK44B,EAAK54B,GAAOslB,EAAMtlB,GAIpC,IAAKk4B,EAAM,EAAGA,EAAMR,EAAOQ,IACM,IAA3BV,EAAKC,EAAaS,KACpBN,EAAKgB,EAAKpB,EAAKC,EAAaS,OAAWA,GAmE3C,GAtNY,IAyLRX,GACFzS,EAAOrkB,EAAQm3B,EACfhP,EAAM,IA1LG,IA4LA2O,GACTzS,EAAOoS,GACPwB,GAAc,IACdj4B,EAAQ02B,GACR6B,GAAe,IACfpQ,EAAM,MAGN9D,EAAOsS,GACP32B,EAAQ42B,GACRzO,GAAO,GAIT6P,EAAO,EACPP,EAAM,EACNl4B,EAAMm4B,EACN3F,EAAOmF,EACPU,EAAOD,EACPE,EAAO,EACPN,GAAO,EACPQ,EAAO,GAAKJ,EACZH,EAAOO,EAAO,EAlNH,IAqNNjB,GAAiBiB,EA1NJ,KAMN,IAqNTjB,GAAkBiB,EA1NF,IA2NjB,OAAO,EAIT,OAAS,CAEPK,EAAY74B,EAAMs4B,EACdV,EAAKM,GAAOtP,GACdkQ,EAAU,EACVC,EAAWnB,EAAKM,IAETN,EAAKM,GAAOtP,GACnBkQ,EAAUr4B,EAAMu4B,EAAcpB,EAAKM,IACnCa,EAAWjU,EAAK4T,EAAad,EAAKM,MAGlCY,EAAU,GACVC,EAAW,GAIbjB,EAAO,GAAM93B,EAAMs4B,EACnBP,EAAO,GAAKM,EACZF,EAAMJ,EACN,GACEA,GAAQD,EACRtP,EAAMgK,GAAQiG,GAAQH,GAAQP,GAASc,GAAa,GAAOC,GAAW,GAAMC,EAAU,QACtE,IAAThB,GAIT,IADAD,EAAO,GAAM93B,EAAM,EACZy4B,EAAOX,GACZA,IAAS,EAWX,GATa,IAATA,GACFW,GAAQX,EAAO,EACfW,GAAQX,GAERW,EAAO,EAITP,IACqB,KAAf5S,EAAMtlB,GAAY,CACtB,GAAIA,IAAQK,EAAO,MACnBL,EAAMw3B,EAAKC,EAAaG,EAAKM,IAI/B,GAAIl4B,EAAMo4B,IAASK,EAAOR,KAAUD,EAAK,CAYvC,IAVa,IAATM,IACFA,EAAOF,GAIT5F,GAAQ2F,EAGRE,EAAOr4B,EAAMs4B,EACbC,EAAO,GAAKF,EACLA,EAAOC,EAAOj4B,IACnBk4B,GAAQjT,EAAM+S,EAAOC,KACjBC,GAAQ,KACZF,IACAE,IAAS,EAKX,GADAC,GAAQ,GAAKH,EA5RN,IA6RFd,GAAiBiB,EAlSR,KAMN,IA6RLjB,GAAkBiB,EAlSN,IAmSb,OAAO,EAITR,EAAMS,EAAOR,EAIbzP,EAAMwP,GAAQI,GAAQ,GAAOC,GAAQ,GAAO7F,EAAOmF,EAAc,GAiBrE,OAVa,IAATc,IAIFjQ,EAAMgK,EAAOiG,GAAUz4B,EAAMs4B,GAAS,GAAO,IAAM,GAAK,GAK1DT,EAAK7U,KAAOoV,EACL,GA8BT,MAQE9O,SAAU2P,GAAY1P,QAAS2P,GAAS,QAAE1P,GAC1CC,KAAM0P,GAAQzP,aAAc0P,GAAc,YAAEzP,GAAaE,eAAgBwP,GAAkBvP,aAAcwP,GAAc,YAAEvP,GAAaC,YAAauP,GACnJ1O,WAAY2O,IACVvQ,GAqDEwQ,GAAWrzB,IAEJA,IAAM,GAAM,MACbA,IAAM,EAAK,SACP,MAAJA,IAAe,KACX,IAAJA,IAAa,IAIzB,SAASszB,KACP/3B,KAAKpD,KAAO,EACZoD,KAAKqkB,MAAO,EACZrkB,KAAKkrB,KAAO,EACZlrB,KAAKg4B,UAAW,EAChBh4B,KAAKi4B,MAAQ,EACbj4B,KAAKi0B,KAAO,EACZj0B,KAAKk4B,MAAQ,EACbl4B,KAAKm4B,MAAQ,EAEbn4B,KAAK6sB,KAAO,KAGZ7sB,KAAKo4B,MAAQ,EACbp4B,KAAKk0B,MAAQ,EACbl0B,KAAKm0B,MAAQ,EACbn0B,KAAKo0B,MAAQ,EACbp0B,KAAKF,OAAS,KAGdE,KAAKs0B,KAAO,EACZt0B,KAAKqhB,KAAO,EAGZrhB,KAAK1B,OAAS,EACd0B,KAAK2L,OAAS,EAGd3L,KAAKlB,MAAQ,EAGbkB,KAAK+0B,QAAU,KACf/0B,KAAKg1B,SAAW,KAChBh1B,KAAKi1B,QAAU,EACfj1B,KAAKk1B,SAAW,EAGhBl1B,KAAKq4B,MAAQ,EACbr4B,KAAKs4B,KAAO,EACZt4B,KAAKu4B,MAAQ,EACbv4B,KAAKw4B,KAAO,EACZx4B,KAAK6wB,KAAO,KAEZ7wB,KAAK61B,KAAO,IAAIhH,YAAY,KAC5B7uB,KAAKi2B,KAAO,IAAIpH,YAAY,KAO5B7uB,KAAKy4B,OAAS,KACdz4B,KAAK04B,QAAU,KACf14B,KAAKs1B,KAAO,EACZt1B,KAAK24B,KAAO,EACZ34B,KAAK44B,IAAM,EAIb,MAAMC,GAAoBvT,IAExB,IAAKA,IAASA,EAAK6E,MAAS,OAAOuN,GACnC,MAAMvN,EAAQ7E,EAAK6E,MAoBnB,OAnBA7E,EAAK6F,SAAW7F,EAAKkF,UAAYL,EAAMgO,MAAQ,EAC/C7S,EAAKsE,IAAM,GACPO,EAAMe,OACR5F,EAAKkB,MAAqB,EAAb2D,EAAMe,MAErBf,EAAMvtB,KA3HQ,EA4HdutB,EAAM9F,KAAO,EACb8F,EAAM6N,SAAW,EACjB7N,EAAM8J,KAAO,MACb9J,EAAM0C,KAAO,KACb1C,EAAMmK,KAAO,EACbnK,EAAM9I,KAAO,EAEb8I,EAAM4K,QAAU5K,EAAMsO,OAAS,IAAIK,WA9Ff,KA+FpB3O,EAAM6K,SAAW7K,EAAMuO,QAAU,IAAII,WA9FhB,KAgGrB3O,EAAMmL,KAAO,EACbnL,EAAMwO,MAAQ,EAEPnB,IAIHuB,GAAgBzT,IAEpB,IAAKA,IAASA,EAAK6E,MAAS,OAAOuN,GACnC,MAAMvN,EAAQ7E,EAAK6E,MAInB,OAHAA,EAAM+J,MAAQ,EACd/J,EAAMgK,MAAQ,EACdhK,EAAMiK,MAAQ,EACPyE,GAAiBvT,IAKpB0T,GAAgB,CAAC1T,EAAM+J,KAC3B,IAAInE,EAGJ,IAAK5F,IAASA,EAAK6E,MAAS,OAAOuN,GACnC,MAAMvN,EAAQ7E,EAAK6E,MAenB,OAZIkF,EAAa,GACfnE,EAAO,EACPmE,GAAcA,IAGdnE,EAA2B,GAAnBmE,GAAc,GAClBA,EAAa,KACfA,GAAc,KAKdA,IAAeA,EAAa,GAAKA,EAAa,IACzCqI,IAEY,OAAjBvN,EAAMrqB,QAAmBqqB,EAAMiO,QAAU/I,IAC3ClF,EAAMrqB,OAAS,MAIjBqqB,EAAMe,KAAOA,EACbf,EAAMiO,MAAQ/I,EACP0J,GAAazT,KAIhB2T,GAAe,CAAC3T,EAAM+J,KAE1B,IAAK/J,EAAQ,OAAOoS,GAGpB,MAAMvN,EAAQ,IAAI4N,GAIlBzS,EAAK6E,MAAQA,EACbA,EAAMrqB,OAAS,KACf,MAAMovB,EAAM8J,GAAc1T,EAAM+J,GAIhC,OAHIH,IAAQsI,KACVlS,EAAK6E,MAAQ,MAER+E,GAoBT,IAEIgK,GAAQC,GAFRC,IAAS,EAKb,MAAMC,GAAelP,IAGnB,GAAIiP,GAAQ,CACVF,GAAS,IAAIJ,WAAW,KACxBK,GAAU,IAAIL,WAAW,IAGzB,IAAIvC,EAAM,EACV,KAAOA,EAAM,KAAOpM,EAAM0L,KAAKU,KAAS,EACxC,KAAOA,EAAM,KAAOpM,EAAM0L,KAAKU,KAAS,EACxC,KAAOA,EAAM,KAAOpM,EAAM0L,KAAKU,KAAS,EACxC,KAAOA,EAAM,KAAOpM,EAAM0L,KAAKU,KAAS,EAMxC,IAJAZ,GAlQW,EAkQOxL,EAAM0L,KAAM,EAAG,IAAKqD,GAAU,EAAG/O,EAAM8L,KAAM,CAAE5U,KAAM,IAGvEkV,EAAM,EACCA,EAAM,IAAMpM,EAAM0L,KAAKU,KAAS,EAEvCZ,GAvQY,EAuQMxL,EAAM0L,KAAM,EAAG,GAAMsD,GAAS,EAAGhP,EAAM8L,KAAM,CAAE5U,KAAM,IAGvE+X,IAAS,EAGXjP,EAAM4K,QAAUmE,GAChB/O,EAAM8K,QAAU,EAChB9K,EAAM6K,SAAWmE,GACjBhP,EAAM+K,SAAW,GAkBboE,GAAe,CAAChU,EAAMiU,EAAKtS,EAAKuS,KAEpC,IAAInZ,EACJ,MAAM8J,EAAQ7E,EAAK6E,MAqCnB,OAlCqB,OAAjBA,EAAMrqB,SACRqqB,EAAM+J,MAAQ,GAAK/J,EAAMiO,MACzBjO,EAAMiK,MAAQ,EACdjK,EAAMgK,MAAQ,EAEdhK,EAAMrqB,OAAS,IAAIlB,WAAWurB,EAAM+J,QAIlCsF,GAAQrP,EAAM+J,OAChB/J,EAAMrqB,OAAOd,IAAIu6B,EAAIhV,SAAS0C,EAAMkD,EAAM+J,MAAOjN,GAAM,GACvDkD,EAAMiK,MAAQ,EACdjK,EAAMgK,MAAQhK,EAAM+J,QAGpB7T,EAAO8J,EAAM+J,MAAQ/J,EAAMiK,MACvB/T,EAAOmZ,IACTnZ,EAAOmZ,GAGTrP,EAAMrqB,OAAOd,IAAIu6B,EAAIhV,SAAS0C,EAAMuS,EAAMvS,EAAMuS,EAAOnZ,GAAO8J,EAAMiK,QACpEoF,GAAQnZ,IAGN8J,EAAMrqB,OAAOd,IAAIu6B,EAAIhV,SAAS0C,EAAMuS,EAAMvS,GAAM,GAChDkD,EAAMiK,MAAQoF,EACdrP,EAAMgK,MAAQhK,EAAM+J,QAGpB/J,EAAMiK,OAAS/T,EACX8J,EAAMiK,QAAUjK,EAAM+J,QAAS/J,EAAMiK,MAAQ,GAC7CjK,EAAMgK,MAAQhK,EAAM+J,QAAS/J,EAAMgK,OAAS9T,KAG7C,GA8oCT,IAqBIoZ,GAAY,CACfV,aAtBoBA,GAuBpBC,cAtBqBA,GAuBrBH,iBAtBwBA,GAuBxBa,YAnxCoBpU,GAEZ2T,GAAa3T,EAvKF,IAy7CnB2T,aAtBoBA,GAuBpBU,QArqCe,CAACrU,EAAM2H,KAErB,IAAI9C,EACA1P,EAAO4P,EACPwG,EACAvrB,EACAkzB,EAAM5B,EACNtC,EACAjT,EACA0S,EAAKC,EACLwF,EACA3E,EACAC,EAEAoC,EAAWC,EAASC,EAEpBwC,EAAWC,EAASC,EACpBz7B,EACA6wB,EALAyF,EAAO,EAMX,MAAMoF,EAAO,IAAIn7B,WAAW,GAC5B,IAAIs3B,EAEAh5B,EAEJ,MAAM88B,EACJ,IAAIp7B,WAAW,CAAE,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KAGjF,IAAK0mB,IAASA,EAAK6E,QAAU7E,EAAK+E,SAC5B/E,EAAK7K,OAA2B,IAAlB6K,EAAK0F,SACvB,OAAO0M,GAGTvN,EAAQ7E,EAAK6E,MApVO,KAqVhBA,EAAMvtB,OAAmButB,EAAMvtB,KApVf,IAwVpB0I,EAAMggB,EAAKiF,SACXF,EAAS/E,EAAK+E,OACduM,EAAOtR,EAAK8E,UACZyG,EAAOvL,EAAK2F,QACZxQ,EAAQ6K,EAAK7K,MACb+d,EAAOlT,EAAK0F,SACZsJ,EAAOnK,EAAMmK,KACbjT,EAAO8I,EAAM9I,KAGb0S,EAAMyE,EACNxE,EAAO4C,EACP1H,EAAMsI,GAENyC,EACA,OACE,OAAQ9P,EAAMvtB,MACZ,KArXU,EAsXR,GAAmB,IAAfutB,EAAMe,KAAY,CACpBf,EAAMvtB,KA3WM,GA4WZ,MAGF,KAAOykB,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV,GAAkB,EAAb8I,EAAMe,MAAsB,QAAToJ,EAAiB,CACvCnK,EAAM+N,MAAQ,EAEd6B,EAAK,GAAY,IAAPzF,EACVyF,EAAK,GAAMzF,IAAS,EAAK,IACzBnK,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAO6B,EAAM,EAAG,GAI5CzF,EAAO,EACPjT,EAAO,EAEP8I,EAAMvtB,KA7YC,EA8YP,MAMF,GAJAutB,EAAM8N,MAAQ,EACV9N,EAAM0C,OACR1C,EAAM0C,KAAKqN,MAAO,KAED,EAAb/P,EAAMe,UACA,IAAPoJ,IAA2B,IAAMA,GAAQ,IAAM,GAAI,CACtDhP,EAAKsE,IAAM,yBACXO,EAAMvtB,KA3XC,GA4XP,MAEF,IAAY,GAAP03B,KAA4BuD,GAAc,CAC7CvS,EAAKsE,IAAM,6BACXO,EAAMvtB,KAhYC,GAiYP,MAOF,GAJA03B,KAAU,EACVjT,GAAQ,EAERhjB,EAAiC,GAAnB,GAAPi2B,GACa,IAAhBnK,EAAMiO,MACRjO,EAAMiO,MAAQ/5B,OAEX,GAAIA,EAAM8rB,EAAMiO,MAAO,CAC1B9S,EAAKsE,IAAM,sBACXO,EAAMvtB,KA7YC,GA8YP,MAKFutB,EAAM8J,KAAO,GAAK9J,EAAMiO,MAIxB9S,EAAKkB,MAAQ2D,EAAM+N,MAAQ,EAC3B/N,EAAMvtB,KAAc,IAAP03B,EA5aH,GAEI,GA4adA,EAAO,EACPjT,EAAO,EAEP,MACF,KA1bW,EA4bT,KAAOA,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAIV,GADA8I,EAAM8N,MAAQ3D,GACK,IAAdnK,EAAM8N,SAAkBJ,GAAc,CACzCvS,EAAKsE,IAAM,6BACXO,EAAMvtB,KA1aC,GA2aP,MAEF,GAAkB,MAAdutB,EAAM8N,MAAgB,CACxB3S,EAAKsE,IAAM,2BACXO,EAAMvtB,KA/aC,GAgbP,MAEEutB,EAAM0C,OACR1C,EAAM0C,KAAKiD,KAASwE,GAAQ,EAAK,GAEjB,IAAdnK,EAAM8N,QAER8B,EAAK,GAAY,IAAPzF,EACVyF,EAAK,GAAMzF,IAAS,EAAK,IACzBnK,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAO6B,EAAM,EAAG,IAI9CzF,EAAO,EACPjT,EAAO,EAEP8I,EAAMvtB,KA3dE,EA6dV,KA7dU,EA+dR,KAAOykB,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGN8I,EAAM0C,OACR1C,EAAM0C,KAAKoD,KAAOqE,GAEF,IAAdnK,EAAM8N,QAER8B,EAAK,GAAY,IAAPzF,EACVyF,EAAK,GAAMzF,IAAS,EAAK,IACzByF,EAAK,GAAMzF,IAAS,GAAM,IAC1ByF,EAAK,GAAMzF,IAAS,GAAM,IAC1BnK,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAO6B,EAAM,EAAG,IAI9CzF,EAAO,EACPjT,EAAO,EAEP8I,EAAMvtB,KArfA,EAufR,KAvfQ,EAyfN,KAAOykB,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGN8I,EAAM0C,OACR1C,EAAM0C,KAAKsN,OAAiB,IAAP7F,EACrBnK,EAAM0C,KAAKqD,GAAMoE,GAAQ,GAET,IAAdnK,EAAM8N,QAER8B,EAAK,GAAY,IAAPzF,EACVyF,EAAK,GAAMzF,IAAS,EAAK,IACzBnK,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAO6B,EAAM,EAAG,IAI9CzF,EAAO,EACPjT,EAAO,EAEP8I,EAAMvtB,KA9gBG,EAghBX,KAhhBW,EAihBT,GAAkB,KAAdutB,EAAM8N,MAAgB,CAExB,KAAO5W,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV8I,EAAM7rB,OAASg2B,EACXnK,EAAM0C,OACR1C,EAAM0C,KAAKuN,UAAY9F,GAEP,IAAdnK,EAAM8N,QAER8B,EAAK,GAAY,IAAPzF,EACVyF,EAAK,GAAMzF,IAAS,EAAK,IACzBnK,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAO6B,EAAM,EAAG,IAI9CzF,EAAO,EACPjT,EAAO,OAGA8I,EAAM0C,OACb1C,EAAM0C,KAAK/tB,MAAQ,MAErBqrB,EAAMvtB,KA5iBG,EA8iBX,KA9iBW,EA+iBT,GAAkB,KAAdutB,EAAM8N,QACRuB,EAAOrP,EAAM7rB,OACTk7B,EAAOhB,IAAQgB,EAAOhB,GACtBgB,IACErP,EAAM0C,OACRxuB,EAAM8rB,EAAM0C,KAAKuN,UAAYjQ,EAAM7rB,OAC9B6rB,EAAM0C,KAAK/tB,QAEdqrB,EAAM0C,KAAK/tB,MAAQ,IAAIF,WAAWurB,EAAM0C,KAAKuN,YAE/CjQ,EAAM0C,KAAK/tB,MAAME,IACfyb,EAAM8J,SACJsM,EAGAA,EAAO2I,GAGTn7B,IAMc,IAAd8rB,EAAM8N,QACR9N,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAOzd,EAAO+e,EAAM3I,IAElD2H,GAAQgB,EACR3I,GAAQ2I,EACRrP,EAAM7rB,QAAUk7B,GAEdrP,EAAM7rB,QAAU,MAAM27B,EAE5B9P,EAAM7rB,OAAS,EACf6rB,EAAMvtB,KAhlBE,EAklBV,KAllBU,EAmlBR,GAAkB,KAAdutB,EAAM8N,MAAgB,CACxB,GAAa,IAATO,EAAc,MAAMyB,EACxBT,EAAO,EACP,GAEEn7B,EAAMoc,EAAMoW,EAAO2I,KAEfrP,EAAM0C,MAAQxuB,GACb8rB,EAAM7rB,OAAS,QAClB6rB,EAAM0C,KAAK7wB,MAAQ2D,OAAOC,aAAavB,UAElCA,GAAOm7B,EAAOhB,GAOvB,GALkB,IAAdrO,EAAM8N,QACR9N,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAOzd,EAAO+e,EAAM3I,IAElD2H,GAAQgB,EACR3I,GAAQ2I,EACJn7B,EAAO,MAAM47B,OAEV9P,EAAM0C,OACb1C,EAAM0C,KAAK7wB,KAAO,MAEpBmuB,EAAM7rB,OAAS,EACf6rB,EAAMvtB,KA1mBK,EA4mBb,KA5mBa,EA6mBX,GAAkB,KAAdutB,EAAM8N,MAAgB,CACxB,GAAa,IAATO,EAAc,MAAMyB,EACxBT,EAAO,EACP,GACEn7B,EAAMoc,EAAMoW,EAAO2I,KAEfrP,EAAM0C,MAAQxuB,GACb8rB,EAAM7rB,OAAS,QAClB6rB,EAAM0C,KAAKmD,SAAWrwB,OAAOC,aAAavB,UAErCA,GAAOm7B,EAAOhB,GAMvB,GALkB,IAAdrO,EAAM8N,QACR9N,EAAM+N,MAAQnR,GAAQoD,EAAM+N,MAAOzd,EAAO+e,EAAM3I,IAElD2H,GAAQgB,EACR3I,GAAQ2I,EACJn7B,EAAO,MAAM47B,OAEV9P,EAAM0C,OACb1C,EAAM0C,KAAKmD,QAAU,MAEvB7F,EAAMvtB,KAjoBE,EAmoBV,KAnoBU,EAooBR,GAAkB,IAAdutB,EAAM8N,MAAgB,CAExB,KAAO5W,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV,GAAIiT,KAAwB,MAAdnK,EAAM+N,OAAiB,CACnC5S,EAAKsE,IAAM,sBACXO,EAAMvtB,KA1nBD,GA2nBL,MAGF03B,EAAO,EACPjT,EAAO,EAGL8I,EAAM0C,OACR1C,EAAM0C,KAAKkD,KAAS5F,EAAM8N,OAAS,EAAK,EACxC9N,EAAM0C,KAAKqN,MAAO,GAEpB5U,EAAKkB,MAAQ2D,EAAM+N,MAAQ,EAC3B/N,EAAMvtB,KAzpBQ,GA0pBd,MACF,KA7pBY,GA+pBV,KAAOykB,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGViE,EAAKkB,MAAQ2D,EAAM+N,MAAQJ,GAAQxD,GAEnCA,EAAO,EACPjT,EAAO,EAEP8I,EAAMvtB,KA1qBE,GA4qBV,KA5qBU,GA6qBR,GAAuB,IAAnButB,EAAM6N,SASR,OAPA1S,EAAKiF,SAAWjlB,EAChBggB,EAAK8E,UAAYwM,EACjBtR,EAAK2F,QAAU4F,EACfvL,EAAK0F,SAAWwN,EAChBrO,EAAMmK,KAAOA,EACbnK,EAAM9I,KAAOA,EAEN2G,GAET1C,EAAKkB,MAAQ2D,EAAM+N,MAAQ,EAC3B/N,EAAMvtB,KAxrBQ,GA0rBhB,KA1rBgB,GA2rBd,GAAIqwB,IAAUsK,IAAatK,IAAUpF,GAAW,MAAMoS,EAExD,KA5rBgB,GA6rBd,GAAI9P,EAAM9F,KAAM,CAEdiQ,KAAiB,EAAPjT,EACVA,GAAe,EAAPA,EAER8I,EAAMvtB,KAprBC,GAqrBP,MAGF,KAAOykB,EAAO,GAAG,CACf,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EASV,OANA8I,EAAM9F,KAAe,EAAPiQ,EAEdA,KAAU,EACVjT,GAAQ,EAGQ,EAAPiT,GACP,KAAK,EAGHnK,EAAMvtB,KAttBI,GAutBV,MACF,KAAK,EAKH,GAJAy8B,GAAYlP,GAGZA,EAAMvtB,KAttBM,GAutBRqwB,IAAUpF,GAAS,CAErByM,KAAU,EACVjT,GAAQ,EAER,MAAM4Y,EAER,MACF,KAAK,EAGH9P,EAAMvtB,KAruBG,GAsuBT,MACF,KAAK,EACH0oB,EAAKsE,IAAM,qBACXO,EAAMvtB,KA5tBD,GA+tBT03B,KAAU,EACVjT,GAAQ,EAER,MACF,KAnvBgB,GAyvBd,IAJAiT,KAAiB,EAAPjT,EACVA,GAAe,EAAPA,EAGDA,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV,IAAY,MAAPiT,KAAqBA,IAAS,GAAM,OAAS,CAChDhP,EAAKsE,IAAM,+BACXO,EAAMvtB,KAlvBC,GAmvBP,MAUF,GARAutB,EAAM7rB,OAAgB,MAAPg2B,EAIfA,EAAO,EACPjT,EAAO,EAEP8I,EAAMvtB,KA3wBO,GA4wBTqwB,IAAUpF,GAAW,MAAMoS,EAEjC,KA9wBe,GA+wBb9P,EAAMvtB,KA9wBM,GAgxBd,KAhxBc,GAkxBZ,GADA48B,EAAOrP,EAAM7rB,OACTk7B,EAAM,CAGR,GAFIA,EAAOhB,IAAQgB,EAAOhB,GACtBgB,EAAO5C,IAAQ4C,EAAO5C,GACb,IAAT4C,EAAc,MAAMS,EAExB5P,EAAOrrB,IAAIyb,EAAM8J,SAASsM,EAAMA,EAAO2I,GAAOl0B,GAE9CkzB,GAAQgB,EACR3I,GAAQ2I,EACR5C,GAAQ4C,EACRl0B,GAAOk0B,EACPrP,EAAM7rB,QAAUk7B,EAChB,MAGFrP,EAAMvtB,KAryBQ,GAsyBd,MACF,KAlyBe,GAoyBb,KAAOykB,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAmBV,GAhBA8I,EAAMmO,KAAkC,KAAnB,GAAPhE,GAEdA,KAAU,EACVjT,GAAQ,EAER8I,EAAMoO,MAAmC,GAAnB,GAAPjE,GAEfA,KAAU,EACVjT,GAAQ,EAER8I,EAAMkO,MAAmC,GAAnB,GAAP/D,GAEfA,KAAU,EACVjT,GAAQ,EAGJ8I,EAAMmO,KAAO,KAAOnO,EAAMoO,MAAQ,GAAI,CACxCjT,EAAKsE,IAAM,sCACXO,EAAMvtB,KAhzBC,GAizBP,MAIFutB,EAAMqO,KAAO,EACbrO,EAAMvtB,KAl0BS,GAo0BjB,KAp0BiB,GAq0Bf,KAAOutB,EAAMqO,KAAOrO,EAAMkO,OAAO,CAE/B,KAAOhX,EAAO,GAAG,CACf,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV8I,EAAM0L,KAAKmE,EAAM7P,EAAMqO,SAAmB,EAAPlE,EAEnCA,KAAU,EACVjT,GAAQ,EAGV,KAAO8I,EAAMqO,KAAO,IAClBrO,EAAM0L,KAAKmE,EAAM7P,EAAMqO,SAAW,EAapC,GAPArO,EAAM4K,QAAU5K,EAAMsO,OACtBtO,EAAM8K,QAAU,EAEhBiB,EAAO,CAAE7U,KAAM8I,EAAM8K,SACrB/F,EAAMyG,GAl4BE,EAk4BgBxL,EAAM0L,KAAM,EAAG,GAAI1L,EAAM4K,QAAS,EAAG5K,EAAM8L,KAAMC,GACzE/L,EAAM8K,QAAUiB,EAAK7U,KAEjB6N,EAAK,CACP5J,EAAKsE,IAAM,2BACXO,EAAMvtB,KAx1BC,GAy1BP,MAGFutB,EAAMqO,KAAO,EACbrO,EAAMvtB,KAx2BU,GA02BlB,KA12BkB,GA22BhB,KAAOutB,EAAMqO,KAAOrO,EAAMmO,KAAOnO,EAAMoO,OAAO,CAC5C,KACE5D,EAAOxK,EAAM4K,QAAQT,GAAS,GAAKnK,EAAM8K,SAAW,GACpDiC,EAAYvC,IAAS,GACrBwC,EAAWxC,IAAS,GAAM,IAC1ByC,EAAkB,MAAPzC,IAEP,GAAetT,IANZ,CAQP,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV,GAAI+V,EAAW,GAEb9C,KAAU4C,EACV7V,GAAQ6V,EAER/M,EAAM0L,KAAK1L,EAAMqO,QAAUpB,MAExB,CACH,GAAiB,KAAbA,EAAiB,CAGnB,IADAl6B,EAAIg6B,EAAY,EACT7V,EAAOnkB,GAAG,CACf,GAAa,IAATs7B,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAOV,GAHAiT,KAAU4C,EACV7V,GAAQ6V,EAEW,IAAf/M,EAAMqO,KAAY,CACpBlT,EAAKsE,IAAM,4BACXO,EAAMvtB,KAv4BL,GAw4BD,MAEFyB,EAAM8rB,EAAM0L,KAAK1L,EAAMqO,KAAO,GAC9BgB,EAAO,GAAY,EAAPlF,GAEZA,KAAU,EACVjT,GAAQ,OAGL,GAAiB,KAAb+V,EAAiB,CAGxB,IADAl6B,EAAIg6B,EAAY,EACT7V,EAAOnkB,GAAG,CACf,GAAa,IAATs7B,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAIViT,KAAU4C,EACV7V,GAAQ6V,EAER74B,EAAM,EACNm7B,EAAO,GAAY,EAAPlF,GAEZA,KAAU,EACVjT,GAAQ,MAGL,CAGH,IADAnkB,EAAIg6B,EAAY,EACT7V,EAAOnkB,GAAG,CACf,GAAa,IAATs7B,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAIViT,KAAU4C,EACV7V,GAAQ6V,EAER74B,EAAM,EACNm7B,EAAO,IAAa,IAAPlF,GAEbA,KAAU,EACVjT,GAAQ,EAGV,GAAI8I,EAAMqO,KAAOgB,EAAOrP,EAAMmO,KAAOnO,EAAMoO,MAAO,CAChDjT,EAAKsE,IAAM,4BACXO,EAAMvtB,KA77BH,GA87BH,MAEF,KAAO48B,KACLrP,EAAM0L,KAAK1L,EAAMqO,QAAUn6B,GAMjC,GAv8BS,KAu8BL8rB,EAAMvtB,KAAkB,MAG5B,GAAwB,IAApButB,EAAM0L,KAAK,KAAY,CACzBvQ,EAAKsE,IAAM,uCACXO,EAAMvtB,KA58BC,GA68BP,MAeF,GATAutB,EAAM8K,QAAU,EAEhBiB,EAAO,CAAE7U,KAAM8I,EAAM8K,SACrB/F,EAAMyG,GApgCC,EAogCgBxL,EAAM0L,KAAM,EAAG1L,EAAMmO,KAAMnO,EAAM4K,QAAS,EAAG5K,EAAM8L,KAAMC,GAGhF/L,EAAM8K,QAAUiB,EAAK7U,KAGjB6N,EAAK,CACP5J,EAAKsE,IAAM,8BACXO,EAAMvtB,KA99BC,GA+9BP,MAcF,GAXAutB,EAAM+K,SAAW,EAGjB/K,EAAM6K,SAAW7K,EAAMuO,QACvBxC,EAAO,CAAE7U,KAAM8I,EAAM+K,UACrBhG,EAAMyG,GAphCE,EAohCgBxL,EAAM0L,KAAM1L,EAAMmO,KAAMnO,EAAMoO,MAAOpO,EAAM6K,SAAU,EAAG7K,EAAM8L,KAAMC,GAG5F/L,EAAM+K,SAAWgB,EAAK7U,KAGlB6N,EAAK,CACP5J,EAAKsE,IAAM,wBACXO,EAAMvtB,KA/+BC,GAg/BP,MAIF,GADAutB,EAAMvtB,KA7/BU,GA8/BZqwB,IAAUpF,GAAW,MAAMoS,EAEjC,KAhgCkB,GAigChB9P,EAAMvtB,KAhgCS,GAkgCjB,KAlgCiB,GAmgCf,GAAI47B,GAAQ,GAAK5B,GAAQ,IAAK,CAE5BtR,EAAKiF,SAAWjlB,EAChBggB,EAAK8E,UAAYwM,EACjBtR,EAAK2F,QAAU4F,EACfvL,EAAK0F,SAAWwN,EAChBrO,EAAMmK,KAAOA,EACbnK,EAAM9I,KAAOA,EAEbyS,GAAQxO,EAAM0O,GAEd1uB,EAAMggB,EAAKiF,SACXF,EAAS/E,EAAK+E,OACduM,EAAOtR,EAAK8E,UACZyG,EAAOvL,EAAK2F,QACZxQ,EAAQ6K,EAAK7K,MACb+d,EAAOlT,EAAK0F,SACZsJ,EAAOnK,EAAMmK,KACbjT,EAAO8I,EAAM9I,KA9hCD,KAiiCR8I,EAAMvtB,OACRutB,EAAMwO,MAAQ,GAEhB,MAGF,IADAxO,EAAMwO,KAAO,EAEXhE,EAAOxK,EAAM4K,QAAQT,GAAS,GAAKnK,EAAM8K,SAAW,GACpDiC,EAAYvC,IAAS,GACrBwC,EAAWxC,IAAS,GAAM,IAC1ByC,EAAkB,MAAPzC,IAEPuC,GAAa7V,IANV,CAQP,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV,GAAI8V,GAAgC,IAAV,IAAVA,GAAuB,CAIrC,IAHAyC,EAAY1C,EACZ2C,EAAU1C,EACV2C,EAAW1C,EAETzC,EAAOxK,EAAM4K,QAAQ+E,IACXxF,GAAS,GAAMsF,EAAYC,GAAY,IAAoCD,IACrF1C,EAAYvC,IAAS,GACrBwC,EAAWxC,IAAS,GAAM,IAC1ByC,EAAkB,MAAPzC,IAENiF,EAAY1C,GAAc7V,IAPxB,CASP,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAIViT,KAAUsF,EACVvY,GAAQuY,EAERzP,EAAMwO,MAAQiB,EAQhB,GALAtF,KAAU4C,EACV7V,GAAQ6V,EAER/M,EAAMwO,MAAQzB,EACd/M,EAAM7rB,OAAS84B,EACC,IAAZD,EAAe,CAIjBhN,EAAMvtB,KA1kCO,GA2kCb,MAEF,GAAc,GAAVu6B,EAAc,CAEhBhN,EAAMwO,MAAQ,EACdxO,EAAMvtB,KA9lCM,GA+lCZ,MAEF,GAAc,GAAVu6B,EAAc,CAChB7R,EAAKsE,IAAM,8BACXO,EAAMvtB,KAjlCC,GAklCP,MAEFutB,EAAMrrB,MAAkB,GAAVq4B,EACdhN,EAAMvtB,KA7lCY,GA+lCpB,KA/lCoB,GAgmClB,GAAIutB,EAAMrrB,MAAO,CAGf,IADA5B,EAAIitB,EAAMrrB,MACHuiB,EAAOnkB,GAAG,CACf,GAAa,IAATs7B,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV8I,EAAM7rB,QAAUg2B,GAAS,GAAKnK,EAAMrrB,OAAS,EAE7Cw1B,KAAUnK,EAAMrrB,MAChBuiB,GAAQ8I,EAAMrrB,MAEdqrB,EAAMwO,MAAQxO,EAAMrrB,MAGtBqrB,EAAMyO,IAAMzO,EAAM7rB,OAClB6rB,EAAMvtB,KAlnCU,GAonClB,KApnCkB,GAqnChB,KACE+3B,EAAOxK,EAAM6K,SAASV,GAAS,GAAKnK,EAAM+K,UAAY,GACtDgC,EAAYvC,IAAS,GACrBwC,EAAWxC,IAAS,GAAM,IAC1ByC,EAAkB,MAAPzC,IAEP,GAAetT,IANZ,CAQP,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV,GAAyB,IAAV,IAAV8V,GAAuB,CAI1B,IAHAyC,EAAY1C,EACZ2C,EAAU1C,EACV2C,EAAW1C,EAETzC,EAAOxK,EAAM6K,SAAS8E,IACZxF,GAAS,GAAMsF,EAAYC,GAAY,IAAoCD,IACrF1C,EAAYvC,IAAS,GACrBwC,EAAWxC,IAAS,GAAM,IAC1ByC,EAAkB,MAAPzC,IAENiF,EAAY1C,GAAc7V,IAPxB,CASP,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAIViT,KAAUsF,EACVvY,GAAQuY,EAERzP,EAAMwO,MAAQiB,EAOhB,GAJAtF,KAAU4C,EACV7V,GAAQ6V,EAER/M,EAAMwO,MAAQzB,EACA,GAAVC,EAAc,CAChB7R,EAAKsE,IAAM,wBACXO,EAAMvtB,KA5pCC,GA6pCP,MAEFutB,EAAMxe,OAASyrB,EACfjN,EAAMrrB,MAAoB,GAAZ,EACdqrB,EAAMvtB,KAvqCa,GAyqCrB,KAzqCqB,GA0qCnB,GAAIutB,EAAMrrB,MAAO,CAGf,IADA5B,EAAIitB,EAAMrrB,MACHuiB,EAAOnkB,GAAG,CACf,GAAa,IAATs7B,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV8I,EAAMxe,QAAU2oB,GAAS,GAAKnK,EAAMrrB,OAAS,EAE7Cw1B,KAAUnK,EAAMrrB,MAChBuiB,GAAQ8I,EAAMrrB,MAEdqrB,EAAMwO,MAAQxO,EAAMrrB,MAGtB,GAAIqrB,EAAMxe,OAASwe,EAAM8J,KAAM,CAC7B3O,EAAKsE,IAAM,gCACXO,EAAMvtB,KAxrCC,GAyrCP,MAIFutB,EAAMvtB,KAlsCW,GAosCnB,KApsCmB,GAqsCjB,GAAa,IAATg6B,EAAc,MAAMqD,EAExB,GADAT,EAAOxF,EAAO4C,EACVzM,EAAMxe,OAAS6tB,EAAM,CAEvB,GADAA,EAAOrP,EAAMxe,OAAS6tB,EAClBA,EAAOrP,EAAMgK,OACXhK,EAAMmL,KAAM,CACdhQ,EAAKsE,IAAM,gCACXO,EAAMvtB,KAvsCH,GAwsCH,MAkBA48B,EAAOrP,EAAMiK,OACfoF,GAAQrP,EAAMiK,MACdS,EAAO1K,EAAM+J,MAAQsF,GAGrB3E,EAAO1K,EAAMiK,MAAQoF,EAEnBA,EAAOrP,EAAM7rB,SAAUk7B,EAAOrP,EAAM7rB,QACxCw2B,EAAc3K,EAAMrqB,YAGpBg1B,EAAczK,EACdwK,EAAOvvB,EAAM6kB,EAAMxe,OACnB6tB,EAAOrP,EAAM7rB,OAEXk7B,EAAO5C,IAAQ4C,EAAO5C,GAC1BA,GAAQ4C,EACRrP,EAAM7rB,QAAUk7B,EAChB,GACEnP,EAAO/kB,KAASwvB,EAAYD,aACnB2E,GACU,IAAjBrP,EAAM7rB,SAAgB6rB,EAAMvtB,KAxvCjB,IAyvCf,MACF,KArvCiB,GAsvCf,GAAa,IAATg6B,EAAc,MAAMqD,EACxB5P,EAAO/kB,KAAS6kB,EAAM7rB,OACtBs4B,IACAzM,EAAMvtB,KA9vCS,GA+vCf,MACF,KA1vCW,GA2vCT,GAAIutB,EAAMe,KAAM,CAEd,KAAO7J,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IAEAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAcV,GAXA2S,GAAQ4C,EACRtR,EAAKkF,WAAawJ,EAClB7J,EAAMgO,OAASnE,EACXA,IACF1O,EAAKkB,MAAQ2D,EAAM+N,MAEd/N,EAAM8N,MAAQlR,GAAQoD,EAAM+N,MAAO7N,EAAQ2J,EAAM1uB,EAAM0uB,GAAQzN,GAAU4D,EAAM+N,MAAO7N,EAAQ2J,EAAM1uB,EAAM0uB,IAGjHA,EAAO4C,GAEFzM,EAAM8N,MAAQ3D,EAAOwD,GAAQxD,MAAWnK,EAAM+N,MAAO,CACxD5S,EAAKsE,IAAM,uBACXO,EAAMvtB,KA/wCD,GAgxCL,MAGF03B,EAAO,EACPjT,EAAO,EAIT8I,EAAMvtB,KA1xCI,GA4xCZ,KA5xCY,GA6xCV,GAAIutB,EAAMe,MAAQf,EAAM8N,MAAO,CAE7B,KAAO5W,EAAO,IAAI,CAChB,GAAa,IAATmX,EAAc,MAAMyB,EACxBzB,IACAlE,GAAQ7Z,EAAMoW,MAAWxP,EACzBA,GAAQ,EAGV,GAAIiT,KAAwB,WAAdnK,EAAMgO,OAAqB,CACvC7S,EAAKsE,IAAM,yBACXO,EAAMvtB,KAtyCD,GAuyCL,MAGF03B,EAAO,EACPjT,EAAO,EAIT8I,EAAMvtB,KAhzCE,GAkzCV,KAlzCU,GAmzCRsyB,EAAMuI,GACN,MAAMwC,EACR,KApzCW,GAqzCT/K,EAAMyI,GACN,MAAMsC,EACR,KAtzCS,GAuzCP,OAAO7R,GACT,KAvzCU,GAyzCV,QACE,OAAOsP,GAyCb,OA3BApS,EAAKiF,SAAWjlB,EAChBggB,EAAK8E,UAAYwM,EACjBtR,EAAK2F,QAAU4F,EACfvL,EAAK0F,SAAWwN,EAChBrO,EAAMmK,KAAOA,EACbnK,EAAM9I,KAAOA,GAGT8I,EAAM+J,OAAUF,IAAS1O,EAAK8E,WAAaD,EAAMvtB,KAl1CtC,KAm1CMutB,EAAMvtB,KAt1CZ,IAs1C4BqwB,IAAUqK,MAC/CgC,GAAahU,EAAMA,EAAK+E,OAAQ/E,EAAKiF,SAAUyJ,EAAO1O,EAAK8E,WAEjE2J,GAAOzO,EAAK0F,SACZgJ,GAAQ1O,EAAK8E,UACb9E,EAAK6F,UAAY4I,EACjBzO,EAAKkF,WAAawJ,EAClB7J,EAAMgO,OAASnE,EACX7J,EAAMe,MAAQ8I,IAChB1O,EAAKkB,MAAQ2D,EAAM+N,MAChB/N,EAAM8N,MAAQlR,GAAQoD,EAAM+N,MAAO7N,EAAQ2J,EAAM1O,EAAKiF,SAAWyJ,GAAQzN,GAAU4D,EAAM+N,MAAO7N,EAAQ2J,EAAM1O,EAAKiF,SAAWyJ,IAEnI1O,EAAKC,UAAY4E,EAAM9I,MAAQ8I,EAAM9F,KAAO,GAAK,IAj3C7B,KAk3CD8F,EAAMvtB,KAAkB,IAAM,IA12C3B,KA22CHutB,EAAMvtB,MAh3CN,KAg3CuButB,EAAMvtB,KAAiB,IAAM,IACzD,IAARm3B,GAAsB,IAATC,GAAe/G,IAAUqK,KAAepI,IAAQsI,KACjEtI,EAAM0I,IAED1I,GAkGRmL,WA9FmB/U,IAElB,IAAKA,IAASA,EAAK6E,MACjB,OAAOuN,GAGT,IAAIvN,EAAQ7E,EAAK6E,MAKjB,OAJIA,EAAMrqB,SACRqqB,EAAMrqB,OAAS,MAEjBwlB,EAAK6E,MAAQ,KACNqN,IAoFR8C,iBAhFwB,CAAChV,EAAMuH,KAG9B,IAAKvH,IAASA,EAAK6E,MAAS,OAAOuN,GACnC,MAAMvN,EAAQ7E,EAAK6E,MACnB,OAAyB,IAAP,EAAbA,EAAMe,MAA0BwM,IAGrCvN,EAAM0C,KAAOA,EACbA,EAAKqN,MAAO,EACL1C,KAuER+C,qBAnE4B,CAACjV,EAAMmL,KAClC,MAAMC,EAAaD,EAAWnyB,OAE9B,IAAI6rB,EACAqQ,EACAtL,EAGJ,OAAK5J,GAAyBA,EAAK6E,OACnCA,EAAQ7E,EAAK6E,MAEM,IAAfA,EAAMe,MAp6CI,KAo6CUf,EAAMvtB,KACrB86B,GAr6CK,KAy6CVvN,EAAMvtB,OACR49B,EAAS,EAETA,EAASjU,GAAUiU,EAAQ/J,EAAYC,EAAY,GAC/C8J,IAAWrQ,EAAM+N,OACZP,IAKXzI,EAAMoK,GAAahU,EAAMmL,EAAYC,EAAYA,GAC7CxB,GACF/E,EAAMvtB,KAj6CK,GAk6CJwrB,KAET+B,EAAM6N,SAAW,EAEVR,MAzB4DE,IA4DpE+C,YAtBiB,sCAgFlB,IAAIC,GApCJ,WAEE16B,KAAK8vB,KAAa,EAElB9vB,KAAKiwB,KAAa,EAElBjwB,KAAKm6B,OAAa,EAElBn6B,KAAKkwB,GAAa,EAElBlwB,KAAKlB,MAAa,KAElBkB,KAAKo6B,UAAa,EAWlBp6B,KAAKhE,KAAa,GAIlBgE,KAAKgwB,QAAa,GAIlBhwB,KAAK+vB,KAAa,EAElB/vB,KAAKk6B,MAAa,GAKpB,MAAMS,GAAax+B,OAAOkB,UAAUg1B,UAMlC9K,WAAYqT,GAAcjT,SAAUkT,GACpC/S,KAAMgT,GAAQ/S,aAAcgT,GAAgB/S,YAAagT,GAAe9S,eAAgB+S,GAAkB9S,aAAc+S,GAAgB9S,YAAa+S,IACnJ7T,GAkFJ,SAAS8T,GAAQt9B,GACfkC,KAAKlC,QAAUmzB,GAAc,CAC3B8B,UAAW,MACX1D,WAAY,GACZgM,GAAI,IACHv9B,GAAW,IAEd,MAAMk1B,EAAMhzB,KAAKlC,QAIbk1B,EAAIC,KAAQD,EAAI3D,YAAc,GAAO2D,EAAI3D,WAAa,KACxD2D,EAAI3D,YAAc2D,EAAI3D,WACC,IAAnB2D,EAAI3D,aAAoB2D,EAAI3D,YAAc,OAI3C2D,EAAI3D,YAAc,GAAO2D,EAAI3D,WAAa,KACzCvxB,GAAWA,EAAQuxB,aACvB2D,EAAI3D,YAAc,IAKf2D,EAAI3D,WAAa,IAAQ2D,EAAI3D,WAAa,IAGf,IAAR,GAAjB2D,EAAI3D,cACP2D,EAAI3D,YAAc,IAItBrvB,KAAK0pB,IAAS,EACd1pB,KAAK4pB,IAAS,GACd5pB,KAAKmzB,OAAS,EACdnzB,KAAKuxB,OAAS,GAEdvxB,KAAKslB,KAAS,IAAI8M,GAClBpyB,KAAKslB,KAAK8E,UAAY,EAEtB,IAAIkE,EAAUmL,GAAUR,aACtBj5B,KAAKslB,KACL0N,EAAI3D,YAGN,GAAIf,IAAWwM,GACb,MAAM,IAAI98B,MAAMkpB,GAASoH,IAQ3B,GALAtuB,KAAKskB,OAAS,IAAIoW,GAElBjB,GAAUa,iBAAiBt6B,KAAKslB,KAAMtlB,KAAKskB,QAGvC0O,EAAIvC,aAEwB,iBAAnBuC,EAAIvC,WACbuC,EAAIvC,WAAamB,GAAmBoB,EAAIvC,YACK,yBAApCkK,GAAW/+B,KAAKo3B,EAAIvC,cAC7BuC,EAAIvC,WAAa,IAAI7xB,WAAWo0B,EAAIvC,aAElCuC,EAAIC,MACN3E,EAASmL,GAAUc,qBAAqBv6B,KAAKslB,KAAM0N,EAAIvC,YACnDnC,IAAWwM,KACb,MAAM,IAAI98B,MAAMkpB,GAASoH,IAqNjC,SAASgN,GAAU7gB,EAAO3c,GACxB,MAAMy9B,EAAW,IAAIH,GAAQt9B,GAK7B,GAHAy9B,EAASh8B,KAAKkb,GAGV8gB,EAAS7R,IAAK,MAAM6R,EAAS3R,KAAO1C,GAASqU,EAAS7R,KAE1D,OAAO6R,EAAS/d,OA9LlB4d,GAAQ/9B,UAAUkC,KAAO,SAAU+L,EAAMkoB,GACvC,MAAMlO,EAAOtlB,KAAKslB,KACZyN,EAAY/yB,KAAKlC,QAAQi1B,UACzBtC,EAAazwB,KAAKlC,QAAQ2yB,WAChC,IAAInC,EAAQmF,EAAa+H,EAEzB,GAAIx7B,KAAKmzB,MAAO,OAAO,EAevB,IAbiCM,EAA7BD,MAAiBA,EAA0BA,GACb,IAAfA,EAAsBqH,GAAaD,GAGxB,yBAA1BD,GAAW/+B,KAAK0P,GAClBga,EAAK7K,MAAQ,IAAI7b,WAAW0M,GAE5Bga,EAAK7K,MAAQnP,EAGfga,EAAK2F,QAAU,EACf3F,EAAK0F,SAAW1F,EAAK7K,MAAMnc,SAElB,CAqBP,IApBuB,IAAnBgnB,EAAK8E,YACP9E,EAAK+E,OAAS,IAAIzrB,WAAWm0B,GAC7BzN,EAAKiF,SAAW,EAChBjF,EAAK8E,UAAY2I,GAGnBzE,EAASmL,GAAUE,QAAQrU,EAAMmO,GAE7BnF,IAAW0M,IAAiBvK,IAC9BnC,EAASmL,GAAUc,qBAAqBjV,EAAMmL,GAE1CnC,IAAWwM,GACbxM,EAASmL,GAAUE,QAAQrU,EAAMmO,GACxBnF,IAAW4M,KAEpB5M,EAAS0M,KAKN1V,EAAK0F,SAAW,GAChBsD,IAAWyM,IACXzV,EAAK6E,MAAMe,KAAO,GACK,IAAvB5f,EAAKga,EAAK2F,UAEfwO,GAAUV,aAAazT,GACvBgJ,EAASmL,GAAUE,QAAQrU,EAAMmO,GAGnC,OAAQnF,GACN,KAAK2M,GACL,KAAKC,GACL,KAAKF,GACL,KAAKG,GAGH,OAFAn7B,KAAK2zB,MAAMrF,GACXtuB,KAAKmzB,OAAQ,GACN,EAOX,GAFAqI,EAAiBlW,EAAK8E,UAElB9E,EAAKiF,WACgB,IAAnBjF,EAAK8E,WAAmBkE,IAAWyM,IAErC,GAAwB,WAApB/6B,KAAKlC,QAAQu9B,GAAiB,CAEhC,IAAII,EAAgB7J,GAAmBtM,EAAK+E,OAAQ/E,EAAKiF,UAErDmR,EAAOpW,EAAKiF,SAAWkR,EACvBE,EAAU/J,GAAmBtM,EAAK+E,OAAQoR,GAG9CnW,EAAKiF,SAAWmR,EAChBpW,EAAK8E,UAAY2I,EAAY2I,EACzBA,GAAMpW,EAAK+E,OAAOrrB,IAAIsmB,EAAK+E,OAAO9F,SAASkX,EAAeA,EAAgBC,GAAO,GAErF17B,KAAK0zB,OAAOiI,QAGZ37B,KAAK0zB,OAAOpO,EAAK+E,OAAO/rB,SAAWgnB,EAAKiF,SAAWjF,EAAK+E,OAAS/E,EAAK+E,OAAO9F,SAAS,EAAGe,EAAKiF,WAMpG,GAAI+D,IAAWwM,IAA6B,IAAnBU,EAAzB,CAGA,GAAIlN,IAAWyM,GAIb,OAHAzM,EAASmL,GAAUY,WAAWr6B,KAAKslB,MACnCtlB,KAAK2zB,MAAMrF,GACXtuB,KAAKmzB,OAAQ,GACN,EAGT,GAAsB,IAAlB7N,EAAK0F,SAAgB,OAG3B,OAAO,GAYToQ,GAAQ/9B,UAAUq2B,OAAS,SAAUlC,GACnCxxB,KAAKuxB,OAAOhyB,KAAKiyB,IAanB4J,GAAQ/9B,UAAUs2B,MAAQ,SAAUrF,GAE9BA,IAAWwM,KACW,WAApB96B,KAAKlC,QAAQu9B,GACfr7B,KAAKwd,OAASxd,KAAKuxB,OAAOqK,KAAK,IAE/B57B,KAAKwd,OAASyT,GAAqBjxB,KAAKuxB,SAG5CvxB,KAAKuxB,OAAS,GACdvxB,KAAK0pB,IAAM4E,EACXtuB,KAAK4pB,IAAM5pB,KAAKslB,KAAKsE,KAgFvB,IAMIiS,GAAc,CACjBT,QAPeA,GAQfzB,QAPiB2B,GAQjBQ,WA1BD,SAAoBrhB,EAAO3c,GAGzB,OAFAA,EAAUA,GAAW,IACbm1B,KAAM,EACPqI,GAAU7gB,EAAO3c,IAwBzBi+B,OAPYT,GAQZhU,UAPiBA,IAUlB,MAAQwL,QAASkJ,GAAWtM,QAASuM,GAAWpI,WAAYqI,GAAchJ,KAAMiJ,IAAWvI,IAEnFwH,QAASgB,GAAWzC,QAAS0C,GAAWP,WAAYQ,GAAcP,OAAQQ,IAAaV,GAI/F,IACIW,GAAcP,GCrhNX,MAAMQ,GAAe,CAAC,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IACpD,GAAW,GACjB,IAAK,IAAIv/B,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC1B,IAAIpB,EAAIoB,EACR,IAAK,IAAIyG,EAAI,EAAGA,EAAI,EAAGA,IACX,EAAJ7H,EACAA,EAAI,WAAcA,IAAM,EAGxBA,KAAU,EAGlB,GAASoB,GAAKpB,EAUX,SAASkrB,GAAI1b,EAAMhN,GACtB,OATe,WACnB,SAAmBo+B,EAAYpxB,EAAMhN,GACjC,IAAIxC,EAAI4gC,EACR,IAAK,IAAIx/B,EAAI,EAAGA,EAAIoB,EAAQpB,IACxBpB,EAAI,GAAyB,KAAfA,EAAIwP,EAAKpO,KAAepB,IAAM,EAEhD,OAAOA,EAGC6gC,CATO,WASerxB,EAAMhN,MAA0B,ECvB3D,IAAIs+B,GASAC,GAKAC,GAKAC,IAlBX,SAAWH,GACPA,EAAUA,EAAmB,SAAK,GAAK,UACvCA,EAAUA,EAAqB,UAAI,GAAK,YACxCA,EAAUA,EAAsB,WAAI,GAAK,aACzCA,EAAUA,EAA0B,eAAI,GAAK,iBAC7CA,EAAUA,EAA2B,gBAAI,GAAK,kBAC9CA,EAAUA,EAA4B,iBAAI,GAAK,mBANnD,CAOGA,KAAcA,GAAY,KAE7B,SAAWC,GACPA,EAAkBA,EAA2B,SAAK,GAAK,UACvDA,EAAkBA,EAA2B,QAAI,GAAK,UAF1D,CAGGA,KAAsBA,GAAoB,KAE7C,SAAWC,GACPA,EAAaA,EAAsB,SAAK,GAAK,UAC7CA,EAAaA,EAAuB,SAAI,GAAK,WAFjD,CAGGA,KAAiBA,GAAe,KAEnC,SAAWC,GACPA,EAAgBA,EAAyB,SAAK,GAAK,UACnDA,EAAgBA,EAA8B,aAAI,GAAK,eACvDA,EAAgBA,EAAuB,MAAI,GAAK,QAHpD,CAIGA,KAAoBA,GAAkB,KCpB3B,IAAIn+B,WAAW,GAA7B,MAEMo+B,GAAS,IAAInO,YAAY,CAAC,MAClB,IAAIjwB,WAAWo+B,GAAO79B,QACL,GCJ/B,MAAM89B,GAAqB,CACvB5X,MAAO,GAEI,MAAM,WAAmB,EACpC,YAAY/Z,EAAMxN,EAAU,IACxBo/B,QACAl9B,KAAKm9B,WAAaP,GAAUQ,QAC5Bp9B,KAAKq9B,aAAelhC,OAAOmhC,OAAO,GAAIL,GAAoBn/B,EAAQy/B,MAClEv9B,KAAKw9B,KAAOx9B,KAAKy9B,WAAWnyB,GAC5BtL,KAAK09B,eAET,SAKI,OAJA19B,KAAK29B,kBACL39B,KAAK49B,aACL59B,KAAK69B,aACL79B,KAAK89B,aACE99B,KAAK+9B,UAGhB,kBACI/9B,KAAKue,WAAWke,IAGpB,aACIz8B,KAAKg+B,YAAY,IACjBh+B,KAAKi+B,WAAW,QAChBj+B,KAAKg+B,YAAYh+B,KAAKw9B,KAAK33B,OAC3B7F,KAAKg+B,YAAYh+B,KAAKw9B,KAAK13B,QAC3B9F,KAAKk+B,UAAUl+B,KAAKw9B,KAAKtb,OACzBliB,KAAKk+B,UAAUl+B,KAAKm9B,YACpBn9B,KAAKk+B,UAAUrB,GAAkBsB,SACjCn+B,KAAKk+B,UAAUpB,GAAasB,UAC5Bp+B,KAAKk+B,UAAUnB,GAAgBsB,cAC/Br+B,KAAKs+B,SAAS,IAGlB,aACIt+B,KAAKg+B,YAAY,GACjBh+B,KAAKi+B,WAAW,QAChBj+B,KAAKs+B,SAAS,GAGlB,WAAWhzB,GACPtL,KAAKg+B,YAAY1yB,EAAKhN,QACtB0B,KAAKi+B,WAAW,QAChBj+B,KAAKue,WAAWjT,GAChBtL,KAAKs+B,SAAShzB,EAAKhN,OAAS,GAEhC,aACI,MAAM,MAAEuH,EAAK,OAAEC,EAAM,SAAEy4B,EAAQ,MAAErc,EAAK,KAAE5W,GAAStL,KAAKw9B,KAChDgB,EAAeD,EAAW14B,EAC1B44B,GAAU,IAAI,GAAWf,eAC/B,IAAI/xB,EAAS,EACb,IAAK,IAAIlQ,EAAI,EAAGA,EAAIqK,EAAQrK,IAGxB,GAFAgjC,EAAQP,UAAU,GAEJ,IAAVhc,EACAvW,EAAS+yB,GAAepzB,EAAMmzB,EAASD,EAAc7yB,OAEpD,IAAc,KAAVuW,EAIL,MAAM,IAAIlkB,MAAM,eAHhB2N,EAASgzB,GAAgBrzB,EAAMmzB,EAASD,EAAc7yB,GAM9D,MAAMxM,EAASs/B,EAAQV,UACjBa,EAAa,GAAQz/B,EAAQa,KAAKq9B,cACxCr9B,KAAK6+B,WAAWD,GAEpB,WAAWtzB,GACP,MAAM,UAAEwzB,EAAS,SAAEP,EAAQ,MAAErc,GA0BrC,SAAsB5W,GAClB,MAAM,SAAEizB,EAAW,EAAC,MAAErc,EAAQ,GAAM5W,EACpC,GAAiB,IAAbizB,GAA+B,IAAbA,GAA+B,IAAbA,GAA+B,IAAbA,EACtD,MAAM,IAAI3gC,WAAW,mCAAmC2gC,GAE5D,GAAc,IAAVrc,GAAyB,KAAVA,EACf,MAAM,IAAItkB,WAAW,0BAA0BskB,GAEnD,MAAM6c,EAAc,CAAER,WAAUrc,QAAO4c,UAAWlC,GAAUQ,SAC5D,OAAQmB,GACJ,KAAK,EACDQ,EAAYD,UAAYlC,GAAUoC,iBAClC,MACJ,KAAK,EACDD,EAAYD,UAAYlC,GAAUqC,WAClC,MACJ,KAAK,EACDF,EAAYD,UAAYlC,GAAUsC,UAClC,MACJ,KAAK,EACDH,EAAYD,UAAYlC,GAAUuC,gBAClC,MACJ,QACI,MAAM,IAAInhC,MAAM,kCAExB,OAAO+gC,EAnDoCK,CAAa9zB,GAC9C+zB,EAAM,CACRx5B,MAAOy5B,GAAah0B,EAAKzF,MAAO,SAChCC,OAAQw5B,GAAah0B,EAAKxF,OAAQ,UAClCy4B,SAAUA,EACVjzB,KAAMA,EAAKA,KACX4W,MAAOA,EACP4N,KAAM,IAEV9vB,KAAKm9B,WAAa2B,EAClB,MAAMS,EAAeF,EAAIx5B,MAAQw5B,EAAIv5B,OAASy4B,EAC9C,GAAIc,EAAI/zB,KAAKhN,SAAWihC,EACpB,MAAM,IAAI3hC,WAAW,0BAA0ByhC,EAAI/zB,KAAKhN,oBAAoBihC,KAEhF,OAAOF,EAEX,SAAS/gC,GACL0B,KAAKg+B,YAAYhX,GAAI,IAAIpoB,WAAWoB,KAAKb,OAAQa,KAAKic,WAAajc,KAAK2L,OAASrN,EAAQA,GAASA,KAG1G,SAASghC,GAAa5iC,EAAOV,GACzB,GAAIwjC,OAAOC,UAAU/iC,IAAUA,EAAQ,EACnC,OAAOA,EAEX,MAAM,IAAI40B,UAAat1B,EAAH,+BA6BxB,SAAS0iC,GAAepzB,EAAMmzB,EAASD,EAAc7yB,GACjD,IAAK,IAAI4M,EAAI,EAAGA,EAAIimB,EAAcjmB,IAC9BkmB,EAAQP,UAAU5yB,EAAKK,MAE3B,OAAOA,EAEX,SAASgzB,GAAgBrzB,EAAMmzB,EAASD,EAAc7yB,GAClD,IAAK,IAAI4M,EAAI,EAAGA,EAAIimB,EAAcjmB,IAC9BkmB,EAAQiB,YAAYp0B,EAAKK,MAE7B,OAAOA,EC1IJ,IAAIg0B,GCSJ,SAASC,GAASt0B,GACvB,MAAMu0B,EAAU,IAAIn+B,EACdo+B,EAAcD,EAAQrlB,kBACtBrb,EAAS2gC,EAAOvnB,GAAKunB,EAAOzV,OAC5B0V,EAAYD,EAAOrlB,MAQzB,IAAI6T,EANJuR,EAAQnlB,sBAAsBolB,GAC9BD,EAAQvlB,gBAAgBhP,EAAMA,EAAKhN,OAAQyhC,GAG3C5gC,EAAO+H,EAAI,EAGX,IACEonB,EAASuR,EAAQrkB,WAAWlQ,EAAMA,EAAKhN,OAAQwhC,GAC/C,MAAM59B,GACNosB,EAASpsB,EAGX,GAAc,IAAXosB,EAAc,CACf,MAAM0R,EAAW7gC,EAAOmI,GASxB,MAAO,CAACgnB,SAAQlvB,OC/BDigC,EDuBQ,CACrB/zB,KAAM00B,EACNn6B,MAAO1G,EAAO0G,MACdC,OAAQ3G,EAAO2G,OACfy4B,SAAU,EACVrc,MAAO,GC3BO,IAAI,GAAWmd,EAAKvhC,GACrBG,WAFnB,IAAmBohC,EAAKvhC,EDkCtB,MAAO,CAACwwB,SAAQlvB,MAAOkM,IDxCzB,SAAWq0B,GAIPA,EAAwBA,EAAiC,QAAI,GAAK,UAIlEA,EAAwBA,EAA+B,MAAI,GAAK,QARpE,CASGA,KAA4BA,GAA0B,KGDzD,MAAMM,GAAMlgC,KACNmgC,GAA2B,GAGjC,SAASC,KAEPC,KAGF,SAASA,KAGP,MAAMC,EAAOH,GAAM7O,QACnB,GAAIgP,EAIJ,OAAOA,EAAKzK,MACV,IAAK,cAAe,CAClB,MAAM,SAAC0K,EAAQ,MAAElhC,GAASihC,EAAKE,QAE/B,IAAIC,EACJ,IACEA,EAAiBZ,GAASxgC,GAAOA,MACjC,MAAMsqB,GACN+W,QAAQC,MAAM,0BAA2BhX,EAAK,WAAY2W,EAAKE,SAGjEN,GAAIU,YAAY,CACd/K,KAAM,cACN2K,QAAS,CACPD,WACAlhC,MAAOohC,KAIXL,KAEA,MAGF,QACEA,MAeNF,GAAIW,iBAAiB,UAAYC,IAXjC,IAAsBR,IAYPQ,EAAMv1B,KAXnB40B,GAAM3gC,KAAK8gC,GAOXD","file":"webp.worker.c0cc94110cda650246b2.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","\"use strict\";\n/*\n * Copyright 2017 Sam Thorogood. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n(function (scope) {\n 'use strict';\n // fail early\n if (scope['TextEncoder'] && scope['TextDecoder']) {\n return false;\n }\n /**\n * @constructor\n * @param {string=} utfLabel\n */\n function FastTextEncoder(utfLabel = 'utf-8') {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n }\n Object.defineProperty(FastTextEncoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n /**\n * @param {string} string\n * @param {{stream: boolean}=} options\n * @return {!Uint8Array}\n */\n FastTextEncoder.prototype.encode = function (string, options = { stream: false }) {\n if (options.stream) {\n throw new Error(`Failed to encode: the 'stream' option is unsupported.`);\n }\n let pos = 0;\n const len = string.length;\n const out = [];\n let at = 0; // output position\n let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size\n let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset\n while (pos < len) {\n let value = string.charCodeAt(pos++);\n if (value >= 0xd800 && value <= 0xdbff) {\n // high surrogate\n if (pos < len) {\n const extra = string.charCodeAt(pos);\n if ((extra & 0xfc00) === 0xdc00) {\n ++pos;\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n }\n if (value >= 0xd800 && value <= 0xdbff) {\n continue; // drop lone surrogate\n }\n }\n // expand the buffer if we couldn't write 4 bytes\n if (at + 4 > target.length) {\n tlen += 8; // minimum extra\n tlen *= 1.0 + (pos / string.length) * 2; // take 2x the remaining\n tlen = (tlen >> 3) << 3; // 8 byte offset\n const update = new Uint8Array(tlen);\n update.set(target);\n target = update;\n }\n if ((value & 0xffffff80) === 0) {\n // 1-byte\n target[at++] = value; // ASCII\n continue;\n }\n else if ((value & 0xfffff800) === 0) {\n // 2-byte\n target[at++] = ((value >> 6) & 0x1f) | 0xc0;\n }\n else if ((value & 0xffff0000) === 0) {\n // 3-byte\n target[at++] = ((value >> 12) & 0x0f) | 0xe0;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else if ((value & 0xffe00000) === 0) {\n // 4-byte\n target[at++] = ((value >> 18) & 0x07) | 0xf0;\n target[at++] = ((value >> 12) & 0x3f) | 0x80;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else {\n // FIXME: do we care\n continue;\n }\n target[at++] = (value & 0x3f) | 0x80;\n }\n return target.slice(0, at);\n };\n /**\n * @constructor\n * @param {string=} utfLabel\n * @param {{fatal: boolean}=} options\n */\n function FastTextDecoder(utfLabel = 'utf-8', options = { fatal: false }) {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n if (options.fatal) {\n throw new Error(`Failed to construct 'TextDecoder': the 'fatal' option is unsupported.`);\n }\n }\n Object.defineProperty(FastTextDecoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n Object.defineProperty(FastTextDecoder.prototype, 'fatal', { value: false });\n Object.defineProperty(FastTextDecoder.prototype, 'ignoreBOM', {\n value: false,\n });\n /**\n * @param {(!ArrayBuffer|!ArrayBufferView)} buffer\n * @param {{stream: boolean}=} options\n */\n FastTextDecoder.prototype.decode = function (buffer, options = { stream: false }) {\n if (options['stream']) {\n throw new Error(`Failed to decode: the 'stream' option is unsupported.`);\n }\n const bytes = new Uint8Array(buffer);\n let pos = 0;\n const len = bytes.length;\n const out = [];\n while (pos < len) {\n const byte1 = bytes[pos++];\n if (byte1 === 0) {\n break; // NULL\n }\n if ((byte1 & 0x80) === 0) {\n // 1-byte\n out.push(byte1);\n }\n else if ((byte1 & 0xe0) === 0xc0) {\n // 2-byte\n const byte2 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 6) | byte2);\n }\n else if ((byte1 & 0xf0) === 0xe0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3);\n }\n else if ((byte1 & 0xf8) === 0xf0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n const byte4 = bytes[pos++] & 0x3f;\n // this can be > 0xffff, so possibly generate surrogates\n let codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\n if (codepoint > 0xffff) {\n // codepoint &= ~0x10000;\n codepoint -= 0x10000;\n out.push(((codepoint >>> 10) & 0x3ff) | 0xd800);\n codepoint = 0xdc00 | (codepoint & 0x3ff);\n }\n out.push(codepoint);\n }\n else {\n // FIXME: we're ignoring this\n }\n }\n return String.fromCharCode.apply(null, out);\n };\n scope['TextEncoder'] = FastTextEncoder;\n scope['TextDecoder'] = FastTextDecoder;\n})(typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : this);\n//# sourceMappingURL=text-encoding-polyfill.js.map","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","// eslint-disable-next-line import/no-unassigned-import\nimport './text-encoding-polyfill';\nconst decoder = new TextDecoder('utf-8');\nexport function decode(bytes) {\n return decoder.decode(bytes);\n}\nconst encoder = new TextEncoder();\nexport function encode(str) {\n return encoder.encode(str);\n}\n//# sourceMappingURL=utf8.browser.js.map","import { decode, encode } from './utf8';\nconst defaultByteLength = 1024 * 8;\nexport class IOBuffer {\n /**\n * @param data - The data to construct the IOBuffer with.\n * If data is a number, it will be the new buffer's length
\n * If data is `undefined`, the buffer will be initialized with a default length of 8Kb
\n * If data is an ArrayBuffer, SharedArrayBuffer, an ArrayBufferView (Typed Array), an IOBuffer instance,\n * or a Node.js Buffer, a view will be created over the underlying ArrayBuffer.\n * @param options\n */\n constructor(data = defaultByteLength, options = {}) {\n let dataIsGiven = false;\n if (typeof data === 'number') {\n data = new ArrayBuffer(data);\n }\n else {\n dataIsGiven = true;\n this.lastWrittenByte = data.byteLength;\n }\n const offset = options.offset ? options.offset >>> 0 : 0;\n const byteLength = data.byteLength - offset;\n let dvOffset = offset;\n if (ArrayBuffer.isView(data) || data instanceof IOBuffer) {\n if (data.byteLength !== data.buffer.byteLength) {\n dvOffset = data.byteOffset + offset;\n }\n data = data.buffer;\n }\n if (dataIsGiven) {\n this.lastWrittenByte = byteLength;\n }\n else {\n this.lastWrittenByte = 0;\n }\n this.buffer = data;\n this.length = byteLength;\n this.byteLength = byteLength;\n this.byteOffset = dvOffset;\n this.offset = 0;\n this.littleEndian = true;\n this._data = new DataView(this.buffer, dvOffset, byteLength);\n this._mark = 0;\n this._marks = [];\n }\n /**\n * Checks if the memory allocated to the buffer is sufficient to store more\n * bytes after the offset.\n * @param byteLength - The needed memory in bytes.\n * @returns `true` if there is sufficient space and `false` otherwise.\n */\n available(byteLength = 1) {\n return this.offset + byteLength <= this.length;\n }\n /**\n * Check if little-endian mode is used for reading and writing multi-byte\n * values.\n * @returns `true` if little-endian mode is used, `false` otherwise.\n */\n isLittleEndian() {\n return this.littleEndian;\n }\n /**\n * Set little-endian mode for reading and writing multi-byte values.\n */\n setLittleEndian() {\n this.littleEndian = true;\n return this;\n }\n /**\n * Check if big-endian mode is used for reading and writing multi-byte values.\n * @returns `true` if big-endian mode is used, `false` otherwise.\n */\n isBigEndian() {\n return !this.littleEndian;\n }\n /**\n * Switches to big-endian mode for reading and writing multi-byte values.\n */\n setBigEndian() {\n this.littleEndian = false;\n return this;\n }\n /**\n * Move the pointer n bytes forward.\n * @param n - Number of bytes to skip.\n */\n skip(n = 1) {\n this.offset += n;\n return this;\n }\n /**\n * Move the pointer to the given offset.\n * @param offset\n */\n seek(offset) {\n this.offset = offset;\n return this;\n }\n /**\n * Store the current pointer offset.\n * @see {@link IOBuffer#reset}\n */\n mark() {\n this._mark = this.offset;\n return this;\n }\n /**\n * Move the pointer back to the last pointer offset set by mark.\n * @see {@link IOBuffer#mark}\n */\n reset() {\n this.offset = this._mark;\n return this;\n }\n /**\n * Push the current pointer offset to the mark stack.\n * @see {@link IOBuffer#popMark}\n */\n pushMark() {\n this._marks.push(this.offset);\n return this;\n }\n /**\n * Pop the last pointer offset from the mark stack, and set the current\n * pointer offset to the popped value.\n * @see {@link IOBuffer#pushMark}\n */\n popMark() {\n const offset = this._marks.pop();\n if (offset === undefined) {\n throw new Error('Mark stack empty');\n }\n this.seek(offset);\n return this;\n }\n /**\n * Move the pointer offset back to 0.\n */\n rewind() {\n this.offset = 0;\n return this;\n }\n /**\n * Make sure the buffer has sufficient memory to write a given byteLength at\n * the current pointer offset.\n * If the buffer's memory is insufficient, this method will create a new\n * buffer (a copy) with a length that is twice (byteLength + current offset).\n * @param byteLength\n */\n ensureAvailable(byteLength = 1) {\n if (!this.available(byteLength)) {\n const lengthNeeded = this.offset + byteLength;\n const newLength = lengthNeeded * 2;\n const newArray = new Uint8Array(newLength);\n newArray.set(new Uint8Array(this.buffer));\n this.buffer = newArray.buffer;\n this.length = this.byteLength = newLength;\n this._data = new DataView(this.buffer);\n }\n return this;\n }\n /**\n * Read a byte and return false if the byte's value is 0, or true otherwise.\n * Moves pointer forward by one byte.\n */\n readBoolean() {\n return this.readUint8() !== 0;\n }\n /**\n * Read a signed 8-bit integer and move pointer forward by 1 byte.\n */\n readInt8() {\n return this._data.getInt8(this.offset++);\n }\n /**\n * Read an unsigned 8-bit integer and move pointer forward by 1 byte.\n */\n readUint8() {\n return this._data.getUint8(this.offset++);\n }\n /**\n * Alias for {@link IOBuffer#readUint8}.\n */\n readByte() {\n return this.readUint8();\n }\n /**\n * Read `n` bytes and move pointer forward by `n` bytes.\n */\n readBytes(n = 1) {\n const bytes = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n bytes[i] = this.readByte();\n }\n return bytes;\n }\n /**\n * Read a 16-bit signed integer and move pointer forward by 2 bytes.\n */\n readInt16() {\n const value = this._data.getInt16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 16-bit unsigned integer and move pointer forward by 2 bytes.\n */\n readUint16() {\n const value = this._data.getUint16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 32-bit signed integer and move pointer forward by 4 bytes.\n */\n readInt32() {\n const value = this._data.getInt32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit unsigned integer and move pointer forward by 4 bytes.\n */\n readUint32() {\n const value = this._data.getUint32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit floating number and move pointer forward by 4 bytes.\n */\n readFloat32() {\n const value = this._data.getFloat32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 64-bit floating number and move pointer forward by 8 bytes.\n */\n readFloat64() {\n const value = this._data.getFloat64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 1-byte ASCII character and move pointer forward by 1 byte.\n */\n readChar() {\n return String.fromCharCode(this.readInt8());\n }\n /**\n * Read `n` 1-byte ASCII characters and move pointer forward by `n` bytes.\n */\n readChars(n = 1) {\n let result = '';\n for (let i = 0; i < n; i++) {\n result += this.readChar();\n }\n return result;\n }\n /**\n * Read the next `n` bytes, return a UTF-8 decoded string and move pointer\n * forward by `n` bytes.\n */\n readUtf8(n = 1) {\n return decode(this.readBytes(n));\n }\n /**\n * Write 0xff if the passed value is truthy, 0x00 otherwise and move pointer\n * forward by 1 byte.\n */\n writeBoolean(value) {\n this.writeUint8(value ? 0xff : 0x00);\n return this;\n }\n /**\n * Write `value` as an 8-bit signed integer and move pointer forward by 1 byte.\n */\n writeInt8(value) {\n this.ensureAvailable(1);\n this._data.setInt8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as an 8-bit unsigned integer and move pointer forward by 1\n * byte.\n */\n writeUint8(value) {\n this.ensureAvailable(1);\n this._data.setUint8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * An alias for {@link IOBuffer#writeUint8}.\n */\n writeByte(value) {\n return this.writeUint8(value);\n }\n /**\n * Write all elements of `bytes` as uint8 values and move pointer forward by\n * `bytes.length` bytes.\n */\n writeBytes(bytes) {\n this.ensureAvailable(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n this._data.setUint8(this.offset++, bytes[i]);\n }\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit signed integer and move pointer forward by 2\n * bytes.\n */\n writeInt16(value) {\n this.ensureAvailable(2);\n this._data.setInt16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit unsigned integer and move pointer forward by 2\n * bytes.\n */\n writeUint16(value) {\n this.ensureAvailable(2);\n this._data.setUint16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit signed integer and move pointer forward by 4\n * bytes.\n */\n writeInt32(value) {\n this.ensureAvailable(4);\n this._data.setInt32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit unsigned integer and move pointer forward by 4\n * bytes.\n */\n writeUint32(value) {\n this.ensureAvailable(4);\n this._data.setUint32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit floating number and move pointer forward by 4\n * bytes.\n */\n writeFloat32(value) {\n this.ensureAvailable(4);\n this._data.setFloat32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit floating number and move pointer forward by 8\n * bytes.\n */\n writeFloat64(value) {\n this.ensureAvailable(8);\n this._data.setFloat64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write the charCode of `str`'s first character as an 8-bit unsigned integer\n * and move pointer forward by 1 byte.\n */\n writeChar(str) {\n return this.writeUint8(str.charCodeAt(0));\n }\n /**\n * Write the charCodes of all `str`'s characters as 8-bit unsigned integers\n * and move pointer forward by `str.length` bytes.\n */\n writeChars(str) {\n for (let i = 0; i < str.length; i++) {\n this.writeUint8(str.charCodeAt(i));\n }\n return this;\n }\n /**\n * UTF-8 encode and write `str` to the current pointer offset and move pointer\n * forward according to the encoded length.\n */\n writeUtf8(str) {\n return this.writeBytes(encode(str));\n }\n /**\n * Export a Uint8Array view of the internal buffer.\n * The view starts at the byte offset and its length\n * is calculated to stop at the last written byte or the original length.\n */\n toArray() {\n return new Uint8Array(this.buffer, this.byteOffset, this.lastWrittenByte);\n }\n /**\n * Update the last written byte offset\n * @private\n */\n _updateLastWrittenByte() {\n if (this.offset > this.lastWrittenByte) {\n this.lastWrittenByte = this.offset;\n }\n }\n}\n//# sourceMappingURL=IOBuffer.js.map","\n/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES = 30;\n/* number of distance codes */\n\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\n\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) =>\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n const next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nconst copy_block = (s, buf, len, header) =>\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n s.pending_buf.set(s.window.subarray(buf, buf + len), s.pending);\n s.pending += len;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) =>\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let lx = 0; /* running index in l_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) =>\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let black_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nconst _tr_flush_block = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally = (s, dist, lc) =>\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //let out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n};\n\nvar _tr_init_1 = _tr_init;\nvar _tr_stored_block_1 = _tr_stored_block;\nvar _tr_flush_block_1 = _tr_flush_block;\nvar _tr_tally_1 = _tr_tally;\nvar _tr_align_1 = _tr_align;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init: _tr_init$1, _tr_stored_block: _tr_stored_block$1, _tr_flush_block: _tr_flush_block$1, _tr_tally: _tr_tally$1, _tr_align: _tr_align$1 } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_PARTIAL_FLUSH, Z_FULL_FLUSH, Z_FINISH, Z_BLOCK,\n Z_OK, Z_STREAM_END, Z_STREAM_ERROR, Z_DATA_ERROR, Z_BUF_ERROR,\n Z_DEFAULT_COMPRESSION,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED: Z_FIXED$1, Z_DEFAULT_STRATEGY,\n Z_UNKNOWN: Z_UNKNOWN$1,\n Z_DEFLATED\n} = constants;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES$1 = 30;\n/* number of distance codes */\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH$1 + MIN_MATCH$1 + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42;\nconst EXTRA_STATE = 69;\nconst NAME_STATE = 73;\nconst COMMENT_STATE = 91;\nconst HCRC_STATE = 103;\nconst BUSY_STATE = 113;\nconst FINISH_STATE = 666;\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero$1 = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block$1(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH$1;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH$1 - (strend - scan);\n scan = strend - MAX_MATCH$1;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH$1) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH$1 - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH$1) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n let max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n const max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n};\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH$1) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH$1) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally$1(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$1);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$1) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH$1 - 1)) ? s.strstart : MIN_MATCH$1 - 1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH$1) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH$1 - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH$1 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH$1 - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH$1 && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH$1;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally$1(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$1);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH$1 - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH$1 - 1 ? s.strstart : MIN_MATCH$1 - 1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH$1) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH$1 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH$1 && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH$1;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH$1 - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH$1) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally$1(s, 1, s.match_length - MIN_MATCH$1);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero$1(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH$1 - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE$1 * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES$1 + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES$1 + 1) * 2);\n zero$1(this.dyn_ltree);\n zero$1(this.dyn_dtree);\n zero$1(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES$1 + 1); /* heap used to build the Huffman trees */\n zero$1(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES$1 + 1); //uch depth[2*L_CODES+1];\n zero$1(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nconst deflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN$1;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n _tr_init$1(s);\n return Z_OK;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED$1) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH$1 - 1) / MIN_MATCH$1);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n};\n\n\nconst deflate = (strm, flush) => {\n\n let beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n let header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n let bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align$1(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block$1(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero$1(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n const status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero$1(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH$1) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH$1 - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH$1 - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH$1 - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH$1 - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2 = deflate;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n let i, out;\n const len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$1,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION$1,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY$1\n }, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK$1) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$1) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$1 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH$1) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$1) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$1;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$1) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1 = Deflate;\nvar deflate_2$1 = deflate$1;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar constants$1 = constants;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_2$1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD = 30; /* got a data error -- remain here until reset */\nconst TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n// let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$2, Z_BLOCK: Z_BLOCK$1, Z_TREES,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2, Z_NEED_DICT, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 1; /* i: waiting for magic header */\nconst FLAGS = 2; /* i: waiting for method and flags (gzip) */\nconst TIME = 3; /* i: waiting for modification time (gzip) */\nconst OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 5; /* i: waiting for extra length (gzip) */\nconst EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nconst NAME = 7; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 8; /* i: waiting for end of comment (gzip) */\nconst HCRC = 9; /* i: waiting for header crc (gzip) */\nconst DICTID = 10; /* i: waiting for dictionary check value */\nconst DICT = 11; /* waiting for inflateSetDictionary() call */\nconst TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 14; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 17; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 18; /* i: waiting for code length code lengths */\nconst CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 20; /* i: same as LEN below, but only first time in */\nconst LEN = 21; /* i: waiting for length/lit/eob code */\nconst LENEXT = 22; /* i: waiting for length extra bits */\nconst DIST = 23; /* i: waiting for distance code */\nconst DISTEXT = 24; /* i: waiting for distance extra bits */\nconst MATCH = 25; /* o: waiting for output space to copy string */\nconst LIT = 26; /* o: waiting for output space to write literal */\nconst CHECK = 27; /* i: waiting for 32-bit check value */\nconst LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 29; /* finished check, done -- remain here until reset */\nconst BAD$1 = 30; /* got a data error -- remain here until reset */\nconst MEM = 31; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS$1;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS$1);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS$1);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$2;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$2) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS$1, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS$1, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE$1) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$2;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD$1;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$2) {\n strm.msg = 'unknown compression method';\n state.mode = BAD$1;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD$1;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE$1;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED$2) {\n strm.msg = 'unknown compression method';\n state.mode = BAD$1;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD$1;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE$1;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE$1;\n /* falls through */\n case TYPE$1:\n if (flush === Z_BLOCK$1 || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD$1;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD$1;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE$1;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD$1;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES$1, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD$1;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD$1;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD$1;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD$1) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD$1;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS$1, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD$1;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS$1, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD$1;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE$1) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE$1;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$2;\n break inf_leave;\n case BAD$1:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$1 &&\n (state.mode < CHECK || flush !== Z_FINISH$2))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE$1 ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$2) && ret === Z_OK$2) {\n ret = Z_BUF_ERROR$1;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$2;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$2;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$2;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2 = inflate;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\n*/\n\nvar inflate_1 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_FINISH: Z_FINISH$3,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_MEM_ERROR: Z_MEM_ERROR$1\n} = constants;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK$3) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK$3) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$3 : Z_NO_FLUSH$2;\n\n // Convert data if needed\n if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT$1 && dictionary) {\n status = inflate_1.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK$3) {\n status = inflate_1.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR$2) {\n // Replace code with more verbose\n status = Z_NEED_DICT$1;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END$3 &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1.inflateReset(strm);\n status = inflate_1.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR$2:\n case Z_DATA_ERROR$2:\n case Z_NEED_DICT$1:\n case Z_MEM_ERROR$1:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END$3) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK$3 && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END$3) {\n status = inflate_1.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$3) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1 = Inflate;\nvar inflate_2$1 = inflate$1;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip = inflate$1;\nvar constants$2 = constants;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1,\n\tinflate: inflate_2$1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip,\n\tconstants: constants$2\n};\n\nconst { Deflate: Deflate$1, deflate: deflate$2, deflateRaw: deflateRaw$1, gzip: gzip$1 } = deflate_1$1;\n\nconst { Inflate: Inflate$1, inflate: inflate$2, inflateRaw: inflateRaw$1, ungzip: ungzip$1 } = inflate_1$1;\n\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_1$2 = deflate$2;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar Inflate_1$1 = Inflate$1;\nvar inflate_1$2 = inflate$2;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip_1 = ungzip$1;\nvar constants_1 = constants;\n\nvar pako = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_1$2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tInflate: Inflate_1$1,\n\tinflate: inflate_1$2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport default pako;\nexport { Deflate_1$1 as Deflate, Inflate_1$1 as Inflate, constants_1 as constants, deflate_1$2 as deflate, deflateRaw_1$1 as deflateRaw, gzip_1$1 as gzip, inflate_1$2 as inflate, inflateRaw_1$1 as inflateRaw, ungzip_1 as ungzip };\n","export const pngSignature = [137, 80, 78, 71, 13, 10, 26, 10];\nconst crcTable = [];\nfor (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n if (c & 1) {\n c = 0xedb88320 ^ (c >>> 1);\n }\n else {\n c = c >>> 1;\n }\n }\n crcTable[n] = c;\n}\nconst initialCrc = 0xffffffff;\nfunction updateCrc(currentCrc, data, length) {\n let c = currentCrc;\n for (let n = 0; n < length; n++) {\n c = crcTable[(c ^ data[n]) & 0xff] ^ (c >>> 8);\n }\n return c;\n}\nexport function crc(data, length) {\n return (updateCrc(initialCrc, data, length) ^ initialCrc) >>> 0;\n}\n//# sourceMappingURL=common.js.map","export var ColorType;\n(function (ColorType) {\n ColorType[ColorType[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n ColorType[ColorType[\"GREYSCALE\"] = 0] = \"GREYSCALE\";\n ColorType[ColorType[\"TRUECOLOUR\"] = 2] = \"TRUECOLOUR\";\n ColorType[ColorType[\"INDEXED_COLOUR\"] = 3] = \"INDEXED_COLOUR\";\n ColorType[ColorType[\"GREYSCALE_ALPHA\"] = 4] = \"GREYSCALE_ALPHA\";\n ColorType[ColorType[\"TRUECOLOUR_ALPHA\"] = 6] = \"TRUECOLOUR_ALPHA\";\n})(ColorType || (ColorType = {}));\nexport var CompressionMethod;\n(function (CompressionMethod) {\n CompressionMethod[CompressionMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n CompressionMethod[CompressionMethod[\"DEFLATE\"] = 0] = \"DEFLATE\";\n})(CompressionMethod || (CompressionMethod = {}));\nexport var FilterMethod;\n(function (FilterMethod) {\n FilterMethod[FilterMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n FilterMethod[FilterMethod[\"ADAPTIVE\"] = 0] = \"ADAPTIVE\";\n})(FilterMethod || (FilterMethod = {}));\nexport var InterlaceMethod;\n(function (InterlaceMethod) {\n InterlaceMethod[InterlaceMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n InterlaceMethod[InterlaceMethod[\"NO_INTERLACE\"] = 0] = \"NO_INTERLACE\";\n InterlaceMethod[InterlaceMethod[\"ADAM7\"] = 1] = \"ADAM7\";\n})(InterlaceMethod || (InterlaceMethod = {}));\n//# sourceMappingURL=internalTypes.js.map","import { IOBuffer } from 'iobuffer';\nimport { Inflate as Inflator } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst empty = new Uint8Array(0);\nconst NULL = '\\0';\nconst uint16 = new Uint16Array([0x00ff]);\nconst uint8 = new Uint8Array(uint16.buffer);\nconst osIsLittleEndian = uint8[0] === 0xff;\nexport default class PNGDecoder extends IOBuffer {\n constructor(data, options = {}) {\n super(data);\n const { checkCrc = false } = options;\n this._checkCrc = checkCrc;\n this._inflator = new Inflator();\n this._png = {\n width: -1,\n height: -1,\n channels: -1,\n data: new Uint8Array(0),\n depth: 1,\n text: {},\n };\n this._end = false;\n this._hasPalette = false;\n this._palette = [];\n this._compressionMethod = CompressionMethod.UNKNOWN;\n this._filterMethod = FilterMethod.UNKNOWN;\n this._interlaceMethod = InterlaceMethod.UNKNOWN;\n this._colorType = -1;\n // PNG is always big endian\n // https://www.w3.org/TR/PNG/#7Integers-and-byte-order\n this.setBigEndian();\n }\n decode() {\n this.decodeSignature();\n while (!this._end) {\n this.decodeChunk();\n }\n this.decodeImage();\n return this._png;\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n decodeSignature() {\n for (let i = 0; i < pngSignature.length; i++) {\n if (this.readUint8() !== pngSignature[i]) {\n throw new Error(`wrong PNG signature. Byte at ${i} should be ${pngSignature[i]}.`);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#5Chunk-layout\n decodeChunk() {\n const length = this.readUint32();\n const type = this.readChars(4);\n const offset = this.offset;\n switch (type) {\n // 11.2 Critical chunks\n case 'IHDR': // 11.2.2 IHDR Image header\n this.decodeIHDR();\n break;\n case 'PLTE': // 11.2.3 PLTE Palette\n this.decodePLTE(length);\n break;\n case 'IDAT': // 11.2.4 IDAT Image data\n this.decodeIDAT(length);\n break;\n case 'IEND': // 11.2.5 IEND Image trailer\n this._end = true;\n break;\n // 11.3 Ancillary chunks\n case 'tRNS': // 11.3.2.1 tRNS Transparency\n this.decodetRNS(length);\n break;\n case 'tEXt': // 11.3.4.3 tEXt Textual data\n this.decodetEXt(length);\n break;\n case 'pHYs': // 11.3.5.3 pHYs Physical pixel dimensions\n this.decodepHYs();\n break;\n default:\n this.skip(length);\n break;\n }\n if (this.offset - offset !== length) {\n throw new Error(`Length mismatch while decoding chunk ${type}`);\n }\n if (this._checkCrc) {\n const expectedCrc = this.readUint32();\n const crcLength = length + 4; // includes type\n const actualCrc = crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - crcLength - 4, crcLength), crcLength); // \"- 4\" because we already advanced by reading the CRC\n if (actualCrc !== expectedCrc) {\n throw new Error(`CRC mismatch for chunk ${type}. Expected ${expectedCrc}, found ${actualCrc}`);\n }\n }\n else {\n this.skip(4);\n }\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n decodeIHDR() {\n const image = this._png;\n image.width = this.readUint32();\n image.height = this.readUint32();\n image.depth = checkBitDepth(this.readUint8());\n const colorType = this.readUint8();\n this._colorType = colorType;\n let channels;\n switch (colorType) {\n case ColorType.GREYSCALE:\n channels = 1;\n break;\n case ColorType.TRUECOLOUR:\n channels = 3;\n break;\n case ColorType.INDEXED_COLOUR:\n channels = 1;\n break;\n case ColorType.GREYSCALE_ALPHA:\n channels = 2;\n break;\n case ColorType.TRUECOLOUR_ALPHA:\n channels = 4;\n break;\n default:\n throw new Error(`Unknown color type: ${colorType}`);\n }\n this._png.channels = channels;\n this._compressionMethod = this.readUint8();\n if (this._compressionMethod !== CompressionMethod.DEFLATE) {\n throw new Error(`Unsupported compression method: ${this._compressionMethod}`);\n }\n this._filterMethod = this.readUint8();\n this._interlaceMethod = this.readUint8();\n }\n // https://www.w3.org/TR/PNG/#11PLTE\n decodePLTE(length) {\n if (length % 3 !== 0) {\n throw new RangeError(`PLTE field length must be a multiple of 3. Got ${length}`);\n }\n const l = length / 3;\n this._hasPalette = true;\n const palette = [];\n this._palette = palette;\n for (let i = 0; i < l; i++) {\n palette.push([this.readUint8(), this.readUint8(), this.readUint8()]);\n }\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n decodeIDAT(length) {\n this._inflator.push(new Uint8Array(this.buffer, this.offset + this.byteOffset, length));\n this.skip(length);\n }\n // https://www.w3.org/TR/PNG/#11tRNS\n decodetRNS(length) {\n // TODO: support other color types.\n if (this._colorType === 3) {\n if (length > this._palette.length) {\n throw new Error(`tRNS chunk contains more alpha values than there are palette colors (${length} vs ${this._palette.length})`);\n }\n let i = 0;\n for (; i < length; i++) {\n const alpha = this.readByte();\n this._palette[i].push(alpha);\n }\n for (; i < this._palette.length; i++) {\n this._palette[i].push(255);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#11tEXt\n decodetEXt(length) {\n let keyword = '';\n let char;\n while ((char = this.readChar()) !== NULL) {\n keyword += char;\n }\n this._png.text[keyword] = this.readChars(length - keyword.length - 1);\n }\n // https://www.w3.org/TR/PNG/#11pHYs\n decodepHYs() {\n const ppuX = this.readUint32();\n const ppuY = this.readUint32();\n const unitSpecifier = this.readByte();\n this._png.resolution = { x: ppuX, y: ppuY, unit: unitSpecifier };\n }\n decodeImage() {\n if (this._inflator.err) {\n throw new Error(`Error while decompressing the data: ${this._inflator.err}`);\n }\n const data = this._inflator.result;\n if (this._filterMethod !== FilterMethod.ADAPTIVE) {\n throw new Error(`Filter method ${this._filterMethod} not supported`);\n }\n if (this._interlaceMethod === InterlaceMethod.NO_INTERLACE) {\n this.decodeInterlaceNull(data);\n }\n else {\n throw new Error(`Interlace method ${this._interlaceMethod} not supported`);\n }\n }\n decodeInterlaceNull(data) {\n const height = this._png.height;\n const bytesPerPixel = (this._png.channels * this._png.depth) / 8;\n const bytesPerLine = this._png.width * bytesPerPixel;\n const newData = new Uint8Array(this._png.height * bytesPerLine);\n let prevLine = empty;\n let offset = 0;\n let currentLine;\n let newLine;\n for (let i = 0; i < height; i++) {\n currentLine = data.subarray(offset + 1, offset + 1 + bytesPerLine);\n newLine = newData.subarray(i * bytesPerLine, (i + 1) * bytesPerLine);\n switch (data[offset]) {\n case 0:\n unfilterNone(currentLine, newLine, bytesPerLine);\n break;\n case 1:\n unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel);\n break;\n case 2:\n unfilterUp(currentLine, newLine, prevLine, bytesPerLine);\n break;\n case 3:\n unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n case 4:\n unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n default:\n throw new Error(`Unsupported filter: ${data[offset]}`);\n }\n prevLine = newLine;\n offset += bytesPerLine + 1;\n }\n if (this._hasPalette) {\n this._png.palette = this._palette;\n }\n if (this._png.depth === 16) {\n const uint16Data = new Uint16Array(newData.buffer);\n if (osIsLittleEndian) {\n for (let k = 0; k < uint16Data.length; k++) {\n // PNG is always big endian. Swap the bytes.\n uint16Data[k] = swap16(uint16Data[k]);\n }\n }\n this._png.data = uint16Data;\n }\n else {\n this._png.data = newData;\n }\n }\n}\nfunction unfilterNone(currentLine, newLine, bytesPerLine) {\n for (let i = 0; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n}\nfunction unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n for (; i < bytesPerPixel; i++) {\n // just copy first bytes\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n}\nfunction unfilterUp(currentLine, newLine, prevLine, bytesPerLine) {\n let i = 0;\n if (prevLine.length === 0) {\n // just copy bytes for first line\n for (; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n }\n else {\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n }\n}\nfunction unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + (newLine[i - bytesPerPixel] >> 1)) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + (prevLine[i] >> 1)) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] + ((newLine[i - bytesPerPixel] + prevLine[i]) >> 1)) &\n 0xff;\n }\n }\n}\nfunction unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] +\n paethPredictor(newLine[i - bytesPerPixel], prevLine[i], prevLine[i - bytesPerPixel])) &\n 0xff;\n }\n }\n}\nfunction paethPredictor(a, b, c) {\n const p = a + b - c;\n const pa = Math.abs(p - a);\n const pb = Math.abs(p - b);\n const pc = Math.abs(p - c);\n if (pa <= pb && pa <= pc)\n return a;\n else if (pb <= pc)\n return b;\n else\n return c;\n}\nfunction swap16(val) {\n return ((val & 0xff) << 8) | ((val >> 8) & 0xff);\n}\nfunction checkBitDepth(value) {\n if (value !== 1 &&\n value !== 2 &&\n value !== 4 &&\n value !== 8 &&\n value !== 16) {\n throw new Error(`invalid bit depth: ${value}`);\n }\n return value;\n}\n//# sourceMappingURL=PNGDecoder.js.map","import { IOBuffer } from 'iobuffer';\nimport { deflate } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst defaultZlibOptions = {\n level: 3,\n};\nexport default class PNGEncoder extends IOBuffer {\n constructor(data, options = {}) {\n super();\n this._colorType = ColorType.UNKNOWN;\n this._zlibOptions = Object.assign({}, defaultZlibOptions, options.zlib);\n this._png = this._checkData(data);\n this.setBigEndian();\n }\n encode() {\n this.encodeSignature();\n this.encodeIHDR();\n this.encodeData();\n this.encodeIEND();\n return this.toArray();\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n encodeSignature() {\n this.writeBytes(pngSignature);\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n encodeIHDR() {\n this.writeUint32(13);\n this.writeChars('IHDR');\n this.writeUint32(this._png.width);\n this.writeUint32(this._png.height);\n this.writeByte(this._png.depth);\n this.writeByte(this._colorType);\n this.writeByte(CompressionMethod.DEFLATE);\n this.writeByte(FilterMethod.ADAPTIVE);\n this.writeByte(InterlaceMethod.NO_INTERLACE);\n this.writeCrc(17);\n }\n // https://www.w3.org/TR/PNG/#11IEND\n encodeIEND() {\n this.writeUint32(0);\n this.writeChars('IEND');\n this.writeCrc(4);\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n encodeIDAT(data) {\n this.writeUint32(data.length);\n this.writeChars('IDAT');\n this.writeBytes(data);\n this.writeCrc(data.length + 4);\n }\n encodeData() {\n const { width, height, channels, depth, data } = this._png;\n const slotsPerLine = channels * width;\n const newData = new IOBuffer().setBigEndian();\n let offset = 0;\n for (let i = 0; i < height; i++) {\n newData.writeByte(0); // no filter\n /* istanbul ignore else */\n if (depth === 8) {\n offset = writeDataBytes(data, newData, slotsPerLine, offset);\n }\n else if (depth === 16) {\n offset = writeDataUint16(data, newData, slotsPerLine, offset);\n }\n else {\n throw new Error('unreachable');\n }\n }\n const buffer = newData.toArray();\n const compressed = deflate(buffer, this._zlibOptions);\n this.encodeIDAT(compressed);\n }\n _checkData(data) {\n const { colorType, channels, depth } = getColorType(data);\n const png = {\n width: checkInteger(data.width, 'width'),\n height: checkInteger(data.height, 'height'),\n channels: channels,\n data: data.data,\n depth: depth,\n text: {},\n };\n this._colorType = colorType;\n const expectedSize = png.width * png.height * channels;\n if (png.data.length !== expectedSize) {\n throw new RangeError(`wrong data size. Found ${png.data.length}, expected ${expectedSize}`);\n }\n return png;\n }\n writeCrc(length) {\n this.writeUint32(crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - length, length), length));\n }\n}\nfunction checkInteger(value, name) {\n if (Number.isInteger(value) && value > 0) {\n return value;\n }\n throw new TypeError(`${name} must be a positive integer`);\n}\nfunction getColorType(data) {\n const { channels = 4, depth = 8 } = data;\n if (channels !== 4 && channels !== 3 && channels !== 2 && channels !== 1) {\n throw new RangeError(`unsupported number of channels: ${channels}`);\n }\n if (depth !== 8 && depth !== 16) {\n throw new RangeError(`unsupported bit depth: ${depth}`);\n }\n const returnValue = { channels, depth, colorType: ColorType.UNKNOWN };\n switch (channels) {\n case 4:\n returnValue.colorType = ColorType.TRUECOLOUR_ALPHA;\n break;\n case 3:\n returnValue.colorType = ColorType.TRUECOLOUR;\n break;\n case 1:\n returnValue.colorType = ColorType.GREYSCALE;\n break;\n case 2:\n returnValue.colorType = ColorType.GREYSCALE_ALPHA;\n break;\n default:\n throw new Error('unsupported number of channels');\n }\n return returnValue;\n}\nfunction writeDataBytes(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeByte(data[offset++]);\n }\n return offset;\n}\nfunction writeDataUint16(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeUint16(data[offset++]);\n }\n return offset;\n}\n//# sourceMappingURL=PNGEncoder.js.map","export var ResolutionUnitSpecifier;\n(function (ResolutionUnitSpecifier) {\n /**\n * Unit is unknown\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n /**\n * Unit is the metre\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"METRE\"] = 1] = \"METRE\";\n})(ResolutionUnitSpecifier || (ResolutionUnitSpecifier = {}));\n//# sourceMappingURL=types.js.map","/*\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 { WebPDecoder } from '../../vendor/libwebp-0.2.0';\r\nimport { encode } from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8,\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\n","import PNGDecoder from './PNGDecoder';\nimport PNGEncoder from './PNGEncoder';\nexport * from './types';\nfunction decodePNG(data, options) {\n const decoder = new PNGDecoder(data, options);\n return decoder.decode();\n}\nfunction encodePNG(png, options) {\n const encoder = new PNGEncoder(png, options);\n return encoder.encode();\n}\nexport { decodePNG as decode, encodePNG as encode };\n//# sourceMappingURL=index.js.map","/*\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 { webp2png } from './webp';\r\nimport type { WebpConvertTask } from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: WebpConvertTask[] = [];\r\n//let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n //isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n //if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n //isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n \r\n ctx.postMessage({\r\n type: 'convertWebp', \r\n payload: {\r\n fileName, \r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: WebpConvertTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n \r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\r\n});\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/privacySection.ts b/src/components/privacySection.ts index 0de07789..12af8cf7 100644 --- a/src/components/privacySection.ts +++ b/src/components/privacySection.ts @@ -4,6 +4,7 @@ * https://github.com/morethanwords/tweb/blob/master/LICENSE */ +import replaceContent from "../helpers/dom/replaceContent"; import { randomLong } from "../helpers/random"; import { InputPrivacyKey, InputPrivacyRule } from "../layer"; import appPrivacyManager, { PrivacyType } from "../lib/appManagers/appPrivacyManager"; @@ -16,7 +17,7 @@ import { SettingSection, generateSection } from "./sidebarLeft"; import AppAddMembersTab from "./sidebarLeft/tabs/addMembers"; import { SliderSuperTabEventable } from "./sliderTab"; -type PrivacySectionStr = LangPackKey | ''; +export type PrivacySectionStr = LangPackKey | '' | HTMLElement; export default class PrivacySection { public radioRows: Map; public radioSection: SettingSection; @@ -216,6 +217,8 @@ export default class PrivacySection { const captionElement = this.radioSection.caption; if(!caption) { captionElement.innerHTML = ''; + } else if(caption instanceof HTMLElement) { + replaceContent(captionElement, caption); } else { _i18n(captionElement, caption); } diff --git a/src/helpers/dom/anchorCopy.ts b/src/helpers/dom/anchorCopy.ts new file mode 100644 index 00000000..971e2c71 --- /dev/null +++ b/src/helpers/dom/anchorCopy.ts @@ -0,0 +1,31 @@ +/* + * https://github.com/morethanwords/tweb + * Copyright (C) 2019-2021 Eduard Kuzmenko + * https://github.com/morethanwords/tweb/blob/master/LICENSE + */ + +import { toastNew } from "../../components/toast"; +import { copyTextToClipboard } from "../clipboard"; +import { cancelEvent } from "./cancelEvent"; +import { attachClickEvent } from "./clickEvent"; + +export default function anchorCopy(options: Partial<{ + // href: string, + mePath: string +}> = {}) { + const anchor = document.createElement('a'); + anchor.classList.add('anchor-copy'); + + if(options.mePath) { + const href = 'https://t.me/' + options.mePath; + anchor.href = anchor.innerText = href; + } + + attachClickEvent(anchor, (e) => { + cancelEvent(e); + copyTextToClipboard(anchor.href); + toastNew({langPackKey: 'LinkCopied'}); + }); + + return anchor; +} diff --git a/src/lang.ts b/src/lang.ts index 736c467a..cbd3a0b0 100644 --- a/src/lang.ts +++ b/src/lang.ts @@ -685,6 +685,7 @@ const lang = { "EditCantEditPermissionsPublic": "This permission is not available in public groups.", "VoipUserMicrophoneIsOff": "%s\'s microphone is off", "VoipUserCameraIsOff": "%s\'s camera is off", + "PrivacyPhoneInfo4": "This public link opens a chat with you:", // * macos "AccountSettings.Filters": "Chat Folders", diff --git a/src/lib/mtproto/apiManager.ts b/src/lib/mtproto/apiManager.ts index 562d4bb6..5b013895 100644 --- a/src/lib/mtproto/apiManager.ts +++ b/src/lib/mtproto/apiManager.ts @@ -39,6 +39,7 @@ import rootScope from '../rootScope'; /// #if MTPROTO_AUTO import transportController from './transports/controller'; +import MTTransport from './transports/transport'; /// #endif /* var networker = apiManager.cachedNetworkers.websocket.upload[2]; @@ -205,7 +206,7 @@ export class ApiManager { this.iterateNetworkers((info) => { const transportType = this.getTransportType(info.connectionType); const transport = this.chooseServer(info.dcId, info.connectionType, transportType); - info.networker.changeTransport(transport); + this.changeNetworkerTransport(info.networker, transport); }); } @@ -397,13 +398,22 @@ export class ApiManager { throw error; } - networker.changeTransport(transport); + this.changeNetworkerTransport(networker, transport); networkers.unshift(networker); this.setOnDrainIfNeeded(networker); return networker; }); } + private changeNetworkerTransport(networker: MTPNetworker, transport: MTTransport) { + const oldTransport = networker.transport; + if(oldTransport) { + DcConfigurator.removeTransport(dcConfigurator.chosenServers, oldTransport); + } + + networker.changeTransport(transport); + } + public setOnDrainIfNeeded(networker: MTPNetworker) { if(networker.onDrain) { return; diff --git a/src/lib/mtproto/mtprotoworker.ts b/src/lib/mtproto/mtprotoworker.ts index f77f4d27..c7765496 100644 --- a/src/lib/mtproto/mtprotoworker.ts +++ b/src/lib/mtproto/mtprotoworker.ts @@ -374,6 +374,7 @@ export class ApiManagerProxy extends CryptoWorkerMethods { // return; const worker = new MTProtoWorker(); + // const worker = new Worker(new URL('./mtproto.worker.ts', import.meta.url)); //const worker = window; worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true}); worker.addEventListener('message', this.onWorkerMessage); diff --git a/src/lib/mtproto/networker.ts b/src/lib/mtproto/networker.ts index 0d1f2844..475658b7 100644 --- a/src/lib/mtproto/networker.ts +++ b/src/lib/mtproto/networker.ts @@ -33,7 +33,6 @@ import type TcpObfuscated from './transports/tcpObfuscated'; import bigInt from 'big-integer'; import { ConnectionStatus } from './connectionStatus'; import ctx from '../../environment/ctx'; -import dcConfigurator, { DcConfigurator } from './dcConfigurator'; import bufferConcats from '../../helpers/bytes/bufferConcats'; import bytesCmp from '../../helpers/bytes/bytesCmp'; import bytesToHex from '../../helpers/bytes/bytesToHex'; @@ -371,8 +370,6 @@ export default class MTPNetworker { if(oldTransport) { oldTransport.destroy(); - DcConfigurator.removeTransport(dcConfigurator.chosenServers, this.transport); - if(this.nextReqTimeout) { clearTimeout(this.nextReqTimeout); this.nextReqTimeout = 0; diff --git a/src/scss/partials/_chat.scss b/src/scss/partials/_chat.scss index 04ea2e74..93a19f92 100644 --- a/src/scss/partials/_chat.scss +++ b/src/scss/partials/_chat.scss @@ -11,7 +11,7 @@ $chat-helper-size: 45px; $chat-input-box-shadow: 0px 1px 8px 1px rgb(0 0 0 / 18%); $input-transition-time: .2s; -$input-half-transition-time: math.div($input-transition-time, 2); +$input-half-transition-time: $input-transition-time / 2; $background-transition-time: 0.05s; $background-transition-total-time: #{$input-transition-time - $background-transition-time}; diff --git a/src/scss/partials/_chatBubble.scss b/src/scss/partials/_chatBubble.scss index 6c8e90a3..ea4af19b 100644 --- a/src/scss/partials/_chatBubble.scss +++ b/src/scss/partials/_chatBubble.scss @@ -105,8 +105,8 @@ $bubble-beside-button-width: 38px; left: -50%; /* top: 0; bottom: 0; */ - top: -#{math.div($bubble-margin, 2)}; - bottom: -#{math.div($bubble-margin, 2)}; + top: -#{$bubble-margin / 2}; + bottom: -#{$bubble-margin / 2}; content: " "; z-index: -1; } @@ -114,13 +114,13 @@ $bubble-beside-button-width: 38px; /* &.is-highlighted, &.is-selected { &:not(.is-group-last):after { - height: calc(100% + #{math.div($bubble-margin, 2)}) !important; + height: calc(100% + #{$bubble-margin / 2}) !important; } & + &:not(.is-group-last) { &:after { top: .125rem !important; - height: calc(100% - #{math.div($bubble-margin, 2)}) !important; + height: calc(100% - #{$bubble-margin / 2}) !important; } } } */ @@ -128,7 +128,7 @@ $bubble-beside-button-width: 38px; // ! if turn this on, there will be an empty space /* &.is-highlighted, &.is-selected { &.is-group-last:after { - bottom: #{math.div($bubble-margin, 2)} !important; + bottom: #{$bubble-margin / 2} !important; } } */ @@ -164,7 +164,7 @@ $bubble-beside-button-width: 38px; &.is-highlighted, &.is-selected { &:after { - top: calc(#{math.div($bubble-margin, 2)} + 30px); + top: calc(#{$bubble-margin / 2} + 30px); } } } @@ -1549,7 +1549,7 @@ $bubble-beside-button-width: 38px; &:first-of-type { .document-selection { - top: -#{math.div($bubble-margin, 2)}; // * padding inner + half padding outer + top: -#{$bubble-margin / 2}; // * padding inner + half padding outer } .document-wrapper { @@ -1561,7 +1561,7 @@ $bubble-beside-button-width: 38px; &:last-of-type { .document-selection { - bottom: -#{math.div($bubble-margin, 2)}; + bottom: -#{$bubble-margin / 2}; } .document-wrapper { diff --git a/src/scss/partials/_peerTyping.scss b/src/scss/partials/_peerTyping.scss index db5052e4..688289b8 100644 --- a/src/scss/partials/_peerTyping.scss +++ b/src/scss/partials/_peerTyping.scss @@ -137,7 +137,7 @@ } $scale-max: 1; -$scale-step: math.div(1, 6); +$scale-step: 1 / 6; $scale-mid: $scale-max - $scale-step; $scale-min: $scale-max - ($scale-step * 2); $opacity-max: 1; diff --git a/webpack.common.js b/webpack.common.js index 394a965f..3ef1b118 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -3,6 +3,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const MediaQueryPlugin = require('media-query-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const postcssPresetEnv = require('postcss-preset-env'); +const ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin'); const { RetryChunkLoadPlugin } = require('webpack-retry-chunk-load-plugin'); const fs = require('fs'); const Dotenv = require('dotenv-webpack'); @@ -38,6 +39,26 @@ const opts = { const domain = 'yourdomain.com'; const localIp = '192.168.93.183'; +const middleware = (req, res, next) => { + let IP = ''; + if(req.headers['cf-connecting-ip']) { + IP = req.headers['cf-connecting-ip']; + } else { + IP = req.connection.remoteAddress.split(':').pop(); + } + + if(!allowedIPs.includes(IP) && !/^192\.168\.\d{1,3}\.\d{1,3}$/.test(IP)) { + console.log('Bad IP connecting: ' + IP, req.url); + res.status(404).send('Nothing interesting here.'); + } else { + if(req.url.indexOf('/assets/') !== 0) { + console.log(req.url, IP); + } + + next(); + } +}; + module.exports = { module: { rules: [ @@ -51,21 +72,33 @@ module.exports = { reloadAll: true, } }, */ - { - loader: 'css-loader', - options: { - url: false - } - }, + + // Webpack 4 + 'css-loader?url=false', + // Webpack 5 + // { + // loader: 'css-loader', + // options: { + // url: false + // } + // }, + devMode ? undefined : MediaQueryPlugin.loader, { loader: 'postcss-loader', options: { - postcssOptions: { - plugins: [ - postcssPresetEnv(), - ] - } + // Webpack 4 + ident: 'postcss', + plugins: [ + postcssPresetEnv(), + ], + + // Webpack 5 + // postcssOptions: { + // plugins: [ + // postcssPresetEnv(), + // ] + // } } }, { @@ -74,14 +107,14 @@ module.exports = { sourceMap: devMode } } - ].filter(l => !!l) + ].filter(Boolean) }, { test: /\.ts?$/, use: [ //{ loader: 'babel-loader', options: require('./babel.config') }, 'ts-loader', - { loader: 'ifdef-loader', options: opts } + {loader: 'ifdef-loader', options: opts} ], exclude: /node_modules/, }, @@ -98,10 +131,11 @@ module.exports = { extensions: ['.ts', '.js'], }, - entry: { - index: './src/index.ts', - sw: {import: './src/lib/serviceWorker/index.service.ts', filename: 'sw.js'} - }, + entry: './src/index.ts', + // entry: { + // index: './src/index.ts', + // sw: {import: './src/lib/serviceWorker/index.service.ts', filename: 'sw.js'} + // }, /* entry: { index: './src/index.ts', pluralPolyfill: './src/lib/pluralPolyfill.ts' @@ -113,27 +147,28 @@ module.exports = { path: path.resolve(__dirname, 'public'), filename: '[name].[chunkhash].bundle.js', chunkFilename: '[name].[chunkhash].chunk.js', - clean: { - keep(asset) { - if(asset.includes('.xml') - || asset.includes('version') - || asset.includes('assets/') - || asset.includes('changelogs/') - || asset.includes('.webmanifest') - || asset.includes('.wasm') - || asset.includes('rlottie-wasm') - || asset.includes('Worker.min.js') - || asset.includes('recorder.min.js') - || asset.includes('.hbs')) return true; - return false; - } - } + + // Webpack 5 + // clean: { + // keep: keepAsset, + // } }, devServer: { + // Webpack 4 options + contentBase: path.join(__dirname, 'public'), + watchContentBase: true, + before: useLocal ? undefined : function(app, server, compiler) { + app.use(middleware); + }, + public: useLocal ? undefined : domain, + sockHost: useLocal ? undefined : domain, + overlay: true, + // static: { // directory: path.join(__dirname, 'public') // }, + // hot: false, compress: true, http2: useLocalNotLocal ? true : (useLocal ? undefined : true), https: useLocal ? undefined : { @@ -146,39 +181,49 @@ module.exports = { host: useLocalNotLocal ? localIp : (useLocal ? undefined : '0.0.0.0'), //host: domain, // '0.0.0.0' port: useLocal ? undefined : 443, - client: { - overlay: true, - progress: true - }, - setupMiddlewares: useLocal ? undefined : (middlewares, devServer) => { - middlewares.push((req, res) => { - let IP = ''; - if(req.headers['cf-connecting-ip']) { - IP = req.headers['cf-connecting-ip']; - } else { - IP = req.connection.remoteAddress.split(':').pop(); - } - if(!allowedIPs.includes(IP) && !/^192\.168\.\d{1,3}\.\d{1,3}$/.test(IP)) { - console.log('Bad IP connecting: ' + IP, req.url); - res.status(404).send('Nothing interesting here.'); - } else { - if(req.url.indexOf('/assets/') !== 0) { - console.log(req.url, IP); - } - - next(); - } - }); - - return middlewares; - }, - /* public: useLocal ? undefined : domain, - sockHost: useLocal ? undefined : domain, */ + + // Webpack 5 + // setupMiddlewares: useLocal ? undefined : (middlewares, devServer) => { + // middlewares.push(middleware); + + // return middlewares; + // }, + // client: { + // overlay: true, + // progress: true + // }, }, plugins: [ + devMode ? undefined : new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: false, + generateStatsFile: false, + defaultSizes: 'gzip' + }), + new Dotenv(), + + new ServiceWorkerWebpackPlugin({ + entry: path.join(__dirname, 'src/lib/serviceWorker/index.service.ts'), + filename: 'sw.js', + //excludes: ['**/*'], + includes: [ + '**/*.js', + '**/*.css', + '**/*.json', + '**/*.wasm', + '**/*.mp3', + '**/*.svg', + '**/*.tgs', + '**/*.ico', + '**/*.woff', + '**/*.woff2', + '**/*.ttf', + '**/*.webmanifest' + ], + }), new HtmlWebpackPlugin({ filename: `index.html`, @@ -235,11 +280,5 @@ module.exports = { // if not set - nothing will happen and error will be returned to the chunk loader. //lastResortScript: "window.location.href='/500.html';", }), - - devMode ? undefined : new BundleAnalyzerPlugin({ - analyzerMode: 'static', - openAnalyzer: false, - generateStatsFile: false - }), ].filter(Boolean), }; diff --git a/webpack.dev.js b/webpack.dev.js index dcc3f4a3..c99cc40c 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -1,7 +1,7 @@ process.env.NODE_ENV = 'development'; const webpack = require('webpack'); -const {merge} = require('webpack-merge'); +const merge = require('webpack-merge'); const common = require('./webpack.common.js'); diff --git a/webpack.prod.js b/webpack.prod.js index 70b4c126..9d7d3829 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -1,11 +1,17 @@ process.env.NODE_ENV = 'production'; -const {merge} = require('webpack-merge'); +const path = require('path'); +const merge = require('webpack-merge'); const common = require('./webpack.common.js'); +const keepAsset = require('./keepAsset.js'); //const CompressionPlugin = require("compression-webpack-plugin"); +const WebpackOnBuildPlugin = require('on-build-webpack'); //const TerserJSPlugin = require('terser-webpack-plugin'); //const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const fs = require('fs'); + +const buildDir = __dirname + '/public/'; module.exports = merge(common, { mode: 'production', @@ -52,5 +58,40 @@ module.exports = merge(common, { minRatio: 0.8, deleteOriginalAssets: false, }), */ + + new WebpackOnBuildPlugin(function(stats) { + const newlyCreatedAssets = stats.compilation.assets; + + const unlinked = []; + fs.readdir(path.resolve(buildDir), (err, files) => { + files.forEach(file => { + //console.log('to unlink 1:', file); + + if(keepAsset(file)) { + return; + } + // if(file.includes('.xml') + // || file.includes('.webmanifest') + // || file.includes('.wasm') + // || file.includes('rlottie-wasm') + // || file.includes('Worker.min.js') + // || file.includes('recorder.min.js') + // || file.includes('.hbs')) return; + + let p = path.resolve(buildDir + file); + if(!newlyCreatedAssets[file] && ['.gz', '.js', '.ts', '.map', '.css', '.txt'].find(ext => file.endsWith(ext)) !== undefined) { + + //console.log('to unlink 2:', file); + + fs.unlinkSync(p); + unlinked.push(file); + } + }); + + if(unlinked.length > 0) { + console.log('Removed old assets: ', unlinked); + } + }); + }) ] });